@pipeline-builder/pipeline-data 4.1.4 → 4.1.5
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.
|
@@ -93,7 +93,7 @@ export declare abstract class CrudService<TEntity extends BaseEntity, TFilter, T
|
|
|
93
93
|
* be the tenant `orgId` column, not a display/name column.
|
|
94
94
|
*/
|
|
95
95
|
protected abstract getOrgColumn(): AnyColumn;
|
|
96
|
-
/**
|
|
96
|
+
/** The unique-constraint columns a create must not conflict on (see {@link create}). */
|
|
97
97
|
protected abstract get conflictTarget(): AnyColumn[];
|
|
98
98
|
private readonly _logger;
|
|
99
99
|
constructor();
|
|
@@ -256,21 +256,6 @@ export declare abstract class CrudService<TEntity extends BaseEntity, TFilter, T
|
|
|
256
256
|
* Update multiple entities matching filter
|
|
257
257
|
*/
|
|
258
258
|
updateMany(filter: Partial<TFilter>, data: Partial<TUpdate>, orgId: string, userId: string): Promise<TEntity[]>;
|
|
259
|
-
/**
|
|
260
|
-
* Create multiple entities in a single batch insert.
|
|
261
|
-
* Uses upsert (onConflictDoUpdate) — all rows are inserted in one query per chunk.
|
|
262
|
-
* Chunks of 100 to stay within PostgreSQL parameter limits.
|
|
263
|
-
*/
|
|
264
|
-
/**
|
|
265
|
-
* Build the `onConflictDoUpdate` SET for a bulk upsert. Unlike a single-row
|
|
266
|
-
* create (which can spread the one row's data), a batched insert has many rows,
|
|
267
|
-
* so each updatable column is written from `excluded.*` (the would-be-inserted
|
|
268
|
-
* value) — otherwise an existing row's fields are silently discarded and only
|
|
269
|
-
* timestamps bump. Skips identity/immutable (`id`, `createdAt`, `createdBy`)
|
|
270
|
-
* and the conflict-target columns; `updatedAt`/`updatedBy` get the fresh values.
|
|
271
|
-
*/
|
|
272
|
-
private buildBulkUpsertSet;
|
|
273
|
-
bulkCreate(items: TInsert[], userId: string): Promise<TEntity[]>;
|
|
274
259
|
/**
|
|
275
260
|
* The `visibility` predicate for a bulk soft-delete, mirroring
|
|
276
261
|
* `requireVisibilityWriteAccess` rung for rung so bulk and single-row delete
|
package/lib/api/crud-service.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { NotFoundError, createLogger, DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '@pipeline-builder/api-core';
|
|
3
|
+
import { ConflictError, NotFoundError, createLogger, DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '@pipeline-builder/api-core';
|
|
4
4
|
import { SQL, eq, and, or, asc, desc, sql, inArray, getTableColumns } from 'drizzle-orm';
|
|
5
5
|
import { withTenantTx, runWithTenantContext, getTenantContext } from '../database/tenancy.js';
|
|
6
6
|
/**
|
|
@@ -42,6 +42,31 @@ function decodeCursor(cursor) {
|
|
|
42
42
|
}
|
|
43
43
|
return null;
|
|
44
44
|
}
|
|
45
|
+
const UUID_TEXT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
46
|
+
/** Postgres `timestamp[tz]::text` / `date::text` (also accepts ISO-8601). */
|
|
47
|
+
const TIMESTAMP_TEXT = /^\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,6})?)?(?:Z|[+-]\d{2}(?::?\d{2})?)?)?$/;
|
|
48
|
+
const NUMERIC_TEXT = /^-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?$/;
|
|
49
|
+
/**
|
|
50
|
+
* Whether `text` can be cast to `column`'s type. A decoded cursor is still
|
|
51
|
+
* client input: a value Postgres can't cast (a non-UUID id, a garbage
|
|
52
|
+
* timestamp) fails the whole query with a 500. Column types this doesn't know
|
|
53
|
+
* (text, varchar, …) accept any string.
|
|
54
|
+
*/
|
|
55
|
+
function isCastableTo(column, text) {
|
|
56
|
+
const { columnType, dataType } = column;
|
|
57
|
+
const enumValues = column.enumValues;
|
|
58
|
+
if (columnType === 'PgUUID')
|
|
59
|
+
return UUID_TEXT.test(text);
|
|
60
|
+
if ((columnType === 'PgEnumColumn' || columnType === 'PgEnumObjectColumn') && enumValues?.length)
|
|
61
|
+
return enumValues.includes(text);
|
|
62
|
+
if (dataType === 'date' || columnType === 'PgTimestampString' || columnType === 'PgDateString')
|
|
63
|
+
return TIMESTAMP_TEXT.test(text);
|
|
64
|
+
if (dataType === 'boolean')
|
|
65
|
+
return text === 'true' || text === 'false';
|
|
66
|
+
if (dataType === 'number' || dataType === 'bigint')
|
|
67
|
+
return NUMERIC_TEXT.test(text);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
45
70
|
/**
|
|
46
71
|
* Keyset predicate "strictly after (sortText, id)" for `ORDER BY sort <dir>, id <dir>`
|
|
47
72
|
* under Postgres' default null placement (ASC → NULLS LAST, DESC → NULLS FIRST).
|
|
@@ -240,8 +265,16 @@ export class CrudService {
|
|
|
240
265
|
const direction = sortOrder === 'desc' ? desc : asc;
|
|
241
266
|
const orderBy = sortColumn === idColumn ? [direction(idColumn)] : [direction(sortColumn), direction(idColumn)];
|
|
242
267
|
// Cursor and offset are mutually exclusive — a valid cursor takes precedence.
|
|
243
|
-
// A malformed/tampered cursor
|
|
244
|
-
|
|
268
|
+
// A malformed/tampered cursor — including well-formed JSON whose values
|
|
269
|
+
// can't be cast to the id / sort column types — is ignored (reads from the
|
|
270
|
+
// start) instead of reaching Postgres and failing the query.
|
|
271
|
+
const rawCursor = cursor ? decodeCursor(cursor) : null;
|
|
272
|
+
const decodedCursor = rawCursor
|
|
273
|
+
&& isCastableTo(idColumn, rawCursor.id)
|
|
274
|
+
// (an id-only order never binds the sort value — see keysetAfter)
|
|
275
|
+
&& (sortColumn === idColumn || rawCursor.sortText === null || isCastableTo(sortColumn, rawCursor.sortText))
|
|
276
|
+
? rawCursor
|
|
277
|
+
: null;
|
|
245
278
|
if (cursor && !decodedCursor) {
|
|
246
279
|
this._logger.warn('Ignoring malformed pagination cursor', { entity: this.constructor.name });
|
|
247
280
|
}
|
|
@@ -412,6 +445,10 @@ export class CrudService {
|
|
|
412
445
|
*/
|
|
413
446
|
async create(data, userId) {
|
|
414
447
|
const safeData = this.enforceOrgId(data, /* isCreate */ true);
|
|
448
|
+
// Create never overwrites. The conflict key can match a LIVE row (another
|
|
449
|
+
// author's, or one the caller couldn't edit through update) or a soft-deleted
|
|
450
|
+
// TOMBSTONE; replacing either would bypass update's access checks or restore's
|
|
451
|
+
// step-up. On any conflict nothing is written and the caller gets a 409.
|
|
415
452
|
const [created] = await withTenantTx(async (tx) => tx
|
|
416
453
|
.insert(this.schema)
|
|
417
454
|
.values({
|
|
@@ -419,23 +456,11 @@ export class CrudService {
|
|
|
419
456
|
createdBy: userId || 'system',
|
|
420
457
|
updatedBy: userId || 'system',
|
|
421
458
|
})
|
|
422
|
-
.
|
|
423
|
-
target: this.conflictTarget,
|
|
424
|
-
set: {
|
|
425
|
-
...safeData,
|
|
426
|
-
// RESURRECT on re-create: `delete` soft-deletes (isActive=false + deletedAt/
|
|
427
|
-
// deletedBy set), but the unique constraint keeps the tombstoned row, so a
|
|
428
|
-
// re-create with the same conflict key lands here. Without resetting these,
|
|
429
|
-
// the row's body updates but it stays soft-deleted and never reappears
|
|
430
|
-
// (reads default to isActive=true). Matches the pipeline/plugin overrides.
|
|
431
|
-
isActive: true,
|
|
432
|
-
deletedAt: null,
|
|
433
|
-
deletedBy: null,
|
|
434
|
-
updatedAt: new Date(),
|
|
435
|
-
updatedBy: userId || 'system',
|
|
436
|
-
},
|
|
437
|
-
})
|
|
459
|
+
.onConflictDoNothing({ target: this.conflictTarget })
|
|
438
460
|
.returning().then(r => drizzleRows(r)));
|
|
461
|
+
if (!created) {
|
|
462
|
+
throw new ConflictError('A record with the same identity already exists. If it was deleted, restore it instead.');
|
|
463
|
+
}
|
|
439
464
|
// Awaited intentionally: cache invalidation happens in the hook, and a
|
|
440
465
|
// fire-and-forget pattern lets a subsequent read inside the same request
|
|
441
466
|
// return the stale pre-write entry. The hook is expected to be fast
|
|
@@ -589,78 +614,6 @@ export class CrudService {
|
|
|
589
614
|
.where(and(...conditions))
|
|
590
615
|
.returning().then(r => drizzleRows(r)));
|
|
591
616
|
}
|
|
592
|
-
/**
|
|
593
|
-
* Create multiple entities in a single batch insert.
|
|
594
|
-
* Uses upsert (onConflictDoUpdate) — all rows are inserted in one query per chunk.
|
|
595
|
-
* Chunks of 100 to stay within PostgreSQL parameter limits.
|
|
596
|
-
*/
|
|
597
|
-
/**
|
|
598
|
-
* Build the `onConflictDoUpdate` SET for a bulk upsert. Unlike a single-row
|
|
599
|
-
* create (which can spread the one row's data), a batched insert has many rows,
|
|
600
|
-
* so each updatable column is written from `excluded.*` (the would-be-inserted
|
|
601
|
-
* value) — otherwise an existing row's fields are silently discarded and only
|
|
602
|
-
* timestamps bump. Skips identity/immutable (`id`, `createdAt`, `createdBy`)
|
|
603
|
-
* and the conflict-target columns; `updatedAt`/`updatedBy` get the fresh values.
|
|
604
|
-
*/
|
|
605
|
-
buildBulkUpsertSet(now, user) {
|
|
606
|
-
const conflictNames = new Set(this.conflictTarget.map((c) => c.name));
|
|
607
|
-
const set = {};
|
|
608
|
-
for (const [key, col] of Object.entries(getTableColumns(this.schema))) {
|
|
609
|
-
const name = col.name;
|
|
610
|
-
if (key === 'id' || key === 'createdAt' || key === 'createdBy' || conflictNames.has(name))
|
|
611
|
-
continue;
|
|
612
|
-
if (key === 'updatedAt') {
|
|
613
|
-
set[key] = now;
|
|
614
|
-
continue;
|
|
615
|
-
}
|
|
616
|
-
if (key === 'updatedBy') {
|
|
617
|
-
set[key] = user;
|
|
618
|
-
continue;
|
|
619
|
-
}
|
|
620
|
-
set[key] = sql `excluded.${sql.identifier(name)}`;
|
|
621
|
-
}
|
|
622
|
-
// RESURRECT on bulk re-create (matches the single-row create): reset the
|
|
623
|
-
// soft-delete columns explicitly rather than rely on `excluded.*` + column
|
|
624
|
-
// defaults, so a re-created same-key row is always reactivated, not left
|
|
625
|
-
// tombstoned. All CrudService entities carry these (delete() sets all three).
|
|
626
|
-
set.isActive = true;
|
|
627
|
-
set.deletedAt = null;
|
|
628
|
-
set.deletedBy = null;
|
|
629
|
-
return set;
|
|
630
|
-
}
|
|
631
|
-
async bulkCreate(items, userId) {
|
|
632
|
-
if (items.length === 0)
|
|
633
|
-
return [];
|
|
634
|
-
const CHUNK_SIZE = 100;
|
|
635
|
-
const now = new Date();
|
|
636
|
-
const user = userId || 'system';
|
|
637
|
-
const conflictSet = this.buildBulkUpsertSet(now, user);
|
|
638
|
-
const results = await withTenantTx(async (tx) => {
|
|
639
|
-
const allCreated = [];
|
|
640
|
-
for (let i = 0; i < items.length; i += CHUNK_SIZE) {
|
|
641
|
-
const chunk = items.slice(i, i + CHUNK_SIZE);
|
|
642
|
-
const values = chunk.map(data => ({
|
|
643
|
-
...this.enforceOrgId(data),
|
|
644
|
-
createdBy: user,
|
|
645
|
-
updatedBy: user,
|
|
646
|
-
}));
|
|
647
|
-
const created = await tx
|
|
648
|
-
.insert(this.schema)
|
|
649
|
-
.values(values)
|
|
650
|
-
.onConflictDoUpdate({
|
|
651
|
-
target: this.conflictTarget,
|
|
652
|
-
set: conflictSet,
|
|
653
|
-
})
|
|
654
|
-
.returning().then(r => drizzleRows(r));
|
|
655
|
-
allCreated.push(...created);
|
|
656
|
-
}
|
|
657
|
-
return allCreated;
|
|
658
|
-
});
|
|
659
|
-
// Run hooks in parallel but await all before returning so a subsequent
|
|
660
|
-
// read in the same request sees a coherent post-write view.
|
|
661
|
-
await Promise.all(results.map(entity => this.onAfterCreate(entity, userId).catch(err => this._logger.warn('Lifecycle hook failed', { error: String(err) }))));
|
|
662
|
-
return results;
|
|
663
|
-
}
|
|
664
617
|
/**
|
|
665
618
|
* The `visibility` predicate for a bulk soft-delete, mirroring
|
|
666
619
|
* `requireVisibilityWriteAccess` rung for rung so bulk and single-row delete
|
|
@@ -917,4 +870,4 @@ export class CrudService {
|
|
|
917
870
|
return purgedId;
|
|
918
871
|
}
|
|
919
872
|
}
|
|
920
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzlGOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxJQUFhO0lBQzFDLE9BQU8sSUFBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFhO0lBQ3hDLE9BQU8sSUFBMkIsQ0FBQztBQUNyQyxDQUFDO0FBeUdELHFGQUFxRjtBQUNyRixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUUxQzs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLFFBQXVCLEVBQUUsRUFBVTtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNuRixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLFNBQVMsWUFBWSxDQUFDLE1BQWM7SUFDbEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMs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QU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yLCBjcmVhdGVMb2dnZXIsIERFRkFVTFRfUEFHRV9MSU1JVCwgTUFYX1BBR0VfTElNSVQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBTUUwsIGVxLCBhbmQsIG9yLCBhc2MsIGRlc2MsIHNxbCwgaW5BcnJheSwgZ2V0VGFibGVDb2x1bW5zIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHR5cGUgeyBBbnlDb2x1bW4gfSBmcm9tICdkcml6emxlLW9ybS9jb2x1bW4nO1xuaW1wb3J0IHR5cGUgeyBQZ1RhYmxlIH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHgsIHJ1bldpdGhUZW5hbnRDb250ZXh0LCBnZXRUZW5hbnRDb250ZXh0IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cblxuLyoqXG4gKiBDYXN0IERyaXp6bGUgcXVlcnkgcmVzdWx0cyB0byBhIHR5cGVkIGFycmF5LlxuICogRHJpenpsZSdzIGdlbmVyaWMgcmV0dXJuIHR5cGUgKGBQZ1NlbGVjdEJhc2U8Li4uPmApIGRvZXNuJ3QgbmFycm93IHRvIG91clxuICogZW50aXR5IGdlbmVyaWNzLCBzbyBhbiBleHBsaWNpdCBjYXN0IGlzIG5lZWRlZC4gQ2VudHJhbGlzZWQgaGVyZSBzbyBldmVyeVxuICogY2FsbC1zaXRlIHN0YXlzIG9uZS1saW5lciBjbGVhbiBhbmQgdGhlIGNhc3QgaXMgZG9jdW1lbnRlZCBpbiBvbmUgcGxhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlUm93czxUPihyb3dzOiB1bmtub3duKTogVFtdIHtcbiAgcmV0dXJuIHJvd3MgYXMgVFtdO1xufVxuXG4vKiogQ2FzdCBhIERyaXp6bGUgYWdncmVnYXRlIHJlc3VsdCB0byBleHRyYWN0IGBbeyBjb3VudDogbnVtYmVyIH1dYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlQ291bnQocm93czogdW5rbm93bik6IFt7IGNvdW50OiBudW1iZXIgfV0ge1xuICByZXR1cm4gcm93cyBhcyBbeyBjb3VudDogbnVtYmVyIH1dO1xufVxuXG4vKiogVGhlIERyaXp6bGUgdHJhbnNhY3Rpb24gb2JqZWN0IGhhbmRlZCB0byBgd2l0aFRlbmFudFR4YCBjYWxsYmFja3MuIFBhc3NlZCB0b1xuICogIGBvbkJlZm9yZVB1cmdlYCBzbyBhIHN1YmNsYXNzJ3MgZGVwZW5kZW50IHRlYXJkb3duIHJ1bnMgaW4gdGhlIFNBTUUgcHVyZ2VcbiAqICB0cmFuc2FjdGlvbiAoYXRvbWljIHdpdGggdGhlIHBhcmVudCBERUxFVEUpLCBub3QgYSBmcmVzaCBjb25uZWN0aW9uLiAqL1xuZXhwb3J0IHR5cGUgQ3J1ZFR4ID0gUGFyYW1ldGVyczxQYXJhbWV0ZXJzPHR5cGVvZiB3aXRoVGVuYW50VHg+WzBdPlswXTtcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgZW50aXRpZXMgd2l0aCBjb21tb24gZmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICB1cGRhdGVkQXQ6IERhdGU7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICB1cGRhdGVkQnk6IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBQYWdpbmF0aW9uIGFuZCBzb3J0aW5nIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeU9wdGlvbnMge1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzb3J0Qnk/OiBzdHJpbmc7XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICAvKiogV2hlbiB0cnVlLCBydW5zIGEgc2VwYXJhdGUgQ09VTlQoKikgcXVlcnkgdG8gaW5jbHVkZSBleGFjdCB0b3RhbC4gRGVmYXVsdDogZmFsc2UuICovXG4gIGluY2x1ZGVUb3RhbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBLZXlzZXQgcGFnaW5hdGlvbjogdGhlIG9wYXF1ZSBgbmV4dEN1cnNvcmAgb2YgdGhlIHByZXZpb3VzIHBhZ2UuIENvbnRpbnVlc1xuICAgKiBzdHJpY3RseSBhZnRlciB0aGF0IHJvdyBpbiAoc29ydEJ5LCBpZCkgb3JkZXI7IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgb2Zmc2V0YC5cbiAgICovXG4gIGN1cnNvcj86IHN0cmluZztcbiAgLyoqIFNwYXJzZSBmaWVsZHNldDogY29sdW1uIG5hbWVzIHRvIHNlbGVjdC4gUmV0dXJucyBhbGwgY29sdW1ucyB3aGVuIG9taXR0ZWQuICovXG4gIGZpZWxkcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhZ2luYXRlZCByZXN1bHQgd2l0aCBtZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFJlc3VsdDxUPiB7XG4gIGRhdGE6IFRbXTtcbiAgLyoqIFRvdGFsIGNvdW50IG9mIG1hdGNoaW5nIGVudGl0aWVzLiBPbmx5IHByZXNlbnQgd2hlbiBpbmNsdWRlVG90YWwgaXMgdHJ1ZS4gKi9cbiAgdG90YWw/OiBudW1iZXI7XG4gIGxpbWl0OiBudW1iZXI7XG4gIG9mZnNldDogbnVtYmVyO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICAvKiogT3BhcXVlIGN1cnNvciBmb3IgdGhlIG5leHQgcGFnZS4gUHJlc2VudCBvbmx5IHdoZW4gYGhhc01vcmVgLiAqL1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IENSVUQgc2VydmljZSB3aXRoIG11bHRpLXRlbmFudCBhY2Nlc3MgY29udHJvbCBhbmQgcGFnaW5hdGlvbi5cbiAqXG4gKiBTdWJjbGFzc2VzIGJpbmQgdG8gYSBzcGVjaWZpYyBEcml6emxlIHRhYmxlIGJ5IGltcGxlbWVudGluZyBgc2NoZW1hYCxcbiAqIGBidWlsZENvbmRpdGlvbnNgLCBgZ2V0U29ydENvbHVtbmAsIGFuZCB0aGUgb3JnL3Byb2plY3QtY29sdW1uIGFjY2Vzc29ycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRFbnRpdHkgLSBFbnRpdHkgdHlwZSBleHRlbmRpbmcgQmFzZUVudGl0eVxuICogQHR5cGVQYXJhbSBURmlsdGVyIC0gRmlsdGVyIHR5cGUgZm9yIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqIEB0eXBlUGFyYW0gVEluc2VydCAtIEluc2VydCBEVE8gdHlwZVxuICogQHR5cGVQYXJhbSBUVXBkYXRlIC0gVXBkYXRlIERUTyB0eXBlXG4gKlxuICogKipBIG5vdGUgb24gdGhlIHR5cGUgY2FzdHMuKiogRHJpenpsZSdzIHJvdyB0eXBlcyBhcmUgaW5mZXJyZWQgZnJvbVxuICogYHBnVGFibGUoLi4uKWAgYW5kIGRvbid0IGdlbmVyaWNhbGx5IG5hcnJvdyB0aHJvdWdoIHRoZSBhYnN0cmFjdCBgc2NoZW1hYFxuICogZ2V0dGVyLCBzbyB0aGUgYmFzZSBjbGFzcyBjYXN0cyBxdWVyeSByZXN1bHRzIHRvIGBURW50aXR5YCBhbmQgYmFjay4gVGhlXG4gKiBjYXN0IGlzICpub3QqIGEgcnVudGltZSBzYWZldHkgZ3VhcmFudGVlIOKAlCBpdCByZWxpZXMgb24gZWFjaCBzdWJjbGFzc1xuICogcGFzc2luZyB0aGUgbWF0Y2hpbmcgZW50aXR5IHR5cGUuIE9yZy1zY29waW5nIGlzIGVuZm9yY2VkIGJ5IGV2ZXJ5XG4gKiBzdWJjbGFzcydzIGBidWlsZENvbmRpdGlvbnNgIGluamVjdGluZyBgV0hFUkUgb3JnX2lkID0gJDFgOyB0aGlzIGNsYXNzXG4gKiBkb2VzIG5vdCBhZGQgdGhhdCBmaWx0ZXIgaXRzZWxmLlxuICpcbiAqICoqRXJyb3IgcG9saWN5LioqIEVycm9ycyBwcm9wYWdhdGUgdXAgdG8gdGhlIHJvdXRlLWxldmVsIGhhbmRsZXJcbiAqIChgd2l0aFJvdXRlYCk7IG5vIGNhdGNoLWFuZC1zd2FsbG93IGhlcmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFBpcGVsaW5lU2VydmljZSBleHRlbmRzIENydWRTZXJ2aWNlPFBpcGVsaW5lLCBQaXBlbGluZUZpbHRlciwgUGlwZWxpbmVJbnNlcnQsIFBpcGVsaW5lVXBkYXRlPiB7XG4gKiAgIHByb3RlY3RlZCBnZXQgc2NoZW1hKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lOyB9XG4gKiAgIHByb3RlY3RlZCBidWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCkgeyByZXR1cm4gYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCk7IH1cbiAqICAgcHJvdGVjdGVkIGdldFNvcnRDb2x1bW4oc29ydEJ5KSB7IHJldHVybiBzb3J0Q29sdW1uTWFwW3NvcnRCeV0gPz8gbnVsbDsgfVxuICogICBwcm90ZWN0ZWQgZ2V0UHJvamVjdENvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5wcm9qZWN0OyB9XG4gKiAgIHByb3RlY3RlZCBnZXRPcmdDb2x1bW4oKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmUub3JnSWQ7IH1cbiAqIH1cbiAqIGBgYFxuICovXG4vKiogU3RydWN0dXJhbCB2aWV3IG9mIHRoZSBzdWJjbGFzcyB0YWJsZSdzIGNvbHVtbnMgdGhlIGJhc2UgY2xhc3MgdG91Y2hlc1xuICogIGRpcmVjdGx5LiBgaWRgL2Bpc0FjdGl2ZWAvYGlzRGVmYXVsdGAgYXJlIGFsd2F5cyBwcmVzZW50IG9uIGEgQ1JVRCBlbnRpdHk7XG4gKiAgYHZpc2liaWxpdHlgIG9ubHkgb24gdmlzaWJpbGl0eS1iZWFyaW5nIGVudGl0aWVzOyB0aGUgaW5kZXggc2lnbmF0dXJlXG4gKiAgY292ZXJzIGR5bmFtaWMgKHNwYXJzZS1maWVsZHNldCkgY29sdW1uIGFjY2Vzcy4gKi9cbmludGVyZmFjZSBDcnVkQ29sdW1ucyB7XG4gIGlkOiBBbnlDb2x1bW47XG4gIGlzQWN0aXZlOiBBbnlDb2x1bW47XG4gIGlzRGVmYXVsdDogQW55Q29sdW1uO1xuICB2aXNpYmlsaXR5PzogQW55Q29sdW1uO1xuICAvKiogQXV0aG9yIGNvbHVtbiDigJQgdGhlIGBwcml2YXRlYCBydW5nIG9mIHRoZSB2aXNpYmlsaXR5IGxhZGRlciBpcyBhdXRob3Itb25seS4gKi9cbiAgY3JlYXRlZEJ5PzogQW55Q29sdW1uO1xuICAvLyBTb2Z0LWRlbGV0ZSBsaWZlY3ljbGUgY29sdW1ucyAocHJlc2VudCBvbiB0b21ic3RvbmUtYmVhcmluZyBlbnRpdGllcyBvbmx5O1xuICAvLyBgcmVzdG9yZWAvYHB1cmdlRXhwaXJlZGAgYXJlIG5vLW9wcyB3aGVuIGFic2VudCkuXG4gIGRlbGV0ZWRBdD86IEFueUNvbHVtbjtcbiAgcHVyZ2VBZnRlcj86IEFueUNvbHVtbjtcbiAgW2tleTogc3RyaW5nXTogQW55Q29sdW1uIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogUHJvamVjdGlvbiBhbGlhcyBjYXJyeWluZyB0aGUgc29ydCBjb2x1bW4ncyBleGFjdCBEQiB0ZXh0IGZvciB0aGUgbmV4dCBjdXJzb3IuICovXG5jb25zdCBDVVJTT1JfU09SVF9LRVkgPSAnX19jdXJzb3JTb3J0S2V5JztcblxuLyoqXG4gKiBPcGFxdWUga2V5c2V0IGN1cnNvcjogdGhlIGxhc3Qgcm93J3Mgc29ydCB2YWx1ZSBhcyBQb3N0Z3JlcyBURVhUIChmdWxsXG4gKiBwcmVjaXNpb24g4oCUIGEgSlMgYERhdGVgIHdvdWxkIHRydW5jYXRlIGB0aW1lc3RhbXB0emAgbWljcm9zZWNvbmRzIHRvIG1zLCBzb1xuICogYGNyZWF0ZWRfYXQgPiAnPG1zPidgIHJlLXJldHVybnMgb3Igc2tpcHMgcm93cyBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCkgcGx1c1xuICogaXRzIGBpZGAgYXMgdGhlIHRpZS1icmVha2VyLlxuICovXG5mdW5jdGlvbiBlbmNvZGVDdXJzb3Ioc29ydFRleHQ6IHN0cmluZyB8IG51bGwsIGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoW3NvcnRUZXh0LCBpZF0pLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjR1cmwnKTtcbn1cblxuLyoqIERlY29kZSBhIGN1cnNvciBwcm9kdWNlZCBieSB7QGxpbmsgZW5jb2RlQ3Vyc29yfTsgYG51bGxgIHdoZW4gbWFsZm9ybWVkLiAqL1xuZnVuY3Rpb24gZGVjb2RlQ3Vyc29yKGN1cnNvcjogc3RyaW5nKTogeyBzb3J0VGV4dDogc3RyaW5nIHwgbnVsbDsgaWQ6IHN0cmluZyB9IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShjdXJzb3IsICdiYXNlNjR1cmwnKS50b1N0cmluZygndXRmOCcpKTtcbiAgICBpZiAoXG4gICAgICBBcnJheS5pc0FycmF5KHBhcnNlZCkgJiYgcGFyc2VkLmxlbmd0aCA9PT0gMlxuICAgICAgJiYgKHBhcnNlZFswXSA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyc2VkWzBdID09PSAnc3RyaW5nJylcbiAgICAgICYmIHR5cGVvZiBwYXJzZWRbMV0gPT09ICdzdHJpbmcnICYmIHBhcnNlZFsxXS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICByZXR1cm4geyBzb3J0VGV4dDogcGFyc2VkWzBdLCBpZDogcGFyc2VkWzFdIH07XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLZXlzZXQgcHJlZGljYXRlIFwic3RyaWN0bHkgYWZ0ZXIgKHNvcnRUZXh0LCBpZClcIiBmb3IgYE9SREVSIEJZIHNvcnQgPGRpcj4sIGlkIDxkaXI+YFxuICogdW5kZXIgUG9zdGdyZXMnIGRlZmF1bHQgbnVsbCBwbGFjZW1lbnQgKEFTQyDihpIgTlVMTFMgTEFTVCwgREVTQyDihpIgTlVMTFMgRklSU1QpLlxuICogVGhlIHRleHQgdmFsdWUgaXMgYm91bmQgYXMgYSBwYXJhbWV0ZXIgY29tcGFyZWQgYWdhaW5zdCB0aGUgY29sdW1uLCBzbyBQb3N0Z3Jlc1xuICogY2FzdHMgaXQgYmFjayB0byB0aGUgY29sdW1uJ3MgdHlwZSBhdCBmdWxsIHByZWNpc2lvbi5cbiAqL1xuZnVuY3Rpb24ga2V5c2V0QWZ0ZXIoXG4gIHNvcnRDb2x1bW46IEFueUNvbHVtbixcbiAgaWRDb2x1bW46IEFueUNvbHVtbixcbiAgc29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJyxcbiAgc29ydFRleHQ6IHN0cmluZyB8IG51bGwsXG4gIGlkOiBzdHJpbmcsXG4pOiBTUUwge1xuICBpZiAoc29ydENvbHVtbiA9PT0gaWRDb2x1bW4pIHtcbiAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYycgPyBzcWxgJHtpZENvbHVtbn0gPCAke2lkfWAgOiBzcWxgJHtpZENvbHVtbn0gPiAke2lkfWA7XG4gIH1cbiAgaWYgKHNvcnRPcmRlciA9PT0gJ2FzYycpIHtcbiAgICByZXR1cm4gc29ydFRleHQgPT09IG51bGxcbiAgICAgID8gc3FsYCgke3NvcnRDb2x1bW59IElTIE5VTEwgQU5EICR7aWRDb2x1bW59ID4gJHtpZH0pYFxuICAgICAgOiBzcWxgKCR7c29ydENvbHVtbn0gPiAke3NvcnRUZXh0fSBPUiAoJHtzb3J0Q29sdW1ufSA9ICR7c29ydFRleHR9IEFORCAke2lkQ29sdW1ufSA+ICR7aWR9KSBPUiAke3NvcnRDb2x1bW59IElTIE5VTEwpYDtcbiAgfVxuICByZXR1cm4gc29ydFRleHQgPT09IG51bGxcbiAgICA/IHNxbGAoJHtzb3J0Q29sdW1ufSBJUyBOT1QgTlVMTCBPUiAoJHtzb3J0Q29sdW1ufSBJUyBOVUxMIEFORCAke2lkQ29sdW1ufSA8ICR7aWR9KSlgXG4gICAgOiBzcWxgKCR7c29ydENvbHVtbn0gPCAke3NvcnRUZXh0fSBPUiAoJHtzb3J0Q29sdW1ufSA9ICR7c29ydFRleHR9IEFORCAke2lkQ29sdW1ufSA8ICR7aWR9KSlgO1xufVxuXG4vKipcbiAqIFJldGVudGlvbiBiZWZvcmUgYSBzb2Z0LWRlbGV0ZWQgcm93IGJlY29tZXMgcHVyZ2UtZWxpZ2libGUsIHNoYXJlZCBhY3Jvc3NcbiAqIGV2ZXJ5IENydWRTZXJ2aWNlIGVudGl0eSAodW5pZmllZCBgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLCBkZWZhdWx0IDMwZCkuXG4gKiBTdGFtcGVkIGludG8gYHB1cmdlX2FmdGVyYCBhdCBkZWxldGUgdGltZTsgdGhlIHBlci1zZXJ2aWNlIHB1cmdlIHN3ZWVwIGhhcmQtXG4gKiBkZWxldGVzIHRvbWJzdG9uZXMgb25jZSBpdCBoYXMgcGFzc2VkLiBgMGAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcuXG4gKi9cbmNvbnN0IFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUyA9IE1hdGgubWF4KDAsIE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5TT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZUyA/PyAnMzAnLCAxMCkgfHwgMCkgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogVGhlIHNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gd2luZG93IGluIG1zIChgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLFxuICogIGRlZmF1bHQgMzBkOyAwIGRpc2FibGVzIHB1cmdlLWRlYWRsaW5lIHN0YW1waW5nKS4gRXhwb3NlZCBzbyBub24tQ3J1ZFNlcnZpY2VcbiAqICBzb2Z0LWRlbGV0ZSBwYXRocyAoZS5nLiBwbGF0Zm9ybSdzIGhhbmQtcm9sbGVkIGRhc2hib2FyZC9hbGVydCBzZXJ2aWNlcylcbiAqICBzdGFtcCBgcHVyZ2VfYWZ0ZXJgIHdpdGggdGhlIFNBTUUgd2luZG93IHRoZSBDcnVkU2VydmljZSBlbnRpdGllcyB1c2UuICovXG5leHBvcnQgZnVuY3Rpb24gc29mdERlbGV0ZVJldGVudGlvbk1zKCk6IG51bWJlciB7XG4gIHJldHVybiBTT0ZUX0RFTEVURV9SRVRFTlRJT05fTVM7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcnVkU2VydmljZTxcbiAgVEVudGl0eSBleHRlbmRzIEJhc2VFbnRpdHksXG4gIFRGaWx0ZXIsXG4gIFRJbnNlcnQsXG4gIFRVcGRhdGUsXG4+IHtcbiAgLyoqIERyaXp6bGUgc2NoZW1hIHRhYmxlIGZvciB0aGlzIGVudGl0eSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHNjaGVtYSgpOiBQZ1RhYmxlO1xuXG4gIC8qKlxuICAgKiBUeXBlZCBjb2x1bW4gdmlldyBvZiB7QGxpbmsgc2NoZW1hfS4gYFBnVGFibGVgIGV4cG9zZXMgbm8gc3RhdGljIGNvbHVtbnMsIHNvXG4gICAqIHRoZSBiYXNlIGNsYXNzIHByZXZpb3VzbHkgcmVhY2hlZCBmb3IgYCh0aGlzLnNjaGVtYSBhcyBhbnkpLmlkYCBldGMuIGF0IGVhY2hcbiAgICogdXNlOyBjZW50cmFsaXplIHRoYXQgc2luZ2xlIHVuYXZvaWRhYmxlIGNhc3QgaGVyZSBzbyBjYWxsZXJzIGdldCBzdHJ1Y3R1cmVkLFxuICAgKiB0eXBlZCBhY2Nlc3MgaW5zdGVhZC4gYHZpc2liaWxpdHlgIGlzIG9wdGlvbmFsIChub3QgZXZlcnkgZW50aXR5IGhhcyBpdClcbiAgICogYW5kIHRoZSBpbmRleCBzaWduYXR1cmUgY292ZXJzIGR5bmFtaWMgc3BhcnNlLWZpZWxkc2V0IGNvbHVtbiBsb29rdXAuXG4gICAqL1xuICBwcml2YXRlIGdldCBjb2xzKCk6IENydWRDb2x1bW5zIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEgYXMgdW5rbm93biBhcyBDcnVkQ29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgZmlsdGVyaW5nIGVudGl0aWVzLlxuICAgKiBgcGFyZW50T3JnSWRgIChvcmcg4oaSIHRlYW0gaGllcmFyY2h5KSBpcyBvcHRpb25hbCBhbmQgb25seSBob25vcmVkIGJ5XG4gICAqIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gcGFyZW50LWluaGVyaXRlZCB2aXNpYmlsaXR5IChlLmcuIHBsdWdpbnMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdO1xuXG4gIC8qKiBHZXQgdGhlIHNjaGVtYSBjb2x1bW4gZm9yIHNvcnRpbmcgYnkgZmllbGQgbmFtZSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U29ydENvbHVtbihzb3J0Qnk6IHN0cmluZyk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqIEdldCB0aGUgcHJvamVjdCBjb2x1bW4gZm9yIHNldERlZmF1bHQgc2NvcGluZyAobnVsbCBpZiBlbnRpdHkgaGFzIG5vIHByb2plY3Qgc2NvcGUpICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9qZWN0Q29sdW1uKCk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGVuYW50IG9yZy1pZCBjb2x1bW4uIFVzZWQgYm90aCB0byBzY29wZSBgc2V0RGVmYXVsdGAgYW5kIHRvIHBpblxuICAgKiBldmVyeSB3cml0ZSAodXBkYXRlL2RlbGV0ZS9idWxrRGVsZXRlKSB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyDigJQgc28gaXQgTVVTVFxuICAgKiBiZSB0aGUgdGVuYW50IGBvcmdJZGAgY29sdW1uLCBub3QgYSBkaXNwbGF5L25hbWUgY29sdW1uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE9yZ0NvbHVtbigpOiBBbnlDb2x1bW47XG5cbiAgLyoqIEdldCB0aGUgdW5pcXVlIGNvbnN0cmFpbnQgY29sdW1ucyBmb3Igb25Db25mbGljdERvVXBkYXRlICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgY29uZmxpY3RUYXJnZXQoKTogQW55Q29sdW1uW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdjcnVkLXNlcnZpY2UnKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBGYWlsIGZhc3QgaWYgYSBzdWJjbGFzcyBkb2Vzbid0IGV4cG9zZSBhIHRlbmFudCBvcmcgY29sdW1uLiBUaGUgd3JpdGVcbiAgICAvLyBwYXRocyAod3JpdGVDb25kaXRpb25zIC8gYnVsa0RlbGV0ZSkgcGluIG11dGF0aW9ucyB0byB0aGUgY2FsbGVyJ3Mgb3duXG4gICAgLy8gb3JnIHRocm91Z2ggaXQ7IGEgbWlzc2luZyBjb2x1bW4gd291bGQgc2lsZW50bHkgZHJvcCB0aGF0IGd1YXJkIOKAlCBhXG4gICAgLy8gY3Jvc3MtdGVuYW50IGZhaWwtb3BlbiDigJQgc28gYXNzZXJ0IGl0cyBwcmVzZW5jZSB1cCBmcm9udC5cbiAgICBpZiAodGhpcy5nZXRPcmdDb2x1bW4oKSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogZ2V0T3JnQ29sdW1uKCkgbXVzdCByZXR1cm4gdGhlIHRlbmFudCBvcmcgY29sdW1uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGNvbmRpdGlvbnMgZm9yIGEgc2luZ2xlIGVudGl0eSBieSBJRC5cbiAgICogIGBwYXJlbnRPcmdJZGAgd2lkZW5zIHZpc2liaWxpdHkgdG8gYSBwYXJlbnQgb3JnJ3MgcHVibGljIHJvd3MgKG9yZyDihpIgdGVhbVxuICAgKiAgaGllcmFyY2h5KSDigJQgc2FtZSBvcHQtaW4gc2VtYW50aWNzIGFzIGBmaW5kYC9gZmluZFBhZ2luYXRlZGAuIE9taXR0ZWQgYnkgdGhlXG4gICAqICB3cml0ZSBwYXRoIChgd3JpdGVDb25kaXRpb25zYCksIHdoaWNoIG11c3Qgc3RheSBvd24tb3JnIHNjb3BlZC4gKi9cbiAgcHJpdmF0ZSBpZENvbmRpdGlvbnMoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29uZGl0aW9ucyh7IGlkIH0gYXMgdW5rbm93biBhcyBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmRpdGlvbnMgZm9yIGEgTVVUQVRJT04gKHVwZGF0ZS9kZWxldGUpIG9mIGEgc2luZ2xlIGVudGl0eS5cbiAgICpcbiAgICogYGlkQ29uZGl0aW9uc2AgcmV1c2VzIHRoZSBSRUFEIGFjY2Vzcy1jb250cm9sIGNsYXVzZSwgd2hpY2ggYWxzbyBtYXRjaGVzXG4gICAqIHN5c3RlbS1vcmcgLyBvdGhlci1vcmcgUFVCTElDIHJlY29yZHMg4oCUIHNvIHdpdGhvdXQgYW4gZXh0cmEgb3duZXJzaGlwIHBpbiBhbnlcbiAgICogdGVuYW50IGNvdWxkIHVwZGF0ZSBvciBzb2Z0LWRlbGV0ZSBhbm90aGVyIG9yZydzIChvciB0aGUgc3lzdGVtIG9yZydzKSBwdWJsaWNcbiAgICogcmVjb3Jkcy4gQU5EIGEgc3RyaWN0IGBvcmdJZCA9PT0gY2FsbGVyYCBwcmVkaWNhdGU6IHRoZSByZWFkIGNsYXVzZSdzXG4gICAqIHB1YmxpYy1PUiBicmFuY2ggcmVxdWlyZXMgYG9yZ19pZCA9ICdzeXN0ZW0nYCwgd2hpY2ggdGhlbiBjYW4ndCBiZSBzYXRpc2ZpZWQsXG4gICAqIGxlYXZpbmcgb25seSBvd24tb3JnIHJvd3MuIG9yZ0lkLWxlc3MgKHN5c2FkbWluKSBjb250ZXh0IGtlZXBzIGZ1bGwgYWNjZXNzLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZUNvbmRpdGlvbnMoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuaWRDb25kaXRpb25zKGlkLCBvcmdJZCk7XG4gICAgLy8gUGluIHRoZSBtdXRhdGlvbiB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyB2aWEgdGhlIHRlbmFudCBjb2x1bW5cbiAgICAvLyAoZ2V0T3JnQ29sdW1uLCBhc3NlcnRlZCBub24tbnVsbCBpbiB0aGUgY29uc3RydWN0b3IpIOKAlCBjb25zaXN0ZW50IHdpdGhcbiAgICAvLyBzZXREZWZhdWx0IGFuZCB3aXRob3V0IHRoZSBvbGQgc2lsZW50IGZhaWwtb3BlbiB3aGVuIHRoZSBwcm9wZXJ0eSB3YXMgYWJzZW50LlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG4gICAgLy8gRm9yY2UgRVhBQ1QgaWQgZXF1YWxpdHkgb24gdGhlIG11dGF0aW9uIHBhdGguIGBpZENvbmRpdGlvbnNgIHJldXNlcyB0aGVcbiAgICAvLyBsaXN0LWZpbHRlciBjbGF1c2UsIHdob3NlIGBidWlsZElkRmlsdGVyYCBQUkVGSVgtbWF0Y2hlcyAoYGlkOjp0ZXh0IExJS0VcbiAgICAvLyAndmFsJSdgKSBhbnkgbm9uLWZ1bGwtVVVJRCB2YWx1ZSDigJQgc28gYSBwYXJ0aWFsIGlkIChgREVMRVRFIC94L2FiYCkgd291bGRcbiAgICAvLyBzb2Z0LWRlbGV0ZS9tdXRhdGUgRVZFUlkgb3duLW9yZyByb3cgd2hvc2UgaWQgc3RhcnRzIHdpdGggYGFiYCBhbmQgcmVwb3J0XG4gICAgLy8gdG91Y2hpbmcgb25lLiBBTkRpbmcgYW4gZXhhY3QgYGlkID0gdmFsYCBjb2xsYXBzZXMgdGhlIHByZWZpeCBjbGF1c2UgdG8gYXRcbiAgICAvLyBtb3N0IHRoZSBzaW5nbGUgZXhhY3Qgcm93OyBhIG1hbGZvcm1lZC9wYXJ0aWFsIGlkIHRoZW4gbWF0Y2hlcyBub3RoaW5nXG4gICAgLy8gKOKGkiA0MDQgdmlhIHRoZSBjYWxsZXJzJyBgaWYgKCFkZWxldGVkKWAgZ3VhcmQpIGluc3RlYWQgb2YgbWFzcy1tdXRhdGluZy5cbiAgICBjb25kaXRpb25zLnB1c2godGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSk7XG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cblxuICAvKiogRXhhY3QgaWQgZXF1YWxpdHksIGxvd2VyLWNhc2VkIHRvIG1hdGNoIGBidWlsZElkRmlsdGVyYCdzIGZ1bGwtVVVJRCBicmFuY2guXG4gICAqICBgc2NoZW1hYCBpcyB0eXBlZCBgUGdUYWJsZWAgKG5vIHN0YXRpYyBgLmlkYCksIHNvIGNhc3Qg4oCUIHNhbWUgcGF0dGVybiB0aGVcbiAgICogIHNvcnQvZGVmYXVsdCBoZWxwZXJzIHVzZSBmb3IgY29sdW1uIGFjY2Vzcy4gKi9cbiAgcHJpdmF0ZSBleGFjdElkQ29uZGl0aW9uKGlkOiBzdHJpbmcpOiBTUUwge1xuICAgIHJldHVybiBlcSh0aGlzLmNvbHMuaWQsIFN0cmluZyhpZCkudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvLyBMaWZlY3ljbGUgaG9va3Mg4oCUIG92ZXJyaWRlIGluIHN1YmNsYXNzZXMgdG8gcmVhY3QgdG8gbXV0YXRpb25zXG4gIC8vIFRoZXNlIGFyZSBmaXJlLWFuZC1mb3JnZXQ6IGVycm9ycyBhcmUgbG9nZ2VkIGJ1dCBuZXZlciBibG9jayB0aGUgY2FsbGVyLlxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYW4gZW50aXR5IGlzIHVwZGF0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJVcGRhdGUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGFuIGVudGl0eSBpcyBzb2Z0LWRlbGV0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJEZWxldGUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGEgc29mdC1kZWxldGVkIGVudGl0eSBpcyByZXN0b3JlZCAodW5kbyB0aGUgZGVsZXRlKS4gT3ZlcnJpZGVcbiAgICogIGZvciBlbnRpdGllcyB3aG9zZSByZXN0b3JlIGhhcyBzaWRlLWVmZmVjdHMgKGUuZy4gcmUtbm90aWZ5KS4gQmVzdC1lZmZvcnQuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyUmVzdG9yZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgd2l0aCB0aGUgaWRzIGFib3V0IHRvIGJlIGhhcmQtcHVyZ2VkLCBCRUZPUkUgdGhlIGRlbGV0ZSwgaW5zaWRlIHRoZVxuICAgKiAgcHVyZ2UgdHJhbnNhY3Rpb24gKGB0eGApIOKAlCBhIHN1YmNsYXNzIHRlYXJpbmcgZG93biBkZXBlbmRlbnRzIHRoYXQgbGFjayBPTlxuICAgKiAgREVMRVRFIENBU0NBREUgTVVTVCB1c2UgYHR4YCBzbyB0aGUgdGVhcmRvd24gaXMgYXRvbWljIHdpdGggdGhlIHBhcmVudFxuICAgKiAgREVMRVRFIChhbmQgY2FuJ3Qgc2VsZi1kZWFkbG9jayBhZ2FpbnN0IGl0cyByb3cgbG9ja3MpLiBUaHJvd2luZyBhYm9ydHMgdGhhdFxuICAgKiAgYmF0Y2gncyBwdXJnZSAocm93cyBzdGF5IHRvbWJzdG9uZWQsIHJldHJpZWQgbmV4dCB0aWNrKS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQmVmb3JlUHVyZ2UoX2lkczogc3RyaW5nW10sIF90eDogQ3J1ZFR4KTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgcm93cyBhcmUgaGFyZC1wdXJnZWQsIGZvciBleHRlcm5hbCBzaWRlLWVmZmVjdHMgKGUuZy4gcGx1Z2luXG4gICAqICBpbWFnZSBHQykuIEJlc3QtZWZmb3J0OiBlcnJvcnMgYXJlIGxvZ2dlZCwgbmV2ZXIgYmxvY2sgdGhlIHN3ZWVwLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclB1cmdlKF9pZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBSZXRlbnRpb24gYmVmb3JlIGEgc29mdC1kZWxldGVkIHJvdyBiZWNvbWVzIHB1cmdlLWVsaWdpYmxlLiBEZWZhdWx0cyB0byB0aGVcbiAgICogIHNoYXJlZCBgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgOyBvdmVycmlkZSBwZXIgZW50aXR5IGZvciBhIGJlc3Bva2Ugd2luZG93LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNvZnREZWxldGVSZXRlbnRpb25NcygpOiBudW1iZXIge1xuICAgIHJldHVybiBTT0ZUX0RFTEVURV9SRVRFTlRJT05fTVM7XG4gIH1cblxuICAvKiogVGhlIGBwdXJnZV9hZnRlcmAgdmFsdWUgdG8gc3RhbXAgb24gYSBzb2Z0LWRlbGV0ZTogYG5vdyArIHJldGVudGlvbmAsIG9yIHRoZVxuICAgKiAgc3ByZWFkLWZyaWVuZGx5IGVtcHR5IG9iamVjdCB3aGVuIHRoZSBlbnRpdHkgaGFzIG5vIGBwdXJnZV9hZnRlcmAgY29sdW1uLlxuICAgKiAgYHByb3RlY3RlZGAgc28gc3ViY2xhc3NlcyB3aXRoIGhhbmQtcm9sbGVkIHNvZnQtZGVsZXRlIHBhdGhzIChlLmcuXG4gICAqICBtZXNzYWdlLXNlcnZpY2UncyB0aHJlYWQgY2FzY2FkZSAvIHN5c2FkbWluIG1vZGVyYXRpb24pIHN0YW1wIGl0IHRvbyDigJQgYW5cbiAgICogIHVuLXN0YW1wZWQgdG9tYnN0b25lIGhhcyBOVUxMIGBwdXJnZV9hZnRlcmAgYW5kIGlzIG5ldmVyIGhhcmQtcHVyZ2VkLiAqL1xuICBwcm90ZWN0ZWQgcHVyZ2VBZnRlclN0YW1wKG5vdzogRGF0ZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuY29scy5wdXJnZUFmdGVyIHx8IHRoaXMuc29mdERlbGV0ZVJldGVudGlvbk1zIDw9IDApIHJldHVybiB7fTtcbiAgICByZXR1cm4geyBwdXJnZUFmdGVyOiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgdGhpcy5zb2Z0RGVsZXRlUmV0ZW50aW9uTXMpIH07XG4gIH1cblxuICAvKipcbiAgICogT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2hlbiBhIHJlYWQgaXMgd2lkZW5lZCB0byBhIHBhcmVudCBvcmcgKGBwYXJlbnRPcmdJZGBcbiAgICogc2V0KSwgdGhlIHBhcmVudCdzIHJvd3MgYXJlIG91dHNpZGUgdGhlIGNhbGxlcidzIFJMUyBzY29wZSwgc28gdGhlIHJlYWQgbXVzdFxuICAgKiBydW4gdW5kZXIgc3lzYWRtaW4gY29udGV4dCDigJQgdGhlIGFjY2Vzcy1jb250cm9sIFdIRVJFIGNsYXVzZSAob3duICsgcGFyZW50ICtcbiAgICogc3lzdGVtIHB1YmxpYywgYnVpbHQgc2VydmVyLXNpZGUgZnJvbSBhIHRydXN0ZWQgSldUIGNsYWltKSBpcyB0aGVuIHRoZVxuICAgKiBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS4gV2l0aG91dCBgcGFyZW50T3JnSWRgIGl0IHN0YXlzIFJMUy1zY29wZWQuXG4gICAqXG4gICAqIElOVkFSSUFOVCAod2h5IHRoZSBzeXNhZG1pbiBieXBhc3MgaXMgc2FmZSk6IHRoZSBXSEVSRSBjbGF1c2UgaXMgYWx3YXlzXG4gICAqIHNlcnZlci1idWlsdCBieSBgYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKWAgZnJvbSB2YWx1ZXNcbiAgICogZGVyaXZlZCBmcm9tIHRoZSB2YWxpZGF0ZWQgSldUIChgb3JnSWRgID0gYWN0aXZlIG9yZywgYHBhcmVudE9yZ0lkYCA9IHRoZVxuICAgKiBhY3RpdmUgb3JnJ3MgcGFyZW50KS4gTm9uZSBvZiB0aGVtIGlzIGEgcmF3IHVzZXItc3VwcGxpZWQgcHJlZGljYXRlLCBzbyB0aGVcbiAgICogYnlwYXNzIG9ubHkgZXZlciB3aWRlbnMgdGhlIHJlYWQgdG8gdGhlIGNhbGxlcidzIG93biBzdWJ0cmVlICsgc3lzdGVtIHB1YmxpY1xuICAgKiByb3dzIOKAlCBpdCBjYW4gTk9UIGJlIHN0ZWVyZWQgYXQgYW4gYXJiaXRyYXJ5IG9yZy4gTk9URTogdGhpcyBkb2VzIHJlbW92ZSB0aGVcbiAgICogUkxTIGJhY2tzdG9wIGZvciB0aGUgd2lkZW5lZCByZWFkOyBhIHNpbmdsZS1HVUMgYGFwcC5vcmdfaWRgIGNhbid0IGV4cHJlc3NcbiAgICogdGhlIFwib3duIE9SIHBhcmVudCBPUiBzeXN0ZW1cIiBzZXQgdGhlIHBvbGljeSB3b3VsZCBuZWVkLCBzbyByZXBsYWNpbmcgdGhlXG4gICAqIGJ5cGFzcyB3b3VsZCByZXF1aXJlIGEgdGVuYW5jeS1sYXllciBjaGFuZ2UgKGUuZy4gYSBtdWx0aS1vcmcgUkxTIHBvbGljeSkuXG4gICAqIERlZmVycmVkIGRlbGliZXJhdGVseSDigJQgZG8gbm90IHN3YXAgdGhpcyBmb3IgYSBibGFua2V0IGJ5cGFzcyB3aXRob3V0XG4gICAqIHJlLWNoZWNraW5nIHRoZSBXSEVSRSBpcyBzdGlsbCBmdWxseSBzZXJ2ZXItYnVpbHQuXG4gICAqL1xuICBwcml2YXRlIHJ1blJlYWQ8VD4ocGFyZW50T3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gcGFyZW50T3JnSWQgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBmbikgOiBmbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKi9cbiAgYXN5bmMgZmluZChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIHJldHVybiB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIEZJUlNUIGVudGl0eSBtYXRjaGluZyBgZmlsdGVyYCDigJQgYSBib3VuZGVkIChgTElNSVQgMWApIHZhcmlhbnQgb2ZcbiAgICogYGZpbmRgIGZvciB0aGUgXCJtYXRjaCBieSBmaWx0ZXIsIHRha2Ugb25lXCIgcmVhZCBwYXRocyAoZS5nLiBgR0VUIC9maW5kYCksIHNvXG4gICAqIHRoZXkgZG9uJ3QgYFNFTEVDVGAgZXZlcnkgbWF0Y2hpbmcgb3JnIHJvdyBqdXN0IHRvIHJldHVybiBgWzBdYC5cbiAgICovXG4gIGFzeW5jIGZpbmRGaXJzdChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRpdGllcyB3aXRoIHBhZ2luYXRpb24gYW5kIHNvcnRpbmdcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUGFnaW5hdGlvbiBhbmQgc29ydGluZyBvcHRpb25zXG4gICAqL1xuICBhc3luYyBmaW5kUGFnaW5hdGVkKFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBvcmdJZD86IHN0cmluZyxcbiAgICBvcHRpb25zOiBRdWVyeU9wdGlvbnMgPSB7fSxcbiAgICBwYXJlbnRPcmdJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4+IHtcbiAgICBjb25zdCB7IGxpbWl0OiByYXdMaW1pdCA9IERFRkFVTFRfUEFHRV9MSU1JVCwgb2Zmc2V0ID0gMCwgc29ydEJ5LCBzb3J0T3JkZXIgPSAnYXNjJywgaW5jbHVkZVRvdGFsID0gZmFsc2UsIGN1cnNvciwgZmllbGRzIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgcmF3TGltaXQpLCBNQVhfUEFHRV9MSU1JVCk7XG5cbiAgICAvLyBUb3RhbCwgZGV0ZXJtaW5pc3RpYyBvcmRlcjogKHNvcnQgY29sdW1uLCBpZCkuIGBpZGAgaXMgdW5pcXVlLCBzbyByb3dzIHRoYXRcbiAgICAvLyBzaGFyZSBhIHNvcnQgdmFsdWUgaGF2ZSBhIHN0YWJsZSByZWxhdGl2ZSBvcmRlciBhbmQgYSBrZXlzZXQgY3Vyc29yIGNhblxuICAgIC8vIG5ldmVyIHNraXAgb3IgcmVwZWF0IHRoZW0uIEFuIGFic2VudCBvciBVTktOT1dOIGBzb3J0QnlgIG9yZGVycyBieSBgaWRgXG4gICAgLy8gYWxvbmUg4oCUIGFuIHVua25vd24gc29ydCB1c2VkIHRvIGFkZCBubyBXSEVSRSBhbmQgbm8gT1JERVIgQlkgd2hpbGUgc3RpbGxcbiAgICAvLyBlbWl0dGluZyBhIGN1cnNvciwgc28gYSBjdXJzb3IgY2xpZW50IGxvb3BlZCBvbiBwYWdlIDEgZm9yZXZlci5cbiAgICBjb25zdCBpZENvbHVtbiA9IHRoaXMuY29scy5pZDtcbiAgICBjb25zdCBzb3J0Q29sdW1uID0gKHNvcnRCeSA/IHRoaXMuZ2V0U29ydENvbHVtbihzb3J0QnkpIDogbnVsbCkgPz8gaWRDb2x1bW47XG4gICAgY29uc3QgZGlyZWN0aW9uID0gc29ydE9yZGVyID09PSAnZGVzYycgPyBkZXNjIDogYXNjO1xuICAgIGNvbnN0IG9yZGVyQnkgPSBzb3J0Q29sdW1uID09PSBpZENvbHVtbiA/IFtkaXJlY3Rpb24oaWRDb2x1bW4pXSA6IFtkaXJlY3Rpb24oc29ydENvbHVtbiksIGRpcmVjdGlvbihpZENvbHVtbildO1xuXG4gICAgLy8gQ3Vyc29yIGFuZCBvZmZzZXQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSDigJQgYSB2YWxpZCBjdXJzb3IgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBBIG1hbGZvcm1lZC90YW1wZXJlZCBjdXJzb3IgaXMgaWdub3JlZCAocmVhZHMgZnJvbSB0aGUgc3RhcnQpLlxuICAgIGNvbnN0IGRlY29kZWRDdXJzb3IgPSBjdXJzb3IgPyBkZWNvZGVDdXJzb3IoY3Vyc29yKSA6IG51bGw7XG4gICAgaWYgKGN1cnNvciAmJiAhZGVjb2RlZEN1cnNvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0lnbm9yaW5nIG1hbGZvcm1lZCBwYWdpbmF0aW9uIGN1cnNvcicsIHsgZW50aXR5OiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICBpZiAoZGVjb2RlZEN1cnNvcikge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGtleXNldEFmdGVyKHNvcnRDb2x1bW4sIGlkQ29sdW1uLCBzb3J0T3JkZXIsIGRlY29kZWRDdXJzb3Iuc29ydFRleHQsIGRlY29kZWRDdXJzb3IuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBXcmFwIHRoZSB3aG9sZSBwYWdpbmF0ZWQgcmVhZCAoU0VMRUNUICsgb3B0aW9uYWwgQ09VTlQpIGluIG9uZVxuICAgIC8vIHRlbmFudCB0eC4gQm90aCBxdWVyaWVzIGFyZSB2aXNpYmlsaXR5LXNjb3BlZCBieSB0aGUgc2FtZSBSTFMgcG9saWN5LFxuICAgIC8vIGFuZCBwaW5uaW5nIHRoZW0gdG8gYSBzaW5nbGUgdHgga2VlcHMgdGhlIGBhcHAub3JnX2lkYCBHVUMgc3RhYmxlXG4gICAgLy8gYmV0d2VlbiB0aGVtLiBXaGVuIHdpZGVuaW5nIHRvIGEgcGFyZW50IG9yZywgdGhlIHdob2xlIHJlYWQgcnVucyB1bmRlclxuICAgIC8vIHN5c2FkbWluIGNvbnRleHQgKHNlZSBydW5SZWFkKSBzbyB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgaXMgdGhlIGdhdGUuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gUHJvamVjdGlvbjogdGhlIHNwYXJzZSBmaWVsZHNldCAoYWx3YXlzIGluY2x1ZGVzIGBpZGApIG9yIGV2ZXJ5IGNvbHVtbixcbiAgICAgIC8vIHBsdXMgdGhlIHNvcnQgY29sdW1uJ3MgZXhhY3QgdGV4dCBmb3IgdGhlIG5leHQgY3Vyc29yLlxuICAgICAgY29uc3QgYmFzZVNlbGVjdCA9IChmaWVsZHMgPyB0aGlzLmJ1aWxkRmllbGRTZWxlY3QoZmllbGRzKSA6IHVuZGVmaW5lZCkgPz8gZ2V0VGFibGVDb2x1bW5zKHRoaXMuc2NoZW1hKTtcbiAgICAgIGNvbnN0IHNlbGVjdFNwZWMgPSB7IC4uLmJhc2VTZWxlY3QsIFtDVVJTT1JfU09SVF9LRVldOiBzcWw8c3RyaW5nIHwgbnVsbD5gJHtzb3J0Q29sdW1ufTo6dGV4dGAgfTtcblxuICAgICAgLy8gRmV0Y2ggbGltaXQrMSB0byBkZXRlY3QgaGFzTW9yZSB3aXRob3V0IENPVU5UKCopXG4gICAgICBjb25zdCBlZmZlY3RpdmVPZmZzZXQgPSBkZWNvZGVkQ3Vyc29yID8gMCA6IG9mZnNldDtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0eC5zZWxlY3Qoc2VsZWN0U3BlYyBhcyBhbnkpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgICAgLm9yZGVyQnkoLi4ub3JkZXJCeSlcbiAgICAgICAgLmxpbWl0KGxpbWl0ICsgMSlcbiAgICAgICAgLm9mZnNldChlZmZlY3RpdmVPZmZzZXQpLnRoZW4ociA9PiBkcml6emxlUm93czxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ocikpO1xuXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdDtcbiAgICAgIGNvbnN0IHBhZ2UgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuICAgICAgY29uc3QgZGF0YSA9IHBhZ2UubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0geyAuLi5yb3cgfTtcbiAgICAgICAgZGVsZXRlIGVudGl0eVtDVVJTT1JfU09SVF9LRVldO1xuICAgICAgICByZXR1cm4gZW50aXR5IGFzIFRFbnRpdHk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4gPSB7IGRhdGEsIGxpbWl0LCBvZmZzZXQ6IGVmZmVjdGl2ZU9mZnNldCwgaGFzTW9yZSB9O1xuXG4gICAgICBpZiAoaGFzTW9yZSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gcGFnZVtwYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBzb3J0VGV4dCA9IGxhc3RbQ1VSU09SX1NPUlRfS0VZXTtcbiAgICAgICAgcmVzdWx0Lm5leHRDdXJzb3IgPSBlbmNvZGVDdXJzb3Ioc29ydFRleHQgPT0gbnVsbCA/IG51bGwgOiBTdHJpbmcoc29ydFRleHQpLCBTdHJpbmcobGFzdC5pZCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHJ1biB0aGUgQ09VTlQoKikgcXVlcnkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgbmVlZHMgdGhlIHRvdGFsLlxuICAgICAgLy8gTXVzdCBpbmNsdWRlIHBhcmVudE9yZ0lkIHNvIGB0b3RhbGAgbWF0Y2hlcyB0aGUgd2lkZW5lZCBkYXRhIHNldC5cbiAgICAgIGlmIChpbmNsdWRlVG90YWwpIHtcbiAgICAgICAgY29uc3QgYmFzZUNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgICAgIGNvbnN0IFtjb3VudFJlc3VsdF0gPSBhd2FpdCB0eFxuICAgICAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAud2hlcmUoYW5kKC4uLmJhc2VDb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSk7XG4gICAgICAgIHJlc3VsdC50b3RhbCA9IGNvdW50UmVzdWx0Py5jb3VudCB8fCAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbHVtbiBzZWxlY3Rpb24gbWFwIGZvciBzcGFyc2UgZmllbGRzZXRzLlxuICAgKiBGYWxscyBiYWNrIHRvIGZ1bGwgc2VsZWN0IGlmIG5vIGZpZWxkcyBhcmUgcmVxdWVzdGVkLlxuICAgKlxuICAgKiBgaWRgIGlzIGFsd2F5cyBpbmNsdWRlZCDigJQgaXQgaXMgdGhlIGVudGl0eSBpZGVudGl0eSBBTkQgdGhlIGtleXNldCBjdXJzb3Inc1xuICAgKiB0aWUtYnJlYWtlci4gVGhlIHNvcnQgdmFsdWUgZm9yIHRoZSBjdXJzb3IgaXMgcHJvamVjdGVkIHNlcGFyYXRlbHkgKGFzIHRleHQpXG4gICAqIGJ5IGBmaW5kUGFnaW5hdGVkYCwgc28gdGhlIGZpZWxkc2V0IG5lZWQgbm90IGNhcnJ5IHRoZSBzb3J0IGNvbHVtbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGaWVsZFNlbGVjdChmaWVsZHM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29sdW1uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAvLyBBbHdheXMgaW5jbHVkZSBpZCBmb3IgZW50aXR5IGlkZW50aXR5XG4gICAgY29sdW1ucy5pZCA9IHRoaXMuY29scy5pZDtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQgPT09ICdpZCcpIGNvbnRpbnVlOyAvLyBBbHJlYWR5IGluY2x1ZGVkXG4gICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHNbZmllbGRdO1xuICAgICAgaWYgKGNvbCkgY29sdW1uc1tmaWVsZF0gPSBjb2w7XG4gICAgfVxuXG4gICAgLy8gQXQgbWluaW11bSB3ZSdsbCBoYXZlIHsgaWQgfSwgd2hpY2ggaXMgdmFsaWRcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdpZGVuIHRoZSBjb3VudCB0byB0aGUgcGFyZW50IG9yZydzXG4gICAqICAgcHVibGljIHJvd3MuIE1VU1QgbWlycm9yIGBmaW5kYC9gZmluZFBhZ2luYXRlZGAncyB3aWRlbmluZyAoc2FtZVxuICAgKiAgIGBidWlsZENvbmRpdGlvbnNgIGFyZ3MgKyBzeXNhZG1pbi1zY29wZWQgcmVhZCB2aWEgYHJ1blJlYWRgKSBzbyBhIHBhZ2VkXG4gICAqICAgbGlzdCdzIGB0b3RhbGAgbWF0Y2hlcyB0aGUgcm93cyBhIHdpZGVuZWQgYGZpbmQoKWAgcmV0dXJucyDigJQgb3RoZXJ3aXNlIHRoZVxuICAgKiAgIGNvdW50IG9taXRzIHRoZSBwYXJlbnQncyByb3dzIGFuZCByZXBvcnRzIGEgbmFycm93ZXIgdG90YWwgdGhhbiB0aGUgZGF0YSBzZXQuXG4gICAqL1xuICBhc3luYyBjb3VudChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdD8uY291bnQgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgc2luZ2xlIGVudGl0eSBieSBJRFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBFbnRpdHkgSURcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB2aXNpYmlsaXR5IHRvIHRoZSBwYXJlbnRcbiAgICogICBvcmcncyBwdWJsaWMgcm93cyAoc28gYSB0ZWFtIGNhbiBmZXRjaCBhIHBhcmVudCdzIHB1YmxpYyBlbnRpdHkgYnkgaWQpLlxuICAgKiAgIFNhbWUgb3B0LWluICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYDsgdGhlXG4gICAqICAgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIGlzIHRoZSBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS5cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgLy8gRXhhY3QgaWQg4oCUIGBmaW5kQnlJZGAgbWVhbnMgVEhFIHJvdyB3aXRoIHRoaXMgaWQsIG5vdCBhIHByZWZpeCBtYXRjaC4gVGhlXG4gICAgLy8gc2hhcmVkIGBidWlsZElkRmlsdGVyYCBwcmVmaXgtbWF0Y2hlcyBub24tZnVsbC1VVUlEIHZhbHVlcyAoYSBsaXN0LXNlYXJjaFxuICAgIC8vIGZlYXR1cmUpLCB3aGljaCBoZXJlIHdvdWxkIHJldHVybiBhbiBhcmJpdHJhcnkgZmlyc3QgcHJlZml4IGhpdCBmb3IgYVxuICAgIC8vIHBhcnRpYWwgaWQ7IHBpbiBpdCB0byBleGFjdCBzbyBhIG1hbGZvcm1lZCBpZCByZXR1cm5zIG51bGwuXG4gICAgY29uZGl0aW9ucy5wdXNoKHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvLyBNdXRhdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIERlZmVuc2UtaW4tZGVwdGggdGVuYW50IHN0YW1wLiBSTFMgaXMgaW4gb3duZXItYnlwYXNzIG1vZGUsIHNvIHRoZSBhcHAgbGF5ZXJcbiAgICogaXMgdGhlIG9ubHkgdGVuYW50IGdhdGUgb24gd3JpdGVzLiBBIE5PTi1zeXNhZG1pbiBjYWxsZXIgbWF5IG9ubHkgd3JpdGUgaW50b1xuICAgKiBpdHMgT1dOIG9yZywgc28gcGluIHRoZSByb3cgdG8gdGhlIHRydXN0ZWQgdGVuYW50LWNvbnRleHQgb3JnLlxuICAgKlxuICAgKiBUaGUgc3RhbXAgZmlyZXMgd2hlbmV2ZXIgdGhlIHBheWxvYWQncyBgb3JnSWRgIGRpZmZlcnMgZnJvbSB0aGUgY29udGV4dCBvcmcg4oCUXG4gICAqIHdoaWNoIGNvdmVycyBCT1RIIGEgZm9yZ2VkL21pc21hdGNoZWQgYGRhdGEub3JnSWRgIEFORCBhbiBBQlNFTlQgb25lLiBUaGVcbiAgICogYWJzZW50IGNhc2UgaXMgdGhlIGltcG9ydGFudCB0ZW5hbnQtYm91bmRhcnkgZml4OiB0aGUgYG9yZ19pZGAgY29sdW1uIERFRkFVTFRzXG4gICAqIHRvIGBTWVNURU1fT1JHX0lEYCAoc2NoZW1hL3BpcGVsaW5lLnRzLCBzY2hlbWEvcGx1Z2luLnRzKSwgc28gYW4gaW5zZXJ0IHRoYXRcbiAgICogb21pdHMgYG9yZ0lkYCB3b3VsZCBvdGhlcndpc2UgbGFuZCB0aGUgdGVuYW50J3Mgcm93IGluIHRoZSBwdWJsaWMgc3lzdGVtXG4gICAqIGNhdGFsb2cg4oCUIGEgY3Jvc3MtdGVuYW50IGZhaWwtb3Blbi4gQWx3YXlzIGluamVjdGluZyBgY3R4Lm9yZ0lkYCBjbG9zZXMgaXQuXG4gICAqXG4gICAqIFN5c2FkbWluIChhbmQgb3V0LW9mLWNvbnRleHQgd29ya2VyL3N5c3RlbSBwYXRocywgd2hlcmUgYGdldFRlbmFudENvbnRleHQoKWBcbiAgICogaXMgdW5kZWZpbmVkKSBrZWVwIHRoZSBzdXBwbGllZCBvcmcsIG1hdGNoaW5nIHRoZSBSTFMgcG9saWN5XG4gICAqIGBjdXJyZW50X2lzX3N5c2FkbWluKCkgT1Igb3JnX2lkID0gY3VycmVudF9vcmdfaWQoKWAuXG4gICAqL1xuICAvLyBHZW5lcmljIG92ZXIgdGhlIHBheWxvYWQgc2hhcGUgc28gQk9USCB0aGUgY3JlYXRlIChgVEluc2VydGApIGFuZCB1cGRhdGVcbiAgLy8gKGBQYXJ0aWFsPFRVcGRhdGU+YCkgY2FsbCBzaXRlcyB1c2UgaXQgd2l0aG91dCB0aGUgYGFzIHVua25vd24gYXMgVEluc2VydGBcbiAgLy8gcm91bmQtdHJpcCB0aGV5IHByZXZpb3VzbHkgbmVlZGVkIOKAlCB0aGUgb3JnLXN0YW1wIGxvZ2ljIGlzIGlkZW50aWNhbCBmb3JcbiAgLy8gZWl0aGVyIHNoYXBlIChpdCBvbmx5IHRvdWNoZXMgdGhlIGBvcmdJZGAga2V5KS5cbiAgcHJvdGVjdGVkIGVuZm9yY2VPcmdJZDxUPihkYXRhOiBULCBpc0NyZWF0ZSA9IGZhbHNlKTogVCB7XG4gICAgY29uc3QgY3R4ID0gZ2V0VGVuYW50Q29udGV4dCgpO1xuICAgIGNvbnN0IGQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8vIFJlZnVzZSBhIGNvbnRleHQtbGVzcywgb3JnSWQtbGVzcyBJTlNFUlQgb24gYW4gb3JnLXNjb3BlZCBlbnRpdHk6IHRoZSBgb3JnSWRgXG4gICAgLy8gY29sdW1uIGRlZmF1bHRzIHRvIFNZU1RFTV9PUkdfSUQsIHNvIHN1Y2ggYSByb3cgd291bGQgc2lsZW50bHkgbGFuZCBpbiB0aGVcbiAgICAvLyBwdWJsaWMgY3Jvc3Mtb3JnIGNhdGFsb2cuIEEgYmFja2dyb3VuZCBqb2IgdGhhdCBmb3Jnb3QgYHJ1bldpdGhUZW5hbnRDb250ZXh0YFxuICAgIC8vIChhbmQgZGlkbid0IHBhc3MgYW4gZXhwbGljaXQgb3JnSWQpIG11c3QgZmFpbCBsb3VkbHksIG5vdCBsZWFrIGludG8gYHN5c3RlbWAuXG4gICAgLy8gKFN5c2FkbWluL3NlZWQgd3JpdGVzIGNhcnJ5IGEgY29udGV4dCBvciBhbiBleHBsaWNpdCBvcmdJZCwgc28gdGhleSBwYXNzLilcbiAgICBpZiAoaXNDcmVhdGUgJiYgIWN0eCAmJiBkLm9yZ0lkID09IG51bGwgJiYgdGhpcy5jb2xzLm9yZ0lkICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmNyZWF0ZSByZXF1aXJlcyBhbiBvcmdJZCAobm8gdGVuYW50IGNvbnRleHQgYW5kIG5vbmUgc3VwcGxpZWQpIOKAlCByZWZ1c2luZyB0byBkZWZhdWx0IHRvIHRoZSBzeXN0ZW0gb3JnYCk7XG4gICAgfVxuICAgIGlmIChjdHggJiYgIWN0eC5pc1N1cGVyQWRtaW4gJiYgY3R4Lm9yZ0lkICYmIGQub3JnSWQgIT09IGN0eC5vcmdJZCkge1xuICAgICAgLy8gRGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyB0aGF0IHJlYWNoIGhlcmUgc28gdGhlIGxvZyBzdGF5cyB1c2VmdWwgYW5kXG4gICAgICAvLyBxdWlldDogYSBQUkVTRU5ULWJ1dC1taXNtYXRjaGVkIGBvcmdJZGAgaXMgYW4gYWN0dWFsIG92ZXJyaWRlIGF0dGVtcHRcbiAgICAgIC8vICh3YXJuKSwgd2hpbGUgYW4gQUJTRU5UIGBvcmdJZGAgaXMgdGhlIGNvbW1vbiBub3JtYWwtd3JpdGUgcGF0aCB0aGF0IGp1c3RcbiAgICAgIC8vIG5lZWRzIHRoZSBkZWZhdWx0IHN0YW1wIChkZWJ1Zykg4oCUIGxvZ2dpbmcgdGhhdCBhdCB3YXJuIGZsb29kcyB0aGUgbG9nIG9uXG4gICAgICAvLyBldmVyeSB3cml0ZSB0aGF0IG9taXRzIG9yZ0lkLlxuICAgICAgY29uc3QgbWV0YSA9IHsgc3VwcGxpZWQ6ICdvcmdJZCcgaW4gZCA/IGQub3JnSWQgOiB1bmRlZmluZWQsIGVuZm9yY2VkOiBjdHgub3JnSWQgfTtcbiAgICAgIGlmICgnb3JnSWQnIGluIGQpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0NydWRTZXJ2aWNlOiBvdmVycmlkaW5nIG1pc21hdGNoZWQgb3JnIG9uIHdyaXRlJywgbWV0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0NydWRTZXJ2aWNlOiBzdGFtcGluZyB0ZW5hbnQtY29udGV4dCBvcmcgb24gd3JpdGUnLCBtZXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmQsIG9yZ0lkOiBjdHgub3JnSWQgfSBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5XG4gICAqL1xuICBhc3luYyBjcmVhdGUoZGF0YTogVEluc2VydCwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHk+IHtcbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEsIC8qIGlzQ3JlYXRlICovIHRydWUpO1xuICAgIGNvbnN0IFtjcmVhdGVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuaW5zZXJ0KHRoaXMuc2NoZW1hKVxuICAgICAgLnZhbHVlcyh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICBjcmVhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICB0YXJnZXQ6IHRoaXMuY29uZmxpY3RUYXJnZXQgYXMgYW55LFxuICAgICAgICBzZXQ6IHtcbiAgICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgICAvLyBSRVNVUlJFQ1Qgb24gcmUtY3JlYXRlOiBgZGVsZXRlYCBzb2Z0LWRlbGV0ZXMgKGlzQWN0aXZlPWZhbHNlICsgZGVsZXRlZEF0L1xuICAgICAgICAgIC8vIGRlbGV0ZWRCeSBzZXQpLCBidXQgdGhlIHVuaXF1ZSBjb25zdHJhaW50IGtlZXBzIHRoZSB0b21ic3RvbmVkIHJvdywgc28gYVxuICAgICAgICAgIC8vIHJlLWNyZWF0ZSB3aXRoIHRoZSBzYW1lIGNvbmZsaWN0IGtleSBsYW5kcyBoZXJlLiBXaXRob3V0IHJlc2V0dGluZyB0aGVzZSxcbiAgICAgICAgICAvLyB0aGUgcm93J3MgYm9keSB1cGRhdGVzIGJ1dCBpdCBzdGF5cyBzb2Z0LWRlbGV0ZWQgYW5kIG5ldmVyIHJlYXBwZWFyc1xuICAgICAgICAgIC8vIChyZWFkcyBkZWZhdWx0IHRvIGlzQWN0aXZlPXRydWUpLiBNYXRjaGVzIHRoZSBwaXBlbGluZS9wbHVnaW4gb3ZlcnJpZGVzLlxuICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgIGRlbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgICBkZWxldGVkQnk6IG51bGwsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICAvLyBBd2FpdGVkIGludGVudGlvbmFsbHk6IGNhY2hlIGludmFsaWRhdGlvbiBoYXBwZW5zIGluIHRoZSBob29rLCBhbmQgYVxuICAgIC8vIGZpcmUtYW5kLWZvcmdldCBwYXR0ZXJuIGxldHMgYSBzdWJzZXF1ZW50IHJlYWQgaW5zaWRlIHRoZSBzYW1lIHJlcXVlc3RcbiAgICAvLyByZXR1cm4gdGhlIHN0YWxlIHByZS13cml0ZSBlbnRyeS4gVGhlIGhvb2sgaXMgZXhwZWN0ZWQgdG8gYmUgZmFzdFxuICAgIC8vIChzaW5nbGUgUmVkaXMgb3ApOyBzbG93IGhvb2tzIHNob3VsZCBydW4gdGhlaXIgb3duIGJhY2tncm91bmQgd29yay5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyQ3JlYXRlKGNyZWF0ZWQsIHVzZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFuIGV4aXN0aW5nIGVudGl0eVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGF0YTogUGFydGlhbDxUVXBkYXRlPixcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMud3JpdGVDb25kaXRpb25zKGlkLCBvcmdJZCk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBgb3JnSWRgIGluIHRoZSB1cGRhdGUgcGF5bG9hZCAoYXMgY3JlYXRlIGRvZXMpOiB0aGVcbiAgICAvLyBXSEVSRSBvbmx5IHBpbnMgd2hpY2ggcm93cyB5b3UgY2FuIFRBUkdFVCwgbm90IHdoYXQgeW91IGNhbiBzZXQg4oCUIHdpdGhvdXQgdGhpc1xuICAgIC8vIGEgdGVuYW50IGNvdWxkIHJlLWhvbWUgYSByb3cgaXQgb3ducyBpbnRvIGFub3RoZXIgb3JnIHZpYSBgZGF0YS5vcmdJZGAuXG4gICAgY29uc3Qgc2FmZURhdGEgPSB0aGlzLmVuZm9yY2VPcmdJZChkYXRhKTtcblxuICAgIGNvbnN0IFt1cGRhdGVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclVwZGF0ZShpZCwgdXBkYXRlZCwgdXNlcklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IChzb2Z0IGRlbGV0ZSBieSBzZXR0aW5nIGlzQWN0aXZlID0gZmFsc2UpXG4gICAqL1xuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMud3JpdGVDb25kaXRpb25zKGlkLCBvcmdJZCk7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgIGNvbnN0IFtkZWxldGVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICBkZWxldGVkQXQ6IG5vdyxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIC8vIFN0YW1wIHRoZSBwdXJnZSBkZWFkbGluZSBzbyB0aGUgcmV0ZW50aW9uIHN3ZWVwIGNhbiBoYXJkLWRlbGV0ZSBsYXRlci5cbiAgICAgICAgLi4udGhpcy5wdXJnZUFmdGVyU3RhbXAobm93KSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJEZWxldGUoaWQsIGRlbGV0ZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGVudGl0eSBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9qZWN0L29yZ2FuaXphdGlvbiBzY29wZS5cbiAgICogTWFya3MgYWxsIG90aGVyIGVudGl0aWVzIGFzIG5vbi1kZWZhdWx0LCB0aGVuIHNldHMgdGhlIHNwZWNpZmllZCBlbnRpdHkuXG4gICAqIFVzZXMgYSB0cmFuc2FjdGlvbiB0byBlbnN1cmUgYXRvbWljaXR5LlxuICAgKi9cbiAgYXN5bmMgc2V0RGVmYXVsdChcbiAgICBwcm9qZWN0OiBzdHJpbmcsXG4gICAgb3JnOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgLy8gQSBub24tc3lzYWRtaW4gbWF5IG9ubHkgZmxpcCBkZWZhdWx0cyB3aXRoaW4gaXRzIE9XTiBvcmcg4oCUIHBpbiB0aGUgc2NvcGUgdG9cbiAgICAvLyB0aGUgdHJ1c3RlZCB0ZW5hbnQgY29udGV4dCBzbyBhIGZvcndhcmRlZCBgb3JnYCBhcmcgY2FuJ3QgdG91Y2ggYW5vdGhlclxuICAgIC8vIHRlbmFudCdzIGRlZmF1bHRzIChSTFMgaXMgaW4gb3duZXItYnlwYXNzIG1vZGU7IHRoaXMgaXMgdGhlIGdhdGUpLlxuICAgIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgICBpZiAoY3R4ICYmICFjdHguaXNTdXBlckFkbWluICYmIGN0eC5vcmdJZCkgb3JnID0gY3R4Lm9yZ0lkO1xuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBvcmdDb2x1bW4gPSB0aGlzLmdldE9yZ0NvbHVtbigpO1xuICAgICAgY29uc3QgcHJvamVjdENvbHVtbiA9IHRoaXMuZ2V0UHJvamVjdENvbHVtbigpO1xuXG4gICAgICAvLyBCdWlsZCBzY29waW5nIGNvbmRpdGlvbnMgZm9yIGNsZWFyaW5nIGRlZmF1bHRzXG4gICAgICBjb25zdCBzY29wZUNvbmRpdGlvbnMgPSBbXG4gICAgICAgIGVxKG9yZ0NvbHVtbiwgb3JnKSxcbiAgICAgICAgZXEodGhpcy5jb2xzLmlzRGVmYXVsdCwgdHJ1ZSksXG4gICAgICBdO1xuICAgICAgaWYgKHByb2plY3RDb2x1bW4pIHtcbiAgICAgICAgc2NvcGVDb25kaXRpb25zLnB1c2goZXEocHJvamVjdENvbHVtbiwgcHJvamVjdCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NrIGV4aXN0aW5nIGRlZmF1bHRzIHdpdGggRk9SIFVQREFURSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgc2V0RGVmYXVsdCByYWNlc1xuICAgICAgYXdhaXQgdHguZXhlY3V0ZShcbiAgICAgICAgc3FsYFNFTEVDVCBpZCBGUk9NICR7dGhpcy5zY2hlbWF9XG4gICAgICAgICAgICBXSEVSRSAke29yZ0NvbHVtbn0gPSAke29yZ31cbiAgICAgICAgICAgICAgQU5EICR7dGhpcy5jb2xzLmlzRGVmYXVsdH0gPSB0cnVlXG4gICAgICAgICAgICAke3Byb2plY3RDb2x1bW4gPyBzcWxgQU5EICR7cHJvamVjdENvbHVtbn0gPSAke3Byb2plY3R9YCA6IHNxbGBgfVxuICAgICAgICAgICAgRk9SIFVQREFURWAsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFsbCBlbnRpdGllcyBpbiBzY29wZSBhcyBub24tZGVmYXVsdFxuICAgICAgYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIH0gYXMgYW55KVxuICAgICAgICAud2hlcmUoYW5kKC4uLnNjb3BlQ29uZGl0aW9ucykpO1xuXG4gICAgICAvLyBTZXQgdGhlIHNwZWNpZmllZCBlbnRpdHkgYXMgZGVmYXVsdC4gR3VhcmQgYWdhaW5zdCBwcm9tb3RpbmcgYVxuICAgICAgLy8gc29mdC1kZWxldGVkIHJvdyAoaXNBY3RpdmUgPSB0cnVlKSDigJQgYSBkZWxldGVkIGVudGl0eSBtdXN0IG5ldmVyIGJlY29tZVxuICAgICAgLy8gdGhlIGFjdGl2ZSBkZWZhdWx0IOKAlCBhbmQgcGluIHRoZSBpZCB3aXRoIHRoZSBzYW1lIGxvd2VyY2FzZWRcbiAgICAgIC8vIGV4YWN0SWRDb25kaXRpb24gdGhlIG11dGF0aW9uIHBhdGhzIHVzZSAodGhlIHJhdyBgZXEoY29scy5pZCwgaWQpYCBoZXJlXG4gICAgICAvLyBza2lwcGVkIHRoZSBsb3dlci1jYXNpbmcgdGhhdCBgYnVpbGRJZEZpbHRlcmAvYHdyaXRlQ29uZGl0aW9uc2AgYXBwbHksXG4gICAgICAvLyBzbyBhIG1peGVkLWNhc2UgaWQgY291bGQgbWlzcyBpdHMgcm93KS4gQSBub24tbWF0Y2gg4oaSIE5vdEZvdW5kRXJyb3IgYmVsb3cuXG4gICAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB0eFxuICAgICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgICAuc2V0KHtcbiAgICAgICAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKFxuICAgICAgICAgIGFuZChcbiAgICAgICAgICAgIHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCksXG4gICAgICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgICAgICBlcSh0aGlzLmNvbHMuaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSk7XG5cbiAgICAgIGlmICghdXBkYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgRW50aXR5IHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtdWx0aXBsZSBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXJcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU1hbnkoXG4gICAgZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCk7XG4gICAgLy8gT3duLW9yZyB3cml0ZS1waW46IGJ1aWxkQ29uZGl0aW9ucyBhbHNvIG1hdGNoZXMgc3lzdGVtL290aGVyLW9yZyBQVUJMSUNcbiAgICAvLyByb3dzLCBzbyB3aXRob3V0IHRoZSBzdHJpY3Qgb3JnSWQgcGluIGEgZmlsdGVyLWJhc2VkIHVwZGF0ZSBjb3VsZCBtdXRhdGVcbiAgICAvLyBzaGFyZWQgKG9yIGFub3RoZXIgdGVuYW50J3MgcHVibGljKSByZWNvcmRzLiBNaXJyb3IgdXBkYXRlL2RlbGV0ZS9cbiAgICAvLyBidWxrRGVsZXRlLiAoU2VlIHdyaXRlQ29uZGl0aW9ucy4pIEFuIG9yZ0lkLWxlc3MgKHN5c2FkbWluKSBjb250ZXh0IGtlZXBzXG4gICAgLy8gZnVsbCBhY2Nlc3MuXG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcblxuICAgIC8vIFNjcnViIGEgY2FsbGVyLXN1cHBsaWVkIG9yZ0lkIChzZWUgdXBkYXRlKCkpIHNvIGEgZmlsdGVyLWJhc2VkIHVwZGF0ZSBjYW4ndFxuICAgIC8vIHJlLWhvbWUgcm93cyBpbnRvIGFub3RoZXIgdGVuYW50LlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG11bHRpcGxlIGVudGl0aWVzIGluIGEgc2luZ2xlIGJhdGNoIGluc2VydC5cbiAgICogVXNlcyB1cHNlcnQgKG9uQ29uZmxpY3REb1VwZGF0ZSkg4oCUIGFsbCByb3dzIGFyZSBpbnNlcnRlZCBpbiBvbmUgcXVlcnkgcGVyIGNodW5rLlxuICAgKiBDaHVua3Mgb2YgMTAwIHRvIHN0YXkgd2l0aGluIFBvc3RncmVTUUwgcGFyYW1ldGVyIGxpbWl0cy5cbiAgICovXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgYG9uQ29uZmxpY3REb1VwZGF0ZWAgU0VUIGZvciBhIGJ1bGsgdXBzZXJ0LiBVbmxpa2UgYSBzaW5nbGUtcm93XG4gICAqIGNyZWF0ZSAod2hpY2ggY2FuIHNwcmVhZCB0aGUgb25lIHJvdydzIGRhdGEpLCBhIGJhdGNoZWQgaW5zZXJ0IGhhcyBtYW55IHJvd3MsXG4gICAqIHNvIGVhY2ggdXBkYXRhYmxlIGNvbHVtbiBpcyB3cml0dGVuIGZyb20gYGV4Y2x1ZGVkLipgICh0aGUgd291bGQtYmUtaW5zZXJ0ZWRcbiAgICogdmFsdWUpIOKAlCBvdGhlcndpc2UgYW4gZXhpc3Rpbmcgcm93J3MgZmllbGRzIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQgYW5kIG9ubHlcbiAgICogdGltZXN0YW1wcyBidW1wLiBTa2lwcyBpZGVudGl0eS9pbW11dGFibGUgKGBpZGAsIGBjcmVhdGVkQXRgLCBgY3JlYXRlZEJ5YClcbiAgICogYW5kIHRoZSBjb25mbGljdC10YXJnZXQgY29sdW1uczsgYHVwZGF0ZWRBdGAvYHVwZGF0ZWRCeWAgZ2V0IHRoZSBmcmVzaCB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQnVsa1Vwc2VydFNldChub3c6IERhdGUsIHVzZXI6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBjb25mbGljdE5hbWVzID0gbmV3IFNldCh0aGlzLmNvbmZsaWN0VGFyZ2V0Lm1hcCgoYykgPT4gKGMgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lKSk7XG4gICAgY29uc3Qgc2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgY29sXSBvZiBPYmplY3QuZW50cmllcyhnZXRUYWJsZUNvbHVtbnModGhpcy5zY2hlbWEpKSkge1xuICAgICAgY29uc3QgbmFtZSA9IChjb2wgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgICAgaWYgKGtleSA9PT0gJ2lkJyB8fCBrZXkgPT09ICdjcmVhdGVkQXQnIHx8IGtleSA9PT0gJ2NyZWF0ZWRCeScgfHwgY29uZmxpY3ROYW1lcy5oYXMobmFtZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZWRBdCcpIHsgc2V0W2tleV0gPSBub3c7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoa2V5ID09PSAndXBkYXRlZEJ5JykgeyBzZXRba2V5XSA9IHVzZXI7IGNvbnRpbnVlOyB9XG4gICAgICBzZXRba2V5XSA9IHNxbGBleGNsdWRlZC4ke3NxbC5pZGVudGlmaWVyKG5hbWUpfWA7XG4gICAgfVxuICAgIC8vIFJFU1VSUkVDVCBvbiBidWxrIHJlLWNyZWF0ZSAobWF0Y2hlcyB0aGUgc2luZ2xlLXJvdyBjcmVhdGUpOiByZXNldCB0aGVcbiAgICAvLyBzb2Z0LWRlbGV0ZSBjb2x1bW5zIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gcmVseSBvbiBgZXhjbHVkZWQuKmAgKyBjb2x1bW5cbiAgICAvLyBkZWZhdWx0cywgc28gYSByZS1jcmVhdGVkIHNhbWUta2V5IHJvdyBpcyBhbHdheXMgcmVhY3RpdmF0ZWQsIG5vdCBsZWZ0XG4gICAgLy8gdG9tYnN0b25lZC4gQWxsIENydWRTZXJ2aWNlIGVudGl0aWVzIGNhcnJ5IHRoZXNlIChkZWxldGUoKSBzZXRzIGFsbCB0aHJlZSkuXG4gICAgc2V0LmlzQWN0aXZlID0gdHJ1ZTtcbiAgICBzZXQuZGVsZXRlZEF0ID0gbnVsbDtcbiAgICBzZXQuZGVsZXRlZEJ5ID0gbnVsbDtcbiAgICByZXR1cm4gc2V0O1xuICB9XG5cbiAgYXN5bmMgYnVsa0NyZWF0ZShpdGVtczogVEluc2VydFtdLCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgQ0hVTktfU0laRSA9IDEwMDtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSB1c2VySWQgfHwgJ3N5c3RlbSc7XG4gICAgY29uc3QgY29uZmxpY3RTZXQgPSB0aGlzLmJ1aWxkQnVsa1Vwc2VydFNldChub3csIHVzZXIpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IGFsbENyZWF0ZWQ6IFRFbnRpdHlbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSBDSFVOS19TSVpFKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gaXRlbXMuc2xpY2UoaSwgaSArIENIVU5LX1NJWkUpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBjaHVuay5tYXAoZGF0YSA9PiAoe1xuICAgICAgICAgIC4uLnRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEpLFxuICAgICAgICAgIGNyZWF0ZWRCeTogdXNlcixcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXIsXG4gICAgICAgIH0gYXMgYW55KSk7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHR4XG4gICAgICAgICAgLmluc2VydCh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAudmFsdWVzKHZhbHVlcylcbiAgICAgICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5jb25mbGljdFRhcmdldCBhcyBhbnksXG4gICAgICAgICAgICBzZXQ6IGNvbmZsaWN0U2V0IGFzIGFueSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICAgIGFsbENyZWF0ZWQucHVzaCguLi5jcmVhdGVkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsbENyZWF0ZWQ7XG4gICAgfSk7XG5cbiAgICAvLyBSdW4gaG9va3MgaW4gcGFyYWxsZWwgYnV0IGF3YWl0IGFsbCBiZWZvcmUgcmV0dXJuaW5nIHNvIGEgc3Vic2VxdWVudFxuICAgIC8vIHJlYWQgaW4gdGhlIHNhbWUgcmVxdWVzdCBzZWVzIGEgY29oZXJlbnQgcG9zdC13cml0ZSB2aWV3LlxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcmVzdWx0cy5tYXAoZW50aXR5ID0+XG4gICAgICAgIHRoaXMub25BZnRlckNyZWF0ZShlbnRpdHksIHVzZXJJZCkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGB2aXNpYmlsaXR5YCBwcmVkaWNhdGUgZm9yIGEgYnVsayBzb2Z0LWRlbGV0ZSwgbWlycm9yaW5nXG4gICAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzYCBydW5nIGZvciBydW5nIHNvIGJ1bGsgYW5kIHNpbmdsZS1yb3cgZGVsZXRlXG4gICAqIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY2FsbGVyIG1heSByZW1vdmUuXG4gICAqXG4gICAqIFJldHVybnMgbm8gY29uZGl0aW9uIGF0IGFsbCBmb3IgYSBzeXN0ZW0gYWRtaW4sIG9yIGZvciBhbiBlbnRpdHkgd2l0aCBub1xuICAgKiBgdmlzaWJpbGl0eWAgY29sdW1uIChub3RoaW5nIHRvIGdhdGUgb24pLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpYmlsaXR5RGVsZXRlQ29uZGl0aW9ucyhcbiAgICBhY2Nlc3M6IHsgaXNTeXN0ZW1BZG1pbjogYm9vbGVhbjsgY2FuUHVibGlzaDogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGFjY2Vzc0NvbD86IEFueUNvbHVtbixcbiAgICBjcmVhdGVkQnlDb2w/OiBBbnlDb2x1bW4sXG4gICk6IFNRTFtdIHtcbiAgICBpZiAoIWFjY2Vzc0NvbCkgcmV0dXJuIFtdO1xuICAgIGlmICghYWNjZXNzIHx8IGFjY2Vzcy5pc1N5c3RlbUFkbWluKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBydW5nczogU1FMW10gPSBbZXEoYWNjZXNzQ29sLCAnb3JnJyldO1xuICAgIC8vIGBwcml2YXRlYCBpcyBhdXRob3Itb25seS4gV2l0aCBubyBhdXRob3IgY29sdW1uIG9yIG5vIGNhbGxlciBpZGVudGl0eSB3ZVxuICAgIC8vIGNhbm5vdCBwcm92ZSBhdXRob3JzaGlwLCBzbyB0aGUgcnVuZyBpcyBzaW1wbHkgbm90IG9mZmVyZWQgKGZhaWwgY2xvc2VkKVxuICAgIC8vIHJhdGhlciB0aGFuIG1hdGNoaW5nIGV2ZXJ5IHByaXZhdGUgcm93LlxuICAgIGlmIChjcmVhdGVkQnlDb2wgJiYgdXNlcklkKSB7XG4gICAgICBydW5ncy5wdXNoKGFuZChlcShhY2Nlc3NDb2wsICdwcml2YXRlJyksIGVxKGNyZWF0ZWRCeUNvbCwgdXNlcklkKSkgYXMgU1FMKTtcbiAgICB9XG4gICAgaWYgKGFjY2Vzcy5jYW5QdWJsaXNoKSBydW5ncy5wdXNoKGVxKGFjY2Vzc0NvbCwgJ3B1YmxpYycpKTtcblxuICAgIHJldHVybiBbb3IoLi4ucnVuZ3MpIGFzIFNRTF07XG4gIH1cblxuICAvKipcbiAgICogU29mdC1kZWxldGUgbXVsdGlwbGUgZW50aXRpZXMgYnkgSURzIGluIGEgc2luZ2xlIGJhdGNoIG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGJ1bGtEZWxldGUoXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFRoZSBjYWxsZXIncyBhdXRob3JpdHkgb24gdGhlIHRocmVlLXJ1bmcgYHZpc2liaWxpdHlgIGxhZGRlci4gT21pdCAob3JcbiAgICAgKiBwYXNzIGBpc1N5c3RlbUFkbWluOiB0cnVlYCkgZm9yIGFuIHVucmVzdHJpY3RlZCBkZWxldGUuXG4gICAgICpcbiAgICAgKiBUaGlzIHVzZWQgdG8gYmUgYSBgcmVzdHJpY3RUb1ByaXZhdGVgIGJvb2xlYW4gdGhhdCBuYXJyb3dlZCB0b1xuICAgICAqIGB2aXNpYmlsaXR5ID0gJ3ByaXZhdGUnYC4gVGhhdCBlbmNvZGVkIHRoZSBPTEQgdHdvLXN0YXRlIG1vZGVsOiBzaW5jZVxuICAgICAqIGByZXNvbHZlVmlzaWJpbGl0eWAgZGVmYXVsdHMgcGlwZWxpbmVzIGFuZCBwbHVnaW5zIHRvIGBvcmdgLCBhbmRcbiAgICAgKiBzaW5nbGUtcm93IGRlbGV0ZSBhbGxvd3MgYW4gYG9yZ2Agcm93IHdpdGggcGxhaW4gYDp3cml0ZWAsIGJ1bGsgZGVsZXRlXG4gICAgICogNDAzJ2QgdGhlIG5vcm1hbCBjYXNlIOKAlCBhbiBvcmcgYWRtaW4gY291bGQgZGVsZXRlIGEgcGlwZWxpbmUgb25lIGF0IGFcbiAgICAgKiB0aW1lIGJ1dCBub3QgaW4gYnVsay4gVGhlIHJ1bmdzIGVuZm9yY2VkIGhlcmUgbWlycm9yXG4gICAgICogYHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3NgIGV4YWN0bHk6XG4gICAgICogICAtIGBwcml2YXRlYCDihpIgYXV0aG9yIG9ubHkgKGBjcmVhdGVkQnkgPT09IHVzZXJJZGApXG4gICAgICogICAtIGBvcmdgICAgICDihpIgYW55IG1lbWJlciBvZiB0aGUgb3JnIChwbGFpbiBgOndyaXRlYClcbiAgICAgKiAgIC0gYHB1YmxpY2AgIOKGkiByZXF1aXJlcyB0aGUgZW50aXR5J3MgcHVibGlzaCBwZXJtaXNzaW9uXG4gICAgICovXG4gICAgYWNjZXNzPzogeyBpc1N5c3RlbUFkbWluOiBib29sZWFuOyBjYW5QdWJsaXNoOiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCB8fCAnc3lzdGVtJztcbiAgICAvLyBPd25lci1zY29wZSB0aGUgYnVsayBzb2Z0LWRlbGV0ZTogYnVpbGRDb25kaXRpb25zIGFsc28gbWF0Y2hlcyBzeXN0ZW0vb3RoZXJcbiAgICAvLyAtb3JnIFBVQkxJQyByb3dzLCBzbyB3aXRob3V0IHRoZSBzdHJpY3Qgb3JnSWQgcGluIGEgdGVuYW50IGNvdWxkIGRlbGV0ZVxuICAgIC8vIHNoYXJlZCByZWNvcmRzIGJ5IGlkLiAoU2VlIHdyaXRlQ29uZGl0aW9ucy4pXG4gICAgY29uc3QgYWNjZXNzQ29sID0gdGhpcy5jb2xzLnZpc2liaWxpdHk7XG4gICAgY29uc3QgY3JlYXRlZEJ5Q29sID0gdGhpcy5jb2xzLmNyZWF0ZWRCeTtcbiAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgaW5BcnJheSh0aGlzLmNvbHMuaWQsIGlkcyksXG4gICAgICAuLi50aGlzLmJ1aWxkQ29uZGl0aW9ucyh7fSBhcyBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZCksXG4gICAgICAvLyBUZW5hbnQgY29sdW1uIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsKSDigJQgY29uc2lzdGVudCB3aXRoXG4gICAgICAvLyB3cml0ZUNvbmRpdGlvbnM7IG5vIHNpbGVudCBmYWlsLW9wZW4gd2hlbiB0aGUgcHJvcGVydHkgaXMgYWJzZW50LlxuICAgICAgLi4uKG9yZ0lkID8gW2VxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKV0gOiBbXSksXG4gICAgICAuLi50aGlzLnZpc2liaWxpdHlEZWxldGVDb25kaXRpb25zKGFjY2VzcywgdXNlcklkLCBhY2Nlc3NDb2wsIGNyZWF0ZWRCeUNvbCksXG4gICAgXTtcblxuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXIsXG4gICAgICAgIGRlbGV0ZWRBdDogbm93LFxuICAgICAgICBkZWxldGVkQnk6IHVzZXIsXG4gICAgICAgIC8vIFN0YW1wIHRoZSBwdXJnZSBkZWFkbGluZSBzbyB0aGUgcmV0ZW50aW9uIHN3ZWVwIGNhbiBoYXJkLWRlbGV0ZSBsYXRlci5cbiAgICAgICAgLi4udGhpcy5wdXJnZUFmdGVyU3RhbXAobm93KSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZGVsZXRlZC5tYXAoZW50aXR5ID0+XG4gICAgICAgIHRoaXMub25BZnRlckRlbGV0ZShlbnRpdHkuaWQsIGVudGl0eSwgdXNlcklkKS5jYXRjaChlcnIgPT5cbiAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc29mdC1kZWxldGVkICh0b21ic3RvbmVkKSBlbnRpdHk6IGNsZWFyIGBpc0FjdGl2ZWAvYGRlbGV0ZWRBdGAvXG4gICAqIGBkZWxldGVkQnlgL2BwdXJnZUFmdGVyYCBzbyBpdCByZWFwcGVhcnMgaW4gbm9ybWFsIHJlYWRzLlxuICAgKlxuICAgKiBNYXRjaGVzIE9OTFkgYSBnZW51aW5lIHRvbWJzdG9uZSDigJQgYGlzQWN0aXZlID0gZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCDigJQgc28gYSBtZXJlbHkgKmRlYWN0aXZhdGVkKiByb3cgKGlzQWN0aXZlPWZhbHNlLCBubyBkZWxldGVkQXQpIGlzIG5ldmVyXG4gICAqIHNpbGVudGx5IFwicmVzdG9yZWRcIi4gUGlubmVkIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIChvcmdJZC1sZXNzIHN5c2FkbWluXG4gICAqIGNvbnRleHQgc3BhbnMgb3JncywgbWF0Y2hpbmcgZGVsZXRlL3VwZGF0ZSkuIFJldHVybnMgbnVsbCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIHN1Y2ggdG9tYnN0b25lIChhbHJlYWR5IGFjdGl2ZSwgcHVyZ2VkLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICogQSB1bmlxdWUta2V5IGNvbGxpc2lvbiAoYSBsaXZlIHJvdyBhbHJlYWR5IGhvbGRzIHRoZSBrZXkpIHN1cmZhY2VzIGFzIHRoZVxuICAgKiBkcml2ZXIncyB1bmlxdWUtdmlvbGF0aW9uIGZvciB0aGUgcm91dGUgdG8gbWFwIHRvIDQwOSDigJQgaW4gcHJhY3RpY2UgdGhlXG4gICAqIHRvbWJzdG9uZSBJUyB0aGUga2V5IGhvbGRlciwgc28gdGhpcyBpcyBkZWZlbnNpdmUuXG4gICAqL1xuICAvKiogQ29uZGl0aW9ucyBtYXRjaGluZyBhIEdFTlVJTkUgdG9tYnN0b25lIChgaXNBY3RpdmU9ZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTXG4gICAqICBOT1QgTlVMTGApLCBvcHRpb25hbGx5IHBpbm5lZCB0byBgaWRgIGFuZC9vciBgb3JnSWRgLiBTaW5nbGUgc291cmNlIG9mIHRydXRoXG4gICAqICBmb3IgcmVzdG9yZS9maW5kRGVsZXRlZEJ5SWQvZmluZERlbGV0ZWQgc28gdGhlIFwid2hhdCBpcyBhIHRvbWJzdG9uZVwiIHJ1bGVcbiAgICogIGxpdmVzIGluIG9uZSBwbGFjZS4gKi9cbiAgcHJpdmF0ZSB0b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkPzogc3RyaW5nLCBpZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtcbiAgICAgIGVxKHRoaXMuY29scy5pc0FjdGl2ZSwgZmFsc2UpLFxuICAgICAgc3FsYCR7dGhpcy5jb2xzLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLFxuICAgIF07XG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIGNvbmRpdGlvbnMudW5zaGlmdCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICBpZiAob3JnSWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCkpO1xuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgYXN5bmMgcmVzdG9yZShpZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsOyAvLyBlbnRpdHkgaGFzIG5vIHNvZnQtZGVsZXRlIGxpZmVjeWNsZVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IFtyZXN0b3JlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBudWxsLFxuICAgICAgICBkZWxldGVkQnk6IG51bGwsXG4gICAgICAgIC4uLih0aGlzLmNvbHMucHVyZ2VBZnRlciA/IHsgcHVyZ2VBZnRlcjogbnVsbCB9IDoge30pLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKHJlc3RvcmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJSZXN0b3JlKGlkLCByZXN0b3JlZCwgdXNlcklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3RvcmVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhIHNvZnQtZGVsZXRlZCBlbnRpdHkgYnkgaWQgKHRoZSBpbnZlcnNlIG9mIHRoZSBkZWZhdWx0IGBpc0FjdGl2ZT10cnVlYFxuICAgKiByZWFkcykg4oCUIHVzZWQgYnkgcmVzdG9yZSByb3V0ZXMgdG8gbG9hZCB0aGUgdG9tYnN0b25lIGZvciBhY2Nlc3MtY29udHJvbFxuICAgKiBnYXRpbmcgYmVmb3JlIHJlc3RvcmluZy4gUmV0dXJucyBudWxsIHVubGVzcyB0aGUgcm93IGV4aXN0cyBBTkQgaXMgYSBnZW51aW5lXG4gICAqIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKS5cbiAgICovXG4gIGFzeW5jIGZpbmREZWxldGVkQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYW4gb3JnJ3Mgc29mdC1kZWxldGVkIHRvbWJzdG9uZXMgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCksIG1vc3QtcmVjZW50bHktZGVsZXRlZCBmaXJzdCDigJQgcG93ZXJzIHRoZSBcInJlY2VudGx5IGRlbGV0ZWRcIiByZXN0b3JlXG4gICAqIFVJLiBSZXR1cm5zIGBbXWAgZm9yIGVudGl0aWVzIHdpdGhvdXQgYSBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGUuIGBsaW1pdGAgaXNcbiAgICogY2xhbXBlZCB0byBbMSwgMjAwXSB0byBrZWVwIHRoZSByZXNwb25zZSBib3VuZGVkICh0aGUgcmV0ZW50aW9uIHN3ZWVwIGhhcmQtXG4gICAqIGRlbGV0ZXMgb2xkIHRvbWJzdG9uZXMgYW55d2F5LCBzbyB0aGlzIGlzIGEgc2hvcnQsIHNlbGYtbGltaXRpbmcgbGlzdCkuXG4gICAqL1xuICBhc3luYyBmaW5kRGVsZXRlZChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIG9wdHM6IHsgbGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gW107XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCBvcHRzLmxpbWl0ID8/IDUwKSwgMjAwKTtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgwLCBvcHRzLm9mZnNldCA/PyAwKTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5vcmRlckJ5KGRlc2ModGhpcy5jb2xzLmRlbGV0ZWRBdCEpKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuICAgICAgLm9mZnNldChvZmZzZXQpXG4gICAgICAudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZC1kZWxldGUgYSBiYXRjaCBvZiB0b21ic3RvbmVzIHdob3NlIHB1cmdlIGRlYWRsaW5lIGhhcyBwYXNzZWRcbiAgICogKGBkZWxldGVkQXQgSVMgTk9UIE5VTEwgQU5EIHB1cmdlX2FmdGVyIDwgbm93YCkuIEJhdGNoZWQgKGBsaW1pdGApIHNvIGFcbiAgICogc3dlZXAgdGljayBzdGF5cyBib3VuZGVkOyB0aGUgcGVyLXNlcnZpY2Ugc3dlZXAgbG9vcHMgdW50aWwgYSB0aWNrIHJldHVybnNcbiAgICogYDwgbGltaXRgLiBSdW5zIGFjcm9zcyBBTEwgb3Jncywgc28gY2FsbGVycyBNVVNUIGludm9rZSBpdCBmcm9tIGEgc3lzYWRtaW5cbiAgICogc2NvcGUgKGBydW5Tb2Z0RGVsZXRlUHVyZ2VgIGVzdGFibGlzaGVzIG9uZSkuIGBvbkJlZm9yZVB1cmdlKGlkcywgdHgpYCB0ZWFyc1xuICAgKiBkb3duIGRlcGVuZGVudHMgbGFja2luZyBPTiBERUxFVEUgQ0FTQ0FERSBpbnNpZGUgdGhlIHNhbWUgdHg7IGBvbkFmdGVyUHVyZ2VgXG4gICAqIGhhbmRsZXMgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBwdXJnZWQuIE5vLW9wICgwKSBmb3IgZW50aXRpZXMgd2l0aG91dCB0aGUgY29sdW1ucy5cbiAgICovXG4gIGFzeW5jIHB1cmdlRXhwaXJlZChub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQgfHwgIXRoaXMuY29scy5wdXJnZUFmdGVyKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHB1cmdlZElkcyA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IGRvb21lZCA9IGF3YWl0IHR4XG4gICAgICAgIC8vIGBhcyBhbnlgOiBjb2xzLmlkIGlzIHRoZSBiYXNlIGBBbnlDb2x1bW5gLCB3aGljaCBkcml6emxlJ3MgdHlwZWRcbiAgICAgICAgLy8gc2VsZWN0LWZpZWxkIG1hcCBkb2Vzbid0IGFjY2VwdCBkaXJlY3RseSAoc2FtZSBmcmljdGlvbiB0aGUgYC5zZXQoKWBcbiAgICAgICAgLy8gY2FzdHMgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSB3b3JrIGFyb3VuZCkuIFJlc3VsdCBpcyByZS10eXBlZCBiZWxvdy5cbiAgICAgICAgLnNlbGVjdCh7IGlkOiB0aGlzLmNvbHMuaWQgYXMgYW55IH0pXG4gICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAud2hlcmUoYW5kKHNxbGAke3RoaXMuY29scy5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCwgc3FsYCR7dGhpcy5jb2xzLnB1cmdlQWZ0ZXJ9IDwgJHtub3d9YCkpXG4gICAgICAgIC5saW1pdChsaW1pdClcbiAgICAgICAgLnRoZW4ociA9PiAociBhcyBBcnJheTx7IGlkOiB1bmtub3duIH0+KS5tYXAoZCA9PiBTdHJpbmcoZC5pZCkpKTtcblxuICAgICAgaWYgKGRvb21lZC5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgICAgLy8gRGVwZW5kZW50IHRlYXJkb3duIG11c3QgaGFwcGVuIGluc2lkZSB0aGUgc2FtZSB0eCBzbyBhIEZLLWJsb2NraW5nIGNoaWxkXG4gICAgICAvLyBjYW4ndCBzdHJhbmQgdGhlIHBhcmVudC4gQSB0aHJvdyBoZXJlIGFib3J0cyB0aGlzIGJhdGNoIChyZXRyaWVkIG5leHQgdGljaykuXG4gICAgICBhd2FpdCB0aGlzLm9uQmVmb3JlUHVyZ2UoZG9vbWVkLCB0eCk7XG5cbiAgICAgIGF3YWl0IHR4LmRlbGV0ZSh0aGlzLnNjaGVtYSkud2hlcmUoaW5BcnJheSh0aGlzLmNvbHMuaWQsIGRvb21lZCkpO1xuICAgICAgcmV0dXJuIGRvb21lZDtcbiAgICB9KTtcblxuICAgIGlmIChwdXJnZWRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUHVyZ2UocHVyZ2VkSWRzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1cmdlZElkcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogT24tZGVtYW5kIGhhcmQtZGVsZXRlIG9mIGEgU0lOR0xFIHRvbWJzdG9uZSBieSBpZCDigJQgdGhlIG1hbnVhbCBjb3VudGVycGFydFxuICAgKiB0byB0aGUgcmV0ZW50aW9uIHN3ZWVwJ3MgYHB1cmdlRXhwaXJlZGAuIFBlcm1hbmVudGx5IHJlbW92ZXMgdGhlIHJvdyBPTkxZXG4gICAqIHdoZW4gaXQgaXMgYSBnZW51aW5lIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKSxcbiAgICogb3B0aW9uYWxseSBwaW5uZWQgdG8gYG9yZ0lkYCAoYW4gb3JnSWQtbGVzcyBzeXNhZG1pbiBjb250ZXh0IHNwYW5zIG9yZ3MsXG4gICAqIG1hdGNoaW5nIHJlc3RvcmUvZGVsZXRlKS4gUnVucyB0aGUgc2FtZSBgb25CZWZvcmVQdXJnZWAgZGVwZW5kZW50IHRlYXJkb3duXG4gICAqIGluc2lkZSB0aGUgdHggYW5kIHRoZSBzYW1lIGBvbkFmdGVyUHVyZ2VgIHNpZGUtZWZmZWN0cyBhcyB0aGUgc3dlZXAuXG4gICAqXG4gICAqIElnbm9yZXMgYHB1cmdlQWZ0ZXJgOiBhIG1hbnVhbCBwdXJnZSBmaW5hbGl6ZXMgYW4gYWxyZWFkeS1zb2Z0LWRlbGV0ZWQgaXRlbVxuICAgKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcmV0ZW50aW9uIGRlYWRsaW5lLiBSZXR1cm5zIHRoZVxuICAgKiBwdXJnZWQgaWQsIG9yIG51bGwgd2hlbiB0aGVyZSBpcyBubyBzdWNoIHRvbWJzdG9uZSAoYWxyZWFkeSBhY3RpdmUsIHB1cmdlZCxcbiAgICogb3V0IG9mIHNjb3BlLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICovXG4gIGFzeW5jIHB1cmdlQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZCwgaWQpO1xuXG4gICAgY29uc3QgcHVyZ2VkSWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBbZG9vbWVkXSA9IGF3YWl0IHR4XG4gICAgICAgIC8vIGBhcyBhbnlgOiBjb2xzLmlkIGlzIHRoZSBiYXNlIGBBbnlDb2x1bW5gLCB3aGljaCBkcml6emxlJ3MgdHlwZWRcbiAgICAgICAgLy8gc2VsZWN0LWZpZWxkIG1hcCBkb2Vzbid0IGFjY2VwdCBkaXJlY3RseSAoc2FtZSBmcmljdGlvbiBlbHNld2hlcmUpLlxuICAgICAgICAuc2VsZWN0KHsgaWQ6IHRoaXMuY29scy5pZCBhcyBhbnkgfSlcbiAgICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAudGhlbihyID0+IChyIGFzIEFycmF5PHsgaWQ6IHVua25vd24gfT4pLm1hcChkID0+IFN0cmluZyhkLmlkKSkpO1xuXG4gICAgICBpZiAoIWRvb21lZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIC8vIERlcGVuZGVudCB0ZWFyZG93biBpbiB0aGUgc2FtZSB0eCAoRkstYmxvY2tpbmcgY2hpbGRyZW4gY2FuJ3Qgc3RyYW5kXG4gICAgICAvLyB0aGUgcGFyZW50KSDigJQgaWRlbnRpY2FsIHRvIHRoZSBzd2VlcCdzIHBlci1iYXRjaCBwYXRoLlxuICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZVB1cmdlKFtkb29tZWRdLCB0eCk7XG4gICAgICBhd2FpdCB0eC5kZWxldGUodGhpcy5zY2hlbWEpLndoZXJlKGluQXJyYXkodGhpcy5jb2xzLmlkLCBbZG9vbWVkXSkpO1xuICAgICAgcmV0dXJuIGRvb21lZDtcbiAgICB9KTtcblxuICAgIGlmIChwdXJnZWRJZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUHVyZ2UoW3B1cmdlZElkXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwdXJnZWRJZDtcbiAgfVxufVxuIl19
|
|
873
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc5Rjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUksSUFBYTtJQUMxQyxPQUFPLElBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxPQUFPLElBQTJCLENBQUM7QUFDckMsQ0FBQztBQXlHRCxxRkFBcUY7QUFDckYsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7QUFFMUM7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxRQUF1QixFQUFFLEVBQVU7SUFDdkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFZLElBQUksQ0FBQyxLQUFLLENBQUMs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QU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IENvbmZsaWN0RXJyb3IsIE5vdEZvdW5kRXJyb3IsIGNyZWF0ZUxvZ2dlciwgREVGQVVMVF9QQUdFX0xJTUlULCBNQVhfUEFHRV9MSU1JVCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IFNRTCwgZXEsIGFuZCwgb3IsIGFzYywgZGVzYywgc3FsLCBpbkFycmF5LCBnZXRUYWJsZUNvbHVtbnMgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQgdHlwZSB7IFBnVGFibGUgfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQsIGdldFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuXG4vKipcbiAqIENhc3QgRHJpenpsZSBxdWVyeSByZXN1bHRzIHRvIGEgdHlwZWQgYXJyYXkuXG4gKiBEcml6emxlJ3MgZ2VuZXJpYyByZXR1cm4gdHlwZSAoYFBnU2VsZWN0QmFzZTwuLi4+YCkgZG9lc24ndCBuYXJyb3cgdG8gb3VyXG4gKiBlbnRpdHkgZ2VuZXJpY3MsIHNvIGFuIGV4cGxpY2l0IGNhc3QgaXMgbmVlZGVkLiBDZW50cmFsaXNlZCBoZXJlIHNvIGV2ZXJ5XG4gKiBjYWxsLXNpdGUgc3RheXMgb25lLWxpbmVyIGNsZWFuIGFuZCB0aGUgY2FzdCBpcyBkb2N1bWVudGVkIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVSb3dzPFQ+KHJvd3M6IHVua25vd24pOiBUW10ge1xuICByZXR1cm4gcm93cyBhcyBUW107XG59XG5cbi8qKiBDYXN0IGEgRHJpenpsZSBhZ2dyZWdhdGUgcmVzdWx0IHRvIGV4dHJhY3QgYFt7IGNvdW50OiBudW1iZXIgfV1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVDb3VudChyb3dzOiB1bmtub3duKTogW3sgY291bnQ6IG51bWJlciB9XSB7XG4gIHJldHVybiByb3dzIGFzIFt7IGNvdW50OiBudW1iZXIgfV07XG59XG5cbi8qKiBUaGUgRHJpenpsZSB0cmFuc2FjdGlvbiBvYmplY3QgaGFuZGVkIHRvIGB3aXRoVGVuYW50VHhgIGNhbGxiYWNrcy4gUGFzc2VkIHRvXG4gKiAgYG9uQmVmb3JlUHVyZ2VgIHNvIGEgc3ViY2xhc3MncyBkZXBlbmRlbnQgdGVhcmRvd24gcnVucyBpbiB0aGUgU0FNRSBwdXJnZVxuICogIHRyYW5zYWN0aW9uIChhdG9taWMgd2l0aCB0aGUgcGFyZW50IERFTEVURSksIG5vdCBhIGZyZXNoIGNvbm5lY3Rpb24uICovXG5leHBvcnQgdHlwZSBDcnVkVHggPSBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIHdpdGhUZW5hbnRUeD5bMF0+WzBdO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBlbnRpdGllcyB3aXRoIGNvbW1vbiBmaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgaXNEZWZhdWx0OiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRBdDogRGF0ZTtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHVwZGF0ZWRCeTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIHNvcnRCeT86IHN0cmluZztcbiAgc29ydE9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8qKiBXaGVuIHRydWUsIHJ1bnMgYSBzZXBhcmF0ZSBDT1VOVCgqKSBxdWVyeSB0byBpbmNsdWRlIGV4YWN0IHRvdGFsLiBEZWZhdWx0OiBmYWxzZS4gKi9cbiAgaW5jbHVkZVRvdGFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEtleXNldCBwYWdpbmF0aW9uOiB0aGUgb3BhcXVlIGBuZXh0Q3Vyc29yYCBvZiB0aGUgcHJldmlvdXMgcGFnZS4gQ29udGludWVzXG4gICAqIHN0cmljdGx5IGFmdGVyIHRoYXQgcm93IGluIChzb3J0QnksIGlkKSBvcmRlcjsgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBvZmZzZXRgLlxuICAgKi9cbiAgY3Vyc29yPzogc3RyaW5nO1xuICAvKiogU3BhcnNlIGZpZWxkc2V0OiBjb2x1bW4gbmFtZXMgdG8gc2VsZWN0LiBSZXR1cm5zIGFsbCBjb2x1bW5zIHdoZW4gb21pdHRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFnaW5hdGVkIHJlc3VsdCB3aXRoIG1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVkUmVzdWx0PFQ+IHtcbiAgZGF0YTogVFtdO1xuICAvKiogVG90YWwgY291bnQgb2YgbWF0Y2hpbmcgZW50aXRpZXMuIE9ubHkgcHJlc2VudCB3aGVuIGluY2x1ZGVUb3RhbCBpcyB0cnVlLiAqL1xuICB0b3RhbD86IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbiAgb2Zmc2V0OiBudW1iZXI7XG4gIGhhc01vcmU6IGJvb2xlYW47XG4gIC8qKiBPcGFxdWUgY3Vyc29yIGZvciB0aGUgbmV4dCBwYWdlLiBQcmVzZW50IG9ubHkgd2hlbiBgaGFzTW9yZWAuICovXG4gIG5leHRDdXJzb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQ1JVRCBzZXJ2aWNlIHdpdGggbXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIGFuZCBwYWdpbmF0aW9uLlxuICpcbiAqIFN1YmNsYXNzZXMgYmluZCB0byBhIHNwZWNpZmljIERyaXp6bGUgdGFibGUgYnkgaW1wbGVtZW50aW5nIGBzY2hlbWFgLFxuICogYGJ1aWxkQ29uZGl0aW9uc2AsIGBnZXRTb3J0Q29sdW1uYCwgYW5kIHRoZSBvcmcvcHJvamVjdC1jb2x1bW4gYWNjZXNzb3JzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEVudGl0eSAtIEVudGl0eSB0eXBlIGV4dGVuZGluZyBCYXNlRW50aXR5XG4gKiBAdHlwZVBhcmFtIFRGaWx0ZXIgLSBGaWx0ZXIgdHlwZSBmb3IgcXVlcnkgcGFyYW1ldGVyc1xuICogQHR5cGVQYXJhbSBUSW5zZXJ0IC0gSW5zZXJ0IERUTyB0eXBlXG4gKiBAdHlwZVBhcmFtIFRVcGRhdGUgLSBVcGRhdGUgRFRPIHR5cGVcbiAqXG4gKiAqKkEgbm90ZSBvbiB0aGUgdHlwZSBjYXN0cy4qKiBEcml6emxlJ3Mgcm93IHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tXG4gKiBgcGdUYWJsZSguLi4pYCBhbmQgZG9uJ3QgZ2VuZXJpY2FsbHkgbmFycm93IHRocm91Z2ggdGhlIGFic3RyYWN0IGBzY2hlbWFgXG4gKiBnZXR0ZXIsIHNvIHRoZSBiYXNlIGNsYXNzIGNhc3RzIHF1ZXJ5IHJlc3VsdHMgdG8gYFRFbnRpdHlgIGFuZCBiYWNrLiBUaGVcbiAqIGNhc3QgaXMgKm5vdCogYSBydW50aW1lIHNhZmV0eSBndWFyYW50ZWUg4oCUIGl0IHJlbGllcyBvbiBlYWNoIHN1YmNsYXNzXG4gKiBwYXNzaW5nIHRoZSBtYXRjaGluZyBlbnRpdHkgdHlwZS4gT3JnLXNjb3BpbmcgaXMgZW5mb3JjZWQgYnkgZXZlcnlcbiAqIHN1YmNsYXNzJ3MgYGJ1aWxkQ29uZGl0aW9uc2AgaW5qZWN0aW5nIGBXSEVSRSBvcmdfaWQgPSAkMWA7IHRoaXMgY2xhc3NcbiAqIGRvZXMgbm90IGFkZCB0aGF0IGZpbHRlciBpdHNlbGYuXG4gKlxuICogKipFcnJvciBwb2xpY3kuKiogRXJyb3JzIHByb3BhZ2F0ZSB1cCB0byB0aGUgcm91dGUtbGV2ZWwgaGFuZGxlclxuICogKGB3aXRoUm91dGVgKTsgbm8gY2F0Y2gtYW5kLXN3YWxsb3cgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgUGlwZWxpbmVTZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2U8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyLCBQaXBlbGluZUluc2VydCwgUGlwZWxpbmVVcGRhdGU+IHtcbiAqICAgcHJvdGVjdGVkIGdldCBzY2hlbWEoKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmU7IH1cbiAqICAgcHJvdGVjdGVkIGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKSB7IHJldHVybiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKTsgfVxuICogICBwcm90ZWN0ZWQgZ2V0U29ydENvbHVtbihzb3J0QnkpIHsgcmV0dXJuIHNvcnRDb2x1bW5NYXBbc29ydEJ5XSA/PyBudWxsOyB9XG4gKiAgIHByb3RlY3RlZCBnZXRQcm9qZWN0Q29sdW1uKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lLnByb2plY3Q7IH1cbiAqICAgcHJvdGVjdGVkIGdldE9yZ0NvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5vcmdJZDsgfVxuICogfVxuICogYGBgXG4gKi9cbi8qKiBTdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIHN1YmNsYXNzIHRhYmxlJ3MgY29sdW1ucyB0aGUgYmFzZSBjbGFzcyB0b3VjaGVzXG4gKiAgZGlyZWN0bHkuIGBpZGAvYGlzQWN0aXZlYC9gaXNEZWZhdWx0YCBhcmUgYWx3YXlzIHByZXNlbnQgb24gYSBDUlVEIGVudGl0eTtcbiAqICBgdmlzaWJpbGl0eWAgb25seSBvbiB2aXNpYmlsaXR5LWJlYXJpbmcgZW50aXRpZXM7IHRoZSBpbmRleCBzaWduYXR1cmVcbiAqICBjb3ZlcnMgZHluYW1pYyAoc3BhcnNlLWZpZWxkc2V0KSBjb2x1bW4gYWNjZXNzLiAqL1xuaW50ZXJmYWNlIENydWRDb2x1bW5zIHtcbiAgaWQ6IEFueUNvbHVtbjtcbiAgaXNBY3RpdmU6IEFueUNvbHVtbjtcbiAgaXNEZWZhdWx0OiBBbnlDb2x1bW47XG4gIHZpc2liaWxpdHk/OiBBbnlDb2x1bW47XG4gIC8qKiBBdXRob3IgY29sdW1uIOKAlCB0aGUgYHByaXZhdGVgIHJ1bmcgb2YgdGhlIHZpc2liaWxpdHkgbGFkZGVyIGlzIGF1dGhvci1vbmx5LiAqL1xuICBjcmVhdGVkQnk/OiBBbnlDb2x1bW47XG4gIC8vIFNvZnQtZGVsZXRlIGxpZmVjeWNsZSBjb2x1bW5zIChwcmVzZW50IG9uIHRvbWJzdG9uZS1iZWFyaW5nIGVudGl0aWVzIG9ubHk7XG4gIC8vIGByZXN0b3JlYC9gcHVyZ2VFeHBpcmVkYCBhcmUgbm8tb3BzIHdoZW4gYWJzZW50KS5cbiAgZGVsZXRlZEF0PzogQW55Q29sdW1uO1xuICBwdXJnZUFmdGVyPzogQW55Q29sdW1uO1xuICBba2V5OiBzdHJpbmddOiBBbnlDb2x1bW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBQcm9qZWN0aW9uIGFsaWFzIGNhcnJ5aW5nIHRoZSBzb3J0IGNvbHVtbidzIGV4YWN0IERCIHRleHQgZm9yIHRoZSBuZXh0IGN1cnNvci4gKi9cbmNvbnN0IENVUlNPUl9TT1JUX0tFWSA9ICdfX2N1cnNvclNvcnRLZXknO1xuXG4vKipcbiAqIE9wYXF1ZSBrZXlzZXQgY3Vyc29yOiB0aGUgbGFzdCByb3cncyBzb3J0IHZhbHVlIGFzIFBvc3RncmVzIFRFWFQgKGZ1bGxcbiAqIHByZWNpc2lvbiDigJQgYSBKUyBgRGF0ZWAgd291bGQgdHJ1bmNhdGUgYHRpbWVzdGFtcHR6YCBtaWNyb3NlY29uZHMgdG8gbXMsIHNvXG4gKiBgY3JlYXRlZF9hdCA+ICc8bXM+J2AgcmUtcmV0dXJucyBvciBza2lwcyByb3dzIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kKSBwbHVzXG4gKiBpdHMgYGlkYCBhcyB0aGUgdGllLWJyZWFrZXIuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUN1cnNvcihzb3J0VGV4dDogc3RyaW5nIHwgbnVsbCwgaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShbc29ydFRleHQsIGlkXSksICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xufVxuXG4vKiogRGVjb2RlIGEgY3Vyc29yIHByb2R1Y2VkIGJ5IHtAbGluayBlbmNvZGVDdXJzb3J9OyBgbnVsbGAgd2hlbiBtYWxmb3JtZWQuICovXG5mdW5jdGlvbiBkZWNvZGVDdXJzb3IoY3Vyc29yOiBzdHJpbmcpOiB7IHNvcnRUZXh0OiBzdHJpbmcgfCBudWxsOyBpZDogc3RyaW5nIH0gfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQ6IHVua25vd24gPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGN1cnNvciwgJ2Jhc2U2NHVybCcpLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIGlmIChcbiAgICAgIEFycmF5LmlzQXJyYXkocGFyc2VkKSAmJiBwYXJzZWQubGVuZ3RoID09PSAyXG4gICAgICAmJiAocGFyc2VkWzBdID09PSBudWxsIHx8IHR5cGVvZiBwYXJzZWRbMF0gPT09ICdzdHJpbmcnKVxuICAgICAgJiYgdHlwZW9mIHBhcnNlZFsxXSA9PT0gJ3N0cmluZycgJiYgcGFyc2VkWzFdLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHJldHVybiB7IHNvcnRUZXh0OiBwYXJzZWRbMF0sIGlkOiBwYXJzZWRbMV0gfTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBVVUlEX1RFWFQgPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcbi8qKiBQb3N0Z3JlcyBgdGltZXN0YW1wW3R6XTo6dGV4dGAgLyBgZGF0ZTo6dGV4dGAgKGFsc28gYWNjZXB0cyBJU08tODYwMSkuICovXG5jb25zdCBUSU1FU1RBTVBfVEVYVCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0oPzpbIFRdXFxkezJ9OlxcZHsyfSg/OjpcXGR7Mn0oPzpcXC5cXGR7MSw2fSk/KT8oPzpafFsrLV1cXGR7Mn0oPzo6P1xcZHsyfSk/KT8pPyQvO1xuY29uc3QgTlVNRVJJQ19URVhUID0gL14tP1xcZCsoPzpcXC5cXGQrKT8oPzpbZUVdWy0rXT9cXGQrKT8kLztcblxuLyoqXG4gKiBXaGV0aGVyIGB0ZXh0YCBjYW4gYmUgY2FzdCB0byBgY29sdW1uYCdzIHR5cGUuIEEgZGVjb2RlZCBjdXJzb3IgaXMgc3RpbGxcbiAqIGNsaWVudCBpbnB1dDogYSB2YWx1ZSBQb3N0Z3JlcyBjYW4ndCBjYXN0IChhIG5vbi1VVUlEIGlkLCBhIGdhcmJhZ2VcbiAqIHRpbWVzdGFtcCkgZmFpbHMgdGhlIHdob2xlIHF1ZXJ5IHdpdGggYSA1MDAuIENvbHVtbiB0eXBlcyB0aGlzIGRvZXNuJ3Qga25vd1xuICogKHRleHQsIHZhcmNoYXIsIOKApikgYWNjZXB0IGFueSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzQ2FzdGFibGVUbyhjb2x1bW46IEFueUNvbHVtbiwgdGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgY29sdW1uVHlwZSwgZGF0YVR5cGUgfSA9IGNvbHVtbjtcbiAgY29uc3QgZW51bVZhbHVlcyA9IChjb2x1bW4gYXMgeyBlbnVtVmFsdWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfSkuZW51bVZhbHVlcztcbiAgaWYgKGNvbHVtblR5cGUgPT09ICdQZ1VVSUQnKSByZXR1cm4gVVVJRF9URVhULnRlc3QodGV4dCk7XG4gIGlmICgoY29sdW1uVHlwZSA9PT0gJ1BnRW51bUNvbHVtbicgfHwgY29sdW1uVHlwZSA9PT0gJ1BnRW51bU9iamVjdENvbHVtbicpICYmIGVudW1WYWx1ZXM/Lmxlbmd0aCkgcmV0dXJuIGVudW1WYWx1ZXMuaW5jbHVkZXModGV4dCk7XG4gIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGUnIHx8IGNvbHVtblR5cGUgPT09ICdQZ1RpbWVzdGFtcFN0cmluZycgfHwgY29sdW1uVHlwZSA9PT0gJ1BnRGF0ZVN0cmluZycpIHJldHVybiBUSU1FU1RBTVBfVEVYVC50ZXN0KHRleHQpO1xuICBpZiAoZGF0YVR5cGUgPT09ICdib29sZWFuJykgcmV0dXJuIHRleHQgPT09ICd0cnVlJyB8fCB0ZXh0ID09PSAnZmFsc2UnO1xuICBpZiAoZGF0YVR5cGUgPT09ICdudW1iZXInIHx8IGRhdGFUeXBlID09PSAnYmlnaW50JykgcmV0dXJuIE5VTUVSSUNfVEVYVC50ZXN0KHRleHQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBLZXlzZXQgcHJlZGljYXRlIFwic3RyaWN0bHkgYWZ0ZXIgKHNvcnRUZXh0LCBpZClcIiBmb3IgYE9SREVSIEJZIHNvcnQgPGRpcj4sIGlkIDxkaXI+YFxuICogdW5kZXIgUG9zdGdyZXMnIGRlZmF1bHQgbnVsbCBwbGFjZW1lbnQgKEFTQyDihpIgTlVMTFMgTEFTVCwgREVTQyDihpIgTlVMTFMgRklSU1QpLlxuICogVGhlIHRleHQgdmFsdWUgaXMgYm91bmQgYXMgYSBwYXJhbWV0ZXIgY29tcGFyZWQgYWdhaW5zdCB0aGUgY29sdW1uLCBzbyBQb3N0Z3Jlc1xuICogY2FzdHMgaXQgYmFjayB0byB0aGUgY29sdW1uJ3MgdHlwZSBhdCBmdWxsIHByZWNpc2lvbi5cbiAqL1xuZnVuY3Rpb24ga2V5c2V0QWZ0ZXIoXG4gIHNvcnRDb2x1bW46IEFueUNvbHVtbixcbiAgaWRDb2x1bW46IEFueUNvbHVtbixcbiAgc29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJyxcbiAgc29ydFRleHQ6IHN0cmluZyB8IG51bGwsXG4gIGlkOiBzdHJpbmcsXG4pOiBTUUwge1xuICBpZiAoc29ydENvbHVtbiA9PT0gaWRDb2x1bW4pIHtcbiAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYycgPyBzcWxgJHtpZENvbHVtbn0gPCAke2lkfWAgOiBzcWxgJHtpZENvbHVtbn0gPiAke2lkfWA7XG4gIH1cbiAgaWYgKHNvcnRPcmRlciA9PT0gJ2FzYycpIHtcbiAgICByZXR1cm4gc29ydFRleHQgPT09IG51bGxcbiAgICAgID8gc3FsYCgke3NvcnRDb2x1bW59IElTIE5VTEwgQU5EICR7aWRDb2x1bW59ID4gJHtpZH0pYFxuICAgICAgOiBzcWxgKCR7c29ydENvbHVtbn0gPiAke3NvcnRUZXh0fSBPUiAoJHtzb3J0Q29sdW1ufSA9ICR7c29ydFRleHR9IEFORCAke2lkQ29sdW1ufSA+ICR7aWR9KSBPUiAke3NvcnRDb2x1bW59IElTIE5VTEwpYDtcbiAgfVxuICByZXR1cm4gc29ydFRleHQgPT09IG51bGxcbiAgICA/IHNxbGAoJHtzb3J0Q29sdW1ufSBJUyBOT1QgTlVMTCBPUiAoJHtzb3J0Q29sdW1ufSBJUyBOVUxMIEFORCAke2lkQ29sdW1ufSA8ICR7aWR9KSlgXG4gICAgOiBzcWxgKCR7c29ydENvbHVtbn0gPCAke3NvcnRUZXh0fSBPUiAoJHtzb3J0Q29sdW1ufSA9ICR7c29ydFRleHR9IEFORCAke2lkQ29sdW1ufSA8ICR7aWR9KSlgO1xufVxuXG4vKipcbiAqIFJldGVudGlvbiBiZWZvcmUgYSBzb2Z0LWRlbGV0ZWQgcm93IGJlY29tZXMgcHVyZ2UtZWxpZ2libGUsIHNoYXJlZCBhY3Jvc3NcbiAqIGV2ZXJ5IENydWRTZXJ2aWNlIGVudGl0eSAodW5pZmllZCBgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLCBkZWZhdWx0IDMwZCkuXG4gKiBTdGFtcGVkIGludG8gYHB1cmdlX2FmdGVyYCBhdCBkZWxldGUgdGltZTsgdGhlIHBlci1zZXJ2aWNlIHB1cmdlIHN3ZWVwIGhhcmQtXG4gKiBkZWxldGVzIHRvbWJzdG9uZXMgb25jZSBpdCBoYXMgcGFzc2VkLiBgMGAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcuXG4gKi9cbmNvbnN0IFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUyA9IE1hdGgubWF4KDAsIE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5TT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZUyA/PyAnMzAnLCAxMCkgfHwgMCkgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogVGhlIHNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gd2luZG93IGluIG1zIChgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLFxuICogIGRlZmF1bHQgMzBkOyAwIGRpc2FibGVzIHB1cmdlLWRlYWRsaW5lIHN0YW1waW5nKS4gRXhwb3NlZCBzbyBub24tQ3J1ZFNlcnZpY2VcbiAqICBzb2Z0LWRlbGV0ZSBwYXRocyAoZS5nLiBwbGF0Zm9ybSdzIGhhbmQtcm9sbGVkIGRhc2hib2FyZC9hbGVydCBzZXJ2aWNlcylcbiAqICBzdGFtcCBgcHVyZ2VfYWZ0ZXJgIHdpdGggdGhlIFNBTUUgd2luZG93IHRoZSBDcnVkU2VydmljZSBlbnRpdGllcyB1c2UuICovXG5leHBvcnQgZnVuY3Rpb24gc29mdERlbGV0ZVJldGVudGlvbk1zKCk6IG51bWJlciB7XG4gIHJldHVybiBTT0ZUX0RFTEVURV9SRVRFTlRJT05fTVM7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcnVkU2VydmljZTxcbiAgVEVudGl0eSBleHRlbmRzIEJhc2VFbnRpdHksXG4gIFRGaWx0ZXIsXG4gIFRJbnNlcnQsXG4gIFRVcGRhdGUsXG4+IHtcbiAgLyoqIERyaXp6bGUgc2NoZW1hIHRhYmxlIGZvciB0aGlzIGVudGl0eSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHNjaGVtYSgpOiBQZ1RhYmxlO1xuXG4gIC8qKlxuICAgKiBUeXBlZCBjb2x1bW4gdmlldyBvZiB7QGxpbmsgc2NoZW1hfS4gYFBnVGFibGVgIGV4cG9zZXMgbm8gc3RhdGljIGNvbHVtbnMsIHNvXG4gICAqIHRoZSBiYXNlIGNsYXNzIHByZXZpb3VzbHkgcmVhY2hlZCBmb3IgYCh0aGlzLnNjaGVtYSBhcyBhbnkpLmlkYCBldGMuIGF0IGVhY2hcbiAgICogdXNlOyBjZW50cmFsaXplIHRoYXQgc2luZ2xlIHVuYXZvaWRhYmxlIGNhc3QgaGVyZSBzbyBjYWxsZXJzIGdldCBzdHJ1Y3R1cmVkLFxuICAgKiB0eXBlZCBhY2Nlc3MgaW5zdGVhZC4gYHZpc2liaWxpdHlgIGlzIG9wdGlvbmFsIChub3QgZXZlcnkgZW50aXR5IGhhcyBpdClcbiAgICogYW5kIHRoZSBpbmRleCBzaWduYXR1cmUgY292ZXJzIGR5bmFtaWMgc3BhcnNlLWZpZWxkc2V0IGNvbHVtbiBsb29rdXAuXG4gICAqL1xuICBwcml2YXRlIGdldCBjb2xzKCk6IENydWRDb2x1bW5zIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEgYXMgdW5rbm93biBhcyBDcnVkQ29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgZmlsdGVyaW5nIGVudGl0aWVzLlxuICAgKiBgcGFyZW50T3JnSWRgIChvcmcg4oaSIHRlYW0gaGllcmFyY2h5KSBpcyBvcHRpb25hbCBhbmQgb25seSBob25vcmVkIGJ5XG4gICAqIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gcGFyZW50LWluaGVyaXRlZCB2aXNpYmlsaXR5IChlLmcuIHBsdWdpbnMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdO1xuXG4gIC8qKiBHZXQgdGhlIHNjaGVtYSBjb2x1bW4gZm9yIHNvcnRpbmcgYnkgZmllbGQgbmFtZSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U29ydENvbHVtbihzb3J0Qnk6IHN0cmluZyk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqIEdldCB0aGUgcHJvamVjdCBjb2x1bW4gZm9yIHNldERlZmF1bHQgc2NvcGluZyAobnVsbCBpZiBlbnRpdHkgaGFzIG5vIHByb2plY3Qgc2NvcGUpICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9qZWN0Q29sdW1uKCk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGVuYW50IG9yZy1pZCBjb2x1bW4uIFVzZWQgYm90aCB0byBzY29wZSBgc2V0RGVmYXVsdGAgYW5kIHRvIHBpblxuICAgKiBldmVyeSB3cml0ZSAodXBkYXRlL2RlbGV0ZS9idWxrRGVsZXRlKSB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyDigJQgc28gaXQgTVVTVFxuICAgKiBiZSB0aGUgdGVuYW50IGBvcmdJZGAgY29sdW1uLCBub3QgYSBkaXNwbGF5L25hbWUgY29sdW1uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE9yZ0NvbHVtbigpOiBBbnlDb2x1bW47XG5cbiAgLyoqIFRoZSB1bmlxdWUtY29uc3RyYWludCBjb2x1bW5zIGEgY3JlYXRlIG11c3Qgbm90IGNvbmZsaWN0IG9uIChzZWUge0BsaW5rIGNyZWF0ZX0pLiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IGNvbmZsaWN0VGFyZ2V0KCk6IEFueUNvbHVtbltdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY3J1ZC1zZXJ2aWNlJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRmFpbCBmYXN0IGlmIGEgc3ViY2xhc3MgZG9lc24ndCBleHBvc2UgYSB0ZW5hbnQgb3JnIGNvbHVtbi4gVGhlIHdyaXRlXG4gICAgLy8gcGF0aHMgKHdyaXRlQ29uZGl0aW9ucyAvIGJ1bGtEZWxldGUpIHBpbiBtdXRhdGlvbnMgdG8gdGhlIGNhbGxlcidzIG93blxuICAgIC8vIG9yZyB0aHJvdWdoIGl0OyBhIG1pc3NpbmcgY29sdW1uIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhhdCBndWFyZCDigJQgYVxuICAgIC8vIGNyb3NzLXRlbmFudCBmYWlsLW9wZW4g4oCUIHNvIGFzc2VydCBpdHMgcHJlc2VuY2UgdXAgZnJvbnQuXG4gICAgaWYgKHRoaXMuZ2V0T3JnQ29sdW1uKCkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGdldE9yZ0NvbHVtbigpIG11c3QgcmV0dXJuIHRoZSB0ZW5hbnQgb3JnIGNvbHVtbmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBjb25kaXRpb25zIGZvciBhIHNpbmdsZSBlbnRpdHkgYnkgSUQuXG4gICAqICBgcGFyZW50T3JnSWRgIHdpZGVucyB2aXNpYmlsaXR5IHRvIGEgcGFyZW50IG9yZydzIHB1YmxpYyByb3dzIChvcmcg4oaSIHRlYW1cbiAgICogIGhpZXJhcmNoeSkg4oCUIHNhbWUgb3B0LWluIHNlbWFudGljcyBhcyBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgLiBPbWl0dGVkIGJ5IHRoZVxuICAgKiAgd3JpdGUgcGF0aCAoYHdyaXRlQ29uZGl0aW9uc2ApLCB3aGljaCBtdXN0IHN0YXkgb3duLW9yZyBzY29wZWQuICovXG4gIHByaXZhdGUgaWRDb25kaXRpb25zKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbmRpdGlvbnMoeyBpZCB9IGFzIHVua25vd24gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25kaXRpb25zIGZvciBhIE1VVEFUSU9OICh1cGRhdGUvZGVsZXRlKSBvZiBhIHNpbmdsZSBlbnRpdHkuXG4gICAqXG4gICAqIGBpZENvbmRpdGlvbnNgIHJldXNlcyB0aGUgUkVBRCBhY2Nlc3MtY29udHJvbCBjbGF1c2UsIHdoaWNoIGFsc28gbWF0Y2hlc1xuICAgKiBzeXN0ZW0tb3JnIC8gb3RoZXItb3JnIFBVQkxJQyByZWNvcmRzIOKAlCBzbyB3aXRob3V0IGFuIGV4dHJhIG93bmVyc2hpcCBwaW4gYW55XG4gICAqIHRlbmFudCBjb3VsZCB1cGRhdGUgb3Igc29mdC1kZWxldGUgYW5vdGhlciBvcmcncyAob3IgdGhlIHN5c3RlbSBvcmcncykgcHVibGljXG4gICAqIHJlY29yZHMuIEFORCBhIHN0cmljdCBgb3JnSWQgPT09IGNhbGxlcmAgcHJlZGljYXRlOiB0aGUgcmVhZCBjbGF1c2Unc1xuICAgKiBwdWJsaWMtT1IgYnJhbmNoIHJlcXVpcmVzIGBvcmdfaWQgPSAnc3lzdGVtJ2AsIHdoaWNoIHRoZW4gY2FuJ3QgYmUgc2F0aXNmaWVkLFxuICAgKiBsZWF2aW5nIG9ubHkgb3duLW9yZyByb3dzLiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwcyBmdWxsIGFjY2Vzcy5cbiAgICovXG4gIHByaXZhdGUgd3JpdGVDb25kaXRpb25zKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmlkQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIC8vIFBpbiB0aGUgbXV0YXRpb24gdG8gdGhlIGNhbGxlcidzIG93biBvcmcgdmlhIHRoZSB0ZW5hbnQgY29sdW1uXG4gICAgLy8gKGdldE9yZ0NvbHVtbiwgYXNzZXJ0ZWQgbm9uLW51bGwgaW4gdGhlIGNvbnN0cnVjdG9yKSDigJQgY29uc2lzdGVudCB3aXRoXG4gICAgLy8gc2V0RGVmYXVsdCBhbmQgd2l0aG91dCB0aGUgb2xkIHNpbGVudCBmYWlsLW9wZW4gd2hlbiB0aGUgcHJvcGVydHkgd2FzIGFic2VudC5cbiAgICBpZiAob3JnSWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCkpO1xuICAgIC8vIEZvcmNlIEVYQUNUIGlkIGVxdWFsaXR5IG9uIHRoZSBtdXRhdGlvbiBwYXRoLiBgaWRDb25kaXRpb25zYCByZXVzZXMgdGhlXG4gICAgLy8gbGlzdC1maWx0ZXIgY2xhdXNlLCB3aG9zZSBgYnVpbGRJZEZpbHRlcmAgUFJFRklYLW1hdGNoZXMgKGBpZDo6dGV4dCBMSUtFXG4gICAgLy8gJ3ZhbCUnYCkgYW55IG5vbi1mdWxsLVVVSUQgdmFsdWUg4oCUIHNvIGEgcGFydGlhbCBpZCAoYERFTEVURSAveC9hYmApIHdvdWxkXG4gICAgLy8gc29mdC1kZWxldGUvbXV0YXRlIEVWRVJZIG93bi1vcmcgcm93IHdob3NlIGlkIHN0YXJ0cyB3aXRoIGBhYmAgYW5kIHJlcG9ydFxuICAgIC8vIHRvdWNoaW5nIG9uZS4gQU5EaW5nIGFuIGV4YWN0IGBpZCA9IHZhbGAgY29sbGFwc2VzIHRoZSBwcmVmaXggY2xhdXNlIHRvIGF0XG4gICAgLy8gbW9zdCB0aGUgc2luZ2xlIGV4YWN0IHJvdzsgYSBtYWxmb3JtZWQvcGFydGlhbCBpZCB0aGVuIG1hdGNoZXMgbm90aGluZ1xuICAgIC8vICjihpIgNDA0IHZpYSB0aGUgY2FsbGVycycgYGlmICghZGVsZXRlZClgIGd1YXJkKSBpbnN0ZWFkIG9mIG1hc3MtbXV0YXRpbmcuXG4gICAgY29uZGl0aW9ucy5wdXNoKHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgLyoqIEV4YWN0IGlkIGVxdWFsaXR5LCBsb3dlci1jYXNlZCB0byBtYXRjaCBgYnVpbGRJZEZpbHRlcmAncyBmdWxsLVVVSUQgYnJhbmNoLlxuICAgKiAgYHNjaGVtYWAgaXMgdHlwZWQgYFBnVGFibGVgIChubyBzdGF0aWMgYC5pZGApLCBzbyBjYXN0IOKAlCBzYW1lIHBhdHRlcm4gdGhlXG4gICAqICBzb3J0L2RlZmF1bHQgaGVscGVycyB1c2UgZm9yIGNvbHVtbiBhY2Nlc3MuICovXG4gIHByaXZhdGUgZXhhY3RJZENvbmRpdGlvbihpZDogc3RyaW5nKTogU1FMIHtcbiAgICByZXR1cm4gZXEodGhpcy5jb2xzLmlkLCBTdHJpbmcoaWQpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgLy8gTGlmZWN5Y2xlIGhvb2tzIOKAlCBvdmVycmlkZSBpbiBzdWJjbGFzc2VzIHRvIHJlYWN0IHRvIG11dGF0aW9uc1xuICAvLyBUaGVzZSBhcmUgZmlyZS1hbmQtZm9yZ2V0OiBlcnJvcnMgYXJlIGxvZ2dlZCBidXQgbmV2ZXIgYmxvY2sgdGhlIGNhbGxlci5cblxuICAvKiogQ2FsbGVkIGFmdGVyIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyQ3JlYXRlKF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGFuIGVudGl0eSBpcyB1cGRhdGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyVXBkYXRlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhbiBlbnRpdHkgaXMgc29mdC1kZWxldGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyRGVsZXRlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhIHNvZnQtZGVsZXRlZCBlbnRpdHkgaXMgcmVzdG9yZWQgKHVuZG8gdGhlIGRlbGV0ZSkuIE92ZXJyaWRlXG4gICAqICBmb3IgZW50aXRpZXMgd2hvc2UgcmVzdG9yZSBoYXMgc2lkZS1lZmZlY3RzIChlLmcuIHJlLW5vdGlmeSkuIEJlc3QtZWZmb3J0LiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclJlc3RvcmUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIHdpdGggdGhlIGlkcyBhYm91dCB0byBiZSBoYXJkLXB1cmdlZCwgQkVGT1JFIHRoZSBkZWxldGUsIGluc2lkZSB0aGVcbiAgICogIHB1cmdlIHRyYW5zYWN0aW9uIChgdHhgKSDigJQgYSBzdWJjbGFzcyB0ZWFyaW5nIGRvd24gZGVwZW5kZW50cyB0aGF0IGxhY2sgT05cbiAgICogIERFTEVURSBDQVNDQURFIE1VU1QgdXNlIGB0eGAgc28gdGhlIHRlYXJkb3duIGlzIGF0b21pYyB3aXRoIHRoZSBwYXJlbnRcbiAgICogIERFTEVURSAoYW5kIGNhbid0IHNlbGYtZGVhZGxvY2sgYWdhaW5zdCBpdHMgcm93IGxvY2tzKS4gVGhyb3dpbmcgYWJvcnRzIHRoYXRcbiAgICogIGJhdGNoJ3MgcHVyZ2UgKHJvd3Mgc3RheSB0b21ic3RvbmVkLCByZXRyaWVkIG5leHQgdGljaykuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkJlZm9yZVB1cmdlKF9pZHM6IHN0cmluZ1tdLCBfdHg6IENydWRUeCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIHJvd3MgYXJlIGhhcmQtcHVyZ2VkLCBmb3IgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzIChlLmcuIHBsdWdpblxuICAgKiAgaW1hZ2UgR0MpLiBCZXN0LWVmZm9ydDogZXJyb3JzIGFyZSBsb2dnZWQsIG5ldmVyIGJsb2NrIHRoZSBzd2VlcC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJQdXJnZShfaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogUmV0ZW50aW9uIGJlZm9yZSBhIHNvZnQtZGVsZXRlZCByb3cgYmVjb21lcyBwdXJnZS1lbGlnaWJsZS4gRGVmYXVsdHMgdG8gdGhlXG4gICAqICBzaGFyZWQgYFNPRlRfREVMRVRFX1JFVEVOVElPTl9EQVlTYDsgb3ZlcnJpZGUgcGVyIGVudGl0eSBmb3IgYSBiZXNwb2tlIHdpbmRvdy4gKi9cbiAgcHJvdGVjdGVkIGdldCBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gU09GVF9ERUxFVEVfUkVURU5USU9OX01TO1xuICB9XG5cbiAgLyoqIFRoZSBgcHVyZ2VfYWZ0ZXJgIHZhbHVlIHRvIHN0YW1wIG9uIGEgc29mdC1kZWxldGU6IGBub3cgKyByZXRlbnRpb25gLCBvciB0aGVcbiAgICogIHNwcmVhZC1mcmllbmRseSBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgZW50aXR5IGhhcyBubyBgcHVyZ2VfYWZ0ZXJgIGNvbHVtbi5cbiAgICogIGBwcm90ZWN0ZWRgIHNvIHN1YmNsYXNzZXMgd2l0aCBoYW5kLXJvbGxlZCBzb2Z0LWRlbGV0ZSBwYXRocyAoZS5nLlxuICAgKiAgbWVzc2FnZS1zZXJ2aWNlJ3MgdGhyZWFkIGNhc2NhZGUgLyBzeXNhZG1pbiBtb2RlcmF0aW9uKSBzdGFtcCBpdCB0b28g4oCUIGFuXG4gICAqICB1bi1zdGFtcGVkIHRvbWJzdG9uZSBoYXMgTlVMTCBgcHVyZ2VfYWZ0ZXJgIGFuZCBpcyBuZXZlciBoYXJkLXB1cmdlZC4gKi9cbiAgcHJvdGVjdGVkIHB1cmdlQWZ0ZXJTdGFtcChub3c6IERhdGUpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMucHVyZ2VBZnRlciB8fCB0aGlzLnNvZnREZWxldGVSZXRlbnRpb25NcyA8PSAwKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHsgcHVyZ2VBZnRlcjogbmV3IERhdGUobm93LmdldFRpbWUoKSArIHRoaXMuc29mdERlbGV0ZVJldGVudGlvbk1zKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdoZW4gYSByZWFkIGlzIHdpZGVuZWQgdG8gYSBwYXJlbnQgb3JnIChgcGFyZW50T3JnSWRgXG4gICAqIHNldCksIHRoZSBwYXJlbnQncyByb3dzIGFyZSBvdXRzaWRlIHRoZSBjYWxsZXIncyBSTFMgc2NvcGUsIHNvIHRoZSByZWFkIG11c3RcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQg4oCUIHRoZSBhY2Nlc3MtY29udHJvbCBXSEVSRSBjbGF1c2UgKG93biArIHBhcmVudCArXG4gICAqIHN5c3RlbSBwdWJsaWMsIGJ1aWx0IHNlcnZlci1zaWRlIGZyb20gYSB0cnVzdGVkIEpXVCBjbGFpbSkgaXMgdGhlbiB0aGVcbiAgICogYXV0aG9yaXRhdGl2ZSB0ZW5hbmN5IGdhdGUuIFdpdGhvdXQgYHBhcmVudE9yZ0lkYCBpdCBzdGF5cyBSTFMtc2NvcGVkLlxuICAgKlxuICAgKiBJTlZBUklBTlQgKHdoeSB0aGUgc3lzYWRtaW4gYnlwYXNzIGlzIHNhZmUpOiB0aGUgV0hFUkUgY2xhdXNlIGlzIGFsd2F5c1xuICAgKiBzZXJ2ZXItYnVpbHQgYnkgYGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZClgIGZyb20gdmFsdWVzXG4gICAqIGRlcml2ZWQgZnJvbSB0aGUgdmFsaWRhdGVkIEpXVCAoYG9yZ0lkYCA9IGFjdGl2ZSBvcmcsIGBwYXJlbnRPcmdJZGAgPSB0aGVcbiAgICogYWN0aXZlIG9yZydzIHBhcmVudCkuIE5vbmUgb2YgdGhlbSBpcyBhIHJhdyB1c2VyLXN1cHBsaWVkIHByZWRpY2F0ZSwgc28gdGhlXG4gICAqIGJ5cGFzcyBvbmx5IGV2ZXIgd2lkZW5zIHRoZSByZWFkIHRvIHRoZSBjYWxsZXIncyBvd24gc3VidHJlZSArIHN5c3RlbSBwdWJsaWNcbiAgICogcm93cyDigJQgaXQgY2FuIE5PVCBiZSBzdGVlcmVkIGF0IGFuIGFyYml0cmFyeSBvcmcuIE5PVEU6IHRoaXMgZG9lcyByZW1vdmUgdGhlXG4gICAqIFJMUyBiYWNrc3RvcCBmb3IgdGhlIHdpZGVuZWQgcmVhZDsgYSBzaW5nbGUtR1VDIGBhcHAub3JnX2lkYCBjYW4ndCBleHByZXNzXG4gICAqIHRoZSBcIm93biBPUiBwYXJlbnQgT1Igc3lzdGVtXCIgc2V0IHRoZSBwb2xpY3kgd291bGQgbmVlZCwgc28gcmVwbGFjaW5nIHRoZVxuICAgKiBieXBhc3Mgd291bGQgcmVxdWlyZSBhIHRlbmFuY3ktbGF5ZXIgY2hhbmdlIChlLmcuIGEgbXVsdGktb3JnIFJMUyBwb2xpY3kpLlxuICAgKiBEZWZlcnJlZCBkZWxpYmVyYXRlbHkg4oCUIGRvIG5vdCBzd2FwIHRoaXMgZm9yIGEgYmxhbmtldCBieXBhc3Mgd2l0aG91dFxuICAgKiByZS1jaGVja2luZyB0aGUgV0hFUkUgaXMgc3RpbGwgZnVsbHkgc2VydmVyLWJ1aWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBydW5SZWFkPFQ+KHBhcmVudE9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHBhcmVudE9yZ0lkID8gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgZm4pIDogZm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGVudGl0aWVzIG1hdGNoaW5nIGZpbHRlciBjcml0ZXJpYVxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICovXG4gIGFzeW5jIGZpbmQoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICByZXR1cm4gdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBGSVJTVCBlbnRpdHkgbWF0Y2hpbmcgYGZpbHRlcmAg4oCUIGEgYm91bmRlZCAoYExJTUlUIDFgKSB2YXJpYW50IG9mXG4gICAqIGBmaW5kYCBmb3IgdGhlIFwibWF0Y2ggYnkgZmlsdGVyLCB0YWtlIG9uZVwiIHJlYWQgcGF0aHMgKGUuZy4gYEdFVCAvZmluZGApLCBzb1xuICAgKiB0aGV5IGRvbid0IGBTRUxFQ1RgIGV2ZXJ5IG1hdGNoaW5nIG9yZyByb3cganVzdCB0byByZXR1cm4gYFswXWAuXG4gICAqL1xuICBhc3luYyBmaW5kRmlyc3QoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5saW1pdCgxKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZW50aXRpZXMgd2l0aCBwYWdpbmF0aW9uIGFuZCBzb3J0aW5nXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgZmluZFBhZ2luYXRlZChcbiAgICBmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sXG4gICAgb3JnSWQ/OiBzdHJpbmcsXG4gICAgb3B0aW9uczogUXVlcnlPcHRpb25zID0ge30sXG4gICAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzdWx0PFRFbnRpdHk+PiB7XG4gICAgY29uc3QgeyBsaW1pdDogcmF3TGltaXQgPSBERUZBVUxUX1BBR0VfTElNSVQsIG9mZnNldCA9IDAsIHNvcnRCeSwgc29ydE9yZGVyID0gJ2FzYycsIGluY2x1ZGVUb3RhbCA9IGZhbHNlLCBjdXJzb3IsIGZpZWxkcyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKE1hdGgubWF4KDEsIHJhd0xpbWl0KSwgTUFYX1BBR0VfTElNSVQpO1xuXG4gICAgLy8gVG90YWwsIGRldGVybWluaXN0aWMgb3JkZXI6IChzb3J0IGNvbHVtbiwgaWQpLiBgaWRgIGlzIHVuaXF1ZSwgc28gcm93cyB0aGF0XG4gICAgLy8gc2hhcmUgYSBzb3J0IHZhbHVlIGhhdmUgYSBzdGFibGUgcmVsYXRpdmUgb3JkZXIgYW5kIGEga2V5c2V0IGN1cnNvciBjYW5cbiAgICAvLyBuZXZlciBza2lwIG9yIHJlcGVhdCB0aGVtLiBBbiBhYnNlbnQgb3IgVU5LTk9XTiBgc29ydEJ5YCBvcmRlcnMgYnkgYGlkYFxuICAgIC8vIGFsb25lIOKAlCBhbiB1bmtub3duIHNvcnQgdXNlZCB0byBhZGQgbm8gV0hFUkUgYW5kIG5vIE9SREVSIEJZIHdoaWxlIHN0aWxsXG4gICAgLy8gZW1pdHRpbmcgYSBjdXJzb3IsIHNvIGEgY3Vyc29yIGNsaWVudCBsb29wZWQgb24gcGFnZSAxIGZvcmV2ZXIuXG4gICAgY29uc3QgaWRDb2x1bW4gPSB0aGlzLmNvbHMuaWQ7XG4gICAgY29uc3Qgc29ydENvbHVtbiA9IChzb3J0QnkgPyB0aGlzLmdldFNvcnRDb2x1bW4oc29ydEJ5KSA6IG51bGwpID8/IGlkQ29sdW1uO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gZGVzYyA6IGFzYztcbiAgICBjb25zdCBvcmRlckJ5ID0gc29ydENvbHVtbiA9PT0gaWRDb2x1bW4gPyBbZGlyZWN0aW9uKGlkQ29sdW1uKV0gOiBbZGlyZWN0aW9uKHNvcnRDb2x1bW4pLCBkaXJlY3Rpb24oaWRDb2x1bW4pXTtcblxuICAgIC8vIEN1cnNvciBhbmQgb2Zmc2V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUg4oCUIGEgdmFsaWQgY3Vyc29yIHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gQSBtYWxmb3JtZWQvdGFtcGVyZWQgY3Vyc29yIOKAlCBpbmNsdWRpbmcgd2VsbC1mb3JtZWQgSlNPTiB3aG9zZSB2YWx1ZXNcbiAgICAvLyBjYW4ndCBiZSBjYXN0IHRvIHRoZSBpZCAvIHNvcnQgY29sdW1uIHR5cGVzIOKAlCBpcyBpZ25vcmVkIChyZWFkcyBmcm9tIHRoZVxuICAgIC8vIHN0YXJ0KSBpbnN0ZWFkIG9mIHJlYWNoaW5nIFBvc3RncmVzIGFuZCBmYWlsaW5nIHRoZSBxdWVyeS5cbiAgICBjb25zdCByYXdDdXJzb3IgPSBjdXJzb3IgPyBkZWNvZGVDdXJzb3IoY3Vyc29yKSA6IG51bGw7XG4gICAgY29uc3QgZGVjb2RlZEN1cnNvciA9IHJhd0N1cnNvclxuICAgICAgJiYgaXNDYXN0YWJsZVRvKGlkQ29sdW1uLCByYXdDdXJzb3IuaWQpXG4gICAgICAvLyAoYW4gaWQtb25seSBvcmRlciBuZXZlciBiaW5kcyB0aGUgc29ydCB2YWx1ZSDigJQgc2VlIGtleXNldEFmdGVyKVxuICAgICAgJiYgKHNvcnRDb2x1bW4gPT09IGlkQ29sdW1uIHx8IHJhd0N1cnNvci5zb3J0VGV4dCA9PT0gbnVsbCB8fCBpc0Nhc3RhYmxlVG8oc29ydENvbHVtbiwgcmF3Q3Vyc29yLnNvcnRUZXh0KSlcbiAgICAgID8gcmF3Q3Vyc29yXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGN1cnNvciAmJiAhZGVjb2RlZEN1cnNvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0lnbm9yaW5nIG1hbGZvcm1lZCBwYWdpbmF0aW9uIGN1cnNvcicsIHsgZW50aXR5OiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICBpZiAoZGVjb2RlZEN1cnNvcikge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGtleXNldEFmdGVyKHNvcnRDb2x1bW4sIGlkQ29sdW1uLCBzb3J0T3JkZXIsIGRlY29kZWRDdXJzb3Iuc29ydFRleHQsIGRlY29kZWRDdXJzb3IuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBXcmFwIHRoZSB3aG9sZSBwYWdpbmF0ZWQgcmVhZCAoU0VMRUNUICsgb3B0aW9uYWwgQ09VTlQpIGluIG9uZVxuICAgIC8vIHRlbmFudCB0eC4gQm90aCBxdWVyaWVzIGFyZSB2aXNpYmlsaXR5LXNjb3BlZCBieSB0aGUgc2FtZSBSTFMgcG9saWN5LFxuICAgIC8vIGFuZCBwaW5uaW5nIHRoZW0gdG8gYSBzaW5nbGUgdHgga2VlcHMgdGhlIGBhcHAub3JnX2lkYCBHVUMgc3RhYmxlXG4gICAgLy8gYmV0d2VlbiB0aGVtLiBXaGVuIHdpZGVuaW5nIHRvIGEgcGFyZW50IG9yZywgdGhlIHdob2xlIHJlYWQgcnVucyB1bmRlclxuICAgIC8vIHN5c2FkbWluIGNvbnRleHQgKHNlZSBydW5SZWFkKSBzbyB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgaXMgdGhlIGdhdGUuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gUHJvamVjdGlvbjogdGhlIHNwYXJzZSBmaWVsZHNldCAoYWx3YXlzIGluY2x1ZGVzIGBpZGApIG9yIGV2ZXJ5IGNvbHVtbixcbiAgICAgIC8vIHBsdXMgdGhlIHNvcnQgY29sdW1uJ3MgZXhhY3QgdGV4dCBmb3IgdGhlIG5leHQgY3Vyc29yLlxuICAgICAgY29uc3QgYmFzZVNlbGVjdCA9IChmaWVsZHMgPyB0aGlzLmJ1aWxkRmllbGRTZWxlY3QoZmllbGRzKSA6IHVuZGVmaW5lZCkgPz8gZ2V0VGFibGVDb2x1bW5zKHRoaXMuc2NoZW1hKTtcbiAgICAgIGNvbnN0IHNlbGVjdFNwZWMgPSB7IC4uLmJhc2VTZWxlY3QsIFtDVVJTT1JfU09SVF9LRVldOiBzcWw8c3RyaW5nIHwgbnVsbD5gJHtzb3J0Q29sdW1ufTo6dGV4dGAgfTtcblxuICAgICAgLy8gRmV0Y2ggbGltaXQrMSB0byBkZXRlY3QgaGFzTW9yZSB3aXRob3V0IENPVU5UKCopXG4gICAgICBjb25zdCBlZmZlY3RpdmVPZmZzZXQgPSBkZWNvZGVkQ3Vyc29yID8gMCA6IG9mZnNldDtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0eC5zZWxlY3Qoc2VsZWN0U3BlYyBhcyBhbnkpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgICAgLm9yZGVyQnkoLi4ub3JkZXJCeSlcbiAgICAgICAgLmxpbWl0KGxpbWl0ICsgMSlcbiAgICAgICAgLm9mZnNldChlZmZlY3RpdmVPZmZzZXQpLnRoZW4ociA9PiBkcml6emxlUm93czxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ocikpO1xuXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdDtcbiAgICAgIGNvbnN0IHBhZ2UgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuICAgICAgY29uc3QgZGF0YSA9IHBhZ2UubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0geyAuLi5yb3cgfTtcbiAgICAgICAgZGVsZXRlIGVudGl0eVtDVVJTT1JfU09SVF9LRVldO1xuICAgICAgICByZXR1cm4gZW50aXR5IGFzIFRFbnRpdHk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4gPSB7IGRhdGEsIGxpbWl0LCBvZmZzZXQ6IGVmZmVjdGl2ZU9mZnNldCwgaGFzTW9yZSB9O1xuXG4gICAgICBpZiAoaGFzTW9yZSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gcGFnZVtwYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBzb3J0VGV4dCA9IGxhc3RbQ1VSU09SX1NPUlRfS0VZXTtcbiAgICAgICAgcmVzdWx0Lm5leHRDdXJzb3IgPSBlbmNvZGVDdXJzb3Ioc29ydFRleHQgPT0gbnVsbCA/IG51bGwgOiBTdHJpbmcoc29ydFRleHQpLCBTdHJpbmcobGFzdC5pZCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHJ1biB0aGUgQ09VTlQoKikgcXVlcnkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgbmVlZHMgdGhlIHRvdGFsLlxuICAgICAgLy8gTXVzdCBpbmNsdWRlIHBhcmVudE9yZ0lkIHNvIGB0b3RhbGAgbWF0Y2hlcyB0aGUgd2lkZW5lZCBkYXRhIHNldC5cbiAgICAgIGlmIChpbmNsdWRlVG90YWwpIHtcbiAgICAgICAgY29uc3QgYmFzZUNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgICAgIGNvbnN0IFtjb3VudFJlc3VsdF0gPSBhd2FpdCB0eFxuICAgICAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAud2hlcmUoYW5kKC4uLmJhc2VDb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSk7XG4gICAgICAgIHJlc3VsdC50b3RhbCA9IGNvdW50UmVzdWx0Py5jb3VudCB8fCAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbHVtbiBzZWxlY3Rpb24gbWFwIGZvciBzcGFyc2UgZmllbGRzZXRzLlxuICAgKiBGYWxscyBiYWNrIHRvIGZ1bGwgc2VsZWN0IGlmIG5vIGZpZWxkcyBhcmUgcmVxdWVzdGVkLlxuICAgKlxuICAgKiBgaWRgIGlzIGFsd2F5cyBpbmNsdWRlZCDigJQgaXQgaXMgdGhlIGVudGl0eSBpZGVudGl0eSBBTkQgdGhlIGtleXNldCBjdXJzb3Inc1xuICAgKiB0aWUtYnJlYWtlci4gVGhlIHNvcnQgdmFsdWUgZm9yIHRoZSBjdXJzb3IgaXMgcHJvamVjdGVkIHNlcGFyYXRlbHkgKGFzIHRleHQpXG4gICAqIGJ5IGBmaW5kUGFnaW5hdGVkYCwgc28gdGhlIGZpZWxkc2V0IG5lZWQgbm90IGNhcnJ5IHRoZSBzb3J0IGNvbHVtbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGaWVsZFNlbGVjdChmaWVsZHM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29sdW1uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAvLyBBbHdheXMgaW5jbHVkZSBpZCBmb3IgZW50aXR5IGlkZW50aXR5XG4gICAgY29sdW1ucy5pZCA9IHRoaXMuY29scy5pZDtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQgPT09ICdpZCcpIGNvbnRpbnVlOyAvLyBBbHJlYWR5IGluY2x1ZGVkXG4gICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHNbZmllbGRdO1xuICAgICAgaWYgKGNvbCkgY29sdW1uc1tmaWVsZF0gPSBjb2w7XG4gICAgfVxuXG4gICAgLy8gQXQgbWluaW11bSB3ZSdsbCBoYXZlIHsgaWQgfSwgd2hpY2ggaXMgdmFsaWRcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdpZGVuIHRoZSBjb3VudCB0byB0aGUgcGFyZW50IG9yZydzXG4gICAqICAgcHVibGljIHJvd3MuIE1VU1QgbWlycm9yIGBmaW5kYC9gZmluZFBhZ2luYXRlZGAncyB3aWRlbmluZyAoc2FtZVxuICAgKiAgIGBidWlsZENvbmRpdGlvbnNgIGFyZ3MgKyBzeXNhZG1pbi1zY29wZWQgcmVhZCB2aWEgYHJ1blJlYWRgKSBzbyBhIHBhZ2VkXG4gICAqICAgbGlzdCdzIGB0b3RhbGAgbWF0Y2hlcyB0aGUgcm93cyBhIHdpZGVuZWQgYGZpbmQoKWAgcmV0dXJucyDigJQgb3RoZXJ3aXNlIHRoZVxuICAgKiAgIGNvdW50IG9taXRzIHRoZSBwYXJlbnQncyByb3dzIGFuZCByZXBvcnRzIGEgbmFycm93ZXIgdG90YWwgdGhhbiB0aGUgZGF0YSBzZXQuXG4gICAqL1xuICBhc3luYyBjb3VudChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdD8uY291bnQgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgc2luZ2xlIGVudGl0eSBieSBJRFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBFbnRpdHkgSURcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB2aXNpYmlsaXR5IHRvIHRoZSBwYXJlbnRcbiAgICogICBvcmcncyBwdWJsaWMgcm93cyAoc28gYSB0ZWFtIGNhbiBmZXRjaCBhIHBhcmVudCdzIHB1YmxpYyBlbnRpdHkgYnkgaWQpLlxuICAgKiAgIFNhbWUgb3B0LWluICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYDsgdGhlXG4gICAqICAgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIGlzIHRoZSBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS5cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgLy8gRXhhY3QgaWQg4oCUIGBmaW5kQnlJZGAgbWVhbnMgVEhFIHJvdyB3aXRoIHRoaXMgaWQsIG5vdCBhIHByZWZpeCBtYXRjaC4gVGhlXG4gICAgLy8gc2hhcmVkIGBidWlsZElkRmlsdGVyYCBwcmVmaXgtbWF0Y2hlcyBub24tZnVsbC1VVUlEIHZhbHVlcyAoYSBsaXN0LXNlYXJjaFxuICAgIC8vIGZlYXR1cmUpLCB3aGljaCBoZXJlIHdvdWxkIHJldHVybiBhbiBhcmJpdHJhcnkgZmlyc3QgcHJlZml4IGhpdCBmb3IgYVxuICAgIC8vIHBhcnRpYWwgaWQ7IHBpbiBpdCB0byBleGFjdCBzbyBhIG1hbGZvcm1lZCBpZCByZXR1cm5zIG51bGwuXG4gICAgY29uZGl0aW9ucy5wdXNoKHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvLyBNdXRhdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIERlZmVuc2UtaW4tZGVwdGggdGVuYW50IHN0YW1wLiBSTFMgaXMgaW4gb3duZXItYnlwYXNzIG1vZGUsIHNvIHRoZSBhcHAgbGF5ZXJcbiAgICogaXMgdGhlIG9ubHkgdGVuYW50IGdhdGUgb24gd3JpdGVzLiBBIE5PTi1zeXNhZG1pbiBjYWxsZXIgbWF5IG9ubHkgd3JpdGUgaW50b1xuICAgKiBpdHMgT1dOIG9yZywgc28gcGluIHRoZSByb3cgdG8gdGhlIHRydXN0ZWQgdGVuYW50LWNvbnRleHQgb3JnLlxuICAgKlxuICAgKiBUaGUgc3RhbXAgZmlyZXMgd2hlbmV2ZXIgdGhlIHBheWxvYWQncyBgb3JnSWRgIGRpZmZlcnMgZnJvbSB0aGUgY29udGV4dCBvcmcg4oCUXG4gICAqIHdoaWNoIGNvdmVycyBCT1RIIGEgZm9yZ2VkL21pc21hdGNoZWQgYGRhdGEub3JnSWRgIEFORCBhbiBBQlNFTlQgb25lLiBUaGVcbiAgICogYWJzZW50IGNhc2UgaXMgdGhlIGltcG9ydGFudCB0ZW5hbnQtYm91bmRhcnkgZml4OiB0aGUgYG9yZ19pZGAgY29sdW1uIERFRkFVTFRzXG4gICAqIHRvIGBTWVNURU1fT1JHX0lEYCAoc2NoZW1hL3BpcGVsaW5lLnRzLCBzY2hlbWEvcGx1Z2luLnRzKSwgc28gYW4gaW5zZXJ0IHRoYXRcbiAgICogb21pdHMgYG9yZ0lkYCB3b3VsZCBvdGhlcndpc2UgbGFuZCB0aGUgdGVuYW50J3Mgcm93IGluIHRoZSBwdWJsaWMgc3lzdGVtXG4gICAqIGNhdGFsb2cg4oCUIGEgY3Jvc3MtdGVuYW50IGZhaWwtb3Blbi4gQWx3YXlzIGluamVjdGluZyBgY3R4Lm9yZ0lkYCBjbG9zZXMgaXQuXG4gICAqXG4gICAqIFN5c2FkbWluIChhbmQgb3V0LW9mLWNvbnRleHQgd29ya2VyL3N5c3RlbSBwYXRocywgd2hlcmUgYGdldFRlbmFudENvbnRleHQoKWBcbiAgICogaXMgdW5kZWZpbmVkKSBrZWVwIHRoZSBzdXBwbGllZCBvcmcsIG1hdGNoaW5nIHRoZSBSTFMgcG9saWN5XG4gICAqIGBjdXJyZW50X2lzX3N5c2FkbWluKCkgT1Igb3JnX2lkID0gY3VycmVudF9vcmdfaWQoKWAuXG4gICAqL1xuICAvLyBHZW5lcmljIG92ZXIgdGhlIHBheWxvYWQgc2hhcGUgc28gQk9USCB0aGUgY3JlYXRlIChgVEluc2VydGApIGFuZCB1cGRhdGVcbiAgLy8gKGBQYXJ0aWFsPFRVcGRhdGU+YCkgY2FsbCBzaXRlcyB1c2UgaXQgd2l0aG91dCB0aGUgYGFzIHVua25vd24gYXMgVEluc2VydGBcbiAgLy8gcm91bmQtdHJpcCB0aGV5IHByZXZpb3VzbHkgbmVlZGVkIOKAlCB0aGUgb3JnLXN0YW1wIGxvZ2ljIGlzIGlkZW50aWNhbCBmb3JcbiAgLy8gZWl0aGVyIHNoYXBlIChpdCBvbmx5IHRvdWNoZXMgdGhlIGBvcmdJZGAga2V5KS5cbiAgcHJvdGVjdGVkIGVuZm9yY2VPcmdJZDxUPihkYXRhOiBULCBpc0NyZWF0ZSA9IGZhbHNlKTogVCB7XG4gICAgY29uc3QgY3R4ID0gZ2V0VGVuYW50Q29udGV4dCgpO1xuICAgIGNvbnN0IGQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8vIFJlZnVzZSBhIGNvbnRleHQtbGVzcywgb3JnSWQtbGVzcyBJTlNFUlQgb24gYW4gb3JnLXNjb3BlZCBlbnRpdHk6IHRoZSBgb3JnSWRgXG4gICAgLy8gY29sdW1uIGRlZmF1bHRzIHRvIFNZU1RFTV9PUkdfSUQsIHNvIHN1Y2ggYSByb3cgd291bGQgc2lsZW50bHkgbGFuZCBpbiB0aGVcbiAgICAvLyBwdWJsaWMgY3Jvc3Mtb3JnIGNhdGFsb2cuIEEgYmFja2dyb3VuZCBqb2IgdGhhdCBmb3Jnb3QgYHJ1bldpdGhUZW5hbnRDb250ZXh0YFxuICAgIC8vIChhbmQgZGlkbid0IHBhc3MgYW4gZXhwbGljaXQgb3JnSWQpIG11c3QgZmFpbCBsb3VkbHksIG5vdCBsZWFrIGludG8gYHN5c3RlbWAuXG4gICAgLy8gKFN5c2FkbWluL3NlZWQgd3JpdGVzIGNhcnJ5IGEgY29udGV4dCBvciBhbiBleHBsaWNpdCBvcmdJZCwgc28gdGhleSBwYXNzLilcbiAgICBpZiAoaXNDcmVhdGUgJiYgIWN0eCAmJiBkLm9yZ0lkID09IG51bGwgJiYgdGhpcy5jb2xzLm9yZ0lkICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmNyZWF0ZSByZXF1aXJlcyBhbiBvcmdJZCAobm8gdGVuYW50IGNvbnRleHQgYW5kIG5vbmUgc3VwcGxpZWQpIOKAlCByZWZ1c2luZyB0byBkZWZhdWx0IHRvIHRoZSBzeXN0ZW0gb3JnYCk7XG4gICAgfVxuICAgIGlmIChjdHggJiYgIWN0eC5pc1N1cGVyQWRtaW4gJiYgY3R4Lm9yZ0lkICYmIGQub3JnSWQgIT09IGN0eC5vcmdJZCkge1xuICAgICAgLy8gRGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyB0aGF0IHJlYWNoIGhlcmUgc28gdGhlIGxvZyBzdGF5cyB1c2VmdWwgYW5kXG4gICAgICAvLyBxdWlldDogYSBQUkVTRU5ULWJ1dC1taXNtYXRjaGVkIGBvcmdJZGAgaXMgYW4gYWN0dWFsIG92ZXJyaWRlIGF0dGVtcHRcbiAgICAgIC8vICh3YXJuKSwgd2hpbGUgYW4gQUJTRU5UIGBvcmdJZGAgaXMgdGhlIGNvbW1vbiBub3JtYWwtd3JpdGUgcGF0aCB0aGF0IGp1c3RcbiAgICAgIC8vIG5lZWRzIHRoZSBkZWZhdWx0IHN0YW1wIChkZWJ1Zykg4oCUIGxvZ2dpbmcgdGhhdCBhdCB3YXJuIGZsb29kcyB0aGUgbG9nIG9uXG4gICAgICAvLyBldmVyeSB3cml0ZSB0aGF0IG9taXRzIG9yZ0lkLlxuICAgICAgY29uc3QgbWV0YSA9IHsgc3VwcGxpZWQ6ICdvcmdJZCcgaW4gZCA/IGQub3JnSWQgOiB1bmRlZmluZWQsIGVuZm9yY2VkOiBjdHgub3JnSWQgfTtcbiAgICAgIGlmICgnb3JnSWQnIGluIGQpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0NydWRTZXJ2aWNlOiBvdmVycmlkaW5nIG1pc21hdGNoZWQgb3JnIG9uIHdyaXRlJywgbWV0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0NydWRTZXJ2aWNlOiBzdGFtcGluZyB0ZW5hbnQtY29udGV4dCBvcmcgb24gd3JpdGUnLCBtZXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmQsIG9yZ0lkOiBjdHgub3JnSWQgfSBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5XG4gICAqL1xuICBhc3luYyBjcmVhdGUoZGF0YTogVEluc2VydCwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHk+IHtcbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEsIC8qIGlzQ3JlYXRlICovIHRydWUpO1xuICAgIC8vIENyZWF0ZSBuZXZlciBvdmVyd3JpdGVzLiBUaGUgY29uZmxpY3Qga2V5IGNhbiBtYXRjaCBhIExJVkUgcm93IChhbm90aGVyXG4gICAgLy8gYXV0aG9yJ3MsIG9yIG9uZSB0aGUgY2FsbGVyIGNvdWxkbid0IGVkaXQgdGhyb3VnaCB1cGRhdGUpIG9yIGEgc29mdC1kZWxldGVkXG4gICAgLy8gVE9NQlNUT05FOyByZXBsYWNpbmcgZWl0aGVyIHdvdWxkIGJ5cGFzcyB1cGRhdGUncyBhY2Nlc3MgY2hlY2tzIG9yIHJlc3RvcmUnc1xuICAgIC8vIHN0ZXAtdXAuIE9uIGFueSBjb25mbGljdCBub3RoaW5nIGlzIHdyaXR0ZW4gYW5kIHRoZSBjYWxsZXIgZ2V0cyBhIDQwOS5cbiAgICBjb25zdCBbY3JlYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLmluc2VydCh0aGlzLnNjaGVtYSlcbiAgICAgIC52YWx1ZXMoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAub25Db25mbGljdERvTm90aGluZyh7IHRhcmdldDogdGhpcy5jb25mbGljdFRhcmdldCBhcyBhbnkgfSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoJ0EgcmVjb3JkIHdpdGggdGhlIHNhbWUgaWRlbnRpdHkgYWxyZWFkeSBleGlzdHMuIElmIGl0IHdhcyBkZWxldGVkLCByZXN0b3JlIGl0IGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJVcGRhdGUoaWQsIHVwZGF0ZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSAoc29mdCBkZWxldGUgYnkgc2V0dGluZyBpc0FjdGl2ZSA9IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBub3csXG4gICAgICAgIGRlbGV0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyRGVsZXRlKGlkLCBkZWxldGVkLCB1c2VySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvamVjdC9vcmdhbml6YXRpb24gc2NvcGUuXG4gICAqIE1hcmtzIGFsbCBvdGhlciBlbnRpdGllcyBhcyBub24tZGVmYXVsdCwgdGhlbiBzZXRzIHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICAgKiBVc2VzIGEgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIGF0b21pY2l0eS5cbiAgICovXG4gIGFzeW5jIHNldERlZmF1bHQoXG4gICAgcHJvamVjdDogc3RyaW5nLFxuICAgIG9yZzogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIC8vIEEgbm9uLXN5c2FkbWluIG1heSBvbmx5IGZsaXAgZGVmYXVsdHMgd2l0aGluIGl0cyBPV04gb3JnIOKAlCBwaW4gdGhlIHNjb3BlIHRvXG4gICAgLy8gdGhlIHRydXN0ZWQgdGVuYW50IGNvbnRleHQgc28gYSBmb3J3YXJkZWQgYG9yZ2AgYXJnIGNhbid0IHRvdWNoIGFub3RoZXJcbiAgICAvLyB0ZW5hbnQncyBkZWZhdWx0cyAoUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlOyB0aGlzIGlzIHRoZSBnYXRlKS5cbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQpIG9yZyA9IGN0eC5vcmdJZDtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3Qgb3JnQ29sdW1uID0gdGhpcy5nZXRPcmdDb2x1bW4oKTtcbiAgICAgIGNvbnN0IHByb2plY3RDb2x1bW4gPSB0aGlzLmdldFByb2plY3RDb2x1bW4oKTtcblxuICAgICAgLy8gQnVpbGQgc2NvcGluZyBjb25kaXRpb25zIGZvciBjbGVhcmluZyBkZWZhdWx0c1xuICAgICAgY29uc3Qgc2NvcGVDb25kaXRpb25zID0gW1xuICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgIGVxKHRoaXMuY29scy5pc0RlZmF1bHQsIHRydWUpLFxuICAgICAgXTtcbiAgICAgIGlmIChwcm9qZWN0Q29sdW1uKSB7XG4gICAgICAgIHNjb3BlQ29uZGl0aW9ucy5wdXNoKGVxKHByb2plY3RDb2x1bW4sIHByb2plY3QpKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jayBleGlzdGluZyBkZWZhdWx0cyB3aXRoIEZPUiBVUERBVEUgdG8gcHJldmVudCBjb25jdXJyZW50IHNldERlZmF1bHQgcmFjZXNcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoXG4gICAgICAgIHNxbGBTRUxFQ1QgaWQgRlJPTSAke3RoaXMuc2NoZW1hfVxuICAgICAgICAgICAgV0hFUkUgJHtvcmdDb2x1bW59ID0gJHtvcmd9XG4gICAgICAgICAgICAgIEFORCAke3RoaXMuY29scy5pc0RlZmF1bHR9ID0gdHJ1ZVxuICAgICAgICAgICAgJHtwcm9qZWN0Q29sdW1uID8gc3FsYEFORCAke3Byb2plY3RDb2x1bW59ID0gJHtwcm9qZWN0fWAgOiBzcWxgYH1cbiAgICAgICAgICAgIEZPUiBVUERBVEVgLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhbGwgZW50aXRpZXMgaW4gc2NvcGUgYXMgbm9uLWRlZmF1bHRcbiAgICAgIGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKGFuZCguLi5zY29wZUNvbmRpdGlvbnMpKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGVjaWZpZWQgZW50aXR5IGFzIGRlZmF1bHQuIEd1YXJkIGFnYWluc3QgcHJvbW90aW5nIGFcbiAgICAgIC8vIHNvZnQtZGVsZXRlZCByb3cgKGlzQWN0aXZlID0gdHJ1ZSkg4oCUIGEgZGVsZXRlZCBlbnRpdHkgbXVzdCBuZXZlciBiZWNvbWVcbiAgICAgIC8vIHRoZSBhY3RpdmUgZGVmYXVsdCDigJQgYW5kIHBpbiB0aGUgaWQgd2l0aCB0aGUgc2FtZSBsb3dlcmNhc2VkXG4gICAgICAvLyBleGFjdElkQ29uZGl0aW9uIHRoZSBtdXRhdGlvbiBwYXRocyB1c2UgKHRoZSByYXcgYGVxKGNvbHMuaWQsIGlkKWAgaGVyZVxuICAgICAgLy8gc2tpcHBlZCB0aGUgbG93ZXItY2FzaW5nIHRoYXQgYGJ1aWxkSWRGaWx0ZXJgL2B3cml0ZUNvbmRpdGlvbnNgIGFwcGx5LFxuICAgICAgLy8gc28gYSBtaXhlZC1jYXNlIGlkIGNvdWxkIG1pc3MgaXRzIHJvdykuIEEgbm9uLW1hdGNoIOKGkiBOb3RGb3VuZEVycm9yIGJlbG93LlxuICAgICAgY29uc3QgW3VwZGF0ZWRdID0gYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC53aGVyZShcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICB0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpLFxuICAgICAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBpZiAoIXVwZGF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYEVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyXG4gICAqL1xuICBhc3luYyB1cGRhdGVNYW55KFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBkYXRhOiBQYXJ0aWFsPFRVcGRhdGU+LFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuICAgIC8vIE93bi1vcmcgd3JpdGUtcGluOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlci1vcmcgUFVCTElDXG4gICAgLy8gcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY291bGQgbXV0YXRlXG4gICAgLy8gc2hhcmVkIChvciBhbm90aGVyIHRlbmFudCdzIHB1YmxpYykgcmVjb3Jkcy4gTWlycm9yIHVwZGF0ZS9kZWxldGUvXG4gICAgLy8gYnVsa0RlbGV0ZS4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKSBBbiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwc1xuICAgIC8vIGZ1bGwgYWNjZXNzLlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBvcmdJZCAoc2VlIHVwZGF0ZSgpKSBzbyBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY2FuJ3RcbiAgICAvLyByZS1ob21lIHJvd3MgaW50byBhbm90aGVyIHRlbmFudC5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cblxuICAvKipcbiAgICogVGhlIGB2aXNpYmlsaXR5YCBwcmVkaWNhdGUgZm9yIGEgYnVsayBzb2Z0LWRlbGV0ZSwgbWlycm9yaW5nXG4gICAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzYCBydW5nIGZvciBydW5nIHNvIGJ1bGsgYW5kIHNpbmdsZS1yb3cgZGVsZXRlXG4gICAqIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY2FsbGVyIG1heSByZW1vdmUuXG4gICAqXG4gICAqIFJldHVybnMgbm8gY29uZGl0aW9uIGF0IGFsbCBmb3IgYSBzeXN0ZW0gYWRtaW4sIG9yIGZvciBhbiBlbnRpdHkgd2l0aCBub1xuICAgKiBgdmlzaWJpbGl0eWAgY29sdW1uIChub3RoaW5nIHRvIGdhdGUgb24pLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpYmlsaXR5RGVsZXRlQ29uZGl0aW9ucyhcbiAgICBhY2Nlc3M6IHsgaXNTeXN0ZW1BZG1pbjogYm9vbGVhbjsgY2FuUHVibGlzaDogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGFjY2Vzc0NvbD86IEFueUNvbHVtbixcbiAgICBjcmVhdGVkQnlDb2w/OiBBbnlDb2x1bW4sXG4gICk6IFNRTFtdIHtcbiAgICBpZiAoIWFjY2Vzc0NvbCkgcmV0dXJuIFtdO1xuICAgIGlmICghYWNjZXNzIHx8IGFjY2Vzcy5pc1N5c3RlbUFkbWluKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBydW5nczogU1FMW10gPSBbZXEoYWNjZXNzQ29sLCAnb3JnJyldO1xuICAgIC8vIGBwcml2YXRlYCBpcyBhdXRob3Itb25seS4gV2l0aCBubyBhdXRob3IgY29sdW1uIG9yIG5vIGNhbGxlciBpZGVudGl0eSB3ZVxuICAgIC8vIGNhbm5vdCBwcm92ZSBhdXRob3JzaGlwLCBzbyB0aGUgcnVuZyBpcyBzaW1wbHkgbm90IG9mZmVyZWQgKGZhaWwgY2xvc2VkKVxuICAgIC8vIHJhdGhlciB0aGFuIG1hdGNoaW5nIGV2ZXJ5IHByaXZhdGUgcm93LlxuICAgIGlmIChjcmVhdGVkQnlDb2wgJiYgdXNlcklkKSB7XG4gICAgICBydW5ncy5wdXNoKGFuZChlcShhY2Nlc3NDb2wsICdwcml2YXRlJyksIGVxKGNyZWF0ZWRCeUNvbCwgdXNlcklkKSkgYXMgU1FMKTtcbiAgICB9XG4gICAgaWYgKGFjY2Vzcy5jYW5QdWJsaXNoKSBydW5ncy5wdXNoKGVxKGFjY2Vzc0NvbCwgJ3B1YmxpYycpKTtcblxuICAgIHJldHVybiBbb3IoLi4ucnVuZ3MpIGFzIFNRTF07XG4gIH1cblxuICAvKipcbiAgICogU29mdC1kZWxldGUgbXVsdGlwbGUgZW50aXRpZXMgYnkgSURzIGluIGEgc2luZ2xlIGJhdGNoIG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGJ1bGtEZWxldGUoXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFRoZSBjYWxsZXIncyBhdXRob3JpdHkgb24gdGhlIHRocmVlLXJ1bmcgYHZpc2liaWxpdHlgIGxhZGRlci4gT21pdCAob3JcbiAgICAgKiBwYXNzIGBpc1N5c3RlbUFkbWluOiB0cnVlYCkgZm9yIGFuIHVucmVzdHJpY3RlZCBkZWxldGUuXG4gICAgICpcbiAgICAgKiBUaGlzIHVzZWQgdG8gYmUgYSBgcmVzdHJpY3RUb1ByaXZhdGVgIGJvb2xlYW4gdGhhdCBuYXJyb3dlZCB0b1xuICAgICAqIGB2aXNpYmlsaXR5ID0gJ3ByaXZhdGUnYC4gVGhhdCBlbmNvZGVkIHRoZSBPTEQgdHdvLXN0YXRlIG1vZGVsOiBzaW5jZVxuICAgICAqIGByZXNvbHZlVmlzaWJpbGl0eWAgZGVmYXVsdHMgcGlwZWxpbmVzIGFuZCBwbHVnaW5zIHRvIGBvcmdgLCBhbmRcbiAgICAgKiBzaW5nbGUtcm93IGRlbGV0ZSBhbGxvd3MgYW4gYG9yZ2Agcm93IHdpdGggcGxhaW4gYDp3cml0ZWAsIGJ1bGsgZGVsZXRlXG4gICAgICogNDAzJ2QgdGhlIG5vcm1hbCBjYXNlIOKAlCBhbiBvcmcgYWRtaW4gY291bGQgZGVsZXRlIGEgcGlwZWxpbmUgb25lIGF0IGFcbiAgICAgKiB0aW1lIGJ1dCBub3QgaW4gYnVsay4gVGhlIHJ1bmdzIGVuZm9yY2VkIGhlcmUgbWlycm9yXG4gICAgICogYHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3NgIGV4YWN0bHk6XG4gICAgICogICAtIGBwcml2YXRlYCDihpIgYXV0aG9yIG9ubHkgKGBjcmVhdGVkQnkgPT09IHVzZXJJZGApXG4gICAgICogICAtIGBvcmdgICAgICDihpIgYW55IG1lbWJlciBvZiB0aGUgb3JnIChwbGFpbiBgOndyaXRlYClcbiAgICAgKiAgIC0gYHB1YmxpY2AgIOKGkiByZXF1aXJlcyB0aGUgZW50aXR5J3MgcHVibGlzaCBwZXJtaXNzaW9uXG4gICAgICovXG4gICAgYWNjZXNzPzogeyBpc1N5c3RlbUFkbWluOiBib29sZWFuOyBjYW5QdWJsaXNoOiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCB8fCAnc3lzdGVtJztcbiAgICAvLyBPd25lci1zY29wZSB0aGUgYnVsayBzb2Z0LWRlbGV0ZTogYnVpbGRDb25kaXRpb25zIGFsc28gbWF0Y2hlcyBzeXN0ZW0vb3RoZXJcbiAgICAvLyAtb3JnIFBVQkxJQyByb3dzLCBzbyB3aXRob3V0IHRoZSBzdHJpY3Qgb3JnSWQgcGluIGEgdGVuYW50IGNvdWxkIGRlbGV0ZVxuICAgIC8vIHNoYXJlZCByZWNvcmRzIGJ5IGlkLiAoU2VlIHdyaXRlQ29uZGl0aW9ucy4pXG4gICAgY29uc3QgYWNjZXNzQ29sID0gdGhpcy5jb2xzLnZpc2liaWxpdHk7XG4gICAgY29uc3QgY3JlYXRlZEJ5Q29sID0gdGhpcy5jb2xzLmNyZWF0ZWRCeTtcbiAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgaW5BcnJheSh0aGlzLmNvbHMuaWQsIGlkcyksXG4gICAgICAuLi50aGlzLmJ1aWxkQ29uZGl0aW9ucyh7fSBhcyBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZCksXG4gICAgICAvLyBUZW5hbnQgY29sdW1uIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsKSDigJQgY29uc2lzdGVudCB3aXRoXG4gICAgICAvLyB3cml0ZUNvbmRpdGlvbnM7IG5vIHNpbGVudCBmYWlsLW9wZW4gd2hlbiB0aGUgcHJvcGVydHkgaXMgYWJzZW50LlxuICAgICAgLi4uKG9yZ0lkID8gW2VxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKV0gOiBbXSksXG4gICAgICAuLi50aGlzLnZpc2liaWxpdHlEZWxldGVDb25kaXRpb25zKGFjY2VzcywgdXNlcklkLCBhY2Nlc3NDb2wsIGNyZWF0ZWRCeUNvbCksXG4gICAgXTtcblxuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXIsXG4gICAgICAgIGRlbGV0ZWRBdDogbm93LFxuICAgICAgICBkZWxldGVkQnk6IHVzZXIsXG4gICAgICAgIC8vIFN0YW1wIHRoZSBwdXJnZSBkZWFkbGluZSBzbyB0aGUgcmV0ZW50aW9uIHN3ZWVwIGNhbiBoYXJkLWRlbGV0ZSBsYXRlci5cbiAgICAgICAgLi4udGhpcy5wdXJnZUFmdGVyU3RhbXAobm93KSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZGVsZXRlZC5tYXAoZW50aXR5ID0+XG4gICAgICAgIHRoaXMub25BZnRlckRlbGV0ZShlbnRpdHkuaWQsIGVudGl0eSwgdXNlcklkKS5jYXRjaChlcnIgPT5cbiAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc29mdC1kZWxldGVkICh0b21ic3RvbmVkKSBlbnRpdHk6IGNsZWFyIGBpc0FjdGl2ZWAvYGRlbGV0ZWRBdGAvXG4gICAqIGBkZWxldGVkQnlgL2BwdXJnZUFmdGVyYCBzbyBpdCByZWFwcGVhcnMgaW4gbm9ybWFsIHJlYWRzLlxuICAgKlxuICAgKiBNYXRjaGVzIE9OTFkgYSBnZW51aW5lIHRvbWJzdG9uZSDigJQgYGlzQWN0aXZlID0gZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCDigJQgc28gYSBtZXJlbHkgKmRlYWN0aXZhdGVkKiByb3cgKGlzQWN0aXZlPWZhbHNlLCBubyBkZWxldGVkQXQpIGlzIG5ldmVyXG4gICAqIHNpbGVudGx5IFwicmVzdG9yZWRcIi4gUGlubmVkIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIChvcmdJZC1sZXNzIHN5c2FkbWluXG4gICAqIGNvbnRleHQgc3BhbnMgb3JncywgbWF0Y2hpbmcgZGVsZXRlL3VwZGF0ZSkuIFJldHVybnMgbnVsbCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIHN1Y2ggdG9tYnN0b25lIChhbHJlYWR5IGFjdGl2ZSwgcHVyZ2VkLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICogQSB1bmlxdWUta2V5IGNvbGxpc2lvbiAoYSBsaXZlIHJvdyBhbHJlYWR5IGhvbGRzIHRoZSBrZXkpIHN1cmZhY2VzIGFzIHRoZVxuICAgKiBkcml2ZXIncyB1bmlxdWUtdmlvbGF0aW9uIGZvciB0aGUgcm91dGUgdG8gbWFwIHRvIDQwOSDigJQgaW4gcHJhY3RpY2UgdGhlXG4gICAqIHRvbWJzdG9uZSBJUyB0aGUga2V5IGhvbGRlciwgc28gdGhpcyBpcyBkZWZlbnNpdmUuXG4gICAqL1xuICAvKiogQ29uZGl0aW9ucyBtYXRjaGluZyBhIEdFTlVJTkUgdG9tYnN0b25lIChgaXNBY3RpdmU9ZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTXG4gICAqICBOT1QgTlVMTGApLCBvcHRpb25hbGx5IHBpbm5lZCB0byBgaWRgIGFuZC9vciBgb3JnSWRgLiBTaW5nbGUgc291cmNlIG9mIHRydXRoXG4gICAqICBmb3IgcmVzdG9yZS9maW5kRGVsZXRlZEJ5SWQvZmluZERlbGV0ZWQgc28gdGhlIFwid2hhdCBpcyBhIHRvbWJzdG9uZVwiIHJ1bGVcbiAgICogIGxpdmVzIGluIG9uZSBwbGFjZS4gKi9cbiAgcHJpdmF0ZSB0b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkPzogc3RyaW5nLCBpZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtcbiAgICAgIGVxKHRoaXMuY29scy5pc0FjdGl2ZSwgZmFsc2UpLFxuICAgICAgc3FsYCR7dGhpcy5jb2xzLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLFxuICAgIF07XG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIGNvbmRpdGlvbnMudW5zaGlmdCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICBpZiAob3JnSWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCkpO1xuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgYXN5bmMgcmVzdG9yZShpZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsOyAvLyBlbnRpdHkgaGFzIG5vIHNvZnQtZGVsZXRlIGxpZmVjeWNsZVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IFtyZXN0b3JlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBudWxsLFxuICAgICAgICBkZWxldGVkQnk6IG51bGwsXG4gICAgICAgIC4uLih0aGlzLmNvbHMucHVyZ2VBZnRlciA/IHsgcHVyZ2VBZnRlcjogbnVsbCB9IDoge30pLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKHJlc3RvcmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJSZXN0b3JlKGlkLCByZXN0b3JlZCwgdXNlcklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3RvcmVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhIHNvZnQtZGVsZXRlZCBlbnRpdHkgYnkgaWQgKHRoZSBpbnZlcnNlIG9mIHRoZSBkZWZhdWx0IGBpc0FjdGl2ZT10cnVlYFxuICAgKiByZWFkcykg4oCUIHVzZWQgYnkgcmVzdG9yZSByb3V0ZXMgdG8gbG9hZCB0aGUgdG9tYnN0b25lIGZvciBhY2Nlc3MtY29udHJvbFxuICAgKiBnYXRpbmcgYmVmb3JlIHJlc3RvcmluZy4gUmV0dXJucyBudWxsIHVubGVzcyB0aGUgcm93IGV4aXN0cyBBTkQgaXMgYSBnZW51aW5lXG4gICAqIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKS5cbiAgICovXG4gIGFzeW5jIGZpbmREZWxldGVkQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYW4gb3JnJ3Mgc29mdC1kZWxldGVkIHRvbWJzdG9uZXMgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCksIG1vc3QtcmVjZW50bHktZGVsZXRlZCBmaXJzdCDigJQgcG93ZXJzIHRoZSBcInJlY2VudGx5IGRlbGV0ZWRcIiByZXN0b3JlXG4gICAqIFVJLiBSZXR1cm5zIGBbXWAgZm9yIGVudGl0aWVzIHdpdGhvdXQgYSBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGUuIGBsaW1pdGAgaXNcbiAgICogY2xhbXBlZCB0byBbMSwgMjAwXSB0byBrZWVwIHRoZSByZXNwb25zZSBib3VuZGVkICh0aGUgcmV0ZW50aW9uIHN3ZWVwIGhhcmQtXG4gICAqIGRlbGV0ZXMgb2xkIHRvbWJzdG9uZXMgYW55d2F5LCBzbyB0aGlzIGlzIGEgc2hvcnQsIHNlbGYtbGltaXRpbmcgbGlzdCkuXG4gICAqL1xuICBhc3luYyBmaW5kRGVsZXRlZChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIG9wdHM6IHsgbGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gW107XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCBvcHRzLmxpbWl0ID8/IDUwKSwgMjAwKTtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgwLCBvcHRzLm9mZnNldCA/PyAwKTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5vcmRlckJ5KGRlc2ModGhpcy5jb2xzLmRlbGV0ZWRBdCEpKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuICAgICAgLm9mZnNldChvZmZzZXQpXG4gICAgICAudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZC1kZWxldGUgYSBiYXRjaCBvZiB0b21ic3RvbmVzIHdob3NlIHB1cmdlIGRlYWRsaW5lIGhhcyBwYXNzZWRcbiAgICogKGBkZWxldGVkQXQgSVMgTk9UIE5VTEwgQU5EIHB1cmdlX2FmdGVyIDwgbm93YCkuIEJhdGNoZWQgKGBsaW1pdGApIHNvIGFcbiAgICogc3dlZXAgdGljayBzdGF5cyBib3VuZGVkOyB0aGUgcGVyLXNlcnZpY2Ugc3dlZXAgbG9vcHMgdW50aWwgYSB0aWNrIHJldHVybnNcbiAgICogYDwgbGltaXRgLiBSdW5zIGFjcm9zcyBBTEwgb3Jncywgc28gY2FsbGVycyBNVVNUIGludm9rZSBpdCBmcm9tIGEgc3lzYWRtaW5cbiAgICogc2NvcGUgKGBydW5Tb2Z0RGVsZXRlUHVyZ2VgIGVzdGFibGlzaGVzIG9uZSkuIGBvbkJlZm9yZVB1cmdlKGlkcywgdHgpYCB0ZWFyc1xuICAgKiBkb3duIGRlcGVuZGVudHMgbGFja2luZyBPTiBERUxFVEUgQ0FTQ0FERSBpbnNpZGUgdGhlIHNhbWUgdHg7IGBvbkFmdGVyUHVyZ2VgXG4gICAqIGhhbmRsZXMgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBwdXJnZWQuIE5vLW9wICgwKSBmb3IgZW50aXRpZXMgd2l0aG91dCB0aGUgY29sdW1ucy5cbiAgICovXG4gIGFzeW5jIHB1cmdlRXhwaXJlZChub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQgfHwgIXRoaXMuY29scy5wdXJnZUFmdGVyKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHB1cmdlZElkcyA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IGRvb21lZCA9IGF3YWl0IHR4XG4gICAgICAgIC8vIGBhcyBhbnlgOiBjb2xzLmlkIGlzIHRoZSBiYXNlIGBBbnlDb2x1bW5gLCB3aGljaCBkcml6emxlJ3MgdHlwZWRcbiAgICAgICAgLy8gc2VsZWN0LWZpZWxkIG1hcCBkb2Vzbid0IGFjY2VwdCBkaXJlY3RseSAoc2FtZSBmcmljdGlvbiB0aGUgYC5zZXQoKWBcbiAgICAgICAgLy8gY2FzdHMgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSB3b3JrIGFyb3VuZCkuIFJlc3VsdCBpcyByZS10eXBlZCBiZWxvdy5cbiAgICAgICAgLnNlbGVjdCh7IGlkOiB0aGlzLmNvbHMuaWQgYXMgYW55IH0pXG4gICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAud2hlcmUoYW5kKHNxbGAke3RoaXMuY29scy5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCwgc3FsYCR7dGhpcy5jb2xzLnB1cmdlQWZ0ZXJ9IDwgJHtub3d9YCkpXG4gICAgICAgIC5saW1pdChsaW1pdClcbiAgICAgICAgLnRoZW4ociA9PiAociBhcyBBcnJheTx7IGlkOiB1bmtub3duIH0+KS5tYXAoZCA9PiBTdHJpbmcoZC5pZCkpKTtcblxuICAgICAgaWYgKGRvb21lZC5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgICAgLy8gRGVwZW5kZW50IHRlYXJkb3duIG11c3QgaGFwcGVuIGluc2lkZSB0aGUgc2FtZSB0eCBzbyBhIEZLLWJsb2NraW5nIGNoaWxkXG4gICAgICAvLyBjYW4ndCBzdHJhbmQgdGhlIHBhcmVudC4gQSB0aHJvdyBoZXJlIGFib3J0cyB0aGlzIGJhdGNoIChyZXRyaWVkIG5leHQgdGljaykuXG4gICAgICBhd2FpdCB0aGlzLm9uQmVmb3JlUHVyZ2UoZG9vbWVkLCB0eCk7XG5cbiAgICAgIGF3YWl0IHR4LmRlbGV0ZSh0aGlzLnNjaGVtYSkud2hlcmUoaW5BcnJheSh0aGlzLmNvbHMuaWQsIGRvb21lZCkpO1xuICAgICAgcmV0dXJuIGRvb21lZDtcbiAgICB9KTtcblxuICAgIGlmIChwdXJnZWRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUHVyZ2UocHVyZ2VkSWRzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1cmdlZElkcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogT24tZGVtYW5kIGhhcmQtZGVsZXRlIG9mIGEgU0lOR0xFIHRvbWJzdG9uZSBieSBpZCDigJQgdGhlIG1hbnVhbCBjb3VudGVycGFydFxuICAgKiB0byB0aGUgcmV0ZW50aW9uIHN3ZWVwJ3MgYHB1cmdlRXhwaXJlZGAuIFBlcm1hbmVudGx5IHJlbW92ZXMgdGhlIHJvdyBPTkxZXG4gICAqIHdoZW4gaXQgaXMgYSBnZW51aW5lIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKSxcbiAgICogb3B0aW9uYWxseSBwaW5uZWQgdG8gYG9yZ0lkYCAoYW4gb3JnSWQtbGVzcyBzeXNhZG1pbiBjb250ZXh0IHNwYW5zIG9yZ3MsXG4gICAqIG1hdGNoaW5nIHJlc3RvcmUvZGVsZXRlKS4gUnVucyB0aGUgc2FtZSBgb25CZWZvcmVQdXJnZWAgZGVwZW5kZW50IHRlYXJkb3duXG4gICAqIGluc2lkZSB0aGUgdHggYW5kIHRoZSBzYW1lIGBvbkFmdGVyUHVyZ2VgIHNpZGUtZWZmZWN0cyBhcyB0aGUgc3dlZXAuXG4gICAqXG4gICAqIElnbm9yZXMgYHB1cmdlQWZ0ZXJgOiBhIG1hbnVhbCBwdXJnZSBmaW5hbGl6ZXMgYW4gYWxyZWFkeS1zb2Z0LWRlbGV0ZWQgaXRlbVxuICAgKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcmV0ZW50aW9uIGRlYWRsaW5lLiBSZXR1cm5zIHRoZVxuICAgKiBwdXJnZWQgaWQsIG9yIG51bGwgd2hlbiB0aGVyZSBpcyBubyBzdWNoIHRvbWJzdG9uZSAoYWxyZWFkeSBhY3RpdmUsIHB1cmdlZCxcbiAgICogb3V0IG9mIHNjb3BlLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICovXG4gIGFzeW5jIHB1cmdlQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZCwgaWQpO1xuXG4gICAgY29uc3QgcHVyZ2VkSWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBbZG9vbWVkXSA9IGF3YWl0IHR4XG4gICAgICAgIC8vIGBhcyBhbnlgOiBjb2xzLmlkIGlzIHRoZSBiYXNlIGBBbnlDb2x1bW5gLCB3aGljaCBkcml6emxlJ3MgdHlwZWRcbiAgICAgICAgLy8gc2VsZWN0LWZpZWxkIG1hcCBkb2Vzbid0IGFjY2VwdCBkaXJlY3RseSAoc2FtZSBmcmljdGlvbiBlbHNld2hlcmUpLlxuICAgICAgICAuc2VsZWN0KHsgaWQ6IHRoaXMuY29scy5pZCBhcyBhbnkgfSlcbiAgICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAudGhlbihyID0+IChyIGFzIEFycmF5PHsgaWQ6IHVua25vd24gfT4pLm1hcChkID0+IFN0cmluZyhkLmlkKSkpO1xuXG4gICAgICBpZiAoIWRvb21lZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIC8vIERlcGVuZGVudCB0ZWFyZG93biBpbiB0aGUgc2FtZSB0eCAoRkstYmxvY2tpbmcgY2hpbGRyZW4gY2FuJ3Qgc3RyYW5kXG4gICAgICAvLyB0aGUgcGFyZW50KSDigJQgaWRlbnRpY2FsIHRvIHRoZSBzd2VlcCdzIHBlci1iYXRjaCBwYXRoLlxuICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZVB1cmdlKFtkb29tZWRdLCB0eCk7XG4gICAgICBhd2FpdCB0eC5kZWxldGUodGhpcy5zY2hlbWEpLndoZXJlKGluQXJyYXkodGhpcy5jb2xzLmlkLCBbZG9vbWVkXSkpO1xuICAgICAgcmV0dXJuIGRvb21lZDtcbiAgICB9KTtcblxuICAgIGlmIChwdXJnZWRJZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUHVyZ2UoW3B1cmdlZElkXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwdXJnZWRJZDtcbiAgfVxufVxuIl19
|
|
@@ -3249,48 +3249,6 @@ export declare const complianceReportSchedule: import("drizzle-orm/pg-core").PgT
|
|
|
3249
3249
|
};
|
|
3250
3250
|
dialect: 'pg';
|
|
3251
3251
|
}>;
|
|
3252
|
-
export declare const complianceEntitlementWatermark: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
3253
|
-
name: "compliance_entitlement_watermark";
|
|
3254
|
-
schema: undefined;
|
|
3255
|
-
columns: {
|
|
3256
|
-
orgId: import("drizzle-orm/pg-core").PgColumn<{
|
|
3257
|
-
name: "org_id";
|
|
3258
|
-
tableName: "compliance_entitlement_watermark";
|
|
3259
|
-
dataType: "string";
|
|
3260
|
-
columnType: "PgText";
|
|
3261
|
-
data: string;
|
|
3262
|
-
driverParam: string;
|
|
3263
|
-
notNull: true;
|
|
3264
|
-
hasDefault: false;
|
|
3265
|
-
isPrimaryKey: true;
|
|
3266
|
-
isAutoincrement: false;
|
|
3267
|
-
hasRuntimeDefault: false;
|
|
3268
|
-
enumValues: [string, ...string[]];
|
|
3269
|
-
baseColumn: never;
|
|
3270
|
-
identity: undefined;
|
|
3271
|
-
generated: undefined;
|
|
3272
|
-
}, {}, {}>;
|
|
3273
|
-
lastOccurredAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
3274
|
-
name: "last_occurred_at";
|
|
3275
|
-
tableName: "compliance_entitlement_watermark";
|
|
3276
|
-
dataType: "date";
|
|
3277
|
-
columnType: "PgTimestamp";
|
|
3278
|
-
data: Date;
|
|
3279
|
-
driverParam: string;
|
|
3280
|
-
notNull: true;
|
|
3281
|
-
hasDefault: false;
|
|
3282
|
-
isPrimaryKey: false;
|
|
3283
|
-
isAutoincrement: false;
|
|
3284
|
-
hasRuntimeDefault: false;
|
|
3285
|
-
enumValues: undefined;
|
|
3286
|
-
baseColumn: never;
|
|
3287
|
-
identity: undefined;
|
|
3288
|
-
generated: undefined;
|
|
3289
|
-
}, {}, {}>;
|
|
3290
|
-
};
|
|
3291
|
-
dialect: 'pg';
|
|
3292
|
-
}>;
|
|
3293
|
-
export type ComplianceEntitlementWatermark = typeof complianceEntitlementWatermark.$inferSelect;
|
|
3294
3252
|
export type CompliancePolicy = typeof compliancePolicy.$inferSelect;
|
|
3295
3253
|
export type CompliancePolicyInsert = typeof compliancePolicy.$inferInsert;
|
|
3296
3254
|
export type ComplianceRule = typeof complianceRule.$inferSelect;
|
|
@@ -364,14 +364,4 @@ export const complianceReportSchedule = pgTable('compliance_report_schedules', {
|
|
|
364
364
|
.on(table.isActive, table.nextRunAt),
|
|
365
365
|
orgIdx: index('compliance_report_schedule_org_idx').on(table.orgId),
|
|
366
366
|
}));
|
|
367
|
-
// Per-org watermark for the billing→compliance entitlement sync
|
|
368
|
-
// (`PUT /entitlements/:orgId`). Billing stamps each push with `occurredAt`; the
|
|
369
|
-
// route skips any push not strictly newer than the stored value so out-of-order
|
|
370
|
-
// deliveries (concurrent purchase + drift reconciler, retries) can't revert a
|
|
371
|
-
// newer entitlement state. Sync metadata only — no tenant content, so no RLS.
|
|
372
|
-
// MIGRATION REQUIRED: run `pnpm drizzle-kit generate` after pulling.
|
|
373
|
-
export const complianceEntitlementWatermark = pgTable('compliance_entitlement_watermark', {
|
|
374
|
-
orgId: text('org_id').primaryKey(),
|
|
375
|
-
lastOccurredAt: timestamp('last_occurred_at', { withTimezone: true }).notNull(),
|
|
376
|
-
});
|
|
377
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9zY2hlbWEvY29tcGxpYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWlEM0g7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtJQUM3RCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRTtJQUMzQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDMUUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ3pELFNBQVMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFO0lBQ2pGLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRTtJQUN6RCxTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxF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QyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDYixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsNENBQTRDLENBQUM7U0FDbEUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUN0QyxNQUFNLEVBQUUsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Q0FDcEUsQ0FBQyxDQUFDLENBQUM7QUFFSixnRUFBZ0U7QUFDaEUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsOEVBQThFO0FBQzlFLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxPQUFPLENBQUMsa0NBQWtDLEVBQUU7SUFDeEYsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDbEMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRTtDQUNoRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGJvb2xlYW4sIGludGVnZXIsIHZhcmNoYXIsIHBnVGFibGUsIHRleHQsIHRpbWVzdGFtcCwgdXVpZCwganNvbmIsIGluZGV4LCB1bmlxdWVJbmRleCB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21wbGlhbmNlIFNlcnZpY2UgVGFibGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlIHNldmVyaXR5IGxldmVscy5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZVNldmVyaXR5ID0gJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlIHRhcmdldCBlbnRpdHkgdHlwZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVUYXJnZXQgPSAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlIG9wZXJhdG9ycyBmb3IgZmllbGQgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZU9wZXJhdG9yID1cbiAgfCAnZXEnIHwgJ25lcSdcbiAgfCAnY29udGFpbnMnIHwgJ25vdENvbnRhaW5zJ1xuICB8ICdyZWdleCdcbiAgfCAnZ3QnIHwgJ2d0ZScgfCAnbHQnIHwgJ2x0ZSdcbiAgfCAnaW4nIHwgJ25vdEluJ1xuICB8ICdleGlzdHMnIHwgJ25vdEV4aXN0cycgfCAnbm90RW1wdHknXG4gIHwgJ2NvdW50R3QnIHwgJ2NvdW50THQnXG4gIHwgJ2xlbmd0aEd0JyB8ICdsZW5ndGhMdCc7XG5cbi8qKlxuICogQ3Jvc3MtZmllbGQgY29uZGl0aW9uIG1vZGUgZm9yIG11bHRpLWNvbmRpdGlvbiBydWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZUNvbmRpdGlvbk1vZGUgPSAnYWxsJyB8ICdhbnknO1xuXG4vKipcbiAqIFJ1bGUgc2NvcGUgIG9yZy1sZXZlbCBvciBwdWJsaXNoZWQgKHN5c3RlbSBvcmcgb25seSwgb3B0LWluIHZpYSBzdWJzY3JpcHRpb24pLlxuICovXG5leHBvcnQgdHlwZSBSdWxlU2NvcGUgPSAnb3JnJyB8ICdwdWJsaXNoZWQnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGNvbmRpdGlvbiBpbiBhIGNyb3NzLWZpZWxkIHJ1bGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUNvbmRpdGlvbiB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBvcGVyYXRvcj86IFJ1bGVPcGVyYXRvcjtcbiAgdmFsdWU/OiB1bmtub3duO1xuICBkZXBlbmRzT25SdWxlPzogc3RyaW5nOyAvLyBydWxlIElEICBvbmx5IGV2YWx1YXRlIGlmIHJlZmVyZW5jZWQgcnVsZSBwYXNzZWRcbn1cblxuLyoqXG4gKiBDb21wbGlhbmNlIHBvbGljaWVzIGdyb3VwIHJ1bGVzIGludG8gbmFtZWQgc2V0cyB0aGF0IGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHRvZ2V0aGVyLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3BvbGljaWVzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUG9saWN5ID0gcGdUYWJsZSgnY29tcGxpYW5jZV9wb2xpY2llcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkuZGVmYXVsdChTWVNURU1fT1JHX0lEKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKS5kZWZhdWx0KCdzeXN0ZW0nKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcblxuICBuYW1lOiB2YXJjaGFyKCduYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICB2ZXJzaW9uOiB2YXJjaGFyKCd2ZXJzaW9uJywgeyBsZW5ndGg6IDUwIH0pLmRlZmF1bHQoJzEuMC4wJykubm90TnVsbCgpLFxuICBpc1RlbXBsYXRlOiBib29sZWFuKCdpc190ZW1wbGF0ZScpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcblxuICAvLyBObyBzaGFyaW5nIHJ1bmc6IGNvbXBsaWFuY2UgdmlzaWJpbGl0eSBpcyBvcmcgKyB0aGUgc3lzdGVtLW9yZyBjYXJ2ZS1vdXQsXG4gIC8vIGFwcGxpZWQgaW4gYGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnNgIC8gYGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zYC5cbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxuICAvLyBTb2Z0LWRlbGV0ZSBwdXJnZSBkZWFkbGluZTogdGhlIHJldGVudGlvbiBzd2VlcCBoYXJkLWRlbGV0ZXMgdG9tYnN0b25lZFxuICAvLyByb3dzIG9uY2UgYHB1cmdlX2FmdGVyYCBoYXMgcGFzc2VkIChzZXQgb24gZGVsZXRlIGFsb25nc2lkZSBkZWxldGVkX2F0KS5cbiAgcHVyZ2VBZnRlcjogdGltZXN0YW1wKCdwdXJnZV9hZnRlcicsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwdXJnZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcG9saWN5X3B1cmdlX2lkeCcpLm9uKHRhYmxlLnB1cmdlQWZ0ZXIpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5PVCBOVUxMYCksXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcG9saWN5X29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgdGVtcGxhdGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3BvbGljeV90ZW1wbGF0ZV9pZHgnKS5vbih0YWJsZS5pc1RlbXBsYXRlKSxcbiAgbmFtZU9yZ1ZlcnNpb25VbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3BvbGljeV9uYW1lX29yZ192ZXJzaW9uX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5uYW1lLCB0YWJsZS52ZXJzaW9uKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGlhbmNlIHJ1bGVzIGRlZmluZSBpbmRpdmlkdWFsIGNoZWNrcyBhZ2FpbnN0IHBsdWdpbi9waXBlbGluZSBhdHRyaWJ1dGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3J1bGVzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcnVsZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLmRlZmF1bHQoU1lTVEVNX09SR19JRCkubm90TnVsbCgpLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5kZWZhdWx0KCdzeXN0ZW0nKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JykuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG5cbiAgLy8gUnVsZSBpZGVudGl0eVxuICBuYW1lOiB2YXJjaGFyKCduYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICBwb2xpY3lJZDogdXVpZCgncG9saWN5X2lkJykucmVmZXJlbmNlcygoKSA9PiBjb21wbGlhbmNlUG9saWN5LmlkLCB7IG9uRGVsZXRlOiAnc2V0IG51bGwnIH0pLFxuICBwcmlvcml0eTogaW50ZWdlcigncHJpb3JpdHknKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIHNldmVyaXR5OiB2YXJjaGFyKCdzZXZlcml0eScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxSdWxlU2V2ZXJpdHk+KCkuZGVmYXVsdCgnZXJyb3InKS5ub3ROdWxsKCksXG5cbiAgLy8gQ2F0ZWdvcml6YXRpb25cbiAgdGFnczoganNvbmIoJ3RhZ3MnKS4kdHlwZTxzdHJpbmdbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksXG5cbiAgLy8gU2NoZWR1bGluZ1xuICBlZmZlY3RpdmVGcm9tOiB0aW1lc3RhbXAoJ2VmZmVjdGl2ZV9mcm9tJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGVmZmVjdGl2ZVVudGlsOiB0aW1lc3RhbXAoJ2VmZmVjdGl2ZV91bnRpbCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuXG4gIC8vIFNjb3BlXG4gIHNjb3BlOiB2YXJjaGFyKCdzY29wZScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxSdWxlU2NvcGU+KCkuZGVmYXVsdCgnb3JnJykubm90TnVsbCgpLFxuXG4gIC8vIEZvcmtpbmcgIHRyYWNrcyB3aGljaCBwdWJsaXNoZWQgcnVsZSB0aGlzIG9yZyBydWxlIHdhcyBjb3BpZWQgZnJvbVxuICBmb3JrZWRGcm9tUnVsZUlkOiB1dWlkKCdmb3JrZWRfZnJvbV9ydWxlX2lkJyksXG5cbiAgLy8gTm90aWZpY2F0aW9uIG92ZXJyaWRlXG4gIHN1cHByZXNzTm90aWZpY2F0aW9uOiBib29sZWFuKCdzdXBwcmVzc19ub3RpZmljYXRpb24nKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG5cbiAgLy8gT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2hlbiB0cnVlLCB0aGlzIChwYXJlbnQtb3JnKSBydWxlIGlzIGFsc28gZW5mb3JjZWQgb25cbiAgLy8gZGVzY2VuZGFudCB0ZWFtIG9yZ3MgZHVyaW5nIHRoZWlyIGNvbXBsaWFuY2UgZXZhbHVhdGlvbi5cbiAgcHJvcGFnYXRlVG9DaGlsZHJlbjogYm9vbGVhbigncHJvcGFnYXRlX3RvX2NoaWxkcmVuJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuXG4gIC8vIFNpbmdsZS1maWVsZCBjb25kaXRpb25cbiAgZmllbGQ6IHZhcmNoYXIoJ2ZpZWxkJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgb3BlcmF0b3I6IHZhcmNoYXIoJ29wZXJhdG9yJywgeyBsZW5ndGg6IDIwIH0pLiR0eXBlPFJ1bGVPcGVyYXRvcj4oKSxcbiAgdmFsdWU6IGpzb25iKCd2YWx1ZScpLFxuXG4gIC8vIENyb3NzLWZpZWxkIGNvbmRpdGlvbnMgKG92ZXJyaWRlcyBzaW5nbGUtZmllbGQgd2hlbiBwcmVzZW50KVxuICBjb25kaXRpb25zOiBqc29uYignY29uZGl0aW9ucycpLiR0eXBlPFJ1bGVDb25kaXRpb25bXT4oKSxcbiAgY29uZGl0aW9uTW9kZTogdmFyY2hhcignY29uZGl0aW9uX21vZGUnLCB7IGxlbmd0aDogNSB9KS4kdHlwZTxSdWxlQ29uZGl0aW9uTW9kZT4oKS5kZWZhdWx0KCdhbGwnKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgLy8gTm8gc2hhcmluZyBydW5nOiBjb21wbGlhbmNlIHZpc2liaWxpdHkgaXMgb3JnICsgdGhlIHN5c3RlbS1vcmcgY2FydmUtb3V0LFxuICAvLyBhcHBsaWVkIGluIGBidWlsZENvbXBsaWFuY2VQb2xpY3lDb25kaXRpb25zYCAvIGBidWlsZENvbXBsaWFuY2VSdWxlQ29uZGl0aW9uc2AuXG4gIGlzRGVmYXVsdDogYm9vbGVhbignaXNfZGVmYXVsdCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgaXNBY3RpdmU6IGJvb2xlYW4oJ2lzX2FjdGl2ZScpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbiAgLy8gU29mdC1kZWxldGUgcHVyZ2UgZGVhZGxpbmU6IHRoZSByZXRlbnRpb24gc3dlZXAgaGFyZC1kZWxldGVzIHRvbWJzdG9uZWRcbiAgLy8gcm93cyBvbmNlIGBwdXJnZV9hZnRlcmAgaGFzIHBhc3NlZCAoc2V0IG9uIGRlbGV0ZSBhbG9uZ3NpZGUgZGVsZXRlZF9hdCkuXG4gIHB1cmdlQWZ0ZXI6IHRpbWVzdGFtcCgncHVyZ2VfYWZ0ZXInLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcHVyZ2VJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfcHVyZ2VfaWR4Jykub24odGFibGUucHVyZ2VBZnRlcikud2hlcmUoc3FsYGRlbGV0ZWRfYXQgSVMgTk9UIE5VTExgKSxcbiAgb3JnVGFyZ2V0QWN0aXZlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX29yZ190YXJnZXRfYWN0aXZlX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS50YXJnZXQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgb3JnUG9saWN5SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX29yZ19wb2xpY3lfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnBvbGljeUlkKSxcbiAgcHJpb3JpdHlJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfcHJpb3JpdHlfaWR4Jykub24odGFibGUucHJpb3JpdHkpLFxuICBzY29wZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9zY29wZV9pZHgnKS5vbih0YWJsZS5zY29wZSksXG4gIGVmZmVjdGl2ZUZyb21JZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfZWZmZWN0aXZlX2Zyb21faWR4Jykub24odGFibGUuZWZmZWN0aXZlRnJvbSksXG4gIG5hbWVPcmdVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3J1bGVfbmFtZV9vcmdfdW5pcXVlJykub24odGFibGUub3JnSWQsIHRhYmxlLm5hbWUpLFxuICAvLyBQYXJ0aWFsIEdJTiBpbmRleCBiYWNraW5nIHRoZSBjdXJhdGVkLXNldCBsb29rdXBcbiAgLy8gYGZpbmRQdWJsaXNoZWRSdWxlSWRzQnlTZXRUYWdgIChzdWJzY3JpcHRpb24tc2VydmljZSk6IGEgY29udGFpbm1lbnQgcXVlcnlcbiAgLy8gYHRhZ3MgQD4gJ1tcInNldDo8eD5cIl0nOjpqc29uYmAgcmVzdHJpY3RlZCB0byBwdWJsaXNoZWQgcm93cy4gYGpzb25iX3BhdGhfb3BzYFxuICAvLyBpcyB0aGUgc21hbGxlci9mYXN0ZXIgb3BjbGFzcyDigJQgaXQgb25seSBzdXBwb3J0cyBgQD5gIChleGFjdGx5IHRoaXMgcXVlcnkpLFxuICAvLyBub3Qga2V5LWV4aXN0ZW5jZSwgd2hpY2ggd2UgbmV2ZXIgcnVuIGFnYWluc3QgYHRhZ3NgLiBTY29wZWQgdG9cbiAgLy8gYHNjb3BlID0gJ3B1Ymxpc2hlZCdgIHNvIG9ubHkgdGhlIGN1cmF0ZWQgY2F0YWxvZyAoYSBoYW5kZnVsIG9mIHJvd3MpIGlzXG4gIC8vIGluZGV4ZWQsIG5vdCBldmVyeSBvcmcncyBwcml2YXRlIHJ1bGUgdGFncy5cbiAgLy8gTUlHUkFUSU9OIFJFUVVJUkVEOiBydW4gYHBucG0gZHJpenpsZS1raXQgZ2VuZXJhdGVgIGFmdGVyIHB1bGxpbmcuXG4gIHB1Ymxpc2hlZFRhZ3NHaW5JZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfcHVibGlzaGVkX3RhZ3NfZ2luX2lkeCcpXG4gICAgLnVzaW5nKCdnaW4nLCB0YWJsZS50YWdzLm9wKCdqc29uYl9wYXRoX29wcycpKVxuICAgIC53aGVyZShzcWxgc2NvcGUgPSAncHVibGlzaGVkJ2ApLFxufSkpO1xuXG4vKipcbiAqIFRyYWNrcyBldmVyeSBjaGFuZ2UgdG8gY29tcGxpYW5jZSBydWxlcyBmb3IgdmVyc2lvbmluZyBhbmQgcm9sbGJhY2suXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcnVsZV9oaXN0b3J5XG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZUhpc3RvcnkgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBjaGFuZ2VUeXBlOiB2YXJjaGFyKCdjaGFuZ2VfdHlwZScsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIGNyZWF0ZWQgfCB1cGRhdGVkIHwgZGVsZXRlZCB8IHJlc3RvcmVkXG4gIHByZXZpb3VzU3RhdGU6IGpzb25iKCdwcmV2aW91c19zdGF0ZScpLCAvLyBmdWxsIHJ1bGUgc25hcHNob3QgYmVmb3JlIGNoYW5nZVxuICBjaGFuZ2VkQnk6IHRleHQoJ2NoYW5nZWRfYnknKS5ub3ROdWxsKCksXG4gIGNoYW5nZWRBdDogdGltZXN0YW1wKCdjaGFuZ2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcnVsZUNoYW5nZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5X3J1bGVfY2hhbmdlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5ydWxlSWQsIHRhYmxlLmNoYW5nZWRBdCksXG4gIG9yZ0NoYW5nZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5X29yZ19jaGFuZ2VkX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jaGFuZ2VkQXQpLFxuICBydWxlSWRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeV9ydWxlX2lkX2lkeCcpXG4gICAgLm9uKHRhYmxlLnJ1bGVJZCksXG59KSk7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBhdWRpdCBsb2cgIHN0b3JlcyBldmVyeSBjb21wbGlhbmNlIGNoZWNrIHJlc3VsdC5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9hdWRpdF9sb2dcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VBdWRpdExvZyA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfYXVkaXRfbG9nJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHVzZXJJZDogdGV4dCgndXNlcl9pZCcpLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIGFjdGlvbjogdmFyY2hhcignYWN0aW9uJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gdXBsb2FkIHwgZGVwbG95IHwgY3JlYXRlIHwgdXBkYXRlIHwgc2NhblxuICBlbnRpdHlJZDogdmFyY2hhcignZW50aXR5X2lkJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZW50aXR5TmFtZTogdmFyY2hhcignZW50aXR5X25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICByZXN1bHQ6IHZhcmNoYXIoJ3Jlc3VsdCcsIHsgbGVuZ3RoOiAxMCB9KS5ub3ROdWxsKCksIC8vIHBhc3MgfCB3YXJuIHwgYmxvY2tcbiAgdmlvbGF0aW9uczoganNvbmIoJ3Zpb2xhdGlvbnMnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPigpLmRlZmF1bHQoW10pLFxuICBydWxlQ291bnQ6IGludGVnZXIoJ3J1bGVfY291bnQnKS5ub3ROdWxsKCksXG4gIHNjYW5JZDogdXVpZCgnc2Nhbl9pZCcpLCAvLyBncm91cHMgZW50cmllcyBmcm9tIHRoZSBzYW1lIGJ1bGsgc2NhblxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfYXVkaXRfb3JnX2NyZWF0ZWRfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIC8vIERFU0MgdmFyaWFudCBmb3IgdGhlIGRvbWluYW50IFwibGF0ZXN0IGF1ZGl0IGV2ZW50cyBwZXIgb3JnXCIgcXVlcnlcbiAgLy8gcGF0dGVybiAoYXVkaXQgbG9nIFVJcyBzb3J0IG5ld2VzdC1maXJzdCkuIFBvc3RncmVzIGNhbiB1c2UgdGhlIGFzY1xuICAvLyBpbmRleCBmb3IgZGVzYyBzY2FucywgYnV0IGEgbWF0Y2hpbmcgREVTQyBpbmRleCBsZXRzIGluZGV4LW9ubHkgc2NhbnNcbiAgLy8gc2F0aXNmeSBgT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIG5gIHdpdGhvdXQgYSByZXZlcnNlIHN0ZXAuXG4gIC8vIE1JR1JBVElPTiBSRVFVSVJFRDogcnVuIGBwbnBtIGRyaXp6bGUta2l0IGdlbmVyYXRlYCBhZnRlciBwdWxsaW5nLlxuICBvcmdDcmVhdGVkQXREZXNjSWR4OiBpbmRleCgnY29tcGxpYW5jZV9hdWRpdF9vcmdfY3JlYXRlZF9kZXNjX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCBzcWxgJHt0YWJsZS5jcmVhdGVkQXR9IERFU0NgKSxcbiAgb3JnVGFyZ2V0UmVzdWx0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9hdWRpdF9vcmdfdGFyZ2V0X3Jlc3VsdF9pZHgnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUudGFyZ2V0LCB0YWJsZS5yZXN1bHQpLFxuICBzY2FuSWRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2F1ZGl0X3NjYW5faWRfaWR4Jykub24odGFibGUuc2NhbklkKSxcbn0pKTtcblxuLyoqXG4gKiBQZXItZW50aXR5IGV4ZW1wdGlvbnMgZnJvbSBzcGVjaWZpYyBjb21wbGlhbmNlIHJ1bGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX2V4ZW1wdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VFeGVtcHRpb24gPSBwZ1RhYmxlKCdjb21wbGlhbmNlX2V4ZW1wdGlvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgZW50aXR5VHlwZTogdmFyY2hhcignZW50aXR5X3R5cGUnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIGVudGl0eUlkOiB1dWlkKCdlbnRpdHlfaWQnKS5ub3ROdWxsKCksXG4gIGVudGl0eU5hbWU6IHZhcmNoYXIoJ2VudGl0eV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgcmVhc29uOiB0ZXh0KCdyZWFzb24nKS5ub3ROdWxsKCksXG4gIGFwcHJvdmVkQnk6IHRleHQoJ2FwcHJvdmVkX2J5JyksXG4gIHJlamVjdGlvblJlYXNvbjogdGV4dCgncmVqZWN0aW9uX3JlYXNvbicpLFxuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS5kZWZhdWx0KCdwZW5kaW5nJykubm90TnVsbCgpLCAvLyBwZW5kaW5nIHwgYXBwcm92ZWQgfCByZWplY3RlZCB8IGV4cGlyZWRcbiAgZXhwaXJlc0F0OiB0aW1lc3RhbXAoJ2V4cGlyZXNfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdSdWxlRW50aXR5VW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fb3JnX3J1bGVfZW50aXR5X3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ydWxlSWQsIHRhYmxlLmVudGl0eUlkKSxcbiAgb3JnU3RhdHVzSWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fb3JnX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuc3RhdHVzKSxcbiAgZXhwaXJlc0F0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fZXhwaXJlc19hdF9pZHgnKS5vbih0YWJsZS5leHBpcmVzQXQpLFxuICBlbnRpdHlJZElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfZXhlbXB0aW9uX2VudGl0eV9pZF9pZHgnKS5vbih0YWJsZS5lbnRpdHlJZCksXG59KSk7XG5cbi8qKlxuICogVHJhY2tzIHdoaWNoIG9yZ3MgaGF2ZSBvcHRlZCBpbnRvIHN5c3RlbS1vcmcgcHVibGlzaGVkIGNvbXBsaWFuY2UgcnVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcnVsZV9zdWJzY3JpcHRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbiA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcnVsZV9zdWJzY3JpcHRpb25zJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJ1bGVJZDogdXVpZCgncnVsZV9pZCcpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IGNvbXBsaWFuY2VSdWxlLmlkLCB7IG9uRGVsZXRlOiAnY2FzY2FkZScgfSksXG4gIHN1YnNjcmliZWRCeTogdGV4dCgnc3Vic2NyaWJlZF9ieScpLm5vdE51bGwoKSxcbiAgc3Vic2NyaWJlZEF0OiB0aW1lc3RhbXAoJ3N1YnNjcmliZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIHBpbm5lZFZlcnNpb246IGpzb25iKCdwaW5uZWRfdmVyc2lvbicpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLFxuICB1bnN1YnNjcmliZWRBdDogdGltZXN0YW1wKCd1bnN1YnNjcmliZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdW5zdWJzY3JpYmVkQnk6IHRleHQoJ3Vuc3Vic2NyaWJlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdSdWxlVW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9ydWxlX3N1Yl9vcmdfcnVsZV91bmlxdWUnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUucnVsZUlkKSxcbiAgb3JnQWN0aXZlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX3N1Yl9vcmdfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSksXG4gIHJ1bGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfc3ViX3J1bGVfaWR4Jykub24odGFibGUucnVsZUlkKSxcbn0pKTtcblxuLyoqXG4gKiBCdWxrIGNvbXBsaWFuY2Ugc2NhbnMgIHRyYWNrcyBzY2hlZHVsZWQgYW5kIG9uLWRlbWFuZCBzY2Fucy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9zY2Fuc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVNjYW4gPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3NjYW5zJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgZmlsdGVyOiBqc29uYignZmlsdGVyJyksIC8vIG9wdGlvbmFsIGVudGl0eSBmaWx0ZXIgZm9yIHBhcnRpYWwgc2NhbnNcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkuZGVmYXVsdCgncGVuZGluZycpLm5vdE51bGwoKSwgLy8gcGVuZGluZyB8IHJ1bm5pbmcgfCBjb21wbGV0ZWQgfCBmYWlsZWQgfCBjYW5jZWxsZWRcbiAgdHJpZ2dlcmVkQnk6IHZhcmNoYXIoJ3RyaWdnZXJlZF9ieScsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIG1hbnVhbCB8IHNjaGVkdWxlZCB8IHJ1bGUtY2hhbmdlIHwgcnVsZS1kcnktcnVuXG4gIHVzZXJJZDogdGV4dCgndXNlcl9pZCcpLm5vdE51bGwoKSxcbiAgdG90YWxFbnRpdGllczogaW50ZWdlcigndG90YWxfZW50aXRpZXMnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgcHJvY2Vzc2VkRW50aXRpZXM6IGludGVnZXIoJ3Byb2Nlc3NlZF9lbnRpdGllcycpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBwYXNzQ291bnQ6IGludGVnZXIoJ3Bhc3NfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgd2FybkNvdW50OiBpbnRlZ2VyKCd3YXJuX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGJsb2NrQ291bnQ6IGludGVnZXIoJ2Jsb2NrX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIC8vIFRydWUgd2hlbiB0aGUgc2NhbiBzdG9wcGVkIGVhcmx5IGF0IGEgY29uZmlndXJlZCBwZXItc2NhbiBjYXAgKHNvIHRoZVxuICAvLyBjb3VudHMgYWJvdmUgcmVwcmVzZW50IGEgc3Vic2V0LCBub3QgdGhlIGZ1bGwgZW50aXR5IHVuaXZlcnNlKS4gU3VyZmFjZWRcbiAgLy8gaW4gdGhlIHNjYW4tc3RhdHVzIFVJIHNvIHVzZXJzIGtub3cgd2hldGhlciB0byB3aWRlbiB0aGUgZmlsdGVyLlxuICAvLyBNSUdSQVRJT04gUkVRVUlSRUQ6IHJ1biBgcG5wbSBkcml6emxlLWtpdCBnZW5lcmF0ZWAgYWZ0ZXIgcHVsbGluZy5cbiAgdHJ1bmNhdGVkOiBib29sZWFuKCd0cnVuY2F0ZWQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjYW5jZWxsZWRBdDogdGltZXN0YW1wKCdjYW5jZWxsZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY2FuY2VsbGVkQnk6IHRleHQoJ2NhbmNlbGxlZF9ieScpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfc2Nhbl9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgb3JnU3RhdHVzSWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX29yZ19zdGF0dXNfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnN0YXR1cyksXG59KSk7XG5cbi8qKlxuICogQ3Jvbi1iYXNlZCByZWN1cnJpbmcgc2NhbiBzY2hlZHVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfc2Nhbl9zY2hlZHVsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgY3JvbkV4cHJlc3Npb246IHZhcmNoYXIoJ2Nyb25fZXhwcmVzc2lvbicsIHsgbGVuZ3RoOiAxMDAgfSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGxhc3RSdW5BdDogdGltZXN0YW1wKCdsYXN0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBhY3RpdmVOZXh0UnVuSWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX3NjaGVkdWxlX2FjdGl2ZV9uZXh0X2lkeCcpXG4gICAgLm9uKHRhYmxlLmlzQWN0aXZlLCB0YWJsZS5uZXh0UnVuQXQpLFxuICBvcmdJZHg6IGluZGV4KCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbn0pKTtcblxuLyoqXG4gKiBQZXItb3JnIG5vdGlmaWNhdGlvbiBzZXR0aW5ncyBmb3IgY29tcGxpYW5jZSBldmVudHMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3ByZWZlcmVuY2VzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3ByZWZlcmVuY2VzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG5vdGlmeU9uQmxvY2s6IGJvb2xlYW4oJ25vdGlmeV9vbl9ibG9jaycpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuICBub3RpZnlPbldhcm5pbmc6IGJvb2xlYW4oJ25vdGlmeV9vbl93YXJuaW5nJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICAvLyBPcHQtaW4gZW1haWwgZGVsaXZlcnkgKHRvIGB0YXJnZXRVc2Vyc2AsIG9yIGFsbCBvcmcgYWRtaW5zIHdoZW4gbnVsbCkuXG4gIGVtYWlsRW5hYmxlZDogYm9vbGVhbignZW1haWxfZW5hYmxlZCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgZGlnZXN0TW9kZTogdmFyY2hhcignZGlnZXN0X21vZGUnLCB7IGxlbmd0aDogMjAgfSkuZGVmYXVsdCgnaW1tZWRpYXRlJykubm90TnVsbCgpLCAvLyBpbW1lZGlhdGUgfCBkYWlseSB8IHdlZWtseVxuICBkaWdlc3RTY2hlZHVsZTogdmFyY2hhcignZGlnZXN0X3NjaGVkdWxlJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgbGFzdERpZ2VzdEF0OiB0aW1lc3RhbXAoJ2xhc3RfZGlnZXN0X2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHRhcmdldFVzZXJzOiBqc29uYigndGFyZ2V0X3VzZXJzJykuJHR5cGU8c3RyaW5nW10+KCksIC8vIG51bGwgPSBhbGwgb3JnIGFkbWluc1xuICB3ZWJob29rVXJsOiB2YXJjaGFyKCd3ZWJob29rX3VybCcsIHsgbGVuZ3RoOiA1MDAgfSksXG4gIHdlYmhvb2tTZWNyZXQ6IHZhcmNoYXIoJ3dlYmhvb2tfc2VjcmV0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59KTtcblxuLyoqXG4gKiBMb2cgb2YgYWxsIGNvbXBsaWFuY2Ugbm90aWZpY2F0aW9ucyBzZW50LlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9sb2dcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2cgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9sb2cnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgY2hhbm5lbDogdmFyY2hhcignY2hhbm5lbCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIGluLWFwcCB8IHdlYmhvb2sgfCBkaWdlc3RcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBzZW50IHwgZmFpbGVkIHwgcGVuZGluZ1xuICBwYXlsb2FkOiBqc29uYigncGF5bG9hZCcpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLm5vdE51bGwoKSxcbiAgd2ViaG9va1Jlc3BvbnNlQ29kZTogaW50ZWdlcignd2ViaG9va19yZXNwb25zZV9jb2RlJyksXG4gIHdlYmhvb2tFcnJvcjogdGV4dCgnd2ViaG9va19lcnJvcicpLFxuICByZXRyeUNvdW50OiBpbnRlZ2VyKCdyZXRyeV9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBuZXh0UmV0cnlBdDogdGltZXN0YW1wKCduZXh0X3JldHJ5X2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHJlbGF0ZWRBdWRpdElkOiB1dWlkKCdyZWxhdGVkX2F1ZGl0X2lkJyksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnQ3JlYXRlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fb3JnX2NyZWF0ZWRfaWR4JylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIHN0YXR1c1JldHJ5SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fc3RhdHVzX3JldHJ5X2lkeCcpXG4gICAgLm9uKHRhYmxlLnN0YXR1cywgdGFibGUubmV4dFJldHJ5QXQpLFxuICByZWxhdGVkQXVkaXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9yZWxhdGVkX2F1ZGl0X2lkeCcpXG4gICAgLm9uKHRhYmxlLnJlbGF0ZWRBdWRpdElkKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGlhbmNlLXNwZWNpZmljIFJCQUMgcm9sZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfcm9sZXNcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGVUeXBlID0gJ2NvbXBsaWFuY2Utdmlld2VyJyB8ICdjb21wbGlhbmNlLWVkaXRvcicgfCAnY29tcGxpYW5jZS1hZG1pbic7XG5cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUm9sZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfcm9sZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdXNlcklkOiB0ZXh0KCd1c2VyX2lkJykubm90TnVsbCgpLFxuICByb2xlOiB2YXJjaGFyKCdyb2xlJywgeyBsZW5ndGg6IDMwIH0pLiR0eXBlPENvbXBsaWFuY2VSb2xlVHlwZT4oKS5ub3ROdWxsKCksXG4gIGdyYW50ZWRCeTogdGV4dCgnZ3JhbnRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1VzZXJVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3JvbGVfb3JnX3VzZXJfdW5pcXVlJykub24odGFibGUub3JnSWQsIHRhYmxlLnVzZXJJZCksXG4gIG9yZ1JvbGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3JvbGVfb3JnX3JvbGVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnJvbGUpLFxufSkpO1xuXG4vKipcbiAqIEdlbmVyYXRlZCBjb21wbGlhbmNlIHJlcG9ydHMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcmVwb3J0c1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJlcG9ydCA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcmVwb3J0cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICByZXBvcnRUeXBlOiB2YXJjaGFyKCdyZXBvcnRfdHlwZScsIHsgbGVuZ3RoOiAzMCB9KS5ub3ROdWxsKCksIC8vIHN1bW1hcnkgfCBkZXRhaWxlZCB8IGF1ZGl0LXRyYWlsIHwgY29tcGFyaXNvblxuICB0YXJnZXQ6IHZhcmNoYXIoJ3RhcmdldCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIHBsdWdpbiB8IHBpcGVsaW5lIHwgYWxsXG4gIGRhdGVGcm9tOiB0aW1lc3RhbXAoJ2RhdGVfZnJvbScsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkYXRlVG86IHRpbWVzdGFtcCgnZGF0ZV90bycsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjb21wYXJlRnJvbTogdGltZXN0YW1wKCdjb21wYXJlX2Zyb20nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY29tcGFyZVRvOiB0aW1lc3RhbXAoJ2NvbXBhcmVfdG8nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGF0YToganNvbmIoJ2RhdGEnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKS5ub3ROdWxsKCksXG4gIGZvcm1hdDogdmFyY2hhcignZm9ybWF0JywgeyBsZW5ndGg6IDEwIH0pLmRlZmF1bHQoJ2pzb24nKS5ub3ROdWxsKCksIC8vIGpzb24gfCBjc3ZcbiAgZ2VuZXJhdGVkQnk6IHRleHQoJ2dlbmVyYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdDcmVhdGVkQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3JlcG9ydF9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbn0pKTtcblxuLyoqXG4gKiBDcm9uLWJhc2VkIHJlY3VycmluZyByZXBvcnQgZ2VuZXJhdGlvbiBzY2hlZHVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlID0gcGdUYWJsZSgnY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlcG9ydFR5cGU6IHZhcmNoYXIoJ3JlcG9ydF90eXBlJywgeyBsZW5ndGg6IDMwIH0pLm5vdE51bGwoKSwgLy8gc3VtbWFyeSB8IGRldGFpbGVkXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgZm9ybWF0OiB2YXJjaGFyKCdmb3JtYXQnLCB7IGxlbmd0aDogMTAgfSkuZGVmYXVsdCgnanNvbicpLm5vdE51bGwoKSxcbiAgY3JvbkV4cHJlc3Npb246IHZhcmNoYXIoJ2Nyb25fZXhwcmVzc2lvbicsIHsgbGVuZ3RoOiAxMDAgfSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGxhc3RSdW5BdDogdGltZXN0YW1wKCdsYXN0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsaXZlclRvOiBqc29uYignZGVsaXZlcl90bycpLiR0eXBlPHN0cmluZ1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSwgLy8gdXNlcklkcyB0byBub3RpZnlcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBhY3RpdmVOZXh0UnVuSWR4OiBpbmRleCgnY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVfYWN0aXZlX25leHRfaWR4JylcbiAgICAub24odGFibGUuaXNBY3RpdmUsIHRhYmxlLm5leHRSdW5BdCksXG4gIG9yZ0lkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlX29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8vIFBlci1vcmcgd2F0ZXJtYXJrIGZvciB0aGUgYmlsbGluZ+KGkmNvbXBsaWFuY2UgZW50aXRsZW1lbnQgc3luY1xuLy8gKGBQVVQgL2VudGl0bGVtZW50cy86b3JnSWRgKS4gQmlsbGluZyBzdGFtcHMgZWFjaCBwdXNoIHdpdGggYG9jY3VycmVkQXRgOyB0aGVcbi8vIHJvdXRlIHNraXBzIGFueSBwdXNoIG5vdCBzdHJpY3RseSBuZXdlciB0aGFuIHRoZSBzdG9yZWQgdmFsdWUgc28gb3V0LW9mLW9yZGVyXG4vLyBkZWxpdmVyaWVzIChjb25jdXJyZW50IHB1cmNoYXNlICsgZHJpZnQgcmVjb25jaWxlciwgcmV0cmllcykgY2FuJ3QgcmV2ZXJ0IGFcbi8vIG5ld2VyIGVudGl0bGVtZW50IHN0YXRlLiBTeW5jIG1ldGFkYXRhIG9ubHkg4oCUIG5vIHRlbmFudCBjb250ZW50LCBzbyBubyBSTFMuXG4vLyBNSUdSQVRJT04gUkVRVUlSRUQ6IHJ1biBgcG5wbSBkcml6emxlLWtpdCBnZW5lcmF0ZWAgYWZ0ZXIgcHVsbGluZy5cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlRW50aXRsZW1lbnRXYXRlcm1hcmsgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX2VudGl0bGVtZW50X3dhdGVybWFyaycsIHtcbiAgb3JnSWQ6IHRleHQoJ29yZ19pZCcpLnByaW1hcnlLZXkoKSxcbiAgbGFzdE9jY3VycmVkQXQ6IHRpbWVzdGFtcCgnbGFzdF9vY2N1cnJlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLm5vdE51bGwoKSxcbn0pO1xuXG4vLyBDb21wbGlhbmNlIHR5cGVzXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlRW50aXRsZW1lbnRXYXRlcm1hcmsgPSB0eXBlb2YgY29tcGxpYW5jZUVudGl0bGVtZW50V2F0ZXJtYXJrLiRpbmZlclNlbGVjdDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVBvbGljeSA9IHR5cGVvZiBjb21wbGlhbmNlUG9saWN5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VQb2xpY3lJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVBvbGljeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJ1bGVIaXN0b3J5ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlSGlzdG9yeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZUhpc3RvcnlJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUF1ZGl0TG9nID0gdHlwZW9mIGNvbXBsaWFuY2VBdWRpdExvZy4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlQXVkaXRMb2dJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUF1ZGl0TG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUV4ZW1wdGlvbiA9IHR5cGVvZiBjb21wbGlhbmNlRXhlbXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb25JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUV4ZW1wdGlvbi4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW4gPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlU2NhblNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5TY2hlZHVsZUluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlU2NhblNjaGVkdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2VJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nID0gdHlwZW9mIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2cuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZ0luc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGUgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0ID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydEluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlUmVwb3J0LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0U2NoZWR1bGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlLiRpbmZlckluc2VydDtcbiJdfQ==
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9zY2hlbWEvY29tcGxpYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWlEM0g7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtJQUM3RCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRTtJQUMzQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDMUUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ3pELFNBQVMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFO0lBQ2pGLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRTtJQUN6RCxTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxF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QyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDYixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsNENBQTRDLENBQUM7U0FDbEUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUN0QyxNQUFNLEVBQUUsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Q0FDcEUsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGJvb2xlYW4sIGludGVnZXIsIHZhcmNoYXIsIHBnVGFibGUsIHRleHQsIHRpbWVzdGFtcCwgdXVpZCwganNvbmIsIGluZGV4LCB1bmlxdWVJbmRleCB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21wbGlhbmNlIFNlcnZpY2UgVGFibGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlIHNldmVyaXR5IGxldmVscy5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZVNldmVyaXR5ID0gJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlIHRhcmdldCBlbnRpdHkgdHlwZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVUYXJnZXQgPSAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBydWxlIG9wZXJhdG9ycyBmb3IgZmllbGQgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZU9wZXJhdG9yID1cbiAgfCAnZXEnIHwgJ25lcSdcbiAgfCAnY29udGFpbnMnIHwgJ25vdENvbnRhaW5zJ1xuICB8ICdyZWdleCdcbiAgfCAnZ3QnIHwgJ2d0ZScgfCAnbHQnIHwgJ2x0ZSdcbiAgfCAnaW4nIHwgJ25vdEluJ1xuICB8ICdleGlzdHMnIHwgJ25vdEV4aXN0cycgfCAnbm90RW1wdHknXG4gIHwgJ2NvdW50R3QnIHwgJ2NvdW50THQnXG4gIHwgJ2xlbmd0aEd0JyB8ICdsZW5ndGhMdCc7XG5cbi8qKlxuICogQ3Jvc3MtZmllbGQgY29uZGl0aW9uIG1vZGUgZm9yIG11bHRpLWNvbmRpdGlvbiBydWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZUNvbmRpdGlvbk1vZGUgPSAnYWxsJyB8ICdhbnknO1xuXG4vKipcbiAqIFJ1bGUgc2NvcGUgIG9yZy1sZXZlbCBvciBwdWJsaXNoZWQgKHN5c3RlbSBvcmcgb25seSwgb3B0LWluIHZpYSBzdWJzY3JpcHRpb24pLlxuICovXG5leHBvcnQgdHlwZSBSdWxlU2NvcGUgPSAnb3JnJyB8ICdwdWJsaXNoZWQnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGNvbmRpdGlvbiBpbiBhIGNyb3NzLWZpZWxkIHJ1bGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUNvbmRpdGlvbiB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBvcGVyYXRvcj86IFJ1bGVPcGVyYXRvcjtcbiAgdmFsdWU/OiB1bmtub3duO1xuICBkZXBlbmRzT25SdWxlPzogc3RyaW5nOyAvLyBydWxlIElEICBvbmx5IGV2YWx1YXRlIGlmIHJlZmVyZW5jZWQgcnVsZSBwYXNzZWRcbn1cblxuLyoqXG4gKiBDb21wbGlhbmNlIHBvbGljaWVzIGdyb3VwIHJ1bGVzIGludG8gbmFtZWQgc2V0cyB0aGF0IGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHRvZ2V0aGVyLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3BvbGljaWVzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUG9saWN5ID0gcGdUYWJsZSgnY29tcGxpYW5jZV9wb2xpY2llcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkuZGVmYXVsdChTWVNURU1fT1JHX0lEKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKS5kZWZhdWx0KCdzeXN0ZW0nKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcblxuICBuYW1lOiB2YXJjaGFyKCduYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICB2ZXJzaW9uOiB2YXJjaGFyKCd2ZXJzaW9uJywgeyBsZW5ndGg6IDUwIH0pLmRlZmF1bHQoJzEuMC4wJykubm90TnVsbCgpLFxuICBpc1RlbXBsYXRlOiBib29sZWFuKCdpc190ZW1wbGF0ZScpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcblxuICAvLyBObyBzaGFyaW5nIHJ1bmc6IGNvbXBsaWFuY2UgdmlzaWJpbGl0eSBpcyBvcmcgKyB0aGUgc3lzdGVtLW9yZyBjYXJ2ZS1vdXQsXG4gIC8vIGFwcGxpZWQgaW4gYGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnNgIC8gYGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zYC5cbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxuICAvLyBTb2Z0LWRlbGV0ZSBwdXJnZSBkZWFkbGluZTogdGhlIHJldGVudGlvbiBzd2VlcCBoYXJkLWRlbGV0ZXMgdG9tYnN0b25lZFxuICAvLyByb3dzIG9uY2UgYHB1cmdlX2FmdGVyYCBoYXMgcGFzc2VkIChzZXQgb24gZGVsZXRlIGFsb25nc2lkZSBkZWxldGVkX2F0KS5cbiAgcHVyZ2VBZnRlcjogdGltZXN0YW1wKCdwdXJnZV9hZnRlcicsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwdXJnZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcG9saWN5X3B1cmdlX2lkeCcpLm9uKHRhYmxlLnB1cmdlQWZ0ZXIpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5PVCBOVUxMYCksXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcG9saWN5X29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgdGVtcGxhdGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3BvbGljeV90ZW1wbGF0ZV9pZHgnKS5vbih0YWJsZS5pc1RlbXBsYXRlKSxcbiAgbmFtZU9yZ1ZlcnNpb25VbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3BvbGljeV9uYW1lX29yZ192ZXJzaW9uX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5uYW1lLCB0YWJsZS52ZXJzaW9uKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGlhbmNlIHJ1bGVzIGRlZmluZSBpbmRpdmlkdWFsIGNoZWNrcyBhZ2FpbnN0IHBsdWdpbi9waXBlbGluZSBhdHRyaWJ1dGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3J1bGVzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcnVsZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLmRlZmF1bHQoU1lTVEVNX09SR19JRCkubm90TnVsbCgpLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5kZWZhdWx0KCdzeXN0ZW0nKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JykuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG5cbiAgLy8gUnVsZSBpZGVudGl0eVxuICBuYW1lOiB2YXJjaGFyKCduYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICBwb2xpY3lJZDogdXVpZCgncG9saWN5X2lkJykucmVmZXJlbmNlcygoKSA9PiBjb21wbGlhbmNlUG9saWN5LmlkLCB7IG9uRGVsZXRlOiAnc2V0IG51bGwnIH0pLFxuICBwcmlvcml0eTogaW50ZWdlcigncHJpb3JpdHknKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIHNldmVyaXR5OiB2YXJjaGFyKCdzZXZlcml0eScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxSdWxlU2V2ZXJpdHk+KCkuZGVmYXVsdCgnZXJyb3InKS5ub3ROdWxsKCksXG5cbiAgLy8gQ2F0ZWdvcml6YXRpb25cbiAgdGFnczoganNvbmIoJ3RhZ3MnKS4kdHlwZTxzdHJpbmdbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksXG5cbiAgLy8gU2NoZWR1bGluZ1xuICBlZmZlY3RpdmVGcm9tOiB0aW1lc3RhbXAoJ2VmZmVjdGl2ZV9mcm9tJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGVmZmVjdGl2ZVVudGlsOiB0aW1lc3RhbXAoJ2VmZmVjdGl2ZV91bnRpbCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuXG4gIC8vIFNjb3BlXG4gIHNjb3BlOiB2YXJjaGFyKCdzY29wZScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxSdWxlU2NvcGU+KCkuZGVmYXVsdCgnb3JnJykubm90TnVsbCgpLFxuXG4gIC8vIEZvcmtpbmcgIHRyYWNrcyB3aGljaCBwdWJsaXNoZWQgcnVsZSB0aGlzIG9yZyBydWxlIHdhcyBjb3BpZWQgZnJvbVxuICBmb3JrZWRGcm9tUnVsZUlkOiB1dWlkKCdmb3JrZWRfZnJvbV9ydWxlX2lkJyksXG5cbiAgLy8gTm90aWZpY2F0aW9uIG92ZXJyaWRlXG4gIHN1cHByZXNzTm90aWZpY2F0aW9uOiBib29sZWFuKCdzdXBwcmVzc19ub3RpZmljYXRpb24nKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG5cbiAgLy8gT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2hlbiB0cnVlLCB0aGlzIChwYXJlbnQtb3JnKSBydWxlIGlzIGFsc28gZW5mb3JjZWQgb25cbiAgLy8gZGVzY2VuZGFudCB0ZWFtIG9yZ3MgZHVyaW5nIHRoZWlyIGNvbXBsaWFuY2UgZXZhbHVhdGlvbi5cbiAgcHJvcGFnYXRlVG9DaGlsZHJlbjogYm9vbGVhbigncHJvcGFnYXRlX3RvX2NoaWxkcmVuJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuXG4gIC8vIFNpbmdsZS1maWVsZCBjb25kaXRpb25cbiAgZmllbGQ6IHZhcmNoYXIoJ2ZpZWxkJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgb3BlcmF0b3I6IHZhcmNoYXIoJ29wZXJhdG9yJywgeyBsZW5ndGg6IDIwIH0pLiR0eXBlPFJ1bGVPcGVyYXRvcj4oKSxcbiAgdmFsdWU6IGpzb25iKCd2YWx1ZScpLFxuXG4gIC8vIENyb3NzLWZpZWxkIGNvbmRpdGlvbnMgKG92ZXJyaWRlcyBzaW5nbGUtZmllbGQgd2hlbiBwcmVzZW50KVxuICBjb25kaXRpb25zOiBqc29uYignY29uZGl0aW9ucycpLiR0eXBlPFJ1bGVDb25kaXRpb25bXT4oKSxcbiAgY29uZGl0aW9uTW9kZTogdmFyY2hhcignY29uZGl0aW9uX21vZGUnLCB7IGxlbmd0aDogNSB9KS4kdHlwZTxSdWxlQ29uZGl0aW9uTW9kZT4oKS5kZWZhdWx0KCdhbGwnKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgLy8gTm8gc2hhcmluZyBydW5nOiBjb21wbGlhbmNlIHZpc2liaWxpdHkgaXMgb3JnICsgdGhlIHN5c3RlbS1vcmcgY2FydmUtb3V0LFxuICAvLyBhcHBsaWVkIGluIGBidWlsZENvbXBsaWFuY2VQb2xpY3lDb25kaXRpb25zYCAvIGBidWlsZENvbXBsaWFuY2VSdWxlQ29uZGl0aW9uc2AuXG4gIGlzRGVmYXVsdDogYm9vbGVhbignaXNfZGVmYXVsdCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgaXNBY3RpdmU6IGJvb2xlYW4oJ2lzX2FjdGl2ZScpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbiAgLy8gU29mdC1kZWxldGUgcHVyZ2UgZGVhZGxpbmU6IHRoZSByZXRlbnRpb24gc3dlZXAgaGFyZC1kZWxldGVzIHRvbWJzdG9uZWRcbiAgLy8gcm93cyBvbmNlIGBwdXJnZV9hZnRlcmAgaGFzIHBhc3NlZCAoc2V0IG9uIGRlbGV0ZSBhbG9uZ3NpZGUgZGVsZXRlZF9hdCkuXG4gIHB1cmdlQWZ0ZXI6IHRpbWVzdGFtcCgncHVyZ2VfYWZ0ZXInLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcHVyZ2VJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfcHVyZ2VfaWR4Jykub24odGFibGUucHVyZ2VBZnRlcikud2hlcmUoc3FsYGRlbGV0ZWRfYXQgSVMgTk9UIE5VTExgKSxcbiAgb3JnVGFyZ2V0QWN0aXZlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX29yZ190YXJnZXRfYWN0aXZlX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS50YXJnZXQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgb3JnUG9saWN5SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX29yZ19wb2xpY3lfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnBvbGljeUlkKSxcbiAgcHJpb3JpdHlJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfcHJpb3JpdHlfaWR4Jykub24odGFibGUucHJpb3JpdHkpLFxuICBzY29wZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9zY29wZV9pZHgnKS5vbih0YWJsZS5zY29wZSksXG4gIGVmZmVjdGl2ZUZyb21JZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfZWZmZWN0aXZlX2Zyb21faWR4Jykub24odGFibGUuZWZmZWN0aXZlRnJvbSksXG4gIG5hbWVPcmdVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3J1bGVfbmFtZV9vcmdfdW5pcXVlJykub24odGFibGUub3JnSWQsIHRhYmxlLm5hbWUpLFxuICAvLyBQYXJ0aWFsIEdJTiBpbmRleCBiYWNraW5nIHRoZSBjdXJhdGVkLXNldCBsb29rdXBcbiAgLy8gYGZpbmRQdWJsaXNoZWRSdWxlSWRzQnlTZXRUYWdgIChzdWJzY3JpcHRpb24tc2VydmljZSk6IGEgY29udGFpbm1lbnQgcXVlcnlcbiAgLy8gYHRhZ3MgQD4gJ1tcInNldDo8eD5cIl0nOjpqc29uYmAgcmVzdHJpY3RlZCB0byBwdWJsaXNoZWQgcm93cy4gYGpzb25iX3BhdGhfb3BzYFxuICAvLyBpcyB0aGUgc21hbGxlci9mYXN0ZXIgb3BjbGFzcyDigJQgaXQgb25seSBzdXBwb3J0cyBgQD5gIChleGFjdGx5IHRoaXMgcXVlcnkpLFxuICAvLyBub3Qga2V5LWV4aXN0ZW5jZSwgd2hpY2ggd2UgbmV2ZXIgcnVuIGFnYWluc3QgYHRhZ3NgLiBTY29wZWQgdG9cbiAgLy8gYHNjb3BlID0gJ3B1Ymxpc2hlZCdgIHNvIG9ubHkgdGhlIGN1cmF0ZWQgY2F0YWxvZyAoYSBoYW5kZnVsIG9mIHJvd3MpIGlzXG4gIC8vIGluZGV4ZWQsIG5vdCBldmVyeSBvcmcncyBwcml2YXRlIHJ1bGUgdGFncy5cbiAgLy8gTUlHUkFUSU9OIFJFUVVJUkVEOiBydW4gYHBucG0gZHJpenpsZS1raXQgZ2VuZXJhdGVgIGFmdGVyIHB1bGxpbmcuXG4gIHB1Ymxpc2hlZFRhZ3NHaW5JZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfcHVibGlzaGVkX3RhZ3NfZ2luX2lkeCcpXG4gICAgLnVzaW5nKCdnaW4nLCB0YWJsZS50YWdzLm9wKCdqc29uYl9wYXRoX29wcycpKVxuICAgIC53aGVyZShzcWxgc2NvcGUgPSAncHVibGlzaGVkJ2ApLFxufSkpO1xuXG4vKipcbiAqIFRyYWNrcyBldmVyeSBjaGFuZ2UgdG8gY29tcGxpYW5jZSBydWxlcyBmb3IgdmVyc2lvbmluZyBhbmQgcm9sbGJhY2suXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcnVsZV9oaXN0b3J5XG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZUhpc3RvcnkgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBjaGFuZ2VUeXBlOiB2YXJjaGFyKCdjaGFuZ2VfdHlwZScsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIGNyZWF0ZWQgfCB1cGRhdGVkIHwgZGVsZXRlZCB8IHJlc3RvcmVkXG4gIHByZXZpb3VzU3RhdGU6IGpzb25iKCdwcmV2aW91c19zdGF0ZScpLCAvLyBmdWxsIHJ1bGUgc25hcHNob3QgYmVmb3JlIGNoYW5nZVxuICBjaGFuZ2VkQnk6IHRleHQoJ2NoYW5nZWRfYnknKS5ub3ROdWxsKCksXG4gIGNoYW5nZWRBdDogdGltZXN0YW1wKCdjaGFuZ2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcnVsZUNoYW5nZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5X3J1bGVfY2hhbmdlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5ydWxlSWQsIHRhYmxlLmNoYW5nZWRBdCksXG4gIG9yZ0NoYW5nZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9oaXN0b3J5X29yZ19jaGFuZ2VkX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jaGFuZ2VkQXQpLFxuICBydWxlSWRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeV9ydWxlX2lkX2lkeCcpXG4gICAgLm9uKHRhYmxlLnJ1bGVJZCksXG59KSk7XG5cbi8qKlxuICogQ29tcGxpYW5jZSBhdWRpdCBsb2cgIHN0b3JlcyBldmVyeSBjb21wbGlhbmNlIGNoZWNrIHJlc3VsdC5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9hdWRpdF9sb2dcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VBdWRpdExvZyA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfYXVkaXRfbG9nJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHVzZXJJZDogdGV4dCgndXNlcl9pZCcpLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIGFjdGlvbjogdmFyY2hhcignYWN0aW9uJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gdXBsb2FkIHwgZGVwbG95IHwgY3JlYXRlIHwgdXBkYXRlIHwgc2NhblxuICBlbnRpdHlJZDogdmFyY2hhcignZW50aXR5X2lkJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZW50aXR5TmFtZTogdmFyY2hhcignZW50aXR5X25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICByZXN1bHQ6IHZhcmNoYXIoJ3Jlc3VsdCcsIHsgbGVuZ3RoOiAxMCB9KS5ub3ROdWxsKCksIC8vIHBhc3MgfCB3YXJuIHwgYmxvY2tcbiAgdmlvbGF0aW9uczoganNvbmIoJ3Zpb2xhdGlvbnMnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPigpLmRlZmF1bHQoW10pLFxuICBydWxlQ291bnQ6IGludGVnZXIoJ3J1bGVfY291bnQnKS5ub3ROdWxsKCksXG4gIHNjYW5JZDogdXVpZCgnc2Nhbl9pZCcpLCAvLyBncm91cHMgZW50cmllcyBmcm9tIHRoZSBzYW1lIGJ1bGsgc2NhblxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfYXVkaXRfb3JnX2NyZWF0ZWRfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIC8vIERFU0MgdmFyaWFudCBmb3IgdGhlIGRvbWluYW50IFwibGF0ZXN0IGF1ZGl0IGV2ZW50cyBwZXIgb3JnXCIgcXVlcnlcbiAgLy8gcGF0dGVybiAoYXVkaXQgbG9nIFVJcyBzb3J0IG5ld2VzdC1maXJzdCkuIFBvc3RncmVzIGNhbiB1c2UgdGhlIGFzY1xuICAvLyBpbmRleCBmb3IgZGVzYyBzY2FucywgYnV0IGEgbWF0Y2hpbmcgREVTQyBpbmRleCBsZXRzIGluZGV4LW9ubHkgc2NhbnNcbiAgLy8gc2F0aXNmeSBgT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIG5gIHdpdGhvdXQgYSByZXZlcnNlIHN0ZXAuXG4gIC8vIE1JR1JBVElPTiBSRVFVSVJFRDogcnVuIGBwbnBtIGRyaXp6bGUta2l0IGdlbmVyYXRlYCBhZnRlciBwdWxsaW5nLlxuICBvcmdDcmVhdGVkQXREZXNjSWR4OiBpbmRleCgnY29tcGxpYW5jZV9hdWRpdF9vcmdfY3JlYXRlZF9kZXNjX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCBzcWxgJHt0YWJsZS5jcmVhdGVkQXR9IERFU0NgKSxcbiAgb3JnVGFyZ2V0UmVzdWx0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9hdWRpdF9vcmdfdGFyZ2V0X3Jlc3VsdF9pZHgnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUudGFyZ2V0LCB0YWJsZS5yZXN1bHQpLFxuICBzY2FuSWRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2F1ZGl0X3NjYW5faWRfaWR4Jykub24odGFibGUuc2NhbklkKSxcbn0pKTtcblxuLyoqXG4gKiBQZXItZW50aXR5IGV4ZW1wdGlvbnMgZnJvbSBzcGVjaWZpYyBjb21wbGlhbmNlIHJ1bGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX2V4ZW1wdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VFeGVtcHRpb24gPSBwZ1RhYmxlKCdjb21wbGlhbmNlX2V4ZW1wdGlvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgZW50aXR5VHlwZTogdmFyY2hhcignZW50aXR5X3R5cGUnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UnVsZVRhcmdldD4oKS5ub3ROdWxsKCksXG4gIGVudGl0eUlkOiB1dWlkKCdlbnRpdHlfaWQnKS5ub3ROdWxsKCksXG4gIGVudGl0eU5hbWU6IHZhcmNoYXIoJ2VudGl0eV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgcmVhc29uOiB0ZXh0KCdyZWFzb24nKS5ub3ROdWxsKCksXG4gIGFwcHJvdmVkQnk6IHRleHQoJ2FwcHJvdmVkX2J5JyksXG4gIHJlamVjdGlvblJlYXNvbjogdGV4dCgncmVqZWN0aW9uX3JlYXNvbicpLFxuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS5kZWZhdWx0KCdwZW5kaW5nJykubm90TnVsbCgpLCAvLyBwZW5kaW5nIHwgYXBwcm92ZWQgfCByZWplY3RlZCB8IGV4cGlyZWRcbiAgZXhwaXJlc0F0OiB0aW1lc3RhbXAoJ2V4cGlyZXNfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdSdWxlRW50aXR5VW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fb3JnX3J1bGVfZW50aXR5X3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ydWxlSWQsIHRhYmxlLmVudGl0eUlkKSxcbiAgb3JnU3RhdHVzSWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fb3JnX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuc3RhdHVzKSxcbiAgZXhwaXJlc0F0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fZXhwaXJlc19hdF9pZHgnKS5vbih0YWJsZS5leHBpcmVzQXQpLFxuICBlbnRpdHlJZElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfZXhlbXB0aW9uX2VudGl0eV9pZF9pZHgnKS5vbih0YWJsZS5lbnRpdHlJZCksXG59KSk7XG5cbi8qKlxuICogVHJhY2tzIHdoaWNoIG9yZ3MgaGF2ZSBvcHRlZCBpbnRvIHN5c3RlbS1vcmcgcHVibGlzaGVkIGNvbXBsaWFuY2UgcnVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcnVsZV9zdWJzY3JpcHRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbiA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcnVsZV9zdWJzY3JpcHRpb25zJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJ1bGVJZDogdXVpZCgncnVsZV9pZCcpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IGNvbXBsaWFuY2VSdWxlLmlkLCB7IG9uRGVsZXRlOiAnY2FzY2FkZScgfSksXG4gIHN1YnNjcmliZWRCeTogdGV4dCgnc3Vic2NyaWJlZF9ieScpLm5vdE51bGwoKSxcbiAgc3Vic2NyaWJlZEF0OiB0aW1lc3RhbXAoJ3N1YnNjcmliZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIHBpbm5lZFZlcnNpb246IGpzb25iKCdwaW5uZWRfdmVyc2lvbicpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLFxuICB1bnN1YnNjcmliZWRBdDogdGltZXN0YW1wKCd1bnN1YnNjcmliZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdW5zdWJzY3JpYmVkQnk6IHRleHQoJ3Vuc3Vic2NyaWJlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdSdWxlVW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9ydWxlX3N1Yl9vcmdfcnVsZV91bmlxdWUnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUucnVsZUlkKSxcbiAgb3JnQWN0aXZlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX3N1Yl9vcmdfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSksXG4gIHJ1bGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfc3ViX3J1bGVfaWR4Jykub24odGFibGUucnVsZUlkKSxcbn0pKTtcblxuLyoqXG4gKiBCdWxrIGNvbXBsaWFuY2Ugc2NhbnMgIHRyYWNrcyBzY2hlZHVsZWQgYW5kIG9uLWRlbWFuZCBzY2Fucy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9zY2Fuc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVNjYW4gPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3NjYW5zJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgZmlsdGVyOiBqc29uYignZmlsdGVyJyksIC8vIG9wdGlvbmFsIGVudGl0eSBmaWx0ZXIgZm9yIHBhcnRpYWwgc2NhbnNcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkuZGVmYXVsdCgncGVuZGluZycpLm5vdE51bGwoKSwgLy8gcGVuZGluZyB8IHJ1bm5pbmcgfCBjb21wbGV0ZWQgfCBmYWlsZWQgfCBjYW5jZWxsZWRcbiAgdHJpZ2dlcmVkQnk6IHZhcmNoYXIoJ3RyaWdnZXJlZF9ieScsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIG1hbnVhbCB8IHNjaGVkdWxlZCB8IHJ1bGUtY2hhbmdlIHwgcnVsZS1kcnktcnVuXG4gIHVzZXJJZDogdGV4dCgndXNlcl9pZCcpLm5vdE51bGwoKSxcbiAgdG90YWxFbnRpdGllczogaW50ZWdlcigndG90YWxfZW50aXRpZXMnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgcHJvY2Vzc2VkRW50aXRpZXM6IGludGVnZXIoJ3Byb2Nlc3NlZF9lbnRpdGllcycpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBwYXNzQ291bnQ6IGludGVnZXIoJ3Bhc3NfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgd2FybkNvdW50OiBpbnRlZ2VyKCd3YXJuX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGJsb2NrQ291bnQ6IGludGVnZXIoJ2Jsb2NrX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIC8vIFRydWUgd2hlbiB0aGUgc2NhbiBzdG9wcGVkIGVhcmx5IGF0IGEgY29uZmlndXJlZCBwZXItc2NhbiBjYXAgKHNvIHRoZVxuICAvLyBjb3VudHMgYWJvdmUgcmVwcmVzZW50IGEgc3Vic2V0LCBub3QgdGhlIGZ1bGwgZW50aXR5IHVuaXZlcnNlKS4gU3VyZmFjZWRcbiAgLy8gaW4gdGhlIHNjYW4tc3RhdHVzIFVJIHNvIHVzZXJzIGtub3cgd2hldGhlciB0byB3aWRlbiB0aGUgZmlsdGVyLlxuICAvLyBNSUdSQVRJT04gUkVRVUlSRUQ6IHJ1biBgcG5wbSBkcml6emxlLWtpdCBnZW5lcmF0ZWAgYWZ0ZXIgcHVsbGluZy5cbiAgdHJ1bmNhdGVkOiBib29sZWFuKCd0cnVuY2F0ZWQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjYW5jZWxsZWRBdDogdGltZXN0YW1wKCdjYW5jZWxsZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY2FuY2VsbGVkQnk6IHRleHQoJ2NhbmNlbGxlZF9ieScpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfc2Nhbl9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgb3JnU3RhdHVzSWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX29yZ19zdGF0dXNfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnN0YXR1cyksXG59KSk7XG5cbi8qKlxuICogQ3Jvbi1iYXNlZCByZWN1cnJpbmcgc2NhbiBzY2hlZHVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfc2Nhbl9zY2hlZHVsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgY3JvbkV4cHJlc3Npb246IHZhcmNoYXIoJ2Nyb25fZXhwcmVzc2lvbicsIHsgbGVuZ3RoOiAxMDAgfSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGxhc3RSdW5BdDogdGltZXN0YW1wKCdsYXN0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBhY3RpdmVOZXh0UnVuSWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX3NjaGVkdWxlX2FjdGl2ZV9uZXh0X2lkeCcpXG4gICAgLm9uKHRhYmxlLmlzQWN0aXZlLCB0YWJsZS5uZXh0UnVuQXQpLFxuICBvcmdJZHg6IGluZGV4KCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbn0pKTtcblxuLyoqXG4gKiBQZXItb3JnIG5vdGlmaWNhdGlvbiBzZXR0aW5ncyBmb3IgY29tcGxpYW5jZSBldmVudHMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3ByZWZlcmVuY2VzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3ByZWZlcmVuY2VzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG5vdGlmeU9uQmxvY2s6IGJvb2xlYW4oJ25vdGlmeV9vbl9ibG9jaycpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuICBub3RpZnlPbldhcm5pbmc6IGJvb2xlYW4oJ25vdGlmeV9vbl93YXJuaW5nJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICAvLyBPcHQtaW4gZW1haWwgZGVsaXZlcnkgKHRvIGB0YXJnZXRVc2Vyc2AsIG9yIGFsbCBvcmcgYWRtaW5zIHdoZW4gbnVsbCkuXG4gIGVtYWlsRW5hYmxlZDogYm9vbGVhbignZW1haWxfZW5hYmxlZCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgZGlnZXN0TW9kZTogdmFyY2hhcignZGlnZXN0X21vZGUnLCB7IGxlbmd0aDogMjAgfSkuZGVmYXVsdCgnaW1tZWRpYXRlJykubm90TnVsbCgpLCAvLyBpbW1lZGlhdGUgfCBkYWlseSB8IHdlZWtseVxuICBkaWdlc3RTY2hlZHVsZTogdmFyY2hhcignZGlnZXN0X3NjaGVkdWxlJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgbGFzdERpZ2VzdEF0OiB0aW1lc3RhbXAoJ2xhc3RfZGlnZXN0X2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHRhcmdldFVzZXJzOiBqc29uYigndGFyZ2V0X3VzZXJzJykuJHR5cGU8c3RyaW5nW10+KCksIC8vIG51bGwgPSBhbGwgb3JnIGFkbWluc1xuICB3ZWJob29rVXJsOiB2YXJjaGFyKCd3ZWJob29rX3VybCcsIHsgbGVuZ3RoOiA1MDAgfSksXG4gIHdlYmhvb2tTZWNyZXQ6IHZhcmNoYXIoJ3dlYmhvb2tfc2VjcmV0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59KTtcblxuLyoqXG4gKiBMb2cgb2YgYWxsIGNvbXBsaWFuY2Ugbm90aWZpY2F0aW9ucyBzZW50LlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9sb2dcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2cgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9sb2cnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgY2hhbm5lbDogdmFyY2hhcignY2hhbm5lbCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIGluLWFwcCB8IHdlYmhvb2sgfCBkaWdlc3RcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBzZW50IHwgZmFpbGVkIHwgcGVuZGluZ1xuICBwYXlsb2FkOiBqc29uYigncGF5bG9hZCcpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLm5vdE51bGwoKSxcbiAgd2ViaG9va1Jlc3BvbnNlQ29kZTogaW50ZWdlcignd2ViaG9va19yZXNwb25zZV9jb2RlJyksXG4gIHdlYmhvb2tFcnJvcjogdGV4dCgnd2ViaG9va19lcnJvcicpLFxuICByZXRyeUNvdW50OiBpbnRlZ2VyKCdyZXRyeV9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBuZXh0UmV0cnlBdDogdGltZXN0YW1wKCduZXh0X3JldHJ5X2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHJlbGF0ZWRBdWRpdElkOiB1dWlkKCdyZWxhdGVkX2F1ZGl0X2lkJyksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnQ3JlYXRlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fb3JnX2NyZWF0ZWRfaWR4JylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIHN0YXR1c1JldHJ5SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fc3RhdHVzX3JldHJ5X2lkeCcpXG4gICAgLm9uKHRhYmxlLnN0YXR1cywgdGFibGUubmV4dFJldHJ5QXQpLFxuICByZWxhdGVkQXVkaXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX25vdGlmaWNhdGlvbl9yZWxhdGVkX2F1ZGl0X2lkeCcpXG4gICAgLm9uKHRhYmxlLnJlbGF0ZWRBdWRpdElkKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGlhbmNlLXNwZWNpZmljIFJCQUMgcm9sZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2Vfcm9sZXNcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGVUeXBlID0gJ2NvbXBsaWFuY2Utdmlld2VyJyB8ICdjb21wbGlhbmNlLWVkaXRvcicgfCAnY29tcGxpYW5jZS1hZG1pbic7XG5cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUm9sZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfcm9sZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdXNlcklkOiB0ZXh0KCd1c2VyX2lkJykubm90TnVsbCgpLFxuICByb2xlOiB2YXJjaGFyKCdyb2xlJywgeyBsZW5ndGg6IDMwIH0pLiR0eXBlPENvbXBsaWFuY2VSb2xlVHlwZT4oKS5ub3ROdWxsKCksXG4gIGdyYW50ZWRCeTogdGV4dCgnZ3JhbnRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1VzZXJVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3JvbGVfb3JnX3VzZXJfdW5pcXVlJykub24odGFibGUub3JnSWQsIHRhYmxlLnVzZXJJZCksXG4gIG9yZ1JvbGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3JvbGVfb3JnX3JvbGVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnJvbGUpLFxufSkpO1xuXG4vKipcbiAqIEdlbmVyYXRlZCBjb21wbGlhbmNlIHJlcG9ydHMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcmVwb3J0c1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJlcG9ydCA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcmVwb3J0cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICByZXBvcnRUeXBlOiB2YXJjaGFyKCdyZXBvcnRfdHlwZScsIHsgbGVuZ3RoOiAzMCB9KS5ub3ROdWxsKCksIC8vIHN1bW1hcnkgfCBkZXRhaWxlZCB8IGF1ZGl0LXRyYWlsIHwgY29tcGFyaXNvblxuICB0YXJnZXQ6IHZhcmNoYXIoJ3RhcmdldCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIHBsdWdpbiB8IHBpcGVsaW5lIHwgYWxsXG4gIGRhdGVGcm9tOiB0aW1lc3RhbXAoJ2RhdGVfZnJvbScsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkYXRlVG86IHRpbWVzdGFtcCgnZGF0ZV90bycsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjb21wYXJlRnJvbTogdGltZXN0YW1wKCdjb21wYXJlX2Zyb20nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY29tcGFyZVRvOiB0aW1lc3RhbXAoJ2NvbXBhcmVfdG8nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGF0YToganNvbmIoJ2RhdGEnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKS5ub3ROdWxsKCksXG4gIGZvcm1hdDogdmFyY2hhcignZm9ybWF0JywgeyBsZW5ndGg6IDEwIH0pLmRlZmF1bHQoJ2pzb24nKS5ub3ROdWxsKCksIC8vIGpzb24gfCBjc3ZcbiAgZ2VuZXJhdGVkQnk6IHRleHQoJ2dlbmVyYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdDcmVhdGVkQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3JlcG9ydF9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbn0pKTtcblxuLyoqXG4gKiBDcm9uLWJhc2VkIHJlY3VycmluZyByZXBvcnQgZ2VuZXJhdGlvbiBzY2hlZHVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlID0gcGdUYWJsZSgnY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlcG9ydFR5cGU6IHZhcmNoYXIoJ3JlcG9ydF90eXBlJywgeyBsZW5ndGg6IDMwIH0pLm5vdE51bGwoKSwgLy8gc3VtbWFyeSB8IGRldGFpbGVkXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gcGx1Z2luIHwgcGlwZWxpbmUgfCBhbGxcbiAgZm9ybWF0OiB2YXJjaGFyKCdmb3JtYXQnLCB7IGxlbmd0aDogMTAgfSkuZGVmYXVsdCgnanNvbicpLm5vdE51bGwoKSxcbiAgY3JvbkV4cHJlc3Npb246IHZhcmNoYXIoJ2Nyb25fZXhwcmVzc2lvbicsIHsgbGVuZ3RoOiAxMDAgfSkubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIGxhc3RSdW5BdDogdGltZXN0YW1wKCdsYXN0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsaXZlclRvOiBqc29uYignZGVsaXZlcl90bycpLiR0eXBlPHN0cmluZ1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSwgLy8gdXNlcklkcyB0byBub3RpZnlcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBhY3RpdmVOZXh0UnVuSWR4OiBpbmRleCgnY29tcGxpYW5jZV9yZXBvcnRfc2NoZWR1bGVfYWN0aXZlX25leHRfaWR4JylcbiAgICAub24odGFibGUuaXNBY3RpdmUsIHRhYmxlLm5leHRSdW5BdCksXG4gIG9yZ0lkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlX29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8vIENvbXBsaWFuY2UgdHlwZXNcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVBvbGljeSA9IHR5cGVvZiBjb21wbGlhbmNlUG9saWN5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VQb2xpY3lJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVBvbGljeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJ1bGVIaXN0b3J5ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlSGlzdG9yeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZUhpc3RvcnlJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUF1ZGl0TG9nID0gdHlwZW9mIGNvbXBsaWFuY2VBdWRpdExvZy4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlQXVkaXRMb2dJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUF1ZGl0TG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUV4ZW1wdGlvbiA9IHR5cGVvZiBjb21wbGlhbmNlRXhlbXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb25JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZUV4ZW1wdGlvbi4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW4gPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5JbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVNjYW4uJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlU2NhblNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5TY2hlZHVsZUluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlU2NhblNjaGVkdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2VJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nID0gdHlwZW9mIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2cuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZ0luc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGUgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJvbGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJvbGUuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0ID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydEluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlUmVwb3J0LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUmVwb3J0U2NoZWR1bGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlLiRpbmZlckluc2VydDtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"drizzle-orm": "0.45.2",
|
|
27
27
|
"pg": "8.22.0",
|
|
28
|
-
"@pipeline-builder/api-core": "4.1.
|
|
28
|
+
"@pipeline-builder/api-core": "4.1.4"
|
|
29
29
|
},
|
|
30
30
|
"keywords": [
|
|
31
31
|
"ci-cd",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"access": "public",
|
|
82
82
|
"registry": "https://registry.npmjs.org/"
|
|
83
83
|
},
|
|
84
|
-
"version": "4.1.
|
|
84
|
+
"version": "4.1.5",
|
|
85
85
|
"bugs": {
|
|
86
86
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
87
87
|
},
|