igniteui-angular 13.1.1 → 13.1.2

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.
@@ -432,9 +432,6 @@ export class IgxFilteringService {
432
432
  grid.paginator.page = 0;
433
433
  }
434
434
  const fieldFilterIndex = filteringTree.findIndex(fieldName);
435
- if (fieldFilterIndex > -1) {
436
- filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
437
- }
438
435
  this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
439
436
  grid.filteringExpressionsTree = filteringTree;
440
437
  }
@@ -443,14 +440,20 @@ export class IgxFilteringService {
443
440
  * but a new object is created and returned.
444
441
  */
445
442
  prepare_filtering_expression(filteringState, fieldName, searchVal, conditionOrExpressionsTree, ignoreCase, insertAtIndex = -1, createNewTree = false) {
446
- const expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
443
+ let expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
447
444
  conditionOrExpressionsTree : null;
448
445
  const condition = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
449
446
  null : conditionOrExpressionsTree;
450
- const newExpression = { fieldName, searchVal, condition, ignoreCase };
451
- const newExpressionsTree = createNewTree ?
452
- new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName) : filteringState;
453
- // no expressions tree found for this field
447
+ let newExpressionsTree = filteringState;
448
+ if (createNewTree) {
449
+ newExpressionsTree = new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName);
450
+ newExpressionsTree.filteringOperands = [...filteringState.filteringOperands];
451
+ }
452
+ if (condition) {
453
+ const newExpression = { fieldName, searchVal, condition, ignoreCase };
454
+ expressionsTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
455
+ expressionsTree.filteringOperands.push(newExpression);
456
+ }
454
457
  if (expressionsTree) {
455
458
  if (insertAtIndex > -1) {
456
459
  newExpressionsTree.filteringOperands[insertAtIndex] = expressionsTree;
@@ -459,12 +462,6 @@ export class IgxFilteringService {
459
462
  newExpressionsTree.filteringOperands.push(expressionsTree);
460
463
  }
461
464
  }
462
- else if (condition) {
463
- // create expressions tree for this field and add the new expression to it
464
- const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
465
- newExprTree.filteringOperands.push(newExpression);
466
- newExpressionsTree.filteringOperands.push(newExprTree);
467
- }
468
465
  return newExpressionsTree;
469
466
  }
