igniteui-angular 12.3.12 → 12.3.13
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/bundles/igniteui-angular.umd.js +17 -25
- package/bundles/igniteui-angular.umd.js.map +1 -1
- package/esm2015/lib/grids/filtering/excel-style/excel-style-search.component.js +2 -4
- package/esm2015/lib/grids/filtering/excel-style/grid.excel-style-filtering.component.js +2 -2
- package/esm2015/lib/grids/filtering/grid-filtering.service.js +16 -22
- package/fesm2015/igniteui-angular.js +17 -25
- package/fesm2015/igniteui-angular.js.map +1 -1
- package/lib/grids/filtering/grid-filtering.service.d.ts +1 -1
- package/package.json +1 -1
|
@@ -156,12 +156,9 @@ export class IgxFilteringService {
|
|
|
156
156
|
const col = grid.getColumnByName(field);
|
|
157
157
|
const filteringIgnoreCase = ignoreCase || (col ? col.filteringIgnoreCase : false);
|
|
158
158
|
const filteringTree = grid.filteringExpressionsTree;
|
|
159
|
-
const columnFilteringExpressionsTree =
|
|
159
|
+
const columnFilteringExpressionsTree = filteringTree.find(field);
|
|
160
160
|
conditionOrExpressionTree = conditionOrExpressionTree !== null && conditionOrExpressionTree !== void 0 ? conditionOrExpressionTree : columnFilteringExpressionsTree;
|
|
161
161
|
const fieldFilterIndex = filteringTree.findIndex(field);
|
|
162
|
-
if (fieldFilterIndex > -1) {
|
|
163
|
-
filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
|
|
164
|
-
}
|
|
165
162
|
const newFilteringTree = this.prepare_filtering_expression(filteringTree, field, value, conditionOrExpressionTree, filteringIgnoreCase, fieldFilterIndex, true);
|
|
166
163
|
const eventArgs = { owner: grid,
|
|
167
164
|
filteringExpressions: newFilteringTree.find(field), cancel: false };
|
|
@@ -472,12 +469,11 @@ export class IgxFilteringService {
|
|
|
472
469
|
this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
|
|
473
470
|
grid.filteringExpressionsTree = filteringTree;
|
|
474
471
|
}
|
|
475
|
-
/** Modifies the filteringState object to contain the newly added
|
|
472
|
+
/** Modifies the filteringState object to contain the newly added filtering conditions/expressions.
|
|
476
473
|
* If createNewTree is true, filteringState will not be modified (because it directly affects the grid.filteringExpressionsTree),
|
|
477
474
|
* but a new object is created and returned.
|
|
478
475
|
*/
|
|
479
476
|
prepare_filtering_expression(filteringState, fieldName, searchVal, conditionOrExpressionsTree, ignoreCase, insertAtIndex = -1, createNewTree = false) {
|
|
480
|
-
const oldExpressionsTreeIndex = filteringState.findIndex(fieldName);
|
|
481
477
|
const expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
|
|
482
478
|
conditionOrExpressionsTree : null;
|
|
483
479
|
const condition = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
|
|
@@ -485,23 +481,21 @@ export class IgxFilteringService {
|
|
|
485
481
|
const newExpression = { fieldName, searchVal, condition, ignoreCase };
|
|
486
482
|
const newExpressionsTree = createNewTree ?
|
|
487
483
|
new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName) : filteringState;
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
if (
|
|
491
|
-
|
|
492
|
-
newExpressionsTree.filteringOperands.splice(insertAtIndex, 0, expressionsTree);
|
|
493
|
-
}
|
|
494
|
-
else {
|
|
495
|
-
newExpressionsTree.filteringOperands.push(expressionsTree);
|
|
496
|
-
}
|
|
484
|
+
// no expressions tree found for this field
|
|
485
|
+
if (expressionsTree) {
|
|
486
|
+
if (insertAtIndex > -1) {
|
|
487
|
+
newExpressionsTree.filteringOperands[insertAtIndex] = expressionsTree;
|
|
497
488
|
}
|
|
498
|
-
else
|
|
499
|
-
|
|
500
|
-
const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
|
|
501
|
-
newExprTree.filteringOperands.push(newExpression);
|
|
502
|
-
newExpressionsTree.filteringOperands.push(newExprTree);
|
|
489
|
+
else {
|
|
490
|
+
newExpressionsTree.filteringOperands.push(expressionsTree);
|
|
503
491
|
}
|
|
504
492
|
}
|
|
493
|
+
else if (condition) {
|
|
494
|
+
// create expressions tree for this field and add the new expression to it
|
|
495
|
+
const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
|
|
496
|
+
newExprTree.filteringOperands.push(newExpression);
|
|
497
|
+
newExpressionsTree.filteringOperands.push(newExprTree);
|
|
498
|
+
}
|
|
505
499
|
return newExpressionsTree;
|
|
506
500
|
}
|
|
507
501
|
isFilteringTreeComplex(expressions) {
|
|
@@ -512,7 +506,7 @@ export class IgxFilteringService {
|
|
|
512
506
|
const expressionsTree = expressions;
|
|
513
507
|
if (expressionsTree.operator === FilteringLogic.Or) {
|
|
514
508
|
const andOperatorsCount = this.getChildAndOperatorsCount(expressionsTree);
|
|
515
|
-
// having more
|
|
509
|
+
// having more than one 'And' operator in the sub-tree means that the filter could not be represented without parentheses.
|
|
516
510
|
return andOperatorsCount > 1;
|
|
517
511
|
}
|
|
518
512
|
let isComplex = false;
|
|
@@ -592,4 +586,4 @@ IgxFilteringService.ctorParameters = () => [
|
|
|
592
586
|
{ type: ApplicationRef },
|
|
593
587
|
{ type: Injector }
|
|
594
588
|
];
|
|
595
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUVWLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsY0FBYyxFQUNkLFFBQVEsRUFHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQTZCLE1BQU0sa0RBQWtELENBQUM7QUFFdkgsT0FBTyxFQUF3QixjQUFjLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbEQsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9FOztHQUVHO0FBQ0gsTUFB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QztJQUNyQyxDQUFDOzs7WUE1cEJKLFVBQVU7OztZQXhDUCxXQUFXO1lBdUJOLGNBQWM7WUFOZCxpQkFBaUI7WUFoQnRCLHdCQUF3QjtZQUN4QixjQUFjO1lBQ2QsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgSW5qZWN0YWJsZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgTmdNb2R1bGVSZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIEluamVjdG9yLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElneEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZ3JpZC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nRXhwcmVzc2lvbiwgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJRm9yT2ZTdGF0ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElGaWx0ZXJpbmdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBJQ29sdW1uUmVzaXplRXZlbnRBcmdzLCBJRmlsdGVyaW5nRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3MsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBmYWRlSW4gfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL21haW4nO1xuaW1wb3J0IHsgRXhjZWxTdHlsZVBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbC9hYnNvbHV0ZS1zY3JvbGwtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGVkaXRvciwgcGluTGVmdCwgdW5waW5MZWZ0IH0gZnJvbSAnQGlnbml0ZXVpL21hdGVyaWFsLWljb25zLWV4dGVuZGVkJztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uVUkge1xuICAgIHB1YmxpYyBleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICBwdWJsaWMgYmVmb3JlT3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljO1xuICAgIHB1YmxpYyBhZnRlck9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1Zpc2libGUgPSB0cnVlO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElneEZpbHRlcmluZ1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyBpc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgZmlsdGVyZWRDb2x1bW46IElneENvbHVtbkNvbXBvbmVudCA9IG51bGw7XG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb24gPSBudWxsO1xuICAgIHB1YmxpYyBjb2x1bW5Ub01vcmVJY29uSGlkZGVuID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgcHVibGljIGFjdGl2ZUZpbHRlckNlbGwgPSAwO1xuICAgIHB1YmxpYyBncmlkOiBJZ3hHcmlkQmFzZURpcmVjdGl2ZTtcblxuICAgIHByaXZhdGUgY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBhcmVFdmVudHNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBpc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgY29sdW1uVG9FeHByZXNzaW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBFeHByZXNzaW9uVUlbXT4oKTtcbiAgICBwcml2YXRlIGNvbHVtblN0YXJ0SW5kZXggPSAtMTtcbiAgICBwcml2YXRlIF9jb21wb25lbnRPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBjb21wb25lbnRJbnN0YW5jZTogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBjb2x1bW47XG4gICAgcHJpdmF0ZSBsYXN0QWN0aXZlTm9kZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9tb2R1bGVSZWY6IE5nTW9kdWxlUmVmPGFueT4sXG4gICAgICAgIHByaXZhdGUgaWNvblNlcnZpY2U6IElneEljb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9vdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2ZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwcml2YXRlIF9hcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVGaWx0ZXJEcm9wZG93bihlbGVtZW50OiBIVE1MRWxlbWVudCwgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgfHwgKHRoaXMuY29sdW1uICYmIHRoaXMuY29sdW1uLmZpZWxkICE9PSBjb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRGaWx0ZXJpbmdTZXR0aW5ncygpO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJY29uID0gdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID8gJ2lneC1leGNlbC1maWx0ZXJfX2ljb24tLWZpbHRlcmVkJyA6ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uJztcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckljb25UYXJnZXQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2ZpbHRlckljb259YCkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gZmlsdGVySWNvblRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gKHRoaXMuZ3JpZCBhcyBhbnkpLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UuaW5pdGlhbGl6ZSh0aGlzLmNvbHVtbiwgdGhpcy5fb3ZlcmxheVNlcnZpY2UpO1xuXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPSB0aGlzLl9vdmVybGF5U2VydmljZS5hdHRhY2godGhpcy5jb21wb25lbnRJbnN0YW5jZS5lbGVtZW50LCB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2Uub3ZlcmxheUNvbXBvbmVudElkID0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkO1xuXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdEZpbHRlcmluZ1NldHRpbmdzKCkge1xuICAgICAgICB0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogdXNlQW5pbWF0aW9uKGZhZGVJbiwgeyBwYXJhbXM6IHsgZHVyYXRpb246ICcyNTBtcycgfX0pLFxuICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgRXhjZWxTdHlsZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgob3ZlcmxheSkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBY3RpdmVOb2RlID0gdGhpcy5ncmlkLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKFxuICAgICAgICAgICAgZmlyc3QoKG92ZXJsYXkpID0+IG92ZXJsYXkuaWQgPT09IHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZS5jb2x1bW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgPSB0aGlzLmxhc3RBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC50aGVhZFJvdy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZUV4Y2VsRmlsdGVyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gZ3JpZCdzIGV2ZW50cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3Vic2NyaWJlVG9FdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5hcmVFdmVudHNTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFyZUV2ZW50c1N1YnNjcmliZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1uUmVzaXplZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChldmVudEFyZ3M6IElDb2x1bW5SZXNpemVFdmVudEFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0NlbGwoZXZlbnRBcmdzLmNvbHVtbik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5ncmlkLnBhcmVudFZpcnREaXIuY2h1bmtMb2FkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2ZW50QXJnczogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRBcmdzLnN0YXJ0SW5kZXggIT09IHRoaXMuY29sdW1uU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtblN0YXJ0SW5kZXggPSBldmVudEFyZ3Muc3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckNlbGwudXBkYXRlRmlsdGVyQ2VsbEFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5Nb3ZpbmdFbmQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2VsbC51cGRhdGVGaWx0ZXJDZWxsQXJlYSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSBmaWx0ZXJpbmcgcm93IGlmIGEgY29sdW1uIGlzIGhpZGRlbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZUZpbHRlcmluZ1Jvd09uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2w6IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdSb3cgPSB0aGlzLmdyaWQuZmlsdGVyaW5nUm93O1xuXG4gICAgICAgIGlmIChmaWx0ZXJpbmdSb3cgJiYgZmlsdGVyaW5nUm93LmNvbHVtbiAmJiBmaWx0ZXJpbmdSb3cuY29sdW1uID09PSBjb2wpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGNyZWF0ZSBleHByZXNzaW9uc1RyZWUgYW5kIGZpbHRlciBncmlkIHVzZWQgaW4gYm90aCBmaWx0ZXIgbW9kZXMuXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlckludGVybmFsKGZpZWxkOiBzdHJpbmcsIGV4cHJlc3Npb25zOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBBcnJheTxFeHByZXNzaW9uVUk+ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gdHJ1ZTtcblxuICAgICAgICBsZXQgZXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlID0gdGhpcy5jcmVhdGVTaW1wbGVGaWx0ZXJpbmdUcmVlKGZpZWxkLCBleHByZXNzaW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckZpbHRlcihmaWVsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcihmaWVsZCwgbnVsbCwgZXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGZpbHRlcmluZyBvbiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuXG4gICAgICAgIGNvbnN0IGNvbCA9IGdyaWQuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nSWdub3JlQ2FzZSA9IGlnbm9yZUNhc2UgfHwgKGNvbCA/IGNvbC5maWx0ZXJpbmdJZ25vcmVDYXNlIDogZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgY29sdW1uRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmluZChmaWVsZCkgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSA9IGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUgPz8gY29sdW1uRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBmaWVsZEZpbHRlckluZGV4ID0gZmlsdGVyaW5nVHJlZS5maW5kSW5kZXgoZmllbGQpO1xuICAgICAgICBpZiAoZmllbGRGaWx0ZXJJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnNwbGljZShmaWVsZEZpbHRlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdGaWx0ZXJpbmdUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPVxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGZpZWxkLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSxcbiAgICAgICAgICAgIGZpbHRlcmluZ0lnbm9yZUNhc2UsIGZpZWxkRmlsdGVySW5kZXgsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHsgb3duZXI6IGdyaWQsXG4gICAgICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uczogbmV3RmlsdGVyaW5nVHJlZS5maW5kKGZpZWxkKSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb25PckV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcl9pbnRlcm5hbChmaWVsZCwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsIGZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uID0gdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maW5kKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmRpdGlvbiBvciBFeHByZXNzaW9uIFRyZWUhJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2ludGVybmFsKGZpZWxkLCB2YWx1ZSwgZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uLCBmaWx0ZXJpbmdJZ25vcmVDYXNlICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25Gb3JDb2x1bW4gPSBleHByZXNzaW9uc1RyZWVGb3JDb2x1bW4gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJfaW50ZXJuYWwoZmllbGQsIHZhbHVlLCBleHByZXNzaW9uRm9yQ29sdW1uLmNvbmRpdGlvbiwgZmlsdGVyaW5nSWdub3JlQ2FzZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvbmVFdmVudEFyZ3MgPSB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbmQoZmllbGQpIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIGZpbHRlcmVkIGRhdGEgdGhyb3VnaCB0aGUgcGlwZXMgYW5kIHRoZW4gZW1pdCB0aGUgZXZlbnQuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmdyaWQuZmlsdGVyaW5nRG9uZS5lbWl0KGRvbmVFdmVudEFyZ3MpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsdGVyX2dsb2JhbCh0ZXJtLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbHRlcmluZ1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZ3JpZC5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oZmlsdGVyaW5nVHJlZSwgY29sdW1uLmZpZWxkLCB0ZXJtLFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwgaWdub3JlQ2FzZSB8fCBjb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1RyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBmaWx0ZXIgb2YgYSBnaXZlbiBjb2x1bW4gaWYgbmFtZSBpcyBwcm92aWRlZC4gT3RoZXJ3aXNlIGNsZWFycyB0aGUgZmlsdGVycyBvZiBhbGwgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIoZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbXB0eUZpbHRlciA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUobnVsbCwgZmllbGQpO1xuICAgICAgICBjb25zdCBvbkZpbHRlcmluZ0V2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLmdyaWQsXG4gICAgICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uczogZW1wdHlGaWx0ZXIsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlIH07XG5cbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZy5lbWl0KG9uRmlsdGVyaW5nRXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAob25GaWx0ZXJpbmdFdmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbGVhcl9maWx0ZXIoZmllbGQpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5ncmlkLmZpbHRlcmluZ0RvbmUuZW1pdChlbXB0eUZpbHRlcikpO1xuXG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLmdldEV4cHJlc3Npb25zKGZpZWxkKTtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zLmxlbmd0aCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5nZXRFeHByZXNzaW9ucyhjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyX2ZpbHRlcihmaWVsZE5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdTdGF0ZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBpbmRleCA9IGZpbHRlcmluZ1N0YXRlLmZpbmRJbmRleChmaWVsZE5hbWUpO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1N0YXRlLmZpbHRlcmluZ09wZXJhbmRzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1N0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYWxsIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBpbiB0aGUgYElneEdyaWRDb21wb25lbnRgIHdpdGggdGhlIHNhbWUgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nVHJlZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBuZXdGaWx0ZXJpbmdUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShmaWx0ZXJpbmdUcmVlLm9wZXJhdG9yLCBmaWx0ZXJpbmdUcmVlLmZpZWxkTmFtZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZ3JpZC5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24obmV3RmlsdGVyaW5nVHJlZSwgY29sdW1uLmZpZWxkLCB2YWx1ZSwgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIGlnbm9yZUNhc2UgfHwgY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJRmlsdGVyaW5nRXZlbnRBcmdzID0geyBvd25lcjogZ3JpZCwgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IG5ld0ZpbHRlcmluZ1RyZWUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgZ3JpZC5maWx0ZXJpbmcuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICBpZiAoZ3JpZC5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIGdyaWQucGFnaW5hdG9yLnBhZ2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbmV3RmlsdGVyaW5nVHJlZTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZ3JpZC5maWx0ZXJpbmdEb25lLmVtaXQodGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGZpbHRlcmluZyBTVkcgaWNvbnMgaW4gdGhlIGljb24gc2VydmljZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJTVkdJY29ucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWRpdG9ySWNvbnMgPSBlZGl0b3IgYXMgYW55W107XG4gICAgICAgIGVkaXRvckljb25zLmZvckVhY2goaWNvbiA9PiB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChpY29uLm5hbWUsIGljb24udmFsdWUsICdpbXgtaWNvbnMnKSk7XG4gICAgICAgIHRoaXMuaWNvblNlcnZpY2UuYWRkU3ZnSWNvbkZyb21UZXh0KHBpbkxlZnQubmFtZSwgcGluTGVmdC52YWx1ZSwgJ2lteC1pY29ucycpO1xuICAgICAgICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dCh1bnBpbkxlZnQubmFtZSwgdW5waW5MZWZ0LnZhbHVlLCAnaW14LWljb25zJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgRXhwcmVzc2lvblVJIGFycmF5IGZvciBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXhwcmVzc2lvbnMoY29sdW1uSWQ6IHN0cmluZyk6IEV4cHJlc3Npb25VSVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuaGFzKGNvbHVtbklkKSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25VSXMgPSBuZXcgQXJyYXk8RXhwcmVzc2lvblVJPigpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3QoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvciwgZXhwcmVzc2lvblVJcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLnNldChjb2x1bW5JZCwgZXhwcmVzc2lvblVJcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvblVJcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuZ2V0KGNvbHVtbklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNyZWF0ZXMgYWxsIEV4cHJlc3Npb25VSXMgZm9yIGFsbCBjb2x1bW5zLiBFeGVjdXRlZCBhZnRlciBmaWx0ZXJpbmcgdG8gcmVmcmVzaCB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hFeHByZXNzaW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRmlsdGVyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5jbGVhcigpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuZm9yRWFjaCgodmFsdWU6IEV4cHJlc3Npb25VSVtdLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUubGVuZ3RoID0gMDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IsIHZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0NvbXBsZXggPSB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmFkZChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJpbmdDZWxsKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIEV4cHJlc3Npb25VSSBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUV4cHJlc3Npb24oY29sdW1uSWQ6IHN0cmluZywgaW5kZXhUb1JlbW92ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zTGlzdCA9IHRoaXMuZ2V0RXhwcmVzc2lvbnMoY29sdW1uSWQpO1xuXG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlID09PSAwICYmIGV4cHJlc3Npb25zTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbMV0uYmVmb3JlT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4VG9SZW1vdmUgPT09IGV4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbaW5kZXhUb1JlbW92ZSAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgLSAxXS5hZnRlck9wZXJhdG9yID0gZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgKyAxXS5iZWZvcmVPcGVyYXRvcjtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zTGlzdFswXS5iZWZvcmVPcGVyYXRvciA9IG51bGw7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbnNMaXN0LnNwbGljZShpbmRleFRvUmVtb3ZlLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBmaWx0ZXJpbmcgdHJlZSBmb3IgYSBnaXZlbiBjb2x1bW4gZnJvbSBleGlzdGluZyBFeHByZXNzaW9uVUlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTaW1wbGVGaWx0ZXJpbmdUcmVlKGNvbHVtbklkOiBzdHJpbmcsIGV4cHJlc3Npb25VSUxpc3QgPSBudWxsKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNMaXN0ID0gZXhwcmVzc2lvblVJTGlzdCA/IGV4cHJlc3Npb25VSUxpc3QgOiB0aGlzLmdldEV4cHJlc3Npb25zKGNvbHVtbklkKTtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5PciwgY29sdW1uSWQpO1xuICAgICAgICBsZXQgY3VyckFuZEJyYW5jaDogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuXG4gICAgICAgIGZvciAoY29uc3QgY3VyckV4cHJlc3Npb25VSSBvZiBleHByZXNzaW9uc0xpc3QpIHtcbiAgICAgICAgICAgIGlmICghY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ICYmIGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbi5zZWFyY2hWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyckV4cHJlc3Npb25VSS5hZnRlck9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmQgJiYgIWN1cnJBbmRCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCBjb2x1bW5JZCk7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJBbmRCcmFuY2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKChjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSB1bmRlZmluZWQgfHwgY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIGN1cnJFeHByZXNzaW9uVUkuYmVmb3JlT3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSAmJlxuICAgICAgICAgICAgICAgIGN1cnJFeHByZXNzaW9uVUkuYWZ0ZXJPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kKSB7XG5cbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQsIGNvbHVtbklkKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChjdXJyQW5kQnJhbmNoKTtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmQpIHtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGEgY29tcGxleCBmaWx0ZXIgaXMgYXBwbGllZCB0byBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGaWx0ZXJDb21wbGV4KGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmhhcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgY29uc3QgaXNDb21wbGV4ID0gY29sdW1uICYmIHRoaXMuaXNGaWx0ZXJpbmdUcmVlQ29tcGxleChjb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgaWYgKGlzQ29tcGxleCkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zV2l0aENvbXBsZXhGaWx0ZXIuYWRkKGNvbHVtbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBGaWx0ZXJpbmdMb2dpYyBvcGVyYXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3BlcmF0b3JBc1N0cmluZyhvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMpOiBhbnkge1xuICAgICAgICBpZiAob3BlcmF0b3IgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9vcGVyYXRvcl9hbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3Jfb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgbGFiZWwgb2YgYSBjaGlwIGZyb20gYSBnaXZlbiBmaWx0ZXJpbmcgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2hpcExhYmVsKGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uKTogYW55IHtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQucmVzb3VyY2VTdHJpbmdzW2BpZ3hfZ3JpZF9maWx0ZXJfJHtleHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lfWBdIHx8IGV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5zZWFyY2hWYWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGV4cHJlc3Npb24uZmllbGROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IGNvbHVtbi5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlcihleHByZXNzaW9uLnNlYXJjaFZhbCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBpcGVBcmdzID0gY29sdW1uLnBpcGVBcmdzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5kYXRlUGlwZS50cmFuc2Zvcm0oZXhwcmVzc2lvbi5zZWFyY2hWYWwsIHBpcGVBcmdzLmZvcm1hdCwgdW5kZWZpbmVkLCB0aGlzLmdyaWQubG9jYWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnNlYXJjaFZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgYSBmaWx0ZXJDZWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVGaWx0ZXJpbmdDZWxsKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlckNlbGwgPSBjb2x1bW4uZmlsdGVyQ2VsbDtcbiAgICAgICAgaWYgKGZpbHRlckNlbGwpIHtcbiAgICAgICAgICAgIGZpbHRlckNlbGwudXBkYXRlRmlsdGVyQ2VsbEFyZWEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmZpbHRlcmVkRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3QoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbixcbiAgICAgICAgb3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLFxuICAgICAgICBleHByZXNzaW9uc1VJczogRXhwcmVzc2lvblVJW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb25zTGlzdFJlY3Vyc2l2ZShleHByZXNzaW9ucywgb3BlcmF0b3IsIGV4cHJlc3Npb25zVUlzKTtcblxuICAgICAgICAvLyBUaGUgYmVmb3JlT3BlcmF0b3Igb2YgdGhlIGZpcnN0IGV4cHJlc3Npb24gYW5kIHRoZSBhZnRlck9wZXJhdG9yIG9mIHRoZSBsYXN0IGV4cHJlc3Npb24gc2hvdWxkIGJlIG51bGxcbiAgICAgICAgaWYgKGV4cHJlc3Npb25zVUlzLmxlbmd0aCkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNVSXNbZXhwcmVzc2lvbnNVSXMubGVuZ3RoIC0gMV0uYWZ0ZXJPcGVyYXRvciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVFbXB0eShleHByZXNzaW9uVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmVtcHR5KGV4cHJlc3Npb25UcmVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgIGlmICgoZXhwciBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByVHJlZSA9IGV4cHIgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIGlmIChleHByVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyAmJiBleHByVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyX2ludGVybmFsKGZpZWxkTmFtZTogc3RyaW5nLCB0ZXJtLCBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nVHJlZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICB0aGlzLmdyaWQuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG5cbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkRmlsdGVySW5kZXggPSBmaWx0ZXJpbmdUcmVlLmZpbmRJbmRleChmaWVsZE5hbWUpO1xuICAgICAgICBpZiAoZmllbGRGaWx0ZXJJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnNwbGljZShmaWVsZEZpbHRlckluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJlcGFyZV9maWx0ZXJpbmdfZXhwcmVzc2lvbihmaWx0ZXJpbmdUcmVlLCBmaWVsZE5hbWUsIHRlcm0sIGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlLCBpZ25vcmVDYXNlLCBmaWVsZEZpbHRlckluZGV4KTtcbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdUcmVlO1xuICAgIH1cblxuICAgIC8qKiBNb2RpZmllcyB0aGUgZmlsdGVyaW5nU3RhdGUgb2JqZWN0IHRvIGNvbnRhaW4gdGhlIG5ld2x5IGFkZGVkIGZpdGVyaW5nIGNvbmRpdGlvbnMvZXhwcmVzc2lvbnMuXG4gICAgICogSWYgY3JlYXRlTmV3VHJlZSBpcyB0cnVlLCBmaWx0ZXJpbmdTdGF0ZSB3aWxsIG5vdCBiZSBtb2RpZmllZCAoYmVjYXVzZSBpdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSksXG4gICAgICogYnV0IGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oXG4gICAgICAgIGZpbHRlcmluZ1N0YXRlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgICAgc2VhcmNoVmFsLFxuICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgIGluc2VydEF0SW5kZXggPSAtMSxcbiAgICAgICAgY3JlYXRlTmV3VHJlZSA9IGZhbHNlKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcblxuICAgICAgICBjb25zdCBvbGRFeHByZXNzaW9uc1RyZWVJbmRleCA9IGZpbHRlcmluZ1N0YXRlLmZpbmRJbmRleChmaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCBleHByZXNzaW9uc1RyZWUgPSBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/XG4gICAgICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIDogbnVsbDtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgP1xuICAgICAgICAgICAgbnVsbCA6IGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlIGFzIElGaWx0ZXJpbmdPcGVyYXRpb247XG4gICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uID0geyBmaWVsZE5hbWUsIHNlYXJjaFZhbCwgY29uZGl0aW9uLCBpZ25vcmVDYXNlIH07XG5cbiAgICAgICAgY29uc3QgbmV3RXhwcmVzc2lvbnNUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBjcmVhdGVOZXdUcmVlID9cbiAgICAgICAgICAgIG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZmlsdGVyaW5nU3RhdGUub3BlcmF0b3IsIGZpbHRlcmluZ1N0YXRlLmZpZWxkTmFtZSkgOiBmaWx0ZXJpbmdTdGF0ZSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG5cbiAgICAgICAgaWYgKG9sZEV4cHJlc3Npb25zVHJlZUluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgLy8gbm8gZXhwcmVzc2lvbnMgdHJlZSBmb3VuZCBmb3IgdGhpcyBmaWVsZFxuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRBdEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnNwbGljZShpbnNlcnRBdEluZGV4LCAwLCBleHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGV4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwcmVzc2lvbnMgdHJlZSBmb3IgdGhpcyBmaWVsZCBhbmQgYWRkIHRoZSBuZXcgZXhwcmVzc2lvbiB0byBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGZpbHRlcmluZ1N0YXRlLm9wZXJhdG9yLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgIG5ld0V4cHJUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2gobmV3RXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2gobmV3RXhwclRyZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld0V4cHJlc3Npb25zVHJlZTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgaXNGaWx0ZXJpbmdUcmVlQ29tcGxleChleHByZXNzaW9uczogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8IElGaWx0ZXJpbmdFeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHByZXNzaW9ucyBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlID0gZXhwcmVzc2lvbnMgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zVHJlZS5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuT3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmRPcGVyYXRvcnNDb3VudCA9IHRoaXMuZ2V0Q2hpbGRBbmRPcGVyYXRvcnNDb3VudChleHByZXNzaW9uc1RyZWUpO1xuXG4gICAgICAgICAgICAgICAgLy8gaGF2aW5nIG1vcmUgdGhhdCAnQW5kJyBhbmQgb3BlcmF0b3IgaW4gdGhlIHN1Yi10cmVlIG1lYW5zIHRoYXQgdGhlIGZpbHRlciBjb3VsZCBub3QgYmUgcmVwcmVzZW50ZWQgd2l0aG91dCBwYXJlbnRoZXNlcy5cbiAgICAgICAgICAgICAgICByZXR1cm4gYW5kT3BlcmF0b3JzQ291bnQgPiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaXNDb21wbGV4ID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wZXJhbmQgb2YgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICAgICAgaXNDb21wbGV4ID0gaXNDb21wbGV4IHx8IHRoaXMuaXNGaWx0ZXJpbmdUcmVlQ29tcGxleChvcGVyYW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGlzQ29tcGxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpOiBudW1iZXIge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgb3BlcmFuZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb3BlcmFuZCA9IGV4cHJlc3Npb25zW2ldO1xuICAgICAgICAgICAgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAob3BlcmFuZC5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIHRoaXMuZ2V0Q2hpbGRBbmRPcGVyYXRvcnNDb3VudChvcGVyYW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0UmVjdXJzaXZlKGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHwgSUZpbHRlcmluZ0V4cHJlc3Npb24sXG4gICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYyxcbiAgICAgICAgZXhwcmVzc2lvbnNVSXM6IEV4cHJlc3Npb25VSVtdKTogdm9pZCB7XG4gICAgICAgIGlmICghZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHByZXNzaW9ucyBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlID0gZXhwcmVzc2lvbnMgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcGVyYW5kIG9mIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3RSZWN1cnNpdmUob3BlcmFuZCwgZXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yLCBleHByZXNzaW9uc1VJcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbnNVSXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNVSXNbZXhwcmVzc2lvbnNVSXMubGVuZ3RoIC0gMV0uYWZ0ZXJPcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwclVJID0gbmV3IEV4cHJlc3Npb25VSSgpO1xuICAgICAgICAgICAgZXhwclVJLmV4cHJlc3Npb24gPSBleHByZXNzaW9ucyBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICAgICAgICAgIGV4cHJVSS5hZnRlck9wZXJhdG9yID0gb3BlcmF0b3I7XG5cbiAgICAgICAgICAgIGNvbnN0IHByZXZFeHByVUkgPSBleHByZXNzaW9uc1VJc1tleHByZXNzaW9uc1VJcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmIChwcmV2RXhwclVJKSB7XG4gICAgICAgICAgICAgICAgZXhwclVJLmJlZm9yZU9wZXJhdG9yID0gcHJldkV4cHJVSS5hZnRlck9wZXJhdG9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleHByZXNzaW9uc1VJcy5wdXNoKGV4cHJVSSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudDogYW55KSB7XG4gICAgICAgIGxldCBkeW5hbWljRmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxhbnk+O1xuICAgICAgICBjb25zdCBmYWN0b3J5UmVzb2x2ZXIgPSB0aGlzLl9tb2R1bGVSZWZcbiAgICAgICAgICAgID8gdGhpcy5fbW9kdWxlUmVmLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxuICAgICAgICAgICAgOiB0aGlzLl9mYWN0b3J5UmVzb2x2ZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkeW5hbWljRmFjdG9yeSA9IGZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5fbW9kdWxlUmVmXG4gICAgICAgICAgICA/IHRoaXMuX21vZHVsZVJlZi5pbmplY3RvclxuICAgICAgICAgICAgOiB0aGlzLl9pbmplY3RvcjtcbiAgICAgICAgY29uc3QgZHluYW1pY0NvbXBvbmVudDogQ29tcG9uZW50UmVmPGFueT4gPSBkeW5hbWljRmFjdG9yeS5jcmVhdGUoXG4gICAgICAgICAgICBpbmplY3RvclxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9hcHBSZWYuYXR0YWNoVmlldyhkeW5hbWljQ29tcG9uZW50Lmhvc3RWaWV3KTtcblxuICAgICAgICByZXR1cm4gZHluYW1pY0NvbXBvbmVudC5pbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
|
|
589
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUVWLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsY0FBYyxFQUNkLFFBQVEsRUFHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQTZCLE1BQU0sa0RBQWtELENBQUM7QUFFdkgsT0FBTyxFQUF3QixjQUFjLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbEQsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9FOztHQUVHO0FBQ0gsTUFB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QWEsQ0FBQzthQUNwRDtZQUVELGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBYztRQUMxQyxJQUFJLGNBQXFDLENBQUM7UUFDMUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVU7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCO1lBQzFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDNUIsSUFBSTtZQUNBLGNBQWMsR0FBRyxlQUFlLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkU7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDckIsTUFBTSxnQkFBZ0IsR0FBc0IsY0FBYyxDQUFDLE1BQU0sQ0FDN0QsUUFBUSxDQUNYLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRCxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUNyQyxDQUFDOzs7WUF0cEJKLFVBQVU7OztZQXhDUCxXQUFXO1lBdUJOLGNBQWM7WUFOZCxpQkFBaUI7WUFoQnRCLHdCQUF3QjtZQUN4QixjQUFjO1lBQ2QsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgSW5qZWN0YWJsZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgTmdNb2R1bGVSZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIEluamVjdG9yLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElneEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZ3JpZC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nRXhwcmVzc2lvbiwgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJRm9yT2ZTdGF0ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElGaWx0ZXJpbmdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBJQ29sdW1uUmVzaXplRXZlbnRBcmdzLCBJRmlsdGVyaW5nRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3MsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBmYWRlSW4gfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL21haW4nO1xuaW1wb3J0IHsgRXhjZWxTdHlsZVBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbC9hYnNvbHV0ZS1zY3JvbGwtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGVkaXRvciwgcGluTGVmdCwgdW5waW5MZWZ0IH0gZnJvbSAnQGlnbml0ZXVpL21hdGVyaWFsLWljb25zLWV4dGVuZGVkJztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uVUkge1xuICAgIHB1YmxpYyBleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICBwdWJsaWMgYmVmb3JlT3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljO1xuICAgIHB1YmxpYyBhZnRlck9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1Zpc2libGUgPSB0cnVlO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElneEZpbHRlcmluZ1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyBpc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgZmlsdGVyZWRDb2x1bW46IElneENvbHVtbkNvbXBvbmVudCA9IG51bGw7XG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb24gPSBudWxsO1xuICAgIHB1YmxpYyBjb2x1bW5Ub01vcmVJY29uSGlkZGVuID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgcHVibGljIGFjdGl2ZUZpbHRlckNlbGwgPSAwO1xuICAgIHB1YmxpYyBncmlkOiBJZ3hHcmlkQmFzZURpcmVjdGl2ZTtcblxuICAgIHByaXZhdGUgY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBhcmVFdmVudHNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBpc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgY29sdW1uVG9FeHByZXNzaW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBFeHByZXNzaW9uVUlbXT4oKTtcbiAgICBwcml2YXRlIGNvbHVtblN0YXJ0SW5kZXggPSAtMTtcbiAgICBwcml2YXRlIF9jb21wb25lbnRPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBjb21wb25lbnRJbnN0YW5jZTogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBjb2x1bW47XG4gICAgcHJpdmF0ZSBsYXN0QWN0aXZlTm9kZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9tb2R1bGVSZWY6IE5nTW9kdWxlUmVmPGFueT4sXG4gICAgICAgIHByaXZhdGUgaWNvblNlcnZpY2U6IElneEljb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9vdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2ZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwcml2YXRlIF9hcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVGaWx0ZXJEcm9wZG93bihlbGVtZW50OiBIVE1MRWxlbWVudCwgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgfHwgKHRoaXMuY29sdW1uICYmIHRoaXMuY29sdW1uLmZpZWxkICE9PSBjb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRGaWx0ZXJpbmdTZXR0aW5ncygpO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJY29uID0gdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID8gJ2lneC1leGNlbC1maWx0ZXJfX2ljb24tLWZpbHRlcmVkJyA6ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uJztcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckljb25UYXJnZXQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2ZpbHRlckljb259YCkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gZmlsdGVySWNvblRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gKHRoaXMuZ3JpZCBhcyBhbnkpLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UuaW5pdGlhbGl6ZSh0aGlzLmNvbHVtbiwgdGhpcy5fb3ZlcmxheVNlcnZpY2UpO1xuXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPSB0aGlzLl9vdmVybGF5U2VydmljZS5hdHRhY2godGhpcy5jb21wb25lbnRJbnN0YW5jZS5lbGVtZW50LCB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2Uub3ZlcmxheUNvbXBvbmVudElkID0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkO1xuXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdEZpbHRlcmluZ1NldHRpbmdzKCkge1xuICAgICAgICB0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogdXNlQW5pbWF0aW9uKGZhZGVJbiwgeyBwYXJhbXM6IHsgZHVyYXRpb246ICcyNTBtcycgfX0pLFxuICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgRXhjZWxTdHlsZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgob3ZlcmxheSkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBY3RpdmVOb2RlID0gdGhpcy5ncmlkLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKFxuICAgICAgICAgICAgZmlyc3QoKG92ZXJsYXkpID0+IG92ZXJsYXkuaWQgPT09IHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZS5jb2x1bW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgPSB0aGlzLmxhc3RBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC50aGVhZFJvdy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZUV4Y2VsRmlsdGVyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gZ3JpZCdzIGV2ZW50cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3Vic2NyaWJlVG9FdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5hcmVFdmVudHNTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFyZUV2ZW50c1N1YnNjcmliZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1uUmVzaXplZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChldmVudEFyZ3M6IElDb2x1bW5SZXNpemVFdmVudEFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0NlbGwoZXZlbnRBcmdzLmNvbHVtbik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5ncmlkLnBhcmVudFZpcnREaXIuY2h1bmtMb2FkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2ZW50QXJnczogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRBcmdzLnN0YXJ0SW5kZXggIT09IHRoaXMuY29sdW1uU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtblN0YXJ0SW5kZXggPSBldmVudEFyZ3Muc3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckNlbGwudXBkYXRlRmlsdGVyQ2VsbEFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5Nb3ZpbmdFbmQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2VsbC51cGRhdGVGaWx0ZXJDZWxsQXJlYSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSBmaWx0ZXJpbmcgcm93IGlmIGEgY29sdW1uIGlzIGhpZGRlbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZUZpbHRlcmluZ1Jvd09uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2w6IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdSb3cgPSB0aGlzLmdyaWQuZmlsdGVyaW5nUm93O1xuXG4gICAgICAgIGlmIChmaWx0ZXJpbmdSb3cgJiYgZmlsdGVyaW5nUm93LmNvbHVtbiAmJiBmaWx0ZXJpbmdSb3cuY29sdW1uID09PSBjb2wpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGNyZWF0ZSBleHByZXNzaW9uc1RyZWUgYW5kIGZpbHRlciBncmlkIHVzZWQgaW4gYm90aCBmaWx0ZXIgbW9kZXMuXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlckludGVybmFsKGZpZWxkOiBzdHJpbmcsIGV4cHJlc3Npb25zOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBBcnJheTxFeHByZXNzaW9uVUk+ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gdHJ1ZTtcblxuICAgICAgICBsZXQgZXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlID0gdGhpcy5jcmVhdGVTaW1wbGVGaWx0ZXJpbmdUcmVlKGZpZWxkLCBleHByZXNzaW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckZpbHRlcihmaWVsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcihmaWVsZCwgbnVsbCwgZXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGZpbHRlcmluZyBvbiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuXG4gICAgICAgIGNvbnN0IGNvbCA9IGdyaWQuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nSWdub3JlQ2FzZSA9IGlnbm9yZUNhc2UgfHwgKGNvbCA/IGNvbC5maWx0ZXJpbmdJZ25vcmVDYXNlIDogZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgY29sdW1uRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gZmlsdGVyaW5nVHJlZS5maW5kKGZpZWxkKSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlID0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSA/PyBjb2x1bW5GaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGNvbnN0IGZpZWxkRmlsdGVySW5kZXggPSBmaWx0ZXJpbmdUcmVlLmZpbmRJbmRleChmaWVsZCk7XG5cbiAgICAgICAgY29uc3QgbmV3RmlsdGVyaW5nVHJlZTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID1cbiAgICAgICAgICAgIHRoaXMucHJlcGFyZV9maWx0ZXJpbmdfZXhwcmVzc2lvbihmaWx0ZXJpbmdUcmVlLCBmaWVsZCwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsXG4gICAgICAgICAgICBmaWx0ZXJpbmdJZ25vcmVDYXNlLCBmaWVsZEZpbHRlckluZGV4LCB0cnVlKTtcblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7IG93bmVyOiBncmlkLFxuICAgICAgICAgICAgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IG5ld0ZpbHRlcmluZ1RyZWUuZmluZChmaWVsZCkgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJfaW50ZXJuYWwoZmllbGQsIHZhbHVlLCBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlLCBmaWx0ZXJpbmdJZ25vcmVDYXNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiA9IHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmluZChmaWVsZCk7XG4gICAgICAgICAgICBpZiAoIWV4cHJlc3Npb25zVHJlZUZvckNvbHVtbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25kaXRpb24gb3IgRXhwcmVzc2lvbiBUcmVlIScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uc1RyZWVGb3JDb2x1bW4gaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcl9pbnRlcm5hbChmaWVsZCwgdmFsdWUsIGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiwgZmlsdGVyaW5nSWdub3JlQ2FzZSApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uRm9yQ29sdW1uID0gZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2ludGVybmFsKGZpZWxkLCB2YWx1ZSwgZXhwcmVzc2lvbkZvckNvbHVtbi5jb25kaXRpb24sIGZpbHRlcmluZ0lnbm9yZUNhc2UgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb25lRXZlbnRBcmdzID0gdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maW5kKGZpZWxkKSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5ncmlkLmZpbHRlcmluZ0RvbmUuZW1pdChkb25lRXZlbnRBcmdzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbHRlcl9nbG9iYWwodGVybSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdUcmVlID0gZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGdyaWQuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIGlmIChncmlkLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgZ3JpZC5wYWdpbmF0b3IucGFnZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmaWx0ZXJpbmdUcmVlLmZpbHRlcmluZ09wZXJhbmRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGdyaWQuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGNvbHVtbi5maWVsZCwgdGVybSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb24sIGlnbm9yZUNhc2UgfHwgY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZmlsdGVyIG9mIGEgZ2l2ZW4gY29sdW1uIGlmIG5hbWUgaXMgcHJvdmlkZWQuIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcnMgb2YgYWxsIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW1wdHlGaWx0ZXIgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKG51bGwsIGZpZWxkKTtcbiAgICAgICAgY29uc3Qgb25GaWx0ZXJpbmdFdmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcy5ncmlkLFxuICAgICAgICAgICAgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IGVtcHR5RmlsdGVyLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSB9O1xuXG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmcuZW1pdChvbkZpbHRlcmluZ0V2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKG9uRmlsdGVyaW5nRXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xlYXJfZmlsdGVyKGZpZWxkKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZ3JpZC5maWx0ZXJpbmdEb25lLmVtaXQoZW1wdHlGaWx0ZXIpKTtcblxuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5nZXRFeHByZXNzaW9ucyhmaWVsZCk7XG4gICAgICAgICAgICBleHByZXNzaW9ucy5sZW5ndGggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IHRoaXMuZ2V0RXhwcmVzc2lvbnMoYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcl9maWx0ZXIoZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nU3RhdGUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXJpbmdTdGF0ZS5maW5kSW5kZXgoZmllbGROYW1lKTtcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgZmlsdGVyaW5nU3RhdGUuZmlsdGVyaW5nT3BlcmFuZHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIGlmICghZmllbGROYW1lKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGFsbCB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgaW4gdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCB3aXRoIHRoZSBzYW1lIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyR2xvYmFsKHZhbHVlOiBhbnksIGNvbmRpdGlvbiwgaWdub3JlQ2FzZT8pIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgbmV3RmlsdGVyaW5nVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZmlsdGVyaW5nVHJlZS5vcGVyYXRvciwgZmlsdGVyaW5nVHJlZS5maWVsZE5hbWUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGdyaWQuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKG5ld0ZpbHRlcmluZ1RyZWUsIGNvbHVtbi5maWVsZCwgdmFsdWUsIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBpZ25vcmVDYXNlIHx8IGNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHsgb3duZXI6IGdyaWQsIGZpbHRlcmluZ0V4cHJlc3Npb25zOiBuZXdGaWx0ZXJpbmdUcmVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIGdyaWQuZmlsdGVyaW5nLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG5ld0ZpbHRlcmluZ1RyZWU7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIGZpbHRlcmVkIGRhdGEgdGhyb3VnaCB0aGUgcGlwZXMgYW5kIHRoZW4gZW1pdCB0aGUgZXZlbnQuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmdyaWQuZmlsdGVyaW5nRG9uZS5lbWl0KHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBmaWx0ZXJpbmcgU1ZHIGljb25zIGluIHRoZSBpY29uIHNlcnZpY2UuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyU1ZHSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVkaXRvckljb25zID0gZWRpdG9yIGFzIGFueVtdO1xuICAgICAgICBlZGl0b3JJY29ucy5mb3JFYWNoKGljb24gPT4gdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQoaWNvbi5uYW1lLCBpY29uLnZhbHVlLCAnaW14LWljb25zJykpO1xuICAgICAgICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChwaW5MZWZ0Lm5hbWUsIHBpbkxlZnQudmFsdWUsICdpbXgtaWNvbnMnKTtcbiAgICAgICAgdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQodW5waW5MZWZ0Lm5hbWUsIHVucGluTGVmdC52YWx1ZSwgJ2lteC1pY29ucycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEV4cHJlc3Npb25VSSBhcnJheSBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cHJlc3Npb25zKGNvbHVtbklkOiBzdHJpbmcpOiBFeHByZXNzaW9uVUlbXSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmhhcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBjb2x1bW5JZCk7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uVUlzID0gbmV3IEFycmF5PEV4cHJlc3Npb25VST4oKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IsIGV4cHJlc3Npb25VSXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uVG9FeHByZXNzaW9uc01hcC5zZXQoY29sdW1uSWQsIGV4cHJlc3Npb25VSXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25VSXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmdldChjb2x1bW5JZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjcmVhdGVzIGFsbCBFeHByZXNzaW9uVUlzIGZvciBhbGwgY29sdW1ucy4gRXhlY3V0ZWQgYWZ0ZXIgZmlsdGVyaW5nIHRvIHJlZnJlc2ggdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoRXhwcmVzc2lvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpbHRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zV2l0aENvbXBsZXhGaWx0ZXIuY2xlYXIoKTtcblxuICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmZvckVhY2goKHZhbHVlOiBFeHByZXNzaW9uVUlbXSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0ga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb25zTGlzdChjb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDb21wbGV4ID0gdGhpcy5pc0ZpbHRlcmluZ1RyZWVDb21wbGV4KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQ2VsbChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uVG9FeHByZXNzaW9uc01hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBFeHByZXNzaW9uVUkgZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVFeHByZXNzaW9uKGNvbHVtbklkOiBzdHJpbmcsIGluZGV4VG9SZW1vdmU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uc0xpc3QgPSB0aGlzLmdldEV4cHJlc3Npb25zKGNvbHVtbklkKTtcblxuICAgICAgICBpZiAoaW5kZXhUb1JlbW92ZSA9PT0gMCAmJiBleHByZXNzaW9uc0xpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0WzFdLmJlZm9yZU9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleFRvUmVtb3ZlID09PSBleHByZXNzaW9uc0xpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgLSAxXS5hZnRlck9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zTGlzdFtpbmRleFRvUmVtb3ZlIC0gMV0uYWZ0ZXJPcGVyYXRvciA9IGV4cHJlc3Npb25zTGlzdFtpbmRleFRvUmVtb3ZlICsgMV0uYmVmb3JlT3BlcmF0b3I7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbMF0uYmVmb3JlT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2V4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxXS5hZnRlck9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25zTGlzdC5zcGxpY2UoaW5kZXhUb1JlbW92ZSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgZmlsdGVyaW5nIHRyZWUgZm9yIGEgZ2l2ZW4gY29sdW1uIGZyb20gZXhpc3RpbmcgRXhwcmVzc2lvblVJcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU2ltcGxlRmlsdGVyaW5nVHJlZShjb2x1bW5JZDogc3RyaW5nLCBleHByZXNzaW9uVUlMaXN0ID0gbnVsbCk6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zTGlzdCA9IGV4cHJlc3Npb25VSUxpc3QgPyBleHByZXNzaW9uVUlMaXN0IDogdGhpcy5nZXRFeHByZXNzaW9ucyhjb2x1bW5JZCk7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuT3IsIGNvbHVtbklkKTtcbiAgICAgICAgbGV0IGN1cnJBbmRCcmFuY2g6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGN1cnJFeHByZXNzaW9uVUkgb2YgZXhwcmVzc2lvbnNMaXN0KSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSAmJiBjdXJyRXhwcmVzc2lvblVJLmV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJFeHByZXNzaW9uVUkuYWZ0ZXJPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kICYmICFjdXJyQW5kQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJBbmRCcmFuY2ggPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLkFuZCwgY29sdW1uSWQpO1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChjdXJyQW5kQnJhbmNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gdW5kZWZpbmVkIHx8IGN1cnJFeHByZXNzaW9uVUkuYmVmb3JlT3BlcmF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICBjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PcikgJiZcbiAgICAgICAgICAgICAgICBjdXJyRXhwcmVzc2lvblVJLmFmdGVyT3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuXG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCBjb2x1bW5JZCk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckFuZEJyYW5jaCk7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaC5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kKSB7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaC5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciBhIGNvbXBsZXggZmlsdGVyIGlzIGFwcGxpZWQgdG8gYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIGlzRmlsdGVyQ29tcGxleChjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5oYXMoY29sdW1uSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBjb2x1bW5JZCk7XG4gICAgICAgIGNvbnN0IGlzQ29tcGxleCA9IGNvbHVtbiAmJiB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgIGlmIChpc0NvbXBsZXgpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmFkZChjb2x1bW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNDb21wbGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmlsdGVyaW5nTG9naWMgb3BlcmF0b3IuXG4gICAgICovXG4gICAgcHVibGljIGdldE9wZXJhdG9yQXNTdHJpbmcob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljKTogYW55IHtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3JfYW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX29wZXJhdG9yX29yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGxhYmVsIG9mIGEgY2hpcCBmcm9tIGEgZ2l2ZW4gZmlsdGVyaW5nIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgcHVibGljIGdldENoaXBMYWJlbChleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGFueSB7XG4gICAgICAgIGlmIChleHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5nc1tgaWd4X2dyaWRfZmlsdGVyXyR7ZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZX1gXSB8fCBleHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24uc2VhcmNoVmFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZShleHByZXNzaW9uLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBjb2x1bW4uZm9ybWF0dGVyO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXIoZXhwcmVzc2lvbi5zZWFyY2hWYWwsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwaXBlQXJncyA9IGNvbHVtbi5waXBlQXJncztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQuZGF0ZVBpcGUudHJhbnNmb3JtKGV4cHJlc3Npb24uc2VhcmNoVmFsLCBwaXBlQXJncy5mb3JtYXQsIHVuZGVmaW5lZCwgdGhpcy5ncmlkLmxvY2FsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5zZWFyY2hWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIGEgZmlsdGVyQ2VsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlRmlsdGVyaW5nQ2VsbChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBmaWx0ZXJDZWxsID0gY29sdW1uLmZpbHRlckNlbGw7XG4gICAgICAgIGlmIChmaWx0ZXJDZWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJDZWxsLnVwZGF0ZUZpbHRlckNlbGxBcmVhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5maWx0ZXJlZERhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHwgSUZpbHRlcmluZ0V4cHJlc3Npb24sXG4gICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYyxcbiAgICAgICAgZXhwcmVzc2lvbnNVSXM6IEV4cHJlc3Npb25VSVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3RSZWN1cnNpdmUoZXhwcmVzc2lvbnMsIG9wZXJhdG9yLCBleHByZXNzaW9uc1VJcyk7XG5cbiAgICAgICAgLy8gVGhlIGJlZm9yZU9wZXJhdG9yIG9mIHRoZSBmaXJzdCBleHByZXNzaW9uIGFuZCB0aGUgYWZ0ZXJPcGVyYXRvciBvZiB0aGUgbGFzdCBleHByZXNzaW9uIHNob3VsZCBiZSBudWxsXG4gICAgICAgIGlmIChleHByZXNzaW9uc1VJcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVUlzW2V4cHJlc3Npb25zVUlzLmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkoZXhwcmVzc2lvblRyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5lbXB0eShleHByZXNzaW9uVHJlZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICBpZiAoKGV4cHIgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwclRyZWUgPSBleHByIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMgJiYgZXhwclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlcl9pbnRlcm5hbChmaWVsZE5hbWU6IHN0cmluZywgdGVybSwgY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdPcGVyYXRpb24gfCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIGlmIChncmlkLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgZ3JpZC5wYWdpbmF0b3IucGFnZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZEZpbHRlckluZGV4ID0gZmlsdGVyaW5nVHJlZS5maW5kSW5kZXgoZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkRmlsdGVySW5kZXggPiAtMSkge1xuICAgICAgICAgICAgZmlsdGVyaW5nVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5zcGxpY2UoZmllbGRGaWx0ZXJJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGZpZWxkTmFtZSwgdGVybSwgY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUsIGlnbm9yZUNhc2UsIGZpZWxkRmlsdGVySW5kZXgpO1xuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1RyZWU7XG4gICAgfVxuXG4gICAgLyoqIE1vZGlmaWVzIHRoZSBmaWx0ZXJpbmdTdGF0ZSBvYmplY3QgdG8gY29udGFpbiB0aGUgbmV3bHkgYWRkZWQgZmlsdGVyaW5nIGNvbmRpdGlvbnMvZXhwcmVzc2lvbnMuXG4gICAgICogSWYgY3JlYXRlTmV3VHJlZSBpcyB0cnVlLCBmaWx0ZXJpbmdTdGF0ZSB3aWxsIG5vdCBiZSBtb2RpZmllZCAoYmVjYXVzZSBpdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSksXG4gICAgICogYnV0IGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oXG4gICAgICAgIGZpbHRlcmluZ1N0YXRlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgICAgc2VhcmNoVmFsLFxuICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgIGluc2VydEF0SW5kZXggPSAtMSxcbiAgICAgICAgY3JlYXRlTmV3VHJlZSA9IGZhbHNlKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcblxuICAgICAgICBjb25zdCBleHByZXNzaW9uc1RyZWUgPSBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/XG4gICAgICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIDogbnVsbDtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgP1xuICAgICAgICAgICAgbnVsbCA6IGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlIGFzIElGaWx0ZXJpbmdPcGVyYXRpb247XG4gICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uID0geyBmaWVsZE5hbWUsIHNlYXJjaFZhbCwgY29uZGl0aW9uLCBpZ25vcmVDYXNlIH07XG5cbiAgICAgICAgY29uc3QgbmV3RXhwcmVzc2lvbnNUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBjcmVhdGVOZXdUcmVlID9cbiAgICAgICAgICAgIG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZmlsdGVyaW5nU3RhdGUub3BlcmF0b3IsIGZpbHRlcmluZ1N0YXRlLmZpZWxkTmFtZSkgOiBmaWx0ZXJpbmdTdGF0ZSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG5cbiAgICAgICAgLy8gbm8gZXhwcmVzc2lvbnMgdHJlZSBmb3VuZCBmb3IgdGhpcyBmaWVsZFxuICAgICAgICBpZiAoZXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QXRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzW2luc2VydEF0SW5kZXhdID0gZXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChleHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGV4cHJlc3Npb25zIHRyZWUgZm9yIHRoaXMgZmllbGQgYW5kIGFkZCB0aGUgbmV3IGV4cHJlc3Npb24gdG8gaXRcbiAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGZpbHRlcmluZ1N0YXRlLm9wZXJhdG9yLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgbmV3RXhwclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChuZXdFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKG5ld0V4cHJUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uc1RyZWUub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5kT3BlcmF0b3JzQ291bnQgPSB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQoZXhwcmVzc2lvbnNUcmVlKTtcblxuICAgICAgICAgICAgICAgIC8vIGhhdmluZyBtb3JlIHRoYW4gb25lICdBbmQnIG9wZXJhdG9yIGluIHRoZSBzdWItdHJlZSBtZWFucyB0aGF0IHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgcGFyZW50aGVzZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZE9wZXJhdG9yc0NvdW50ID4gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGlzQ29tcGxleCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcGVyYW5kIG9mIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgIGlzQ29tcGxleCA9IGlzQ29tcGxleCB8fCB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGlsZEFuZE9wZXJhdG9yc0NvdW50KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IG9wZXJhbmQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9wZXJhbmQgPSBleHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmQub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUV4cHJlc3Npb25zTGlzdFJlY3Vyc2l2ZShleHByZXNzaW9uczogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8IElGaWx0ZXJpbmdFeHByZXNzaW9uLFxuICAgICAgICBvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMsXG4gICAgICAgIGV4cHJlc3Npb25zVUlzOiBFeHByZXNzaW9uVUlbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0UmVjdXJzaXZlKG9wZXJhbmQsIGV4cHJlc3Npb25zVHJlZS5vcGVyYXRvciwgZXhwcmVzc2lvbnNVSXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zVUlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVUlzW2V4cHJlc3Npb25zVUlzLmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJVSSA9IG5ldyBFeHByZXNzaW9uVUkoKTtcbiAgICAgICAgICAgIGV4cHJVSS5leHByZXNzaW9uID0gZXhwcmVzc2lvbnMgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICBleHByVUkuYWZ0ZXJPcGVyYXRvciA9IG9wZXJhdG9yO1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2RXhwclVJID0gZXhwcmVzc2lvbnNVSXNbZXhwcmVzc2lvbnNVSXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAocHJldkV4cHJVSSkge1xuICAgICAgICAgICAgICAgIGV4cHJVSS5iZWZvcmVPcGVyYXRvciA9IHByZXZFeHByVUkuYWZ0ZXJPcGVyYXRvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwcmVzc2lvbnNVSXMucHVzaChleHByVUkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQ6IGFueSkge1xuICAgICAgICBsZXQgZHluYW1pY0ZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcbiAgICAgICAgY29uc3QgZmFjdG9yeVJlc29sdmVyID0gdGhpcy5fbW9kdWxlUmVmXG4gICAgICAgICAgICA/IHRoaXMuX21vZHVsZVJlZi5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgICAgICAgICAgIDogdGhpcy5fZmFjdG9yeVJlc29sdmVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZHluYW1pY0ZhY3RvcnkgPSBmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmplY3RvciA9IHRoaXMuX21vZHVsZVJlZlxuICAgICAgICAgICAgPyB0aGlzLl9tb2R1bGVSZWYuaW5qZWN0b3JcbiAgICAgICAgICAgIDogdGhpcy5faW5qZWN0b3I7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQ6IENvbXBvbmVudFJlZjxhbnk+ID0gZHluYW1pY0ZhY3RvcnkuY3JlYXRlKFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fYXBwUmVmLmF0dGFjaFZpZXcoZHluYW1pY0NvbXBvbmVudC5ob3N0Vmlldyk7XG5cbiAgICAgICAgcmV0dXJuIGR5bmFtaWNDb21wb25lbnQuaW5zdGFuY2U7XG4gICAgfVxufVxuIl19
|
|
@@ -39446,7 +39446,7 @@ class IgxGridExcelStyleFilteringComponent {
|
|
|
39446
39446
|
if (operand instanceof FilteringExpressionsTree) {
|
|
39447
39447
|
const columnExprTree = operand;
|
|
39448
39448
|
if (columnExprTree.fieldName === this.column.field) {
|
|
39449
|
-
|
|
39449
|
+
continue;
|
|
39450
39450
|
}
|
|
39451
39451
|
}
|
|
39452
39452
|
expressionsTree.filteringOperands.push(operand);
|
|
@@ -39857,12 +39857,9 @@ class IgxFilteringService {
|
|
|
39857
39857
|
const col = grid.getColumnByName(field);
|
|
39858
39858
|
const filteringIgnoreCase = ignoreCase || (col ? col.filteringIgnoreCase : false);
|
|
39859
39859
|
const filteringTree = grid.filteringExpressionsTree;
|
|
39860
|
-
const columnFilteringExpressionsTree =
|
|
39860
|
+
const columnFilteringExpressionsTree = filteringTree.find(field);
|
|
39861
39861
|
conditionOrExpressionTree = conditionOrExpressionTree !== null && conditionOrExpressionTree !== void 0 ? conditionOrExpressionTree : columnFilteringExpressionsTree;
|
|
39862
39862
|
const fieldFilterIndex = filteringTree.findIndex(field);
|
|
39863
|
-
if (fieldFilterIndex > -1) {
|
|
39864
|
-
filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
|
|
39865
|
-
}
|
|
39866
39863
|
const newFilteringTree = this.prepare_filtering_expression(filteringTree, field, value, conditionOrExpressionTree, filteringIgnoreCase, fieldFilterIndex, true);
|
|
39867
39864
|
const eventArgs = { owner: grid,
|
|
39868
39865
|
filteringExpressions: newFilteringTree.find(field), cancel: false };
|
|
@@ -40173,12 +40170,11 @@ class IgxFilteringService {
|
|
|
40173
40170
|
this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
|
|
40174
40171
|
grid.filteringExpressionsTree = filteringTree;
|
|
40175
40172
|
}
|
|
40176
|
-
/** Modifies the filteringState object to contain the newly added
|
|
40173
|
+
/** Modifies the filteringState object to contain the newly added filtering conditions/expressions.
|
|
40177
40174
|
* If createNewTree is true, filteringState will not be modified (because it directly affects the grid.filteringExpressionsTree),
|
|
40178
40175
|
* but a new object is created and returned.
|
|
40179
40176
|
*/
|
|
40180
40177
|
prepare_filtering_expression(filteringState, fieldName, searchVal, conditionOrExpressionsTree, ignoreCase, insertAtIndex = -1, createNewTree = false) {
|
|
40181
|
-
const oldExpressionsTreeIndex = filteringState.findIndex(fieldName);
|
|
40182
40178
|
const expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
|
|
40183
40179
|
conditionOrExpressionsTree : null;
|
|
40184
40180
|
const condition = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
|
|
@@ -40186,23 +40182,21 @@ class IgxFilteringService {
|
|
|
40186
40182
|
const newExpression = { fieldName, searchVal, condition, ignoreCase };
|
|
40187
40183
|
const newExpressionsTree = createNewTree ?
|
|
40188
40184
|
new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName) : filteringState;
|
|
40189
|
-
|
|
40190
|
-
|
|
40191
|
-
if (
|
|
40192
|
-
|
|
40193
|
-
newExpressionsTree.filteringOperands.splice(insertAtIndex, 0, expressionsTree);
|
|
40194
|
-
}
|
|
40195
|
-
else {
|
|
40196
|
-
newExpressionsTree.filteringOperands.push(expressionsTree);
|
|
40197
|
-
}
|
|
40185
|
+
// no expressions tree found for this field
|
|
40186
|
+
if (expressionsTree) {
|
|
40187
|
+
if (insertAtIndex > -1) {
|
|
40188
|
+
newExpressionsTree.filteringOperands[insertAtIndex] = expressionsTree;
|
|
40198
40189
|
}
|
|
40199
|
-
else
|
|
40200
|
-
|
|
40201
|
-
const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
|
|
40202
|
-
newExprTree.filteringOperands.push(newExpression);
|
|
40203
|
-
newExpressionsTree.filteringOperands.push(newExprTree);
|
|
40190
|
+
else {
|
|
40191
|
+
newExpressionsTree.filteringOperands.push(expressionsTree);
|
|
40204
40192
|
}
|
|
40205
40193
|
}
|
|
40194
|
+
else if (condition) {
|
|
40195
|
+
// create expressions tree for this field and add the new expression to it
|
|
40196
|
+
const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
|
|
40197
|
+
newExprTree.filteringOperands.push(newExpression);
|
|
40198
|
+
newExpressionsTree.filteringOperands.push(newExprTree);
|
|
40199
|
+
}
|
|
40206
40200
|
return newExpressionsTree;
|
|
40207
40201
|
}
|
|
40208
40202
|
isFilteringTreeComplex(expressions) {
|
|
@@ -40213,7 +40207,7 @@ class IgxFilteringService {
|
|
|
40213
40207
|
const expressionsTree = expressions;
|
|
40214
40208
|
if (expressionsTree.operator === FilteringLogic.Or) {
|
|
40215
40209
|
const andOperatorsCount = this.getChildAndOperatorsCount(expressionsTree);
|
|
40216
|
-
// having more
|
|
40210
|
+
// having more than one 'And' operator in the sub-tree means that the filter could not be represented without parentheses.
|
|
40217
40211
|
return andOperatorsCount > 1;
|
|
40218
40212
|
}
|
|
40219
40213
|
let isComplex = false;
|
|
@@ -43009,9 +43003,7 @@ class IgxExcelStyleSearchComponent {
|
|
|
43009
43003
|
if (!this.searchValue) {
|
|
43010
43004
|
const anyFiltered = this.esf.listData.some(i => i.isFiltered);
|
|
43011
43005
|
const anyUnfiltered = this.esf.listData.some(i => !i.isFiltered);
|
|
43012
|
-
|
|
43013
|
-
searchAllBtn.indeterminate = true;
|
|
43014
|
-
}
|
|
43006
|
+
searchAllBtn.indeterminate = anyFiltered && anyUnfiltered;
|
|
43015
43007
|
this.esf.listData.forEach(i => i.isSelected = i.isFiltered);
|
|
43016
43008
|
this.displayedListData = this.esf.listData;
|
|
43017
43009
|
searchAllBtn.label = this.esf.grid.resourceStrings.igx_grid_excel_select_all;
|