@pipeline-builder/pipeline-data 4.1.24 → 4.1.26
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/lib/api/alert-destinations.d.ts +17 -0
- package/lib/api/alert-destinations.js +36 -0
- package/lib/api/reporting/analytics-queries.d.ts +274 -0
- package/lib/api/reporting/analytics-queries.js +598 -0
- package/lib/api/reporting/daily-rollup.d.ts +41 -0
- package/lib/api/reporting/daily-rollup.js +173 -0
- package/lib/api/reporting/deploy-rollup.d.ts +78 -0
- package/lib/api/reporting/deploy-rollup.js +203 -0
- package/lib/api/reporting/dora-scoring.d.ts +14 -0
- package/lib/api/reporting/dora-scoring.js +25 -1
- package/lib/api/reporting/dora.js +30 -6
- package/lib/api/reporting/failure-classifier.d.ts +54 -0
- package/lib/api/reporting/failure-classifier.js +179 -0
- package/lib/api/reporting/ingest.d.ts +2 -2
- package/lib/api/reporting/ingest.js +129 -4
- package/lib/api/reporting/last-deploy.d.ts +31 -0
- package/lib/api/reporting/last-deploy.js +93 -0
- package/lib/api/reporting/needs-attention.d.ts +93 -0
- package/lib/api/reporting/needs-attention.js +152 -0
- package/lib/api/reporting/plugin-exposure.d.ts +129 -0
- package/lib/api/reporting/plugin-exposure.js +312 -0
- package/lib/api/reporting/retention-sweep.js +9 -1
- package/lib/api/reporting/sql-helpers.d.ts +35 -2
- package/lib/api/reporting/sql-helpers.js +39 -1
- package/lib/api/reporting/stakeholder/compose.d.ts +115 -0
- package/lib/api/reporting/stakeholder/compose.js +234 -0
- package/lib/api/reporting/stakeholder/index.d.ts +14 -0
- package/lib/api/reporting/stakeholder/index.js +17 -0
- package/lib/api/reporting/stakeholder/period.d.ts +102 -0
- package/lib/api/reporting/stakeholder/period.js +273 -0
- package/lib/api/reporting/stakeholder/report-html.d.ts +93 -0
- package/lib/api/reporting/stakeholder/report-html.js +208 -0
- package/lib/api/reporting/stakeholder/sections.d.ts +117 -0
- package/lib/api/reporting/stakeholder/sections.js +249 -0
- package/lib/api/reporting/stakeholder/store.d.ts +450 -0
- package/lib/api/reporting/stakeholder/store.js +981 -0
- package/lib/api/reporting/stakeholder/templates.d.ts +21 -0
- package/lib/api/reporting/stakeholder/templates.js +104 -0
- package/lib/api/reporting/types.d.ts +73 -0
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.d.ts +94 -5
- package/lib/api/reporting-service.js +169 -10
- package/lib/api/soft-delete-sweep.d.ts +11 -2
- package/lib/api/soft-delete-sweep.js +17 -6
- package/lib/database/drizzle-schema.d.ts +2244 -385
- package/lib/database/drizzle-schema.js +18 -7
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +4 -2
- package/lib/database/schema/compliance.d.ts +0 -682
- package/lib/database/schema/compliance.js +6 -66
- package/lib/database/schema/ecosystem.d.ts +20 -157
- package/lib/database/schema/ecosystem.js +23 -16
- package/lib/database/schema/pipeline.d.ts +200 -0
- package/lib/database/schema/pipeline.js +100 -1
- package/lib/database/schema/plugin.d.ts +20 -1
- package/lib/database/schema/plugin.js +13 -1
- package/lib/database/schema/reporting-analytics.d.ts +1212 -0
- package/lib/database/schema/reporting-analytics.js +250 -0
- package/lib/database/schema/reporting-stakeholder.d.ts +1373 -0
- package/lib/database/schema/reporting-stakeholder.js +251 -0
- package/lib/index.d.ts +10 -1
- package/lib/index.js +15 -1
- package/lib/testing/exports.json +67 -4
- package/package.json +4 -3
|
@@ -23,6 +23,13 @@ export interface PurgeableEntity {
|
|
|
23
23
|
/** Hard-delete up to `limit` expired tombstones; returns rows purged. */
|
|
24
24
|
purgeExpired(now: Date, limit?: number): Promise<number>;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The services that run a soft-delete purge. A closed union, not a `string`,
|
|
28
|
+
* because the value becomes the LOCK KEY: two services passing the same string
|
|
29
|
+
* would silently share one lock, and whichever lost it would simply never sweep —
|
|
30
|
+
* a typo that stops a purge with no error anywhere.
|
|
31
|
+
*/
|
|
32
|
+
export type SoftDeleteSweepService = 'pipeline' | 'plugin' | 'message' | 'compliance' | 'platform' | 'reporting';
|
|
26
33
|
export interface SoftDeletePurgeOptions {
|
|
27
34
|
/** Rows per batch per table (default 500). */
|
|
28
35
|
batchSize?: number;
|
|
@@ -39,10 +46,12 @@ export declare function isSoftDeletePurgeEnabled(): boolean;
|
|
|
39
46
|
* hit (logged; continued next tick). Never throws — a failing entity is logged
|
|
40
47
|
* and the sweep moves on. Returns per-entity purged counts (also logged).
|
|
41
48
|
*/
|
|
42
|
-
export declare function runSoftDeletePurge(entities: PurgeableEntity[], opts?: SoftDeletePurgeOptions
|
|
49
|
+
export declare function runSoftDeletePurge(entities: PurgeableEntity[], opts?: SoftDeletePurgeOptions, run?: {
|
|
50
|
+
signal: AbortSignal;
|
|
51
|
+
}): Promise<Record<string, number>>;
|
|
43
52
|
export interface SoftDeletePurgeSchedulerOptions extends SoftDeletePurgeOptions {
|
|
44
53
|
/** Service label for logs + the leader-lock key (e.g. 'pipeline', 'plugin'). */
|
|
45
|
-
service:
|
|
54
|
+
service: SoftDeleteSweepService;
|
|
46
55
|
/** Entities to sweep — usually the service's own CrudService singletons. */
|
|
47
56
|
entities: PurgeableEntity[];
|
|
48
57
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* than left to the caller. This is a cross-tenant housekeeping job, not a
|
|
18
18
|
* per-org operation.
|
|
19
19
|
*/
|
|
20
|
-
import { createLogger, createScheduler, envBool, envInt } from '@pipeline-builder/api-core';
|
|
20
|
+
import { createLogger, createScheduler, envBool, envInt, leaderLockKey, DEFAULT_LEADER_LOCK_TTL_MS } from '@pipeline-builder/api-core';
|
|
21
21
|
import { runWithTenantContext } from '../database/tenancy.js';
|
|
22
22
|
const logger = createLogger('soft-delete-sweep');
|
|
23
23
|
/** Kill-switch: `SOFT_DELETE_PURGE_ENABLED=false` disables all hard-purging
|
|
@@ -31,7 +31,7 @@ export function isSoftDeletePurgeEnabled() {
|
|
|
31
31
|
* hit (logged; continued next tick). Never throws — a failing entity is logged
|
|
32
32
|
* and the sweep moves on. Returns per-entity purged counts (also logged).
|
|
33
33
|
*/
|
|
34
|
-
export async function runSoftDeletePurge(entities, opts = {}) {
|
|
34
|
+
export async function runSoftDeletePurge(entities, opts = {}, run) {
|
|
35
35
|
const counts = {};
|
|
36
36
|
if (!isSoftDeletePurgeEnabled()) {
|
|
37
37
|
logger.debug('Soft-delete purge disabled (SOFT_DELETE_PURGE_ENABLED=false)');
|
|
@@ -46,8 +46,19 @@ export async function runSoftDeletePurge(entities, opts = {}) {
|
|
|
46
46
|
// tables return zero rows and production `strict` mode throws.
|
|
47
47
|
return runWithTenantContext({ isSuperAdmin: true }, async () => {
|
|
48
48
|
for (const entity of entities) {
|
|
49
|
+
// Between entities: the leader lock was lost (another pod is taking over) or
|
|
50
|
+
// we are shutting down. The remaining entities are picked up next tick —
|
|
51
|
+
// their tombstones are still expired — and stopping lets the lock go.
|
|
52
|
+
if (run?.signal.aborted) {
|
|
53
|
+
logger.info('Soft-delete purge stopping early', { reason: String(run.signal.reason ?? 'aborted'), atEntity: entity.name });
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
49
56
|
let total = 0;
|
|
50
57
|
for (let i = 0; i < maxBatches; i++) {
|
|
58
|
+
// Also between BATCHES: one entity with a large backlog can run for many
|
|
59
|
+
// batches, which is exactly the case a TTL used to have to cover.
|
|
60
|
+
if (run?.signal.aborted)
|
|
61
|
+
break;
|
|
51
62
|
let purged;
|
|
52
63
|
try {
|
|
53
64
|
purged = await entity.purgeExpired(now, batchSize);
|
|
@@ -95,7 +106,7 @@ export function createSoftDeletePurgeScheduler(opts) {
|
|
|
95
106
|
}
|
|
96
107
|
const intervalMs = envInt('SOFT_DELETE_PURGE_INTERVAL_HOURS', 6, { min: 1 }) * 60 * 60 * 1000;
|
|
97
108
|
const startupDelayMs = envInt('SOFT_DELETE_PURGE_STARTUP_DELAY_MS', 120_000, { min: 0 });
|
|
98
|
-
const lockTtlMs = envInt('SOFT_DELETE_PURGE_LOCK_TTL_MS',
|
|
109
|
+
const lockTtlMs = envInt('SOFT_DELETE_PURGE_LOCK_TTL_MS', DEFAULT_LEADER_LOCK_TTL_MS, { min: 1000 });
|
|
99
110
|
logger.info('Soft-delete purge scheduler starting', {
|
|
100
111
|
service: opts.service,
|
|
101
112
|
entities: opts.entities.map((e) => e.name),
|
|
@@ -105,8 +116,8 @@ export function createSoftDeletePurgeScheduler(opts) {
|
|
|
105
116
|
name: `soft-delete-purge:${opts.service}`,
|
|
106
117
|
intervalMs,
|
|
107
118
|
startupDelayMs,
|
|
108
|
-
run: async () => { await runSoftDeletePurge(opts.entities, opts); },
|
|
109
|
-
lock: { key:
|
|
119
|
+
run: async (run) => { await runSoftDeletePurge(opts.entities, opts, run); },
|
|
120
|
+
lock: { key: leaderLockKey(opts.service, 'soft-delete-purge'), ttlMs: lockTtlMs },
|
|
110
121
|
});
|
|
111
122
|
}
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1kZWxldGUtc3dlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLDRCQUE0QixDQUFDO0FBQzVHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBa0JqRDs2RUFDNkU7QUFDN0UsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxRQUEyQixFQUMzQixJQUFJLEdBQTJCLEVBQUU7SUFFakMsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUM3RSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUM7SUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRCwrRUFBK0U7SUFDL0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV2QiwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLCtEQUErRDtJQUMvRCxPQUFPLG9CQUFvQixDQUFDLEVBQUUsWUFBWSxF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LElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxxQkFBcUIsSUFBSSxDQUFDLE9BQU8sU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDNUUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gcHVyZ2UuXG4gKlxuICogRXZlcnkge0BsaW5rIENydWRTZXJ2aWNlfSBlbnRpdHkgc29mdC1kZWxldGVzIChzZXRzIGBkZWxldGVkQXRgICsgYVxuICogYHB1cmdlX2FmdGVyYCBkZWFkbGluZSkuIFRoaXMgb3JjaGVzdHJhdG9yIHJ1bnMgb25lIHB1cmdlIHBhc3MgYWNyb3NzIGEgc2V0XG4gKiBvZiBzdWNoIGVudGl0aWVzLCBoYXJkLWRlbGV0aW5nIHRvbWJzdG9uZXMgd2hvc2UgZGVhZGxpbmUgaGFzIHBhc3NlZC4gSXQgaXNcbiAqIHRoZSBgcnVuYCBjYWxsYmFjayBhIHNlcnZpY2UgaGFuZHMgdG8gYGNyZWF0ZVNjaGVkdWxlcmAgKGxlYWRlci1sb2NrZWQpLCBzb1xuICogb25seSBvbmUgcG9kIHN3ZWVwcyBhdCBhIHRpbWUuXG4gKlxuICogUnVucyBpbiBhbiBleHBsaWNpdCAqKnN5c2FkbWluIHRlbmFudCBzY29wZSoqIChgcnVuV2l0aFRlbmFudENvbnRleHQoe1xuICogaXNTdXBlckFkbWluOiB0cnVlIH0pYCkgc28gdGhlIHVuZGVybHlpbmcgYHB1cmdlRXhwaXJlZGAgc3BhbnMgZXZlcnkgb3JnIGFuZFxuICogYnlwYXNzZXMgUkxTIG9uIEZPUkNFJ2QgdGFibGVzIChwbHVnaW5zL3BpcGVsaW5lcy9ldGMuKS4gQSBiYXJlIG5vLXRlbmFudFxuICogY29udGV4dCB3b3VsZCBzZWUgemVybyByb3dzIG9uIHRob3NlIHRhYmxlcyDigJQgYW5kIGluIHByb2R1Y3Rpb24gKGBzdHJpY3RgXG4gKiBtb2RlKSBgd2l0aFRlbmFudFR4YCB0aHJvd3Mgb3V0cmlnaHQg4oCUIHNvIHRoZSBzY29wZSBpcyBlc3RhYmxpc2hlZCBoZXJlIHJhdGhlclxuICogdGhhbiBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoaXMgaXMgYSBjcm9zcy10ZW5hbnQgaG91c2VrZWVwaW5nIGpvYiwgbm90IGFcbiAqIHBlci1vcmcgb3BlcmF0aW9uLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlU2NoZWR1bGVyLCBlbnZCb29sLCBlbnZJbnQsIHR5cGUgU2NoZWR1bGVyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzb2Z0LWRlbGV0ZS1zd2VlcCcpO1xuXG4vKiogVGhlIHNsaWNlIG9mIGEgQ3J1ZFNlcnZpY2UgdGhlIHN3ZWVwIG5lZWRzLCBwbHVzIGEgbGFiZWwgZm9yIGxvZ3MvbWV0cmljcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVyZ2VhYmxlRW50aXR5IHtcbiAgLyoqIFRhYmxlL2VudGl0eSBsYWJlbCAoZS5nLiAncGlwZWxpbmUnKSBmb3IgcGVyLXRhYmxlIGxvZ2dpbmcuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEhhcmQtZGVsZXRlIHVwIHRvIGBsaW1pdGAgZXhwaXJlZCB0b21ic3RvbmVzOyByZXR1cm5zIHJvd3MgcHVyZ2VkLiAqL1xuICBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zIHtcbiAgLyoqIFJvd3MgcGVyIGJhdGNoIHBlciB0YWJsZSAoZGVmYXVsdCA1MDApLiAqL1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKiBNYXggYmF0Y2hlcyBwZXIgdGFibGUgcGVyIHRpY2sgKGRlZmF1bHQgMjAg4oaSIOKJpCAxMGsvdGFibGUvdGljayk7IHRoZSByZXN0XG4gICAqICBpcyBkZWZlcnJlZCB0byB0aGUgbmV4dCB0aWNrIHNvIGEgaHVnZSBiYWNrbG9nIGNhbid0IGJsb3cgdGhlIGxvY2sgVFRMLiAqL1xuICBtYXhCYXRjaGVzUGVyRW50aXR5PzogbnVtYmVyO1xufVxuXG4vKiogS2lsbC1zd2l0Y2g6IGBTT0ZUX0RFTEVURV9QVVJHRV9FTkFCTEVEPWZhbHNlYCBkaXNhYmxlcyBhbGwgaGFyZC1wdXJnaW5nXG4gKiAgKHRvbWJzdG9uZXMgc3RpbGwgYWNjdW11bGF0ZSArIHN0YXkgcmVzdG9yYWJsZTsgbm90aGluZyBpcyBkZXN0cm95ZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVudkJvb2woJ1NPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQnLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSdW4gb25lIHB1cmdlIHN3ZWVwIGFjcm9zcyBgZW50aXRpZXNgLiBMb29wcyBlYWNoIGVudGl0eSdzIGBwdXJnZUV4cGlyZWRgIGluXG4gKiBiYXRjaGVzIHVudGlsIGEgYmF0Y2ggcmV0dXJucyBgPCBiYXRjaFNpemVgIChkcmFpbmVkKSBvciB0aGUgcGVyLXRpY2sgY2FwIGlzXG4gKiBoaXQgKGxvZ2dlZDsgY29udGludWVkIG5leHQgdGljaykuIE5ldmVyIHRocm93cyDigJQgYSBmYWlsaW5nIGVudGl0eSBpcyBsb2dnZWRcbiAqIGFuZCB0aGUgc3dlZXAgbW92ZXMgb24uIFJldHVybnMgcGVyLWVudGl0eSBwdXJnZWQgY291bnRzIChhbHNvIGxvZ2dlZCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Tb2Z0RGVsZXRlUHVyZ2UoXG4gIGVudGl0aWVzOiBQdXJnZWFibGVFbnRpdHlbXSxcbiAgb3B0czogU29mdERlbGV0ZVB1cmdlT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gIGNvbnN0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBpZiAoIWlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdTb2Z0LWRlbGV0ZSBwdXJnZSBkaXNhYmxlZCAoU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZSknKTtcbiAgICByZXR1cm4gY291bnRzO1xuICB9XG5cbiAgY29uc3QgYmF0Y2hTaXplID0gb3B0cy5iYXRjaFNpemUgPz8gNTAwO1xuICBjb25zdCBtYXhCYXRjaGVzID0gb3B0cy5tYXhCYXRjaGVzUGVyRW50aXR5ID8/IDIwO1xuICAvLyBPbmUgYG5vd2AgZm9yIHRoZSB3aG9sZSB0aWNrIOKAlCByb3dzIHRoYXQgZXhwaXJlIG1pZC1zd2VlcCB3YWl0IGZvciB0aGUgbmV4dC5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAvLyBFc3RhYmxpc2ggYSBzeXNhZG1pbiBzY29wZSBzbyBldmVyeSBgcHVyZ2VFeHBpcmVkYCAod2hpY2ggcm91dGVzIHRocm91Z2hcbiAgLy8gYHdpdGhUZW5hbnRUeGApIGJ5cGFzc2VzIFJMUyBhbmQgc3BhbnMgYWxsIG9yZ3MuIFdpdGhvdXQgdGhpcywgRk9SQ0UnZFxuICAvLyB0YWJsZXMgcmV0dXJuIHplcm8gcm93cyBhbmQgcHJvZHVjdGlvbiBgc3RyaWN0YCBtb2RlIHRocm93cy5cbiAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgbGV0IHRvdGFsID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4QmF0Y2hlczsgaSsrKSB7XG4gICAgICAgIGxldCBwdXJnZWQ6IG51bWJlcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwdXJnZWQgPSBhd2FpdCBlbnRpdHkucHVyZ2VFeHBpcmVkKG5vdywgYmF0Y2hTaXplKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdQdXJnZSBiYXRjaCBmYWlsZWQnLCB7IGVudGl0eTogZW50aXR5Lm5hbWUsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0b3RhbCArPSBwdXJnZWQ7XG4gICAgICAgIGlmIChwdXJnZWQgPCBiYXRjaFNpemUpIGJyZWFrOyAvLyBkcmFpbmVkXG4gICAgICAgIGlmIChpID09PSBtYXhCYXRjaGVzIC0gMSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdQdXJnZSBoaXQgcGVyLXRpY2sgY2FwOyByZW1haW5pbmcgdG9tYnN0b25lcyBkZWZlcnJlZCB0byBuZXh0IHRpY2snLCB7XG4gICAgICAgICAgICBlbnRpdHk6IGVudGl0eS5uYW1lLCBwdXJnZWRUaGlzVGljazogdG90YWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbCA+IDApIGxvZ2dlci5pbmZvKCdQdXJnZWQgZXhwaXJlZCBzb2Z0LWRlbGV0ZWQgcm93cycsIHsgZW50aXR5OiBlbnRpdHkubmFtZSwgY291bnQ6IHRvdGFsIH0pO1xuICAgICAgY291bnRzW2VudGl0eS5uYW1lXSA9IHRvdGFsO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudHM7XG4gIH0pO1xufVxuXG4vLyAtLSBTY2hlZHVsZXIgZmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVQdXJnZVNjaGVkdWxlck9wdGlvbnMgZXh0ZW5kcyBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zIHtcbiAgLyoqIFNlcnZpY2UgbGFiZWwgZm9yIGxvZ3MgKyB0aGUgbGVhZGVyLWxvY2sga2V5IChlLmcuICdwaXBlbGluZScsICdwbHVnaW4nKS4gKi9cbiAgc2VydmljZTogc3RyaW5nO1xuICAvKiogRW50aXRpZXMgdG8gc3dlZXAg4oCUIHVzdWFsbHkgdGhlIHNlcnZpY2UncyBvd24gQ3J1ZFNlcnZpY2Ugc2luZ2xldG9ucy4gKi9cbiAgZW50aXRpZXM6IFB1cmdlYWJsZUVudGl0eVtdO1xufVxuXG4vKipcbiAqIEJ1aWxkIChidXQgZG8gTk9UIHN0YXJ0KSBhIGxlYWRlci1sb2NrZWQgc2NoZWR1bGVyIHRoYXQgcnVucyB0aGUgc29mdC1kZWxldGVcbiAqIHB1cmdlIHN3ZWVwIGZvciBgZW50aXRpZXNgIG9uIGEgY2FkZW5jZS4gVGhlIGNhbGxlciBgLnN0YXJ0KClgcyBpdCBhbmQgd2lyZXNcbiAqIGBzdG9wKClgIHRvIFNJR1RFUk0uIFJldHVybnMgbnVsbCB3aGVuIHB1cmdpbmcgaXMgZGlzYWJsZWQuXG4gKlxuICogRW52IGNvbmZpZzpcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRCAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZTsgZmFsc2Ug4oeSIG51bGwsIG5vIHN3ZWVwKVxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9JTlRFUlZBTF9IT1VSUyAgICAoZGVmYXVsdCA2KVxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9TVEFSVFVQX0RFTEFZX01TICAoZGVmYXVsdCAxMjAwMDAg4oCUIDIgbWluIHNldHRsZSlcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfTE9DS19UVExfTVMgICAgICAgKGRlZmF1bHQgOTAwMDAwIOKAlCAxNSBtaW47IG91dGxhc3RzIGFcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZWVwLCBzdGF5cyB1bmRlciB0aGUgaW50ZXJ2YWwpXG4gKlxuICogQSBjcm9zcy1wb2QgbGVhZGVyIGxvY2sgKHdoZW4gUmVkaXMgaXMgY29uZmlndXJlZCkgbWVhbnMgb25seSBvbmUgcmVwbGljYVxuICogc3dlZXBzIHBlciB3aW5kb3c7IHdpdGhvdXQgUmVkaXMgaXQgcnVucyBvbiBldmVyeSBwb2Qg4oCUIHN0aWxsIHNhZmUsIHNpbmNlIHRoZVxuICogcHVyZ2UgaXMgYSBiYXRjaGVkIGlkZW1wb3RlbnQgREVMRVRFLCBqdXN0IHJlZHVuZGFudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNvZnREZWxldGVQdXJnZVNjaGVkdWxlcihvcHRzOiBTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXJPcHRpb25zKTogU2NoZWR1bGVyIHwgbnVsbCB7XG4gIGlmICghaXNTb2Z0RGVsZXRlUHVyZ2VFbmFibGVkKCkpIHtcbiAgICBsb2dnZXIuaW5mbygnU29mdC1kZWxldGUgcHVyZ2Ugc2NoZWR1bGVyIGRpc2FibGVkIChTT0ZUX0RFTEVURV9QVVJHRV9FTkFCTEVEPWZhbHNlKScsIHsgc2VydmljZTogb3B0cy5zZXJ2aWNlIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxNcyA9IGVudkludCgnU09GVF9ERUxFVEVfUFVSR0VfSU5URVJWQUxfSE9VUlMnLCA2LCB7IG1pbjogMSB9KSAqIDYwICogNjAgKiAxMDAwO1xuICBjb25zdCBzdGFydHVwRGVsYXlNcyA9IGVudkludCgnU09GVF9ERUxFVEVfUFVSR0VfU1RBUlRVUF9ERUxBWV9NUycsIDEyMF8wMDAsIHsgbWluOiAwIH0pO1xuICBjb25zdCBsb2NrVHRsTXMgPSBlbnZJbnQoJ1NPRlRfREVMRVRFX1BVUkdFX0xPQ0tfVFRMX01TJywgOTAwXzAwMCwgeyBtaW46IDEwMDAgfSk7XG5cbiAgbG9nZ2VyLmluZm8oJ1NvZnQtZGVsZXRlIHB1cmdlIHNjaGVkdWxlciBzdGFydGluZycsIHtcbiAgICBzZXJ2aWNlOiBvcHRzLnNlcnZpY2UsXG4gICAgZW50aXRpZXM6IG9wdHMuZW50aXRpZXMubWFwKChlKSA9PiBlLm5hbWUpLFxuICAgIGludGVydmFsSG91cnM6IGludGVydmFsTXMgLyAzXzYwMF8wMDAsXG4gIH0pO1xuXG4gIHJldHVybiBjcmVhdGVTY2hlZHVsZXIoe1xuICAgIG5hbWU6IGBzb2Z0LWRlbGV0ZS1wdXJnZToke29wdHMuc2VydmljZX1gLFxuICAgIGludGVydmFsTXMsXG4gICAgc3RhcnR1cERlbGF5TXMsXG4gICAgcnVuOiBhc3luYyAoKSA9PiB7IGF3YWl0IHJ1blNvZnREZWxldGVQdXJnZShvcHRzLmVudGl0aWVzLCBvcHRzKTsgfSxcbiAgICBsb2NrOiB7IGtleTogYHNvZnQtZGVsZXRlLXB1cmdlOiR7b3B0cy5zZXJ2aWNlfTpsZWFkZXJgLCB0dGxNczogbG9ja1R0bE1zIH0sXG4gIH0pO1xufVxuIl19
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1kZWxldGUtc3dlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFrQixhQUFhLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2SixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQTBCakQ7NkVBQzZFO0FBQzdFLE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsT0FBTyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FDdEMsUUFBMkIsRUFDM0IsSUFBSSxHQUEyQixFQUFFLEVBQ2pDLEdBQTZCO0lBRTdCLE1BQU0sTUFBTSxHQUEyQixFQUFFLENBQUM7SUFDMUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDN0UsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7SUFDbEQsK0VBQStFO0lBQy9FLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSwrREFBK0Q7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RUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXJHLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUU7UUFDbEQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1FBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxQyxhQUFhLEVBQUUsVUFBVSxHQUFHLFNBQVM7S0FDdEMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxlQUFlLENBQUM7UUFDckIsSUFBSSxFQUFFLHFCQUFxQixJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ3pDLFVBQVU7UUFDVixjQUFjO1FBQ2QsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDbEYsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gcHVyZ2UuXG4gKlxuICogRXZlcnkge0BsaW5rIENydWRTZXJ2aWNlfSBlbnRpdHkgc29mdC1kZWxldGVzIChzZXRzIGBkZWxldGVkQXRgICsgYVxuICogYHB1cmdlX2FmdGVyYCBkZWFkbGluZSkuIFRoaXMgb3JjaGVzdHJhdG9yIHJ1bnMgb25lIHB1cmdlIHBhc3MgYWNyb3NzIGEgc2V0XG4gKiBvZiBzdWNoIGVudGl0aWVzLCBoYXJkLWRlbGV0aW5nIHRvbWJzdG9uZXMgd2hvc2UgZGVhZGxpbmUgaGFzIHBhc3NlZC4gSXQgaXNcbiAqIHRoZSBgcnVuYCBjYWxsYmFjayBhIHNlcnZpY2UgaGFuZHMgdG8gYGNyZWF0ZVNjaGVkdWxlcmAgKGxlYWRlci1sb2NrZWQpLCBzb1xuICogb25seSBvbmUgcG9kIHN3ZWVwcyBhdCBhIHRpbWUuXG4gKlxuICogUnVucyBpbiBhbiBleHBsaWNpdCAqKnN5c2FkbWluIHRlbmFudCBzY29wZSoqIChgcnVuV2l0aFRlbmFudENvbnRleHQoe1xuICogaXNTdXBlckFkbWluOiB0cnVlIH0pYCkgc28gdGhlIHVuZGVybHlpbmcgYHB1cmdlRXhwaXJlZGAgc3BhbnMgZXZlcnkgb3JnIGFuZFxuICogYnlwYXNzZXMgUkxTIG9uIEZPUkNFJ2QgdGFibGVzIChwbHVnaW5zL3BpcGVsaW5lcy9ldGMuKS4gQSBiYXJlIG5vLXRlbmFudFxuICogY29udGV4dCB3b3VsZCBzZWUgemVybyByb3dzIG9uIHRob3NlIHRhYmxlcyDigJQgYW5kIGluIHByb2R1Y3Rpb24gKGBzdHJpY3RgXG4gKiBtb2RlKSBgd2l0aFRlbmFudFR4YCB0aHJvd3Mgb3V0cmlnaHQg4oCUIHNvIHRoZSBzY29wZSBpcyBlc3RhYmxpc2hlZCBoZXJlIHJhdGhlclxuICogdGhhbiBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoaXMgaXMgYSBjcm9zcy10ZW5hbnQgaG91c2VrZWVwaW5nIGpvYiwgbm90IGFcbiAqIHBlci1vcmcgb3BlcmF0aW9uLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlU2NoZWR1bGVyLCBlbnZCb29sLCBlbnZJbnQsIHR5cGUgU2NoZWR1bGVyLCBsZWFkZXJMb2NrS2V5LCBERUZBVUxUX0xFQURFUl9MT0NLX1RUTF9NUyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHJ1bldpdGhUZW5hbnRDb250ZXh0IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc29mdC1kZWxldGUtc3dlZXAnKTtcblxuLyoqIFRoZSBzbGljZSBvZiBhIENydWRTZXJ2aWNlIHRoZSBzd2VlcCBuZWVkcywgcGx1cyBhIGxhYmVsIGZvciBsb2dzL21ldHJpY3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1cmdlYWJsZUVudGl0eSB7XG4gIC8qKiBUYWJsZS9lbnRpdHkgbGFiZWwgKGUuZy4gJ3BpcGVsaW5lJykgZm9yIHBlci10YWJsZSBsb2dnaW5nLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBIYXJkLWRlbGV0ZSB1cCB0byBgbGltaXRgIGV4cGlyZWQgdG9tYnN0b25lczsgcmV0dXJucyByb3dzIHB1cmdlZC4gKi9cbiAgcHVyZ2VFeHBpcmVkKG5vdzogRGF0ZSwgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8qKlxuICogVGhlIHNlcnZpY2VzIHRoYXQgcnVuIGEgc29mdC1kZWxldGUgcHVyZ2UuIEEgY2xvc2VkIHVuaW9uLCBub3QgYSBgc3RyaW5nYCxcbiAqIGJlY2F1c2UgdGhlIHZhbHVlIGJlY29tZXMgdGhlIExPQ0sgS0VZOiB0d28gc2VydmljZXMgcGFzc2luZyB0aGUgc2FtZSBzdHJpbmdcbiAqIHdvdWxkIHNpbGVudGx5IHNoYXJlIG9uZSBsb2NrLCBhbmQgd2hpY2hldmVyIGxvc3QgaXQgd291bGQgc2ltcGx5IG5ldmVyIHN3ZWVwIOKAlFxuICogYSB0eXBvIHRoYXQgc3RvcHMgYSBwdXJnZSB3aXRoIG5vIGVycm9yIGFueXdoZXJlLlxuICovXG5leHBvcnQgdHlwZSBTb2Z0RGVsZXRlU3dlZXBTZXJ2aWNlID0gJ3BpcGVsaW5lJyB8ICdwbHVnaW4nIHwgJ21lc3NhZ2UnIHwgJ2NvbXBsaWFuY2UnIHwgJ3BsYXRmb3JtJyB8ICdyZXBvcnRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVQdXJnZU9wdGlvbnMge1xuICAvKiogUm93cyBwZXIgYmF0Y2ggcGVyIHRhYmxlIChkZWZhdWx0IDUwMCkuICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIE1heCBiYXRjaGVzIHBlciB0YWJsZSBwZXIgdGljayAoZGVmYXVsdCAyMCDihpIg4omkIDEway90YWJsZS90aWNrKTsgdGhlIHJlc3RcbiAgICogIGlzIGRlZmVycmVkIHRvIHRoZSBuZXh0IHRpY2sgc28gYSBodWdlIGJhY2tsb2cgY2FuJ3QgYmxvdyB0aGUgbG9jayBUVEwuICovXG4gIG1heEJhdGNoZXNQZXJFbnRpdHk/OiBudW1iZXI7XG59XG5cbi8qKiBLaWxsLXN3aXRjaDogYFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQ9ZmFsc2VgIGRpc2FibGVzIGFsbCBoYXJkLXB1cmdpbmdcbiAqICAodG9tYnN0b25lcyBzdGlsbCBhY2N1bXVsYXRlICsgc3RheSByZXN0b3JhYmxlOyBub3RoaW5nIGlzIGRlc3Ryb3llZCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTb2Z0RGVsZXRlUHVyZ2VFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRCcsIHRydWUpO1xufVxuXG4vKipcbiAqIFJ1biBvbmUgcHVyZ2Ugc3dlZXAgYWNyb3NzIGBlbnRpdGllc2AuIExvb3BzIGVhY2ggZW50aXR5J3MgYHB1cmdlRXhwaXJlZGAgaW5cbiAqIGJhdGNoZXMgdW50aWwgYSBiYXRjaCByZXR1cm5zIGA8IGJhdGNoU2l6ZWAgKGRyYWluZWQpIG9yIHRoZSBwZXItdGljayBjYXAgaXNcbiAqIGhpdCAobG9nZ2VkOyBjb250aW51ZWQgbmV4dCB0aWNrKS4gTmV2ZXIgdGhyb3dzIOKAlCBhIGZhaWxpbmcgZW50aXR5IGlzIGxvZ2dlZFxuICogYW5kIHRoZSBzd2VlcCBtb3ZlcyBvbi4gUmV0dXJucyBwZXItZW50aXR5IHB1cmdlZCBjb3VudHMgKGFsc28gbG9nZ2VkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blNvZnREZWxldGVQdXJnZShcbiAgZW50aXRpZXM6IFB1cmdlYWJsZUVudGl0eVtdLFxuICBvcHRzOiBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zID0ge30sXG4gIHJ1bj86IHsgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gIGNvbnN0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBpZiAoIWlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdTb2Z0LWRlbGV0ZSBwdXJnZSBkaXNhYmxlZCAoU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZSknKTtcbiAgICByZXR1cm4gY291bnRzO1xuICB9XG5cbiAgY29uc3QgYmF0Y2hTaXplID0gb3B0cy5iYXRjaFNpemUgPz8gNTAwO1xuICBjb25zdCBtYXhCYXRjaGVzID0gb3B0cy5tYXhCYXRjaGVzUGVyRW50aXR5ID8/IDIwO1xuICAvLyBPbmUgYG5vd2AgZm9yIHRoZSB3aG9sZSB0aWNrIOKAlCByb3dzIHRoYXQgZXhwaXJlIG1pZC1zd2VlcCB3YWl0IGZvciB0aGUgbmV4dC5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAvLyBFc3RhYmxpc2ggYSBzeXNhZG1pbiBzY29wZSBzbyBldmVyeSBgcHVyZ2VFeHBpcmVkYCAod2hpY2ggcm91dGVzIHRocm91Z2hcbiAgLy8gYHdpdGhUZW5hbnRUeGApIGJ5cGFzc2VzIFJMUyBhbmQgc3BhbnMgYWxsIG9yZ3MuIFdpdGhvdXQgdGhpcywgRk9SQ0UnZFxuICAvLyB0YWJsZXMgcmV0dXJuIHplcm8gcm93cyBhbmQgcHJvZHVjdGlvbiBgc3RyaWN0YCBtb2RlIHRocm93cy5cbiAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgLy8gQmV0d2VlbiBlbnRpdGllczogdGhlIGxlYWRlciBsb2NrIHdhcyBsb3N0IChhbm90aGVyIHBvZCBpcyB0YWtpbmcgb3Zlcikgb3JcbiAgICAgIC8vIHdlIGFyZSBzaHV0dGluZyBkb3duLiBUaGUgcmVtYWluaW5nIGVudGl0aWVzIGFyZSBwaWNrZWQgdXAgbmV4dCB0aWNrIOKAlFxuICAgICAgLy8gdGhlaXIgdG9tYnN0b25lcyBhcmUgc3RpbGwgZXhwaXJlZCDigJQgYW5kIHN0b3BwaW5nIGxldHMgdGhlIGxvY2sgZ28uXG4gICAgICBpZiAocnVuPy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnU29mdC1kZWxldGUgcHVyZ2Ugc3RvcHBpbmcgZWFybHknLCB7IHJlYXNvbjogU3RyaW5nKHJ1bi5zaWduYWwucmVhc29uID8/ICdhYm9ydGVkJyksIGF0RW50aXR5OiBlbnRpdHkubmFtZSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhCYXRjaGVzOyBpKyspIHtcbiAgICAgICAgLy8gQWxzbyBiZXR3ZWVuIEJBVENIRVM6IG9uZSBlbnRpdHkgd2l0aCBhIGxhcmdlIGJhY2tsb2cgY2FuIHJ1biBmb3IgbWFueVxuICAgICAgICAvLyBiYXRjaGVzLCB3aGljaCBpcyBleGFjdGx5IHRoZSBjYXNlIGEgVFRMIHVzZWQgdG8gaGF2ZSB0byBjb3Zlci5cbiAgICAgICAgaWYgKHJ1bj8uc2lnbmFsLmFib3J0ZWQpIGJyZWFrO1xuICAgICAgICBsZXQgcHVyZ2VkOiBudW1iZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHVyZ2VkID0gYXdhaXQgZW50aXR5LnB1cmdlRXhwaXJlZChub3csIGJhdGNoU2l6ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignUHVyZ2UgYmF0Y2ggZmFpbGVkJywgeyBlbnRpdHk6IGVudGl0eS5uYW1lLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWwgKz0gcHVyZ2VkO1xuICAgICAgICBpZiAocHVyZ2VkIDwgYmF0Y2hTaXplKSBicmVhazsgLy8gZHJhaW5lZFxuICAgICAgICBpZiAoaSA9PT0gbWF4QmF0Y2hlcyAtIDEpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignUHVyZ2UgaGl0IHBlci10aWNrIGNhcDsgcmVtYWluaW5nIHRvbWJzdG9uZXMgZGVmZXJyZWQgdG8gbmV4dCB0aWNrJywge1xuICAgICAgICAgICAgZW50aXR5OiBlbnRpdHkubmFtZSwgcHVyZ2VkVGhpc1RpY2s6IHRvdGFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG90YWwgPiAwKSBsb2dnZXIuaW5mbygnUHVyZ2VkIGV4cGlyZWQgc29mdC1kZWxldGVkIHJvd3MnLCB7IGVudGl0eTogZW50aXR5Lm5hbWUsIGNvdW50OiB0b3RhbCB9KTtcbiAgICAgIGNvdW50c1tlbnRpdHkubmFtZV0gPSB0b3RhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRzO1xuICB9KTtcbn1cblxuLy8gLS0gU2NoZWR1bGVyIGZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXJPcHRpb25zIGV4dGVuZHMgU29mdERlbGV0ZVB1cmdlT3B0aW9ucyB7XG4gIC8qKiBTZXJ2aWNlIGxhYmVsIGZvciBsb2dzICsgdGhlIGxlYWRlci1sb2NrIGtleSAoZS5nLiAncGlwZWxpbmUnLCAncGx1Z2luJykuICovXG4gIHNlcnZpY2U6IFNvZnREZWxldGVTd2VlcFNlcnZpY2U7XG4gIC8qKiBFbnRpdGllcyB0byBzd2VlcCDigJQgdXN1YWxseSB0aGUgc2VydmljZSdzIG93biBDcnVkU2VydmljZSBzaW5nbGV0b25zLiAqL1xuICBlbnRpdGllczogUHVyZ2VhYmxlRW50aXR5W107XG59XG5cbi8qKlxuICogQnVpbGQgKGJ1dCBkbyBOT1Qgc3RhcnQpIGEgbGVhZGVyLWxvY2tlZCBzY2hlZHVsZXIgdGhhdCBydW5zIHRoZSBzb2Z0LWRlbGV0ZVxuICogcHVyZ2Ugc3dlZXAgZm9yIGBlbnRpdGllc2Agb24gYSBjYWRlbmNlLiBUaGUgY2FsbGVyIGAuc3RhcnQoKWBzIGl0IGFuZCB3aXJlc1xuICogYHN0b3AoKWAgdG8gU0lHVEVSTS4gUmV0dXJucyBudWxsIHdoZW4gcHVyZ2luZyBpcyBkaXNhYmxlZC5cbiAqXG4gKiBFbnYgY29uZmlnOlxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9FTkFCTEVEICAgICAgICAgICAoZGVmYXVsdCB0cnVlOyBmYWxzZSDih5IgbnVsbCwgbm8gc3dlZXApXG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX0lOVEVSVkFMX0hPVVJTICAgIChkZWZhdWx0IDYpXG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX1NUQVJUVVBfREVMQVlfTVMgIChkZWZhdWx0IDEyMDAwMCDigJQgMiBtaW4gc2V0dGxlKVxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9MT0NLX1RUTF9NUyAgICAgICAoZGVmYXVsdCA5MDAwMDAg4oCUIDE1IG1pbjsgb3V0bGFzdHMgYVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dlZXAsIHN0YXlzIHVuZGVyIHRoZSBpbnRlcnZhbClcbiAqXG4gKiBBIGNyb3NzLXBvZCBsZWFkZXIgbG9jayAod2hlbiBSZWRpcyBpcyBjb25maWd1cmVkKSBtZWFucyBvbmx5IG9uZSByZXBsaWNhXG4gKiBzd2VlcHMgcGVyIHdpbmRvdzsgd2l0aG91dCBSZWRpcyBpdCBydW5zIG9uIGV2ZXJ5IHBvZCDigJQgc3RpbGwgc2FmZSwgc2luY2UgdGhlXG4gKiBwdXJnZSBpcyBhIGJhdGNoZWQgaWRlbXBvdGVudCBERUxFVEUsIGp1c3QgcmVkdW5kYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU29mdERlbGV0ZVB1cmdlU2NoZWR1bGVyKG9wdHM6IFNvZnREZWxldGVQdXJnZVNjaGVkdWxlck9wdGlvbnMpOiBTY2hlZHVsZXIgfCBudWxsIHtcbiAgaWYgKCFpc1NvZnREZWxldGVQdXJnZUVuYWJsZWQoKSkge1xuICAgIGxvZ2dlci5pbmZvKCdTb2Z0LWRlbGV0ZSBwdXJnZSBzY2hlZHVsZXIgZGlzYWJsZWQgKFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQ9ZmFsc2UpJywgeyBzZXJ2aWNlOiBvcHRzLnNlcnZpY2UgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpbnRlcnZhbE1zID0gZW52SW50KCdTT0ZUX0RFTEVURV9QVVJHRV9JTlRFUlZBTF9IT1VSUycsIDYsIHsgbWluOiAxIH0pICogNjAgKiA2MCAqIDEwMDA7XG4gIGNvbnN0IHN0YXJ0dXBEZWxheU1zID0gZW52SW50KCdTT0ZUX0RFTEVURV9QVVJHRV9TVEFSVFVQX0RFTEFZX01TJywgMTIwXzAwMCwgeyBtaW46IDAgfSk7XG4gIGNvbnN0IGxvY2tUdGxNcyA9IGVudkludCgnU09GVF9ERUxFVEVfUFVSR0VfTE9DS19UVExfTVMnLCBERUZBVUxUX0xFQURFUl9MT0NLX1RUTF9NUywgeyBtaW46IDEwMDAgfSk7XG5cbiAgbG9nZ2VyLmluZm8oJ1NvZnQtZGVsZXRlIHB1cmdlIHNjaGVkdWxlciBzdGFydGluZycsIHtcbiAgICBzZXJ2aWNlOiBvcHRzLnNlcnZpY2UsXG4gICAgZW50aXRpZXM6IG9wdHMuZW50aXRpZXMubWFwKChlKSA9PiBlLm5hbWUpLFxuICAgIGludGVydmFsSG91cnM6IGludGVydmFsTXMgLyAzXzYwMF8wMDAsXG4gIH0pO1xuXG4gIHJldHVybiBjcmVhdGVTY2hlZHVsZXIoe1xuICAgIG5hbWU6IGBzb2Z0LWRlbGV0ZS1wdXJnZToke29wdHMuc2VydmljZX1gLFxuICAgIGludGVydmFsTXMsXG4gICAgc3RhcnR1cERlbGF5TXMsXG4gICAgcnVuOiBhc3luYyAocnVuKSA9PiB7IGF3YWl0IHJ1blNvZnREZWxldGVQdXJnZShvcHRzLmVudGl0aWVzLCBvcHRzLCBydW4pOyB9LFxuICAgIGxvY2s6IHsga2V5OiBsZWFkZXJMb2NrS2V5KG9wdHMuc2VydmljZSwgJ3NvZnQtZGVsZXRlLXB1cmdlJyksIHR0bE1zOiBsb2NrVHRsTXMgfSxcbiAgfSk7XG59XG4iXX0=
|