470
467
  isFilteringTreeComplex(expressions) {
@@ -506,4 +503,4 @@ IgxFilteringService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0",
506
503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IgxFilteringService, decorators: [{
507
504
  type: Injectable
508
505
  }], ctorParameters: function () { return [{ type: i1.IgxIconService }, { type: i2.IgxOverlayService }]; } });
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSxrREFBa0QsQ0FBQztBQUN2SCxPQUFPLEVBQXdCLGNBQWMsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzVHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlsRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUVoRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRSxPQUFPLEVBQWdCLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7O0FBRXpGOztHQUVHO0FBRUgsTUFBTSxPQUFPLG1CQUFtQjtJQTJCNUIsWUFDWSxXQUEyQixFQUN6QixlQUFrQztRQURwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDekIsb0JBQWUs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Q0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFMUUsMEhBQTBIO2dCQUMxSCxPQUFPLGlCQUFpQixHQUFHLENBQUMsQ0FBQzthQUNoQztZQUVELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN0QixLQUFLLE1BQU0sT0FBTyxJQUFJLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDckQsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDakU7WUFFRCxPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxXQUFzQztRQUNwRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLE9BQU8sQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNELE9BQU8sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxPQUFPLFlBQVksd0JBQXdCLEVBQUU7Z0JBQzdDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxjQUFjLENBQUMsR0FBRyxFQUFFO29CQUN6QyxLQUFLLEVBQUUsQ0FBQztpQkFDWDtnQkFFRCxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzRDtTQUNKO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7Z0hBbmtCUSxtQkFBbUI7b0hBQW5CLG1CQUFtQjsyRkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBJbmplY3RhYmxlLFxuICAgIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ0V4cHJlc3Npb24sIEZpbHRlcmluZ0xvZ2ljIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSUZvck9mU3RhdGUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBJQ29sdW1uUmVzaXplRXZlbnRBcmdzLCBJRmlsdGVyaW5nRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBmYWRlSW4gfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL21haW4nO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvc2Nyb2xsL2Fic29sdXRlLXNjcm9sbC1zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGVkaXRvciwgcGluTGVmdCwgdW5waW5MZWZ0IH0gZnJvbSAnQGlnbml0ZXVpL21hdGVyaWFsLWljb25zLWV4dGVuZGVkJztcbmltcG9ydCB7IEV4cHJlc3Npb25VSSwgZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3QgfSBmcm9tICcuL2V4Y2VsLXN0eWxlL2NvbW1vbic7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBFeGNlbFN0eWxlUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtcG9zaXRpb24tc3RyYXRlZ3knO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElneEZpbHRlcmluZ1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyBpc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgZmlsdGVyZWRDb2x1bW46IENvbHVtblR5cGUgPSBudWxsO1xuICAgIHB1YmxpYyBzZWxlY3RlZEV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uID0gbnVsbDtcbiAgICBwdWJsaWMgY29sdW1uVG9Nb3JlSWNvbkhpZGRlbiA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIHB1YmxpYyBhY3RpdmVGaWx0ZXJDZWxsID0gMDtcbiAgICBwdWJsaWMgZ3JpZDogR3JpZFR5cGU7XG5cbiAgICBwcml2YXRlIGNvbHVtbnNXaXRoQ29tcGxleEZpbHRlciA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgYXJlRXZlbnRzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBpc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgY29sdW1uVG9FeHByZXNzaW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBFeHByZXNzaW9uVUlbXT4oKTtcbiAgICBwcml2YXRlIGNvbHVtblN0YXJ0SW5kZXggPSAtMTtcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbkVzY2FwZTogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgRXhjZWxTdHlsZVBvc2l0aW9uU3RyYXRlZ3koe1xuICAgICAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgICAgICBvcGVuQW5pbWF0aW9uOiB1c2VBbmltYXRpb24oZmFkZUluLCB7IHBhcmFtczogeyBkdXJhdGlvbjogJzI1MG1zJyB9fSksXG4gICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogbnVsbFxuICAgICAgICB9KSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICB9O1xuICAgIHByb3RlY3RlZCBsYXN0QWN0aXZlTm9kZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGljb25TZXJ2aWNlOiBJZ3hJY29uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9vdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUZpbHRlckRyb3Bkb3duKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2x1bW46IENvbHVtblR5cGUpIHtcblxuICAgICAgICBjb25zdCBmaWx0ZXJJY29uID0gY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uLS1maWx0ZXJlZCcgOiAnaWd4LWV4Y2VsLWZpbHRlcl9faWNvbic7XG4gICAgICAgIGNvbnN0IGZpbHRlckljb25UYXJnZXQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2ZpbHRlckljb259YCkgYXMgSFRNTEVsZW1lbnQgfHwgZWxlbWVudDtcblxuICAgICAgICBjb25zdCB7IGlkLCByZWYgfSA9IHRoaXMuZ3JpZC5jcmVhdGVGaWx0ZXJEcm9wZG93bihjb2x1bW4sIHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MsXG4gICAgICAgICAgICAuLi57IHRhcmdldDogZmlsdGVySWNvblRhcmdldCB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9wZW5pbmdcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpcnN0KG92ZXJsYXkgPT4gb3ZlcmxheS5pZCA9PT0gaWQpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmxhc3RBY3RpdmVOb2RlID0gdGhpcy5ncmlkLm5hdmlnYXRpb24uYWN0aXZlTm9kZSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuY2xvc2VkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaXJzdChvdmVybGF5ID0+IG92ZXJsYXkuaWQgPT09IGlkKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmRldGFjaChpZCk7XG4gICAgICAgICAgICAgICAgcmVmPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24uYWN0aXZlTm9kZSA9IHRoaXMubGFzdEFjdGl2ZU5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5QaW5uZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4gcmVmPy5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5zaG93KGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gZ3JpZCdzIGV2ZW50cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3Vic2NyaWJlVG9FdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5hcmVFdmVudHNTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFyZUV2ZW50c1N1YnNjcmliZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1uUmVzaXplZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChldmVudEFyZ3M6IElDb2x1bW5SZXNpemVFdmVudEFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0NlbGwoZXZlbnRBcmdzLmNvbHVtbik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5ncmlkLnBhcmVudFZpcnREaXIuY2h1bmtMb2FkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2ZW50QXJnczogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRBcmdzLnN0YXJ0SW5kZXggIT09IHRoaXMuY29sdW1uU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtblN0YXJ0SW5kZXggPSBldmVudEFyZ3Muc3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckNlbGwudXBkYXRlRmlsdGVyQ2VsbEFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5Nb3ZpbmdFbmQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZvckVhY2goKGZpbHRlckNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2VsbC51cGRhdGVGaWx0ZXJDZWxsQXJlYSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSBmaWx0ZXJpbmcgcm93IGlmIGEgY29sdW1uIGlzIGhpZGRlbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZUZpbHRlcmluZ1Jvd09uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2w6IENvbHVtblR5cGUpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nUm93ID0gdGhpcy5ncmlkLmZpbHRlcmluZ1JvdztcblxuICAgICAgICBpZiAoZmlsdGVyaW5nUm93ICYmIGZpbHRlcmluZ1Jvdy5jb2x1bW4gJiYgZmlsdGVyaW5nUm93LmNvbHVtbiA9PT0gY29sKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdSb3cuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIG1ldGhvZCB0byBjcmVhdGUgZXhwcmVzc2lvbnNUcmVlIGFuZCBmaWx0ZXIgZ3JpZCB1c2VkIGluIGJvdGggZmlsdGVyIG1vZGVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJJbnRlcm5hbChmaWVsZDogc3RyaW5nLCBleHByZXNzaW9uczogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHwgQXJyYXk8RXhwcmVzc2lvblVJPiA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IHRydWU7XG5cbiAgICAgICAgbGV0IGV4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25zIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc1RyZWUgPSBleHByZXNzaW9ucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZSA9IHRoaXMuY3JlYXRlU2ltcGxlRmlsdGVyaW5nVHJlZShmaWVsZCwgZXhwcmVzc2lvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGaWx0ZXIoZmllbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIoZmllbGQsIG51bGwsIGV4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBmaWx0ZXJpbmcgb24gdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcihmaWVsZDogc3RyaW5nLCB2YWx1ZTogYW55LCBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlPzogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U/OiBib29sZWFuKSB7XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcblxuICAgICAgICBjb25zdCBjb2wgPSBncmlkLmdldENvbHVtbkJ5TmFtZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ0lnbm9yZUNhc2UgPSBpZ25vcmVDYXNlIHx8IChjb2wgPyBjb2wuZmlsdGVyaW5nSWdub3JlQ2FzZSA6IGZhbHNlKTtcblxuICAgICAgICBjb25zdCBmaWx0ZXJpbmdUcmVlID0gZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGNvbnN0IGNvbHVtbkZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1RyZWUuZmluZChmaWVsZCkgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSA9IGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUgPz8gY29sdW1uRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBmaWVsZEZpbHRlckluZGV4ID0gZmlsdGVyaW5nVHJlZS5maW5kSW5kZXgoZmllbGQpO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZpbHRlcmluZ1RyZWU6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oZmlsdGVyaW5nVHJlZSwgZmllbGQsIHZhbHVlLCBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlLFxuICAgICAgICAgICAgZmlsdGVyaW5nSWdub3JlQ2FzZSwgZmllbGRGaWx0ZXJJbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJRmlsdGVyaW5nRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgb3duZXI6IGdyaWQsXG4gICAgICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uczogbmV3RmlsdGVyaW5nVHJlZS5maW5kKGZpZWxkKSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb25PckV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcl9pbnRlcm5hbChmaWVsZCwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsIGZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uID0gdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maW5kKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmRpdGlvbiBvciBFeHByZXNzaW9uIFRyZWUhJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2ludGVybmFsKGZpZWxkLCB2YWx1ZSwgZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uLCBmaWx0ZXJpbmdJZ25vcmVDYXNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbkZvckNvbHVtbiA9IGV4cHJlc3Npb25zVHJlZUZvckNvbHVtbiBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcl9pbnRlcm5hbChmaWVsZCwgdmFsdWUsIGV4cHJlc3Npb25Gb3JDb2x1bW4uY29uZGl0aW9uLCBmaWx0ZXJpbmdJZ25vcmVDYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb25lRXZlbnRBcmdzID0gdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maW5kKGZpZWxkKSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5ncmlkLmZpbHRlcmluZ0RvbmUuZW1pdChkb25lRXZlbnRBcmdzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbHRlcl9nbG9iYWwodGVybSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdUcmVlID0gZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGdyaWQuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIGlmIChncmlkLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgZ3JpZC5wYWdpbmF0b3IucGFnZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmaWx0ZXJpbmdUcmVlLmZpbHRlcmluZ09wZXJhbmRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGdyaWQuY29sdW1uTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGNvbHVtbi5maWVsZCwgdGVybSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb24sIGlnbm9yZUNhc2UgfHwgY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZmlsdGVyIG9mIGEgZ2l2ZW4gY29sdW1uIGlmIG5hbWUgaXMgcHJvdmlkZWQuIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcnMgb2YgYWxsIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW1wdHlGaWx0ZXIgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKG51bGwsIGZpZWxkKTtcbiAgICAgICAgY29uc3Qgb25GaWx0ZXJpbmdFdmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcy5ncmlkLFxuICAgICAgICAgICAgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IGVtcHR5RmlsdGVyLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmcuZW1pdChvbkZpbHRlcmluZ0V2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKG9uRmlsdGVyaW5nRXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xlYXJfZmlsdGVyKGZpZWxkKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZ3JpZC5maWx0ZXJpbmdEb25lLmVtaXQoZW1wdHlGaWx0ZXIpKTtcblxuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5nZXRFeHByZXNzaW9ucyhmaWVsZCk7XG4gICAgICAgICAgICBleHByZXNzaW9ucy5sZW5ndGggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbkxpc3QuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IHRoaXMuZ2V0RXhwcmVzc2lvbnMoYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcl9maWx0ZXIoZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nU3RhdGUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXJpbmdTdGF0ZS5maW5kSW5kZXgoZmllbGROYW1lKTtcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgZmlsdGVyaW5nU3RhdGUuZmlsdGVyaW5nT3BlcmFuZHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIGlmICghZmllbGROYW1lKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGFsbCB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgaW4gdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCB3aXRoIHRoZSBzYW1lIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyR2xvYmFsKHZhbHVlOiBhbnksIGNvbmRpdGlvbiwgaWdub3JlQ2FzZT8pIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgbmV3RmlsdGVyaW5nVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZmlsdGVyaW5nVHJlZS5vcGVyYXRvciwgZmlsdGVyaW5nVHJlZS5maWVsZE5hbWUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGdyaWQuY29sdW1uTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKG5ld0ZpbHRlcmluZ1RyZWUsIGNvbHVtbi5maWVsZCwgdmFsdWUsIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBpZ25vcmVDYXNlIHx8IGNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHsgb3duZXI6IGdyaWQsIGZpbHRlcmluZ0V4cHJlc3Npb25zOiBuZXdGaWx0ZXJpbmdUcmVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIGdyaWQuZmlsdGVyaW5nLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG5ld0ZpbHRlcmluZ1RyZWU7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIGZpbHRlcmVkIGRhdGEgdGhyb3VnaCB0aGUgcGlwZXMgYW5kIHRoZW4gZW1pdCB0aGUgZXZlbnQuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmdyaWQuZmlsdGVyaW5nRG9uZS5lbWl0KHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBmaWx0ZXJpbmcgU1ZHIGljb25zIGluIHRoZSBpY29uIHNlcnZpY2UuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyU1ZHSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVkaXRvckljb25zID0gZWRpdG9yIGFzIGFueVtdO1xuICAgICAgICBlZGl0b3JJY29ucy5mb3JFYWNoKGljb24gPT4gdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQoaWNvbi5uYW1lLCBpY29uLnZhbHVlLCAnaW14LWljb25zJykpO1xuICAgICAgICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChwaW5MZWZ0Lm5hbWUsIHBpbkxlZnQudmFsdWUsICdpbXgtaWNvbnMnKTtcbiAgICAgICAgdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQodW5waW5MZWZ0Lm5hbWUsIHVucGluTGVmdC52YWx1ZSwgJ2lteC1pY29ucycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEV4cHJlc3Npb25VSSBhcnJheSBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cHJlc3Npb25zKGNvbHVtbklkOiBzdHJpbmcpOiBFeHByZXNzaW9uVUlbXSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmhhcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5MaXN0LmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBjb2x1bW5JZCk7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uVUlzID0gbmV3IEFycmF5PEV4cHJlc3Npb25VST4oKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IsIGV4cHJlc3Npb25VSXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uVG9FeHByZXNzaW9uc01hcC5zZXQoY29sdW1uSWQsIGV4cHJlc3Npb25VSXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25VSXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmdldChjb2x1bW5JZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjcmVhdGVzIGFsbCBFeHByZXNzaW9uVUlzIGZvciBhbGwgY29sdW1ucy4gRXhlY3V0ZWQgYWZ0ZXIgZmlsdGVyaW5nIHRvIHJlZnJlc2ggdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoRXhwcmVzc2lvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpbHRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zV2l0aENvbXBsZXhGaWx0ZXIuY2xlYXIoKTtcblxuICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmZvckVhY2goKHZhbHVlOiBFeHByZXNzaW9uVUlbXSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuY29sdW1uTGlzdC5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0ga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb25zTGlzdChjb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDb21wbGV4ID0gdGhpcy5pc0ZpbHRlcmluZ1RyZWVDb21wbGV4KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQ2VsbChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uVG9FeHByZXNzaW9uc01hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBFeHByZXNzaW9uVUkgZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVFeHByZXNzaW9uKGNvbHVtbklkOiBzdHJpbmcsIGluZGV4VG9SZW1vdmU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uc0xpc3QgPSB0aGlzLmdldEV4cHJlc3Npb25zKGNvbHVtbklkKTtcblxuICAgICAgICBpZiAoaW5kZXhUb1JlbW92ZSA9PT0gMCAmJiBleHByZXNzaW9uc0xpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0WzFdLmJlZm9yZU9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleFRvUmVtb3ZlID09PSBleHByZXNzaW9uc0xpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgLSAxXS5hZnRlck9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zTGlzdFtpbmRleFRvUmVtb3ZlIC0gMV0uYWZ0ZXJPcGVyYXRvciA9IGV4cHJlc3Npb25zTGlzdFtpbmRleFRvUmVtb3ZlICsgMV0uYmVmb3JlT3BlcmF0b3I7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbMF0uYmVmb3JlT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2V4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxXS5hZnRlck9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25zTGlzdC5zcGxpY2UoaW5kZXhUb1JlbW92ZSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgZmlsdGVyaW5nIHRyZWUgZm9yIGEgZ2l2ZW4gY29sdW1uIGZyb20gZXhpc3RpbmcgRXhwcmVzc2lvblVJcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU2ltcGxlRmlsdGVyaW5nVHJlZShjb2x1bW5JZDogc3RyaW5nLCBleHByZXNzaW9uVUlMaXN0ID0gbnVsbCk6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zTGlzdCA9IGV4cHJlc3Npb25VSUxpc3QgPyBleHByZXNzaW9uVUlMaXN0IDogdGhpcy5nZXRFeHByZXNzaW9ucyhjb2x1bW5JZCk7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuT3IsIGNvbHVtbklkKTtcbiAgICAgICAgbGV0IGN1cnJBbmRCcmFuY2g6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGN1cnJFeHByZXNzaW9uVUkgb2YgZXhwcmVzc2lvbnNMaXN0KSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSAmJiBjdXJyRXhwcmVzc2lvblVJLmV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJFeHByZXNzaW9uVUkuYWZ0ZXJPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kICYmICFjdXJyQW5kQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJBbmRCcmFuY2ggPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLkFuZCwgY29sdW1uSWQpO1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChjdXJyQW5kQnJhbmNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gdW5kZWZpbmVkIHx8IGN1cnJFeHByZXNzaW9uVUkuYmVmb3JlT3BlcmF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICBjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PcikgJiZcbiAgICAgICAgICAgICAgICBjdXJyRXhwcmVzc2lvblVJLmFmdGVyT3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuXG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCBjb2x1bW5JZCk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckFuZEJyYW5jaCk7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaC5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kKSB7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaC5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciBhIGNvbXBsZXggZmlsdGVyIGlzIGFwcGxpZWQgdG8gYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIGlzRmlsdGVyQ29tcGxleChjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5oYXMoY29sdW1uSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5MaXN0LmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBjb2x1bW5JZCk7XG4gICAgICAgIGNvbnN0IGlzQ29tcGxleCA9IGNvbHVtbiAmJiB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgIGlmIChpc0NvbXBsZXgpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmFkZChjb2x1bW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNDb21wbGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmlsdGVyaW5nTG9naWMgb3BlcmF0b3IuXG4gICAgICovXG4gICAgcHVibGljIGdldE9wZXJhdG9yQXNTdHJpbmcob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljKTogYW55IHtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3JfYW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX29wZXJhdG9yX29yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGxhYmVsIG9mIGEgY2hpcCBmcm9tIGEgZ2l2ZW4gZmlsdGVyaW5nIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgcHVibGljIGdldENoaXBMYWJlbChleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGFueSB7XG4gICAgICAgIGlmIChleHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5nc1tgaWd4X2dyaWRfZmlsdGVyXyR7ZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZX1gXSB8fCBleHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24uc2VhcmNoVmFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZShleHByZXNzaW9uLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBjb2x1bW4uZm9ybWF0dGVyO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXIoZXhwcmVzc2lvbi5zZWFyY2hWYWwsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwaXBlQXJncyA9IGNvbHVtbi5waXBlQXJncztcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXREYXRlKGV4cHJlc3Npb24uc2VhcmNoVmFsLCBwaXBlQXJncy5mb3JtYXQsIHRoaXMuZ3JpZC5sb2NhbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uc2VhcmNoVmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY29udGVudCBvZiBhIGZpbHRlckNlbGwuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUZpbHRlcmluZ0NlbGwoY29sdW1uOiBDb2x1bW5UeXBlKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlckNlbGwgPSBjb2x1bW4uZmlsdGVyQ2VsbDtcbiAgICAgICAgaWYgKGZpbHRlckNlbGwpIHtcbiAgICAgICAgICAgIGZpbHRlckNlbGwudXBkYXRlRmlsdGVyQ2VsbEFyZWEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZUV4cHJlc3Npb25zTGlzdChleHByZXNzaW9uczogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8IElGaWx0ZXJpbmdFeHByZXNzaW9uLFxuICAgICAgICBvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMsXG4gICAgICAgIGV4cHJlc3Npb25zVUlzOiBFeHByZXNzaW9uVUlbXSk6IHZvaWQge1xuICAgICAgICBnZW5lcmF0ZUV4cHJlc3Npb25zTGlzdChleHByZXNzaW9ucywgb3BlcmF0b3IsIGV4cHJlc3Npb25zVUlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVFbXB0eShleHByZXNzaW9uVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmVtcHR5KGV4cHJlc3Npb25UcmVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgIGlmICgoZXhwciBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByVHJlZSA9IGV4cHIgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIGlmIChleHByVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyAmJiBleHByVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJfaW50ZXJuYWwoZmllbGROYW1lOiBzdHJpbmcsIHRlcm0sIGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdUcmVlID0gZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIHRoaXMuZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcblxuICAgICAgICBpZiAoZ3JpZC5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIGdyaWQucGFnaW5hdG9yLnBhZ2UgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRGaWx0ZXJJbmRleCA9IGZpbHRlcmluZ1RyZWUuZmluZEluZGV4KGZpZWxkTmFtZSk7XG4gICAgICAgIGlmIChmaWVsZEZpbHRlckluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMuc3BsaWNlKGZpZWxkRmlsdGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcGFyZV9maWx0ZXJpbmdfZXhwcmVzc2lvbihmaWx0ZXJpbmdUcmVlLCBmaWVsZE5hbWUsIHRlcm0sIGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlLCBpZ25vcmVDYXNlLCBmaWVsZEZpbHRlckluZGV4KTtcbiAgICAgICAgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBmaWx0ZXJpbmdUcmVlO1xuICAgIH1cblxuICAgIC8qKiBNb2RpZmllcyB0aGUgZmlsdGVyaW5nU3RhdGUgb2JqZWN0IHRvIGNvbnRhaW4gdGhlIG5ld2x5IGFkZGVkIGZpbHRlcmluZyBjb25kaXRpb25zL2V4cHJlc3Npb25zLlxuICAgICAqIElmIGNyZWF0ZU5ld1RyZWUgaXMgdHJ1ZSwgZmlsdGVyaW5nU3RhdGUgd2lsbCBub3QgYmUgbW9kaWZpZWQgKGJlY2F1c2UgaXQgZGlyZWN0bHkgYWZmZWN0cyB0aGUgZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpLFxuICAgICAqIGJ1dCBhIG5ldyBvYmplY3QgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oXG4gICAgICAgIGZpbHRlcmluZ1N0YXRlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgICAgc2VhcmNoVmFsLFxuICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgIGluc2VydEF0SW5kZXggPSAtMSxcbiAgICAgICAgY3JlYXRlTmV3VHJlZSA9IGZhbHNlKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcblxuICAgICAgICBjb25zdCBleHByZXNzaW9uc1RyZWUgPSBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/XG4gICAgICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIDogbnVsbDtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgP1xuICAgICAgICAgICAgbnVsbCA6IGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlIGFzIElGaWx0ZXJpbmdPcGVyYXRpb247XG4gICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uID0geyBmaWVsZE5hbWUsIHNlYXJjaFZhbCwgY29uZGl0aW9uLCBpZ25vcmVDYXNlIH07XG5cbiAgICAgICAgY29uc3QgbmV3RXhwcmVzc2lvbnNUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBjcmVhdGVOZXdUcmVlID9cbiAgICAgICAgICAgIG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZmlsdGVyaW5nU3RhdGUub3BlcmF0b3IsIGZpbHRlcmluZ1N0YXRlLmZpZWxkTmFtZSkgOiBmaWx0ZXJpbmdTdGF0ZSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG5cbiAgICAgICAgLy8gbm8gZXhwcmVzc2lvbnMgdHJlZSBmb3VuZCBmb3IgdGhpcyBmaWVsZFxuICAgICAgICBpZiAoZXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QXRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzW2luc2VydEF0SW5kZXhdID0gZXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChleHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGV4cHJlc3Npb25zIHRyZWUgZm9yIHRoaXMgZmllbGQgYW5kIGFkZCB0aGUgbmV3IGV4cHJlc3Npb24gdG8gaXRcbiAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJUcmVlOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGZpbHRlcmluZ1N0YXRlLm9wZXJhdG9yLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgbmV3RXhwclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChuZXdFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKG5ld0V4cHJUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uc1RyZWUub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5kT3BlcmF0b3JzQ291bnQgPSB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQoZXhwcmVzc2lvbnNUcmVlKTtcblxuICAgICAgICAgICAgICAgIC8vIGhhdmluZyBtb3JlIHRoYW4gb25lICdBbmQnIG9wZXJhdG9yIGluIHRoZSBzdWItdHJlZSBtZWFucyB0aGF0IHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgcGFyZW50aGVzZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZE9wZXJhdG9yc0NvdW50ID4gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGlzQ29tcGxleCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcGVyYW5kIG9mIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgIGlzQ29tcGxleCA9IGlzQ29tcGxleCB8fCB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGlsZEFuZE9wZXJhdG9yc0NvdW50KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IG9wZXJhbmQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9wZXJhbmQgPSBleHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmQub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxufVxuIl19
506
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSxrREFBa0QsQ0FBQztBQUN2SCxPQUFPLEVBQXdCLGNBQWMsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzVHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlsRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUVoRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRSxPQUFPLEVBQWdCLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7O0FBRXpGOztHQUVHO0FBRUgsTUFBTSxPQUFPLG1CQUFtQjtJQTJCNUIsWUFDWSxXQUEyQixFQUN6QixlQUFrQztRQURwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDekIsb0JBQWUs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TSxPQUFPLElBQUksZUFBZSxDQUFDLGlCQUFpQixFQUFFO2dCQUNyRCxTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNqRTtZQUVELE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLHlCQUF5QixDQUFDLFdBQXNDO1FBQ3BFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksT0FBTyxDQUFDO1FBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0QsT0FBTyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixJQUFJLE9BQU8sWUFBWSx3QkFBd0IsRUFBRTtnQkFDN0MsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLGNBQWMsQ0FBQyxHQUFHLEVBQUU7b0JBQ3pDLEtBQUssRUFBRSxDQUFDO2lCQUNYO2dCQUVELEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzNEO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOztnSEFua0JRLG1CQUFtQjtvSEFBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEluamVjdGFibGUsXG4gICAgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nRXhwcmVzc2lvbiwgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJRm9yT2ZTdGF0ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IElDb2x1bW5SZXNpemVFdmVudEFyZ3MsIElGaWx0ZXJpbmdFdmVudEFyZ3MgfSBmcm9tICcuLi9jb21tb24vZXZlbnRzJztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncywgVmVydGljYWxBbGlnbm1lbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvb3ZlcmxheSc7XG5pbXBvcnQgeyB1c2VBbmltYXRpb24gfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IGZhZGVJbiB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvbWFpbic7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS9zY3JvbGwvYWJzb2x1dGUtc2Nyb2xsLXN0cmF0ZWd5JztcbmltcG9ydCB7IElneEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgZWRpdG9yLCBwaW5MZWZ0LCB1bnBpbkxlZnQgfSBmcm9tICdAaWduaXRldWkvbWF0ZXJpYWwtaWNvbnMtZXh0ZW5kZWQnO1xuaW1wb3J0IHsgRXhwcmVzc2lvblVJLCBnZW5lcmF0ZUV4cHJlc3Npb25zTGlzdCB9IGZyb20gJy4vZXhjZWwtc3R5bGUvY29tbW9uJztcbmltcG9ydCB7IENvbHVtblR5cGUsIEdyaWRUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEV4Y2VsU3R5bGVQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9leGNlbC1zdHlsZS9leGNlbC1zdHlsZS1wb3NpdGlvbi1zdHJhdGVneSc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSWd4RmlsdGVyaW5nU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHVibGljIGlzRmlsdGVyUm93VmlzaWJsZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBmaWx0ZXJlZENvbHVtbjogQ29sdW1uVHlwZSA9IG51bGw7XG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb24gPSBudWxsO1xuICAgIHB1YmxpYyBjb2x1bW5Ub01vcmVJY29uSGlkZGVuID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgcHVibGljIGFjdGl2ZUZpbHRlckNlbGwgPSAwO1xuICAgIHB1YmxpYyBncmlkOiBHcmlkVHlwZTtcblxuICAgIHByaXZhdGUgY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBhcmVFdmVudHNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjb2x1bW5Ub0V4cHJlc3Npb25zTWFwID0gbmV3IE1hcDxzdHJpbmcsIEV4cHJlc3Npb25VSVtdPigpO1xuICAgIHByaXZhdGUgY29sdW1uU3RhcnRJbmRleCA9IC0xO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uRXNjYXBlOiB0cnVlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBFeGNlbFN0eWxlUG9zaXRpb25TdHJhdGVneSh7XG4gICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHVzZUFuaW1hdGlvbihmYWRlSW4sIHsgcGFyYW1zOiB7IGR1cmF0aW9uOiAnMjUwbXMnIH19KSxcbiAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBudWxsXG4gICAgICAgIH0pLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKVxuICAgIH07XG4gICAgcHJvdGVjdGVkIGxhc3RBY3RpdmVOb2RlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaWNvblNlcnZpY2U6IElneEljb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX292ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlRmlsdGVyRHJvcGRvd24oZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbHVtbjogQ29sdW1uVHlwZSkge1xuXG4gICAgICAgIGNvbnN0IGZpbHRlckljb24gPSBjb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID8gJ2lneC1leGNlbC1maWx0ZXJfX2ljb24tLWZpbHRlcmVkJyA6ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uJztcbiAgICAgICAgY29uc3QgZmlsdGVySWNvblRhcmdldCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihgLiR7ZmlsdGVySWNvbn1gKSBhcyBIVE1MRWxlbWVudCB8fCBlbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHsgaWQsIHJlZiB9ID0gdGhpcy5ncmlkLmNyZWF0ZUZpbHRlckRyb3Bkb3duKGNvbHVtbiwge1xuICAgICAgICAgICAgLi4udGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyxcbiAgICAgICAgICAgIC4uLnsgdGFyZ2V0OiBmaWx0ZXJJY29uVGFyZ2V0IH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2Uub3BlbmluZ1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlyc3Qob3ZlcmxheSA9PiBvdmVybGF5LmlkID09PSBpZCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLmdyaWQubmF2aWdhdGlvbi5hY3RpdmVOb2RlKTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5jbG9zZWRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpcnN0KG92ZXJsYXkgPT4gb3ZlcmxheS5pZCA9PT0gaWQpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuZGV0YWNoKGlkKTtcbiAgICAgICAgICAgICAgICByZWY/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQubmF2aWdhdGlvbi5hY3RpdmVOb2RlID0gdGhpcy5sYXN0QWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQudGhlYWRSb3cubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblBpbm5lZC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiByZWY/LmRlc3Ryb3koKSk7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLnNob3coaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byBncmlkJ3MgZXZlbnRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdWJzY3JpYmVUb0V2ZW50cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFyZUV2ZW50c1N1YnNjcmliZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJlRXZlbnRzU3Vic2NyaWJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5SZXNpemVkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2ZW50QXJnczogSUNvbHVtblJlc2l6ZUV2ZW50QXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQ2VsbChldmVudEFyZ3MuY29sdW1uKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWQucGFyZW50VmlydERpci5jaHVua0xvYWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZXZlbnRBcmdzOiBJRm9yT2ZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldmVudEFyZ3Muc3RhcnRJbmRleCAhPT0gdGhpcy5jb2x1bW5TdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uU3RhcnRJbmRleCA9IGV2ZW50QXJncy5zdGFydEluZGV4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyQ2VsbExpc3QuZm9yRWFjaCgoZmlsdGVyQ2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2VsbC51cGRhdGVGaWx0ZXJDZWxsQXJlYSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk1vdmluZ0VuZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyQ2VsbExpc3QuZm9yRWFjaCgoZmlsdGVyQ2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDZWxsLnVwZGF0ZUZpbHRlckNlbGxBcmVhKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIGZpbHRlcmluZyByb3cgaWYgYSBjb2x1bW4gaXMgaGlkZGVuLlxuICAgICAqL1xuICAgIHB1YmxpYyBoaWRlRmlsdGVyaW5nUm93T25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbDogQ29sdW1uVHlwZSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdSb3cgPSB0aGlzLmdyaWQuZmlsdGVyaW5nUm93O1xuXG4gICAgICAgIGlmIChmaWx0ZXJpbmdSb3cgJiYgZmlsdGVyaW5nUm93LmNvbHVtbiAmJiBmaWx0ZXJpbmdSb3cuY29sdW1uID09PSBjb2wpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGNyZWF0ZSBleHByZXNzaW9uc1RyZWUgYW5kIGZpbHRlciBncmlkIHVzZWQgaW4gYm90aCBmaWx0ZXIgbW9kZXMuXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlckludGVybmFsKGZpZWxkOiBzdHJpbmcsIGV4cHJlc3Npb25zOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBBcnJheTxFeHByZXNzaW9uVUk+ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gdHJ1ZTtcblxuICAgICAgICBsZXQgZXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlID0gdGhpcy5jcmVhdGVTaW1wbGVGaWx0ZXJpbmdUcmVlKGZpZWxkLCBleHByZXNzaW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckZpbHRlcihmaWVsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcihmaWVsZCwgbnVsbCwgZXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGZpbHRlcmluZyBvbiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuXG4gICAgICAgIGNvbnN0IGNvbCA9IGdyaWQuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKTtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nSWdub3JlQ2FzZSA9IGlnbm9yZUNhc2UgfHwgKGNvbCA/IGNvbC5maWx0ZXJpbmdJZ25vcmVDYXNlIDogZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgY29uc3QgY29sdW1uRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gZmlsdGVyaW5nVHJlZS5maW5kKGZpZWxkKSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlID0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSA/PyBjb2x1bW5GaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgIGNvbnN0IGZpZWxkRmlsdGVySW5kZXggPSBmaWx0ZXJpbmdUcmVlLmZpbmRJbmRleChmaWVsZCk7XG5cbiAgICAgICAgY29uc3QgbmV3RmlsdGVyaW5nVHJlZTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID1cbiAgICAgICAgICAgIHRoaXMucHJlcGFyZV9maWx0ZXJpbmdfZXhwcmVzc2lvbihmaWx0ZXJpbmdUcmVlLCBmaWVsZCwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsXG4gICAgICAgICAgICBmaWx0ZXJpbmdJZ25vcmVDYXNlLCBmaWVsZEZpbHRlckluZGV4LCB0cnVlKTtcblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogZ3JpZCxcbiAgICAgICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zOiBuZXdGaWx0ZXJpbmdUcmVlLmZpbmQoZmllbGQpIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyaWQuZmlsdGVyaW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyX2ludGVybmFsKGZpZWxkLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSwgZmlsdGVyaW5nSWdub3JlQ2FzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uc1RyZWVGb3JDb2x1bW4gPSB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbmQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCFleHByZXNzaW9uc1RyZWVGb3JDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uZGl0aW9uIG9yIEV4cHJlc3Npb24gVHJlZSEnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJfaW50ZXJuYWwoZmllbGQsIHZhbHVlLCBleHByZXNzaW9uc1RyZWVGb3JDb2x1bW4sIGZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uRm9yQ29sdW1uID0gZXhwcmVzc2lvbnNUcmVlRm9yQ29sdW1uIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2ludGVybmFsKGZpZWxkLCB2YWx1ZSwgZXhwcmVzc2lvbkZvckNvbHVtbi5jb25kaXRpb24sIGZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvbmVFdmVudEFyZ3MgPSB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbmQoZmllbGQpIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIGZpbHRlcmVkIGRhdGEgdGhyb3VnaCB0aGUgcGlwZXMgYW5kIHRoZW4gZW1pdCB0aGUgZXZlbnQuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmdyaWQuZmlsdGVyaW5nRG9uZS5lbWl0KGRvbmVFdmVudEFyZ3MpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsdGVyX2dsb2JhbCh0ZXJtLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGdyaWQucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICBncmlkLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbHRlcmluZ1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZ3JpZC5jb2x1bW5MaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24oZmlsdGVyaW5nVHJlZSwgY29sdW1uLmZpZWxkLCB0ZXJtLFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwgaWdub3JlQ2FzZSB8fCBjb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1RyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBmaWx0ZXIgb2YgYSBnaXZlbiBjb2x1bW4gaWYgbmFtZSBpcyBwcm92aWRlZC4gT3RoZXJ3aXNlIGNsZWFycyB0aGUgZmlsdGVycyBvZiBhbGwgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIoZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbXB0eUZpbHRlciA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUobnVsbCwgZmllbGQpO1xuICAgICAgICBjb25zdCBvbkZpbHRlcmluZ0V2ZW50QXJnczogSUZpbHRlcmluZ0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLmdyaWQsXG4gICAgICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uczogZW1wdHlGaWx0ZXIsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZy5lbWl0KG9uRmlsdGVyaW5nRXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAob25GaWx0ZXJpbmdFdmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbGVhcl9maWx0ZXIoZmllbGQpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5ncmlkLmZpbHRlcmluZ0RvbmUuZW1pdChlbXB0eUZpbHRlcikpO1xuXG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLmdldEV4cHJlc3Npb25zKGZpZWxkKTtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zLmxlbmd0aCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1uTGlzdC5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5nZXRFeHByZXNzaW9ucyhjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyX2ZpbHRlcihmaWVsZE5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdTdGF0ZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBpbmRleCA9IGZpbHRlcmluZ1N0YXRlLmZpbmRJbmRleChmaWVsZE5hbWUpO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBmaWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIGZpbHRlcmluZ1N0YXRlLmZpbHRlcmluZ09wZXJhbmRzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1N0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYWxsIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBpbiB0aGUgYElneEdyaWRDb21wb25lbnRgIHdpdGggdGhlIHNhbWUgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZmlsdGVyaW5nVHJlZSA9IGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICBjb25zdCBuZXdGaWx0ZXJpbmdUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShmaWx0ZXJpbmdUcmVlLm9wZXJhdG9yLCBmaWx0ZXJpbmdUcmVlLmZpZWxkTmFtZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZ3JpZC5jb2x1bW5MaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVfZmlsdGVyaW5nX2V4cHJlc3Npb24obmV3RmlsdGVyaW5nVHJlZSwgY29sdW1uLmZpZWxkLCB2YWx1ZSwgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIGlnbm9yZUNhc2UgfHwgY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJRmlsdGVyaW5nRXZlbnRBcmdzID0geyBvd25lcjogZ3JpZCwgZmlsdGVyaW5nRXhwcmVzc2lvbnM6IG5ld0ZpbHRlcmluZ1RyZWUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgZ3JpZC5maWx0ZXJpbmcuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICBpZiAoZ3JpZC5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIGdyaWQucGFnaW5hdG9yLnBhZ2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbmV3RmlsdGVyaW5nVHJlZTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZ3JpZC5maWx0ZXJpbmdEb25lLmVtaXQodGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGZpbHRlcmluZyBTVkcgaWNvbnMgaW4gdGhlIGljb24gc2VydmljZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJTVkdJY29ucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWRpdG9ySWNvbnMgPSBlZGl0b3IgYXMgYW55W107XG4gICAgICAgIGVkaXRvckljb25zLmZvckVhY2goaWNvbiA9PiB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChpY29uLm5hbWUsIGljb24udmFsdWUsICdpbXgtaWNvbnMnKSk7XG4gICAgICAgIHRoaXMuaWNvblNlcnZpY2UuYWRkU3ZnSWNvbkZyb21UZXh0KHBpbkxlZnQubmFtZSwgcGluTGVmdC52YWx1ZSwgJ2lteC1pY29ucycpO1xuICAgICAgICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dCh1bnBpbkxlZnQubmFtZSwgdW5waW5MZWZ0LnZhbHVlLCAnaW14LWljb25zJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgRXhwcmVzc2lvblVJIGFycmF5IGZvciBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXhwcmVzc2lvbnMoY29sdW1uSWQ6IHN0cmluZyk6IEV4cHJlc3Npb25VSVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuaGFzKGNvbHVtbklkKSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmNvbHVtbkxpc3QuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25VSXMgPSBuZXcgQXJyYXk8RXhwcmVzc2lvblVJPigpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uc0xpc3QoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgdGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvciwgZXhwcmVzc2lvblVJcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLnNldChjb2x1bW5JZCwgZXhwcmVzc2lvblVJcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvblVJcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuZ2V0KGNvbHVtbklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNyZWF0ZXMgYWxsIEV4cHJlc3Npb25VSXMgZm9yIGFsbCBjb2x1bW5zLiBFeGVjdXRlZCBhZnRlciBmaWx0ZXJpbmcgdG8gcmVmcmVzaCB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hFeHByZXNzaW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRmlsdGVyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNXaXRoQ29tcGxleEZpbHRlci5jbGVhcigpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbHVtblRvRXhwcmVzc2lvbnNNYXAuZm9yRWFjaCgodmFsdWU6IEV4cHJlc3Npb25VSVtdLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5MaXN0LmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUubGVuZ3RoID0gMDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IsIHZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0NvbXBsZXggPSB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmFkZChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJpbmdDZWxsKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Ub0V4cHJlc3Npb25zTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIEV4cHJlc3Npb25VSSBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUV4cHJlc3Npb24oY29sdW1uSWQ6IHN0cmluZywgaW5kZXhUb1JlbW92ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb25zTGlzdCA9IHRoaXMuZ2V0RXhwcmVzc2lvbnMoY29sdW1uSWQpO1xuXG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlID09PSAwICYmIGV4cHJlc3Npb25zTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbMV0uYmVmb3JlT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4VG9SZW1vdmUgPT09IGV4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbaW5kZXhUb1JlbW92ZSAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgLSAxXS5hZnRlck9wZXJhdG9yID0gZXhwcmVzc2lvbnNMaXN0W2luZGV4VG9SZW1vdmUgKyAxXS5iZWZvcmVPcGVyYXRvcjtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zTGlzdFswXS5iZWZvcmVPcGVyYXRvciA9IG51bGw7XG4gICAgICAgICAgICBleHByZXNzaW9uc0xpc3RbZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aCAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbnNMaXN0LnNwbGljZShpbmRleFRvUmVtb3ZlLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBmaWx0ZXJpbmcgdHJlZSBmb3IgYSBnaXZlbiBjb2x1bW4gZnJvbSBleGlzdGluZyBFeHByZXNzaW9uVUlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTaW1wbGVGaWx0ZXJpbmdUcmVlKGNvbHVtbklkOiBzdHJpbmcsIGV4cHJlc3Npb25VSUxpc3QgPSBudWxsKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNMaXN0ID0gZXhwcmVzc2lvblVJTGlzdCA/IGV4cHJlc3Npb25VSUxpc3QgOiB0aGlzLmdldEV4cHJlc3Npb25zKGNvbHVtbklkKTtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5PciwgY29sdW1uSWQpO1xuICAgICAgICBsZXQgY3VyckFuZEJyYW5jaDogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuXG4gICAgICAgIGZvciAoY29uc3QgY3VyckV4cHJlc3Npb25VSSBvZiBleHByZXNzaW9uc0xpc3QpIHtcbiAgICAgICAgICAgIGlmICghY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ICYmIGN1cnJFeHByZXNzaW9uVUkuZXhwcmVzc2lvbi5zZWFyY2hWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyckV4cHJlc3Npb25VSS5hZnRlck9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmQgJiYgIWN1cnJBbmRCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyckFuZEJyYW5jaCA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCBjb2x1bW5JZCk7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKGN1cnJBbmRCcmFuY2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKChjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSB1bmRlZmluZWQgfHwgY3VyckV4cHJlc3Npb25VSS5iZWZvcmVPcGVyYXRvciA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIGN1cnJFeHByZXNzaW9uVUkuYmVmb3JlT3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSAmJlxuICAgICAgICAgICAgICAgIGN1cnJFeHByZXNzaW9uVUkuYWZ0ZXJPcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kKSB7XG5cbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQsIGNvbHVtbklkKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChjdXJyQW5kQnJhbmNoKTtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyRXhwcmVzc2lvblVJLmJlZm9yZU9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmQpIHtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goY3VyckV4cHJlc3Npb25VSS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBjdXJyQW5kQnJhbmNoID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGEgY29tcGxleCBmaWx0ZXIgaXMgYXBwbGllZCB0byBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGaWx0ZXJDb21wbGV4KGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uc1dpdGhDb21wbGV4RmlsdGVyLmhhcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmNvbHVtbkxpc3QuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgY29uc3QgaXNDb21wbGV4ID0gY29sdW1uICYmIHRoaXMuaXNGaWx0ZXJpbmdUcmVlQ29tcGxleChjb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgaWYgKGlzQ29tcGxleCkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zV2l0aENvbXBsZXhGaWx0ZXIuYWRkKGNvbHVtbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBGaWx0ZXJpbmdMb2dpYyBvcGVyYXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3BlcmF0b3JBc1N0cmluZyhvcGVyYXRvcjogRmlsdGVyaW5nTG9naWMpOiBhbnkge1xuICAgICAgICBpZiAob3BlcmF0b3IgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9vcGVyYXRvcl9hbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3Jfb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgbGFiZWwgb2YgYSBjaGlwIGZyb20gYSBnaXZlbiBmaWx0ZXJpbmcgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2hpcExhYmVsKGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uKTogYW55IHtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQucmVzb3VyY2VTdHJpbmdzW2BpZ3hfZ3JpZF9maWx0ZXJfJHtleHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lfWBdIHx8IGV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5zZWFyY2hWYWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKGV4cHJlc3Npb24uZmllbGROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IGNvbHVtbi5mb3JtYXR0ZXI7XG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlcihleHByZXNzaW9uLnNlYXJjaFZhbCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBpcGVBcmdzID0gY29sdW1uLnBpcGVBcmdzO1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdERhdGUoZXhwcmVzc2lvbi5zZWFyY2hWYWwsIHBpcGVBcmdzLmZvcm1hdCwgdGhpcy5ncmlkLmxvY2FsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5zZWFyY2hWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIGEgZmlsdGVyQ2VsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlRmlsdGVyaW5nQ2VsbChjb2x1bW46IENvbHVtblR5cGUpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyQ2VsbCA9IGNvbHVtbi5maWx0ZXJDZWxsO1xuICAgICAgICBpZiAoZmlsdGVyQ2VsbCkge1xuICAgICAgICAgICAgZmlsdGVyQ2VsbC51cGRhdGVGaWx0ZXJDZWxsQXJlYSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHwgSUZpbHRlcmluZ0V4cHJlc3Npb24sXG4gICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYyxcbiAgICAgICAgZXhwcmVzc2lvbnNVSXM6IEV4cHJlc3Npb25VSVtdKTogdm9pZCB7XG4gICAgICAgIGdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGV4cHJlc3Npb25zLCBvcGVyYXRvciwgZXhwcmVzc2lvbnNVSXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KGV4cHJlc3Npb25UcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZW1wdHkoZXhwcmVzc2lvblRyZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgaWYgKChleHByIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJUcmVlID0gZXhwciBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHJUcmVlLmZpbHRlcmluZ09wZXJhbmRzICYmIGV4cHJUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbHRlcl9pbnRlcm5hbChmaWVsZE5hbWU6IHN0cmluZywgdGVybSwgY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdPcGVyYXRpb24gfCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RyZWUgPSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIGlmIChncmlkLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgZ3JpZC5wYWdpbmF0b3IucGFnZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZEZpbHRlckluZGV4ID0gZmlsdGVyaW5nVHJlZS5maW5kSW5kZXgoZmllbGROYW1lKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlX2ZpbHRlcmluZ19leHByZXNzaW9uKGZpbHRlcmluZ1RyZWUsIGZpZWxkTmFtZSwgdGVybSwgY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUsIGlnbm9yZUNhc2UsIGZpZWxkRmlsdGVySW5kZXgpO1xuICAgICAgICBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1RyZWU7XG4gICAgfVxuXG4gICAgLyoqIE1vZGlmaWVzIHRoZSBmaWx0ZXJpbmdTdGF0ZSBvYmplY3QgdG8gY29udGFpbiB0aGUgbmV3bHkgYWRkZWQgZmlsdGVyaW5nIGNvbmRpdGlvbnMvZXhwcmVzc2lvbnMuXG4gICAgICogSWYgY3JlYXRlTmV3VHJlZSBpcyB0cnVlLCBmaWx0ZXJpbmdTdGF0ZSB3aWxsIG5vdCBiZSBtb2RpZmllZCAoYmVjYXVzZSBpdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSksXG4gICAgICogYnV0IGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJlcGFyZV9maWx0ZXJpbmdfZXhwcmVzc2lvbihcbiAgICAgICAgZmlsdGVyaW5nU3RhdGU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICBzZWFyY2hWYWwsXG4gICAgICAgIGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZTogYm9vbGVhbixcbiAgICAgICAgaW5zZXJ0QXRJbmRleCA9IC0xLFxuICAgICAgICBjcmVhdGVOZXdUcmVlID0gZmFsc2UpOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUge1xuXG4gICAgICAgIGxldCBleHByZXNzaW9uc1RyZWUgPSBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/XG4gICAgICAgICAgICBjb25kaXRpb25PckV4cHJlc3Npb25zVHJlZSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIDogbnVsbDtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9uT3JFeHByZXNzaW9uc1RyZWUgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgP1xuICAgICAgICAgICAgbnVsbCA6IGNvbmRpdGlvbk9yRXhwcmVzc2lvbnNUcmVlIGFzIElGaWx0ZXJpbmdPcGVyYXRpb247XG5cbiAgICAgICAgbGV0IG5ld0V4cHJlc3Npb25zVHJlZSA9IGZpbHRlcmluZ1N0YXRlIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcblxuICAgICAgICBpZiAoY3JlYXRlTmV3VHJlZSkge1xuICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShmaWx0ZXJpbmdTdGF0ZS5vcGVyYXRvciwgZmlsdGVyaW5nU3RhdGUuZmllbGROYW1lKTtcbiAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyA9IFsuLi5maWx0ZXJpbmdTdGF0ZS5maWx0ZXJpbmdPcGVyYW5kc107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFeHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbiA9IHsgZmllbGROYW1lLCBzZWFyY2hWYWwsIGNvbmRpdGlvbiwgaWdub3JlQ2FzZSB9O1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShmaWx0ZXJpbmdTdGF0ZS5vcGVyYXRvciwgZmllbGROYW1lKTtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKG5ld0V4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgaWYgKGluc2VydEF0SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kc1tpbnNlcnRBdEluZGV4XSA9IGV4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goZXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nVHJlZUNvbXBsZXgoZXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfCBJRmlsdGVyaW5nRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zVHJlZSA9IGV4cHJlc3Npb25zIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uc1RyZWUub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5kT3BlcmF0b3JzQ291bnQgPSB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQoZXhwcmVzc2lvbnNUcmVlKTtcblxuICAgICAgICAgICAgICAgIC8vIGhhdmluZyBtb3JlIHRoYW4gb25lICdBbmQnIG9wZXJhdG9yIGluIHRoZSBzdWItdHJlZSBtZWFucyB0aGF0IHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgcGFyZW50aGVzZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZE9wZXJhdG9yc0NvdW50ID4gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGlzQ29tcGxleCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcGVyYW5kIG9mIGV4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgIGlzQ29tcGxleCA9IGlzQ29tcGxleCB8fCB0aGlzLmlzRmlsdGVyaW5nVHJlZUNvbXBsZXgob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpc0NvbXBsZXg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGlsZEFuZE9wZXJhdG9yc0NvdW50KGV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IG9wZXJhbmQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9wZXJhbmQgPSBleHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhbmQub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyB0aGlzLmdldENoaWxkQW5kT3BlcmF0b3JzQ291bnQob3BlcmFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxufVxuIl19
@@ -55684,9 +55684,6 @@ class IgxFilteringService {
55684
55684
  grid.paginator.page = 0;
55685
55685
  }
