@netgrif/components-core 6.3.0-rc.8 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/allowed-nets/services/factory/allowed-nets-service-factory.mjs +13 -1
- package/esm2020/lib/dashboard/cards/model/custom-dashboard-model/custom-card.mjs +1 -1
- package/esm2020/lib/dashboard/cards/model/custom-dashboard-model/custom-iframe-card.mjs +2 -0
- package/esm2020/lib/dashboard/cards/model/dashboard-card-types.mjs +2 -1
- package/esm2020/lib/dashboard/cards/model/dashboard-card.mjs +1 -1
- package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view-content.component.mjs +60 -0
- package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view.component.mjs +53 -0
- package/esm2020/lib/data-fields/filter-field/abstract-filter-field.component.mjs +4 -1
- package/esm2020/lib/data-fields/public-api.mjs +17 -1
- package/esm2020/lib/data-fields/task-ref-field/abstract-task-ref-field.component.mjs +133 -0
- package/esm2020/lib/data-fields/task-ref-field/model/task-ref-components.mjs +8 -0
- package/esm2020/lib/data-fields/task-ref-field/model/task-ref-dashboard-constants.mjs +10 -0
- package/esm2020/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile-constants.mjs +13 -0
- package/esm2020/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile.mjs +2 -0
- package/esm2020/lib/data-fields/task-ref-field/model/task-ref-field.mjs +19 -1
- package/esm2020/lib/data-fields/task-ref-field/task-ref-dashboard-field/task-ref-dashboard-tile/abstract-task-ref-dashboard-tile.component.mjs +140 -0
- package/esm2020/lib/data-fields/text-field/abstract-dashboard-text-field.component.mjs +42 -0
- package/esm2020/lib/data-fields/text-field/dashboard-bar-chart-text-field/abstract-dashboard-bar-chart-text-field.component.mjs +33 -0
- package/esm2020/lib/data-fields/text-field/dashboard-iframe-text-field/abstract-dashboard-iframe-text-field.component.mjs +27 -0
- package/esm2020/lib/data-fields/text-field/dashboard-line-chart-text-field/abstract-dashboard-line-chart-text-field.component.mjs +33 -0
- package/esm2020/lib/data-fields/text-field/dashboard-pie-chart-text-field/abstract-dashboard-pie-chart-text-field.component.mjs +31 -0
- package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/abstract-dashboard-portal-text-field.component.mjs +27 -0
- package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-portal-component-registry.service.mjs +35 -0
- package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-view-constants.mjs +10 -0
- package/esm2020/lib/data-fields/text-field/models/text-field.mjs +24 -2
- package/esm2020/lib/data-fields/user-list-field/abstract-user-list-field.component.mjs +2 -2
- package/esm2020/lib/data-fields/user-list-field/models/user-list-field.mjs +6 -2
- package/esm2020/lib/filter/models/user-filter-constants.mjs +5 -1
- package/esm2020/lib/filter/user-filters.service.mjs +3 -1
- package/esm2020/lib/navigation/group-navigation-component-resolver/group-navigation-component-resolver.service.mjs +13 -2
- package/esm2020/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.mjs +2 -1
- package/esm2020/lib/panel/task-panel/abstract-task-panel.component.mjs +29 -9
- package/esm2020/lib/resources/interface/data-groups.mjs +1 -1
- package/esm2020/lib/search/models/operator/substring.mjs +2 -2
- package/esm2020/lib/search/search-service/search.service.mjs +2 -2
- package/esm2020/lib/task-content/model/preprocessed-data-groups.mjs +2 -0
- package/esm2020/lib/task-content/services/field-converter.service.mjs +2 -2
- package/esm2020/lib/task-content/task-content/abstract-task-content.component.mjs +146 -4
- package/esm2020/lib/utility/public-api.mjs +2 -1
- package/esm2020/lib/utility/tests/mocks/mock-user.service.mjs +44 -0
- package/esm2020/lib/view/public-api.mjs +2 -1
- package/esm2020/lib/view/task-view/models/injection-token-task-force-open.mjs +3 -0
- package/fesm2015/netgrif-components-core.mjs +4142 -3272
- package/fesm2015/netgrif-components-core.mjs.map +1 -1
- package/fesm2020/netgrif-components-core.mjs +4158 -3299
- package/fesm2020/netgrif-components-core.mjs.map +1 -1
- package/lib/dashboard/cards/model/custom-dashboard-model/custom-card.d.ts +8 -7
- package/lib/dashboard/cards/model/custom-dashboard-model/custom-iframe-card.d.ts +4 -0
- package/lib/dashboard/cards/model/dashboard-card-types.d.ts +1 -0
- package/lib/dashboard/cards/model/dashboard-card.d.ts +1 -1
- package/lib/data-fields/filter-field/abstract-filter-field-tab-view-content.component.d.ts +17 -0
- package/lib/data-fields/filter-field/abstract-filter-field-tab-view.component.d.ts +17 -0
- package/lib/data-fields/filter-field/abstract-filter-field.component.d.ts +1 -0
- package/lib/data-fields/public-api.d.ts +16 -0
- package/lib/data-fields/task-ref-field/abstract-task-ref-field.component.d.ts +20 -0
- package/lib/data-fields/task-ref-field/model/task-ref-components.d.ts +6 -0
- package/lib/data-fields/task-ref-field/model/task-ref-dashboard-constants.d.ts +8 -0
- package/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile-constants.d.ts +11 -0
- package/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile.d.ts +9 -0
- package/lib/data-fields/task-ref-field/model/task-ref-field.d.ts +10 -0
- package/lib/data-fields/task-ref-field/task-ref-dashboard-field/task-ref-dashboard-tile/abstract-task-ref-dashboard-tile.component.d.ts +36 -0
- package/lib/data-fields/text-field/abstract-dashboard-text-field.component.d.ts +23 -0
- package/lib/data-fields/text-field/dashboard-bar-chart-text-field/abstract-dashboard-bar-chart-text-field.component.d.ts +10 -0
- package/lib/data-fields/text-field/dashboard-iframe-text-field/abstract-dashboard-iframe-text-field.component.d.ts +11 -0
- package/lib/data-fields/text-field/dashboard-line-chart-text-field/abstract-dashboard-line-chart-text-field.component.d.ts +10 -0
- package/lib/data-fields/text-field/dashboard-pie-chart-text-field/abstract-dashboard-pie-chart-text-field.component.d.ts +10 -0
- package/lib/data-fields/text-field/dashboard-portal-text-field/abstract-dashboard-portal-text-field.component.d.ts +10 -0
- package/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-portal-component-registry.service.d.ts +14 -0
- package/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-view-constants.d.ts +8 -0
- package/lib/data-fields/text-field/models/text-field.d.ts +20 -0
- package/lib/data-fields/user-list-field/models/user-list-field.d.ts +4 -1
- package/lib/filter/models/user-filter-constants.d.ts +5 -1
- package/lib/navigation/group-navigation-component-resolver/group-navigation-component-resolver.service.d.ts +1 -0
- package/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.d.ts +1 -0
- package/lib/panel/task-panel/abstract-task-panel.component.d.ts +9 -3
- package/lib/resources/interface/data-groups.d.ts +10 -5
- package/lib/task-content/model/preprocessed-data-groups.d.ts +5 -0
- package/lib/task-content/task-content/abstract-task-content.component.d.ts +42 -1
- package/lib/utility/public-api.d.ts +1 -0
- package/lib/utility/tests/mocks/mock-user.service.d.ts +18 -0
- package/lib/view/public-api.d.ts +1 -0
- package/lib/view/task-view/models/injection-token-task-force-open.d.ts +2 -0
- package/package.json +1 -1
|
@@ -8,7 +8,9 @@ import { LoadingEmitter } from '../../utility/loading-emitter';
|
|
|
8
8
|
import { BehaviorSubject } from 'rxjs';
|
|
9
9
|
import { map } from 'rxjs/operators';
|
|
10
10
|
import { NAE_ASYNC_RENDERING_CONFIGURATION } from '../model/async-rendering-configuration-injection-token';
|
|
11
|
+
import { TaskRefDashboardConstants } from '../../data-fields/task-ref-field/model/task-ref-dashboard-constants';
|
|
11
12
|
import { TaskRefField } from '../../data-fields/task-ref-field/model/task-ref-field';
|
|
13
|
+
import { TaskRefComponents } from '../../data-fields/task-ref-field/model/task-ref-components';
|
|
12
14
|
import { Subgrid } from '../model/subgrid';
|
|
13
15
|
import { IncrementingCounter } from '../../utility/incrementing-counter';
|
|
14
16
|
import * as i0 from "@angular/core";
|
|
@@ -249,11 +251,29 @@ export class AbstractTaskContentComponent {
|
|
|
249
251
|
/**
|
|
250
252
|
* Clones the content of the data groups to prevent unintentional memory accesses to source data.
|
|
251
253
|
* Rearranges the data groups to accommodate taskrefs. Filters out hidden and forbidden fields.
|
|
254
|
+
* Populates dashboard task ref fields with dashboard tile data.
|
|
252
255
|
* @param dataGroups
|
|
253
|
-
* @returns the
|
|
256
|
+
* @returns the preprocessed data groups
|
|
254
257
|
*/
|
|
255
258
|
preprocessDataGroups(dataGroups) {
|
|
256
|
-
|
|
259
|
+
const rearrangeResult = this.rearrangeDataGroups(dataGroups);
|
|
260
|
+
let unfilteredDataGroups = rearrangeResult.dataGroups;
|
|
261
|
+
if (rearrangeResult.containsDashboardTaskRef) {
|
|
262
|
+
unfilteredDataGroups = this.preprocessDashboardTaskRef(rearrangeResult.dataGroups, dataGroups);
|
|
263
|
+
}
|
|
264
|
+
return this.cloneAndFilterHidden(unfilteredDataGroups);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Clones the content of the data groups to prevent unintentional memory accesses to source data.
|
|
268
|
+
* Rearranges the data groups to accommodate taskrefs.
|
|
269
|
+
* Determines if the data groups contain a dashboard task ref field.
|
|
270
|
+
* @param dataGroups
|
|
271
|
+
* @returns the preprocessed data groups with metadata
|
|
272
|
+
*/
|
|
273
|
+
rearrangeDataGroups(dataGroups) {
|
|
274
|
+
dataGroups = this.cloneDataGroups(dataGroups);
|
|
275
|
+
this.initializeLocalFieldLayout(dataGroups);
|
|
276
|
+
let containsDashboard = false;
|
|
257
277
|
const result = [];
|
|
258
278
|
for (let i = 0; i < dataGroups.length; i++) {
|
|
259
279
|
const group = dataGroups[i];
|
|
@@ -265,6 +285,10 @@ export class AbstractTaskContentComponent {
|
|
|
265
285
|
if (split.startGroup !== undefined) {
|
|
266
286
|
result.push(split.startGroup);
|
|
267
287
|
}
|
|
288
|
+
if (split.taskRef.component?.name === TaskRefComponents.DASHBOARD) {
|
|
289
|
+
result.push(this.createDashboardTaskRefDataGroup(group, split.taskRef));
|
|
290
|
+
containsDashboard = true;
|
|
291
|
+
}
|
|
268
292
|
if (split.taskRef.value.length === 0 || split.endGroup === undefined) {
|
|
269
293
|
if (split.endGroup !== undefined) {
|
|
270
294
|
dataGroups.splice(i + 1, 0, split.endGroup);
|
|
@@ -287,7 +311,35 @@ export class AbstractTaskContentComponent {
|
|
|
287
311
|
}
|
|
288
312
|
dataGroups.splice(firstNonDescendantIndex, 0, split.endGroup);
|
|
289
313
|
}
|
|
290
|
-
return
|
|
314
|
+
return {
|
|
315
|
+
dataGroups: result,
|
|
316
|
+
containsDashboardTaskRef: containsDashboard
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Creates a duplicate of the provided data group array.
|
|
321
|
+
*
|
|
322
|
+
* Only the data groups are cloned, the fields are only copied as references.
|
|
323
|
+
* @param dataGroups the data groups that should be cloned
|
|
324
|
+
* @returns the duplicated data groups
|
|
325
|
+
*/
|
|
326
|
+
cloneDataGroups(dataGroups) {
|
|
327
|
+
return dataGroups.map(group => {
|
|
328
|
+
const g = { ...group };
|
|
329
|
+
g.fields = g.fields.map(field => field);
|
|
330
|
+
return g;
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Passes over all the fields in the provided data groups and if they are visible, initializes their local layout attribute.
|
|
335
|
+
* @param dataGroups the containers of the fields that should have their local layout initialized
|
|
336
|
+
*/
|
|
337
|
+
initializeLocalFieldLayout(dataGroups) {
|
|
338
|
+
for (const g of dataGroups) {
|
|
339
|
+
for (const f of g.fields) {
|
|
340
|
+
f.resetLocalLayout();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
291
343
|
}
|
|
292
344
|
/**
|
|
293
345
|
* Creates a duplicate of the provided data group array and filters away any fields and data groups that are marked as hidden.
|
|
@@ -345,6 +397,96 @@ export class AbstractTaskContentComponent {
|
|
|
345
397
|
}
|
|
346
398
|
return result;
|
|
347
399
|
}
|
|
400
|
+
/**
|
|
401
|
+
* Creates a new data group that contains only the passed task ref.
|
|
402
|
+
* The information about nesting and parent task/case are preserved from the passed original data group.
|
|
403
|
+
* @param originalDataGroup source of the information about parent task/case
|
|
404
|
+
* @param taskRef the task ref that will be added to the new data group
|
|
405
|
+
* @protected
|
|
406
|
+
*/
|
|
407
|
+
createDashboardTaskRefDataGroup(originalDataGroup, taskRef) {
|
|
408
|
+
return {
|
|
409
|
+
fields: [taskRef],
|
|
410
|
+
alignment: undefined,
|
|
411
|
+
stretch: false,
|
|
412
|
+
title: undefined,
|
|
413
|
+
parentTaskId: originalDataGroup.parentTaskId,
|
|
414
|
+
parentTransitionId: originalDataGroup.parentTransitionId,
|
|
415
|
+
parentCaseId: originalDataGroup.parentCaseId,
|
|
416
|
+
parentTaskRefId: originalDataGroup.parentTaskRefId,
|
|
417
|
+
nestingLevel: originalDataGroup.nestingLevel,
|
|
418
|
+
layout: originalDataGroup.layout
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Identifies data groups that represent dashboard tiles,
|
|
423
|
+
* removes them from the data group array and passes them onto the task ref field instance.
|
|
424
|
+
* @param preprocessedDataGroups
|
|
425
|
+
* @param rawDataGroups
|
|
426
|
+
* @returns an array of data group objects that does not contain dashboard tiles referenced by the dashboard task ref
|
|
427
|
+
* @protected
|
|
428
|
+
*/
|
|
429
|
+
preprocessDashboardTaskRef(preprocessedDataGroups, rawDataGroups) {
|
|
430
|
+
// TODO support more than one dashboard task ref in a task
|
|
431
|
+
let dashboardTaskRefField;
|
|
432
|
+
let dashboardParentInformation;
|
|
433
|
+
for (const dg of preprocessedDataGroups) {
|
|
434
|
+
for (const field of dg.fields) {
|
|
435
|
+
if (this.isTaskRef(field) && field.component?.name === TaskRefComponents.DASHBOARD) {
|
|
436
|
+
dashboardTaskRefField = field;
|
|
437
|
+
dashboardParentInformation = {
|
|
438
|
+
parentTaskId: dg.parentTaskId,
|
|
439
|
+
parentTransitionId: dg.parentTransitionId,
|
|
440
|
+
parentCaseId: dg.parentCaseId,
|
|
441
|
+
parentTaskRefId: dg.parentTaskRefId,
|
|
442
|
+
nestingLevel: dg.nestingLevel
|
|
443
|
+
};
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (dashboardTaskRefField !== undefined) {
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
if (dashboardTaskRefField === undefined) {
|
|
452
|
+
this._logger.error('preprocessDashboardTaskRef method was called on task content without dashboard task refs!');
|
|
453
|
+
return preprocessedDataGroups;
|
|
454
|
+
}
|
|
455
|
+
const tiles = new Map();
|
|
456
|
+
// TODO resolve transitive tile content
|
|
457
|
+
const nonDashboardDataGroups = [];
|
|
458
|
+
for (const dg of preprocessedDataGroups) {
|
|
459
|
+
if (dg.parentTaskRefId !== dashboardTaskRefField.stringId) {
|
|
460
|
+
nonDashboardDataGroups.push(dg);
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
if (tiles.has(dg.parentTaskId)) {
|
|
464
|
+
const tile = tiles.get(dg.parentTaskId);
|
|
465
|
+
tile.dataGroups.push(dg);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
tiles.set(dg.parentTaskId, { dataGroups: [dg] });
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
for (const rdg of rawDataGroups) {
|
|
472
|
+
if (rdg.parentTaskId === dashboardParentInformation.parentTaskId
|
|
473
|
+
&& rdg.parentTransitionId === dashboardParentInformation.parentTransitionId
|
|
474
|
+
&& rdg.parentCaseId === dashboardParentInformation.parentCaseId
|
|
475
|
+
&& rdg.parentTaskRefId === dashboardParentInformation.parentTaskRefId
|
|
476
|
+
&& rdg.nestingLevel === dashboardParentInformation.nestingLevel) {
|
|
477
|
+
for (const filed of rdg.fields) {
|
|
478
|
+
if (filed.stringId === TaskRefDashboardConstants.DASHBOARD_COLS) {
|
|
479
|
+
dashboardTaskRefField.dashboardCols = filed.value;
|
|
480
|
+
}
|
|
481
|
+
else if (filed.stringId === TaskRefDashboardConstants.DASHBOARD_ROWS) {
|
|
482
|
+
dashboardTaskRefField.dashboardRows = filed.value;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
dashboardTaskRefField.dashboardTiles = Array.from(tiles.values());
|
|
488
|
+
return nonDashboardDataGroups;
|
|
489
|
+
}
|
|
348
490
|
/**
|
|
349
491
|
* Computes the layout data for a single data group with grid layout. The resulting layout is saved into the input objects.
|
|
350
492
|
* @param dataGroup the data group that should be laid out into a grid
|
|
@@ -661,4 +803,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
661
803
|
}], taskEvent: [{
|
|
662
804
|
type: Output
|
|
663
805
|
}] } });
|
|
664
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L3Rhc2stY29udGVudC9hYnN0cmFjdC10YXNrLWNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVFsRyxPQUFPLEVBQVksa0JBQWtCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHNCQUFzQixFQUFtQixtQkFBbUIsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQzNJLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBRXpHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUVuRixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7QUFNdkUsTUFBTSxPQUFnQiw0QkFBNEI7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QVU7c0JBQWxCLEtBQUs7Z0JBTUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUlJLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudH0gZnJvbSAnLi4vbW9kZWwvZGF0YWZpZWxkLWdyaWQtbGF5b3V0LWVsZW1lbnQnO1xuaW1wb3J0IHtGaWVsZENvbnZlcnRlclNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL2ZpZWxkLWNvbnZlcnRlci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0NvbnRlbnRTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1BhcGVyVmlld1NlcnZpY2V9IGZyb20gJy4uLy4uL25hdmlnYXRpb24vcXVpY2stcGFuZWwvY29tcG9uZW50cy9wYXBlci12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrRXZlbnROb3RpZmljYXRpb259IGZyb20gJy4uL21vZGVsL3Rhc2stZXZlbnQtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7VGFza0V2ZW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvdGFzay1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7RGF0YUdyb3VwLCBEYXRhR3JvdXBBbGlnbm1lbnR9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cHMnO1xuaW1wb3J0IHtUYXNrRWxlbWVudFR5cGV9IGZyb20gJy4uL21vZGVsL3Rhc2stY29udGVudC1lbGVtZW50LXR5cGUnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7RGF0YUdyb3VwQ29tcGFjdCwgRGF0YUdyb3VwSGlkZUVtcHR5Um93cywgRGF0YUdyb3VwTGF5b3V0LCBEYXRhR3JvdXBMYXlvdXRUeXBlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2RhdGEtZ3JvdXAtbGF5b3V0JztcbmltcG9ydCB7RmllbGRBbGlnbm1lbnR9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZmllbGQtYWxpZ25tZW50JztcbmltcG9ydCB7RmllbGRUeXBlUmVzb3VyY2V9IGZyb20gJy4uL21vZGVsL2ZpZWxkLXR5cGUtcmVzb3VyY2UnO1xuaW1wb3J0IHtMb2FkaW5nRW1pdHRlcn0gZnJvbSAnLi4vLi4vdXRpbGl0eS9sb2FkaW5nLWVtaXR0ZXInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtOQUVfQVNZTkNfUkVOREVSSU5HX0NPTkZJR1VSQVRJT059IGZyb20gJy4uL21vZGVsL2FzeW5jLXJlbmRlcmluZy1jb25maWd1cmF0aW9uLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge0FzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbn0gZnJvbSAnLi4vbW9kZWwvYXN5bmMtcmVuZGVyaW5nLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtUYXNrUmVmRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWZpZWxkJztcbmltcG9ydCB7U3BsaXREYXRhR3JvdXB9IGZyb20gJy4uL21vZGVsL3NwbGl0LWRhdGEtZ3JvdXAnO1xuaW1wb3J0IHtTdWJncmlkfSBmcm9tICcuLi9tb2RlbC9zdWJncmlkJztcbmltcG9ydCB7SW5jcmVtZW50aW5nQ291bnRlcn0gZnJvbSAnLi4vLi4vdXRpbGl0eS9pbmNyZW1lbnRpbmctY291bnRlcic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmNjLWFic3RyYWN0LXRhc2stY29udGVudCcsXG4gICAgdGVtcGxhdGU6ICcnXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFza0NvbnRlbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHJlYWRvbmx5IERFRkFVTFRfTEFZT1VUX1RZUEUgPSBEYXRhR3JvdXBMYXlvdXRUeXBlLkxFR0FDWTtcbiAgICByZWFkb25seSBERUZBVUxUX0ZJRUxEX0FMSUdOTUVOVCA9IEZpZWxkQWxpZ25tZW50LkNFTlRFUjtcbiAgICByZWFkb25seSBERUZBVUxUX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OOiBBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAgIGJhdGNoU2l6ZTogNCxcbiAgICAgICAgYmF0Y2hEZWxheTogMjAwLFxuICAgICAgICBudW1iZXJPZlBsYWNlaG9sZGVyczogNCxcbiAgICAgICAgZW5hYmxlQXN5bmNSZW5kZXJpbmdGb3JOZXdGaWVsZHM6IHRydWUsXG4gICAgICAgIGVuYWJsZUFzeW5jUmVuZGVyaW5nT25UYXNrRXhwYW5kOiB0cnVlXG4gICAgfTtcbiAgICByZWFkb25seSBERUZBVUxUX0NPTVBBQ1RfRElSRUNUSU9OID0gRGF0YUdyb3VwQ29tcGFjdC5OT05FO1xuICAgIHJlYWRvbmx5IERFRkFVTFRfSElERV9FTVBUWV9ST1dTID0gRGF0YUdyb3VwSGlkZUVtcHR5Um93cy5BTEw7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBkYXRhIGlzIGJlaW5nIGxvYWRlZCBmcm9tIGJhY2tlbmQsIG9yIGlmIGl0IGlzIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBsb2FkaW5nJDogTG9hZGluZ0VtaXR0ZXI7XG4gICAgLyoqXG4gICAgICogRW1pdHMgYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBkYXRhIGZpZWxkLCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuIEVtaXRzIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGhhc0RhdGFUb0Rpc3BsYXkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgLyoqXG4gICAgICogRXhpc3RzIHRvIGFsbG93IHJlZmVyZW5jZXMgdG8gdGhlIGVudW0gaW4gdGhlIEhUTUxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGRUeXBlUmVzb3VyY2UgPSBGaWVsZFR5cGVSZXNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2xhdGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdGFzayBjb250YWlucyBubyBkYXRhLlxuICAgICAqXG4gICAgICogSWYgYSBmYWxzeSB2YWx1ZSBpcyBwcm92aWRlZCB0aGUgZGVmYXVsdCB0ZXh0IGlzIGRpc3BsYXllZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIG5vRGF0YVRleHQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWNvbiB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdGFzayBjb250YWlucyBubyBkYXRhLlxuICAgICAqXG4gICAgICogSWYgYSBmYWxzeSB2YWx1ZSBpcyBwcm92aWRlZCB0aGUgZGVmYXVsdCBpY29uIGlzIGRpc3BsYXllZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIG5vRGF0YUljb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGFuIGljb24gc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHRoZSBubyBkYXRhIG1lc3NhZ2UgaXMgc2hvd24uXG4gICAgICpcbiAgICAgKiBBbiBpY29uIGlzIGRpc3BsYXllZCBieSBkZWZhdWx0XG4gICAgICovXG4gICAgQElucHV0KCkgZGlzcGxheU5vRGF0YUljb24gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIEVtaXRzIG5vdGlmaWNhdGlvbnMgYWJvdXQgdGFzayBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGFza0V2ZW50OiBFdmVudEVtaXR0ZXI8VGFza0V2ZW50Tm90aWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBmaWVsZHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGF0YVNvdXJjZSQ6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxTdWJncmlkPj47XG4gICAgcHJvdGVjdGVkIF9zdWJUYXNrQ29udGVudDogU3Vic2NyaXB0aW9uO1xuICAgIHByb3RlY3RlZCBfc3ViVGFza0V2ZW50OiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIF9hc3luY1JlbmRlcmluZ0NvbmZpZzogQXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uO1xuICAgIHByb3RlY3RlZCBfYXN5bmNSZW5kZXJUaW1lb3V0OiBudW1iZXI7XG5cbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRBbGlnbm1lbnQ6IEZpZWxkQWxpZ25tZW50O1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdENvbXBhY3REaXJlY3Rpb246IERhdGFHcm91cENvbXBhY3Q7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0SGlkZUVtcHR5Um93czogRGF0YUdyb3VwSGlkZUVtcHR5Um93cztcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHROdW1iZXJPZkNvbHM6IG51bWJlcjtcblxuICAgIHByb3RlY3RlZCBfc3ViZ3JpZElkQ291bnRlcjogSW5jcmVtZW50aW5nQ291bnRlcjtcbiAgICBwcm90ZWN0ZWQgX2V4aXN0aW5nU3ViZ3JpZElkczogU2V0PHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSByb3cgaGVpZ2h0IG9mIG9uZSByb3cgaW4gdGFzayBjb250ZW50XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJvd0hlaWdodCA9IDEwNTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2ZpZWxkQ29udmVydGVyOiBGaWVsZENvbnZlcnRlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB0YXNrQ29udGVudFNlcnZpY2U6IFRhc2tDb250ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wYXBlclZpZXc6IFBhcGVyVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgX3Rhc2tFdmVudFNlcnZpY2U6IFRhc2tFdmVudFNlcnZpY2UgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbjogQXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uID0gbnVsbCkge1xuICAgICAgICB0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZyA9IHsuLi50aGlzLkRFRkFVTFRfQVNZTkNfUkVOREVSSU5HX0NPTkZJR1VSQVRJT059O1xuICAgICAgICBpZiAoYXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnLCBhc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nJCA9IG5ldyBMb2FkaW5nRW1pdHRlcih0cnVlKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PFN1YmdyaWQ+PihbXSk7XG4gICAgICAgIHRoaXMuaGFzRGF0YVRvRGlzcGxheSQgPSB0aGlzLl9kYXRhU291cmNlJC5waXBlKG1hcChkYXRhID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmxlbmd0aCAhPT0gMDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHRoaXMuX3N1YlRhc2tDb250ZW50ID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVEZWZhdWx0TGF5b3V0Q29uZmlndXJhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUxheW91dERhdGEoZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLl90YXNrRXZlbnRTZXJ2aWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRhc2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFza0V2ZW50Tm90aWZpY2F0aW9uPigpO1xuICAgICAgICAgICAgdGhpcy5fc3ViVGFza0V2ZW50ID0gX3Rhc2tFdmVudFNlcnZpY2UudGFza0V2ZW50Tm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZGluZyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fc3ViVGFza0NvbnRlbnQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMudGFza0V2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnRhc2tFdmVudC5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdWJUYXNrRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YlRhc2tFdmVudC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hc3luY1JlbmRlclRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9hc3luY1JlbmRlclRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YXNrSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2suc3RyaW5nSWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IEFycmF5PFN1YmdyaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFzIHNwZWNpZmllZCBieSB0aGUgdGFza3MgbGF5b3V0IHByb3BlcnR5LCBvciA0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TnVtYmVyT2ZGb3JtQ29sdW1ucygpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tcbiAgICAgICAgICAgIHx8ICF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dFxuICAgICAgICAgICAgfHwgdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQuY29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5jb2xzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzUGFwZXJWaWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFwZXJWaWV3LnBhcGVyVmlldztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaXRlbSBhbiBvYmplY3QgY29udGFpbmluZyBncmlkIGVsZW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcmV0dXJucyB0aGUgQW5ndWxhciBmbGV4IGxheW91dHMgYWxpZ25tZW50IHByb3BlcnR5IGZvciBpbmRpdmlkdWFsIGRhdGEgZmllbGRzIGJhc2VkIG9uXG4gICAgICogdGhlIGxheW91dCBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBieSB0aGUgcHJvY2Vzc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJdGVtQWxpZ25tZW50KGl0ZW06IERhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGl0ZW0uYWxpZ25tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5hbGlnbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZEFsaWdubWVudCA9IGl0ZW0uaXRlbT8ubG9jYWxMYXlvdXQ/LmFsaWdubWVudCA/PyB0aGlzLl9kZWZhdWx0QWxpZ25tZW50O1xuXG4gICAgICAgIGxldCBhbGlnbm1lbnQ7XG4gICAgICAgIHN3aXRjaCAoZmllbGRBbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgRmllbGRBbGlnbm1lbnQuVE9QOlxuICAgICAgICAgICAgICAgIGFsaWdubWVudCA9ICdzdGFydCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZpZWxkQWxpZ25tZW50LkNFTlRFUjpcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSAnY2VudGVyJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRmllbGRBbGlnbm1lbnQuQk9UVE9NOlxuICAgICAgICAgICAgICAgIGFsaWdubWVudCA9ICdlbmQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5hbGlnbm1lbnQgPSAnc3BhY2UtYmV0d2VlbiAnICsgYWxpZ25tZW50O1xuICAgICAgICByZXR1cm4gaXRlbS5hbGlnbm1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgY29tcG9uZW50IGhlaWdodCBpZiB0aGUgcm93cyBhdHRyaWJ1dGUgb2YgdGFzayBsYXlvdXQgaXMgc2V0LlxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlQ29udGVudEhlaWdodENzcygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxpbmdOZWVkZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnJvd3MgKiB0aGlzLnJvd0hlaWdodCArICdweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJzEwMCUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVjaWRlcyB3aGV0aGVyIHRoZXJlIGlzIGEgZml4ZWQgbnVtYmVyIG9mIHJvd3MgYW5kIGl0IG5lZWQtcyBzY3JvbGxpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2Nyb2xsaW5nTmVlZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFza1xuICAgICAgICAgICAgJiYgISF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dFxuICAgICAgICAgICAgJiYgISF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5yb3dzXG4gICAgICAgICAgICAmJiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5yb3dzID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRoZSBkaXNwbGF5ZWQgdGFzayB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGZpZWxkcyBpbmRpdmlkdWFsIHByb3BlcnR5LlxuICAgICAqIElmIHRlIHRhc2sgc3BlY2lmaWVzIG5vIGRlZmF1bHQgdmFsdWUgdGhlIFtnbG9iYWwgZGVmYXVsdF17QGxpbmsgQWJzdHJhY3RUYXNrQ29udGVudENvbXBvbmVudCNERUZBVUxUX0ZJRUxEX0FMSUdOTUVOVH1cbiAgICAgKiB2YWx1ZSBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcHV0ZURlZmF1bHRMYXlvdXRDb25maWd1cmF0aW9uKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0QWxpZ25tZW50ID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzaz8ubGF5b3V0Py5maWVsZEFsaWdubWVudCA/PyB0aGlzLkRFRkFVTFRfRklFTERfQUxJR05NRU5UO1xuICAgICAgICB0aGlzLl9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbiA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2s/LmxheW91dD8uY29tcGFjdERpcmVjdGlvbiA/PyB0aGlzLkRFRkFVTFRfQ09NUEFDVF9ESVJFQ1RJT047XG4gICAgICAgIHRoaXMuX2RlZmF1bHRIaWRlRW1wdHlSb3dzID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzaz8ubGF5b3V0Py5oaWRlRW1wdHlSb3dzID8/IHRoaXMuREVGQVVMVF9ISURFX0VNUFRZX1JPV1M7XG4gICAgICAgIHRoaXMuX2RlZmF1bHROdW1iZXJPZkNvbHMgPSB0aGlzLmdldE51bWJlck9mRm9ybUNvbHVtbnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSB0YXNrcyBncmlkIGxheW91dCBhbmQgc2V0cyB0aGUgcmVzdWx0IHRvIHRoZSBwdWJsaWMgcHJvcGVydGllc1xuICAgICAqIG9mIHRoaXMgY2xhc3MgdGhhdCBhcmUgdGhlbiBib3VuZCB0byBIVE1MLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSBkYXRhIGdyb3VwcyB0aGF0IHNob3VsZCBiZSBsYWlkIG91dFxuICAgICAqL1xuICAgIHB1YmxpYyBjb21wdXRlTGF5b3V0RGF0YShkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KSB7XG4gICAgICAgIGlmICghdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzaykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdWJncmlkSWRDb3VudGVyID0gbmV3IEluY3JlbWVudGluZ0NvdW50ZXIoKTtcbiAgICAgICAgdGhpcy5fZXhpc3RpbmdTdWJncmlkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIFN1YmdyaWQ+KCk7XG5cbiAgICAgICAgZGF0YUdyb3VwcyA9IHRoaXMucHJlcHJvY2Vzc0RhdGFHcm91cHMoZGF0YUdyb3Vwcyk7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdExheW91dCA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0ICYmIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnR5cGVcbiAgICAgICAgICAgID8gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQudHlwZVxuICAgICAgICAgICAgOiB0aGlzLkRFRkFVTFRfTEFZT1VUX1RZUEU7XG5cbiAgICAgICAgZGF0YUdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgIGlmICghZ3JvdXAubGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAubGF5b3V0ID0ge3Jvd3M6IHVuZGVmaW5lZCwgY29sczogdW5kZWZpbmVkLCB0eXBlOiBkZWZhdWx0TGF5b3V0fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZ3JvdXAubGF5b3V0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBncm91cC5sYXlvdXQudHlwZSA9IGRlZmF1bHRMYXlvdXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN1YmdyaWQgPSBuZXcgU3ViZ3JpZChcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN1YmdyaWRJZChncm91cCksXG4gICAgICAgICAgICAgICAgZ3JvdXAubGF5b3V0LmNvbHMgPz8gdGhpcy5fZGVmYXVsdE51bWJlck9mQ29scyxcbiAgICAgICAgICAgICAgICB0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGdyb3VwLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN1YmdyaWQuYWRkVGl0bGUoZ3JvdXApO1xuICAgICAgICAgICAgICAgIHN1YmdyaWQuYWRkUm93KHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMsIHRpdGxlLmdyaWRBcmVhSWQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChncm91cC5sYXlvdXQudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YUdyb3VwTGF5b3V0VHlwZS5HUklEOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVHcmlkTGF5b3V0KGdyb3VwLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBMYXlvdXRUeXBlLkZMT1c6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUZsb3dMYXlvdXQoZ3JvdXAsIHN1YmdyaWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFHcm91cExheW91dFR5cGUuTEVHQUNZOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVMZWdhY3lMYXlvdXQoZ3JvdXAsIHN1YmdyaWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGFzayBsYXlvdXQgdHlwZSAnJHt0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC50eXBlfSdgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3ViZ3JpZC5maW5hbGl6ZSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChzdWJncmlkLnN1YmdyaWRJZCwgc3ViZ3JpZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVuZGVyRmllbGRzKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlbmRlckZpZWxkcyhzdWJncmlkczogTWFwPHN0cmluZywgU3ViZ3JpZD4pIHtcbiAgICAgICAgY29uc3Qgc3ViZ3JpZHNBcnJheSA9IEFycmF5LmZyb20oc3ViZ3JpZHMudmFsdWVzKCkpO1xuXG4gICAgICAgIGlmICghdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcuZW5hYmxlQXN5bmNSZW5kZXJpbmdGb3JOZXdGaWVsZHNcbiAgICAgICAgICAgICYmICEodGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcuZW5hYmxlQXN5bmNSZW5kZXJpbmdPblRhc2tFeHBhbmQgJiYgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuaXNFeHBhbmRpbmcpKSB7XG4gICAgICAgICAgICBzdWJncmlkc0FycmF5LmZvckVhY2goc3ViZ3JpZCA9PiB7XG4gICAgICAgICAgICAgICAgc3ViZ3JpZC5kaXNwbGF5QWxsRmllbGRzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29udGVudChzdWJncmlkc0FycmF5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLmlzRXhwYW5kaW5nICYmIHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnLmVuYWJsZUFzeW5jUmVuZGVyaW5nT25UYXNrRXhwYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQudmFsdWUuZm9yRWFjaChvbGRTdWJncmlkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3ViZ3JpZHMuaGFzKG9sZFN1YmdyaWQuc3ViZ3JpZElkKSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJncmlkcy5nZXQob2xkU3ViZ3JpZC5zdWJncmlkSWQpLmRldGVybWluZUtlcHRGaWVsZHMob2xkU3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoc3ViZ3JpZHNBcnJheSk7XG4gICAgICAgIHRoaXMuc3ByZWFkRmllbGRSZW5kZXJpbmdPdmVyVGltZShzdWJncmlkc0FycmF5KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3ByZWFkRmllbGRSZW5kZXJpbmdPdmVyVGltZShzdWJncmlkczogQXJyYXk8U3ViZ3JpZD4sIGl0ZXJhdGlvbiA9IDApIHtcbiAgICAgICAgdGhpcy5fYXN5bmNSZW5kZXJUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXRlcmF0aW9uIDwgc3ViZ3JpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9hc3luY1JlbmRlclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3ViZ3JpZHNbaXRlcmF0aW9uXS5yZW5kZXJDb250ZW50T3ZlclRpbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwcmVhZEZpZWxkUmVuZGVyaW5nT3ZlclRpbWUoc3ViZ3JpZHMsIGl0ZXJhdGlvbiArIDEpO1xuICAgICAgICAgICAgICAgIH0sIGl0ZXJhdGlvbiA9PT0gMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb25lcyB0aGUgY29udGVudCBvZiB0aGUgZGF0YSBncm91cHMgdG8gcHJldmVudCB1bmludGVudGlvbmFsIG1lbW9yeSBhY2Nlc3NlcyB0byBzb3VyY2UgZGF0YS5cbiAgICAgKiBSZWFycmFuZ2VzIHRoZSBkYXRhIGdyb3VwcyB0byBhY2NvbW1vZGF0ZSB0YXNrcmVmcy4gRmlsdGVycyBvdXQgaGlkZGVuIGFuZCBmb3JiaWRkZW4gZmllbGRzLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzXG4gICAgICogQHJldHVybnMgdGhlIHByZXByb2Nlc3NlcyBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcmVwcm9jZXNzRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIGRhdGFHcm91cHMgPSB0aGlzLmNsb25lQW5kRmlsdGVySGlkZGVuKGRhdGFHcm91cHMpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFHcm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gZGF0YUdyb3Vwc1tpXTtcbiAgICAgICAgICAgIGlmICghZ3JvdXAuZmllbGRzLnNvbWUoZiA9PiB0aGlzLmlzVGFza1JlZihmKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChncm91cCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzcGxpdCA9IHRoaXMuc3BsaXREYXRhR3JvdXBPblRhc2tSZWYoZ3JvdXApO1xuICAgICAgICAgICAgaWYgKHNwbGl0LnN0YXJ0R3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwbGl0LnN0YXJ0R3JvdXApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3BsaXQudGFza1JlZi52YWx1ZS5sZW5ndGggPT09IDAgfHwgc3BsaXQuZW5kR3JvdXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdC5lbmRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGkgKyAxLCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RDaGlsZCA9IGRhdGFHcm91cHNbaSArIDFdOyAvLyB0aGUgZGF0YSBncm91cCB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MgSVMgQUxXQVlTIGEgZGlyZWN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgZmlyc3ROb25EZXNjZW5kYW50SW5kZXggPSBpICsgMjtcbiAgICAgICAgICAgIGZvciAoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCA8IGRhdGFHcm91cHMubGVuZ3RoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEdyb3VwID0gZGF0YUdyb3Vwc1tmaXJzdE5vbkRlc2NlbmRhbnRJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKG5leHRHcm91cC5uZXN0aW5nTGV2ZWwgPT09IHVuZGVmaW5lZCB8fCBuZXh0R3JvdXAubmVzdGluZ0xldmVsIDwgZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgYmxvY2sgb2YgbmVzdGVkIGRhdGEgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dEdyb3VwLm5lc3RpbmdMZXZlbCA9PT0gZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsXG4gICAgICAgICAgICAgICAgICAgICYmIChuZXh0R3JvdXAucGFyZW50VGFza1JlZklkICE9PSBzcGxpdC50YXNrUmVmLnN0cmluZ0lkXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3BsaXQudGFza1JlZi52YWx1ZS5zb21lKHJlZmZlZFRhc2tJZCA9PiByZWZmZWRUYXNrSWQgPT09IG5leHRHcm91cC5wYXJlbnRUYXNrSWQpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGZpcnN0Tm9uRGVzY2VuZGFudEluZGV4LCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIHByb3ZpZGVkIGRhdGEgZ3JvdXAgYXJyYXkgYW5kIGZpbHRlcnMgYXdheSBhbnkgZmllbGRzIGFuZCBkYXRhIGdyb3VwcyB0aGF0IGFyZSBtYXJrZWQgYXMgaGlkZGVuLlxuICAgICAqIEJlY2F1c2Ugb2YgdGhlIGR1cGxpY2F0aW9uIHRoZSBmaWx0ZXJpbmcgZG9lc24ndCBhZmZlY3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlcyBhbmQgdGhleSByZW1haW4gdW5jaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSBkYXRhIGdyb3VwcyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgICAqIEByZXR1cm5zIHRoZSBmaWx0ZXJlZCBkdXBsaWNhdGVkIGRhdGEgZ3JvdXBzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNsb25lQW5kRmlsdGVySGlkZGVuKGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiBBcnJheTxEYXRhR3JvdXA+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YUdyb3Vwcy5tYXAoZ3JvdXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgZyA9IHsuLi5ncm91cH07XG4gICAgICAgICAgICBnLmZpZWxkcyA9IGcuZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhZmllbGQuYmVoYXZpb3IuaGlkZGVuICYmICFmaWVsZC5iZWhhdmlvci5mb3JiaWRkZW4pLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgZmllbGQucmVzZXRMb2NhbExheW91dCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmZpZWxkcy5sZW5ndGggPiAwKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNUYXNrUmVmKGZpZWxkOiBEYXRhRmllbGQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkIGluc3RhbmNlb2YgVGFza1JlZkZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvcnRzIHRoZSBpbnB1dCBkYXRhIGdyb3VwIGJhc2VkIG9uIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpZWxkcyBhbmQgc3BsaXRzIGl0IGludG8gcGFydHMgb24gdGhlIGZpcnN0IHRhc2sgcmVmLlxuICAgICAqIElmIHNvbWUgZmllbGRzIGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IHRhc2sgcmVmIHRoZXkgYXJlIGV4dHJhY3RlZCBpbnRvIGEgbmV3IFtzdGFydEdyb3VwXXtAbGluayBTcGxpdERhdGFHcm91cCNzdGFydEdyb3VwfS5cbiAgICAgKiBJZiBzb21lIGZpZWxkcyBhcHBlYXIgYWZ0ZXIgdGhlIGZpcnN0IHRhc2sgcmVmIHRoZXkgYXJlIGV4dHJhY3RlZCBpbnRvIGEgbmV3IFtlbmRHcm91cF17QGxpbmsgU3BsaXREYXRhR3JvdXAjZW5kR3JvdXB9LlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNwbGl0RGF0YUdyb3VwT25UYXNrUmVmKGRhdGFHcm91cDogRGF0YUdyb3VwKTogU3BsaXREYXRhR3JvdXAge1xuICAgICAgICBkYXRhR3JvdXAuZmllbGRzLnNvcnQoKGEsIGIpID0+IGEubG9jYWxMYXlvdXQueSAtIGIubG9jYWxMYXlvdXQueSk7XG4gICAgICAgIGNvbnN0IHRhc2tSZWZQb3NpdGlvbiA9IGRhdGFHcm91cC5maWVsZHMuZmluZEluZGV4KGYgPT4gdGhpcy5pc1Rhc2tSZWYoZikpO1xuICAgICAgICBjb25zdCByZXN1bHQ6IFNwbGl0RGF0YUdyb3VwID0ge1xuICAgICAgICAgICAgdGFza1JlZjogZGF0YUdyb3VwLmZpZWxkc1t0YXNrUmVmUG9zaXRpb25dXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRhc2tSZWZQb3NpdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0R3JvdXAgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGRhdGFHcm91cC50aXRsZSxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGRhdGFHcm91cC5hbGlnbm1lbnQsXG4gICAgICAgICAgICAgICAgbGF5b3V0OiBkYXRhR3JvdXAubGF5b3V0LFxuICAgICAgICAgICAgICAgIHN0cmV0Y2g6IGRhdGFHcm91cC5zdHJldGNoLFxuICAgICAgICAgICAgICAgIGZpZWxkczogZGF0YUdyb3VwLmZpZWxkcy5zbGljZSgwLCB0YXNrUmVmUG9zaXRpb24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXNrUmVmUG9zaXRpb24gIT09IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZEdyb3VwID0ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBkYXRhR3JvdXAuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGxheW91dDogZGF0YUdyb3VwLmxheW91dCxcbiAgICAgICAgICAgICAgICBzdHJldGNoOiBkYXRhR3JvdXAuc3RyZXRjaCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGRhdGFHcm91cC5maWVsZHMuc2xpY2UodGFza1JlZlBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0LmVuZEdyb3VwLmZpZWxkcy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgIGYubG9jYWxMYXlvdXQueSA9IGYubG9jYWxMYXlvdXQueSAtIHJlc3VsdC50YXNrUmVmLmxvY2FsTGF5b3V0LnkgLSAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgYSBzaW5nbGUgZGF0YSBncm91cCB3aXRoIGdyaWQgbGF5b3V0LiBUaGUgcmVzdWx0aW5nIGxheW91dCBpcyBzYXZlZCBpbnRvIHRoZSBpbnB1dCBvYmplY3RzLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGRhdGEgZ3JvdXAgdGhhdCBzaG91bGQgYmUgbGFpZCBvdXQgaW50byBhIGdyaWRcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVHcmlkTGF5b3V0KGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsR3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcyA9IFsuLi5kYXRhR3JvdXAuZmllbGRzXS5zb3J0KChmMSAsIGYyKSA9PiBmMS5sYXlvdXQueSA9PT0gZjIubGF5b3V0LnkgPyBmMS5sYXlvdXQueCAtIGYyLmxheW91dC54IDogZjEubGF5b3V0LnkgLSBmMi5sYXlvdXQueSlcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGFGaWVsZC5sb2NhbExheW91dFxuICAgICAgICAgICAgICAgIHx8IGRhdGFGaWVsZC5sb2NhbExheW91dC54ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBkYXRhRmllbGQubG9jYWxMYXlvdXQueSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5jb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgJ2dyaWQnIGxheW91dCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBmaWVsZHMgKGZpZWxkIElEOiAke2RhdGFGaWVsZC5zdHJpbmdJZH0pYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChsb2NhbEdyaWQubGVuZ3RoIDwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnkgKyBkYXRhRmllbGQubG9jYWxMYXlvdXQucm93cykge1xuICAgICAgICAgICAgICAgIGxvY2FsR3JpZC5wdXNoKHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmllbGRFbGVtZW50ID0gc3ViZ3JpZC5hZGRGaWVsZChkYXRhRmllbGQsIHRoaXMuX2ZpZWxkQ29udmVydGVyLnJlc29sdmVUeXBlKGRhdGFGaWVsZCkpO1xuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC55LCBkYXRhRmllbGQubG9jYWxMYXlvdXQueCxcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQubG9jYWxMYXlvdXQuY29scywgZmllbGRFbGVtZW50LmdyaWRBcmVhSWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGxvY2FsR3JpZCwgZGF0YUdyb3VwLmxheW91dCwgc3ViZ3JpZCk7XG5cbiAgICAgICAgbG9jYWxHcmlkLmZvckVhY2gobG9jYWxHcmlkUm93ID0+IHN1YmdyaWQuYWRkUm93KGxvY2FsR3JpZFJvdykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGVtcHR5IHJvdyByZW1vdmFsIGFuZCBmaWVsZCBjb21wYWN0aW5nIHJ1bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsYXlvdXQgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBncmlkIGlzIG1vZGlmaWVkIGluIHBsYWNlLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBzdGF0ZSBvZiB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSBsYXlvdXQgY29uZmlndXJhdGlvbiBvZiB0aGUgYXBwbGllZCBjb21wYWN0aW5nIHJ1bGVzXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBsYXlvdXQ6IERhdGFHcm91cExheW91dCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBoaWRlUm93cyA9IGxheW91dC5oaWRlRW1wdHlSb3dzID8/IHRoaXMuX2RlZmF1bHRIaWRlRW1wdHlSb3dzO1xuXG4gICAgICAgIGlmIChoaWRlUm93cyA9PT0gRGF0YUdyb3VwSGlkZUVtcHR5Um93cy5BTEwpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRW1wdHlSb3dzKGdyaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChsYXlvdXQuY29tcGFjdERpcmVjdGlvbiA/PyB0aGlzLl9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBDb21wYWN0LlVQOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFjdEZpZWxkc1VwKGdyaWQsIGhpZGVSb3dzLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGFueSBlbGVtZW50IGFzIGZhciBVUCBhcyBpdCBjYW4gZ28uIEVsZW1lbnRzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRlY2xhcmVkIGluIHRoZSBzYW1lIHJvdyBtaWdodCBlbmQgdXAgaW4gZGlmZmVyZW50IHJvd3MuXG4gICAgICogUmVzdWx0aW5nIHRyYWlsaW5nIGVtcHR5IHJvd3MgYXJlIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgaW5wdXQgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdGhhdCBzaG91bGQgYmUgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0gaGlkZVJvd3MgY29uZmlndXJhdGlvbiBmb3IgZW1wdHkgcm93IHJlbW92YWwgZHVyaW5nIHRoZSBjb21wYWN0aW5nIHByb2Nlc3NcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBhY3RGaWVsZHNVcChncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgaGlkZVJvd3M6IERhdGFHcm91cEhpZGVFbXB0eVJvd3MsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgZm9yIChsZXQgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBncmlkW3Jvd0luZGV4XTtcblxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHJvdy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2NvbHVtbkluZGV4XSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZEVsZW1lbnRSb3dJbmRleCA9IHJvd0luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgZm91bmRFbGVtZW50Um93SW5kZXggPCBncmlkLmxlbmd0aDsgZm91bmRFbGVtZW50Um93SW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IDAgJiYgZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXggLSAxXSA9PT0gZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zID0gdGhpcy5nZXRFbGVtZW50RGltZW5zaW9ucyhncmlkLCBjb2x1bW5JbmRleCwgZm91bmRFbGVtZW50Um93SW5kZXgsIHN1YmdyaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcmVhRW1wdHkoZ3JpZCwgY29sdW1uSW5kZXgsIHJvd0luZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZm91bmRFbGVtZW50Um93SW5kZXggLSByb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbZm91bmRFbGVtZW50Um93SW5kZXhdW2NvbHVtbkluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShncmlkLCBmb3VuZEVsZW1lbnRSb3dJbmRleCwgY29sdW1uSW5kZXgsIGVsZW1lbnREaW1lbnNpb25zLndpZHRoLCAnJywgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2NjdXB5U3BhY2UoZ3JpZCwgcm93SW5kZXgsIGNvbHVtbkluZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZWxlbWVudCwgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGVSb3dzICE9PSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLk5PTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgY2hlY2sgdGhlIHJvd3MgcG90ZW50aWFsbHkgY2xlYXJlZCBieSBtb3ZpbmcgdGhlIGdyaWQgZWxlbWVudCB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eVJvd3MoZ3JpZCwgZm91bmRFbGVtZW50Um93SW5kZXgsIGZvdW5kRWxlbWVudFJvd0luZGV4ICsgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcm93cyBmcm9tIHRoZSBncmlkIHRoYXQgb25seSBjb250YWluIGVtcHR5IGVsZW1lbnRzIChhcmUgZW1wdHkpLiBUaGUgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBoYXZlIGl0J3MgZW1wdHkgcm93cyByZW1vdmVkXG4gICAgICogQHBhcmFtIGZpcnN0Um93IHRoZSAwIGJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCByb3cgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4gVXNlIDAgdG8gc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBncmlkIHdpbGwgYmUgY2hlY2tlZCBmcm9tIHRoZSBmaXJzdCByb3cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFzdFJvdyB0aGUgMCBiYXNlZCBpbmRleCBvZiB0aGUgcm93IHdoZXJlIHRoZSBjaGVja2luZyBzaG91bGQgZW5kLiBUaGUgcm93IHdpdGggdGhpcyBpbmRleCBpcyBub3QgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBlbnRpcmUgZ3JpZCBmcm9tIHRoZSBgZmlyc3RSb3dgIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBgZmlyc3RSb3dgIGlzIHByb3ZpZGVkIG5vIGNoZWNrcyB3aWxsIGJlIHByZWZvcm1lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRW1wdHlSb3dzKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBmaXJzdFJvdyA9IDAsIGxhc3RSb3cgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgbGV0IGkgPSBmaXJzdFJvdztcbiAgICAgICAgd2hpbGUgKGkgPCBncmlkLmxlbmd0aCAmJiBpIDwgbGFzdFJvdykge1xuICAgICAgICAgICAgaWYgKGdyaWRbaV0uZXZlcnkoZWxlbWVudCA9PiBlbGVtZW50ID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICBncmlkLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZ3JpZCB3aXRoIGl0cyB0b3AtbGVmdCBjb3JuZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBncmlkIG9mIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50cyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RWxlbWVudERpbWVuc2lvbnMoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHg6IG51bWJlciwgeTogbnVtYmVyLCBzdWJncmlkOiBTdWJncmlkKTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbeV1beF07XG4gICAgICAgIGxldCB3aWR0aCA9IDE7XG4gICAgICAgIHdoaWxlICh4ICsgd2lkdGggPCBzdWJncmlkLmNvbHMgJiYgZ3JpZFt5XVt4ICsgd2lkdGhdID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICB3aWR0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWlnaHQgPSAxO1xuICAgICAgICB3aGlsZSAoeSArIGhlaWdodCA8IGdyaWQubGVuZ3RoICYmIGdyaWRbeSArIGhlaWdodF1beF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGhlaWdodCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJlYSBpbiB0aGUgZ3JpZCBjb250YWlucyBubyBlbGVtZW50cywgb3Igbm90XG4gICAgICogQHBhcmFtIGdyaWQgdGhlIGdyaWQgb2YgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0ZWQgYXJlYXMgdG9wLWxlZnQgY29ybmVyXG4gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdGVkIGFyZWFzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHRlc3RlZCBhcmVhXG4gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXN0ZWQgYXJlYVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0FyZWFFbXB0eShncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSB5OyBpIDwgeSArIGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0geDsgaiA8IHggKyB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV1bal0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciBhIHNpbmdsZSBkYXRhIGdyb3VwIHdpdGggZmxvdyBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZCB1c2luZyB0aGUgZmxvdyBhbGdvcml0aG1cbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVGbG93TGF5b3V0KGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIHRoaXMuZmxvd0ZpZWxkcyhkYXRhR3JvdXAsIHN1YmdyaWQsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgYSBzaW5nbGUgZGF0YSBncm91cCB3aXRoIGxlZ2FjeSBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBUaGUgbGVnYWN5IGxheW91dCBmb3JjZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIDQgYW5kIGxvZ3MgYSB3YXJuaW5nIGlmIHRoaXMgd2FzIG5vdCB0aGUgY2FzZS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkIHVzaW5nIHRoZSBsZWdhY3kgYWxnb3JpdGhtIHVzZWQgaW4gTkFFIHZlcnNpb25zIDwgNC4wLjBcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVMZWdhY3lMYXlvdXQoZGF0YUdyb3VwOiBEYXRhR3JvdXAsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgaWYgKHN1YmdyaWQuY29scyAhPT0gNCkge1xuICAgICAgICAgICAgc3ViZ3JpZC5jb2xzID0gNDtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKGBUYXNrIHdpdGggaWQgJyR7dGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZH0nIGhhcyBhIGRhdGEgZ3JvdXAgd2l0aCBsZWdhY3kgbGF5b3V0IHdpdGggYSBgXG4gICAgICAgICAgICAgICAgKyBgbm9uLWRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMuIElmIHlvdSB3YW50IHRvIHVzZSBhIGxheW91dCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgY29sdW1ucyB0aGFuIDIgdXNlIGEgZGlmZmVyZW50IGBcbiAgICAgICAgICAgICAgICArIGBsYXlvdXQgdHlwZSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbG93RmllbGRzKGRhdGFHcm91cCwgc3ViZ3JpZCwgMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGF5cyBvdXQgdGhlIGZpZWxkcyBmcm9tIGxlZnQgdG8gcmlnaHQsIGZyb20gdG9wIHRvIGJvdHRvbS4gSWYgdGhlIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCB0aGUgYmxvY2sgb2YgZmxvd2VkIGZpZWxkcyBkb2Vzbid0IGZpdFxuICAgICAqIG5lYXRseSBpbnRvIHRoZSBjb2x1bW5zIChpZiB0aGUgd2lkdGggb2YgYSBzaW5nbGUgZmllbGQgaXMgbm90IGEgZGl2aXNvciBvZiBjb2x1bW4gY291bnQpLCB0aGVuIHRoZSBlbnRpcmUgYmxvY2sgb2YgZmllbGRzIGlzXG4gICAgICogbGVmdCBhbGlnbmVkLiBUaGUgbGFzdCByb3cgb2YgZmllbGRzIGlzIGFsaWduZWQgdG8gdGhlIGxlZnQsIGNlbnRlciBvciByaWdodCBiYXNlZCBvbiB0aGUgZGF0YSBncm91cHMgcHJvcGVydHkuXG4gICAgICogSWYgdGhlIGxhc3Qgcm93IGNhbm5vdCBiZSBhbGlnbmVkIHRvIHRoZSBleGFjdCBjZW50ZXIgaXQgaXMgb2Zmc2V0IG9uZSBncmlkIHRpbGUgdG8gdGhlIGxlZnQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZFxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcGFyYW0gZmllbGRXaWR0aCB0aGUgbnVtYmVyIG9mIGdyaWQgdGlsZXMsIHRoYXQgc2hvdWxkIGJlIG9jY3VwaWVkIGJ5IGVhY2ggZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmxvd0ZpZWxkcyhkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCwgZmllbGRXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkc1BlclJvdyA9IE1hdGguZmxvb3Ioc3ViZ3JpZC5jb2xzIC8gZmllbGRXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1heFhQb3NpdGlvbiA9IGZpZWxkV2lkdGggKiAoZmllbGRzUGVyUm93IC0gMSk7XG5cbiAgICAgICAgbGV0IHhQb3NpdGlvbiA9IDA7XG4gICAgICAgIGNvbnN0IGxvY2FsR3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKChkYXRhRmllbGQsIGRhdGFGaWVsZENvdW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEVsZW1lbnQgPSBzdWJncmlkLmFkZEZpZWxkKGRhdGFGaWVsZCwgdGhpcy5fZmllbGRDb252ZXJ0ZXIucmVzb2x2ZVR5cGUoZGF0YUZpZWxkKSk7XG4gICAgICAgICAgICBpZiAoZGF0YUdyb3VwLnN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmFkZFJvdyh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzLCBmaWVsZEVsZW1lbnQuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2VcbiAgICAgICAgICAgIGlmICh4UG9zaXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbEdyaWQucHVzaCh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID09PSAwICYmIHRoaXMuaXNMYXN0Um93KGRhdGFGaWVsZENvdW50LCBkYXRhR3JvdXAsIGZpZWxkc1BlclJvdykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNJbkxhc3RSb3cgPSBkYXRhR3JvdXAuZmllbGRzLmxlbmd0aCAlIGZpZWxkc1BlclJvdztcbiAgICAgICAgICAgICAgICBjb25zdCByb3dXaWR0aCA9IG1heFhQb3NpdGlvbiArIGZpZWxkV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cC5hbGlnbm1lbnQgPT09IERhdGFHcm91cEFsaWdubWVudC5FTkQpIHtcbiAgICAgICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gcm93V2lkdGggLSBmaWVsZFdpZHRoICogZmllbGRzSW5MYXN0Um93O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUdyb3VwLmFsaWdubWVudCA9PT0gRGF0YUdyb3VwQWxpZ25tZW50LkNFTlRFUikge1xuICAgICAgICAgICAgICAgICAgICB4UG9zaXRpb24gPSBNYXRoLmZsb29yKChyb3dXaWR0aCAtIGZpZWxkc0luTGFzdFJvdyAqIGZpZWxkV2lkdGgpIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGxvY2FsR3JpZC5sZW5ndGggLSAxLCB4UG9zaXRpb24sIGZpZWxkV2lkdGgsIGZpZWxkRWxlbWVudC5ncmlkQXJlYUlkKTtcblxuICAgICAgICAgICAgeFBvc2l0aW9uICs9IGZpZWxkV2lkdGg7XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID4gbWF4WFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvY2FsR3JpZC5mb3JFYWNoKHJvdyA9PiBzdWJncmlkLmFkZFJvdyhyb3cpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHJvd1xuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGZpbGwgYWxsIGVsZW1lbnRzIGluIHRoZSByb3dcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbmV3R3JpZFJvdyh3aWR0aDogbnVtYmVyLCBjb250ZW50ID0gJycpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEFycmF5KHdpZHRoKS5maWxsKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIHByb3ZpZGVkIGdyaWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGFyZWEgY29udGFpbnMgdmFsdWVzIG90aGVyIHRoYW4gdGhlIGVtcHR5IHN0cmluZyBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB5IHRoZSAwIGJhc2VkIHJvdyBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB4IHRoZSAwIGJhc2VkIGNvbHVtbiBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGZpbGxlZCBhcmVhXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbnRvIGV2ZXJ5IGNlbGwgb2YgdGhlIGdyaWQgaW5zaWRlIHRoZSBzcGVjaWZpZWQgYXJlYVxuICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZmlsbGVkIGFyZWFcbiAgICAgKiBAcGFyYW0gY2hlY2tPY2N1cGFudHMgd2hldGhlciB0aGUgZmlsbGVkIGFyZWEgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIG90aGVyIGVsZW1lbnRzLlxuICAgICAqIElmIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGVsZW1lbnRzIGFyZSBmb3VuZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb2NjdXB5U3BhY2UoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHk6IG51bWJlciwgeDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLCBoZWlnaHQgPSAxLCBjaGVja09jY3VwYW50cyA9IHRydWUpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPCB5ICsgaGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB4OyBpIDwgeCArIHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tPY2N1cGFudHMgJiYgZ3JpZFtqXVtpXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGxhY2UgZWxlbWVudCAke3ZhbHVlfSBpbnRvIHRoZSBncmlkIGxheW91dCwgYmVjYXVzZSBpdCdzIHNwYWNlICh4OiAke2l9LCB5OiAke2p9KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IGFub3RoZXIgZWxlbWVudCAoJHtncmlkW2pdW2ldfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ3JpZFtqXVtpXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hlY2tlZCBlbGVtZW50IHdpdGhpbiBpdHMgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGNoZWNrZWQgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBmaWVsZHNQZXJSb3cgdGhlIG51bWJlciBvZiBmaWVsZHMgdGhhdCBpcyByZXF1aXJlZCB0byBmaWxsIGFuIGVudGlyZSByb3dcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBmaWVsZCBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgd2l0aGluIHRoZSBsYXN0IHJvdyBvZiBlbGVtZW50cyBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cC5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIGxhc3Qgcm93IGNvbnRhaW5zIGVub3VnaCBlbGVtZW50cyB0byBiZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzTGFzdFJvdyhpbmRleDogbnVtYmVyLCBkYXRhR3JvdXA6IERhdGFHcm91cCwgZmllbGRzUGVyUm93OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICsgZmllbGRzUGVyUm93ID49IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBwcmV2aW91cyBjb250ZW50IGFuZCBwdXNoZXMgdGhlIG5ldyBjb250ZW50IGludG8gdGhlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSBuZXcgY29udGVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRlbnQ6IEFycmF5PFN1YmdyaWQ+ID0gW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQudmFsdWUuZm9yRWFjaChzdWJncmlkID0+IHN1YmdyaWQuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQubmV4dChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlU3ViZ3JpZElkKGRhdGFHcm91cDogRGF0YUdyb3VwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGlkQmFzZTogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YUdyb3VwLnBhcmVudFRhc2tJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZEJhc2UgPSBbZGF0YUdyb3VwLnBhcmVudFRhc2tJZCwgZGF0YUdyb3VwLnBhcmVudFRhc2tSZWZJZCwgZGF0YUdyb3VwLm5lc3RpbmdMZXZlbF0uam9pbignIycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRCYXNlID0gJ3Jvb3QnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZCA9IGlkQmFzZTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBpZCA9IGlkQmFzZSArIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5hZGQoaWQpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYWNrQnlTdWJncmlkRm4gPSAoaW5kZXg6IG51bWJlciwgc3ViZ3JpZDogU3ViZ3JpZCkgPT4gc3ViZ3JpZC5zdWJncmlkSWQ7XG5cbiAgICBwdWJsaWMgdHJhY2tCeUZuID0gKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IERhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50KSA9PiB0aGlzLnRyYWNrQnlEYXRhZmllbGRzKGluZGV4LCBlbGVtZW50KTtcblxuICAgIHByb3RlY3RlZCB0cmFja0J5RGF0YWZpZWxkcyhpbmRleDogbnVtYmVyLCBlbGVtZW50OiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUYXNrRWxlbWVudFR5cGUuQkxBTks6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctJyArIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjYXNlIFRhc2tFbGVtZW50VHlwZS5MT0FERVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctTC0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNhc2UgVGFza0VsZW1lbnRUeXBlLkRBVEFfR1JPVVBfVElUTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0bGUgKyAnLScgKyB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlQ291bnRlci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pdGVtLnN0cmluZ0lkICsgJy0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
806
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L3Rhc2stY29udGVudC9hYnN0cmFjdC10YXNrLWNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVFsRyxPQUFPLEVBQVksa0JBQWtCLEVBQTZCLE1BQU0sdUNBQXVDLENBQUM7QUFDaEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBRXRCLG1CQUFtQixFQUN0QixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBRXpHLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHFFQUFxRSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUNuRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUU3RixPQUFPLEVBQUMsT0FBTyxFQUFD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LE9BQW1DO1FBQzFFLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRTtZQUNsQixLQUFLLGVBQWUsQ0FBQyxLQUFLO2dCQUN0QixPQUFPLE9BQU8sQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5RixLQUFLLGVBQWUsQ0FBQyxNQUFNO2dCQUN2QixPQUFPLE9BQU8sQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRyxLQUFLLGVBQWUsQ0FBQyxnQkFBZ0I7Z0JBQ2pDLE9BQU8sT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pGO2dCQUNJLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNwRztJQUNMLENBQUM7OzBIQTMzQmlCLDRCQUE0QixzTUE0RUosaUNBQWlDOzhHQTVFekQsNEJBQTRCLDhNQUZwQyxFQUFFOzRGQUVNLDRCQUE0QjtrQkFKakQsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxRQUFRLEVBQUUsRUFBRTtpQkFDZjs7MEJBNEUwQixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlDQUFpQzs0Q0E1Q2xFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBSUksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50fSBmcm9tICcuLi9tb2RlbC9kYXRhZmllbGQtZ3JpZC1sYXlvdXQtZWxlbWVudCc7XG5pbXBvcnQge0ZpZWxkQ29udmVydGVyU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvZmllbGQtY29udmVydGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL3Rhc2stY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7UGFwZXJWaWV3U2VydmljZX0gZnJvbSAnLi4vLi4vbmF2aWdhdGlvbi9xdWljay1wYW5lbC9jb21wb25lbnRzL3BhcGVyLXZpZXcuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudE5vdGlmaWNhdGlvbn0gZnJvbSAnLi4vbW9kZWwvdGFzay1ldmVudC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtUYXNrRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRhR3JvdXAsIERhdGFHcm91cEFsaWdubWVudCwgUGFyZW50RGF0YUdyb3VwSW5mb3JtYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cHMnO1xuaW1wb3J0IHtUYXNrRWxlbWVudFR5cGV9IGZyb20gJy4uL21vZGVsL3Rhc2stY29udGVudC1lbGVtZW50LXR5cGUnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7XG4gICAgRGF0YUdyb3VwQ29tcGFjdCxcbiAgICBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLFxuICAgIERhdGFHcm91cExheW91dCxcbiAgICBEYXRhR3JvdXBMYXlvdXRUeXBlXG59IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cC1sYXlvdXQnO1xuaW1wb3J0IHtGaWVsZEFsaWdubWVudH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9maWVsZC1hbGlnbm1lbnQnO1xuaW1wb3J0IHtGaWVsZFR5cGVSZXNvdXJjZX0gZnJvbSAnLi4vbW9kZWwvZmllbGQtdHlwZS1yZXNvdXJjZSc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge05BRV9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTn0gZnJvbSAnLi4vbW9kZWwvYXN5bmMtcmVuZGVyaW5nLWNvbmZpZ3VyYXRpb24taW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7QXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9ufSBmcm9tICcuLi9tb2RlbC9hc3luYy1yZW5kZXJpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQge1Rhc2tSZWZEYXNoYm9hcmRDb25zdGFudHN9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWRhc2hib2FyZC1jb25zdGFudHMnO1xuaW1wb3J0IHtUYXNrUmVmRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWZpZWxkJztcbmltcG9ydCB7VGFza1JlZkNvbXBvbmVudHN9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtTcGxpdERhdGFHcm91cH0gZnJvbSAnLi4vbW9kZWwvc3BsaXQtZGF0YS1ncm91cCc7XG5pbXBvcnQge1N1YmdyaWR9IGZyb20gJy4uL21vZGVsL3N1YmdyaWQnO1xuaW1wb3J0IHtJbmNyZW1lbnRpbmdDb3VudGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2luY3JlbWVudGluZy1jb3VudGVyJztcbmltcG9ydCB7UHJlcHJvY2Vzc2VkRGF0YUdyb3Vwc30gZnJvbSAnLi4vbW9kZWwvcHJlcHJvY2Vzc2VkLWRhdGEtZ3JvdXBzJztcbmltcG9ydCB7VGFza1JlZkRhc2hib2FyZFRpbGV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWRhc2hib2FyZC10aWxlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtdGFzay1jb250ZW50JyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYXNrQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9MQVlPVVRfVFlQRSA9IERhdGFHcm91cExheW91dFR5cGUuTEVHQUNZO1xuICAgIHJlYWRvbmx5IERFRkFVTFRfRklFTERfQUxJR05NRU5UID0gRmllbGRBbGlnbm1lbnQuQ0VOVEVSO1xuICAgIHJlYWRvbmx5IERFRkFVTFRfQVNZTkNfUkVOREVSSU5HX0NPTkZJR1VSQVRJT046IEFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgYmF0Y2hTaXplOiA0LFxuICAgICAgICBiYXRjaERlbGF5OiAyMDAsXG4gICAgICAgIG51bWJlck9mUGxhY2Vob2xkZXJzOiA0LFxuICAgICAgICBlbmFibGVBc3luY1JlbmRlcmluZ0Zvck5ld0ZpZWxkczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQXN5bmNSZW5kZXJpbmdPblRhc2tFeHBhbmQ6IHRydWVcbiAgICB9O1xuICAgIHJlYWRvbmx5IERFRkFVTFRfQ09NUEFDVF9ESVJFQ1RJT04gPSBEYXRhR3JvdXBDb21wYWN0Lk5PTkU7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9ISURFX0VNUFRZX1JPV1MgPSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLkFMTDtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGRhdGEgaXMgYmVpbmcgbG9hZGVkIGZyb20gYmFja2VuZCwgb3IgaWYgaXQgaXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIGxvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICAvKipcbiAgICAgKiBFbWl0cyBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGRhdGEgZmllbGQsIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC4gRW1pdHMgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzRGF0YVRvRGlzcGxheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICAvKipcbiAgICAgKiBFeGlzdHMgdG8gYWxsb3cgcmVmZXJlbmNlcyB0byB0aGUgZW51bSBpbiB0aGUgSFRNTFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWVsZFR5cGVSZXNvdXJjZSA9IEZpZWxkVHlwZVJlc291cmNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zbGF0ZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB0YXNrIGNvbnRhaW5zIG5vIGRhdGEuXG4gICAgICpcbiAgICAgKiBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IHRleHQgaXMgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KCkgbm9EYXRhVGV4dDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpY29uIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB0YXNrIGNvbnRhaW5zIG5vIGRhdGEuXG4gICAgICpcbiAgICAgKiBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IGljb24gaXMgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KCkgbm9EYXRhSWNvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYW4gaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gdGhlIG5vIGRhdGEgbWVzc2FnZSBpcyBzaG93bi5cbiAgICAgKlxuICAgICAqIEFuIGljb24gaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNwbGF5Tm9EYXRhSWNvbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogRW1pdHMgbm90aWZpY2F0aW9ucyBhYm91dCB0YXNrIGV2ZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0YXNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxUYXNrRXZlbnROb3RpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGZpZWxkcyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kYXRhU291cmNlJDogQmVoYXZpb3JTdWJqZWN0PEFycmF5PFN1YmdyaWQ+PjtcbiAgICBwcm90ZWN0ZWQgX3N1YlRhc2tDb250ZW50OiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIF9zdWJUYXNrRXZlbnQ6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2FzeW5jUmVuZGVyaW5nQ29uZmlnOiBBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb247XG4gICAgcHJvdGVjdGVkIF9hc3luY1JlbmRlclRpbWVvdXQ6IG51bWJlcjtcblxuICAgIHByb3RlY3RlZCBfZGVmYXVsdEFsaWdubWVudDogRmllbGRBbGlnbm1lbnQ7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbjogRGF0YUdyb3VwQ29tcGFjdDtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRIaWRlRW1wdHlSb3dzOiBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdE51bWJlck9mQ29sczogbnVtYmVyO1xuXG4gICAgcHJvdGVjdGVkIF9zdWJncmlkSWRDb3VudGVyOiBJbmNyZW1lbnRpbmdDb3VudGVyO1xuICAgIHByb3RlY3RlZCBfZXhpc3RpbmdTdWJncmlkSWRzOiBTZXQ8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHJvdyBoZWlnaHQgb2Ygb25lIHJvdyBpbiB0YXNrIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcm93SGVpZ2h0ID0gMTA1O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfZmllbGRDb252ZXJ0ZXI6IEZpZWxkQ29udmVydGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHRhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3BhcGVyVmlldzogUGFwZXJWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfdGFza0V2ZW50U2VydmljZTogVGFza0V2ZW50U2VydmljZSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uOiBBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24gPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnID0gey4uLnRoaXMuREVGQVVMVF9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTn07XG4gICAgICAgIGlmIChhc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcsIGFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKHRydWUpO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8U3ViZ3JpZD4+KFtdKTtcbiAgICAgICAgdGhpcy5oYXNEYXRhVG9EaXNwbGF5JCA9IHRoaXMuX2RhdGFTb3VyY2UkLnBpcGUobWFwKGRhdGEgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoICE9PSAwO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5fc3ViVGFza0NvbnRlbnQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZURlZmF1bHRMYXlvdXRDb25maWd1cmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlTGF5b3V0RGF0YShkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm9mZigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2tFdmVudFNlcnZpY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFza0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxUYXNrRXZlbnROb3RpZmljYXRpb24+KCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJUYXNrRXZlbnQgPSBfdGFza0V2ZW50U2VydmljZS50YXNrRXZlbnROb3RpZmljYXRpb25zJC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFza0V2ZW50LmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9zdWJUYXNrQ29udGVudC51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy50YXNrRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMudGFza0V2ZW50LmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N1YlRhc2tFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fc3ViVGFza0V2ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQXJyYXk8U3ViZ3JpZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZSQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSB0YXNrcyBsYXlvdXQgcHJvcGVydHksIG9yIDQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROdW1iZXJPZkZvcm1Db2x1bW5zKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFza1xuICAgICAgICAgICAgfHwgIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0XG4gICAgICAgICAgICB8fCB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5jb2xzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LmNvbHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXBlclZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXBlclZpZXcucGFwZXJWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpdGVtIGFuIG9iamVjdCBjb250YWluaW5nIGdyaWQgZWxlbWVudCBpbmZvcm1hdGlvblxuICAgICAqIEByZXR1cm5zIHRoZSBBbmd1bGFyIGZsZXggbGF5b3V0cyBhbGlnbm1lbnQgcHJvcGVydHkgZm9yIGluZGl2aWR1YWwgZGF0YSBmaWVsZHMgYmFzZWQgb25cbiAgICAgKiB0aGUgbGF5b3V0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBwcm9jZXNzXG4gICAgICovXG4gICAgcHVibGljIGdldEl0ZW1BbGlnbm1lbnQoaXRlbTogRGF0YWZpZWxkR3JpZExheW91dEVsZW1lbnQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXRlbS5hbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmFsaWdubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkQWxpZ25tZW50ID0gaXRlbS5pdGVtPy5sb2NhbExheW91dD8uYWxpZ25tZW50ID8/IHRoaXMuX2RlZmF1bHRBbGlnbm1lbnQ7XG5cbiAgICAgICAgbGV0IGFsaWdubWVudDtcbiAgICAgICAgc3dpdGNoIChmaWVsZEFsaWdubWVudCkge1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5UT1A6XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRmllbGRBbGlnbm1lbnQuQ0VOVEVSOlxuICAgICAgICAgICAgICAgIGFsaWdubWVudCA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5CT1RUT006XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ2VuZCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmFsaWdubWVudCA9ICdzcGFjZS1iZXR3ZWVuICcgKyBhbGlnbm1lbnQ7XG4gICAgICAgIHJldHVybiBpdGVtLmFsaWdubWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBjb21wb25lbnQgaGVpZ2h0IGlmIHRoZSByb3dzIGF0dHJpYnV0ZSBvZiB0YXNrIGxheW91dCBpcyBzZXQuXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVDb250ZW50SGVpZ2h0Q3NzKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbGluZ05lZWRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQucm93cyAqIHRoaXMucm93SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnMTAwJSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlcmUgaXMgYSBmaXhlZCBudW1iZXIgb2Ygcm93cyBhbmQgaXQgbmVlZC1zIHNjcm9sbGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBzY3JvbGxpbmdOZWVkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrXG4gICAgICAgICAgICAmJiAhIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0XG4gICAgICAgICAgICAmJiAhIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnJvd3NcbiAgICAgICAgICAgICYmIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnJvd3MgPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGhlIGRpc3BsYXllZCB0YXNrIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZmllbGRzIGluZGl2aWR1YWwgcHJvcGVydHkuXG4gICAgICogSWYgdGUgdGFzayBzcGVjaWZpZXMgbm8gZGVmYXVsdCB2YWx1ZSB0aGUgW2dsb2JhbCBkZWZhdWx0XXtAbGluayBBYnN0cmFjdFRhc2tDb250ZW50Q29tcG9uZW50I0RFRkFVTFRfRklFTERfQUxJR05NRU5UfVxuICAgICAqIHZhbHVlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wdXRlRGVmYXVsdExheW91dENvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRBbGlnbm1lbnQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmZpZWxkQWxpZ25tZW50ID8/IHRoaXMuREVGQVVMVF9GSUVMRF9BTElHTk1FTlQ7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21wYWN0RGlyZWN0aW9uID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzaz8ubGF5b3V0Py5jb21wYWN0RGlyZWN0aW9uID8/IHRoaXMuREVGQVVMVF9DT01QQUNUX0RJUkVDVElPTjtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEhpZGVFbXB0eVJvd3MgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmhpZGVFbXB0eVJvd3MgPz8gdGhpcy5ERUZBVUxUX0hJREVfRU1QVFlfUk9XUztcbiAgICAgICAgdGhpcy5fZGVmYXVsdE51bWJlck9mQ29scyA9IHRoaXMuZ2V0TnVtYmVyT2ZGb3JtQ29sdW1ucygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIHRhc2tzIGdyaWQgbGF5b3V0IGFuZCBzZXRzIHRoZSByZXN1bHQgdG8gdGhlIHB1YmxpYyBwcm9wZXJ0aWVzXG4gICAgICogb2YgdGhpcyBjbGFzcyB0aGF0IGFyZSB0aGVuIGJvdW5kIHRvIEhUTUwuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGRhdGEgZ3JvdXBzIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0XG4gICAgICovXG4gICAgcHVibGljIGNvbXB1dGVMYXlvdXREYXRhKGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIgPSBuZXcgSW5jcmVtZW50aW5nQ291bnRlcigpO1xuICAgICAgICB0aGlzLl9leGlzdGluZ1N1YmdyaWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgU3ViZ3JpZD4oKTtcblxuICAgICAgICBkYXRhR3JvdXBzID0gdGhpcy5wcmVwcm9jZXNzRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcblxuICAgICAgICBjb25zdCBkZWZhdWx0TGF5b3V0ID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQgJiYgdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQudHlwZVxuICAgICAgICAgICAgPyB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC50eXBlXG4gICAgICAgICAgICA6IHRoaXMuREVGQVVMVF9MQVlPVVRfVFlQRTtcblxuICAgICAgICBkYXRhR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgaWYgKCFncm91cC5sYXlvdXQpIHtcbiAgICAgICAgICAgICAgICBncm91cC5sYXlvdXQgPSB7cm93czogdW5kZWZpbmVkLCBjb2xzOiB1bmRlZmluZWQsIHR5cGU6IGRlZmF1bHRMYXlvdXR9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFncm91cC5sYXlvdXQudHlwZSkge1xuICAgICAgICAgICAgICAgIGdyb3VwLmxheW91dC50eXBlID0gZGVmYXVsdExheW91dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3ViZ3JpZCA9IG5ldyBTdWJncmlkKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU3ViZ3JpZElkKGdyb3VwKSxcbiAgICAgICAgICAgICAgICBncm91cC5sYXlvdXQuY29scyA/PyB0aGlzLl9kZWZhdWx0TnVtYmVyT2ZDb2xzLFxuICAgICAgICAgICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXAudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gc3ViZ3JpZC5hZGRUaXRsZShncm91cCk7XG4gICAgICAgICAgICAgICAgc3ViZ3JpZC5hZGRSb3codGhpcy5uZXdHcmlkUm93KHN1YmdyaWQuY29scywgdGl0bGUuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGdyb3VwLmxheW91dC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBMYXlvdXRUeXBlLkdSSUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUdyaWRMYXlvdXQoZ3JvdXAsIHN1YmdyaWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFHcm91cExheW91dFR5cGUuRkxPVzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlRmxvd0xheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YUdyb3VwTGF5b3V0VHlwZS5MRUdBQ1k6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUxlZ2FjeUxheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0YXNrIGxheW91dCB0eXBlICcke3RoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnR5cGV9J2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdWJncmlkLmZpbmFsaXplKCk7XG4gICAgICAgICAgICByZXN1bHQuc2V0KHN1YmdyaWQuc3ViZ3JpZElkLCBzdWJncmlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJGaWVsZHMocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVuZGVyRmllbGRzKHN1YmdyaWRzOiBNYXA8c3RyaW5nLCBTdWJncmlkPikge1xuICAgICAgICBjb25zdCBzdWJncmlkc0FycmF5ID0gQXJyYXkuZnJvbShzdWJncmlkcy52YWx1ZXMoKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ0Zvck5ld0ZpZWxkc1xuICAgICAgICAgICAgJiYgISh0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ09uVGFza0V4cGFuZCAmJiB0aGlzLnRhc2tDb250ZW50U2VydmljZS5pc0V4cGFuZGluZykpIHtcbiAgICAgICAgICAgIHN1YmdyaWRzQXJyYXkuZm9yRWFjaChzdWJncmlkID0+IHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmRpc3BsYXlBbGxGaWVsZHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHN1YmdyaWRzQXJyYXkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEodGhpcy50YXNrQ29udGVudFNlcnZpY2UuaXNFeHBhbmRpbmcgJiYgdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcuZW5hYmxlQXN5bmNSZW5kZXJpbmdPblRhc2tFeHBhbmQpKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlJC52YWx1ZS5mb3JFYWNoKG9sZFN1YmdyaWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWJncmlkcy5oYXMob2xkU3ViZ3JpZC5zdWJncmlkSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YmdyaWRzLmdldChvbGRTdWJncmlkLnN1YmdyaWRJZCkuZGV0ZXJtaW5lS2VwdEZpZWxkcyhvbGRTdWJncmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudChzdWJncmlkc0FycmF5KTtcbiAgICAgICAgdGhpcy5zcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzQXJyYXkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzOiBBcnJheTxTdWJncmlkPiwgaXRlcmF0aW9uID0gMCkge1xuICAgICAgICB0aGlzLl9hc3luY1JlbmRlclRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpdGVyYXRpb24gPCBzdWJncmlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJncmlkc1tpdGVyYXRpb25dLnJlbmRlckNvbnRlbnRPdmVyVGltZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ByZWFkRmllbGRSZW5kZXJpbmdPdmVyVGltZShzdWJncmlkcywgaXRlcmF0aW9uICsgMSk7XG4gICAgICAgICAgICAgICAgfSwgaXRlcmF0aW9uID09PSAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIGdyb3VwcyB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgbWVtb3J5IGFjY2Vzc2VzIHRvIHNvdXJjZSBkYXRhLlxuICAgICAqIFJlYXJyYW5nZXMgdGhlIGRhdGEgZ3JvdXBzIHRvIGFjY29tbW9kYXRlIHRhc2tyZWZzLiBGaWx0ZXJzIG91dCBoaWRkZW4gYW5kIGZvcmJpZGRlbiBmaWVsZHMuXG4gICAgICogUG9wdWxhdGVzIGRhc2hib2FyZCB0YXNrIHJlZiBmaWVsZHMgd2l0aCBkYXNoYm9hcmQgdGlsZSBkYXRhLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzXG4gICAgICogQHJldHVybnMgdGhlIHByZXByb2Nlc3NlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcmVwcm9jZXNzRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIGNvbnN0IHJlYXJyYW5nZVJlc3VsdCA9IHRoaXMucmVhcnJhbmdlRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcbiAgICAgICAgbGV0IHVuZmlsdGVyZWREYXRhR3JvdXBzID0gcmVhcnJhbmdlUmVzdWx0LmRhdGFHcm91cHM7XG5cbiAgICAgICAgaWYgKHJlYXJyYW5nZVJlc3VsdC5jb250YWluc0Rhc2hib2FyZFRhc2tSZWYpIHtcbiAgICAgICAgICAgIHVuZmlsdGVyZWREYXRhR3JvdXBzID0gdGhpcy5wcmVwcm9jZXNzRGFzaGJvYXJkVGFza1JlZihyZWFycmFuZ2VSZXN1bHQuZGF0YUdyb3VwcywgZGF0YUdyb3Vwcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZUFuZEZpbHRlckhpZGRlbih1bmZpbHRlcmVkRGF0YUdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIGdyb3VwcyB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgbWVtb3J5IGFjY2Vzc2VzIHRvIHNvdXJjZSBkYXRhLlxuICAgICAqIFJlYXJyYW5nZXMgdGhlIGRhdGEgZ3JvdXBzIHRvIGFjY29tbW9kYXRlIHRhc2tyZWZzLlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGRhdGEgZ3JvdXBzIGNvbnRhaW4gYSBkYXNoYm9hcmQgdGFzayByZWYgZmllbGQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHNcbiAgICAgKiBAcmV0dXJucyB0aGUgcHJlcHJvY2Vzc2VkIGRhdGEgZ3JvdXBzIHdpdGggbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhcnJhbmdlRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogUHJlcHJvY2Vzc2VkRGF0YUdyb3VwcyB7XG4gICAgICAgIGRhdGFHcm91cHMgPSB0aGlzLmNsb25lRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplTG9jYWxGaWVsZExheW91dChkYXRhR3JvdXBzKTtcblxuICAgICAgICBsZXQgY29udGFpbnNEYXNoYm9hcmQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkYXRhR3JvdXBzW2ldO1xuICAgICAgICAgICAgaWYgKCFncm91cC5maWVsZHMuc29tZShmID0+IHRoaXMuaXNUYXNrUmVmKGYpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gdGhpcy5zcGxpdERhdGFHcm91cE9uVGFza1JlZihncm91cCk7XG4gICAgICAgICAgICBpZiAoc3BsaXQuc3RhcnRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BsaXQuc3RhcnRHcm91cCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzcGxpdC50YXNrUmVmLmNvbXBvbmVudD8ubmFtZSA9PT0gVGFza1JlZkNvbXBvbmVudHMuREFTSEJPQVJEKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVEYXNoYm9hcmRUYXNrUmVmRGF0YUdyb3VwKGdyb3VwLCBzcGxpdC50YXNrUmVmKSk7XG4gICAgICAgICAgICAgICAgY29udGFpbnNEYXNoYm9hcmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3BsaXQudGFza1JlZi52YWx1ZS5sZW5ndGggPT09IDAgfHwgc3BsaXQuZW5kR3JvdXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdC5lbmRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGkgKyAxLCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RDaGlsZCA9IGRhdGFHcm91cHNbaSArIDFdOyAvLyB0aGUgZGF0YSBncm91cCB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MgSVMgQUxXQVlTIGEgZGlyZWN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgZmlyc3ROb25EZXNjZW5kYW50SW5kZXggPSBpICsgMjtcbiAgICAgICAgICAgIGZvciAoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCA8IGRhdGFHcm91cHMubGVuZ3RoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEdyb3VwID0gZGF0YUdyb3Vwc1tmaXJzdE5vbkRlc2NlbmRhbnRJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKG5leHRHcm91cC5uZXN0aW5nTGV2ZWwgPT09IHVuZGVmaW5lZCB8fCBuZXh0R3JvdXAubmVzdGluZ0xldmVsIDwgZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgYmxvY2sgb2YgbmVzdGVkIGRhdGEgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dEdyb3VwLm5lc3RpbmdMZXZlbCA9PT0gZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsXG4gICAgICAgICAgICAgICAgICAgICYmIChuZXh0R3JvdXAucGFyZW50VGFza1JlZklkICE9PSBzcGxpdC50YXNrUmVmLnN0cmluZ0lkXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3BsaXQudGFza1JlZi52YWx1ZS5zb21lKHJlZmZlZFRhc2tJZCA9PiByZWZmZWRUYXNrSWQgPT09IG5leHRHcm91cC5wYXJlbnRUYXNrSWQpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGZpcnN0Tm9uRGVzY2VuZGFudEluZGV4LCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YUdyb3VwczogcmVzdWx0LFxuICAgICAgICAgICAgY29udGFpbnNEYXNoYm9hcmRUYXNrUmVmOiBjb250YWluc0Rhc2hib2FyZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIHByb3ZpZGVkIGRhdGEgZ3JvdXAgYXJyYXkuXG4gICAgICpcbiAgICAgKiBPbmx5IHRoZSBkYXRhIGdyb3VwcyBhcmUgY2xvbmVkLCB0aGUgZmllbGRzIGFyZSBvbmx5IGNvcGllZCBhcyByZWZlcmVuY2VzLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSBkYXRhIGdyb3VwcyB0aGF0IHNob3VsZCBiZSBjbG9uZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgZHVwbGljYXRlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjbG9uZURhdGFHcm91cHMoZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPik6IEFycmF5PERhdGFHcm91cD4ge1xuICAgICAgICByZXR1cm4gZGF0YUdyb3Vwcy5tYXAoZ3JvdXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgZyA9IHsuLi5ncm91cH07XG4gICAgICAgICAgICBnLmZpZWxkcyA9IGcuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZCk7XG4gICAgICAgICAgICByZXR1cm4gZztcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXNzZXMgb3ZlciBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cHMgYW5kIGlmIHRoZXkgYXJlIHZpc2libGUsIGluaXRpYWxpemVzIHRoZWlyIGxvY2FsIGxheW91dCBhdHRyaWJ1dGUuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGNvbnRhaW5lcnMgb2YgdGhlIGZpZWxkcyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGxvY2FsIGxheW91dCBpbml0aWFsaXplZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0aWFsaXplTG9jYWxGaWVsZExheW91dChkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBkYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBmLnJlc2V0TG9jYWxMYXlvdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIHByb3ZpZGVkIGRhdGEgZ3JvdXAgYXJyYXkgYW5kIGZpbHRlcnMgYXdheSBhbnkgZmllbGRzIGFuZCBkYXRhIGdyb3VwcyB0aGF0IGFyZSBtYXJrZWQgYXMgaGlkZGVuLlxuICAgICAqIEJlY2F1c2Ugb2YgdGhlIGR1cGxpY2F0aW9uIHRoZSBmaWx0ZXJpbmcgZG9lc24ndCBhZmZlY3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlcyBhbmQgdGhleSByZW1haW4gdW5jaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSBkYXRhIGdyb3VwcyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgICAqIEByZXR1cm5zIHRoZSBmaWx0ZXJlZCBkdXBsaWNhdGVkIGRhdGEgZ3JvdXBzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNsb25lQW5kRmlsdGVySGlkZGVuKGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiBBcnJheTxEYXRhR3JvdXA+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YUdyb3Vwcy5tYXAoZ3JvdXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgZyA9IHsuLi5ncm91cH07XG4gICAgICAgICAgICBnLmZpZWxkcyA9IGcuZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhZmllbGQuYmVoYXZpb3IuaGlkZGVuICYmICFmaWVsZC5iZWhhdmlvci5mb3JiaWRkZW4pLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgZmllbGQucmVzZXRMb2NhbExheW91dCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmZpZWxkcy5sZW5ndGggPiAwKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNUYXNrUmVmKGZpZWxkOiBEYXRhRmllbGQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkIGluc3RhbmNlb2YgVGFza1JlZkZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvcnRzIHRoZSBpbnB1dCBkYXRhIGdyb3VwIGJhc2VkIG9uIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpZWxkcyBhbmQgc3BsaXRzIGl0IGludG8gcGFydHMgb24gdGhlIGZpcnN0IHRhc2sgcmVmLlxuICAgICAqIElmIHNvbWUgZmllbGRzIGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IHRhc2sgcmVmIHRoZXkgYXJlIGV4dHJhY3RlZCBpbnRvIGEgbmV3IFtzdGFydEdyb3VwXXtAbGluayBTcGxpdERhdGFHcm91cCNzdGFydEdyb3VwfS5cbiAgICAgKiBJZiBzb21lIGZpZWxkcyBhcHBlYXIgYWZ0ZXIgdGhlIGZpcnN0IHRhc2sgcmVmIHRoZXkgYXJlIGV4dHJhY3RlZCBpbnRvIGEgbmV3IFtlbmRHcm91cF17QGxpbmsgU3BsaXREYXRhR3JvdXAjZW5kR3JvdXB9LlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNwbGl0RGF0YUdyb3VwT25UYXNrUmVmKGRhdGFHcm91cDogRGF0YUdyb3VwKTogU3BsaXREYXRhR3JvdXAge1xuICAgICAgICBkYXRhR3JvdXAuZmllbGRzLnNvcnQoKGEsIGIpID0+IGEubG9jYWxMYXlvdXQueSAtIGIubG9jYWxMYXlvdXQueSk7XG4gICAgICAgIGNvbnN0IHRhc2tSZWZQb3NpdGlvbiA9IGRhdGFHcm91cC5maWVsZHMuZmluZEluZGV4KGYgPT4gdGhpcy5pc1Rhc2tSZWYoZikpO1xuICAgICAgICBjb25zdCByZXN1bHQ6IFNwbGl0RGF0YUdyb3VwID0ge1xuICAgICAgICAgICAgdGFza1JlZjogZGF0YUdyb3VwLmZpZWxkc1t0YXNrUmVmUG9zaXRpb25dIGFzIFRhc2tSZWZGaWVsZFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0YXNrUmVmUG9zaXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydEdyb3VwID0ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhR3JvdXAudGl0bGUsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBkYXRhR3JvdXAuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGxheW91dDogZGF0YUdyb3VwLmxheW91dCxcbiAgICAgICAgICAgICAgICBzdHJldGNoOiBkYXRhR3JvdXAuc3RyZXRjaCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGRhdGFHcm91cC5maWVsZHMuc2xpY2UoMCwgdGFza1JlZlBvc2l0aW9uKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFza1JlZlBvc2l0aW9uICE9PSBkYXRhR3JvdXAuZmllbGRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRHcm91cCA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZGF0YUdyb3VwLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgICBsYXlvdXQ6IGRhdGFHcm91cC5sYXlvdXQsXG4gICAgICAgICAgICAgICAgc3RyZXRjaDogZGF0YUdyb3VwLnN0cmV0Y2gsXG4gICAgICAgICAgICAgICAgZmllbGRzOiBkYXRhR3JvdXAuZmllbGRzLnNsaWNlKHRhc2tSZWZQb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRHcm91cC5maWVsZHMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICBmLmxvY2FsTGF5b3V0LnkgPSBmLmxvY2FsTGF5b3V0LnkgLSByZXN1bHQudGFza1JlZi5sb2NhbExheW91dC55IC0gMTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGRhdGEgZ3JvdXAgdGhhdCBjb250YWlucyBvbmx5IHRoZSBwYXNzZWQgdGFzayByZWYuXG4gICAgICogVGhlIGluZm9ybWF0aW9uIGFib3V0IG5lc3RpbmcgYW5kIHBhcmVudCB0YXNrL2Nhc2UgYXJlIHByZXNlcnZlZCBmcm9tIHRoZSBwYXNzZWQgb3JpZ2luYWwgZGF0YSBncm91cC5cbiAgICAgKiBAcGFyYW0gb3JpZ2luYWxEYXRhR3JvdXAgc291cmNlIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBwYXJlbnQgdGFzay9jYXNlXG4gICAgICogQHBhcmFtIHRhc2tSZWYgdGhlIHRhc2sgcmVmIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgbmV3IGRhdGEgZ3JvdXBcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZURhc2hib2FyZFRhc2tSZWZEYXRhR3JvdXAob3JpZ2luYWxEYXRhR3JvdXA6IERhdGFHcm91cCwgdGFza1JlZjogVGFza1JlZkZpZWxkKTogRGF0YUdyb3VwIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkczogW3Rhc2tSZWZdLFxuICAgICAgICAgICAgYWxpZ25tZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdHJldGNoOiBmYWxzZSxcbiAgICAgICAgICAgIHRpdGxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwYXJlbnRUYXNrSWQ6IG9yaWdpbmFsRGF0YUdyb3VwLnBhcmVudFRhc2tJZCxcbiAgICAgICAgICAgIHBhcmVudFRyYW5zaXRpb25JZDogb3JpZ2luYWxEYXRhR3JvdXAucGFyZW50VHJhbnNpdGlvbklkLFxuICAgICAgICAgICAgcGFyZW50Q2FzZUlkOiBvcmlnaW5hbERhdGFHcm91cC5wYXJlbnRDYXNlSWQsXG4gICAgICAgICAgICBwYXJlbnRUYXNrUmVmSWQ6IG9yaWdpbmFsRGF0YUdyb3VwLnBhcmVudFRhc2tSZWZJZCxcbiAgICAgICAgICAgIG5lc3RpbmdMZXZlbDogb3JpZ2luYWxEYXRhR3JvdXAubmVzdGluZ0xldmVsLFxuICAgICAgICAgICAgbGF5b3V0OiBvcmlnaW5hbERhdGFHcm91cC5sYXlvdXRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXMgZGF0YSBncm91cHMgdGhhdCByZXByZXNlbnQgZGFzaGJvYXJkIHRpbGVzLFxuICAgICAqIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBkYXRhIGdyb3VwIGFycmF5IGFuZCBwYXNzZXMgdGhlbSBvbnRvIHRoZSB0YXNrIHJlZiBmaWVsZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gcHJlcHJvY2Vzc2VkRGF0YUdyb3Vwc1xuICAgICAqIEBwYXJhbSByYXdEYXRhR3JvdXBzXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgZGF0YSBncm91cCBvYmplY3RzIHRoYXQgZG9lcyBub3QgY29udGFpbiBkYXNoYm9hcmQgdGlsZXMgcmVmZXJlbmNlZCBieSB0aGUgZGFzaGJvYXJkIHRhc2sgcmVmXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcmVwcm9jZXNzRGFzaGJvYXJkVGFza1JlZihwcmVwcm9jZXNzZWREYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+LCByYXdEYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGRhc2hib2FyZCB0YXNrIHJlZiBpbiBhIHRhc2tcbiAgICAgICAgbGV0IGRhc2hib2FyZFRhc2tSZWZGaWVsZDogVGFza1JlZkZpZWxkO1xuICAgICAgICBsZXQgZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb246IFBhcmVudERhdGFHcm91cEluZm9ybWF0aW9uO1xuICAgICAgICBmb3IgKGNvbnN0IGRnIG9mIHByZXByb2Nlc3NlZERhdGFHcm91cHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZGcuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUYXNrUmVmKGZpZWxkKSAmJiBmaWVsZC5jb21wb25lbnQ/Lm5hbWUgPT09IFRhc2tSZWZDb21wb25lbnRzLkRBU0hCT0FSRCkge1xuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRUYXNrUmVmRmllbGQgPSBmaWVsZCBhcyBUYXNrUmVmRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZFBhcmVudEluZm9ybWF0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VGFza0lkOiBkZy5wYXJlbnRUYXNrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUcmFuc2l0aW9uSWQ6IGRnLnBhcmVudFRyYW5zaXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENhc2VJZDogZGcucGFyZW50Q2FzZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VGFza1JlZklkOiBkZy5wYXJlbnRUYXNrUmVmSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nTGV2ZWw6IGRnLm5lc3RpbmdMZXZlbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXNoYm9hcmRUYXNrUmVmRmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXNoYm9hcmRUYXNrUmVmRmllbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdwcmVwcm9jZXNzRGFzaGJvYXJkVGFza1JlZiBtZXRob2Qgd2FzIGNhbGxlZCBvbiB0YXNrIGNvbnRlbnQgd2l0aG91dCBkYXNoYm9hcmQgdGFzayByZWZzIScpO1xuICAgICAgICAgICAgcmV0dXJuIHByZXByb2Nlc3NlZERhdGFHcm91cHM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBUYXNrUmVmRGFzaGJvYXJkVGlsZT4oKTtcblxuICAgICAgICAvLyBUT0RPIHJlc29sdmUgdHJhbnNpdGl2ZSB0aWxlIGNvbnRlbnRcbiAgICAgICAgY29uc3Qgbm9uRGFzaGJvYXJkRGF0YUdyb3VwcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGRnIG9mIHByZXByb2Nlc3NlZERhdGFHcm91cHMpIHtcbiAgICAgICAgICAgIGlmIChkZy5wYXJlbnRUYXNrUmVmSWQgIT09IGRhc2hib2FyZFRhc2tSZWZGaWVsZC5zdHJpbmdJZCkge1xuICAgICAgICAgICAgICAgIG5vbkRhc2hib2FyZERhdGFHcm91cHMucHVzaChkZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGlsZXMuaGFzKGRnLnBhcmVudFRhc2tJZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXMuZ2V0KGRnLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgdGlsZS5kYXRhR3JvdXBzLnB1c2goZGcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWxlcy5zZXQoZGcucGFyZW50VGFza0lkLCB7ZGF0YUdyb3VwczogW2RnXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZGcgb2YgcmF3RGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgaWYgKHJkZy5wYXJlbnRUYXNrSWQgPT09IGRhc2hib2FyZFBhcmVudEluZm9ybWF0aW9uLnBhcmVudFRhc2tJZFxuICAgICAgICAgICAgICAgICYmIHJkZy5wYXJlbnRUcmFuc2l0aW9uSWQgPT09IGRhc2hib2FyZFBhcmVudEluZm9ybWF0aW9uLnBhcmVudFRyYW5zaXRpb25JZFxuICAgICAgICAgICAgICAgICYmIHJkZy5wYXJlbnRDYXNlSWQgPT09IGRhc2hib2FyZFBhcmVudEluZm9ybWF0aW9uLnBhcmVudENhc2VJZFxuICAgICAgICAgICAgICAgICYmIHJkZy5wYXJlbnRUYXNrUmVmSWQgPT09IGRhc2hib2FyZFBhcmVudEluZm9ybWF0aW9uLnBhcmVudFRhc2tSZWZJZFxuICAgICAgICAgICAgICAgICYmIHJkZy5uZXN0aW5nTGV2ZWwgPT09IGRhc2hib2FyZFBhcmVudEluZm9ybWF0aW9uLm5lc3RpbmdMZXZlbCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZWQgb2YgcmRnLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZWQuc3RyaW5nSWQgPT09IFRhc2tSZWZEYXNoYm9hcmRDb25zdGFudHMuREFTSEJPQVJEX0NPTFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZFRhc2tSZWZGaWVsZC5kYXNoYm9hcmRDb2xzID0gZmlsZWQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZWQuc3RyaW5nSWQgPT09IFRhc2tSZWZEYXNoYm9hcmRDb25zdGFudHMuREFTSEJPQVJEX1JPV1MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZFRhc2tSZWZGaWVsZC5kYXNoYm9hcmRSb3dzID0gZmlsZWQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXNoYm9hcmRUYXNrUmVmRmllbGQuZGFzaGJvYXJkVGlsZXMgPSBBcnJheS5mcm9tKHRpbGVzLnZhbHVlcygpKTtcbiAgICAgICAgcmV0dXJuIG5vbkRhc2hib2FyZERhdGFHcm91cHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciBhIHNpbmdsZSBkYXRhIGdyb3VwIHdpdGggZ3JpZCBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZFxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcHV0ZUdyaWRMYXlvdXQoZGF0YUdyb3VwOiBEYXRhR3JvdXAsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgY29uc3QgbG9jYWxHcmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgICAgICBkYXRhR3JvdXAuZmllbGRzID0gWy4uLmRhdGFHcm91cC5maWVsZHNdLnNvcnQoKGYxICwgZjIpID0+IGYxLmxheW91dC55ID09PSBmMi5sYXlvdXQueSA/IGYxLmxheW91dC54IC0gZjIubGF5b3V0LnggOiBmMS5sYXlvdXQueSAtIGYyLmxheW91dC55KVxuICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZvckVhY2goZGF0YUZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmICghZGF0YUZpZWxkLmxvY2FsTGF5b3V0XG4gICAgICAgICAgICAgICAgfHwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGRhdGFGaWVsZC5sb2NhbExheW91dC55ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCAhZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnJvd3NcbiAgICAgICAgICAgICAgICB8fCAhZGF0YUZpZWxkLmxvY2FsTGF5b3V0LmNvbHMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBZb3UgY2Fubm90IHVzZSAnZ3JpZCcgbGF5b3V0IHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgbGF5b3V0IG9mIHRoZSBkYXRhIGZpZWxkcyAoZmllbGQgSUQ6ICR7ZGF0YUZpZWxkLnN0cmluZ0lkfSlgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGxvY2FsR3JpZC5sZW5ndGggPCBkYXRhRmllbGQubG9jYWxMYXlvdXQueSArIGRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxHcmlkLnB1c2godGhpcy5uZXdHcmlkUm93KHN1YmdyaWQuY29scykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWVsZEVsZW1lbnQgPSBzdWJncmlkLmFkZEZpZWxkKGRhdGFGaWVsZCwgdGhpcy5fZmllbGRDb252ZXJ0ZXIucmVzb2x2ZVR5cGUoZGF0YUZpZWxkKSk7XG4gICAgICAgICAgICB0aGlzLm9jY3VweVNwYWNlKGxvY2FsR3JpZCwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnksIGRhdGFGaWVsZC5sb2NhbExheW91dC54LFxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5sb2NhbExheW91dC5jb2xzLCBmaWVsZEVsZW1lbnQuZ3JpZEFyZWFJZCwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnJvd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbGxhcHNlR3JpZEVtcHR5U3BhY2UobG9jYWxHcmlkLCBkYXRhR3JvdXAubGF5b3V0LCBzdWJncmlkKTtcblxuICAgICAgICBsb2NhbEdyaWQuZm9yRWFjaChsb2NhbEdyaWRSb3cgPT4gc3ViZ3JpZC5hZGRSb3cobG9jYWxHcmlkUm93KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgZW1wdHkgcm93IHJlbW92YWwgYW5kIGZpZWxkIGNvbXBhY3RpbmcgcnVsZXMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGxheW91dCBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGlucHV0IGdyaWQgaXMgbW9kaWZpZWQgaW4gcGxhY2UuXG4gICAgICogQHBhcmFtIGdyaWQgdGhlIHN0YXRlIG9mIHRoZSBncmlkIHRoYXQgc2hvdWxkIGJlIG1vZGlmaWVkXG4gICAgICogQHBhcmFtIGxheW91dCBjb25maWd1cmF0aW9uIG9mIHRoZSBhcHBsaWVkIGNvbXBhY3RpbmcgcnVsZXNcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbGxhcHNlR3JpZEVtcHR5U3BhY2UoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIGxheW91dDogRGF0YUdyb3VwTGF5b3V0LCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIGNvbnN0IGhpZGVSb3dzID0gbGF5b3V0LmhpZGVFbXB0eVJvd3MgPz8gdGhpcy5fZGVmYXVsdEhpZGVFbXB0eVJvd3M7XG5cbiAgICAgICAgaWYgKGhpZGVSb3dzID09PSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLkFMTCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eVJvd3MoZ3JpZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGxheW91dC5jb21wYWN0RGlyZWN0aW9uID8/IHRoaXMuX2RlZmF1bHRDb21wYWN0RGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIERhdGFHcm91cENvbXBhY3QuVVA6XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wYWN0RmllbGRzVXAoZ3JpZCwgaGlkZVJvd3MsIHN1YmdyaWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYW55IGVsZW1lbnQgYXMgZmFyIFVQIGFzIGl0IGNhbiBnby4gRWxlbWVudHMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgZGVjbGFyZWQgaW4gdGhlIHNhbWUgcm93IG1pZ2h0IGVuZCB1cCBpbiBkaWZmZXJlbnQgcm93cy5cbiAgICAgKiBSZXN1bHRpbmcgdHJhaWxpbmcgZW1wdHkgcm93cyBhcmUgcmVtb3ZlZC5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBncmlkIGlzIG1vZGlmaWVkIGluIHBsYWNlLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBzdGF0ZSBvZiB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSBoaWRlUm93cyBjb25maWd1cmF0aW9uIGZvciBlbXB0eSByb3cgcmVtb3ZhbCBkdXJpbmcgdGhlIGNvbXBhY3RpbmcgcHJvY2Vzc1xuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcGFjdEZpZWxkc1VwKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBoaWRlUm93czogRGF0YUdyb3VwSGlkZUVtcHR5Um93cywgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBmb3IgKGxldCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgZ3JpZC5sZW5ndGg7IHJvd0luZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGdyaWRbcm93SW5kZXhdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgcm93Lmxlbmd0aDsgY29sdW1uSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmIChyb3dbY29sdW1uSW5kZXhdICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZm91bmRFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRWxlbWVudFJvd0luZGV4ID0gcm93SW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIGZvciAoOyBmb3VuZEVsZW1lbnRSb3dJbmRleCA8IGdyaWQubGVuZ3RoOyBmb3VuZEVsZW1lbnRSb3dJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ZvdW5kRWxlbWVudFJvd0luZGV4XVtjb2x1bW5JbmRleF0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID4gMCAmJiBncmlkW2ZvdW5kRWxlbWVudFJvd0luZGV4XVtjb2x1bW5JbmRleCAtIDFdID09PSBncmlkW2ZvdW5kRWxlbWVudFJvd0luZGV4XVtjb2x1bW5JbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudERpbWVuc2lvbnMgPSB0aGlzLmdldEVsZW1lbnREaW1lbnNpb25zKGdyaWQsIGNvbHVtbkluZGV4LCBmb3VuZEVsZW1lbnRSb3dJbmRleCwgc3ViZ3JpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FyZWFFbXB0eShncmlkLCBjb2x1bW5JbmRleCwgcm93SW5kZXgsIGVsZW1lbnREaW1lbnNpb25zLndpZHRoLCBmb3VuZEVsZW1lbnRSb3dJbmRleCAtIHJvd0luZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9jY3VweVNwYWNlKGdyaWQsIGZvdW5kRWxlbWVudFJvd0luZGV4LCBjb2x1bW5JbmRleCwgZWxlbWVudERpbWVuc2lvbnMud2lkdGgsICcnLCBlbGVtZW50RGltZW5zaW9ucy5oZWlnaHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShncmlkLCByb3dJbmRleCwgY29sdW1uSW5kZXgsIGVsZW1lbnREaW1lbnNpb25zLndpZHRoLCBlbGVtZW50LCBlbGVtZW50RGltZW5zaW9ucy5oZWlnaHQsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZVJvd3MgIT09IERhdGFHcm91cEhpZGVFbXB0eVJvd3MuTk9ORSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBjaGVjayB0aGUgcm93cyBwb3RlbnRpYWxseSBjbGVhcmVkIGJ5IG1vdmluZyB0aGUgZ3JpZCBlbGVtZW50IHVwXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUVtcHR5Um93cyhncmlkLCBmb3VuZEVsZW1lbnRSb3dJbmRleCwgZm91bmRFbGVtZW50Um93SW5kZXggKyBlbGVtZW50RGltZW5zaW9ucy5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyByb3dzIGZyb20gdGhlIGdyaWQgdGhhdCBvbmx5IGNvbnRhaW4gZW1wdHkgZWxlbWVudHMgKGFyZSBlbXB0eSkuIFRoZSBncmlkIGlzIG1vZGlmaWVkIGluIHBsYWNlLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBncmlkIHRoYXQgc2hvdWxkIGhhdmUgaXQncyBlbXB0eSByb3dzIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0gZmlyc3RSb3cgdGhlIDAgYmFzZWQgaW5kZXggb2YgdGhlIGZpcnN0IHJvdyB0aGF0IHNob3VsZCBiZSBjaGVja2VkLiBVc2UgMCB0byBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdGhlIGdyaWQgd2lsbCBiZSBjaGVja2VkIGZyb20gdGhlIGZpcnN0IHJvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYXN0Um93IHRoZSAwIGJhc2VkIGluZGV4IG9mIHRoZSByb3cgd2hlcmUgdGhlIGNoZWNraW5nIHNob3VsZCBlbmQuIFRoZSByb3cgd2l0aCB0aGlzIGluZGV4IGlzIG5vdCBjaGVja2VkLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgdGhlIGVudGlyZSBncmlkIGZyb20gdGhlIGBmaXJzdFJvd2Agd2lsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgb3IgZXF1YWwgdG8gdGhlIGBmaXJzdFJvd2AgaXMgcHJvdmlkZWQgbm8gY2hlY2tzIHdpbGwgYmUgcHJlZm9ybWVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW1vdmVFbXB0eVJvd3MoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIGZpcnN0Um93ID0gMCwgbGFzdFJvdyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgICBsZXQgaSA9IGZpcnN0Um93O1xuICAgICAgICB3aGlsZSAoaSA8IGdyaWQubGVuZ3RoICYmIGkgPCBsYXN0Um93KSB7XG4gICAgICAgICAgICBpZiAoZ3JpZFtpXS5ldmVyeShlbGVtZW50ID0+IGVsZW1lbnQgPT09ICcnKSkge1xuICAgICAgICAgICAgICAgIGdyaWQuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50IGluIHRoZSBncmlkIHdpdGggaXRzIHRvcC1sZWZ0IGNvcm5lciBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uXG4gICAgICogQHBhcmFtIGdyaWQgdGhlIGdyaWQgb2YgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGRlc2lyZWQgZWxlbWVudHMgdG9wLWxlZnQgY29ybmVyXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqIEByZXR1cm5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFbGVtZW50RGltZW5zaW9ucyhncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHN1YmdyaWQ6IFN1YmdyaWQpOiB7IHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZ3JpZFt5XVt4XTtcbiAgICAgICAgbGV0IHdpZHRoID0gMTtcbiAgICAgICAgd2hpbGUgKHggKyB3aWR0aCA8IHN1YmdyaWQuY29scyAmJiBncmlkW3ldW3ggKyB3aWR0aF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHdpZHRoKys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhlaWdodCA9IDE7XG4gICAgICAgIHdoaWxlICh5ICsgaGVpZ2h0IDwgZ3JpZC5sZW5ndGggJiYgZ3JpZFt5ICsgaGVpZ2h0XVt4XSA9PT0gZWxlbWVudCkge1xuICAgICAgICAgICAgaGVpZ2h0Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcmVhIGluIHRoZSBncmlkIGNvbnRhaW5zIG5vIGVsZW1lbnRzLCBvciBub3RcbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCBvZiBlbGVtZW50c1xuICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHRlc3RlZCBhcmVhcyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0ZWQgYXJlYXMgdG9wLWxlZnQgY29ybmVyXG4gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgdGVzdGVkIGFyZWFcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHRlc3RlZCBhcmVhXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzQXJlYUVtcHR5KGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCB4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHk7IGkgPCB5ICsgaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSB4OyBqIDwgeCArIHdpZHRoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXVtqXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbGF5b3V0IGRhdGEgZm9yIGEgc2luZ2xlIGRhdGEgZ3JvdXAgd2l0aCBmbG93IGxheW91dC4gVGhlIHJlc3VsdGluZyBsYXlvdXQgaXMgc2F2ZWQgaW50byB0aGUgaW5wdXQgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkIHVzaW5nIHRoZSBmbG93IGFsZ29yaXRobVxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcHV0ZUZsb3dMYXlvdXQoZGF0YUdyb3VwOiBEYXRhR3JvdXAsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgdGhpcy5mbG93RmllbGRzKGRhdGFHcm91cCwgc3ViZ3JpZCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciBhIHNpbmdsZSBkYXRhIGdyb3VwIHdpdGggbGVnYWN5IGxheW91dC4gVGhlIHJlc3VsdGluZyBsYXlvdXQgaXMgc2F2ZWQgaW50byB0aGUgaW5wdXQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIFRoZSBsZWdhY3kgbGF5b3V0IGZvcmNlcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gYmUgNCBhbmQgbG9ncyBhIHdhcm5pbmcgaWYgdGhpcyB3YXMgbm90IHRoZSBjYXNlLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGRhdGEgZ3JvdXAgdGhhdCBzaG91bGQgYmUgbGFpZCBvdXQgaW50byBhIGdyaWQgdXNpbmcgdGhlIGxlZ2FjeSBhbGdvcml0aG0gdXNlZCBpbiBOQUUgdmVyc2lvbnMgPCA0LjAuMFxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcHV0ZUxlZ2FjeUxheW91dChkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBpZiAoc3ViZ3JpZC5jb2xzICE9PSA0KSB7XG4gICAgICAgICAgICBzdWJncmlkLmNvbHMgPSA0O1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oYFRhc2sgd2l0aCBpZCAnJHt0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLnN0cmluZ0lkfScgaGFzIGEgZGF0YSBncm91cCB3aXRoIGxlZ2FjeSBsYXlvdXQgd2l0aCBhIGBcbiAgICAgICAgICAgICAgICArIGBub24tZGVmYXVsdCBudW1iZXIgb2YgY29sdW1ucy4gSWYgeW91IHdhbnQgdG8gdXNlIGEgbGF5b3V0IHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBjb2x1bW5zIHRoYW4gMiB1c2UgYSBkaWZmZXJlbnQgYFxuICAgICAgICAgICAgICAgICsgYGxheW91dCB0eXBlIGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZsb3dGaWVsZHMoZGF0YUdyb3VwLCBzdWJncmlkLCAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMYXlzIG91dCB0aGUgZmllbGRzIGZyb20gbGVmdCB0byByaWdodCwgZnJvbSB0b3AgdG8gYm90dG9tLiBJZiB0aGUgd2lkdGggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIHRoZSBibG9jayBvZiBmbG93ZWQgZmllbGRzIGRvZXNuJ3QgZml0XG4gICAgICogbmVhdGx5IGludG8gdGhlIGNvbHVtbnMgKGlmIHRoZSB3aWR0aCBvZiBhIHNpbmdsZSBmaWVsZCBpcyBub3QgYSBkaXZpc29yIG9mIGNvbHVtbiBjb3VudCksIHRoZW4gdGhlIGVudGlyZSBibG9jayBvZiBmaWVsZHMgaXNcbiAgICAgKiBsZWZ0IGFsaWduZWQuIFRoZSBsYXN0IHJvdyBvZiBmaWVsZHMgaXMgYWxpZ25lZCB0byB0aGUgbGVmdCwgY2VudGVyIG9yIHJpZ2h0IGJhc2VkIG9uIHRoZSBkYXRhIGdyb3VwcyBwcm9wZXJ0eS5cbiAgICAgKiBJZiB0aGUgbGFzdCByb3cgY2Fubm90IGJlIGFsaWduZWQgdG8gdGhlIGV4YWN0IGNlbnRlciBpdCBpcyBvZmZzZXQgb25lIGdyaWQgdGlsZSB0byB0aGUgbGVmdC5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqIEBwYXJhbSBmaWVsZFdpZHRoIHRoZSBudW1iZXIgb2YgZ3JpZCB0aWxlcywgdGhhdCBzaG91bGQgYmUgb2NjdXBpZWQgYnkgZWFjaCBmaWVsZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmbG93RmllbGRzKGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkLCBmaWVsZFdpZHRoOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmllbGRzUGVyUm93ID0gTWF0aC5mbG9vcihzdWJncmlkLmNvbHMgLyBmaWVsZFdpZHRoKTtcbiAgICAgICAgY29uc3QgbWF4WFBvc2l0aW9uID0gZmllbGRXaWR0aCAqIChmaWVsZHNQZXJSb3cgLSAxKTtcblxuICAgICAgICBsZXQgeFBvc2l0aW9uID0gMDtcbiAgICAgICAgY29uc3QgbG9jYWxHcmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZvckVhY2goKGRhdGFGaWVsZCwgZGF0YUZpZWxkQ291bnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkRWxlbWVudCA9IHN1YmdyaWQuYWRkRmllbGQoZGF0YUZpZWxkLCB0aGlzLl9maWVsZENvbnZlcnRlci5yZXNvbHZlVHlwZShkYXRhRmllbGQpKTtcbiAgICAgICAgICAgIGlmIChkYXRhR3JvdXAuc3RyZXRjaCkge1xuICAgICAgICAgICAgICAgIHN1YmdyaWQuYWRkUm93KHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMsIGZpZWxkRWxlbWVudC5ncmlkQXJlYUlkKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZVxuICAgICAgICAgICAgaWYgKHhQb3NpdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsR3JpZC5wdXNoKHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4UG9zaXRpb24gPT09IDAgJiYgdGhpcy5pc0xhc3RSb3coZGF0YUZpZWxkQ291bnQsIGRhdGFHcm91cCwgZmllbGRzUGVyUm93KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkc0luTGFzdFJvdyA9IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoICUgZmllbGRzUGVyUm93O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd1dpZHRoID0gbWF4WFBvc2l0aW9uICsgZmllbGRXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YUdyb3VwLmFsaWdubWVudCA9PT0gRGF0YUdyb3VwQWxpZ25tZW50LkVORCkge1xuICAgICAgICAgICAgICAgICAgICB4UG9zaXRpb24gPSByb3dXaWR0aCAtIGZpZWxkV2lkdGggKiBmaWVsZHNJbkxhc3RSb3c7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhR3JvdXAuYWxpZ25tZW50ID09PSBEYXRhR3JvdXBBbGlnbm1lbnQuQ0VOVEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHhQb3NpdGlvbiA9IE1hdGguZmxvb3IoKHJvd1dpZHRoIC0gZmllbGRzSW5MYXN0Um93ICogZmllbGRXaWR0aCkgLyAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9jY3VweVNwYWNlKGxvY2FsR3JpZCwgbG9jYWxHcmlkLmxlbmd0aCAtIDEsIHhQb3NpdGlvbiwgZmllbGRXaWR0aCwgZmllbGRFbGVtZW50LmdyaWRBcmVhSWQpO1xuXG4gICAgICAgICAgICB4UG9zaXRpb24gKz0gZmllbGRXaWR0aDtcbiAgICAgICAgICAgIGlmICh4UG9zaXRpb24gPiBtYXhYUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB4UG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9jYWxHcmlkLmZvckVhY2gocm93ID0+IHN1YmdyaWQuYWRkUm93KHJvdykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgcm93XG4gICAgICogQHBhcmFtIGNvbnRlbnQgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZmlsbCBhbGwgZWxlbWVudHMgaW4gdGhlIHJvd1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBuZXdHcmlkUm93KHdpZHRoOiBudW1iZXIsIGNvbnRlbnQgPSAnJyk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gQXJyYXkod2lkdGgpLmZpbGwoY29udGVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbHMgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgcHJvdmlkZWQgZ3JpZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBzcGVjaWZpZWQgYXJlYSBjb250YWlucyB2YWx1ZXMgb3RoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBncmlkIHRoYXQgc2hvdWxkIGJlIG1vZGlmaWVkXG4gICAgICogQHBhcmFtIHkgdGhlIDAgYmFzZWQgcm93IGluZGV4IG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZpbGxlZCBhcmVhXG4gICAgICogQHBhcmFtIHggdGhlIDAgYmFzZWQgY29sdW1uIGluZGV4IG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZpbGxlZCBhcmVhXG4gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZmlsbGVkIGFyZWFcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgaXMgc2V0IGludG8gZXZlcnkgY2VsbCBvZiB0aGUgZ3JpZCBpbnNpZGUgdGhlIHNwZWNpZmllZCBhcmVhXG4gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSBjaGVja09jY3VwYW50cyB3aGV0aGVyIHRoZSBmaWxsZWQgYXJlYSBzaG91bGQgYmUgY2hlY2tlZCBmb3Igb3RoZXIgZWxlbWVudHMuXG4gICAgICogSWYgYSBjaGVjayBpcyBwZXJmb3JtZWQgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgZWxlbWVudHMgYXJlIGZvdW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvY2N1cHlTcGFjZShncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgeTogbnVtYmVyLCB4OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzdHJpbmcsIGhlaWdodCA9IDEsIGNoZWNrT2NjdXBhbnRzID0gdHJ1ZSkge1xuICAgICAgICBmb3IgKGxldCBqID0geTsgaiA8IHkgKyBoZWlnaHQ7IGorKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHg7IGkgPCB4ICsgd2lkdGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja09jY3VwYW50cyAmJiBncmlkW2pdW2ldICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwbGFjZSBlbGVtZW50ICR7dmFsdWV9IGludG8gdGhlIGdyaWQgbGF5b3V0LCBiZWNhdXNlIGl0J3Mgc3BhY2UgKHg6ICR7aX0sIHk6ICR7an0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIGlzIGFscmVhZHkgb2NjdXBpZWQgYnkgYW5vdGhlciBlbGVtZW50ICgke2dyaWRbal1baV19KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBncmlkW2pdW2ldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGVja2VkIGVsZW1lbnQgd2l0aGluIGl0cyBkYXRhIGdyb3VwXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgY2hlY2tlZCBkYXRhIGdyb3VwXG4gICAgICogQHBhcmFtIGZpZWxkc1BlclJvdyB0aGUgbnVtYmVyIG9mIGZpZWxkcyB0aGF0IGlzIHJlcXVpcmVkIHRvIGZpbGwgYW4gZW50aXJlIHJvd1xuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGZpZWxkIGF0IHRoZSBnaXZlbiBpbmRleCBpcyB3aXRoaW4gdGhlIGxhc3Qgcm93IG9mIGVsZW1lbnRzIG9mIHRoZSBwcm92aWRlZCBkYXRhIGdyb3VwLlxuICAgICAqIE5vdGUgdGhhdCBpZiB0aGUgbGFzdCByb3cgY29udGFpbnMgZW5vdWdoIGVsZW1lbnRzIHRvIGJlIGNvbXBsZXRlbHkgZmlsbGVkIHRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaXNMYXN0Um93KGluZGV4OiBudW1iZXIsIGRhdGFHcm91cDogRGF0YUdyb3VwLCBmaWVsZHNQZXJSb3c6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaW5kZXggKyBmaWVsZHNQZXJSb3cgPj0gZGF0YUdyb3VwLmZpZWxkcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIHByZXZpb3VzIGNvbnRlbnQgYW5kIHB1c2hlcyB0aGUgbmV3IGNvbnRlbnQgaW50byB0aGUgc3RyZWFtXG4gICAgICogQHBhcmFtIGNvbnRlbnQgdGhlIG5ldyBjb250ZW50XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGVudDogQXJyYXk8U3ViZ3JpZD4gPSBbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJC52YWx1ZS5mb3JFYWNoKHN1YmdyaWQgPT4gc3ViZ3JpZC5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJC5uZXh0KGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVTdWJncmlkSWQoZGF0YUdyb3VwOiBEYXRhR3JvdXApOiBzdHJpbmcge1xuICAgICAgICBsZXQgaWRCYXNlOiBzdHJpbmc7XG4gICAgICAgIGlmIChkYXRhR3JvdXAucGFyZW50VGFza0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlkQmFzZSA9IFtkYXRhR3JvdXAucGFyZW50VGFza0lkLCBkYXRhR3JvdXAucGFyZW50VGFza1JlZklkLCBkYXRhR3JvdXAubmVzdGluZ0xldmVsXS5qb2luKCcjJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZEJhc2UgPSAncm9vdCc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlkID0gaWRCYXNlO1xuICAgICAgICB3aGlsZSAodGhpcy5fZXhpc3RpbmdTdWJncmlkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGlkID0gaWRCYXNlICsgdGhpcy5fc3ViZ3JpZElkQ291bnRlci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZXhpc3RpbmdTdWJncmlkSWRzLmFkZChpZCk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhY2tCeVN1YmdyaWRGbiA9IChpbmRleDogbnVtYmVyLCBzdWJncmlkOiBTdWJncmlkKSA9PiBzdWJncmlkLnN1YmdyaWRJZDtcblxuICAgIHB1YmxpYyB0cmFja0J5Rm4gPSAoaW5kZXg6IG51bWJlciwgZWxlbWVudDogRGF0YWZpZWxkR3JpZExheW91dEVsZW1lbnQpID0+IHRoaXMudHJhY2tCeURhdGFmaWVsZHMoaW5kZXgsIGVsZW1lbnQpO1xuXG4gICAgcHJvdGVjdGVkIHRyYWNrQnlEYXRhZmllbGRzKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IERhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFRhc2tFbGVtZW50VHlwZS5CTEFOSzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5ncmlkQXJlYUlkICsgJy0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNhc2UgVGFza0VsZW1lbnRUeXBlLkxPQURFUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5ncmlkQXJlYUlkICsgJy1MLScgKyB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlQ291bnRlci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY2FzZSBUYXNrRWxlbWVudFR5cGUuREFUQV9HUk9VUF9USVRMRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC50aXRsZSArICctJyArIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lml0ZW0uc3RyaW5nSWQgKyAnLScgKyB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlQ291bnRlci5nZXRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
@@ -30,6 +30,7 @@ export * from './base64';
|
|
|
30
30
|
export * from './tests/mocks/mock-authentication.service';
|
|
31
31
|
export * from './tests/mocks/mock-user-preference.service';
|
|
32
32
|
export * from './tests/mocks/mock-user-resource.service';
|
|
33
|
+
export * from './tests/mocks/mock-user.service';
|
|
33
34
|
export * from './tests/mocks/mock-authentication-method-service';
|
|
34
35
|
export * from './tests/mocks/mock-sign-up.service';
|
|
35
36
|
export * from './tests/mocks/mock-user-autocomplete-value';
|
|
@@ -53,4 +54,4 @@ export * from './tests/test-view-service';
|
|
|
53
54
|
export * from './tests/mocks/mock-endpoint';
|
|
54
55
|
export * from './tests/test-mock-dependencies.module';
|
|
55
56
|
export * from './tests/mocks/mock-profile.service';
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdXRpbGl0eS9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxrREFBa0QsQ0FBQztBQUNqRSxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxVQUFVLENBQUM7QUFFekIsV0FBVztBQUNYLGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrREFBa0QsQ0FBQztBQUNqRSxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYyw4Q0FBOEMsQ0FBQztBQUM3RCxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9vZi12b2lkJztcbmV4cG9ydCAqIGZyb20gJy4vbG9hZGluZy1lbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbG9hZGluZy13aXRoLWZpbHRlci1lbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0LWltbWVkaWF0ZS1kYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0LWZpZWxkJztcbmV4cG9ydCAqIGZyb20gJy4vY2FsbC1jaGFpbi9jYWxsLWNoYWluLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWxsLWNoYWluL2FmdGVyLWFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2luYXRpb24vcGFnZS1oYXMtY29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2luYXRpb24vbG9hZC1hbGwtcGFnZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24tcGFyYW1zJztcbmV4cG9ydCAqIGZyb20gJy4vcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXNvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlL3NwaW5uZXItb3ZlcmxheS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZS9jYXNlLWxpc3QtZm9udC1jb2xvci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW5jcmVtZW50aW5nLWNvdW50ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9hcnJheS10by1vYnNlcnZhYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvY2Vzcy1tZXNzYWdlLXJlc3BvbnNlJztcbmV4cG9ydCAqIGZyb20gJy4vcmVzdWx0LXdpdGgtYWZ0ZXItYWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NsZWFyLXRpbWUtaW5mb3JtYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZWZyZXNoLXRyZWUnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXN0cm95LXN1YnNjcmlwdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL25hdmlnYXRpb24taXRlbS10YXNrLWZpbHRlci1mYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vbmF2aWdhdGlvbi1pdGVtLXRhc2stc2VhcmNoLWNhdGVnb3JpZXMtZmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL2lzLWVtcHR5LnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9pcy1ub24tZW1wdHkucGlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRhaW5zLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsaXR5Lm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdGl2ZXMvbGV0LmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2U2NCc7XG5cbi8qIFRFU1RTICovXG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL21vY2tzL21vY2stYXV0aGVudGljYXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL21vY2tzL21vY2stdXNlci1wcmVmZXJlbmNlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy9tb2Nrcy9tb2NrLXVzZXItcmVzb3VyY2Uuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL21vY2tzL21vY2stdXNlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdHMvbW9ja3MvbW9jay1hdXRoZW50aWNhdGlvbi1tZXRob2Qtc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL21vY2tzL21vY2stc2lnbi11cC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdHMvbW9ja3MvbW9jay11c2VyLWF1dG9jb21wbGV0ZS12YWx1ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL3V0aWxpdHkvY3JlYXRlLW1vY2stdGFzayc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL3V0aWxpdHkvY3JlYXRlLW1vY2stY2FzZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL3V0aWxpdHkvY3JlYXRlLW1vY2staW1tZWRpYXRlLWRhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy91dGlsaXR5L2NyZWF0ZS1tb2NrLXBhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy91dGlsaXR5L2NyZWF0ZS1tb2NrLW5ldCc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL3V0aWxpdHkvY3JlYXRlLW1vY2stZGF0YWdyb3VwJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdHMvdXRpbGl0eS9jcmVhdGUtbW9jay1maWVsZCc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL3V0aWxpdHkvY3JlYXRlLW1vY2stY2FzZS1vdXRjb21lJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdHMvdXRpbGl0eS9jcmVhdGUtbW9jay10YXNrLW91dGNvbWUnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy91dGlsaXR5L2NyZWF0ZS1tb2NrLWdldC1kYXRhLW91dGNvbWUnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy91dGlsaXR5L2NyZWF0ZS1tb2NrLXNldC1kYXRhLW91dGNvbWUnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy91dGlsaXR5L2NyZWF0ZS1tb2NrLXBldHJpLW5ldC1vdXRjb21lJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdHMvdXRpbGl0eS9jb25maWd1cmUtY2F0ZWdvcnknO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy9zZWFyY2gtY2F0ZWdvcnktbW9jay1kZXBlbmRlbmNpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy90ZXN0LWNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL3Rlc3RzL3Rlc3QtZmFjdG9yeS1tZXRob2RzJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdHMvdGVzdC12aWV3LXNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy9tb2Nrcy9tb2NrLWVuZHBvaW50JztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdHMvdGVzdC1tb2NrLWRlcGVuZGVuY2llcy5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXN0cy9tb2Nrcy9tb2NrLXByb2ZpbGUuc2VydmljZSc7XG4iXX0=
|