@serve.zone/coremail 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +43 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.auth.d.ts +19 -0
- package/dist_ts/classes.auth.js +58 -1
- package/dist_ts/classes.coremail.d.ts +3 -0
- package/dist_ts/classes.coremail.js +11 -4
- package/dist_ts/classes.gateway.d.ts +11 -1
- package/dist_ts/classes.gateway.js +101 -63
- package/dist_ts/classes.inbound.d.ts +10 -1
- package/dist_ts/classes.inbound.js +45 -7
- package/dist_ts/classes.maintenance.js +16 -1
- package/dist_ts/classes.models.d.ts +24 -2
- package/dist_ts/classes.models.js +72 -2
- package/dist_ts/classes.server.d.ts +6 -2
- package/dist_ts/classes.server.js +18 -68
- package/dist_ts/classes.smtpsubmission.d.ts +85 -0
- package/dist_ts/classes.smtpsubmission.js +379 -0
- package/dist_ts/classes.storage.d.ts +9 -0
- package/dist_ts/classes.storage.js +44 -1
- package/dist_ts/classes.submissions.d.ts +27 -1
- package/dist_ts/classes.submissions.js +164 -14
- package/dist_ts/coremail.errors.d.ts +18 -0
- package/dist_ts/coremail.errors.js +84 -0
- package/dist_ts/coremail.log.d.ts +1 -1
- package/dist_ts/coremail.log.js +1 -1
- package/dist_ts/coremail.mime.d.ts +15 -0
- package/dist_ts/coremail.mime.js +76 -1
- package/dist_ts/coremail.persistence.d.ts +38 -1
- package/dist_ts/coremail.persistence.js +124 -40
- package/dist_ts/coremail.stats.d.ts +72 -0
- package/dist_ts/coremail.stats.js +242 -0
- package/dist_ts/coremail.validation.d.ts +15 -2
- package/dist_ts/coremail.validation.js +26 -78
- package/dist_ts/interfaces.d.ts +18 -0
- package/dist_ts/plugins.d.ts +1 -0
- package/dist_ts/plugins.js +2 -1
- package/package.json +12 -11
- package/readme.md +51 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.auth.ts +77 -0
- package/ts/classes.coremail.ts +20 -0
- package/ts/classes.gateway.ts +121 -66
- package/ts/classes.inbound.ts +71 -6
- package/ts/classes.maintenance.ts +14 -0
- package/ts/classes.models.ts +67 -1
- package/ts/classes.server.ts +23 -80
- package/ts/classes.smtpsubmission.ts +466 -0
- package/ts/classes.storage.ts +54 -0
- package/ts/classes.submissions.ts +247 -12
- package/ts/coremail.errors.ts +111 -0
- package/ts/coremail.log.ts +1 -0
- package/ts/coremail.mime.ts +89 -0
- package/ts/coremail.persistence.ts +196 -48
- package/ts/coremail.stats.ts +342 -0
- package/ts/coremail.validation.ts +31 -103
- package/ts/interfaces.ts +20 -0
- package/ts/plugins.ts +1 -0
|
@@ -1,12 +1,36 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
import { CoreMailAuthorizationError, CoreMailCapabilityDeniedError, } from './classes.auth.js';
|
|
2
3
|
import {} from './classes.models.js';
|
|
3
4
|
import { CoreMailStorage, createSha256 } from './classes.storage.js';
|
|
4
5
|
import { CoreMailTransferService } from './classes.transfer.js';
|
|
5
|
-
import { createCoreMailSubmissionDigest, normalizeCoreMailOutboundMessage, } from './coremail.validation.js';
|
|
6
|
+
import { assertCoreMailSenderAllowed, createCoreMailRawOutboundMessage, createCoreMailSubmissionDigest, normalizeCoreMailEnvelope, normalizeCoreMailOutboundMessage, } from './coremail.validation.js';
|
|
6
7
|
import { createCoreMailMime } from './coremail.mime.js';
|
|
7
8
|
import { createCoreMailOutboundQuotaDescriptors, ensureCoreMailQuotaCounter, incrementCoreMailQuotaCounter, withCoreMailTransaction, } from './coremail.quota.js';
|
|
9
|
+
import { ensureCoreMailStatCounter, createCoreMailStatDescriptor, incrementCoreMailStatCounter, } from './coremail.stats.js';
|
|
8
10
|
import { requireCoreMailIdentifier, requireCoreMailUuid, } from './coremail.selectors.js';
|
|
9
11
|
const maximumPartBytes = plugins.serveZoneInterfaces.data.coreMailLimits.attachmentBytes;
|
|
12
|
+
const maximumRawMimeBytes = plugins.serveZoneInterfaces.data.coreMailLimits.serializedMimeBytes;
|
|
13
|
+
/**
|
|
14
|
+
* The operation that authorizes creating a new outbound submission. An SMTP
|
|
15
|
+
* submission creates one without a typed request, so it is gated by exactly
|
|
16
|
+
* the rule `CoreMailAuthService.requireWorkloadSession` applies to its API
|
|
17
|
+
* counterpart.
|
|
18
|
+
*/
|
|
19
|
+
const rawSubmissionOperation = 'coreMailPrepareOutboundSubmission';
|
|
20
|
+
const assertRawSubmissionAuthority = (sessionArg, bindingArg) => {
|
|
21
|
+
if (bindingArg.tenantId !== sessionArg.tenantId
|
|
22
|
+
|| bindingArg.serviceId !== sessionArg.serviceId
|
|
23
|
+
|| bindingArg.bindingId !== sessionArg.bindingId
|
|
24
|
+
|| bindingArg.revision !== sessionArg.bindingRevision
|
|
25
|
+
|| bindingArg.state !== sessionArg.bindingState) {
|
|
26
|
+
throw new CoreMailAuthorizationError();
|
|
27
|
+
}
|
|
28
|
+
const allowedOperations = plugins.serveZoneInterfaces.data.resolveCoreMailWorkloadOperations(bindingArg.state, bindingArg.capabilities);
|
|
29
|
+
if (!allowedOperations.includes(rawSubmissionOperation)
|
|
30
|
+
|| !sessionArg.allowedOperations.includes(rawSubmissionOperation)) {
|
|
31
|
+
throw new CoreMailCapabilityDeniedError();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
10
34
|
const authorityFilter = (sessionArg, submissionIdArg) => ({
|
|
11
35
|
tenantId: requireCoreMailIdentifier(sessionArg.tenantId, 'session.tenantId'),
|
|
12
36
|
serviceId: requireCoreMailIdentifier(sessionArg.serviceId, 'session.serviceId'),
|
|
@@ -27,6 +51,11 @@ const toPublicSubmission = (submissionArg) => plugins.serveZoneInterfaces.data.n
|
|
|
27
51
|
idempotencyKey: submissionArg.idempotencyKey,
|
|
28
52
|
submissionDigest: submissionArg.submissionDigest,
|
|
29
53
|
state: submissionArg.state,
|
|
54
|
+
// Records written before the discriminator existed are API submissions,
|
|
55
|
+
// and the wire type omits the field for exactly that case.
|
|
56
|
+
...(submissionArg.source === undefined || submissionArg.source === 'api'
|
|
57
|
+
? {}
|
|
58
|
+
: { source: submissionArg.source }),
|
|
30
59
|
parts: submissionArg.parts.map((partArg) => ({
|
|
31
60
|
partId: partArg.partId,
|
|
32
61
|
state: partArg.state,
|
|
@@ -99,6 +128,7 @@ export class CoreMailSubmissionService {
|
|
|
99
128
|
idempotencyKey: requestArg.idempotencyKey,
|
|
100
129
|
submissionDigest,
|
|
101
130
|
state: 'preparing',
|
|
131
|
+
source: 'api',
|
|
102
132
|
message,
|
|
103
133
|
parts,
|
|
104
134
|
attempts: 0,
|
|
@@ -159,6 +189,101 @@ export class CoreMailSubmissionService {
|
|
|
159
189
|
return { submission: toPublicSubmission(concurrent), replayed: true };
|
|
160
190
|
}
|
|
161
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Accept an exact-byte SMTP submission from an authenticated MSA session.
|
|
194
|
+
*
|
|
195
|
+
* CoreMail never parses, rewrites, or re-encodes `rawMime`. The bytes become
|
|
196
|
+
* the submission's immutable MIME directly, so the existing outbound worker
|
|
197
|
+
* and gateway hand an SMTP submission off exactly as they hand off an API
|
|
198
|
+
* submission that `finalize()` has published.
|
|
199
|
+
*
|
|
200
|
+
* The write order mirrors `finalize()`: the record that owns the object key
|
|
201
|
+
* is committed first and only becomes worker-visible once the bytes are
|
|
202
|
+
* durably stored, so a failure between the two steps leaves a retirable
|
|
203
|
+
* record rather than an object no record refers to.
|
|
204
|
+
*/
|
|
205
|
+
async submitRaw(sessionArg, bindingArg, inputArg) {
|
|
206
|
+
assertRawSubmissionAuthority(sessionArg, bindingArg);
|
|
207
|
+
const envelope = normalizeCoreMailEnvelope({
|
|
208
|
+
mailFrom: inputArg.envelope.from,
|
|
209
|
+
rcptTo: inputArg.envelope.to,
|
|
210
|
+
});
|
|
211
|
+
if (envelope.mailFrom === '') {
|
|
212
|
+
throw new Error('CoreMail raw submission requires an envelope sender.');
|
|
213
|
+
}
|
|
214
|
+
assertCoreMailSenderAllowed(envelope.mailFrom, bindingArg);
|
|
215
|
+
// Buffer is a Uint8Array subclass, so a listener may hand either over.
|
|
216
|
+
if (!(inputArg.rawMime instanceof Uint8Array)
|
|
217
|
+
|| inputArg.rawMime.byteLength === 0) {
|
|
218
|
+
throw new Error('CoreMail raw submission requires nonempty RFC822 bytes.');
|
|
219
|
+
}
|
|
220
|
+
if (inputArg.rawMime.byteLength > maximumRawMimeBytes) {
|
|
221
|
+
throw new Error('CoreMail raw submission exceeds its byte budget.');
|
|
222
|
+
}
|
|
223
|
+
const rawMime = new Uint8Array(inputArg.rawMime);
|
|
224
|
+
const message = createCoreMailRawOutboundMessage(envelope);
|
|
225
|
+
const idempotencyKey = `smtp:${plugins.nodeCrypto.randomUUID()}`;
|
|
226
|
+
const submissionDigest = createCoreMailSubmissionDigest(idempotencyKey, message);
|
|
227
|
+
const submissionId = plugins.nodeCrypto.randomUUID();
|
|
228
|
+
const mimeObjectKey = `outbound-mime/${submissionId}/${submissionDigest.slice(7)}`;
|
|
229
|
+
const mimeSha256 = createSha256(rawMime);
|
|
230
|
+
const createdAt = this.now();
|
|
231
|
+
const submission = {
|
|
232
|
+
submissionId,
|
|
233
|
+
tenantId: sessionArg.tenantId,
|
|
234
|
+
serviceId: sessionArg.serviceId,
|
|
235
|
+
bindingId: sessionArg.bindingId,
|
|
236
|
+
bindingRevision: sessionArg.bindingRevision,
|
|
237
|
+
revision: 0,
|
|
238
|
+
idempotencyKey,
|
|
239
|
+
submissionDigest,
|
|
240
|
+
state: 'ready',
|
|
241
|
+
source: 'smtp',
|
|
242
|
+
message,
|
|
243
|
+
parts: [],
|
|
244
|
+
mimeObjectKey,
|
|
245
|
+
mimeSha256,
|
|
246
|
+
mimeLengthBytes: rawMime.byteLength,
|
|
247
|
+
attempts: 0,
|
|
248
|
+
createdAt,
|
|
249
|
+
updatedAt: createdAt,
|
|
250
|
+
};
|
|
251
|
+
const quotaNow = this.now();
|
|
252
|
+
const quota = createCoreMailOutboundQuotaDescriptors({
|
|
253
|
+
tenantId: sessionArg.tenantId,
|
|
254
|
+
serviceId: sessionArg.serviceId,
|
|
255
|
+
bindingId: sessionArg.bindingId,
|
|
256
|
+
bindingRevision: sessionArg.bindingRevision,
|
|
257
|
+
}, quotaNow);
|
|
258
|
+
await ensureCoreMailQuotaCounter(this.models, quota.minute);
|
|
259
|
+
await ensureCoreMailQuotaCounter(this.models, quota.day);
|
|
260
|
+
await withCoreMailTransaction(this.database, async (transactionArg) => {
|
|
261
|
+
await incrementCoreMailQuotaCounter(this.models, quota.day, bindingArg.limits.messagesPerDay, quotaNow, transactionArg, quota.dayRetryAfterMs);
|
|
262
|
+
await incrementCoreMailQuotaCounter(this.models, quota.minute, bindingArg.limits.messagesPerMinute, quotaNow, transactionArg, quota.minuteRetryAfterMs);
|
|
263
|
+
const inserted = await this.models.Submission.exact.insert(submission, { session: transactionArg });
|
|
264
|
+
if (inserted.status === 'conflict') {
|
|
265
|
+
throw new Error('CoreMail submission identity conflicts with persisted intent.');
|
|
266
|
+
}
|
|
267
|
+
return { submissionId };
|
|
268
|
+
});
|
|
269
|
+
const committed = await this.models.Submission.exact.findStoredOne({
|
|
270
|
+
...authorityFilter(sessionArg, submissionId),
|
|
271
|
+
});
|
|
272
|
+
if (!committed || committed.submissionDigest !== submissionDigest) {
|
|
273
|
+
throw new Error('CoreMail committed submission is unavailable.');
|
|
274
|
+
}
|
|
275
|
+
const published = await this.storage.putBytesExact(mimeObjectKey, rawMime, 'message/rfc822', maximumRawMimeBytes, AbortSignal.timeout(plugins.serveZoneInterfaces.data.coreMailLimits.transferOverallTimeoutMs));
|
|
276
|
+
if (published.sha256 !== mimeSha256
|
|
277
|
+
|| published.lengthBytes !== rawMime.byteLength) {
|
|
278
|
+
throw new Error('CoreMail published MIME integrity conflicts.');
|
|
279
|
+
}
|
|
280
|
+
const queuedAt = this.now();
|
|
281
|
+
const handoff = await this.publishSubmission(committed, 'submittedSmtp', queuedAt);
|
|
282
|
+
if (handoff.status !== 'transitioned') {
|
|
283
|
+
throw new Error('CoreMail raw submission publication fence changed.');
|
|
284
|
+
}
|
|
285
|
+
return { submissionId, submissionDigest };
|
|
286
|
+
}
|
|
162
287
|
async preparePartUpload(sessionArg, requestArg) {
|
|
163
288
|
const submission = await this.requireSubmission(sessionArg, requestArg.submissionId);
|
|
164
289
|
if (submission.state !== 'preparing'
|
|
@@ -339,18 +464,7 @@ export class CoreMailSubmissionService {
|
|
|
339
464
|
throw new Error('CoreMail published MIME integrity conflicts.');
|
|
340
465
|
}
|
|
341
466
|
const queuedAt = this.now();
|
|
342
|
-
const update = await this.
|
|
343
|
-
current: claim.document,
|
|
344
|
-
change: (modelArg) => {
|
|
345
|
-
modelArg.mimePublishedAt = queuedAt;
|
|
346
|
-
modelArg.workerRetryAt = queuedAt;
|
|
347
|
-
modelArg.updatedAt = queuedAt;
|
|
348
|
-
modelArg.revision += 1;
|
|
349
|
-
delete modelArg.leaseOwnerTaskId;
|
|
350
|
-
delete modelArg.leaseToken;
|
|
351
|
-
delete modelArg.leaseExpiresAt;
|
|
352
|
-
},
|
|
353
|
-
});
|
|
467
|
+
const update = await this.publishSubmission(claim.document, 'submittedApi', queuedAt);
|
|
354
468
|
if (update.status !== 'transitioned') {
|
|
355
469
|
const replay = await this.requireSubmission(sessionArg, submission.submissionId).catch(() => undefined);
|
|
356
470
|
if (replay?.submissionDigest === submission.submissionDigest
|
|
@@ -367,6 +481,42 @@ export class CoreMailSubmissionService {
|
|
|
367
481
|
submission: toPublicSubmission(update.document),
|
|
368
482
|
};
|
|
369
483
|
}
|
|
484
|
+
/**
|
|
485
|
+
* Publish an owned immutable MIME and hand the submission to the worker.
|
|
486
|
+
*
|
|
487
|
+
* The submitted counter is incremented in the same transaction as the
|
|
488
|
+
* transition that publishes, and only when `statsSubmittedCountedAt` is
|
|
489
|
+
* still absent. An interrupted publication that finalization later repeats
|
|
490
|
+
* therefore republishes without counting a second submission.
|
|
491
|
+
*/
|
|
492
|
+
async publishSubmission(currentArg, kindArg, queuedAtArg) {
|
|
493
|
+
const alreadyCounted = currentArg.statsSubmittedCountedAt !== undefined;
|
|
494
|
+
const descriptor = createCoreMailStatDescriptor(currentArg, queuedAtArg);
|
|
495
|
+
if (!alreadyCounted) {
|
|
496
|
+
await ensureCoreMailStatCounter(this.models, descriptor);
|
|
497
|
+
}
|
|
498
|
+
return await withCoreMailTransaction(this.database, async (transactionArg) => {
|
|
499
|
+
const transitioned = await this.models.Submission.exact.transition({
|
|
500
|
+
current: currentArg,
|
|
501
|
+
change: (modelArg) => {
|
|
502
|
+
modelArg.mimePublishedAt = queuedAtArg;
|
|
503
|
+
modelArg.workerRetryAt = queuedAtArg;
|
|
504
|
+
modelArg.updatedAt = queuedAtArg;
|
|
505
|
+
modelArg.revision += 1;
|
|
506
|
+
if (!alreadyCounted) {
|
|
507
|
+
modelArg.statsSubmittedCountedAt = queuedAtArg;
|
|
508
|
+
}
|
|
509
|
+
delete modelArg.leaseOwnerTaskId;
|
|
510
|
+
delete modelArg.leaseToken;
|
|
511
|
+
delete modelArg.leaseExpiresAt;
|
|
512
|
+
},
|
|
513
|
+
}, { session: transactionArg });
|
|
514
|
+
if (transitioned.status === 'transitioned' && !alreadyCounted) {
|
|
515
|
+
await incrementCoreMailStatCounter(this.models, descriptor, kindArg, queuedAtArg, transactionArg);
|
|
516
|
+
}
|
|
517
|
+
return transitioned;
|
|
518
|
+
});
|
|
519
|
+
}
|
|
370
520
|
async get(sessionArg, requestArg) {
|
|
371
521
|
return {
|
|
372
522
|
submission: toPublicSubmission(await this.requireSubmission(sessionArg, requestArg.submissionId)),
|
|
@@ -382,4 +532,4 @@ export class CoreMailSubmissionService {
|
|
|
382
532
|
return submission;
|
|
383
533
|
}
|
|
384
534
|
}
|
|
385
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdWJtaXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc3VibWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUF3QixNQUFNLHFCQUFxQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDaEUsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixnQ0FBZ0MsR0FDakMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFDN0IsdUJBQXVCLEdBQ3hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixtQkFBbUIsR0FDcEIsTUFBTSx5QkFBeUIsQ0FBQztBQWFqQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztBQUV6RixNQUFNLGVBQWUsR0FBRyxDQUN0QixVQUFvQyxFQUNwQyxlQUFtQyxFQUNuQyxFQUFFLENBQUMsQ0FBQztJQUNKLFFBQVEsRUFBRSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDO0lBQzVFLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDO0lBQy9FLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDO0lBQy9FLGVBQWUsRUFBRSxVQUFVLENBQUMsZUFBZTtJQUMzQyxH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
|
|
535
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdWJtaXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc3VibWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLDBCQUEwQixFQUMxQiw2QkFBNkIsR0FDOUIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQXdCLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGdDQUFnQyxFQUNoQyw4QkFBOEIsRUFDOUIseUJBQXlCLEVBQ3pCLGdDQUFnQyxHQUNqQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsMEJBQTBCLEVBQzFCLDZCQUE2QixFQUM3Qix1QkFBdUIsR0FDeEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDRCQUE0QixFQUM1Qiw0QkFBNEIsR0FDN0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLG1CQUFtQixHQUNwQixNQUFNLHlCQUF5QixDQUFDO0FBY2pDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO0FBQ3pGLE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDO0FBRXRFOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxtQ0FBNEMsQ0FBQztBQUU1RSxNQUFNLDRCQUE0QixHQUFHLENBQ25DLFVBQW9DLEVBQ3BDLFVBQW9CLEVBQ2QsRUFBRTtJQUNSLElBQ0UsVUFBVSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsUUFBUTtXQUN4QyxVQUFVLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxTQUFTO1dBQzdDLFVBQVUsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLFNBQVM7V0FDN0MsVUFBVSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsZUFBZTtXQUNsRCxVQUFVLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxZQUFZLEVBQy9DLENBQUM7UUFDRCxNQUFNLElBQUksMEJBQTBCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsTUFBTSxpQkFBaUIsR0FDckIsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FDaEUsVUFBVSxDQUFDLEtBQUssRUFDaEIsVUFBVSxDQUFDLFlBQVksQ0FDeEIsQ0FBQztJQUNKLElBQ0UsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7V0FDaEQsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQ2pFLENBQUM7UUFDRCxNQUFNLElBQUksNkJBQTZCLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsVUFBb0MsRUFDcEMsZUFBbUMsRUFDbkMsRUFBRSxDQUFDLENBQUM7SUFDSixRQUFRLEVBQUUseUJBQXlCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQztJQUM1RSxTQUFTLEVBQUUseUJBQXlCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQztJQUMvRSxTQUFTLEVBQUUseUJBQXlCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQztJQUMvRSxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWU7SUFDM0MsR0FBRyxDQUFDLGVBQWUsS0FBSyxTQUFTO1FBQy9CLENBQUMsQ0FBQyxFQUFFO1FBQ0osQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0saUJBQWlCLEdBQUcsQ0FDeEIsVUFBb0MsRUFDaEIsRUFBRSxDQUFDLENBQUM7SUFDeEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO0lBQzdCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztJQUMvQixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7Q0FDaEMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixhQUF3QyxFQUMzQixFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUMzRSxZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVk7SUFDeEMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjO0lBQzVDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxnQkFBZ0I7SUFDaEQsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLHdFQUF3RTtJQUN4RSwyREFBMkQ7SUFDM0QsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssS0FBSztRQUN0RSxDQUFDLENBQUMsRUFBRTtRQUNKLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztLQUNqQyxDQUFDLENBQUM7SUFDSCxHQUFHLENBQUMsYUFBYSxDQUFDLGtCQUFrQjtRQUNsQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLENBQUMsa0JBQWtCLEVBQUU7UUFDMUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtJQUNoQyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsS0FBSyxTQUFTO1dBQ3hDLGFBQWEsQ0FBQyxLQUFLLEtBQUssVUFBVTtRQUNyQyxDQUFDLENBQUMsRUFBRTtRQUNKLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbkQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1RSxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQ3hDLENBQUMsQ0FBQyxFQUFFO1FBQ0osQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3QyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsS0FBSyxTQUFTO1FBQ3pDLENBQUMsQ0FBQyxFQUFFO1FBQ0osQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQ3hDLENBQUMsQ0FBQyxFQUFFO1FBQ0osQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3QyxTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVM7SUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO0NBQ25DLENBQUMsQ0FBQztBQUVMLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxRQUFpQixFQUFXLEVBQUUsQ0FDdEQsUUFBUSxZQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUMsOEJBQThCO09BQ2pFLFFBQVEsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUM7QUFFekMsTUFBTSxPQUFPLHlCQUF5QjtJQUVqQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBTG5CLFlBQ21CLFFBQXVDLEVBQ3ZDLE1BQXVCLEVBQ3ZCLE9BQXdCLEVBQ3hCLFNBQWtDLEVBQ2xDLE1BQW9CLElBQUksQ0FBQyxHQUFHO1FBSjVCLGFBQVEsR0FBUixRQUFRLENBQStCO1FBQ3ZDLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQXlCO1FBQ2xDLFFBQUcsR0FBSCxHQUFHLENBQXlCO0lBQzVDLENBQUM7SUFFRyxLQUFLLENBQUMsT0FBTyxDQUNsQixVQUFvQyxFQUNwQyxVQUFvQixFQUNwQixVQUNpRztRQUVqRyxNQUFNLE9BQU8sR0FBRyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsOEJBQThCLENBQ3JELFVBQVUsQ0FBQyxjQUFjLEVBQ3pCLE9BQU8sQ0FDUixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQzlELEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUM7WUFDekMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjO1NBQzFDLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBNEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckUsR0FBRyxPQUFPO1lBQ1YsU0FBUyxFQUFFLGtCQUFrQixZQUFZLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUM5RSxLQUFLLEVBQUUsU0FBUztTQUNqQixDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sVUFBVSxHQUE4QjtZQUM1QyxZQUFZO1lBQ1osUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQzdCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztZQUMvQixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDL0IsZUFBZSxFQUFFLFVBQVUsQ0FBQyxlQUFlO1lBQzNDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjO1lBQ3pDLGdCQUFnQjtZQUNoQixLQUFLLEVBQUUsV0FBVztZQUNsQixNQUFNLEVBQUUsS0FBSztZQUNiLE9BQU87WUFDUCxLQUFLO1lBQ0wsUUFBUSxFQUFFLENBQUM7WUFDWCxTQUFTO1lBQ1QsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxzQ0FBc0MsQ0FBQztZQUNuRCxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQy9CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztZQUMvQixlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWU7U0FDNUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNiLE1BQU0sMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsTUFBTSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUM7WUFDSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sdUJBQXVCLENBQ3JELElBQUksQ0FBQyxRQUFRLEVBQ2IsS0FBSyxFQUFFLGNBQWMsRUFBRSxFQUFFO2dCQUN2QixNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FDeEU7b0JBQ0UsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQztvQkFDekMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjO2lCQUMxQyxFQUNELEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUM1QixDQUFDO2dCQUNGLElBQUksaUJBQWlCLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxpQkFBaUIsQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7b0JBQy9FLENBQUM7b0JBQ0QsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUMxRSxDQUFDO2dCQUNELE1BQU0sNkJBQTZCLENBQ2pDLElBQUksQ0FBQyxNQUFNLEVBQ1gsS0FBSyxDQUFDLEdBQUcsRUFDVCxVQUFVLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFDaEMsUUFBUSxFQUNSLGNBQWMsRUFDZCxLQUFLLENBQUMsZUFBZSxDQUN0QixDQUFDO2dCQUNGLE1BQU0sNkJBQTZCLENBQ2pDLElBQUksQ0FBQyxNQUFNLEVBQ1gsS0FBSyxDQUFDLE1BQU0sRUFDWixVQUFVLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUNuQyxRQUFRLEVBQ1IsY0FBYyxFQUNkLEtBQUssQ0FBQyxrQkFBa0IsQ0FDekIsQ0FBQztnQkFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ3hELFVBQVUsRUFDVixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FDNUIsQ0FBQztnQkFDRixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztnQkFDbkYsQ0FBQztnQkFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxLQUFLLG1CQUFtQixFQUFFLENBQUM7WUFDN0UsQ0FBQyxDQUNGLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7Z0JBQ2pFLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7YUFDL0QsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsZ0JBQWdCLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztnQkFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFDRCxPQUFPO2dCQUNMLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRO2FBQ3JDLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QixNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7Z0JBQ2xFLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUM7Z0JBQ3pDLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYzthQUMxQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksS0FBSyxDQUFDLFNBQVMsQ0FDcEIsVUFBb0MsRUFDcEMsVUFBb0IsRUFDcEIsUUFBcUM7UUFLckMsNEJBQTRCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDO1lBQ3pDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDaEMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtTQUM3QixDQUFDLENBQUM7UUFDSCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNELHVFQUF1RTtRQUN2RSxJQUNFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxZQUFZLFVBQVUsQ0FBQztlQUN0QyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQ3BDLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxNQUFNLE9BQU8sR0FBRyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxNQUFNLGNBQWMsR0FBRyxRQUFRLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLDhCQUE4QixDQUNyRCxjQUFjLEVBQ2QsT0FBTyxDQUNSLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUNqQixpQkFBaUIsWUFBWSxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsTUFBTSxVQUFVLEdBQThCO1lBQzVDLFlBQVk7WUFDWixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQy9CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztZQUMvQixlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWU7WUFDM0MsUUFBUSxFQUFFLENBQUM7WUFDWCxjQUFjO1lBQ2QsZ0JBQWdCO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPO1lBQ1AsS0FBSyxFQUFFLEVBQUU7WUFDVCxhQUFhO1lBQ2IsVUFBVTtZQUNWLGVBQWUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUNuQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFNBQVM7WUFDVCxTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLHNDQUFzQyxDQUFDO1lBQ25ELFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUM3QixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDL0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQy9CLGVBQWUsRUFBRSxVQUFVLENBQUMsZUFBZTtTQUM1QyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2IsTUFBTSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxNQUFNLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEVBQUU7WUFDcEUsTUFBTSw2QkFBNkIsQ0FDakMsSUFBSSxDQUFDLE1BQU0sRUFDWCxLQUFLLENBQUMsR0FBRyxFQUNULFVBQVUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUNoQyxRQUFRLEVBQ1IsY0FBYyxFQUNkLEtBQUssQ0FBQyxlQUFlLENBQ3RCLENBQUM7WUFDRixNQUFNLDZCQUE2QixDQUNqQyxJQUFJLENBQUMsTUFBTSxFQUNYLEtBQUssQ0FBQyxNQUFNLEVBQ1osVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFDbkMsUUFBUSxFQUNSLGNBQWMsRUFDZCxLQUFLLENBQUMsa0JBQWtCLENBQ3pCLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ3hELFVBQVUsRUFDVixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FDNUIsQ0FBQztZQUNGLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQ25GLENBQUM7WUFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDakUsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztTQUM3QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FDaEQsYUFBYSxFQUNiLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLFdBQVcsQ0FBQyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUN6RSxDQUNGLENBQUM7UUFDRixJQUNFLFNBQVMsQ0FBQyxNQUFNLEtBQUssVUFBVTtlQUM1QixTQUFTLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxVQUFVLEVBQy9DLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FDMUMsU0FBUyxFQUNULGVBQWUsRUFDZixRQUFRLENBQ1QsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGlCQUFpQixDQUM1QixVQUFvQyxFQUNwQyxVQUNpRztRQUVqRyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FDN0MsVUFBVSxFQUNWLFVBQVUsQ0FBQyxZQUFZLENBQ3hCLENBQUM7UUFDRixJQUNFLFVBQVUsQ0FBQyxLQUFLLEtBQUssV0FBVztlQUM3QixVQUFVLENBQUMsS0FBSyxLQUFLLFdBQVc7ZUFDaEMsVUFBVSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQy9CLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUMxQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyx5QkFBeUIsQ0FDdkQsVUFBVSxDQUFDLE1BQU0sRUFDakIsUUFBUSxDQUNULENBQ0YsQ0FBQztRQUNGLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzVDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7WUFDeEMsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixNQUFNLEVBQUUsS0FBSztZQUNiLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUMxQixDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN2RCxRQUFRLEtBQUssU0FBUztZQUNwQixDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBb0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNyRSxDQUFDLENBQUMsT0FBTyxDQUNaLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQzNELE9BQU8sRUFBRSxVQUFVO1lBQ25CLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNuQixRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsUUFBUSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7Z0JBQzdCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUMvQixRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsT0FBTztZQUNMLEtBQUssRUFBRSxLQUE4RDtTQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsVUFBb0MsRUFDcEMsVUFDa0c7UUFFbEcsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQzdDLFVBQVUsRUFDVixVQUFVLENBQUMsWUFBWSxDQUN4QixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQzFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLHlCQUF5QixDQUN2RCxVQUFVLENBQUMsTUFBTSxFQUNqQixRQUFRLENBQ1QsQ0FDRixDQUFDO1FBQ0YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQ3JFLFVBQVUsQ0FBQyxNQUFNLENBQ2xCLENBQUM7UUFDRixJQUNFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUM7ZUFDdEQsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNO2VBQ3RCLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFDOUMsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUNsQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87WUFDM0IsU0FBUyxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztZQUN4QyxPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM5QixPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDeEQsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3ZELFFBQVEsS0FBSyxTQUFTO1lBQ3BCLENBQUMsQ0FBQztnQkFDRSxHQUFHLE9BQU87Z0JBQ1YsS0FBSyxFQUFFLFVBQW1CO2dCQUMxQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87YUFDNUI7WUFDSCxDQUFDLENBQUMsT0FBTyxDQUNaLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDM0QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ25CLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixRQUFRLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUMvQixRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsT0FBTztZQUNMLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1NBQ2hELENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FDbkIsVUFBb0MsRUFDcEMsVUFDa0c7UUFFbEcsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQzdDLFVBQVUsRUFDVixVQUFVLENBQUMsWUFBWSxDQUN4QixDQUFDO1FBQ0YsSUFDRSxVQUFVLENBQUMsS0FBSyxLQUFLLFVBQVU7ZUFDNUIsVUFBVSxDQUFDLEtBQUssS0FBSyxRQUFRO2VBQzdCLFVBQVUsQ0FBQyxLQUFLLEtBQUssWUFBWTtlQUNqQyxVQUFVLENBQUMsS0FBSyxLQUFLLFdBQVc7ZUFDaEMsVUFBVSxDQUFDLEtBQUssS0FBSyxVQUFVO2VBQy9CLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUTtlQUM3QixVQUFVLENBQUMsS0FBSyxLQUFLLGNBQWMsRUFDdEMsQ0FBQztZQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsSUFDRSxVQUFVLENBQUMsS0FBSyxLQUFLLE9BQU87ZUFDekIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsRUFDckUsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFDRSxVQUFVLENBQUMsYUFBYTtlQUNyQixVQUFVLENBQUMsVUFBVTtlQUNyQixVQUFVLENBQUMsZUFBZSxLQUFLLFNBQVM7ZUFDeEMsVUFBVSxDQUFDLGVBQWUsS0FBSyxTQUFTO2VBQ3hDLENBQ0QsVUFBVSxDQUFDLGFBQWEsS0FBSyxTQUFTO21CQUNuQyxDQUNELFVBQVUsQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTO3VCQUN0QyxVQUFVLENBQUMsZ0JBQWdCLEtBQUssc0JBQXNCO3VCQUN0RCxVQUFVLENBQUMsY0FBYyxLQUFLLFNBQVM7dUJBQ3ZDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUMxQyxDQUNGLEVBQ0QsQ0FBQztZQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLFVBQVUsRUFBRSxPQUFPO1lBQ25CLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQ3hDLE9BQU8sQ0FBQyxTQUFTLEVBQ2pCLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLE9BQU8sQ0FBQyxNQUFNLEVBQ2QsZ0JBQWdCLENBQ2pCO1NBQ0YsQ0FBQyxDQUFDLENBQ0osQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUNsQyxVQUFVLENBQUMsWUFBWSxFQUN2QixVQUFVLENBQUMsZ0JBQWdCLEVBQzNCLFVBQVUsQ0FBQyxTQUFTLEVBQ3BCLFVBQVUsQ0FBQyxPQUFPLEVBQ2xCLE9BQU8sQ0FDUixDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQ2pCLGlCQUFpQixVQUFVLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQztRQUM3QyxJQUFJLGVBQWUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFGLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsSUFDRSxVQUFVLENBQUMsYUFBYSxLQUFLLFNBQVM7ZUFDbkMsQ0FDRCxVQUFVLENBQUMsYUFBYSxLQUFLLGFBQWE7bUJBQ3ZDLFVBQVUsQ0FBQyxVQUFVLEtBQUssVUFBVTttQkFDcEMsVUFBVSxDQUFDLGVBQWUsS0FBSyxlQUFlLENBQ2xELEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFDRSxVQUFVLENBQUMsYUFBYSxLQUFLLGFBQWE7ZUFDdkMsVUFBVSxDQUFDLGNBQWMsS0FBSyxTQUFTO2VBQ3ZDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUN6QyxDQUFDO1lBQ0QsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztnQkFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3hELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUMxRCxPQUFPLEVBQUUsVUFBVTtZQUNuQixNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbkIsUUFBUSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxRQUFRLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztnQkFDM0MsUUFBUSxDQUFDLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDO2dCQUNuRCxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztnQkFDakMsUUFBUSxDQUFDLGNBQWMsR0FBRyxPQUFPO3NCQUM3QixPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0I7c0JBQ3hFLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ2YsUUFBUSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Z0JBQzdCLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDO2dCQUN2QixPQUFPLFFBQVEsQ0FBQyxlQUFlLENBQUM7Z0JBQ2hDLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUNoQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUN6QyxVQUFVLEVBQ1YsVUFBVSxDQUFDLFlBQVksQ0FDeEIsQ0FBQztZQUNGLElBQ0UsTUFBTSxDQUFDLGdCQUFnQixLQUFLLFVBQVUsQ0FBQyxnQkFBZ0I7bUJBQ3BELE1BQU0sQ0FBQyxhQUFhLEtBQUssYUFBYTttQkFDdEMsTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVO21CQUNoQyxNQUFNLENBQUMsZUFBZSxLQUFLLGVBQWU7bUJBQzFDLENBQ0QsTUFBTSxDQUFDLGFBQWEsS0FBSyxTQUFTO3VCQUMvQixNQUFNLENBQUMsZ0JBQWdCLEtBQUssc0JBQXNCLENBQ3RELEVBQ0QsQ0FBQztnQkFDRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEQsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FDM0MsYUFBYSxFQUNiLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQ25FLFdBQVcsQ0FBQyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUN6RSxDQUNGLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQ3pDLEtBQUssQ0FBQyxRQUFRLEVBQ2QsY0FBYyxFQUNkLFFBQVEsQ0FDVCxDQUFDO1FBQ0YsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUN6QyxVQUFVLEVBQ1YsVUFBVSxDQUFDLFlBQVksQ0FDeEIsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekIsSUFDRSxNQUFNLEVBQUUsZ0JBQWdCLEtBQUssVUFBVSxDQUFDLGdCQUFnQjttQkFDckQsTUFBTSxDQUFDLGFBQWEsS0FBSyxhQUFhO21CQUN0QyxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxNQUFNO21CQUNqQyxNQUFNLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxXQUFXO21CQUMzQyxDQUNELE1BQU0sQ0FBQyxhQUFhLEtBQUssU0FBUzt1QkFDL0IsTUFBTSxDQUFDLGdCQUFnQixLQUFLLHNCQUFzQixDQUN0RCxFQUNELENBQUM7Z0JBQ0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE9BQU87WUFDTCxVQUFVLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxLQUFLLENBQUMsaUJBQWlCLENBQzdCLFVBQTZCLEVBQzdCLE9BQXlDLEVBQ3pDLFdBQW1CO1FBRW5CLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLENBQUM7UUFDeEUsTUFBTSxVQUFVLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLHlCQUF5QixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE9BQU8sTUFBTSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRTtZQUMzRSxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ2pFLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDbkIsUUFBUSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7b0JBQ3ZDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO29CQUNyQyxRQUFRLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztvQkFDakMsUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDcEIsUUFBUSxDQUFDLHVCQUF1QixHQUFHLFdBQVcsQ0FBQztvQkFDakQsQ0FBQztvQkFDRCxPQUFPLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDakMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUMzQixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQ2pDLENBQUM7YUFDRixFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDaEMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLGNBQWMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLDRCQUE0QixDQUNoQyxJQUFJLENBQUMsTUFBTSxFQUNYLFVBQVUsRUFDVixPQUFPLEVBQ1AsV0FBVyxFQUNYLGNBQWMsQ0FDZixDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQ2QsVUFBb0MsRUFDcEMsVUFDNkY7UUFFN0YsT0FBTztZQUNMLFVBQVUsRUFBRSxrQkFBa0IsQ0FDNUIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FDbEU7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FDN0IsVUFBb0MsRUFDcEMsZUFBdUI7UUFFdkIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQ2xFLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUM7U0FDaEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export declare const privacySafeError: (errorArg: unknown) => plugins.typedrequest.TypedResponseError;
|
|
3
|
+
/**
|
|
4
|
+
* Register one typed handler with uniform failure redaction.
|
|
5
|
+
*
|
|
6
|
+
* Both peer-facing routers use this. The workload socket and the gateway
|
|
7
|
+
* socket are different peers, but a caller on either side has to be able to
|
|
8
|
+
* tell `QUOTA_EXCEEDED` from `STATE_CONFLICT`, so both must answer with the
|
|
9
|
+
* typed `ICoreMailErrorData` envelope rather than an opaque message.
|
|
10
|
+
*
|
|
11
|
+
* `handlerArg` is typed as typedrequest's own `THandlerFunction` rather than
|
|
12
|
+
* a hand-written signature: since typedrequest 8 both sides are wrapped in
|
|
13
|
+
* the `TReverseVirtualStreamDirections` mapped type, which does not reduce
|
|
14
|
+
* inside a generic wrapper, so any restatement of the shape stops being
|
|
15
|
+
* assignable. Concrete `IReq_*` types reduce normally, which is why the call
|
|
16
|
+
* sites need no change.
|
|
17
|
+
*/
|
|
18
|
+
export declare const addPrivacySafeTypedHandler: <TRequest extends plugins.typedrequestInterfaces.ITypedRequest>(routerArg: plugins.typedrequest.TypedRouter, scopeArg: "server" | "gateway", methodArg: TRequest["method"], handlerArg: plugins.typedrequest.THandlerFunction<TRequest>) => void;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { CoreMailAuthenticationError, CoreMailAuthorizationError, CoreMailCapabilityDeniedError, } from './classes.auth.js';
|
|
3
|
+
import { CoreMailQuotaExceededError } from './coremail.quota.js';
|
|
4
|
+
import { logCoreMailFailure } from './coremail.log.js';
|
|
5
|
+
export const privacySafeError = (errorArg) => {
|
|
6
|
+
let code = 'INVALID_REQUEST';
|
|
7
|
+
let retryable = false;
|
|
8
|
+
if (errorArg instanceof CoreMailAuthenticationError) {
|
|
9
|
+
code = 'AUTHENTICATION_FAILED';
|
|
10
|
+
}
|
|
11
|
+
else if (errorArg instanceof CoreMailCapabilityDeniedError) {
|
|
12
|
+
code = 'CAPABILITY_DENIED';
|
|
13
|
+
}
|
|
14
|
+
else if (errorArg instanceof CoreMailAuthorizationError) {
|
|
15
|
+
code = 'AUTHORITY_REVOKED';
|
|
16
|
+
}
|
|
17
|
+
else if (errorArg instanceof CoreMailQuotaExceededError) {
|
|
18
|
+
return new plugins.typedrequest.TypedResponseError('CoreMail request rejected.', {
|
|
19
|
+
code: 'QUOTA_EXCEEDED',
|
|
20
|
+
retryable: true,
|
|
21
|
+
...(errorArg.retryAfterMs === undefined
|
|
22
|
+
? {}
|
|
23
|
+
: { retryAfterMs: errorArg.retryAfterMs }),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else if (errorArg instanceof plugins.serveZoneInterfaces.data.CoreMailContractError) {
|
|
27
|
+
code = errorArg.code;
|
|
28
|
+
}
|
|
29
|
+
else if (errorArg instanceof Error
|
|
30
|
+
&& errorArg.message.includes('gateway')
|
|
31
|
+
&& errorArg.message.includes('unavailable')) {
|
|
32
|
+
code = 'GATEWAY_UNAVAILABLE';
|
|
33
|
+
retryable = true;
|
|
34
|
+
}
|
|
35
|
+
else if (errorArg instanceof Error
|
|
36
|
+
&& errorArg.message.includes('idempotency')) {
|
|
37
|
+
code = 'IDEMPOTENCY_CONFLICT';
|
|
38
|
+
}
|
|
39
|
+
else if (errorArg instanceof Error
|
|
40
|
+
&& errorArg.message.includes('fence')) {
|
|
41
|
+
code = 'STATE_CONFLICT';
|
|
42
|
+
retryable = true;
|
|
43
|
+
}
|
|
44
|
+
else if (errorArg instanceof Error
|
|
45
|
+
&& (errorArg.message.includes('byte budget')
|
|
46
|
+
|| errorArg.message.includes('content budget')
|
|
47
|
+
|| errorArg.message.includes('exceeds'))) {
|
|
48
|
+
code = 'PAYLOAD_LIMIT_EXCEEDED';
|
|
49
|
+
}
|
|
50
|
+
return new plugins.typedrequest.TypedResponseError('CoreMail request rejected.', {
|
|
51
|
+
code,
|
|
52
|
+
retryable,
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Register one typed handler with uniform failure redaction.
|
|
57
|
+
*
|
|
58
|
+
* Both peer-facing routers use this. The workload socket and the gateway
|
|
59
|
+
* socket are different peers, but a caller on either side has to be able to
|
|
60
|
+
* tell `QUOTA_EXCEEDED` from `STATE_CONFLICT`, so both must answer with the
|
|
61
|
+
* typed `ICoreMailErrorData` envelope rather than an opaque message.
|
|
62
|
+
*
|
|
63
|
+
* `handlerArg` is typed as typedrequest's own `THandlerFunction` rather than
|
|
64
|
+
* a hand-written signature: since typedrequest 8 both sides are wrapped in
|
|
65
|
+
* the `TReverseVirtualStreamDirections` mapped type, which does not reduce
|
|
66
|
+
* inside a generic wrapper, so any restatement of the shape stops being
|
|
67
|
+
* assignable. Concrete `IReq_*` types reduce normally, which is why the call
|
|
68
|
+
* sites need no change.
|
|
69
|
+
*/
|
|
70
|
+
export const addPrivacySafeTypedHandler = (routerArg, scopeArg, methodArg, handlerArg) => {
|
|
71
|
+
routerArg.addTypedHandler(new plugins.typedrequest.TypedHandler(methodArg, async (requestArg, toolsArg) => {
|
|
72
|
+
try {
|
|
73
|
+
return await handlerArg(requestArg, toolsArg);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const safeError = privacySafeError(error);
|
|
77
|
+
if (safeError.errorData?.code === 'INVALID_REQUEST') {
|
|
78
|
+
await logCoreMailFailure(scopeArg, 'UNEXPECTED_HANDLER_FAILURE', error, { method: methodArg }).catch(() => undefined);
|
|
79
|
+
}
|
|
80
|
+
throw safeError;
|
|
81
|
+
}
|
|
82
|
+
}));
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZW1haWwuZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY29yZW1haWwuZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLDZCQUE2QixHQUM5QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSXZELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLFFBQWlCLEVBQ3dCLEVBQUU7SUFDM0MsSUFBSSxJQUFJLEdBQWUsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLElBQUksUUFBUSxZQUFZLDJCQUEyQixFQUFFLENBQUM7UUFDcEQsSUFBSSxHQUFHLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7U0FBTSxJQUFJLFFBQVEsWUFBWSw2QkFBNkIsRUFBRSxDQUFDO1FBQzdELElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO1NBQU0sSUFBSSxRQUFRLFlBQVksMEJBQTBCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDN0IsQ0FBQztTQUFNLElBQUksUUFBUSxZQUFZLDBCQUEwQixFQUFFLENBQUM7UUFDMUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLEVBQUU7WUFDL0UsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixTQUFTLEVBQUUsSUFBSTtZQUNmLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVM7Z0JBQ3JDLENBQUMsQ0FBQyxFQUFFO2dCQUNKLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxR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
|
|
@@ -5,4 +5,4 @@ export interface ICoreMailSanitizedError {
|
|
|
5
5
|
message: string;
|
|
6
6
|
}
|
|
7
7
|
export declare const sanitizeErrorForLog: (errorArg: unknown) => ICoreMailSanitizedError;
|
|
8
|
-
export declare const logCoreMailFailure: (componentArg: "auth" | "desired-state" | "gateway" | "lifecycle" | "retention" | "server" | "transfer" | "worker", codeArg: string, errorArg?: unknown, contextArg?: Record<string, string | number>) => Promise<void>;
|
|
8
|
+
export declare const logCoreMailFailure: (componentArg: "auth" | "desired-state" | "gateway" | "lifecycle" | "retention" | "server" | "smtp" | "transfer" | "worker", codeArg: string, errorArg?: unknown, contextArg?: Record<string, string | number>) => Promise<void>;
|
package/dist_ts/coremail.log.js
CHANGED
|
@@ -26,4 +26,4 @@ export const logCoreMailFailure = async (componentArg, codeArg, errorArg, contex
|
|
|
26
26
|
...(contextArg === undefined ? {} : { context: contextArg }),
|
|
27
27
|
});
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZW1haWwubG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY29yZW1haWwubG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztJQUMxRSxJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFDVCxxRkFBcUY7Q0FDeEYsQ0FBQyxDQUFDO0FBRUgsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBRS9CLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxRQUFnQixFQUFVLEVBQUUsQ0FDeEQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBT3hELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQ2pDLFFBQWlCLEVBQ1EsRUFBRTtJQUMzQixJQUFJLFFBQVEsWUFBWSxLQUFLLEVBQUUsQ0FBQztRQUM5QixPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDOUQsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLGNBQWM7UUFDcEIsT0FBTyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO0tBQzlELENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQ3JDLFlBU1ksRUFDWixPQUFlLEVBQ2YsUUFBa0IsRUFDbEIsVUFBNEMsRUFDN0IsRUFBRTtJQUNqQixNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQ3RCLE1BQU0sRUFDTiw0QkFBNEIsRUFDNUI7UUFDRSxTQUFTLEVBQUUsWUFBWTtRQUN2QixJQUFJLEVBQUUsT0FBTztRQUNiLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDM0UsR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7S0FDN0QsQ0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -5,4 +5,19 @@ export declare const createCoreMailMime: (submissionIdArg: string, submissionDig
|
|
|
5
5
|
descriptor: ISubmissionPartRecord;
|
|
6
6
|
bytes: Uint8Array;
|
|
7
7
|
}>) => Uint8Array;
|
|
8
|
+
/** Bytes of a stored message that are read to find its headers. */
|
|
9
|
+
export declare const coreMailHeaderScanBytes: number;
|
|
10
|
+
/**
|
|
11
|
+
* Read `Message-ID` and `Subject` out of an RFC 5322 header block.
|
|
12
|
+
*
|
|
13
|
+
* `bytesArg` is a bounded prefix of the stored message, so a header block that
|
|
14
|
+
* does not end inside it is treated as absent rather than guessed at. Folded
|
|
15
|
+
* continuation lines are unfolded, `Subject` encoded-words are decoded when
|
|
16
|
+
* that is possible without a dependency, and both values are trimmed to the
|
|
17
|
+
* byte budgets the delivery record enforces.
|
|
18
|
+
*/
|
|
19
|
+
export declare const parseCoreMailMessageHeaders: (bytesArg: Uint8Array) => {
|
|
20
|
+
messageId?: string;
|
|
21
|
+
subject?: string;
|
|
22
|
+
};
|
|
8
23
|
export {};
|
package/dist_ts/coremail.mime.js
CHANGED
|
@@ -60,4 +60,79 @@ export const createCoreMailMime = (submissionIdArg, submissionDigestArg, created
|
|
|
60
60
|
}
|
|
61
61
|
return encoded;
|
|
62
62
|
};
|
|
63
|
-
|
|
63
|
+
/** Bytes of a stored message that are read to find its headers. */
|
|
64
|
+
export const coreMailHeaderScanBytes = 64 * 1024;
|
|
65
|
+
const decodeEncodedWords = (valueArg) => valueArg.replace(/=\?([A-Za-z0-9._-]+)\?([BbQq])\?([^?]*)\?=/g, (matchArg, charsetArg, encodingArg, payloadArg) => {
|
|
66
|
+
const charset = charsetArg.toLowerCase();
|
|
67
|
+
// Only the charsets Node decodes natively; anything else keeps its raw
|
|
68
|
+
// encoded-word so nothing is silently corrupted.
|
|
69
|
+
if (charset !== 'utf-8' && charset !== 'us-ascii' && charset !== 'iso-8859-1') {
|
|
70
|
+
return matchArg;
|
|
71
|
+
}
|
|
72
|
+
const nodeCharset = charset === 'iso-8859-1' ? 'latin1' : 'utf8';
|
|
73
|
+
try {
|
|
74
|
+
if (encodingArg.toLowerCase() === 'b') {
|
|
75
|
+
return Buffer.from(payloadArg, 'base64').toString(nodeCharset);
|
|
76
|
+
}
|
|
77
|
+
const quoted = payloadArg
|
|
78
|
+
.replaceAll('_', ' ')
|
|
79
|
+
.replace(/=([0-9A-Fa-f]{2})/g, (_matchArg, hexArg) => String.fromCharCode(Number.parseInt(hexArg, 16)));
|
|
80
|
+
return Buffer.from(quoted, 'binary').toString(nodeCharset);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return matchArg;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const sanitizeHeaderValue = (valueArg, maximumBytesArg) => {
|
|
87
|
+
let value = valueArg.replace(/[\u0000-\u001f\u007f]/g, ' ').trim();
|
|
88
|
+
if (!value)
|
|
89
|
+
return undefined;
|
|
90
|
+
while (Buffer.byteLength(value, 'utf8') > maximumBytesArg) {
|
|
91
|
+
value = value.slice(0, -1).trim();
|
|
92
|
+
if (!value)
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
return value;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Read `Message-ID` and `Subject` out of an RFC 5322 header block.
|
|
99
|
+
*
|
|
100
|
+
* `bytesArg` is a bounded prefix of the stored message, so a header block that
|
|
101
|
+
* does not end inside it is treated as absent rather than guessed at. Folded
|
|
102
|
+
* continuation lines are unfolded, `Subject` encoded-words are decoded when
|
|
103
|
+
* that is possible without a dependency, and both values are trimmed to the
|
|
104
|
+
* byte budgets the delivery record enforces.
|
|
105
|
+
*/
|
|
106
|
+
export const parseCoreMailMessageHeaders = (bytesArg) => {
|
|
107
|
+
const text = Buffer.from(bytesArg).toString('binary');
|
|
108
|
+
const boundary = text.indexOf('\r\n\r\n');
|
|
109
|
+
const headerSection = boundary < 0 ? text : text.slice(0, boundary);
|
|
110
|
+
const unfolded = [];
|
|
111
|
+
for (const rawLine of headerSection.split('\r\n')) {
|
|
112
|
+
if (/^[ \t]/.test(rawLine) && unfolded.length > 0) {
|
|
113
|
+
unfolded[unfolded.length - 1] += ` ${rawLine.trim()}`;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
unfolded.push(rawLine);
|
|
117
|
+
}
|
|
118
|
+
const result = {};
|
|
119
|
+
for (const line of unfolded) {
|
|
120
|
+
const separator = line.indexOf(':');
|
|
121
|
+
if (separator < 1)
|
|
122
|
+
continue;
|
|
123
|
+
const name = line.slice(0, separator).trim().toLowerCase();
|
|
124
|
+
const rawValue = line.slice(separator + 1);
|
|
125
|
+
if (name === 'message-id' && result.messageId === undefined) {
|
|
126
|
+
const value = sanitizeHeaderValue(Buffer.from(rawValue, 'binary').toString('utf8'), 998);
|
|
127
|
+
if (value)
|
|
128
|
+
result.messageId = value;
|
|
129
|
+
}
|
|
130
|
+
else if (name === 'subject' && result.subject === undefined) {
|
|
131
|
+
const value = sanitizeHeaderValue(decodeEncodedWords(Buffer.from(rawValue, 'binary').toString('utf8')), 768);
|
|
132
|
+
if (value)
|
|
133
|
+
result.subject = value;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZW1haWwubWltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NvcmVtYWlsLm1pbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFLeEMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUNwRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxRQUFRO0lBQ1YsQ0FBQyxDQUFDLGFBQWEsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7QUFFeEUsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsVUFBNkQsRUFDckQsRUFBRTtJQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdELE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckQsQ0FBQyxDQUFDLFdBQVc7UUFDYixDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDdkUsT0FBTyxHQUFHLFFBQVEsS0FBSyxVQUFVLENBQUMsT0FBTyxHQUFHLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFvQixFQUFVLEVBQUUsQ0FDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDbEIsUUFBUSxDQUFDLFFBQVEsQ0FBQztLQUNsQixLQUFL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
|