55686
55686
  const fieldFilterIndex = filteringTree.findIndex(fieldName);
55687
- if (fieldFilterIndex > -1) {
55688
- filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
55689
- }
55690
55687
  this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
55691
55688
  grid.filteringExpressionsTree = filteringTree;
55692
55689
  }
@@ -55695,14 +55692,20 @@ class IgxFilteringService {
55695
55692
  * but a new object is created and returned.
55696
55693
  */
55697
55694
  prepare_filtering_expression(filteringState, fieldName, searchVal, conditionOrExpressionsTree, ignoreCase, insertAtIndex = -1, createNewTree = false) {
55698
- const expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
55695
+ let expressionsTree = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
55699
55696
  conditionOrExpressionsTree : null;
55700
55697
  const condition = conditionOrExpressionsTree instanceof FilteringExpressionsTree ?
55701
55698
  null : conditionOrExpressionsTree;
55702
- const newExpression = { fieldName, searchVal, condition, ignoreCase };
55703
- const newExpressionsTree = createNewTree ?
55704
- new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName) : filteringState;
55705
- // no expressions tree found for this field
55699
+ let newExpressionsTree = filteringState;
55700
+ if (createNewTree) {
55701
+ newExpressionsTree = new FilteringExpressionsTree(filteringState.operator, filteringState.fieldName);
55702
+ newExpressionsTree.filteringOperands = [...filteringState.filteringOperands];
55703
+ }
55704
+ if (condition) {
55705
+ const newExpression = { fieldName, searchVal, condition, ignoreCase };
55706
+ expressionsTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
55707
+ expressionsTree.filteringOperands.push(newExpression);
55708
+ }
55706
55709
  if (expressionsTree) {
55707
55710
  if (insertAtIndex > -1) {
55708
55711
  newExpressionsTree.filteringOperands[insertAtIndex] = expressionsTree;
@@ -55711,12 +55714,6 @@ class IgxFilteringService {
55711
55714
  newExpressionsTree.filteringOperands.push(expressionsTree);
55712
55715
  }
55713
55716
  }
55714
- else if (condition) {
55715
- // create expressions tree for this field and add the new expression to it
55716
- const newExprTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
55717
- newExprTree.filteringOperands.push(newExpression);
55718
- newExpressionsTree.filteringOperands.push(newExprTree);
55719
- }
55720
55717
  return newExpressionsTree;
55721
55718
  }
55722
55719
  isFilteringTreeComplex(expressions) {