@wavemaker/app-ng-runtime 11.4.0-next.28152 → 11.4.0-rc.5339

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.
Files changed (122) hide show
  1. app-ng-runtime/build-task/basic/tree/tree.build.d.ts +1 -2
  2. app-ng-runtime/build-task/bundles/index.umd.js +8 -10
  3. app-ng-runtime/build-task/bundles/index.umd.js.map +1 -1
  4. app-ng-runtime/build-task/esm2015/basic/tree/tree.build.js +3 -4
  5. app-ng-runtime/build-task/esm2015/data/form/form-field/form-field.build.js +2 -2
  6. app-ng-runtime/build-task/esm2015/navigation/popover/popover.build.js +3 -3
  7. app-ng-runtime/build-task/fesm2015/index.js +8 -10
  8. app-ng-runtime/build-task/fesm2015/index.js.map +1 -1
  9. app-ng-runtime/components/base/bundles/index.umd.js +29 -4
  10. app-ng-runtime/components/base/bundles/index.umd.js.map +1 -1
  11. app-ng-runtime/components/base/esm2015/public_api.js +2 -2
  12. app-ng-runtime/components/base/esm2015/utils/widget-utils.js +22 -4
  13. app-ng-runtime/components/base/esm2015/widgets/common/base/base-field-validations.js +3 -2
  14. app-ng-runtime/components/base/esm2015/widgets/common/dialog/dialog.service.js +7 -1
  15. app-ng-runtime/components/base/fesm2015/index.js +30 -6
  16. app-ng-runtime/components/base/fesm2015/index.js.map +1 -1
  17. app-ng-runtime/components/base/index.metadata.json +1 -1
  18. app-ng-runtime/components/base/public_api.d.ts +1 -1
  19. app-ng-runtime/components/base/utils/widget-utils.d.ts +8 -1
  20. app-ng-runtime/components/basic/tree/bundles/index.umd.js +280 -256
  21. app-ng-runtime/components/basic/tree/bundles/index.umd.js.map +1 -1
  22. app-ng-runtime/components/basic/tree/esm2015/public_api.js +2 -2
  23. app-ng-runtime/components/basic/tree/esm2015/tree.component.js +322 -0
  24. app-ng-runtime/components/basic/tree/esm2015/tree.module.js +3 -3
  25. app-ng-runtime/components/basic/tree/fesm2015/index.js +260 -248
  26. app-ng-runtime/components/basic/tree/fesm2015/index.js.map +1 -1
  27. app-ng-runtime/components/basic/tree/index.metadata.json +1 -1
  28. app-ng-runtime/components/basic/tree/public_api.d.ts +1 -1
  29. app-ng-runtime/components/basic/tree/tree.component.d.ts +34 -0
  30. app-ng-runtime/components/containers/tabs/bundles/index.umd.js +39 -23
  31. app-ng-runtime/components/containers/tabs/bundles/index.umd.js.map +1 -1
  32. app-ng-runtime/components/containers/tabs/esm2015/tab-pane/tab-pane.component.js +8 -1
  33. app-ng-runtime/components/containers/tabs/esm2015/tabs.animator.js +33 -13
  34. app-ng-runtime/components/containers/tabs/fesm2015/index.js +40 -13
  35. app-ng-runtime/components/containers/tabs/fesm2015/index.js.map +1 -1
  36. app-ng-runtime/components/containers/tabs/tabs.animator.d.ts +5 -1
  37. app-ng-runtime/components/data/form/bundles/index.umd.js +37 -13
  38. app-ng-runtime/components/data/form/bundles/index.umd.js.map +1 -1
  39. app-ng-runtime/components/data/form/esm2015/form-field/form-field.directive.js +26 -7
  40. app-ng-runtime/components/data/form/esm2015/form.component.js +10 -5
  41. app-ng-runtime/components/data/form/fesm2015/index.js +34 -10
  42. app-ng-runtime/components/data/form/fesm2015/index.js.map +1 -1
  43. app-ng-runtime/components/data/form/index.metadata.json +1 -1
  44. app-ng-runtime/components/data/list/bundles/index.umd.js +52 -43
  45. app-ng-runtime/components/data/list/bundles/index.umd.js.map +1 -1
  46. app-ng-runtime/components/data/list/esm2015/list.component.js +52 -43
  47. app-ng-runtime/components/data/list/fesm2015/index.js +51 -42
  48. app-ng-runtime/components/data/list/fesm2015/index.js.map +1 -1
  49. app-ng-runtime/components/data/list/index.metadata.json +1 -1
  50. app-ng-runtime/components/data/list/list.component.d.ts +1 -1
  51. app-ng-runtime/components/data/pagination/bundles/index.umd.js +22 -5
  52. app-ng-runtime/components/data/pagination/bundles/index.umd.js.map +1 -1
  53. app-ng-runtime/components/data/pagination/esm2015/pagination.component.js +23 -6
  54. app-ng-runtime/components/data/pagination/fesm2015/index.js +22 -5
  55. app-ng-runtime/components/data/pagination/fesm2015/index.js.map +1 -1
  56. app-ng-runtime/components/data/pagination/index.metadata.json +1 -1
  57. app-ng-runtime/components/data/pagination/pagination.component.d.ts +1 -0
  58. app-ng-runtime/components/data/table/bundles/index.umd.js +64 -12
  59. app-ng-runtime/components/data/table/bundles/index.umd.js.map +1 -1
  60. app-ng-runtime/components/data/table/esm2015/table.component.js +63 -13
  61. app-ng-runtime/components/data/table/esm2015/table.props.js +3 -1
  62. app-ng-runtime/components/data/table/fesm2015/index.js +64 -12
  63. app-ng-runtime/components/data/table/fesm2015/index.js.map +1 -1
  64. app-ng-runtime/components/data/table/index.metadata.json +1 -1
  65. app-ng-runtime/components/data/table/table.component.d.ts +9 -0
  66. app-ng-runtime/components/dialogs/default/base-dialog.d.ts +1 -0
  67. app-ng-runtime/components/dialogs/default/bundles/index.umd.js +17 -3
  68. app-ng-runtime/components/dialogs/default/bundles/index.umd.js.map +1 -1
  69. app-ng-runtime/components/dialogs/default/esm2015/base-dialog.js +18 -5
  70. app-ng-runtime/components/dialogs/default/fesm2015/index.js +17 -4
  71. app-ng-runtime/components/dialogs/default/fesm2015/index.js.map +1 -1
  72. app-ng-runtime/components/dialogs/default/index.metadata.json +1 -1
  73. app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +1 -0
  74. app-ng-runtime/components/input/epoch/bundles/index.umd.js +78 -35
  75. app-ng-runtime/components/input/epoch/bundles/index.umd.js.map +1 -1
  76. app-ng-runtime/components/input/epoch/date-time/date-time-picker.component.d.ts +1 -0
  77. app-ng-runtime/components/input/epoch/esm2015/base-date-time.component.js +55 -31
  78. app-ng-runtime/components/input/epoch/esm2015/date/date.component.js +3 -3
  79. app-ng-runtime/components/input/epoch/esm2015/date-time/date-time-picker.component.js +31 -11
  80. app-ng-runtime/components/input/epoch/esm2015/date-time/date-time.component.js +2 -2
  81. app-ng-runtime/components/input/epoch/fesm2015/index.js +87 -43
  82. app-ng-runtime/components/input/epoch/fesm2015/index.js.map +1 -1
  83. app-ng-runtime/components/input/epoch/index.metadata.json +1 -1
  84. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +25 -19
  85. app-ng-runtime/components/navigation/menu/bundles/index.umd.js.map +1 -1
  86. app-ng-runtime/components/navigation/menu/esm2015/menu-dropdown-item/menu-dropdown-item.component.js +15 -5
  87. app-ng-runtime/components/navigation/menu/esm2015/menu.component.js +14 -19
  88. app-ng-runtime/components/navigation/menu/fesm2015/index.js +25 -20
  89. app-ng-runtime/components/navigation/menu/fesm2015/index.js.map +1 -1
  90. app-ng-runtime/components/navigation/menu/index.metadata.json +1 -1
  91. app-ng-runtime/components/navigation/menu/menu-dropdown-item/menu-dropdown-item.component.d.ts +7 -4
  92. app-ng-runtime/components/navigation/menu/menu.component.d.ts +3 -7
  93. app-ng-runtime/components/navigation/popover/bundles/index.umd.js +3 -1
  94. app-ng-runtime/components/navigation/popover/bundles/index.umd.js.map +1 -1
  95. app-ng-runtime/components/navigation/popover/esm2015/popover.component.js +5 -3
  96. app-ng-runtime/components/navigation/popover/fesm2015/index.js +4 -2
  97. app-ng-runtime/components/navigation/popover/fesm2015/index.js.map +1 -1
  98. app-ng-runtime/core/bundles/index.umd.js +7 -1
  99. app-ng-runtime/core/bundles/index.umd.js.map +1 -1
  100. app-ng-runtime/core/esm2015/services/pagination.service.js +8 -2
  101. app-ng-runtime/core/fesm2015/index.js +7 -1
  102. app-ng-runtime/core/fesm2015/index.js.map +1 -1
  103. app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +24 -6
  104. app-ng-runtime/mobile/components/page/default/bundles/index.umd.js.map +1 -1
  105. app-ng-runtime/mobile/components/page/default/esm2015/page.directive.js +20 -3
  106. app-ng-runtime/mobile/components/page/default/fesm2015/index.js +19 -2
  107. app-ng-runtime/mobile/components/page/default/fesm2015/index.js.map +1 -1
  108. app-ng-runtime/mobile/components/page/default/index.metadata.json +1 -1
  109. app-ng-runtime/mobile/components/page/default/page.directive.d.ts +4 -1
  110. app-ng-runtime/package.json +1 -1
  111. app-ng-runtime/scripts/datatable/datatable.js +86 -36
  112. app-ng-runtime/scripts/tree-keyboard-navigation/keyboard-navigation.js +251 -0
  113. app-ng-runtime/variables/bundles/index.umd.js +14 -4
  114. app-ng-runtime/variables/bundles/index.umd.js.map +1 -1
  115. app-ng-runtime/variables/esm2015/manager/action/notification-action.manager.js +5 -6
  116. app-ng-runtime/variables/esm2015/service/variables.service.js +8 -1
  117. app-ng-runtime/variables/fesm2015/index.js +11 -5
  118. app-ng-runtime/variables/fesm2015/index.js.map +1 -1
  119. app-ng-runtime/variables/index.metadata.json +1 -1
  120. app-ng-runtime/variables/service/variables.service.d.ts +4 -0
  121. app-ng-runtime/components/basic/tree/esm2015/tree.directive.js +0 -310
  122. app-ng-runtime/components/basic/tree/tree.directive.d.ts +0 -35
@@ -52,16 +52,21 @@ const findInvalidElement = ($formEle, ngForm) => {
52
52
  };
53
53
  };
54
54
  const ɵ2 = findInvalidElement;
55
- const setTouchedState = ngForm => {
55
+ const setTouchedState = (self, ngForm, fieldName) => {
56
+ var _a, _b;
56
57
  if (ngForm.valid) {
57
58
  return;
58
59
  }
59
60
  if (ngForm.controls) {
60
- _.forEach(ngForm.controls, ctrl => {
61
- setTouchedState(ctrl);
61
+ _.forEach(ngForm.controls, (ctrl, fieldName) => {
62
+ setTouchedState(self, ctrl, fieldName);
62
63
  });
63
64
  }
64
65
  else {
66
+ const element = self.$element.find(`[wmformfield][key="${fieldName}"]`);
67
+ element[0].setAttribute('__errormsg', element[0].getAttribute('__validationId'));
68
+ (_a = element[0].querySelector('input')) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-invalid', ngForm.invalid);
69
+ (_b = element[0].querySelector('input')) === null || _b === void 0 ? void 0 : _b.setAttribute('aria-describedby', element[0].getAttribute('__validationId'));
65
70
  ngForm.markAsTouched();
66
71
  }
67
72
  };
@@ -359,7 +364,7 @@ export class FormComponent extends StylableComponent {
359
364
  }
360
365
  // This method loops through the form fields and highlights the invalid fields by setting state to touched
361
366
  highlightInvalidFields() {
362
- setTouchedState(this.ngform);
367
+ setTouchedState(this, this.ngform, '');
363
368
  }
364
369
  // Disable the form submit if form is in invalid state. Highlight all the invalid fields if validation type is default
365
370
  validateFieldsOnSubmit() {
@@ -1119,4 +1124,4 @@ FormComponent.propDecorators = {
1119
1124
  onKeydownHandler: [{ type: HostListener, args: ['keydown', ['$event'],] }]
1120
1125
  };
1121
1126
  export { ɵ0, ɵ1, ɵ2, ɵ3 };
1122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQWEsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFtQyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaE4sT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQ0gsVUFBVSxFQUNWLGVBQWUsRUFDZixZQUFZLEVBQ1osUUFBUSxFQUNSLFNBQVMsRUFDVCxXQUFXLEVBQ1gsR0FBRyxFQUNILFdBQVcsRUFDWCxRQUFRLEVBQ1IsMkJBQTJCLEVBQzNCLFdBQVcsRUFDWCxVQUFVLEVBQ1YscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixVQUFVLEVBQ1YsZUFBZSxFQUNmLGVBQWUsRUFDZixtQkFBbUIsRUFDdEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbE4sT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJakQsTUFBTSxhQUFhLEdBQUcsRUFBQyxVQUFVLEVBQUUsU0FB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Q3hCLFNBQVMsU0FBQyxlQUFlOzRDQUN6QixTQUFTLFNBQUMsWUFBWTs0Q0FDdEIsU0FBUyxTQUFDLGNBQWM7NENBQ3hCLFNBQVMsU0FBQyxXQUFXOzRDQUNyQixTQUFTLFNBQUMsS0FBSzs0Q0FDZixTQUFTLFNBQUMsTUFBTTs7OzZCQW5LcEIsU0FBUyxTQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO3lCQUNqRSxTQUFTLFNBQUMsZ0JBQWdCOzRCQUUxQixlQUFlLFNBQUMsU0FBUyxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQztxQkE0RzlDLFdBQVcsU0FBQyxRQUFRO3FCQUVwQixZQUFZLFNBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO3NCQUlqQyxZQUFZLFNBQUMsT0FBTzsrQkFJcEIsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0dHJpYnV0ZSwgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbmplY3RvciwgT25EZXN0cm95LCBTa2lwU2VsZiwgT3B0aW9uYWwsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgQ29udGVudENoaWxkcmVuLCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1xuICAgICRhcHBEaWdlc3QsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldFZhbGlkSlNPTixcbiAgICBnZXRGaWxlcyxcbiAgICBpc0RlZmluZWQsXG4gICAgcmVtb3ZlQ2xhc3MsXG4gICAgQXBwLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIGRlYm91bmNlLFxuICAgIER5bmFtaWNDb21wb25lbnRSZWZQcm92aWRlcixcbiAgICBleHRlbmRQcm90byxcbiAgICBEYXRhU291cmNlLFxuICAgIEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICBEYXRhVHlwZSxcbiAgICByZW1vdmVBdHRyLFxuICAgICRpbnZva2VXYXRjaGVycyxcbiAgICBzY3JvbGxUb0VsZW1lbnQsXG4gICAgaXNFbGVtZW50SW5WaWV3cG9ydFxufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQgeyBnZXRGaWVsZExheW91dENvbmZpZywgcGFyc2VWYWx1ZUJ5VHlwZSwgTWVzc2FnZUNvbXBvbmVudCwgUGFydGlhbERpcmVjdGl2ZSwgcGVyZm9ybURhdGFPcGVyYXRpb24sIHByb3ZpZGVBc1dpZGdldFJlZiwgU3R5bGFibGVDb21wb25lbnQsIHN0eWxlciwgV2lkZ2V0UmVmLCBMaXZlX09wZXJhdGlvbnMgfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcbmltcG9ydCB7IFByZWZhYkRpcmVjdGl2ZSB9IGZyb20gJ0B3bS9jb21wb25lbnRzL3ByZWZhYic7XG5pbXBvcnQgeyBMaXN0Q29tcG9uZW50IH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvZGF0YS9saXN0JztcblxuaW1wb3J0IHsgcmVnaXN0ZXJGb3JtUHJvcHMgfSBmcm9tICcuL2Zvcm0ucHJvcHMnO1xuXG5kZWNsYXJlIGNvbnN0IF87XG5cbmNvbnN0IFdJREdFVF9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWZvcm0nLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWZvcm0nfTtcbmNvbnN0IExPR0lOX0ZPUk1fQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1mb3JtJywgaG9zdENsYXNzOiAnYXBwLWZvcm0gYXBwLWxvZ2luLWZvcm0nfTtcbmNvbnN0IExJVkVfRk9STV9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWxpdmVmb3JtJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1saXZlZm9ybSBsaXZlZm9ybS1pbmxpbmUnfTtcbmNvbnN0IExJVkVfRklMVEVSX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tbGl2ZWZpbHRlcicsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtbGl2ZWZpbHRlciBjbGVhcmZpeCBsaXZlZm9ybS1pbmxpbmUnfTtcblxuY29uc3QgZ2V0V2lkZ2V0Q29uZmlnID0gKGlzTGl2ZUZvcm0sIGlzTGl2ZUZpbHRlciwgcm9sZSkgPT4ge1xuICAgIGxldCBjb25maWcgPSBXSURHRVRfQ09ORklHO1xuICAgIGlmIChpc0xpdmVGb3JtICE9PSBudWxsKSB7XG4gICAgICAgIGNvbmZpZyA9IExJVkVfRk9STV9DT05GSUc7XG4gICAgfSBlbHNlIGlmIChpc0xpdmVGaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgY29uZmlnID0gTElWRV9GSUxURVJfQ09ORklHO1xuICAgIH0gZWxzZSBpZiAocm9sZSA9PT0gJ2FwcC1sb2dpbicpIHtcbiAgICAgICAgY29uZmlnID0gTE9HSU5fRk9STV9DT05GSUc7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuXG4vLyBHZW5lcmF0ZSB0aGUgZm9ybSBmaWVsZCB3aXRoIGdpdmVuIGZpZWxkIGRlZmluaXRpb24uIEFkZCBhIGdyaWQgY29sdW1uIHdyYXBwZXIgYXJvdW5kIHRoZSBmb3JtIGZpZWxkLlxuY29uc3Qgc2V0TWFya3VwRm9yRm9ybUZpZWxkID0gKGZpZWxkLCBjb2x1bW5XaWR0aCkgPT4gIHtcbiAgICBsZXQgcHJvcHNUbXBsID0gJyc7XG4gICAgXy5mb3JFYWNoKGZpZWxkLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBwcm9wc1RtcGwgPSBgJHtwcm9wc1RtcGx9ICR7a2V5fT1cIiR7dmFsdWV9XCJgO1xuICAgIH0pO1xuICAgIHJldHVybiBgPHdtLWdyaWRjb2x1bW4gY29sdW1ud2lkdGg9XCIke2NvbHVtbldpZHRofVwiPlxuICAgICAgICAgICAgICAgICAgPHdtLWZvcm0tZmllbGQgJHtwcm9wc1RtcGx9Pjwvd20tZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvd20tZ3JpZGNvbHVtbj5gO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gZmluZCBvdXQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBpbiBmb3JtXG5jb25zdCBmaW5kSW52YWxpZEVsZW1lbnQgPSAoJGZvcm1FbGUsIG5nRm9ybSkgPT4ge1xuICAgIGNvbnN0ICRlbGUgPSAkZm9ybUVsZS5maW5kKCdmb3JtLm5nLWludmFsaWQ6dmlzaWJsZSwgW2Zvcm1Db250cm9sTmFtZV0ubmctaW52YWxpZDp2aXNpYmxlJykuZmlyc3QoKTtcbiAgICBsZXQgZm9ybU9iaiA9IG5nRm9ybTtcbiAgICAvLyBJZiBlbGVtZW50IGlzIGZvcm0sIGZpbmQgb3V0IHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgaW4gdGhpcyBmb3JtXG4gICAgaWYgKCRlbGUuaXMoJ2Zvcm0nKSkge1xuICAgICAgICBmb3JtT2JqID0gbmdGb3JtICYmIG5nRm9ybS5jb250cm9sc1skZWxlLmF0dHIoJ2Zvcm1Db250cm9sTmFtZScpIHx8ICRlbGUuYXR0cignbmFtZScpXTtcbiAgICAgICAgaWYgKGZvcm1PYmopIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5kSW52YWxpZEVsZW1lbnQoJGVsZSwgZm9ybU9iaik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmdGb3JtOiBmb3JtT2JqLFxuICAgICAgICAkZWxlOiAkZWxlXG4gICAgfTtcbn07XG5cbmNvbnN0IHNldFRvdWNoZWRTdGF0ZSA9IG5nRm9ybSA9PiB7XG4gICAgaWYgKG5nRm9ybS52YWxpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuZ0Zvcm0uY29udHJvbHMpIHtcbiAgICAgICAgXy5mb3JFYWNoKG5nRm9ybS5jb250cm9scywgY3RybCA9PiB7XG4gICAgICAgICAgICBzZXRUb3VjaGVkU3RhdGUoY3RybCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG5nRm9ybS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmb3JtW3dtRm9ybV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKEZvcm1Db21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIHN0YXRpYyAgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJGb3JtUHJvcHMoKTtcbiAgICBAVmlld0NoaWxkKCdkeW5hbWljRm9ybScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGR5bmFtaWNGb3JtUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuICAgIEBWaWV3Q2hpbGQoTWVzc2FnZUNvbXBvbmVudCkgbWVzc2FnZVJlZjtcbiAgICAvLyB0aGlzIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCByZWZzIGluc2lkZSB0aGUgZm9ybS1ncm91cFxuICAgIEBDb250ZW50Q2hpbGRyZW4oV2lkZ2V0UmVmLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBjb21wb25lbnRSZWZzO1xuXG4gICAgYXV0b3VwZGF0ZTtcbiAgICBwdWJsaWMgZm9ybWxheW91dDogYW55O1xuICAgIHB1YmxpYyBpc0RhdGFTb3VyY2VVcGRhdGVkOiBib29sZWFuO1xuICAgIGNhcHRpb25BbGlnbkNsYXNzOiBzdHJpbmc7XG4gICAgdmFsaWRhdGlvbnR5cGU6IHN0cmluZztcbiAgICBjYXB0aW9uYWxpZ246IHN0cmluZztcbiAgICBjYXB0aW9ucG9zaXRpb246IHN0cmluZztcbiAgICBjYXB0aW9uc2l6ZTtcbiAgICBjb2xsYXBzaWJsZTogYm9vbGVhbjtcbiAgICBleHBhbmRlZDogYm9vbGVhbjtcbiAgICBlbFNjb3BlO1xuICAgIF93aWRnZXRDbGFzcyA9ICcnO1xuICAgIGNhcHRpb253aWR0aDogc3RyaW5nO1xuICAgIF9jYXB0aW9uQ2xhc3MgPSAnJztcbiAgICBuZ2Zvcm06IEZvcm1Hcm91cDtcbiAgICBmb3JtRmllbGRzID0gW107XG4gICAgZm9ybWZpZWxkcyA9IHt9O1xuICAgIGZvcm1XaWRnZXRzID0ge307XG4gICAgZmlsdGVyV2lkZ2V0cyA9IHt9O1xuICAgIGJ1dHRvbkFycmF5ID0gW107XG4gICAgZGF0YW91dHB1dCA9IHt9O1xuICAgIGRhdGFzb3VyY2U7XG4gICAgZm9ybWRhdGFzb3VyY2U7XG4gICAgZm9ybWRhdGEgPSB7fTtcbiAgICBpc1NlbGVjdGVkO1xuICAgIHByZXZEYXRhVmFsdWVzO1xuICAgIHByZXZEYXRhT2JqZWN0O1xuICAgIHByZXZmb3JtRmllbGRzO1xuICAgIHN0YXR1c01lc3NhZ2UgPSB7XG4gICAgICAgIGNhcHRpb246ICcnLFxuICAgICAgICB0eXBlOiAnJ1xuICAgIH07XG4gICAgbWVzc2FnZWxheW91dDtcbiAgICBtZXRhZGF0YTtcbiAgICBlcnJvcm1lc3NhZ2U7XG4gICAgb25FcnJvcjtcbiAgICBvblN1Y2Nlc3M7XG4gICAgcHJpbWFyeUtleSA9IFtdO1xuICAgIHBvc3RtZXNzYWdlO1xuICAgIF9saXZlVGFibGVQYXJlbnQ7XG4gICAgdXBkYXRlTW9kZTtcbiAgICBuYW1lO1xuICAgIC8vIExpdmUgRm9ybSBNZXRob2RzXG4gICAgY2xlYXJEYXRhOiBGdW5jdGlvbjtcbiAgICBjYW5jZWw6IEZ1bmN0aW9uO1xuICAgIGRlbGV0ZTogRnVuY3Rpb247XG4gICAgc2F2ZTogRnVuY3Rpb247XG4gICAgc2F2ZUFuZE5ldzogRnVuY3Rpb247XG4gICAgc2F2ZUFuZFZpZXc6IEZ1bmN0aW9uO1xuICAgIHNldFByaW1hcnlLZXk6ICgpID0+IHt9O1xuICAgIGRpYWxvZ0lkOiBzdHJpbmc7XG4gICAgLy8gTGl2ZSBGaWx0ZXJcbiAgICBlbmFibGVlbXB0eWZpbHRlcjtcbiAgICBwYWdlc2l6ZTtcbiAgICByZXN1bHQ7XG4gICAgcGFnaW5hdGlvbjtcbiAgICBjbGVhckZpbHRlcjogRnVuY3Rpb247XG4gICAgYXBwbHlGaWx0ZXI6IEZ1bmN0aW9uO1xuICAgIGZpbHRlcjogRnVuY3Rpb247XG4gICAgZmlsdGVyT25EZWZhdWx0OiBGdW5jdGlvbjtcbiAgICBvbk1heERlZmF1bHRWYWx1ZUNoYW5nZTogRnVuY3Rpb247XG4gICAgbnVtYmVyT2ZGaWVsZHM6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX2RlYm91bmNlZFVwZGF0ZUZpZWxkU291cmNlOiBGdW5jdGlvbiA9IF8uZGVib3VuY2UodGhpcy51cGRhdGVGaWVsZFNvdXJjZSwgMzUwKTtcbiAgICBwcml2YXRlIG9wZXJhdGlvblR5cGU7XG4gICAgcHJpdmF0ZSBfaXNMYXlvdXREaWFsb2c7XG4gICAgcHJpdmF0ZSBfZHluYW1pY0NvbnRleHQ7XG4gICAgcHJpdmF0ZSBfaXNHcmlkTGF5b3V0UHJlc2VudDtcbiAgICBwcml2YXRlIHZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgIHByaXZhdGUgZm9ybUdyb3VwTmFtZTtcbiAgICBwcml2YXRlIGZvcm1BcnJheUluZGV4O1xuICAgIHByaXZhdGUgYmluZGluZ1ZhbHVlO1xuICAgIHByaXZhdGUgX2Zvcm1Jc0luTGlzdDtcbiAgICBwcml2YXRlIF90cmlnZ2VyZWRCeVVzZXI6IGJvb2xlYW47XG5cblxuICAgIHByaXZhdGUgX2RlYm91bmNlZFN1Ym1pdEZvcm0gPSBkZWJvdW5jZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIGNhbGxpbmcgc3VibWl0IGV2ZW50IGluIG5nWm9uZSBhcyBjaGFuZ2UgZGV0ZWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgcG9zdCB0aGUgc3VibWl0IGNhbGxiYWNrIGFuZCBhY3Rpb25zIGxpa2Ugbm90aWZpY2F0aW9uIGFyZSBub3Qgc2hvd25cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0Rm9ybSgkZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9LCAyNTApO1xuXG4gICAgc2V0IGlzTGF5b3V0RGlhbG9nKG52KSB7XG4gICAgICAgIGlmIChudikge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCAncGFuZWwgYXBwLXBhbmVsIGxpdmVmb3JtLWlubGluZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzTGF5b3V0RGlhbG9nID0gbnY7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGF5b3V0RGlhbG9nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMYXlvdXREaWFsb2c7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNVcGRhdGVNb2RlO1xuICAgIHNldCBpc1VwZGF0ZU1vZGUobnYpIHtcbiAgICAgICAgdGhpcy5faXNVcGRhdGVNb2RlID0gbnY7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGZpZWxkLnNldFJlYWRPbmx5U3RhdGUobnYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgaXNVcGRhdGVNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVcGRhdGVNb2RlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYWN0aW9uJykgYWN0aW9uOiBzdHJpbmc7XG5cbiAgICBASG9zdExpc3RlbmVyKCdzdWJtaXQnLCBbJyRldmVudCddKSBzdWJtaXQoJGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFN1Ym1pdEZvcm0oJGV2ZW50KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdyZXNldCcpIG9uUmVzZXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWRCeVVzZXIgPSB0cnVlO1xuICAgIH1cbiAgICAvLyByZXR1cm5zIHRoZSBmb3JtQXJyYXkgY29udHJvbCBvbiB0aGUgcGFyZW50Rm9ybS5cbiAgICBnZXQgcGFyZW50Rm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5nZXQodGhpcy5wYXJlbnRMaXN0Lm5hbWUpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRydWUgb25seSB3aGVuIGNsb3Nlc3QgbGl2ZWxpc3QgaXMgdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhlIGZvcm0uXG4gICAgLy8gY2hlY2tzIGZvciBsaXZlbGlzdCBoYXZpbmcgYW55IGZvcm0gZWxlbWVudHMgd2l0aCBwYXJlbnRGb3JtIG5hbWUuXG4gICAgLy8gSWYgbGl2ZWxpc3QgaXMgbm90IGNvbnRhaW5pbmcgYW55IHBhcmVudEZvcm0gZWxlbWVudHMgdGhlbiBpdCByZXR1cm5zIHRydWUuXG4gICAgZ2V0IGlzUGFyZW50TGlzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0gJiYgIWlzRGVmaW5lZCh0aGlzLl9mb3JtSXNJbkxpc3QpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRWxlID0gdGhpcy4kZWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RFbGUgPSBmb3JtRWxlLmNsb3Nlc3QoJy5hcHAtbGl2ZWxpc3RbbmFtZT1cIicgKyB0aGlzLnBhcmVudExpc3QubmFtZSArICdcIl0nKTtcbiAgICAgICAgICAgIGlmIChsaXN0RWxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1Jc0luTGlzdCA9ICEobGlzdEVsZS5maW5kKCdmb3JtW3dpZGdldC1pZD1cIicgKyB0aGlzLnBhcmVudEZvcm0ud2lkZ2V0SWQgKyAnXCJdJykpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNEZWZpbmVkKHRoaXMuX2Zvcm1Jc0luTGlzdCkgPyB0aGlzLl9mb3JtSXNJbkxpc3QgOiB0aGlzLnBhcmVudExpc3Q7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIGFwcDogQXBwLFxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50UHJvdmlkZXI6IER5bmFtaWNDb21wb25lbnRSZWZQcm92aWRlcixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudExpc3Q6IExpc3RDb21wb25lbnQsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRGb3JtOiBGb3JtQ29tcG9uZW50LFxuICAgICAgICBAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50UHJlZmFiOiBQcmVmYWJEaXJlY3RpdmUsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRQYXJ0aWFsOiBQYXJ0aWFsRGlyZWN0aXZlLFxuICAgICAgICBAQXR0cmlidXRlKCdiZWZvcmVzdWJtaXQuZXZlbnQnKSBwdWJsaWMgb25CZWZvcmVTdWJtaXRFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3N1Ym1pdC5ldmVudCcpIHB1YmxpYyBvblN1Ym1pdEV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnYmVmb3JlcmVuZGVyLmV2ZW50JykgcHVibGljIG9uQmVmb3JlUmVuZGVyRXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBwdWJsaWMgYmluZGRhdGFzZXQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2Zvcm1kYXRhLmJpbmQnKSBwcml2YXRlIGJpbmRmb3JtZGF0YSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnd21MaXZlRm9ybScpIGlzTGl2ZUZvcm0sXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3dtTGl2ZUZpbHRlcicpIGlzTGl2ZUZpbHRlcixcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YS1yb2xlJykgcm9sZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgna2V5Jykga2V5LFxuICAgICAgICBAQXR0cmlidXRlKCduYW1lJykgbmFtZVxuICAgICkge1xuICAgICAgICBzdXBlcihpbmosIGdldFdpZGdldENvbmZpZyhpc0xpdmVGb3JtLCBpc0xpdmVGaWx0ZXIsIHJvbGUpKTtcblxuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzKTtcblxuICAgICAgICAvLyByZW1vdmUgdGl0bGUgcHJvcGVydHkgYXMgYXR0cmlidXRlIGFzIGl0IGlzIGNhdXNpbmcgdW5uZWNlc3NhcnkgdG9vbHRpcFxuICAgICAgICByZW1vdmVBdHRyKHRoaXMubmF0aXZlRWxlbWVudCwgJ3RpdGxlJyk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaWFsb2dJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpYWxvZ0lkJyk7XG4gICAgICAgIHRoaXMubmdmb3JtID0gZmIuZ3JvdXAoe30pO1xuICAgICAgICB0aGlzLmJpbmRpbmdWYWx1ZSA9IGtleSB8fCBuYW1lO1xuXG4gICAgICAgIC8vIE9uIHZhbHVlIGNoYW5nZSBpbiBmb3JtLCB1cGRhdGUgdGhlIGRhdGFvdXRwdXRcbiAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiA9ICB0aGlzLm5nZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy51cGRhdGVEYXRhT3V0cHV0LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKCgpID0+IG9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuZWxTY29wZSA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5hZGRFdmVudHNUb0NvbnRleHQodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZnMuZm9yRWFjaChjb21wb25lbnRSZWYgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRSZWYubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB3aWRnZXRzIGluc2lkZSBmb3JtIHdpdGggZm9ybVdpZGdldHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtV2lkZ2V0c1tjb21wb25lbnRSZWYubmFtZV0gPSBjb21wb25lbnRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDI1MCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0gJiYgdGhpcy5pc1BhcmVudExpc3QpIHtcbiAgICAgICAgICAgIC8vIHNldHRpbmcgZm9ybUFycmF5IGNvbnRyb2wgb24gbmdmb3JtLlxuICAgICAgICAgICAgaWYgKCFfLmdldCh0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmNvbnRyb2xzLCB0aGlzLnBhcmVudExpc3QubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnNldENvbnRyb2wodGhpcy5wYXJlbnRMaXN0Lm5hbWUsIG5ldyBGb3JtQXJyYXkoW10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHB1c2hpbmcgdGhlIG5nZm9ybSB0byBmb3JtQXJyYXkuXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm1BcnJheS5wdXNoKHRoaXMubmdmb3JtKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUFycmF5SW5kZXggPSB0aGlzLnBhcmVudEZvcm1BcnJheS5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSW5uZXJOZ0Zvcm1Ub0Zvcm0odGhpcy5iaW5kaW5nVmFsdWUpO1xuICAgIH1cblxuICAgIGZpbmRPcGVyYXRpb25UeXBlKCkge31cblxuICAgIHByaXZhdGUgYWRkSW5uZXJOZ0Zvcm1Ub0Zvcm0oYmluZGluZykge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIC8vIGhhbmRsaW5nIGFzIGZvcm1BcnJheSB3aGVuIHBhcmVudCBpcyBsaXN0LiBIZW5jZSByZXR1cm5pbmcgaGVyZSBmcm9tIGFkZGluZyB0byBwYXJlbnRGb3JtIGFnYWluLlxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXNzaWduaW5nIHRoZSBjb250cm9sIG5hbWUgb2YgdGhlIGZvcm0gaW5zaWRlIHRoZSBwcmVmYWIgd2l0aCB0aGUgcHJlZmFiIG5hbWUuXG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIG9ubHkgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBmb3JtIGluc2lkZSBwcmVmYWIuXG4gICAgICAgICAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGlzIHdoZW4gbXVsdGlwbGUgZm9ybXMgYXJlIGluc2lkZSBwcmVmYWIuXG4gICAgICAgICAgICAvLyBUaGlzIHNjZW5hcmlvIGhhcyB0byBiZSBoYW5kbGVkIGJ5IGVuZCB1c2VyIGJ5IGNoYW5naW5nIGZvcm0gbmFtZXMgaW4gcHJlZmFiIGFjY29yZGluZyB0byB0aGUgZGF0YW1vZGVsIGJpbmRpbmcuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb250YWluZXIgPSB0aGlzLnBhcmVudFByZWZhYiB8fCB0aGlzLnBhcmVudFBhcnRpYWw7XG4gICAgICAgICAgICBpZiAocGFyZW50Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudENvbnRlbnRFbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRQcmVmYWIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGVudEVsID0gcGFyZW50Q29udGFpbmVyLiRlbGVtZW50LmZpbmQoJ1t3bXByZWZhYmNvbnRhaW5lcl0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZW50RWwgPSBwYXJlbnRDb250YWluZXIuJGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGFzc2lnbmluZyB0aGUgZm9ybSBuYW1lIHRvIHRoZSBwYXJlbnRDb250YWluZXIgbmFtZSBpLmUuIHBhcnRpYWwgbmFtZSBvciBwZXJmYWIgbmFtZSBieSBmb2xsb3dpbmdcbiAgICAgICAgICAgICAgICAgKiAxLiByZXRyaWV2aW5nIGFsbCB0aGUgZm9ybXMgaW4gdGhlIHBhcmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAqIDIuIGNvbnNpZGVyIHRoZSBmaXJzdCBmb3JtXG4gICAgICAgICAgICAgICAgICogMy4gaWYgdGhpcyBmb3JtIGlzIGluc2lkZSBsaXN0IGkuZS4gYWxzbyBmaW5kIGlmIHRoaXMgbGlzdCBpcyBhbHNvIGluc2lkZSB0aGUgcGFyZW50Q29udGFpbmVyIChwcmVmYWIgLyBwYXJ0aWFsKVxuICAgICAgICAgICAgICAgICAqIDQuIHRoZW4gZG8gbm90IGNoYW5nZSB0aGUgZm9ybSBuYW1lIHdoZW4gZm9ybSBpcyBpbnNpZGUgbGlzdCBhbmQgYWxzbyB3aGVuIHRoZXJlIGFyZSBzaWJsaW5ncyB0byB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAqIDUuIHRoaXMgbWVhbnMgZm9ybSBuYW1lIGNoYW5nZSBhcHBsaWVzIG9ubHkgd2hlbiB0aGVyZSBpcyBzaW5nbGUgZm9ybSAoaW1tZWRpYXRlIGNoaWxkKSBpbnNpZGUgdGhlIHBhcmVudENvbnRhaW5lci5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmYWJJbm5lckZvcm0gPSBwYXJlbnRDb250ZW50RWwuZmluZCgnZm9ybScpLmZpcnN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKF8uZ2V0KHByZWZhYklubmVyRm9ybVswXSwgJ3dpZGdldC53aWRnZXRJZCcpID09PSB0aGlzLndpZGdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgZm9ybSBpbnNpZGUgcHJlZmFiIGNvbnRhaW5lciBpcyBpbnNpZGUgdGhlIGxpc3QuIElmIHRydWUsIGRvIG5vdCBjaGFuZ2UgdGhlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJlZmFiSW5uZXJGb3JtLmlzUGFyZW50TGlzdCAmJiAhcHJlZmFiSW5uZXJGb3JtLnNpYmxpbmdzKCdmb3JtJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nID0gXy5nZXQocGFyZW50Q29udGFpbmVyLCAnbmFtZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgICAgICAgICAgbGV0IGlubmVyQmluZGluZyA9IGJpbmRpbmc7XG4gICAgICAgICAgICAvLyBJbm5lciBmb3JtcyBtYXkgaGF2ZSBzYW1lIG5hbWVzLiBJZiBzYW1lIG5hbWUgaXMgcHJlc2VudCwgYXBwZW5kIHVucWl1ZSBpZGVudGlmaWVyXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShpbm5lckJpbmRpbmcpKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJCaW5kaW5nID0gYCR7YmluZGluZ31fJHtjb3VudGVyfWA7XG4gICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBOYW1lID0gaW5uZXJCaW5kaW5nO1xuICAgICAgICAgICAgLy8gSWYgcGFyZW50IGZvcm0gaXMgcHJlc2VudCwgYWRkIHRoZSBjdXJyZW50IGZvcm0gYXMgYXMgZm9ybUdyb3VwIGZvciBwYXJlbnQgZm9ybVxuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5hZGRDb250cm9sKGlubmVyQmluZGluZywgdGhpcy5uZ2Zvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIHRoZSBldmVudHMgb24gY29udGV4dCBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGZvcm0gYWN0aW9uc1xuICAgIHByaXZhdGUgYWRkRXZlbnRzVG9Db250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC5jYW5jZWwgPSAoKSA9PiB0aGlzLmNhbmNlbCgpO1xuICAgICAgICBjb250ZXh0LnJlc2V0ID0gKCkgPT4gdGhpcy5yZXNldCgpO1xuICAgICAgICBjb250ZXh0LnNhdmUgPSBldnQgPT4gdGhpcy5zYXZlKGV2dCk7XG4gICAgICAgIGNvbnRleHQuc2F2ZUFuZE5ldyA9ICgpID0+IHRoaXMuc2F2ZUFuZE5ldygpO1xuICAgICAgICBjb250ZXh0LnNhdmVBbmRWaWV3ID0gKCkgPT4gdGhpcy5zYXZlQW5kVmlldygpO1xuICAgICAgICBjb250ZXh0LmRlbGV0ZSA9ICgpID0+IHRoaXMuZGVsZXRlKCk7XG4gICAgICAgIGNvbnRleHQubmV3ID0gKCkgPT4gdGhpcy5uZXcoKTtcbiAgICAgICAgY29udGV4dC5lZGl0ID0gKCkgPT4gdGhpcy5lZGl0KCk7XG4gICAgICAgIGNvbnRleHQuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcyA9ICgpID0+IHRoaXMuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpO1xuICAgICAgICBjb250ZXh0LmZpbHRlciA9ICgpID0+IHRoaXMuZmlsdGVyKCk7XG4gICAgICAgIGNvbnRleHQuY2xlYXJGaWx0ZXIgPSAoKSA9PiB0aGlzLmNsZWFyRmlsdGVyKCk7XG4gICAgICAgIGNvbnRleHQuc3VibWl0ID0gZXZ0ID0+IHRoaXMuc3VibWl0KGV2dCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBhbGwgdGhlIGlubmVyIGZvcm1zIGFuZCB2YWxpZGF0ZXMgZWFjaCBmb3JtLlxuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk9uSW5uZXJGb3Jtcyh2YWxpZGF0ZVRvdWNoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1FbGUgPSB0aGlzLmdldE5hdGl2ZUVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgZm9ybU9ianMgPSBmb3JtRWxlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hcHAtZm9ybScpO1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uTXNncyA9IFtdO1xuICAgICAgICBfLmZvckVhY2goZm9ybU9ianMsIGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybUluc3RhbmNlID0gKGUgYXMgYW55KS53aWRnZXQ7XG4gICAgICAgICAgICAvLyBkaWZmZXJlbnRpYXRpbmcgdGhlIHZhbGlkYXRpb25NZXNzYWdlcyBwcmVmaXggYmFzZWQgb24gdGhlIGZvcm1Hcm91cE5hbWVcbiAgICAgICAgICAgIC8vIGFzIHRoZSBmb3JtTmFtZSdzIGFyZSBzYW1lIHdoZW4gZm9ybXMgYXJlIGluIGxpc3RcbiAgICAgICAgICAgIGxldCBmb3JtTmFtZSA9IF8uZ2V0KGZvcm1JbnN0YW5jZSwgJ2Zvcm1Hcm91cE5hbWUnKSB8fCBmb3JtSW5zdGFuY2UubmFtZTtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZm9ybUluc3RhbmNlLmZvcm1BcnJheUluZGV4KSkge1xuICAgICAgICAgICAgICAgIGZvcm1OYW1lID0gZm9ybU5hbWUgKyAnWycgKyBmb3JtSW5zdGFuY2UuZm9ybUFycmF5SW5kZXggKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGZvcm1JbnN0YW5jZTtcbiAgICAgICAgICAgIHdoaWxlIChfLmdldChjdXJyZW50LCAncGFyZW50Rm9ybScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudE5hbWUgPSBjdXJyZW50LnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSB8fCBjdXJyZW50LnBhcmVudEZvcm0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wYXJlbnRGb3JtLnBhcmVudEZvcm1BcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50TmFtZSArICdbJyArIGN1cnJlbnQucGFyZW50Rm9ybS5mb3JtQXJyYXlJbmRleCArICddJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybU5hbWUgPSBwYXJlbnROYW1lICsgJy4nICsgZm9ybU5hbWU7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Rm9ybTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk9uRmllbGRzKGZvcm1JbnN0YW5jZSwgZm9ybU5hbWUsIHZhbGlkYXRlVG91Y2gpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHZhbGlkYXRpb24gb24gZm9ybUZpZWxkcy5cbiAgICAgKiBBcHBsaWVzIHRvIGlubmVyZm9ybSBhbmQgYWxzbyBzZXRzIGlubmVyZm9ybSB2YWxpZGF0aW9uIG9uIHBhcmVudCBmb3JtLlxuICAgICAqIEBwYXJhbSBwcmVmaXggY29udGFpbnMgdGhlIGZvcm0gbmFtZSwgd2hpY2ggYWxzbyBpbmNsdWRlcyBpdHMgcGFyZW50cyBmb3JtIG5hbWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlVG91Y2hcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25PbkZpZWxkcyhmb3JtOiBGb3JtQ29tcG9uZW50LCBwcmVmaXg6IHN0cmluZywgdmFsaWRhdGVUb3VjaD86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbHMgPSBmb3JtLm5nZm9ybS5jb250cm9scztcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IGZvcm0uZm9ybUZpZWxkcztcbiAgICAgICAgaWYgKCFmb3JtRmllbGRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXy5mb3JFYWNoKGNvbnRyb2xzLCAodiwgaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmb3JtRmllbGRzLmZpbmQoZSA9PiBlLmtleSA9PT0gayk7XG4gICAgICAgICAgICBpZiAoIWZpZWxkIHx8ICh2YWxpZGF0ZVRvdWNoICYmICF2LnRvdWNoZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpPy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsIHYuaW52YWxpZCk7XG4gICAgICAgICAgICAvLyBpbnZva2luZyB0aGUgcHJlcGFyZVZhbGlkYXRpb24gb24gYm90aCBwYXJlbnQgZm9ybSBhbmQgY3VycmVudCBmb3JtLlxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlVmFsaWRhdGlvbk9iaih2LCBrLCBmaWVsZCwgcHJlZml4KTtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVZhbGlkYXRpb25PYmouY2FsbChmb3JtLCB2LCBrLCBmaWVsZCwgcHJlZml4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXNzaWducyAvIHVwZGF0ZXMgdmFsaWRhdGlvbk1lc3NhZ2VzIGJhc2VkIG9uIGFuZ3VsYXIgZXJyb3JzIG9uIGZpZWxkXG4gICAgcHJpdmF0ZSBwcmVwYXJlVmFsaWRhdGlvbk9iaih2LCBrLCBmaWVsZCwgcHJlZml4KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMuZmluZEluZGV4KGUgPT4gKGUuZmllbGQgPT09IGsgJiYgZS5mdWxseVF1YWxpZmllZEZvcm1OYW1lID09PSBwcmVmaXgpKTtcbiAgICAgICAgaWYgKHYuaW52YWxpZCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGZpZWxkIGNvbnRhaW5zIHRoZSBmaWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgKiB2YWx1ZSBjb250YWlucyB0aGUgZmllbGQgdmFsdWVcbiAgICAgICAgICAgICAgICAgKiBlcnJvclR5cGUgY29udGFpbnMgdGhlIGxpc3Qgb2YgZXJyb3JzXG4gICAgICAgICAgICAgICAgICogbWVzc2FnZSBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICogZ2V0RWxlbWVudCByZXR1cm5zIHRoZSBlbGVtZW50IGhhdmluZyBmb2N1cy10YXJnZXRcbiAgICAgICAgICAgICAgICAgKiBmb3JtTmFtZSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBrLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZTogXy5rZXlzKHYuZXJyb3JzKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmllbGQudmFsaWRhdGlvbm1lc3NhZ2UgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC4kZWxlbWVudC5maW5kKCdbZm9jdXMtdGFyZ2V0XScpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZTogXy5sYXN0KHByZWZpeC5zcGxpdCgnLicpKSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRGb3JtTmFtZTogcHJlZml4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzW2luZGV4XS52YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzW2luZGV4XS5lcnJvclR5cGUgPSBfLmtleXModi5lcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHYudmFsaWQgJiYgaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gYSBvYmplY3QgY29udGFpbmluZyB0aGUgZXJyb3IgZGV0YWlscyBmcm9tIHRoZSBsaXN0IG9mIGZvcm1GaWVsZHMgdGhhdCBhcmUgaW52YWxpZFxuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk1zZ3ModmFsaWRhdGVUb3VjaD86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1GaWVsZHMubGVuZ3RoICYmIF8uaXNFbXB0eSh0aGlzLm5nZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbkZpZWxkcyh0aGlzLCB0aGlzLm5hbWUsIHZhbGlkYXRlVG91Y2gpO1xuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbklubmVyRm9ybXModmFsaWRhdGVUb3VjaCk7XG4gICAgfVxuXG4gICAgLy8gY2hhbmdlIGFuZCBibHVyIGV2ZW50cyBhcmUgYWRkZWQgZnJvbSB0aGUgdGVtcGxhdGVcbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXZlbnQobm9kZTogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24sIGxvY2FsczogYW55KSB7XG4gICAgICAgIGlmIChldmVudE5hbWUgIT09ICdzdWJtaXQnKSB7XG4gICAgICAgICAgICBzdXBlci5oYW5kbGVFdmVudCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIGxvY2Fscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZpZWxkU291cmNlKCkge1xuICAgICAgICBpZiAodGhpcy5mb3JtZGF0YXNvdXJjZSAmJiB0aGlzLmZvcm1kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWRhdGFzb3VyY2UgJiYgIXRoaXMuZm9ybWRhdGFzb3VyY2UudHdvV2F5QmluZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZvcm1GaWVsZCA9PiB7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnZGF0YXZhbHVlc291cmNlJywgdGhpcy5mb3JtZGF0YXNvdXJjZSk7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnYmluZGRhdGF2YWx1ZScsIGAke3RoaXMuYmluZGZvcm1kYXRhfS4ke2Zvcm1GaWVsZC5rZXl9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGxvb3BzIHRocm91Z2ggdGhlIGZvcm0gZmllbGRzIGFuZCBoaWdobGlnaHRzIHRoZSBpbnZhbGlkIGZpZWxkcyBieSBzZXR0aW5nIHN0YXRlIHRvIHRvdWNoZWRcbiAgICBoaWdobGlnaHRJbnZhbGlkRmllbGRzKCkge1xuICAgICAgICBzZXRUb3VjaGVkU3RhdGUodGhpcy5uZ2Zvcm0pO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS4gSGlnaGxpZ2h0IGFsbCB0aGUgaW52YWxpZCBmaWVsZHMgaWYgdmFsaWRhdGlvbiB0eXBlIGlzIGRlZmF1bHRcbiAgICB2YWxpZGF0ZUZpZWxkc09uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25Nc2dzKCk7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS4gRm9yIGRlbGV0ZSBvcGVyYXRpb24sIGRvIG5vdCBjaGVjayB0aGUgdmFsaWRhdGlvbi5cbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uVHlwZSAhPT0gJ2RlbGV0ZScgJiYgKHRoaXMudmFsaWRhdGlvbnR5cGUgPT09ICdodG1sJyB8fCB0aGlzLnZhbGlkYXRpb250eXBlID09PSAnZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5uZ2Zvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb250eXBlID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgdW50b2NoZWQgZWxlbWVudCBhbmQgc2V0IGl0IHRvIHRvdWNoZWQuXG4gICAgICAgICAgICAgICAgLy8gU2FmYXJpIGRvZXMgbm90IGZvcm0gdmFsaWRhdGlvbnMuIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCBlcnJvciBpcyBzaG93biBmb3IgdXNlclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZUZvcm0gPSBmaW5kSW52YWxpZEVsZW1lbnQodGhpcy4kZWxlbWVudCwgdGhpcy5uZ2Zvcm0pO1xuICAgICAgICAgICAgICAgIGNvbnN0ICRpbnZhbGlkRm9ybSA9IGVsZUZvcm0ubmdGb3JtO1xuICAgICAgICAgICAgICAgIGxldCAkaW52YWxpZEVsZSAgPSBlbGVGb3JtLiRlbGU7XG4gICAgICAgICAgICAgICAgJGludmFsaWRFbGUgPSAkaW52YWxpZEVsZS5wYXJlbnQoKS5maW5kKCdbZm9jdXMtdGFyZ2V0XScpO1xuICAgICAgICAgICAgICAgIGlmICgkaW52YWxpZEVsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gc2F2ZSBjbGljayBpbiBwYWdlIGxheW91dCBsaXZlZm9ybSwgZm9jdXMgb2YgYXV0b2NvbXBsZXRlIHdpZGdldCBvcGVucyBmdWxsLXNjcmVlbiBzZWFyY2guXG4gICAgICAgICAgICAgICAgICAgIGlmICghJGludmFsaWRFbGUuaGFzQ2xhc3MoJ2FwcC1zZWFyY2gtaW5wdXQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGludmFsaWRFbGUuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZ0VsZSA9ICRpbnZhbGlkRm9ybSAmJiAkaW52YWxpZEZvcm0uY29udHJvbHNbJGludmFsaWRFbGUuYXR0cignZm9ybUNvbnRyb2xOYW1lJykgfHwgJGludmFsaWRFbGUuYXR0cignbmFtZScpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5nRWxlICYmIG5nRWxlLm1hcmtBc1RvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nRWxlLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdj8pIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb25hbGlnbic6XG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uQWxpZ25DbGFzcyA9ICdhbGlnbi0nICsgbnY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9ucG9zaXRpb24nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9ud2lkdGgnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9uc2l6ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uc2l6ZSA9IG52O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbm92YWxpZGF0ZSc6XG4gICAgICAgICAgICAgICAgLy8gIFNldCB2YWxpZGF0aW9uIHR5cGUgYmFzZWQgb24gdGhlIG5vdmFsaWRhdGUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICB0aGlzLndpZGdldC52YWxpZGF0aW9udHlwZSA9IChudiA9PT0gdHJ1ZSB8fCBudiA9PT0gJ3RydWUnKSA/ICdub25lJyA6ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Zvcm1kYXRhJzpcbiAgICAgICAgICAgICAgICAvLyBGb3IgbGl2ZWxpc3Qgd2hlbiBtdWx0aXNlbGVjdCBpcyBlbmFibGVkLCBmb3JtZGF0YSB3aWxsIGJlIGFycmF5IG9mIG9iamVjdHMuIEluIHRoaXMgY2FzZSBjb25zaWRlciB0aGUgbGFzdCBvYmplY3QgYXMgZm9ybWRhdGEuXG4gICAgICAgICAgICAgICAgaWYgKF8uaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfLmlzQXJyYXkobnYpID8gdGhpcy5zZXRGb3JtRGF0YShfLmxhc3QobnYpKSA6IHRoaXMuc2V0Rm9ybURhdGEobnYpO1xuICAgICAgICAgICAgICAgIC8vIGlmIGRhdGFzZXQgb24gdGhlIGZvcm1GaWVsZHMgYXJlIG5vdCBzZXQgYXMgdGhlIGRhdGFzb3VyY2VDaGFuZ2UgaXMgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgZm9ybUZpZWxkcyBhcmUgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNEYXRhU291cmNlVXBkYXRlZCAmJiB0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0bW9kZSc6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGF5b3V0RGlhbG9nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudiAmJiBudiA9PT0gJ0VkaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSB0aGlzLnVwZGF0ZU1vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNvdXJjZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Zvcm1kYXRhc291cmNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybURhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21ldGFkYXRhJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRm9ybUZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNldCc6XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeWluZyB0aGUgZGF0YXNldCBjaGFuZ2UgdG8gdGhlIGZvcm0tZmllbGQgd2lkZ2V0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmlzRGF0YVNldEJvdW5kICYmIF8uZ2V0KGZpZWxkLmZvcm1XaWRnZXQsICdkYXRhc2V0JCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5mb3JtV2lkZ2V0LmRhdGFzZXQkLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV2ZW50IGNhbGxiYWNrcyBvbiBzdWNjZXNzL2Vycm9yXG4gICAgb25SZXN1bHRDYihkYXRhLCBzdGF0dXMsIGV2ZW50Pykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7JGV2ZW50OiBldmVudCwgJGRhdGE6IGRhdGEsICRvcGVyYXRpb246IHRoaXMub3BlcmF0aW9uVHlwZX07XG4gICAgICAgIC8vIHdoZXRoZXIgc2VydmljZSBjYWxsIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygncmVzdWx0JywgcGFyYW1zKTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgLy8gaWYgc2VydmljZSBjYWxsIGlzIHN1Y2Nlc3MgY2FsbCB0aGlzIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWNjZXNzJywgcGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHNlcnZpY2UgY2FsbCBmYWlscyBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2Vycm9yJywgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc3BsYXkgb3IgaGlkZSB0aGUgaW5saW5lIG1lc3NhZ2UvIHRvYXN0ZXJcbiAgICB0b2dnbGVNZXNzYWdlKHNob3c6IGJvb2xlYW4sIG1zZz86IHN0cmluZywgdHlwZT86IHN0cmluZywgaGVhZGVyPzogc3RyaW5nKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZTtcbiAgICAgICAgaWYgKHNob3cgJiYgbXNnKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9ICh0eXBlID09PSAnZXJyb3InICYmIHRoaXMuZXJyb3JtZXNzYWdlKSA/IHRoaXMuZXJyb3JtZXNzYWdlIDogbXNnO1xuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZWxheW91dCA9PT0gJ0lubGluZScpIHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuY2hlY2tBcHBTZXJ2aWNlRXJyb3JNc2codHlwZSkgfHwgdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0geydjYXB0aW9uJzogdGVtcGxhdGUgfHwgJycsIHR5cGU6IHR5cGV9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUmVmLnNob3dNZXNzYWdlKHRoaXMuc3RhdHVzTWVzc2FnZS5jYXB0aW9uLCB0aGlzLnN0YXR1c01lc3NhZ2UudHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHdoZW4gbWVzc2FnZSBsYXlvdXQgaXMgaW5saW5lIG9uIHNhdmUsIHNjcm9sbCB0aGUgdmlldyB0byB0b3Agb2YgdGhlIGZvcm0gdG8gc2VlIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvblxuICAgICAgICAgICAgICAgIGlmICghaXNFbGVtZW50SW5WaWV3cG9ydCh0aGlzLiRlbGVtZW50WzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0VsZW1lbnQodGhpcy4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnlBcHAodGVtcGxhdGUsIHR5cGUsIGhlYWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UuY2FwdGlvbiA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgaXMgYW4gQXBwLm9uU2VydmljZUVycm9yIGhhbmRsZXIgZm9yIHRoZSBhcHAsIHRoYXQgbWVzc2FnZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHNlcnZlciByZXR1cm5lZCBlcnJvciBtZXNzYWdlXG4gICAgY2hlY2tBcHBTZXJ2aWNlRXJyb3JNc2codHlwZSkge1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25BY3Rpb24gPSBfLmdldCh0aGlzLmFwcCwgJ0FjdGlvbnMuYXBwTm90aWZpY2F0aW9uJyk7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25BY3Rpb24gJiYgdHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbkFjdGlvbi5nZXRNZXNzYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGlubGluZSBtZXNzYWdlLyB0b2FzdGVyXG4gICAgY2xlYXJNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZU1lc3NhZ2UoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgY2xhc3NlcyBvbiB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgY2FwdGlvbnBvc2l0aW9uIGFuZCBjYXB0aW9ud2lkdGggcHJvcGVydGllc1xuICAgIHByaXZhdGUgc2V0TGF5b3V0Q29uZmlnKCkge1xuICAgICAgICBsZXQgbGF5b3V0Q29uZmlnO1xuICAgICAgICBsYXlvdXRDb25maWcgPSBnZXRGaWVsZExheW91dENvbmZpZyh0aGlzLmNhcHRpb253aWR0aCwgdGhpcy5jYXB0aW9ucG9zaXRpb24sIF8uZ2V0KHRoaXMuYXBwLnNlbGVjdGVkVmlld1BvcnQsICdvcycpKTtcbiAgICAgICAgdGhpcy5fd2lkZ2V0Q2xhc3MgPSBsYXlvdXRDb25maWcud2lkZ2V0Q2xzO1xuICAgICAgICB0aGlzLl9jYXB0aW9uQ2xhc3MgPSBsYXlvdXRDb25maWcuY2FwdGlvbkNscztcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGb3JtV2lkZ2V0KHdpZGdldCkge1xuICAgICAgICBjb25zdCBuYW1lID0gd2lkZ2V0Lm5hbWUgfHwgd2lkZ2V0LmtleTtcbiAgICAgICAgdGhpcy5mb3JtV2lkZ2V0c1tuYW1lXSA9IHdpZGdldDtcbiAgICB9XG5cbiAgICByZWdpc3RlckZvcm1GaWVsZHMoZm9ybUZpZWxkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkQ291bnQgPSB0aGlzLmZvcm1GaWVsZHMucHVzaChmb3JtRmllbGQpO1xuICAgICAgICB0aGlzLmZvcm1maWVsZHNbZm9ybUZpZWxkLmtleV0gPSBmb3JtRmllbGQ7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JtV2lkZ2V0KGZvcm1GaWVsZCk7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5mb3JtRmllbGRzLnB1c2goZm9ybUZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5mb3JtZmllbGRzW2Zvcm1GaWVsZC5rZXldID0gZm9ybUZpZWxkO1xuICAgICAgICAgICAgLy8gaW5uZXIgZm9ybWZpZWxkcyBhcmUgcHVzaGVkIHRvIHBhcmVudEZvcm0sIHBhc3NpbmcgY3VycmVudCBpbm5lckZvcm0ncyBmb3JtZGF0YSB0byBzZXQgaW5uZXJGb3JtZGF0YSB0byB0aGVzZSBpbm5lckZvcm1GaWVsZHNcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5zZXRGb3JtRGF0YSh0aGlzLnBhcmVudEZvcm0uZm9ybWRhdGEsIHRoaXMuZm9ybUZpZWxkcywgdGhpcy5mb3JtZGF0YSB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV01TLTE4OTY3OiBBcHBseWluZyBmb3JtYWRhdGEgYWZ0ZXIgZm9ybWZpZWxkcyBhcmUgcmVhZHlcbiAgICAgICAgaWYgKGZpZWxkQ291bnQgPT09IHRoaXMubnVtYmVyT2ZGaWVsZHMgJiYgIV8uaXNFbXB0eSh0aGlzLmZvcm1kYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgIF8uaXNBcnJheSh0aGlzLmZvcm1kYXRhKSA/IHRoaXMuc2V0Rm9ybURhdGEoXy5sYXN0KHRoaXMuZm9ybWRhdGEpKSA6IHRoaXMuc2V0Rm9ybURhdGEodGhpcy5mb3JtZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlckFjdGlvbnMoZm9ybUFjdGlvbikge1xuICAgICAgICB0aGlzLmJ1dHRvbkFycmF5LnB1c2goZm9ybUFjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBkYXRhb3V0cHV0IHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIGluIGluc2lkZSBmb3JtIHdpZGdldCB2YWx1ZVxuICAgIHVwZGF0ZUZvcm1EYXRhT3V0cHV0KGRhdGFPYmplY3QpIHtcbiAgICAgICAgLy8gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHdpZGdldHMgaW5zaWRlIHRoZSBsaXZlIGZvcm0gKG90aGVyIHRoYW4gZm9ybSBmaWVsZHMpIGluIGZvcm0gZGF0YVxuICAgICAgICBfLmZvckVhY2godGhpcy5uZ2Zvcm0udmFsdWUsICh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfLmZpbmQodGhpcy5mb3JtRmllbGRzLCB7a2V5fSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRhdGFvdXRwdXQgPSBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBvYmplY3QgbWVyZ2luZyB0aGUgZm9ybSBmaWVsZHMgYW5kIGN1c3RvbSB3aWRnZXRzIGRhdGFcbiAgICBjb25zdHJ1Y3REYXRhT2JqZWN0KCkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSAgICAgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xuICAgICAgICAvLyBHZXQgYWxsIGZvcm0gZmllbGRzIGFuZCBwcmVwYXJlIGZvcm0gZGF0YSBhcyBrZXkgdmFsdWUgcGFpcnNcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGxldCBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZTtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZC5kYXRhdmFsdWUgfHwgZmllbGQuX2NvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gKGZpZWxkVmFsdWUgPT09IG51bGwgfHwgZmllbGRWYWx1ZSA9PT0gJycpID8gdW5kZWZpbmVkIDogZmllbGRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBnZXRGaWxlcyh0aGlzLm5hbWUsIGZpZWxkLmtleSArICdfZm9ybVdpZGdldCcsIGZpZWxkLm11bHRpcGxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmllbGROYW1lID0gZmllbGQua2V5IHx8IGZpZWxkLnRhcmdldCB8fCBmaWVsZC5uYW1lO1xuXG4gICAgICAgICAgICAvLyBvbiBjdXJyZW50IEZvcm0sIHdoZW4gZmllbGQgaXMgaW5uZXJGb3JtIGZpZWxkIHRoZW4gd2UgZ3JvdXAgdGhlc2UgZmllbGRzIHVuZGVyIG5ldyBvYmplY3QgdXNpbmcgZm9ybUdyb3VwTmFtZSBhcyBrZXlcbiAgICAgICAgICAgIC8vIEZvciBzdXBwb3NlLCBhcHBsaWNhbnROYW1lLCBhcHBsaWNhbnRJRCBhcmUgZm9ybWZpZWxkcyBpbiBjdXJyZW50Rm9ybVxuICAgICAgICAgICAgLy8gVGhpcyBmb3JtIGlzIGhhdmluZyBpbm5lcmZvcm0gaS5lLiBhZGRyZXNzLCB0aGVzZSBmaWVsZHMgYXJlIGxpc3RlZCBhc1xuICAgICAgICAgICAgLy8ge1wiYXBwbGljYW50TmFtZVwiOiBcIlwiLCBcImFwcGxpY2FudElEXCI6IFwiXCIsIFwiYWRkcmVzc1wiOiB7XCJzdHJlZXRcIjogXCJcIn19XG4gICAgICAgICAgICBpZiAoZmllbGQuZm9ybS53aWRnZXRJZCAhPT0gdGhpcy53aWRnZXRJZCAmJiBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IF8uZ2V0KGZvcm1EYXRhLCBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUsIHt9KTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICBfLnNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lLCBmZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmZvcm0uaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBmb3JtZGF0YSBiYXNlZCBvbiBmb3JtQXJyYXlJbmRleFxuICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gXy5nZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0ucGFyZW50TGlzdC5uYW1lLCBbXSk7XG4gICAgICAgICAgICAgICAgZmRbZmllbGQuZm9ybS5mb3JtQXJyYXlJbmRleF0gPSBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSB8fCB7fTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XVtmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICBfLnNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1cGRhdGUgdGhlIGZpZWxkIHdpbGwgYmUgYWxyZWFkeSBwcmVzZW50IGluIGZvcm0gZGF0YVxuICAgICAgICAgICAgICAgIF8uc2V0KGZvcm1EYXRhLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YU91dHB1dChmb3JtRGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFvdXRwdXQ7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YU91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIGlmICh0aGlzLm5nZm9ybS50b3VjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25Nc2dzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybUZpZWxkcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBmaWVsZHMgaW4gcGFyZW50IGFuZCBpbm5lciBmb3JtIGFsc28uXG4gICAgLy8gVGhpcyByZXR1cm5zIHRoZSBmb3JtRmllbGRzIGluIHRoZSBmb3JtIGJhc2VkIG9uIHRoZSBmb3JtIG5hbWUuXG4gICAgZ2V0Rm9ybUZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIF8uZmlsdGVyKHRoaXMuZm9ybUZpZWxkcywgZm9ybUZpZWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtRmllbGQuZm9ybS5uYW1lID09PSB0aGlzLm5hbWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGEsIGlubmVyRm9ybWRhdGE/KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkLmtleSB8fCBmaWVsZC5uYW1lO1xuICAgICAgICAvLyBpZiBjdXN0b21maWVsZCBwYXJhbSB2YWx1ZSBpcyBub3QgaW4gdGhlIGZvcm1kYXRhIHRoZW4gZG8gbm90IGFzc2lnbiBmaWVsZCB2YWx1ZVxuICAgICAgICAvLyBhcyBpdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlIHdoaWNoIHdpbGwgYWdhaW4gYmUgb3ZlcnJpZGRlbiBieSB1bmRlZmluZWQuXG4gICAgICAgIGNvbnN0IGZkID0gaW5uZXJGb3JtZGF0YSA/IGlubmVyRm9ybWRhdGEgOiBkYXRhO1xuICAgICAgICBpZiAoZmQpIHtcbiAgICAgICAgICAgIGlmIChmZC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSAgXy5nZXQoZmQsIGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaW5jbHVkZXMoa2V5LCAnLicpKSB7XG4gICAgICAgICAgICAgICAgLy8ga2V5IGNvbnRhaW5zICcuJyB3aGVuIG1hcHBpbmcgdGhlIGZpZWxkcyB0byBjaGlsZCByZWZlcmVuY2UgaS5lLiBjaGlsZENvbCBpcyBoYXZpbmcga2V5IGFzIFwicGFyZW50LmNoaWxkQ29sXCJcbiAgICAgICAgICAgICAgICBpZiAoZmQuaGFzT3duUHJvcGVydHkoXy5zcGxpdChrZXksICcuJylbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gIF8uZ2V0KGZkLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdNUy0xODkwNjogRm9yIGRlZmF1bHQgdmFsdWUsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGlydHkgJiYgIXRoaXMuX3RyaWdnZXJlZEJ5VXNlcikge1xuICAgICAgICAgICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JtR3JvdXBOYW1lID0gZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogaWYgZm9ybUdyb3VwTmFtZSBpcyBkZWZpbmVkIHdoaWNoIG1lYW5zIGZpZWxkIGlzIGluc2lkZSB0aGUgaW5uZXIgZm9ybVxuICAgICAgICAgKiB0aGVuIHNldCB0aGUgZm9ybWRhdGEgb24gdGhlIGZpZWxkJ3MgZm9ybSB1c2luZyBmb3JtR3JvdXBOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZm9ybUdyb3VwTmFtZSAmJiBfLmdldChkYXRhLCBmb3JtR3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YS5jYWxsKGZpZWxkLmZvcm0sIGRhdGFbZm9ybUdyb3VwTmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGZvcm1kYXRhIGlzIGFzc2lnbmVkIGxhdGVyIHRoZW4gb24gcHJvcGVydHlDaGFuZ2VIYW5kbGVyLCBldmVuIGlubmVyIGZvcm1zIGRhdGEgYWxzbyBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgICAgICBpZiAoXy5nZXQoZmllbGQuZm9ybSwgJ3BhcmVudEZvcm1BcnJheScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YShkYXRhLCBpbm5lckZvcm1GaWVsZHM/LCBpbm5lckZvcm1kYXRhPykge1xuICAgICAgICAvLyB3aGVyZWFzIGZvcm1GaWVsZHMgZXhwbGljaXRseSBwYXNzZWQgY2FuIGNvbnRhaW4gaW5uZXJmb3JtIGZpZWxkcyBhbHNvLlxuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gaW5uZXJGb3JtRmllbGRzIHx8IHRoaXMuZm9ybUZpZWxkcztcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YSk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmllbGRWYWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkVmFsaWRhdGlvbnMuc2V0Q3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgIH1cblxuICAgIHJlc2V0Rm9ybVN0YXRlKCkge1xuICAgICAgICAvLyBjbGVhcmluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIG9uIHJlc2V0LlxuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKGZpZWxkLndpZGdldHR5cGUgPT09ICd1cGxvYWQnIHx8IGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBzYXZlUHJldmZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMucHJldmZvcm1GaWVsZHMgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5mb3JtRmllbGRzLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdrZXknOiBmaWVsZC5rZXksXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgICd3aWRnZXR0eXBlJzogZmllbGQud2lkZ2V0dHlwZSxcbiAgICAgICAgICAgICAgICAnb3V0cHV0Zm9ybWF0JzogZmllbGQub3V0cHV0Zm9ybWF0LFxuICAgICAgICAgICAgICAgICd2YWx1ZSc6IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2F2ZVByZXZEYXRhVmFsdWVzKCkge1xuICAgICAgICB0aGlzLnByZXZEYXRhVmFsdWVzID0gdGhpcy5mb3JtRmllbGRzLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geydrZXknOiBvYmoua2V5LCAndmFsdWUnOiBvYmoudmFsdWV9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRSZWFkb25seUZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQsIHNraXBWYWx1ZVNldD8pIHtcbiAgICAgICAgY29uc3QgJGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAkZm9ybUVsZS5maW5kKCdbbmFtZT1cIicgKyBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXRcIl0nKS52YWwoJycpO1xuICAgICAgICBmaWVsZC5fY29udHJvbC5yZXNldCgpO1xuICAgICAgICBpZiAoIXNraXBWYWx1ZVNldCkge1xuICAgICAgICAgICAgZmllbGQuaHJlZiA9ICcnO1xuICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1wdHlEYXRhTW9kZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGF2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkZpZWxkRGVmYXVsdFZhbHVlQ2hhbmdlKGZpZWxkLCBmaWVsZC5kZWZhdWx0dmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRPcGVyYXRpb25UeXBlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gbW9kZSB8fCAnaW5zZXJ0JztcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gTGl2ZV9PcGVyYXRpb25zLklOU0VSVDtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtcHR5RGF0YU1vZGVsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2RGF0YVZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IExpdmVfT3BlcmF0aW9ucy5VUERBVEU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZEYXRhVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2RGF0YU9iamVjdCA9IGdldENsb25lZE9iamVjdCh0aGlzLmZvcm1kYXRhIHx8IHt9KTtcblxuICAgICAgICB0aGlzLnNldFJlYWRvbmx5RmllbGRzKCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV01FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RlcGVuZHNvbicpO1xuICAgICAgICBpZiAoIXRhYmxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAkaW52b2tlV2F0Y2hlcnModHJ1ZSk7XG4gICAgICAgIHRoaXMuYXBwLm5vdGlmeSgnd20tZXZlbnQnLCB7ZXZlbnROYW1lLCB3aWRnZXROYW1lOiB0YWJsZUlkfSk7XG4gICAgfVxuXG4gICAgc3VibWl0Rm9ybSgkZXZlbnQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlLCBmb3JtRGF0YSwgcmVzdWx0O1xuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gdGhpcy5kYXRhc291cmNlO1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRmllbGRzT25TdWJtaXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybURhdGEgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCkpO1xuXG4gICAgICAgIGNvbnN0IGdldFBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7JGV2ZW50LCAkZm9ybURhdGE6IGZvcm1EYXRhLCAkZGF0YTogZm9ybURhdGF9O1xuICAgICAgICB9O1xuXG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVTdWJtaXRFdnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXN1Ym1pdCcsIGdldFBhcmFtcygpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0RXZ0IHx8IGRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIElmIG9uIHN1Ym1pdCBpcyB0aGVyZSBleGVjdXRlIGl0IGFuZCBpZiBpdCByZXR1cm5zIHRydWUgZG8gc2VydmljZSB2YXJpYWJsZSBpbnZva2UgZWxzZSByZXR1cm5cbiAgICAgICAgICAgIC8vIElmIGl0cyBhIHNlcnZpY2UgdmFyaWFibGUgY2FsbCBzZXRJbnB1dCBhbmQgYXNzaWduIGZvcm0gZGF0YSBhbmQgaW52b2tlIHRoZSBzZXJ2aWNlXG4gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtID0gZGF0YVNvdXJjZS5wYWdpbmF0aW9uICYmIGRhdGFTb3VyY2UucGFnaW5hdGlvbi5udW1iZXIgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSB0aGlzLm9wZXJhdGlvblR5cGUgPyB0aGlzLm9wZXJhdGlvblR5cGUgOiAnaW5zZXJ0JztcbiAgICAgICAgICAgICAgICBwZXJmb3JtRGF0YU9wZXJhdGlvbihkYXRhU291cmNlLCBmb3JtRGF0YSwge29wZXJhdGlvblR5cGU6IG9wZXJhdGlvblR5cGV9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2UuY2F0ZWdvcnkgPT09ICd3bS5DcnVkVmFyaWFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgncmVzZXRFZGl0TW9kZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLkxJU1RfUkVDT1JEUywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tpcFRvZ2dsZVN0YXRlJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbic6ICdsaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZ2UnOiBjdXJyZW50UGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXZlbnRNaXNzaW5nT3BNc2cnOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlhbG9nSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZGF0YS5ib2R5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkSlNPTihkYXRhLmJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRGVmaW5lZChyZXN1bHQpID8gcmVzdWx0IDogZGF0YS5ib2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0JzogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogdGhpcy5wb3N0bWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdzdWNjZXNzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuZXJyb3JtZXNzYWdlIHx8IGVycm9yLmVycm9yIHx8IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0JzogXy5nZXQoZXJyb3IsICdlcnJvcicpIHx8IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyAmJiAhdGhpcy5vbkVycm9yKSB8fCAocmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnICYmICF0aGlzLm9uU3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZSh0cnVlLCByZXNwb25zZS5tZXNzYWdlLCByZXNwb25zZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHJlc3BvbnNlLnJlc3VsdCwgcmVzcG9uc2Uuc3RhdHVzLCAkZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZURpYWxvZygpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNsb3NlKHRoaXMuZGlhbG9nSWQpO1xuICAgIH1cblxuICAgIC8vIE1ldGhvZCB0byBzaG93L2hpZGUgdGhlIHBhbmVsIGhlYWRlciBvciBmb290ZXIgYmFzZWQgb24gdGhlIGJ1dHRvbnNcbiAgICBzaG93QnV0dG9ucyhwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gXy5zb21lKHRoaXMuYnV0dG9uQXJyYXksIGJ0biA9PiB7XG4gICAgICAgICAgICByZXR1cm4gXy5pbmNsdWRlcyhidG4ucG9zaXRpb24sIHBvc2l0aW9uKSAmJiBidG4udXBkYXRlTW9kZSA9PT0gdGhpcy5pc1VwZGF0ZU1vZGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEV4cGFuZCBvciBjb2xsYXBzZSB0aGUgcGFuZWxcbiAgICBleHBhbmRDb2xsYXBzZVBhbmVsKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgLy8gZmxpcCB0aGUgYWN0aXZlIGZsYWdcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRGF0YVNvdXJjZVVwZGF0ZShyZXNwb25zZSwgbmV3Rm9ybSwgdXBkYXRlTW9kZSkge1xuICAgICAgICBpZiAobmV3Rm9ybSkge1xuICAgICAgICAgICAgdGhpcy5uZXcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGEocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gaXNEZWZpbmVkKHVwZGF0ZU1vZGUpID8gdXBkYXRlTW9kZSA6IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgdHJhbnZlcnNlcyB0aHJvdWdoIHRoZSBwYXJlbnQgY29udGFpbmluZyBmb3JtZGF0YSBhbmQgcmV0dXJucyB0aGUgcGFyZW50IGZvcm1kYXRhLlxuICAgICAqIEBwYXJhbSBmb3JtLCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGZvcm0gaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGdldE5lYXJlc3RQYXJlbnRGb3JtRGF0YShmb3JtKSB7XG4gICAgICAgIGlmICghZm9ybS5wYXJlbnRGb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtLmJpbmRmb3JtZGF0YSAmJiBfLmdldChmb3JtLnBhcmVudEZvcm0sICdmb3JtZGF0YScpICYmICFfLmlzRW1wdHkoZm9ybS5wYXJlbnRGb3JtLmZvcm1kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm0ucGFyZW50Rm9ybS5mb3JtZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXROZWFyZXN0UGFyZW50Rm9ybURhdGEoZm9ybS5wYXJlbnRGb3JtKTtcbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShmb3JtZGF0YTogYW55KSB7XG4gICAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5mb3JtZGF0YSkgJiYgdGhpcy5wYXJlbnRGb3JtICYmIGZvcm1kYXRhKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIElmIGZvcm0gaXMgaW5zaWRlIGxpc3QsXG4gICAgICAgICAgICAgKiAxLiBkaXJlY3RseSBhcHBseWluZyB0aGUgZm9ybWRhdGEgdG8gdGhlIGZvcm1BcnJheSB0byB1cGRhdGUgdGhlIGZvcm1kYXRhIG9uIGxpc3Qgb2YgZm9ybXMgdXNpbmcgcGF0Y2hWYWx1ZS5cbiAgICAgICAgICAgICAqIDIuIGFuZCBhbHNvIHNldHRpbmcgaW5kaXZpZHVhbCBmb3JtZGF0YSB0byB0aGUgZm9ybSBpbnNpZGUgZWFjaCBpdGVtIGJhc2VkIG9uIGZvcm1BcnJheUluZGV4LCB3aGVuIGZvcm0gaXMgbm90IGJvdW5kIHRvIGZvcm1kYXRhLlxuICAgICAgICAgICAgICogMy4gZXhwbGljaXRseSBpbnZva2luZyBmb3JtZGF0YSBhcyBmb3JtRmllbGRzIHdpbGwgY29udGFpbiBhbGwgdGhlIGZvcm1maWVsZHMgaW5jbHVkaW5nIGlubmVyRm9ybSdzIGZpZWxkc1xuICAgICAgICAgICAgICogKGlmIHdlIGRvIG5vdCBpbnZva2UgZXhwbGljaXRseSB0aGVuIGZvcm1GaWVsZHMgd2lsbCBqdXN0IGNvbnRhaW4gdGhlIGZpZWxkcyBpbnNpZGUgY3VycmVudCBmb3JtIGFuZCBub3QgaW5uZXIgZm9ybSBmaWVsZHMpXG4gICAgICAgICAgICAgKiA0LiBpZiBjaGlsZEZvcm1BcnJheURhdGEgaXMgbm90IGF2YWlsYWJsZSB3ZSB3aWxsIGNoZWNrIGZvciBpbm5lciBmb3JtIGRhdGEgdXNpbmcgXCJmb3JtR3JvdXBOYW1lXCIgYW5kIHdpbGwgc2V0IHRoZSBpbm5lcmZvcm0gZGF0YVxuICAgICAgICAgICAgICogSWYgbm90IGluc2lkZSBsaXN0LCBqdXN0IHNldCB0aGUgZm9ybWRhdGEgb24gYWxsIHRoZSBmb3JtZmllbGRzIGluY2x1ZGluZyBpbm5lckZvcm0gZmllbGRzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm1BcnJheSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZEZvcm1BcnJheURhdGEgPSBfLmdldChmb3JtZGF0YSwgdGhpcy5wYXJlbnRMaXN0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZEZvcm1BcnJheURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfLmlzQXJyYXkoY2hpbGRGb3JtQXJyYXlEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGb3JtQXJyYXlEYXRhID0gW2NoaWxkRm9ybUFycmF5RGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtQXJyYXkucGF0Y2hWYWx1ZShjaGlsZEZvcm1BcnJheURhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYmluZGZvcm1kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1kYXRhID0gY2hpbGRGb3JtQXJyYXlEYXRhW3RoaXMuZm9ybUFycmF5SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGEodGhpcy5mb3JtZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGb3JtRGF0YSA9IF8uZ2V0KGZvcm1kYXRhLCB0aGlzLnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEocGFyZW50Rm9ybURhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YShmb3JtZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGRhdGEgc291cmNlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICBpZiAoXy5nZXQodGhpcy5mb3JtRmllbGRzLCAnbGVuZ3RoJykgJiYgIXRoaXMuYmluZGZvcm1kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBmb3JtZGF0YSBvbiB0aGUgcGFyZW50IGZvcm0gd2lsbCBiZSBzZXQgYmVmb3JlIHRoZSBpbm5lciBmb3JtcyBhcmUgcmVuZGVyZWQuXG4gICAgICAgICAgICAgKiBIZW5jZSBoYW5kbGluZyBmb3JtZGF0YSBvbiB0aGUgaW5uZXJGb3Jtcywgd2hpY2ggbWlnaHQgYmUgcmVuZGVyZWQgc2xvd2x5IChzdXBwb3NlIHByZWZhYiB3aXRoIGZvcm0pXG4gICAgICAgICAgICAgKiBzZXR0aW5nIGlubmVyIGZvcm0ncyBmb3JtZGF0YSBvYnRhaW5lZCBmcm9tIHBhcmVudCBmb3JtZGF0YVxuICAgICAgICAgICAgICogdGhpcyBhcHBsaWVzIG9ubHkgd2hlbiBmb3JtZGF0YSBpcyBub3QgZ2l2ZW4gb24gdGhlIGlubmVyIGZvcm0uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGZvcm1kYXRhID0gdGhpcy5nZXROZWFyZXN0UGFyZW50Rm9ybURhdGEodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkZvcm1EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBmaWVsZCBkZWZhdWx0IHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZERlZmF1bHRWYWx1ZUNoYW5nZShmaWVsZCwgbnYpIHtcbiAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZVZhbHVlQnlUeXBlKG52LCB1bmRlZmluZWQsIGZpZWxkLndpZGdldHR5cGUsIGZpZWxkLnRyYWlsaW5nemVybyk7XG4gICAgICAgIC8vIFdNUy0yMjQzNDogRm9yIGRlZmF1bHQgdmFsdWUgc2V0IG9uIGluZGl2aWR1YWwgZm9ybSBmaWVsZHMsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICBpZiAodGhpcy5kaXJ0eSAmJiAhdGhpcy5fdHJpZ2dlcmVkQnlVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGZpZWxkIHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZFZhbHVlQ2hhbmdlKCkge1xuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuZCBjb21waWxlIHRoZSBmb3JtIGZpZWxkcyBmcm9tIHRoZSBtZXRhZGF0YVxuICAgIGFzeW5jIGdlbmVyYXRlRm9ybUZpZWxkcygpIHtcbiAgICAgICAgbGV0IG5vT2ZDb2x1bW5zO1xuICAgICAgICBsZXQgJGdyaWRMYXlvdXQ7XG4gICAgICAgIC8vIENoZWNrIGlmIGdyaWQgbGF5b3V0IGlzIHByZXNlbnQgb3Igbm90IGZvciBmaXJzdCB0aW1lXG4gICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX2lzR3JpZExheW91dFByZXNlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50ID0gdGhpcy4kZWxlbWVudC5maW5kKCcucGFuZWwtYm9keSBbd21sYXlvdXRncmlkXScpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzR3JpZExheW91dFByZXNlbnQpIHtcbiAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyBbd21sYXlvdXRncmlkXScpLmZpcnN0KCk7XG4gICAgICAgICAgICBub09mQ29sdW1ucyA9IE51bWJlcigkZ3JpZExheW91dC5hdHRyKCdjb2x1bW5zJykpIHx8IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgLmR5bmFtaWMtZm9ybS1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmICghJGdyaWRMYXlvdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cycpLnByZXBlbmQoJzxkaXYgY2xhc3M9XCJkeW5hbWljLWZvcm0tY29udGFpbmVyXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIC5keW5hbWljLWZvcm0tY29udGFpbmVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub09mQ29sdW1ucyA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSAxMiAvIG5vT2ZDb2x1bW5zO1xuICAgICAgICBsZXQgZmllbGRUZW1wbGF0ZSA9ICcnO1xuICAgICAgICBsZXQgY29sQ291bnQgPSAwO1xuICAgICAgICBsZXQgaW5kZXg7XG4gICAgICAgIGxldCB1c2VyRmllbGRzO1xuICAgICAgICBsZXQgZmllbGRzID0gdGhpcy5tZXRhZGF0YSA/IHRoaXMubWV0YWRhdGEuZGF0YSB8fCB0aGlzLm1ldGFkYXRhIDogW107XG5cbiAgICAgICAgdGhpcy5mb3JtRmllbGRzID0gW107IC8vIGVtcHR5IHRoZSBmb3JtIGZpZWxkc1xuXG4gICAgICAgIGlmIChfLmlzRW1wdHkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVSZW5kZXJFdnQpIHtcbiAgICAgICAgICAgIHVzZXJGaWVsZHMgPSB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXJlbmRlcicsIHskbWV0YWRhdGE6IGZpZWxkc30pO1xuICAgICAgICAgICAgaWYgKHVzZXJGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHMgPSB1c2VyRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFfLmlzQXJyYXkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGZpZWxkc1tjb2xDb3VudF0pIHtcbiAgICAgICAgICAgIGxldCBjb2xUbXBsID0gJyc7XG4gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBub09mQ29sdW1uczsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbY29sQ291bnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbFRtcGwgKz0gc2V0TWFya3VwRm9yRm9ybUZpZWxkKGZpZWxkc1tjb2xDb3VudF0sIGNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUgKz0gYDx3bS1ncmlkcm93PiR7Y29sVG1wbH08L3dtLWdyaWRyb3c+YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkge1xuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSA9IGA8d20tbGF5b3V0Z3JpZD4ke2ZpZWxkVGVtcGxhdGV9PC93bS1sYXlvdXRncmlkPmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmR5bmFtaWNGb3JtUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9keW5hbWljQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fZHluYW1pY0NvbnRleHQgPSBPYmplY3QuY3JlYXRlKHRoaXMudmlld1BhcmVudCk7XG4gICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dC5mb3JtID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5UmVmID0gYXdhaXQgdGhpcy5keW5hbWljQ29tcG9uZW50UHJvdmlkZXIuZ2V0Q29tcG9uZW50RmFjdG9yeVJlZihcbiAgICAgICAgICAgICdhcHAtZm9ybS1keW5hbWljLScgKyB0aGlzLndpZGdldElkLFxuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBub0NhY2hlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRyYW5zcGlsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZHluYW1pY0Zvcm1SZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnlSZWYsIDAsIHRoaXMuaW5qKTtcbiAgICAgICAgZXh0ZW5kUHJvdG8oY29tcG9uZW50Lmluc3RhbmNlLCB0aGlzLl9keW5hbWljQ29udGV4dCk7XG4gICAgICAgICRncmlkTGF5b3V0WzBdLmFwcGVuZENoaWxkKGNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHlwZSB8fCB0aGlzLmZpbmRPcGVyYXRpb25UeXBlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uZGlydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byBwcmlzdGluZSBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNQcmlzdGluZSBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzUHJpc3RpbmUodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNQcmlzdGluZSh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIGRpcnR5IGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc0RpcnR5IG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNEaXJ0eSh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZDtcbiAgICB9XG5cbiAgICBnZXQgdG91Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnRvdWNoZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0udmFsaWQ7XG4gICAgfVxuXG4gICAgZ2V0IHByaXN0aW5lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0ucHJpc3RpbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byB0b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1RvdWNoZWQgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1RvdWNoZWQodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gdW50b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1VudG91Y2hlZCBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzVW50b3VjaGVkKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZuID0gJHBhcnNlRXZlbnQoZXhwcmVzc2lvbik7XG4gICAgICAgIGZuKHRoaXMudmlld1BhcmVudCwgT2JqZWN0LmFzc2lnbih0aGlzLmNvbnRleHQsIHskZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIG9uIGZvcm0gZGVzdHJveSwgcmVtb3ZpbmcgdGhpcyBmb3JtIGZyb20gdGhlIHBhcmVudEZvcm0gdG9vLlxuICAgICAgICBjb25zdCBjb250cm9scyA9IHRoaXMucGFyZW50Rm9ybSAmJiBfLmdldCh0aGlzLnBhcmVudEZvcm0sICduZ2Zvcm0uY29udHJvbHMnKTtcbiAgICAgICAgaWYgKGNvbnRyb2xzKSB7XG4gICAgICAgICAgICAvLyB3aGVuIGN1cnJlbnQgZm9ybSBpcyBpbnNpZGUgdGhlIGxpc3QgKGkuZS4gaW5jYXNlIG9mIGZvcm1BcnJheSkuXG4gICAgICAgICAgICBpZiAoXy5nZXQodGhpcy5wYXJlbnRMaXN0LCAnbmFtZScpICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMucGFyZW50TGlzdC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnBhcmVudExpc3QubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgZm9ybUdyb3VwTmFtZSBzZXQgaS5lLiBtdWx0aXBsZSBmb3JtSW5zdGFuY2Ugd2l0aCBjb3VudGVyIGFwcGVuZGVkIHRvIGZvcm1OYW1lXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBOYW1lICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMuZm9ybUdyb3VwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5yZW1vdmVDb250cm9sKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iXX0=
1127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQWEsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFtQyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaE4sT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQ0gsVUFBVSxFQUNWLGVBQWUsRUFDZixZQUFZLEVBQ1osUUFBUSxFQUNSLFNBQVMsRUFDVCxXQUFXLEVBQ1gsR0FBRyxFQUNILFdBQVcsRUFDWCxRQUFRLEVBQ1IsMkJBQTJCLEVBQzNCLFdBQVcsRUFDWCxVQUFVLEVBQ1YscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixVQUFVLEVBQ1YsZUFBZSxFQUNmLGVBQWUsRUFDZixtQkFBbUIsRUFDdEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbE4sT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJakQsTUFBTSxhQUFhLEdBQUcsRUFBQyxVQUFVLEVBQUUsU0FB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U0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXR0cmlidXRlLCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIEluamVjdG9yLCBPbkRlc3Ryb3ksIFNraXBTZWxmLCBPcHRpb25hbCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBDb250ZW50Q2hpbGRyZW4sIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gICAgJGFwcERpZ2VzdCxcbiAgICBnZXRDbG9uZWRPYmplY3QsXG4gICAgZ2V0VmFsaWRKU09OLFxuICAgIGdldEZpbGVzLFxuICAgIGlzRGVmaW5lZCxcbiAgICByZW1vdmVDbGFzcyxcbiAgICBBcHAsXG4gICAgJHBhcnNlRXZlbnQsXG4gICAgZGVib3VuY2UsXG4gICAgRHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIERhdGFTb3VyY2UsXG4gICAgQWJzdHJhY3REaWFsb2dTZXJ2aWNlLFxuICAgIERhdGFUeXBlLFxuICAgIHJlbW92ZUF0dHIsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgIHNjcm9sbFRvRWxlbWVudCxcbiAgICBpc0VsZW1lbnRJblZpZXdwb3J0XG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7IGdldEZpZWxkTGF5b3V0Q29uZmlnLCBwYXJzZVZhbHVlQnlUeXBlLCBNZXNzYWdlQ29tcG9uZW50LCBQYXJ0aWFsRGlyZWN0aXZlLCBwZXJmb3JtRGF0YU9wZXJhdGlvbiwgcHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyLCBXaWRnZXRSZWYsIExpdmVfT3BlcmF0aW9ucyB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHsgUHJlZmFiRGlyZWN0aXZlIH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvcHJlZmFiJztcbmltcG9ydCB7IExpc3RDb21wb25lbnQgfSBmcm9tICdAd20vY29tcG9uZW50cy9kYXRhL2xpc3QnO1xuXG5pbXBvcnQgeyByZWdpc3RlckZvcm1Qcm9wcyB9IGZyb20gJy4vZm9ybS5wcm9wcyc7XG5cbmRlY2xhcmUgY29uc3QgXztcblxuY29uc3QgV0lER0VUX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tZm9ybScsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtZm9ybSd9O1xuY29uc3QgTE9HSU5fRk9STV9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWZvcm0nLCBob3N0Q2xhc3M6ICdhcHAtZm9ybSBhcHAtbG9naW4tZm9ybSd9O1xuY29uc3QgTElWRV9GT1JNX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tbGl2ZWZvcm0nLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWxpdmVmb3JtIGxpdmVmb3JtLWlubGluZSd9O1xuY29uc3QgTElWRV9GSUxURVJfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXZlZmlsdGVyJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1saXZlZmlsdGVyIGNsZWFyZml4IGxpdmVmb3JtLWlubGluZSd9O1xuXG5jb25zdCBnZXRXaWRnZXRDb25maWcgPSAoaXNMaXZlRm9ybSwgaXNMaXZlRmlsdGVyLCByb2xlKSA9PiB7XG4gICAgbGV0IGNvbmZpZyA9IFdJREdFVF9DT05GSUc7XG4gICAgaWYgKGlzTGl2ZUZvcm0gIT09IG51bGwpIHtcbiAgICAgICAgY29uZmlnID0gTElWRV9GT1JNX0NPTkZJRztcbiAgICB9IGVsc2UgaWYgKGlzTGl2ZUZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWcgPSBMSVZFX0ZJTFRFUl9DT05GSUc7XG4gICAgfSBlbHNlIGlmIChyb2xlID09PSAnYXBwLWxvZ2luJykge1xuICAgICAgICBjb25maWcgPSBMT0dJTl9GT1JNX0NPTkZJRztcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn07XG5cbi8vIEdlbmVyYXRlIHRoZSBmb3JtIGZpZWxkIHdpdGggZ2l2ZW4gZmllbGQgZGVmaW5pdGlvbi4gQWRkIGEgZ3JpZCBjb2x1bW4gd3JhcHBlciBhcm91bmQgdGhlIGZvcm0gZmllbGQuXG5jb25zdCBzZXRNYXJrdXBGb3JGb3JtRmllbGQgPSAoZmllbGQsIGNvbHVtbldpZHRoKSA9PiAge1xuICAgIGxldCBwcm9wc1RtcGwgPSAnJztcbiAgICBfLmZvckVhY2goZmllbGQsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHByb3BzVG1wbCA9IGAke3Byb3BzVG1wbH0gJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGA8d20tZ3JpZGNvbHVtbiBjb2x1bW53aWR0aD1cIiR7Y29sdW1uV2lkdGh9XCI+XG4gICAgICAgICAgICAgICAgICA8d20tZm9ybS1maWVsZCAke3Byb3BzVG1wbH0+PC93bS1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC93bS1ncmlkY29sdW1uPmA7XG59O1xuXG4vLyBGdW5jdGlvbiB0byBmaW5kIG91dCB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50IGluIGZvcm1cbmNvbnN0IGZpbmRJbnZhbGlkRWxlbWVudCA9ICgkZm9ybUVsZSwgbmdGb3JtKSA9PiB7XG4gICAgY29uc3QgJGVsZSA9ICRmb3JtRWxlLmZpbmQoJ2Zvcm0ubmctaW52YWxpZDp2aXNpYmxlLCBbZm9ybUNvbnRyb2xOYW1lXS5uZy1pbnZhbGlkOnZpc2libGUnKS5maXJzdCgpO1xuICAgIGxldCBmb3JtT2JqID0gbmdGb3JtO1xuICAgIC8vIElmIGVsZW1lbnQgaXMgZm9ybSwgZmluZCBvdXQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBpbiB0aGlzIGZvcm1cbiAgICBpZiAoJGVsZS5pcygnZm9ybScpKSB7XG4gICAgICAgIGZvcm1PYmogPSBuZ0Zvcm0gJiYgbmdGb3JtLmNvbnRyb2xzWyRlbGUuYXR0cignZm9ybUNvbnRyb2xOYW1lJykgfHwgJGVsZS5hdHRyKCduYW1lJyldO1xuICAgICAgICBpZiAoZm9ybU9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRJbnZhbGlkRWxlbWVudCgkZWxlLCBmb3JtT2JqKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuZ0Zvcm06IGZvcm1PYmosXG4gICAgICAgICRlbGU6ICRlbGVcbiAgICB9O1xufTtcblxuY29uc3Qgc2V0VG91Y2hlZFN0YXRlID0gKHNlbGYsIG5nRm9ybSwgZmllbGROYW1lKSA9PiB7XG4gICAgaWYgKG5nRm9ybS52YWxpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuZ0Zvcm0uY29udHJvbHMpIHtcbiAgICAgICAgXy5mb3JFYWNoKG5nRm9ybS5jb250cm9scywgKGN0cmwsIGZpZWxkTmFtZSkgPT4ge1xuICAgICAgICAgICAgc2V0VG91Y2hlZFN0YXRlKHNlbGYsIGN0cmwsIGZpZWxkTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBzZWxmLiRlbGVtZW50LmZpbmQoYFt3bWZvcm1maWVsZF1ba2V5PVwiJHtmaWVsZE5hbWV9XCJdYCk7XG4gICAgICAgIGVsZW1lbnRbMF0uc2V0QXR0cmlidXRlKCdfX2Vycm9ybXNnJywgZWxlbWVudFswXS5nZXRBdHRyaWJ1dGUoJ19fdmFsaWRhdGlvbklkJykpO1xuICAgICAgICBlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgbmdGb3JtLmludmFsaWQpO1xuICAgICAgICBlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGVsZW1lbnRbMF0uZ2V0QXR0cmlidXRlKCdfX3ZhbGlkYXRpb25JZCcpKTtcbiAgICAgICAgbmdGb3JtLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2Zvcm1bd21Gb3JtXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRm9ybUNvbXBvbmVudClcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgc3RhdGljICBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlckZvcm1Qcm9wcygpO1xuICAgIEBWaWV3Q2hpbGQoJ2R5bmFtaWNGb3JtJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgZHluYW1pY0Zvcm1SZWY6IFZpZXdDb250YWluZXJSZWY7XG4gICAgQFZpZXdDaGlsZChNZXNzYWdlQ29tcG9uZW50KSBtZXNzYWdlUmVmO1xuICAgIC8vIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHJlZnMgaW5zaWRlIHRoZSBmb3JtLWdyb3VwXG4gICAgQENvbnRlbnRDaGlsZHJlbihXaWRnZXRSZWYsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGNvbXBvbmVudFJlZnM7XG5cbiAgICBhdXRvdXBkYXRlO1xuICAgIHB1YmxpYyBmb3JtbGF5b3V0OiBhbnk7XG4gICAgcHVibGljIGlzRGF0YVNvdXJjZVVwZGF0ZWQ6IGJvb2xlYW47XG4gICAgY2FwdGlvbkFsaWduQ2xhc3M6IHN0cmluZztcbiAgICB2YWxpZGF0aW9udHlwZTogc3RyaW5nO1xuICAgIGNhcHRpb25hbGlnbjogc3RyaW5nO1xuICAgIGNhcHRpb25wb3NpdGlvbjogc3RyaW5nO1xuICAgIGNhcHRpb25zaXplO1xuICAgIGNvbGxhcHNpYmxlOiBib29sZWFuO1xuICAgIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIGVsU2NvcGU7XG4gICAgX3dpZGdldENsYXNzID0gJyc7XG4gICAgY2FwdGlvbndpZHRoOiBzdHJpbmc7XG4gICAgX2NhcHRpb25DbGFzcyA9ICcnO1xuICAgIG5nZm9ybTogRm9ybUdyb3VwO1xuICAgIGZvcm1GaWVsZHMgPSBbXTtcbiAgICBmb3JtZmllbGRzID0ge307XG4gICAgZm9ybVdpZGdldHMgPSB7fTtcbiAgICBmaWx0ZXJXaWRnZXRzID0ge307XG4gICAgYnV0dG9uQXJyYXkgPSBbXTtcbiAgICBkYXRhb3V0cHV0ID0ge307XG4gICAgZGF0YXNvdXJjZTtcbiAgICBmb3JtZGF0YXNvdXJjZTtcbiAgICBmb3JtZGF0YSA9IHt9O1xuICAgIGlzU2VsZWN0ZWQ7XG4gICAgcHJldkRhdGFWYWx1ZXM7XG4gICAgcHJldkRhdGFPYmplY3Q7XG4gICAgcHJldmZvcm1GaWVsZHM7XG4gICAgc3RhdHVzTWVzc2FnZSA9IHtcbiAgICAgICAgY2FwdGlvbjogJycsXG4gICAgICAgIHR5cGU6ICcnXG4gICAgfTtcbiAgICBtZXNzYWdlbGF5b3V0O1xuICAgIG1ldGFkYXRhO1xuICAgIGVycm9ybWVzc2FnZTtcbiAgICBvbkVycm9yO1xuICAgIG9uU3VjY2VzcztcbiAgICBwcmltYXJ5S2V5ID0gW107XG4gICAgcG9zdG1lc3NhZ2U7XG4gICAgX2xpdmVUYWJsZVBhcmVudDtcbiAgICB1cGRhdGVNb2RlO1xuICAgIG5hbWU7XG4gICAgLy8gTGl2ZSBGb3JtIE1ldGhvZHNcbiAgICBjbGVhckRhdGE6IEZ1bmN0aW9uO1xuICAgIGNhbmNlbDogRnVuY3Rpb247XG4gICAgZGVsZXRlOiBGdW5jdGlvbjtcbiAgICBzYXZlOiBGdW5jdGlvbjtcbiAgICBzYXZlQW5kTmV3OiBGdW5jdGlvbjtcbiAgICBzYXZlQW5kVmlldzogRnVuY3Rpb247XG4gICAgc2V0UHJpbWFyeUtleTogKCkgPT4ge307XG4gICAgZGlhbG9nSWQ6IHN0cmluZztcbiAgICAvLyBMaXZlIEZpbHRlclxuICAgIGVuYWJsZWVtcHR5ZmlsdGVyO1xuICAgIHBhZ2VzaXplO1xuICAgIHJlc3VsdDtcbiAgICBwYWdpbmF0aW9uO1xuICAgIGNsZWFyRmlsdGVyOiBGdW5jdGlvbjtcbiAgICBhcHBseUZpbHRlcjogRnVuY3Rpb247XG4gICAgZmlsdGVyOiBGdW5jdGlvbjtcbiAgICBmaWx0ZXJPbkRlZmF1bHQ6IEZ1bmN0aW9uO1xuICAgIG9uTWF4RGVmYXVsdFZhbHVlQ2hhbmdlOiBGdW5jdGlvbjtcbiAgICBudW1iZXJPZkZpZWxkczogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VkVXBkYXRlRmllbGRTb3VyY2U6IEZ1bmN0aW9uID0gXy5kZWJvdW5jZSh0aGlzLnVwZGF0ZUZpZWxkU291cmNlLCAzNTApO1xuICAgIHByaXZhdGUgb3BlcmF0aW9uVHlwZTtcbiAgICBwcml2YXRlIF9pc0xheW91dERpYWxvZztcbiAgICBwcml2YXRlIF9keW5hbWljQ29udGV4dDtcbiAgICBwcml2YXRlIF9pc0dyaWRMYXlvdXRQcmVzZW50O1xuICAgIHByaXZhdGUgdmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XG4gICAgcHJpdmF0ZSBmb3JtR3JvdXBOYW1lO1xuICAgIHByaXZhdGUgZm9ybUFycmF5SW5kZXg7XG4gICAgcHJpdmF0ZSBiaW5kaW5nVmFsdWU7XG4gICAgcHJpdmF0ZSBfZm9ybUlzSW5MaXN0O1xuICAgIHByaXZhdGUgX3RyaWdnZXJlZEJ5VXNlcjogYm9vbGVhbjtcblxuXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VkU3VibWl0Rm9ybSA9IGRlYm91bmNlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgLy8gY2FsbGluZyBzdWJtaXQgZXZlbnQgaW4gbmdab25lIGFzIGNoYW5nZSBkZXRlY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBwb3N0IHRoZSBzdWJtaXQgY2FsbGJhY2sgYW5kIGFjdGlvbnMgbGlrZSBub3RpZmljYXRpb24gYXJlIG5vdCBzaG93blxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRGb3JtKCRldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH0sIDI1MCk7XG5cbiAgICBzZXQgaXNMYXlvdXREaWFsb2cobnYpIHtcbiAgICAgICAgaWYgKG52KSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsICdwYW5lbCBhcHAtcGFuZWwgbGl2ZWZvcm0taW5saW5lJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNMYXlvdXREaWFsb2cgPSBudjtcbiAgICB9XG5cbiAgICBnZXQgaXNMYXlvdXREaWFsb2coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xheW91dERpYWxvZztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc1VwZGF0ZU1vZGU7XG4gICAgc2V0IGlzVXBkYXRlTW9kZShudikge1xuICAgICAgICB0aGlzLl9pc1VwZGF0ZU1vZGUgPSBudjtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZShudik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpc1VwZGF0ZU1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VwZGF0ZU1vZGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhY3Rpb24nKSBhY3Rpb246IHN0cmluZztcblxuICAgIEBIb3N0TGlzdGVuZXIoJ3N1Ym1pdCcsIFsnJGV2ZW50J10pIHN1Ym1pdCgkZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fZGVib3VuY2VkU3VibWl0Rm9ybSgkZXZlbnQpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Jlc2V0Jykgb25SZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJlZEJ5VXNlciA9IHRydWU7XG4gICAgfVxuICAgIC8vIHJldHVybnMgdGhlIGZvcm1BcnJheSBjb250cm9sIG9uIHRoZSBwYXJlbnRGb3JtLlxuICAgIGdldCBwYXJlbnRGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLmlzUGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmdldCh0aGlzLnBhcmVudExpc3QubmFtZSkgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgdHJ1ZSBvbmx5IHdoZW4gY2xvc2VzdCBsaXZlbGlzdCBpcyB0aGUgaW1tZWRpYXRlIHBhcmVudCBvZiB0aGUgZm9ybS5cbiAgICAvLyBjaGVja3MgZm9yIGxpdmVsaXN0IGhhdmluZyBhbnkgZm9ybSBlbGVtZW50cyB3aXRoIHBhcmVudEZvcm0gbmFtZS5cbiAgICAvLyBJZiBsaXZlbGlzdCBpcyBub3QgY29udGFpbmluZyBhbnkgcGFyZW50Rm9ybSBlbGVtZW50cyB0aGVuIGl0IHJldHVybnMgdHJ1ZS5cbiAgICBnZXQgaXNQYXJlbnRMaXN0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRMaXN0ICYmIHRoaXMucGFyZW50Rm9ybSAmJiAhaXNEZWZpbmVkKHRoaXMuX2Zvcm1Jc0luTGlzdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgbGlzdEVsZSA9IGZvcm1FbGUuY2xvc2VzdCgnLmFwcC1saXZlbGlzdFtuYW1lPVwiJyArIHRoaXMucGFyZW50TGlzdC5uYW1lICsgJ1wiXScpO1xuICAgICAgICAgICAgaWYgKGxpc3RFbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybUlzSW5MaXN0ID0gIShsaXN0RWxlLmZpbmQoJ2Zvcm1bd2lkZ2V0LWlkPVwiJyArIHRoaXMucGFyZW50Rm9ybS53aWRnZXRJZCArICdcIl0nKSkubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0RlZmluZWQodGhpcy5fZm9ybUlzSW5MaXN0KSA/IHRoaXMuX2Zvcm1Jc0luTGlzdCA6IHRoaXMucGFyZW50TGlzdDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgaW5qOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgYXBwOiBBcHAsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogQWJzdHJhY3REaWFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRQcm92aWRlcjogRHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50TGlzdDogTGlzdENvbXBvbmVudCxcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudEZvcm06IEZvcm1Db21wb25lbnQsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRQcmVmYWI6IFByZWZhYkRpcmVjdGl2ZSxcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudFBhcnRpYWw6IFBhcnRpYWxEaXJlY3RpdmUsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2JlZm9yZXN1Ym1pdC5ldmVudCcpIHB1YmxpYyBvbkJlZm9yZVN1Ym1pdEV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnc3VibWl0LmV2ZW50JykgcHVibGljIG9uU3VibWl0RXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdiZWZvcmVyZW5kZXIuZXZlbnQnKSBwdWJsaWMgb25CZWZvcmVSZW5kZXJFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2RhdGFzZXQuYmluZCcpIHB1YmxpYyBiaW5kZGF0YXNldCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZm9ybWRhdGEuYmluZCcpIHByaXZhdGUgYmluZGZvcm1kYXRhLFxuICAgICAgICBAQXR0cmlidXRlKCd3bUxpdmVGb3JtJykgaXNMaXZlRm9ybSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnd21MaXZlRmlsdGVyJykgaXNMaXZlRmlsdGVyLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhLXJvbGUnKSByb2xlLFxuICAgICAgICBAQXR0cmlidXRlKCdrZXknKSBrZXksXG4gICAgICAgIEBBdHRyaWJ1dGUoJ25hbWUnKSBuYW1lXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgZ2V0V2lkZ2V0Q29uZmlnKGlzTGl2ZUZvcm0sIGlzTGl2ZUZpbHRlciwgcm9sZSkpO1xuXG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMpO1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aXRsZSBwcm9wZXJ0eSBhcyBhdHRyaWJ1dGUgYXMgaXQgaXMgY2F1c2luZyB1bm5lY2Vzc2FyeSB0b29sdGlwXG4gICAgICAgIHJlbW92ZUF0dHIodGhpcy5uYXRpdmVFbGVtZW50LCAndGl0bGUnKTtcbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpYWxvZ0lkID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlhbG9nSWQnKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0gPSBmYi5ncm91cCh7fSk7XG4gICAgICAgIHRoaXMuYmluZGluZ1ZhbHVlID0ga2V5IHx8IG5hbWU7XG5cbiAgICAgICAgLy8gT24gdmFsdWUgY2hhbmdlIGluIGZvcm0sIHVwZGF0ZSB0aGUgZGF0YW91dHB1dFxuICAgICAgICBjb25zdCBvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gIHRoaXMubmdmb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnVwZGF0ZURhdGFPdXRwdXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIoKCkgPT4gb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5lbFNjb3BlID0gdGhpcztcblxuICAgICAgICB0aGlzLmFkZEV2ZW50c1RvQ29udGV4dCh0aGlzLmNvbnRleHQpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmcy5mb3JFYWNoKGNvbXBvbmVudFJlZiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHdpZGdldHMgaW5zaWRlIGZvcm0gd2l0aCBmb3JtV2lkZ2V0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1XaWRnZXRzW2NvbXBvbmVudFJlZi5uYW1lXSA9IGNvbXBvbmVudFJlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybSAmJiB0aGlzLmlzUGFyZW50TGlzdCkge1xuICAgICAgICAgICAgLy8gc2V0dGluZyBmb3JtQXJyYXkgY29udHJvbCBvbiBuZ2Zvcm0uXG4gICAgICAgICAgICBpZiAoIV8uZ2V0KHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHMsIHRoaXMucGFyZW50TGlzdC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uc2V0Q29udHJvbCh0aGlzLnBhcmVudExpc3QubmFtZSwgbmV3IEZvcm1BcnJheShbXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHVzaGluZyB0aGUgbmdmb3JtIHRvIGZvcm1BcnJheS5cbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUFycmF5LnB1c2godGhpcy5uZ2Zvcm0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtQXJyYXlJbmRleCA9IHRoaXMucGFyZW50Rm9ybUFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRJbm5lck5nRm9ybVRvRm9ybSh0aGlzLmJpbmRpbmdWYWx1ZSk7XG4gICAgfVxuXG4gICAgZmluZE9wZXJhdGlvblR5cGUoKSB7fVxuXG4gICAgcHJpdmF0ZSBhZGRJbm5lck5nRm9ybVRvRm9ybShiaW5kaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybSkge1xuICAgICAgICAgICAgLy8gaGFuZGxpbmcgYXMgZm9ybUFycmF5IHdoZW4gcGFyZW50IGlzIGxpc3QuIEhlbmNlIHJldHVybmluZyBoZXJlIGZyb20gYWRkaW5nIHRvIHBhcmVudEZvcm0gYWdhaW4uXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BhcmVudExpc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhc3NpZ25pbmcgdGhlIGNvbnRyb2wgbmFtZSBvZiB0aGUgZm9ybSBpbnNpZGUgdGhlIHByZWZhYiB3aXRoIHRoZSBwcmVmYWIgbmFtZS5cbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBoYXBwZW4gb25seSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGZvcm0gaW5zaWRlIHByZWZhYi5cbiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoaXMgd2hlbiBtdWx0aXBsZSBmb3JtcyBhcmUgaW5zaWRlIHByZWZhYi5cbiAgICAgICAgICAgIC8vIFRoaXMgc2NlbmFyaW8gaGFzIHRvIGJlIGhhbmRsZWQgYnkgZW5kIHVzZXIgYnkgY2hhbmdpbmcgZm9ybSBuYW1lcyBpbiBwcmVmYWIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhbW9kZWwgYmluZGluZy5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9IHRoaXMucGFyZW50UHJlZmFiIHx8IHRoaXMucGFyZW50UGFydGlhbDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q29udGVudEVsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFByZWZhYikge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZW50RWwgPSBwYXJlbnRDb250YWluZXIuJGVsZW1lbnQuZmluZCgnW3dtcHJlZmFiY29udGFpbmVyXScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRlbnRFbCA9IHBhcmVudENvbnRhaW5lci4kZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogYXNzaWduaW5nIHRoZSBmb3JtIG5hbWUgdG8gdGhlIHBhcmVudENvbnRhaW5lciBuYW1lIGkuZS4gcGFydGlhbCBuYW1lIG9yIHBlcmZhYiBuYW1lIGJ5IGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAqIDEuIHJldHJpZXZpbmcgYWxsIHRoZSBmb3JtcyBpbiB0aGUgcGFyZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICogMi4gY29uc2lkZXIgdGhlIGZpcnN0IGZvcm1cbiAgICAgICAgICAgICAgICAgKiAzLiBpZiB0aGlzIGZvcm0gaXMgaW5zaWRlIGxpc3QgaS5lLiBhbHNvIGZpbmQgaWYgdGhpcyBsaXN0IGlzIGFsc28gaW5zaWRlIHRoZSBwYXJlbnRDb250YWluZXIgKHByZWZhYiAvIHBhcnRpYWwpXG4gICAgICAgICAgICAgICAgICogNC4gdGhlbiBkbyBub3QgY2hhbmdlIHRoZSBmb3JtIG5hbWUgd2hlbiBmb3JtIGlzIGluc2lkZSBsaXN0IGFuZCBhbHNvIHdoZW4gdGhlcmUgYXJlIHNpYmxpbmdzIHRvIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICogNS4gdGhpcyBtZWFucyBmb3JtIG5hbWUgY2hhbmdlIGFwcGxpZXMgb25seSB3aGVuIHRoZXJlIGlzIHNpbmdsZSBmb3JtIChpbW1lZGlhdGUgY2hpbGQpIGluc2lkZSB0aGUgcGFyZW50Q29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZWZhYklubmVyRm9ybSA9IHBhcmVudENvbnRlbnRFbC5maW5kKCdmb3JtJykuZmlyc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAoXy5nZXQocHJlZmFiSW5uZXJGb3JtWzBdLCAnd2lkZ2V0LndpZGdldElkJykgPT09IHRoaXMud2lkZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBmb3JtIGluc2lkZSBwcmVmYWIgY29udGFpbmVyIGlzIGluc2lkZSB0aGUgbGlzdC4gSWYgdHJ1ZSwgZG8gbm90IGNoYW5nZSB0aGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVmYWJJbm5lckZvcm0uaXNQYXJlbnRMaXN0ICYmICFwcmVmYWJJbm5lckZvcm0uc2libGluZ3MoJ2Zvcm0nKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBfLmdldChwYXJlbnRDb250YWluZXIsICduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDE7XG4gICAgICAgICAgICBsZXQgaW5uZXJCaW5kaW5nID0gYmluZGluZztcbiAgICAgICAgICAgIC8vIElubmVyIGZvcm1zIG1heSBoYXZlIHNhbWUgbmFtZXMuIElmIHNhbWUgbmFtZSBpcyBwcmVzZW50LCBhcHBlbmQgdW5xaXVlIGlkZW50aWZpZXJcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGlubmVyQmluZGluZykpIHtcbiAgICAgICAgICAgICAgICBpbm5lckJpbmRpbmcgPSBgJHtiaW5kaW5nfV8ke2NvdW50ZXJ9YDtcbiAgICAgICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cE5hbWUgPSBpbm5lckJpbmRpbmc7XG4gICAgICAgICAgICAvLyBJZiBwYXJlbnQgZm9ybSBpcyBwcmVzZW50LCBhZGQgdGhlIGN1cnJlbnQgZm9ybSBhcyBhcyBmb3JtR3JvdXAgZm9yIHBhcmVudCBmb3JtXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmFkZENvbnRyb2woaW5uZXJCaW5kaW5nLCB0aGlzLm5nZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdGhlIGV2ZW50cyBvbiBjb250ZXh0IHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgZm9ybSBhY3Rpb25zXG4gICAgcHJpdmF0ZSBhZGRFdmVudHNUb0NvbnRleHQoY29udGV4dCkge1xuICAgICAgICBjb250ZXh0LmNhbmNlbCA9ICgpID0+IHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIGNvbnRleHQucmVzZXQgPSAoKSA9PiB0aGlzLnJlc2V0KCk7XG4gICAgICAgIGNvbnRleHQuc2F2ZSA9IGV2dCA9PiB0aGlzLnNhdmUoZXZ0KTtcbiAgICAgICAgY29udGV4dC5zYXZlQW5kTmV3ID0gKCkgPT4gdGhpcy5zYXZlQW5kTmV3KCk7XG4gICAgICAgIGNvbnRleHQuc2F2ZUFuZFZpZXcgPSAoKSA9PiB0aGlzLnNhdmVBbmRWaWV3KCk7XG4gICAgICAgIGNvbnRleHQuZGVsZXRlID0gKCkgPT4gdGhpcy5kZWxldGUoKTtcbiAgICAgICAgY29udGV4dC5uZXcgPSAoKSA9PiB0aGlzLm5ldygpO1xuICAgICAgICBjb250ZXh0LmVkaXQgPSAoKSA9PiB0aGlzLmVkaXQoKTtcbiAgICAgICAgY29udGV4dC5oaWdobGlnaHRJbnZhbGlkRmllbGRzID0gKCkgPT4gdGhpcy5oaWdobGlnaHRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgIGNvbnRleHQuZmlsdGVyID0gKCkgPT4gdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgY29udGV4dC5jbGVhckZpbHRlciA9ICgpID0+IHRoaXMuY2xlYXJGaWx0ZXIoKTtcbiAgICAgICAgY29udGV4dC5zdWJtaXQgPSBldnQgPT4gdGhpcy5zdWJtaXQoZXZ0KTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGFsbCB0aGUgaW5uZXIgZm9ybXMgYW5kIHZhbGlkYXRlcyBlYWNoIGZvcm0uXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uT25Jbm5lckZvcm1zKHZhbGlkYXRlVG91Y2gpIHtcbiAgICAgICAgY29uc3QgZm9ybUVsZSA9IHRoaXMuZ2V0TmF0aXZlRWxlbWVudCgpO1xuICAgICAgICBjb25zdCBmb3JtT2JqcyA9IGZvcm1FbGUucXVlcnlTZWxlY3RvckFsbCgnLmFwcC1mb3JtJyk7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Nc2dzID0gW107XG4gICAgICAgIF8uZm9yRWFjaChmb3JtT2JqcywgZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSAoZSBhcyBhbnkpLndpZGdldDtcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudGlhdGluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIHByZWZpeCBiYXNlZCBvbiB0aGUgZm9ybUdyb3VwTmFtZVxuICAgICAgICAgICAgLy8gYXMgdGhlIGZvcm1OYW1lJ3MgYXJlIHNhbWUgd2hlbiBmb3JtcyBhcmUgaW4gbGlzdFxuICAgICAgICAgICAgbGV0IGZvcm1OYW1lID0gXy5nZXQoZm9ybUluc3RhbmNlLCAnZm9ybUdyb3VwTmFtZScpIHx8IGZvcm1JbnN0YW5jZS5uYW1lO1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChmb3JtSW5zdGFuY2UuZm9ybUFycmF5SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgZm9ybU5hbWUgPSBmb3JtTmFtZSArICdbJyArIGZvcm1JbnN0YW5jZS5mb3JtQXJyYXlJbmRleCArICddJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gZm9ybUluc3RhbmNlO1xuICAgICAgICAgICAgd2hpbGUgKF8uZ2V0KGN1cnJlbnQsICdwYXJlbnRGb3JtJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50TmFtZSA9IGN1cnJlbnQucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lIHx8IGN1cnJlbnQucGFyZW50Rm9ybS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnBhcmVudEZvcm0ucGFyZW50Rm9ybUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROYW1lICsgJ1snICsgY3VycmVudC5wYXJlbnRGb3JtLmZvcm1BcnJheUluZGV4ICsgJ10nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtTmFtZSA9IHBhcmVudE5hbWUgKyAnLicgKyBmb3JtTmFtZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRGb3JtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uT25GaWVsZHMoZm9ybUluc3RhbmNlLCBmb3JtTmFtZSwgdmFsaWRhdGVUb3VjaCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdmFsaWRhdGlvbiBvbiBmb3JtRmllbGRzLlxuICAgICAqIEFwcGxpZXMgdG8gaW5uZXJmb3JtIGFuZCBhbHNvIHNldHMgaW5uZXJmb3JtIHZhbGlkYXRpb24gb24gcGFyZW50IGZvcm0uXG4gICAgICogQHBhcmFtIHByZWZpeCBjb250YWlucyB0aGUgZm9ybSBuYW1lLCB3aGljaCBhbHNvIGluY2x1ZGVzIGl0cyBwYXJlbnRzIGZvcm0gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVUb3VjaFxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk9uRmllbGRzKGZvcm06IEZvcm1Db21wb25lbnQsIHByZWZpeDogc3RyaW5nLCB2YWxpZGF0ZVRvdWNoPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBjb250cm9scyA9IGZvcm0ubmdmb3JtLmNvbnRyb2xzO1xuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gZm9ybS5mb3JtRmllbGRzO1xuICAgICAgICBpZiAoIWZvcm1GaWVsZHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfLmZvckVhY2goY29udHJvbHMsICh2LCBrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZvcm1GaWVsZHMuZmluZChlID0+IGUua2V5ID09PSBrKTtcbiAgICAgICAgICAgIGlmICghZmllbGQgfHwgKHZhbGlkYXRlVG91Y2ggJiYgIXYudG91Y2hlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgdi5pbnZhbGlkKTtcbiAgICAgICAgICAgIC8vIGludm9raW5nIHRoZSBwcmVwYXJlVmFsaWRhdGlvbiBvbiBib3RoIHBhcmVudCBmb3JtIGFuZCBjdXJyZW50IGZvcm0uXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVWYWxpZGF0aW9uT2JqKHYsIGssIGZpZWxkLCBwcmVmaXgpO1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlVmFsaWRhdGlvbk9iai5jYWxsKGZvcm0sIHYsIGssIGZpZWxkLCBwcmVmaXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ25zIC8gdXBkYXRlcyB2YWxpZGF0aW9uTWVzc2FnZXMgYmFzZWQgb24gYW5ndWxhciBlcnJvcnMgb24gZmllbGRcbiAgICBwcml2YXRlIHByZXBhcmVWYWxpZGF0aW9uT2JqKHYsIGssIGZpZWxkLCBwcmVmaXgpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5maW5kSW5kZXgoZSA9PiAoZS5maWVsZCA9PT0gayAmJiBlLmZ1bGx5UXVhbGlmaWVkRm9ybU5hbWUgPT09IHByZWZpeCkpO1xuICAgICAgICBpZiAodi5pbnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogZmllbGQgY29udGFpbnMgdGhlIGZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAqIHZhbHVlIGNvbnRhaW5zIHRoZSBmaWVsZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAqIGVycm9yVHlwZSBjb250YWlucyB0aGUgbGlzdCBvZiBlcnJvcnNcbiAgICAgICAgICAgICAgICAgKiBtZXNzYWdlIGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgKiBnZXRFbGVtZW50IHJldHVybnMgdGhlIGVsZW1lbnQgaGF2aW5nIGZvY3VzLXRhcmdldFxuICAgICAgICAgICAgICAgICAqIGZvcm1OYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZvcm1cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGssXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBfLmtleXModi5lcnJvcnMpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmaWVsZC52YWxpZGF0aW9ubWVzc2FnZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLiRlbGVtZW50LmZpbmQoJ1tmb2N1cy10YXJnZXRdJyk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1OYW1lOiBfLmxhc3QocHJlZml4LnNwbGl0KCcuJykpLFxuICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZEZvcm1OYW1lOiBwcmVmaXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXNbaW5kZXhdLnZhbHVlID0gZmllbGQudmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXNbaW5kZXhdLmVycm9yVHlwZSA9IF8ua2V5cyh2LmVycm9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodi52YWxpZCAmJiBpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyB3aWxsIHJldHVybiBhIG9iamVjdCBjb250YWluaW5nIHRoZSBlcnJvciBkZXRhaWxzIGZyb20gdGhlIGxpc3Qgb2YgZm9ybUZpZWxkcyB0aGF0IGFyZSBpbnZhbGlkXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uTXNncyh2YWxpZGF0ZVRvdWNoPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUZpZWxkcy5sZW5ndGggJiYgXy5pc0VtcHR5KHRoaXMubmdmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk9uRmllbGRzKHRoaXMsIHRoaXMubmFtZSwgdmFsaWRhdGVUb3VjaCk7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk9uSW5uZXJGb3Jtcyh2YWxpZGF0ZVRvdWNoKTtcbiAgICB9XG5cbiAgICAvLyBjaGFuZ2UgYW5kIGJsdXIgZXZlbnRzIGFyZSBhZGRlZCBmcm9tIHRoZSB0ZW1wbGF0ZVxuICAgIHByb3RlY3RlZCBoYW5kbGVFdmVudChub2RlOiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbiwgbG9jYWxzOiBhbnkpIHtcbiAgICAgICAgaWYgKGV2ZW50TmFtZSAhPT0gJ3N1Ym1pdCcpIHtcbiAgICAgICAgICAgIHN1cGVyLmhhbmRsZUV2ZW50KHRoaXMubmF0aXZlRWxlbWVudCwgZXZlbnROYW1lLCBjYWxsYmFjaywgbG9jYWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmllbGRTb3VyY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1kYXRhc291cmNlICYmIHRoaXMuZm9ybWRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtZGF0YXNvdXJjZSAmJiAhdGhpcy5mb3JtZGF0YXNvdXJjZS50d29XYXlCaW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZm9ybUZpZWxkID0+IHtcbiAgICAgICAgICAgIGZvcm1GaWVsZC5zZXRGb3JtV2lkZ2V0KCdkYXRhdmFsdWVzb3VyY2UnLCB0aGlzLmZvcm1kYXRhc291cmNlKTtcbiAgICAgICAgICAgIGZvcm1GaWVsZC5zZXRGb3JtV2lkZ2V0KCdiaW5kZGF0YXZhbHVlJywgYCR7dGhpcy5iaW5kZm9ybWRhdGF9LiR7Zm9ybUZpZWxkLmtleX1gKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZXRob2QgbG9vcHMgdGhyb3VnaCB0aGUgZm9ybSBmaWVsZHMgYW5kIGhpZ2hsaWdodHMgdGhlIGludmFsaWQgZmllbGRzIGJ5IHNldHRpbmcgc3RhdGUgdG8gdG91Y2hlZFxuICAgIGhpZ2hsaWdodEludmFsaWRGaWVsZHMoKSB7XG4gICAgICAgIHNldFRvdWNoZWRTdGF0ZSh0aGlzLCB0aGlzLm5nZm9ybSwgJycpO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS4gSGlnaGxpZ2h0IGFsbCB0aGUgaW52YWxpZCBmaWVsZHMgaWYgdmFsaWRhdGlvbiB0eXBlIGlzIGRlZmF1bHRcbiAgICB2YWxpZGF0ZUZpZWxkc09uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25Nc2dzKCk7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS4gRm9yIGRlbGV0ZSBvcGVyYXRpb24sIGRvIG5vdCBjaGVjayB0aGUgdmFsaWRhdGlvbi5cbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uVHlwZSAhPT0gJ2RlbGV0ZScgJiYgKHRoaXMudmFsaWRhdGlvbnR5cGUgPT09ICdodG1sJyB8fCB0aGlzLnZhbGlkYXRpb250eXBlID09PSAnZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5uZ2Zvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb250eXBlID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgdW50b2NoZWQgZWxlbWVudCBhbmQgc2V0IGl0IHRvIHRvdWNoZWQuXG4gICAgICAgICAgICAgICAgLy8gU2FmYXJpIGRvZXMgbm90IGZvcm0gdmFsaWRhdGlvbnMuIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCBlcnJvciBpcyBzaG93biBmb3IgdXNlclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZUZvcm0gPSBmaW5kSW52YWxpZEVsZW1lbnQodGhpcy4kZWxlbWVudCwgdGhpcy5uZ2Zvcm0pO1xuICAgICAgICAgICAgICAgIGNvbnN0ICRpbnZhbGlkRm9ybSA9IGVsZUZvcm0ubmdGb3JtO1xuICAgICAgICAgICAgICAgIGxldCAkaW52YWxpZEVsZSAgPSBlbGVGb3JtLiRlbGU7XG4gICAgICAgICAgICAgICAgJGludmFsaWRFbGUgPSAkaW52YWxpZEVsZS5wYXJlbnQoKS5maW5kKCdbZm9jdXMtdGFyZ2V0XScpO1xuICAgICAgICAgICAgICAgIGlmICgkaW52YWxpZEVsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gc2F2ZSBjbGljayBpbiBwYWdlIGxheW91dCBsaXZlZm9ybSwgZm9jdXMgb2YgYXV0b2NvbXBsZXRlIHdpZGdldCBvcGVucyBmdWxsLXNjcmVlbiBzZWFyY2guXG4gICAgICAgICAgICAgICAgICAgIGlmICghJGludmFsaWRFbGUuaGFzQ2xhc3MoJ2FwcC1zZWFyY2gtaW5wdXQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGludmFsaWRFbGUuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZ0VsZSA9ICRpbnZhbGlkRm9ybSAmJiAkaW52YWxpZEZvcm0uY29udHJvbHNbJGludmFsaWRFbGUuYXR0cignZm9ybUNvbnRyb2xOYW1lJykgfHwgJGludmFsaWRFbGUuYXR0cignbmFtZScpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5nRWxlICYmIG5nRWxlLm1hcmtBc1RvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nRWxlLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdj8pIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb25hbGlnbic6XG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uQWxpZ25DbGFzcyA9ICdhbGlnbi0nICsgbnY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9ucG9zaXRpb24nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9ud2lkdGgnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9uc2l6ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uc2l6ZSA9IG52O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbm92YWxpZGF0ZSc6XG4gICAgICAgICAgICAgICAgLy8gIFNldCB2YWxpZGF0aW9uIHR5cGUgYmFzZWQgb24gdGhlIG5vdmFsaWRhdGUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICB0aGlzLndpZGdldC52YWxpZGF0aW9udHlwZSA9IChudiA9PT0gdHJ1ZSB8fCBudiA9PT0gJ3RydWUnKSA/ICdub25lJyA6ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Zvcm1kYXRhJzpcbiAgICAgICAgICAgICAgICAvLyBGb3IgbGl2ZWxpc3Qgd2hlbiBtdWx0aXNlbGVjdCBpcyBlbmFibGVkLCBmb3JtZGF0YSB3aWxsIGJlIGFycmF5IG9mIG9iamVjdHMuIEluIHRoaXMgY2FzZSBjb25zaWRlciB0aGUgbGFzdCBvYmplY3QgYXMgZm9ybWRhdGEuXG4gICAgICAgICAgICAgICAgaWYgKF8uaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfLmlzQXJyYXkobnYpID8gdGhpcy5zZXRGb3JtRGF0YShfLmxhc3QobnYpKSA6IHRoaXMuc2V0Rm9ybURhdGEobnYpO1xuICAgICAgICAgICAgICAgIC8vIGlmIGRhdGFzZXQgb24gdGhlIGZvcm1GaWVsZHMgYXJlIG5vdCBzZXQgYXMgdGhlIGRhdGFzb3VyY2VDaGFuZ2UgaXMgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgZm9ybUZpZWxkcyBhcmUgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNEYXRhU291cmNlVXBkYXRlZCAmJiB0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0bW9kZSc6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGF5b3V0RGlhbG9nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudiAmJiBudiA9PT0gJ0VkaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSB0aGlzLnVwZGF0ZU1vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNvdXJjZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Zvcm1kYXRhc291cmNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybURhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21ldGFkYXRhJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRm9ybUZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNldCc6XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeWluZyB0aGUgZGF0YXNldCBjaGFuZ2UgdG8gdGhlIGZvcm0tZmllbGQgd2lkZ2V0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmlzRGF0YVNldEJvdW5kICYmIF8uZ2V0KGZpZWxkLmZvcm1XaWRnZXQsICdkYXRhc2V0JCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5mb3JtV2lkZ2V0LmRhdGFzZXQkLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV2ZW50IGNhbGxiYWNrcyBvbiBzdWNjZXNzL2Vycm9yXG4gICAgb25SZXN1bHRDYihkYXRhLCBzdGF0dXMsIGV2ZW50Pykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7JGV2ZW50OiBldmVudCwgJGRhdGE6IGRhdGEsICRvcGVyYXRpb246IHRoaXMub3BlcmF0aW9uVHlwZX07XG4gICAgICAgIC8vIHdoZXRoZXIgc2VydmljZSBjYWxsIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygncmVzdWx0JywgcGFyYW1zKTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgLy8gaWYgc2VydmljZSBjYWxsIGlzIHN1Y2Nlc3MgY2FsbCB0aGlzIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWNjZXNzJywgcGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHNlcnZpY2UgY2FsbCBmYWlscyBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2Vycm9yJywgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc3BsYXkgb3IgaGlkZSB0aGUgaW5saW5lIG1lc3NhZ2UvIHRvYXN0ZXJcbiAgICB0b2dnbGVNZXNzYWdlKHNob3c6IGJvb2xlYW4sIG1zZz86IHN0cmluZywgdHlwZT86IHN0cmluZywgaGVhZGVyPzogc3RyaW5nKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZTtcbiAgICAgICAgaWYgKHNob3cgJiYgbXNnKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9ICh0eXBlID09PSAnZXJyb3InICYmIHRoaXMuZXJyb3JtZXNzYWdlKSA/IHRoaXMuZXJyb3JtZXNzYWdlIDogbXNnO1xuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZWxheW91dCA9PT0gJ0lubGluZScpIHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuY2hlY2tBcHBTZXJ2aWNlRXJyb3JNc2codHlwZSkgfHwgdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0geydjYXB0aW9uJzogdGVtcGxhdGUgfHwgJycsIHR5cGU6IHR5cGV9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUmVmLnNob3dNZXNzYWdlKHRoaXMuc3RhdHVzTWVzc2FnZS5jYXB0aW9uLCB0aGlzLnN0YXR1c01lc3NhZ2UudHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHdoZW4gbWVzc2FnZSBsYXlvdXQgaXMgaW5saW5lIG9uIHNhdmUsIHNjcm9sbCB0aGUgdmlldyB0byB0b3Agb2YgdGhlIGZvcm0gdG8gc2VlIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvblxuICAgICAgICAgICAgICAgIGlmICghaXNFbGVtZW50SW5WaWV3cG9ydCh0aGlzLiRlbGVtZW50WzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0VsZW1lbnQodGhpcy4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnlBcHAodGVtcGxhdGUsIHR5cGUsIGhlYWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UuY2FwdGlvbiA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgaXMgYW4gQXBwLm9uU2VydmljZUVycm9yIGhhbmRsZXIgZm9yIHRoZSBhcHAsIHRoYXQgbWVzc2FnZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHNlcnZlciByZXR1cm5lZCBlcnJvciBtZXNzYWdlXG4gICAgY2hlY2tBcHBTZXJ2aWNlRXJyb3JNc2codHlwZSkge1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25BY3Rpb24gPSBfLmdldCh0aGlzLmFwcCwgJ0FjdGlvbnMuYXBwTm90aWZpY2F0aW9uJyk7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25BY3Rpb24gJiYgdHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbkFjdGlvbi5nZXRNZXNzYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGlubGluZSBtZXNzYWdlLyB0b2FzdGVyXG4gICAgY2xlYXJNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZU1lc3NhZ2UoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgY2xhc3NlcyBvbiB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgY2FwdGlvbnBvc2l0aW9uIGFuZCBjYXB0aW9ud2lkdGggcHJvcGVydGllc1xuICAgIHByaXZhdGUgc2V0TGF5b3V0Q29uZmlnKCkge1xuICAgICAgICBsZXQgbGF5b3V0Q29uZmlnO1xuICAgICAgICBsYXlvdXRDb25maWcgPSBnZXRGaWVsZExheW91dENvbmZpZyh0aGlzLmNhcHRpb253aWR0aCwgdGhpcy5jYXB0aW9ucG9zaXRpb24sIF8uZ2V0KHRoaXMuYXBwLnNlbGVjdGVkVmlld1BvcnQsICdvcycpKTtcbiAgICAgICAgdGhpcy5fd2lkZ2V0Q2xhc3MgPSBsYXlvdXRDb25maWcud2lkZ2V0Q2xzO1xuICAgICAgICB0aGlzLl9jYXB0aW9uQ2xhc3MgPSBsYXlvdXRDb25maWcuY2FwdGlvbkNscztcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGb3JtV2lkZ2V0KHdpZGdldCkge1xuICAgICAgICBjb25zdCBuYW1lID0gd2lkZ2V0Lm5hbWUgfHwgd2lkZ2V0LmtleTtcbiAgICAgICAgdGhpcy5mb3JtV2lkZ2V0c1tuYW1lXSA9IHdpZGdldDtcbiAgICB9XG5cbiAgICByZWdpc3RlckZvcm1GaWVsZHMoZm9ybUZpZWxkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkQ291bnQgPSB0aGlzLmZvcm1GaWVsZHMucHVzaChmb3JtRmllbGQpO1xuICAgICAgICB0aGlzLmZvcm1maWVsZHNbZm9ybUZpZWxkLmtleV0gPSBmb3JtRmllbGQ7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JtV2lkZ2V0KGZvcm1GaWVsZCk7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5mb3JtRmllbGRzLnB1c2goZm9ybUZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5mb3JtZmllbGRzW2Zvcm1GaWVsZC5rZXldID0gZm9ybUZpZWxkO1xuICAgICAgICAgICAgLy8gaW5uZXIgZm9ybWZpZWxkcyBhcmUgcHVzaGVkIHRvIHBhcmVudEZvcm0sIHBhc3NpbmcgY3VycmVudCBpbm5lckZvcm0ncyBmb3JtZGF0YSB0byBzZXQgaW5uZXJGb3JtZGF0YSB0byB0aGVzZSBpbm5lckZvcm1GaWVsZHNcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5zZXRGb3JtRGF0YSh0aGlzLnBhcmVudEZvcm0uZm9ybWRhdGEsIHRoaXMuZm9ybUZpZWxkcywgdGhpcy5mb3JtZGF0YSB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV01TLTE4OTY3OiBBcHBseWluZyBmb3JtYWRhdGEgYWZ0ZXIgZm9ybWZpZWxkcyBhcmUgcmVhZHlcbiAgICAgICAgaWYgKGZpZWxkQ291bnQgPT09IHRoaXMubnVtYmVyT2ZGaWVsZHMgJiYgIV8uaXNFbXB0eSh0aGlzLmZvcm1kYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcbiAgICAgICAgICAgIF8uaXNBcnJheSh0aGlzLmZvcm1kYXRhKSA/IHRoaXMuc2V0Rm9ybURhdGEoXy5sYXN0KHRoaXMuZm9ybWRhdGEpKSA6IHRoaXMuc2V0Rm9ybURhdGEodGhpcy5mb3JtZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlckFjdGlvbnMoZm9ybUFjdGlvbikge1xuICAgICAgICB0aGlzLmJ1dHRvbkFycmF5LnB1c2goZm9ybUFjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBkYXRhb3V0cHV0IHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIGluIGluc2lkZSBmb3JtIHdpZGdldCB2YWx1ZVxuICAgIHVwZGF0ZUZvcm1EYXRhT3V0cHV0KGRhdGFPYmplY3QpIHtcbiAgICAgICAgLy8gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHdpZGdldHMgaW5zaWRlIHRoZSBsaXZlIGZvcm0gKG90aGVyIHRoYW4gZm9ybSBmaWVsZHMpIGluIGZvcm0gZGF0YVxuICAgICAgICBfLmZvckVhY2godGhpcy5uZ2Zvcm0udmFsdWUsICh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfLmZpbmQodGhpcy5mb3JtRmllbGRzLCB7a2V5fSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRhdGFvdXRwdXQgPSBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBvYmplY3QgbWVyZ2luZyB0aGUgZm9ybSBmaWVsZHMgYW5kIGN1c3RvbSB3aWRnZXRzIGRhdGFcbiAgICBjb25zdHJ1Y3REYXRhT2JqZWN0KCkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSAgICAgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xuICAgICAgICAvLyBHZXQgYWxsIGZvcm0gZmllbGRzIGFuZCBwcmVwYXJlIGZvcm0gZGF0YSBhcyBrZXkgdmFsdWUgcGFpcnNcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGxldCBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZTtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZC5kYXRhdmFsdWUgfHwgZmllbGQuX2NvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gKGZpZWxkVmFsdWUgPT09IG51bGwgfHwgZmllbGRWYWx1ZSA9PT0gJycpID8gdW5kZWZpbmVkIDogZmllbGRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBnZXRGaWxlcyh0aGlzLm5hbWUsIGZpZWxkLmtleSArICdfZm9ybVdpZGdldCcsIGZpZWxkLm11bHRpcGxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmllbGROYW1lID0gZmllbGQua2V5IHx8IGZpZWxkLnRhcmdldCB8fCBmaWVsZC5uYW1lO1xuXG4gICAgICAgICAgICAvLyBvbiBjdXJyZW50IEZvcm0sIHdoZW4gZmllbGQgaXMgaW5uZXJGb3JtIGZpZWxkIHRoZW4gd2UgZ3JvdXAgdGhlc2UgZmllbGRzIHVuZGVyIG5ldyBvYmplY3QgdXNpbmcgZm9ybUdyb3VwTmFtZSBhcyBrZXlcbiAgICAgICAgICAgIC8vIEZvciBzdXBwb3NlLCBhcHBsaWNhbnROYW1lLCBhcHBsaWNhbnRJRCBhcmUgZm9ybWZpZWxkcyBpbiBjdXJyZW50Rm9ybVxuICAgICAgICAgICAgLy8gVGhpcyBmb3JtIGlzIGhhdmluZyBpbm5lcmZvcm0gaS5lLiBhZGRyZXNzLCB0aGVzZSBmaWVsZHMgYXJlIGxpc3RlZCBhc1xuICAgICAgICAgICAgLy8ge1wiYXBwbGljYW50TmFtZVwiOiBcIlwiLCBcImFwcGxpY2FudElEXCI6IFwiXCIsIFwiYWRkcmVzc1wiOiB7XCJzdHJlZXRcIjogXCJcIn19XG4gICAgICAgICAgICBpZiAoZmllbGQuZm9ybS53aWRnZXRJZCAhPT0gdGhpcy53aWRnZXRJZCAmJiBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IF8uZ2V0KGZvcm1EYXRhLCBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUsIHt9KTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICBfLnNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lLCBmZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmZvcm0uaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBmb3JtZGF0YSBiYXNlZCBvbiBmb3JtQXJyYXlJbmRleFxuICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gXy5nZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0ucGFyZW50TGlzdC5uYW1lLCBbXSk7XG4gICAgICAgICAgICAgICAgZmRbZmllbGQuZm9ybS5mb3JtQXJyYXlJbmRleF0gPSBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSB8fCB7fTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XVtmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICBfLnNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1cGRhdGUgdGhlIGZpZWxkIHdpbGwgYmUgYWxyZWFkeSBwcmVzZW50IGluIGZvcm0gZGF0YVxuICAgICAgICAgICAgICAgIF8uc2V0KGZvcm1EYXRhLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YU91dHB1dChmb3JtRGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFvdXRwdXQ7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YU91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIGlmICh0aGlzLm5nZm9ybS50b3VjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25Nc2dzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybUZpZWxkcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBmaWVsZHMgaW4gcGFyZW50IGFuZCBpbm5lciBmb3JtIGFsc28uXG4gICAgLy8gVGhpcyByZXR1cm5zIHRoZSBmb3JtRmllbGRzIGluIHRoZSBmb3JtIGJhc2VkIG9uIHRoZSBmb3JtIG5hbWUuXG4gICAgZ2V0Rm9ybUZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIF8uZmlsdGVyKHRoaXMuZm9ybUZpZWxkcywgZm9ybUZpZWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtRmllbGQuZm9ybS5uYW1lID09PSB0aGlzLm5hbWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGEsIGlubmVyRm9ybWRhdGE/KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkLmtleSB8fCBmaWVsZC5uYW1lO1xuICAgICAgICAvLyBpZiBjdXN0b21maWVsZCBwYXJhbSB2YWx1ZSBpcyBub3QgaW4gdGhlIGZvcm1kYXRhIHRoZW4gZG8gbm90IGFzc2lnbiBmaWVsZCB2YWx1ZVxuICAgICAgICAvLyBhcyBpdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlIHdoaWNoIHdpbGwgYWdhaW4gYmUgb3ZlcnJpZGRlbiBieSB1bmRlZmluZWQuXG4gICAgICAgIGNvbnN0IGZkID0gaW5uZXJGb3JtZGF0YSA/IGlubmVyRm9ybWRhdGEgOiBkYXRhO1xuICAgICAgICBpZiAoZmQpIHtcbiAgICAgICAgICAgIGlmIChmZC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSAgXy5nZXQoZmQsIGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaW5jbHVkZXMoa2V5LCAnLicpKSB7XG4gICAgICAgICAgICAgICAgLy8ga2V5IGNvbnRhaW5zICcuJyB3aGVuIG1hcHBpbmcgdGhlIGZpZWxkcyB0byBjaGlsZCByZWZlcmVuY2UgaS5lLiBjaGlsZENvbCBpcyBoYXZpbmcga2V5IGFzIFwicGFyZW50LmNoaWxkQ29sXCJcbiAgICAgICAgICAgICAgICBpZiAoZmQuaGFzT3duUHJvcGVydHkoXy5zcGxpdChrZXksICcuJylbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gIF8uZ2V0KGZkLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdNUy0xODkwNjogRm9yIGRlZmF1bHQgdmFsdWUsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGlydHkgJiYgIXRoaXMuX3RyaWdnZXJlZEJ5VXNlcikge1xuICAgICAgICAgICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JtR3JvdXBOYW1lID0gZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogaWYgZm9ybUdyb3VwTmFtZSBpcyBkZWZpbmVkIHdoaWNoIG1lYW5zIGZpZWxkIGlzIGluc2lkZSB0aGUgaW5uZXIgZm9ybVxuICAgICAgICAgKiB0aGVuIHNldCB0aGUgZm9ybWRhdGEgb24gdGhlIGZpZWxkJ3MgZm9ybSB1c2luZyBmb3JtR3JvdXBOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZm9ybUdyb3VwTmFtZSAmJiBfLmdldChkYXRhLCBmb3JtR3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YS5jYWxsKGZpZWxkLmZvcm0sIGRhdGFbZm9ybUdyb3VwTmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGZvcm1kYXRhIGlzIGFzc2lnbmVkIGxhdGVyIHRoZW4gb24gcHJvcGVydHlDaGFuZ2VIYW5kbGVyLCBldmVuIGlubmVyIGZvcm1zIGRhdGEgYWxzbyBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgICAgICBpZiAoXy5nZXQoZmllbGQuZm9ybSwgJ3BhcmVudEZvcm1BcnJheScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YShkYXRhLCBpbm5lckZvcm1GaWVsZHM/LCBpbm5lckZvcm1kYXRhPykge1xuICAgICAgICAvLyB3aGVyZWFzIGZvcm1GaWVsZHMgZXhwbGljaXRseSBwYXNzZWQgY2FuIGNvbnRhaW4gaW5uZXJmb3JtIGZpZWxkcyBhbHNvLlxuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gaW5uZXJGb3JtRmllbGRzIHx8IHRoaXMuZm9ybUZpZWxkcztcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YSk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmllbGRWYWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkVmFsaWRhdGlvbnMuc2V0Q3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgIH1cblxuICAgIHJlc2V0Rm9ybVN0YXRlKCkge1xuICAgICAgICAvLyBjbGVhcmluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIG9uIHJlc2V0LlxuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKGZpZWxkLndpZGdldHR5cGUgPT09ICd1cGxvYWQnIHx8IGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBzYXZlUHJldmZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMucHJldmZvcm1GaWVsZHMgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5mb3JtRmllbGRzLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdrZXknOiBmaWVsZC5rZXksXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgICd3aWRnZXR0eXBlJzogZmllbGQud2lkZ2V0dHlwZSxcbiAgICAgICAgICAgICAgICAnb3V0cHV0Zm9ybWF0JzogZmllbGQub3V0cHV0Zm9ybWF0LFxuICAgICAgICAgICAgICAgICd2YWx1ZSc6IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2F2ZVByZXZEYXRhVmFsdWVzKCkge1xuICAgICAgICB0aGlzLnByZXZEYXRhVmFsdWVzID0gdGhpcy5mb3JtRmllbGRzLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geydrZXknOiBvYmoua2V5LCAndmFsdWUnOiBvYmoudmFsdWV9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRSZWFkb25seUZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQsIHNraXBWYWx1ZVNldD8pIHtcbiAgICAgICAgY29uc3QgJGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAkZm9ybUVsZS5maW5kKCdbbmFtZT1cIicgKyBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXRcIl0nKS52YWwoJycpO1xuICAgICAgICBmaWVsZC5fY29udHJvbC5yZXNldCgpO1xuICAgICAgICBpZiAoIXNraXBWYWx1ZVNldCkge1xuICAgICAgICAgICAgZmllbGQuaHJlZiA9ICcnO1xuICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1wdHlEYXRhTW9kZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGF2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkZpZWxkRGVmYXVsdFZhbHVlQ2hhbmdlKGZpZWxkLCBmaWVsZC5kZWZhdWx0dmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRPcGVyYXRpb25UeXBlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gbW9kZSB8fCAnaW5zZXJ0JztcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gTGl2ZV9PcGVyYXRpb25zLklOU0VSVDtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtcHR5RGF0YU1vZGVsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2RGF0YVZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IExpdmVfT3BlcmF0aW9ucy5VUERBVEU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZEYXRhVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2RGF0YU9iamVjdCA9IGdldENsb25lZE9iamVjdCh0aGlzLmZvcm1kYXRhIHx8IHt9KTtcblxuICAgICAgICB0aGlzLnNldFJlYWRvbmx5RmllbGRzKCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV01FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RlcGVuZHNvbicpO1xuICAgICAgICBpZiAoIXRhYmxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAkaW52b2tlV2F0Y2hlcnModHJ1ZSk7XG4gICAgICAgIHRoaXMuYXBwLm5vdGlmeSgnd20tZXZlbnQnLCB7ZXZlbnROYW1lLCB3aWRnZXROYW1lOiB0YWJsZUlkfSk7XG4gICAgfVxuXG4gICAgc3VibWl0Rm9ybSgkZXZlbnQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlLCBmb3JtRGF0YSwgcmVzdWx0O1xuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gdGhpcy5kYXRhc291cmNlO1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRmllbGRzT25TdWJtaXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybURhdGEgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCkpO1xuXG4gICAgICAgIGNvbnN0IGdldFBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7JGV2ZW50LCAkZm9ybURhdGE6IGZvcm1EYXRhLCAkZGF0YTogZm9ybURhdGF9O1xuICAgICAgICB9O1xuXG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVTdWJtaXRFdnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXN1Ym1pdCcsIGdldFBhcmFtcygpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0RXZ0IHx8IGRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIElmIG9uIHN1Ym1pdCBpcyB0aGVyZSBleGVjdXRlIGl0IGFuZCBpZiBpdCByZXR1cm5zIHRydWUgZG8gc2VydmljZSB2YXJpYWJsZSBpbnZva2UgZWxzZSByZXR1cm5cbiAgICAgICAgICAgIC8vIElmIGl0cyBhIHNlcnZpY2UgdmFyaWFibGUgY2FsbCBzZXRJbnB1dCBhbmQgYXNzaWduIGZvcm0gZGF0YSBhbmQgaW52b2tlIHRoZSBzZXJ2aWNlXG4gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtID0gZGF0YVNvdXJjZS5wYWdpbmF0aW9uICYmIGRhdGFTb3VyY2UucGFnaW5hdGlvbi5udW1iZXIgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSB0aGlzLm9wZXJhdGlvblR5cGUgPyB0aGlzLm9wZXJhdGlvblR5cGUgOiAnaW5zZXJ0JztcbiAgICAgICAgICAgICAgICBwZXJmb3JtRGF0YU9wZXJhdGlvbihkYXRhU291cmNlLCBmb3JtRGF0YSwge29wZXJhdGlvblR5cGU6IG9wZXJhdGlvblR5cGV9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2UuY2F0ZWdvcnkgPT09ICd3bS5DcnVkVmFyaWFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgncmVzZXRFZGl0TW9kZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLkxJU1RfUkVDT1JEUywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tpcFRvZ2dsZVN0YXRlJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbic6ICdsaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZ2UnOiBjdXJyZW50UGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXZlbnRNaXNzaW5nT3BNc2cnOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlhbG9nSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZGF0YS5ib2R5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkSlNPTihkYXRhLmJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRGVmaW5lZChyZXN1bHQpID8gcmVzdWx0IDogZGF0YS5ib2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0JzogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogdGhpcy5wb3N0bWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdzdWNjZXNzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuZXJyb3JtZXNzYWdlIHx8IGVycm9yLmVycm9yIHx8IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0JzogXy5nZXQoZXJyb3IsICdlcnJvcicpIHx8IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyAmJiAhdGhpcy5vbkVycm9yKSB8fCAocmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnICYmICF0aGlzLm9uU3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZSh0cnVlLCByZXNwb25zZS5tZXNzYWdlLCByZXNwb25zZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHJlc3BvbnNlLnJlc3VsdCwgcmVzcG9uc2Uuc3RhdHVzLCAkZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZURpYWxvZygpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNsb3NlKHRoaXMuZGlhbG9nSWQpO1xuICAgIH1cblxuICAgIC8vIE1ldGhvZCB0byBzaG93L2hpZGUgdGhlIHBhbmVsIGhlYWRlciBvciBmb290ZXIgYmFzZWQgb24gdGhlIGJ1dHRvbnNcbiAgICBzaG93QnV0dG9ucyhwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gXy5zb21lKHRoaXMuYnV0dG9uQXJyYXksIGJ0biA9PiB7XG4gICAgICAgICAgICByZXR1cm4gXy5pbmNsdWRlcyhidG4ucG9zaXRpb24sIHBvc2l0aW9uKSAmJiBidG4udXBkYXRlTW9kZSA9PT0gdGhpcy5pc1VwZGF0ZU1vZGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEV4cGFuZCBvciBjb2xsYXBzZSB0aGUgcGFuZWxcbiAgICBleHBhbmRDb2xsYXBzZVBhbmVsKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgLy8gZmxpcCB0aGUgYWN0aXZlIGZsYWdcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRGF0YVNvdXJjZVVwZGF0ZShyZXNwb25zZSwgbmV3Rm9ybSwgdXBkYXRlTW9kZSkge1xuICAgICAgICBpZiAobmV3Rm9ybSkge1xuICAgICAgICAgICAgdGhpcy5uZXcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGEocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gaXNEZWZpbmVkKHVwZGF0ZU1vZGUpID8gdXBkYXRlTW9kZSA6IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgdHJhbnZlcnNlcyB0aHJvdWdoIHRoZSBwYXJlbnQgY29udGFpbmluZyBmb3JtZGF0YSBhbmQgcmV0dXJucyB0aGUgcGFyZW50IGZvcm1kYXRhLlxuICAgICAqIEBwYXJhbSBmb3JtLCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGZvcm0gaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGdldE5lYXJlc3RQYXJlbnRGb3JtRGF0YShmb3JtKSB7XG4gICAgICAgIGlmICghZm9ybS5wYXJlbnRGb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtLmJpbmRmb3JtZGF0YSAmJiBfLmdldChmb3JtLnBhcmVudEZvcm0sICdmb3JtZGF0YScpICYmICFfLmlzRW1wdHkoZm9ybS5wYXJlbnRGb3JtLmZvcm1kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm0ucGFyZW50Rm9ybS5mb3JtZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXROZWFyZXN0UGFyZW50Rm9ybURhdGEoZm9ybS5wYXJlbnRGb3JtKTtcbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShmb3JtZGF0YTogYW55KSB7XG4gICAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5mb3JtZGF0YSkgJiYgdGhpcy5wYXJlbnRGb3JtICYmIGZvcm1kYXRhKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIElmIGZvcm0gaXMgaW5zaWRlIGxpc3QsXG4gICAgICAgICAgICAgKiAxLiBkaXJlY3RseSBhcHBseWluZyB0aGUgZm9ybWRhdGEgdG8gdGhlIGZvcm1BcnJheSB0byB1cGRhdGUgdGhlIGZvcm1kYXRhIG9uIGxpc3Qgb2YgZm9ybXMgdXNpbmcgcGF0Y2hWYWx1ZS5cbiAgICAgICAgICAgICAqIDIuIGFuZCBhbHNvIHNldHRpbmcgaW5kaXZpZHVhbCBmb3JtZGF0YSB0byB0aGUgZm9ybSBpbnNpZGUgZWFjaCBpdGVtIGJhc2VkIG9uIGZvcm1BcnJheUluZGV4LCB3aGVuIGZvcm0gaXMgbm90IGJvdW5kIHRvIGZvcm1kYXRhLlxuICAgICAgICAgICAgICogMy4gZXhwbGljaXRseSBpbnZva2luZyBmb3JtZGF0YSBhcyBmb3JtRmllbGRzIHdpbGwgY29udGFpbiBhbGwgdGhlIGZvcm1maWVsZHMgaW5jbHVkaW5nIGlubmVyRm9ybSdzIGZpZWxkc1xuICAgICAgICAgICAgICogKGlmIHdlIGRvIG5vdCBpbnZva2UgZXhwbGljaXRseSB0aGVuIGZvcm1GaWVsZHMgd2lsbCBqdXN0IGNvbnRhaW4gdGhlIGZpZWxkcyBpbnNpZGUgY3VycmVudCBmb3JtIGFuZCBub3QgaW5uZXIgZm9ybSBmaWVsZHMpXG4gICAgICAgICAgICAgKiA0LiBpZiBjaGlsZEZvcm1BcnJheURhdGEgaXMgbm90IGF2YWlsYWJsZSB3ZSB3aWxsIGNoZWNrIGZvciBpbm5lciBmb3JtIGRhdGEgdXNpbmcgXCJmb3JtR3JvdXBOYW1lXCIgYW5kIHdpbGwgc2V0IHRoZSBpbm5lcmZvcm0gZGF0YVxuICAgICAgICAgICAgICogSWYgbm90IGluc2lkZSBsaXN0LCBqdXN0IHNldCB0aGUgZm9ybWRhdGEgb24gYWxsIHRoZSBmb3JtZmllbGRzIGluY2x1ZGluZyBpbm5lckZvcm0gZmllbGRzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm1BcnJheSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZEZvcm1BcnJheURhdGEgPSBfLmdldChmb3JtZGF0YSwgdGhpcy5wYXJlbnRMaXN0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZEZvcm1BcnJheURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfLmlzQXJyYXkoY2hpbGRGb3JtQXJyYXlEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGb3JtQXJyYXlEYXRhID0gW2NoaWxkRm9ybUFycmF5RGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtQXJyYXkucGF0Y2hWYWx1ZShjaGlsZEZvcm1BcnJheURhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYmluZGZvcm1kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1kYXRhID0gY2hpbGRGb3JtQXJyYXlEYXRhW3RoaXMuZm9ybUFycmF5SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGEodGhpcy5mb3JtZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGb3JtRGF0YSA9IF8uZ2V0KGZvcm1kYXRhLCB0aGlzLnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEocGFyZW50Rm9ybURhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YShmb3JtZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGRhdGEgc291cmNlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICBpZiAoXy5nZXQodGhpcy5mb3JtRmllbGRzLCAnbGVuZ3RoJykgJiYgIXRoaXMuYmluZGZvcm1kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBmb3JtZGF0YSBvbiB0aGUgcGFyZW50IGZvcm0gd2lsbCBiZSBzZXQgYmVmb3JlIHRoZSBpbm5lciBmb3JtcyBhcmUgcmVuZGVyZWQuXG4gICAgICAgICAgICAgKiBIZW5jZSBoYW5kbGluZyBmb3JtZGF0YSBvbiB0aGUgaW5uZXJGb3Jtcywgd2hpY2ggbWlnaHQgYmUgcmVuZGVyZWQgc2xvd2x5IChzdXBwb3NlIHByZWZhYiB3aXRoIGZvcm0pXG4gICAgICAgICAgICAgKiBzZXR0aW5nIGlubmVyIGZvcm0ncyBmb3JtZGF0YSBvYnRhaW5lZCBmcm9tIHBhcmVudCBmb3JtZGF0YVxuICAgICAgICAgICAgICogdGhpcyBhcHBsaWVzIG9ubHkgd2hlbiBmb3JtZGF0YSBpcyBub3QgZ2l2ZW4gb24gdGhlIGlubmVyIGZvcm0uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGZvcm1kYXRhID0gdGhpcy5nZXROZWFyZXN0UGFyZW50Rm9ybURhdGEodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkZvcm1EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBmaWVsZCBkZWZhdWx0IHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZERlZmF1bHRWYWx1ZUNoYW5nZShmaWVsZCwgbnYpIHtcbiAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZVZhbHVlQnlUeXBlKG52LCB1bmRlZmluZWQsIGZpZWxkLndpZGdldHR5cGUsIGZpZWxkLnRyYWlsaW5nemVybyk7XG4gICAgICAgIC8vIFdNUy0yMjQzNDogRm9yIGRlZmF1bHQgdmFsdWUgc2V0IG9uIGluZGl2aWR1YWwgZm9ybSBmaWVsZHMsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICBpZiAodGhpcy5kaXJ0eSAmJiAhdGhpcy5fdHJpZ2dlcmVkQnlVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGZpZWxkIHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZFZhbHVlQ2hhbmdlKCkge1xuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuZCBjb21waWxlIHRoZSBmb3JtIGZpZWxkcyBmcm9tIHRoZSBtZXRhZGF0YVxuICAgIGFzeW5jIGdlbmVyYXRlRm9ybUZpZWxkcygpIHtcbiAgICAgICAgbGV0IG5vT2ZDb2x1bW5zO1xuICAgICAgICBsZXQgJGdyaWRMYXlvdXQ7XG4gICAgICAgIC8vIENoZWNrIGlmIGdyaWQgbGF5b3V0IGlzIHByZXNlbnQgb3Igbm90IGZvciBmaXJzdCB0aW1lXG4gICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX2lzR3JpZExheW91dFByZXNlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50ID0gdGhpcy4kZWxlbWVudC5maW5kKCcucGFuZWwtYm9keSBbd21sYXlvdXRncmlkXScpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzR3JpZExheW91dFByZXNlbnQpIHtcbiAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyBbd21sYXlvdXRncmlkXScpLmZpcnN0KCk7XG4gICAgICAgICAgICBub09mQ29sdW1ucyA9IE51bWJlcigkZ3JpZExheW91dC5hdHRyKCdjb2x1bW5zJykpIHx8IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgLmR5bmFtaWMtZm9ybS1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmICghJGdyaWRMYXlvdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cycpLnByZXBlbmQoJzxkaXYgY2xhc3M9XCJkeW5hbWljLWZvcm0tY29udGFpbmVyXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIC5keW5hbWljLWZvcm0tY29udGFpbmVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub09mQ29sdW1ucyA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSAxMiAvIG5vT2ZDb2x1bW5zO1xuICAgICAgICBsZXQgZmllbGRUZW1wbGF0ZSA9ICcnO1xuICAgICAgICBsZXQgY29sQ291bnQgPSAwO1xuICAgICAgICBsZXQgaW5kZXg7XG4gICAgICAgIGxldCB1c2VyRmllbGRzO1xuICAgICAgICBsZXQgZmllbGRzID0gdGhpcy5tZXRhZGF0YSA/IHRoaXMubWV0YWRhdGEuZGF0YSB8fCB0aGlzLm1ldGFkYXRhIDogW107XG5cbiAgICAgICAgdGhpcy5mb3JtRmllbGRzID0gW107IC8vIGVtcHR5IHRoZSBmb3JtIGZpZWxkc1xuXG4gICAgICAgIGlmIChfLmlzRW1wdHkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVSZW5kZXJFdnQpIHtcbiAgICAgICAgICAgIHVzZXJGaWVsZHMgPSB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXJlbmRlcicsIHskbWV0YWRhdGE6IGZpZWxkc30pO1xuICAgICAgICAgICAgaWYgKHVzZXJGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHMgPSB1c2VyRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFfLmlzQXJyYXkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGZpZWxkc1tjb2xDb3VudF0pIHtcbiAgICAgICAgICAgIGxldCBjb2xUbXBsID0gJyc7XG4gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBub09mQ29sdW1uczsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbY29sQ291bnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbFRtcGwgKz0gc2V0TWFya3VwRm9yRm9ybUZpZWxkKGZpZWxkc1tjb2xDb3VudF0sIGNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUgKz0gYDx3bS1ncmlkcm93PiR7Y29sVG1wbH08L3dtLWdyaWRyb3c+YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkge1xuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSA9IGA8d20tbGF5b3V0Z3JpZD4ke2ZpZWxkVGVtcGxhdGV9PC93bS1sYXlvdXRncmlkPmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmR5bmFtaWNGb3JtUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9keW5hbWljQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fZHluYW1pY0NvbnRleHQgPSBPYmplY3QuY3JlYXRlKHRoaXMudmlld1BhcmVudCk7XG4gICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dC5mb3JtID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5UmVmID0gYXdhaXQgdGhpcy5keW5hbWljQ29tcG9uZW50UHJvdmlkZXIuZ2V0Q29tcG9uZW50RmFjdG9yeVJlZihcbiAgICAgICAgICAgICdhcHAtZm9ybS1keW5hbWljLScgKyB0aGlzLndpZGdldElkLFxuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBub0NhY2hlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRyYW5zcGlsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZHluYW1pY0Zvcm1SZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnlSZWYsIDAsIHRoaXMuaW5qKTtcbiAgICAgICAgZXh0ZW5kUHJvdG8oY29tcG9uZW50Lmluc3RhbmNlLCB0aGlzLl9keW5hbWljQ29udGV4dCk7XG4gICAgICAgICRncmlkTGF5b3V0WzBdLmFwcGVuZENoaWxkKGNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHlwZSB8fCB0aGlzLmZpbmRPcGVyYXRpb25UeXBlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uZGlydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byBwcmlzdGluZSBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNQcmlzdGluZSBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzUHJpc3RpbmUodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNQcmlzdGluZSh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIGRpcnR5IGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc0RpcnR5IG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNEaXJ0eSh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZDtcbiAgICB9XG5cbiAgICBnZXQgdG91Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnRvdWNoZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0udmFsaWQ7XG4gICAgfVxuXG4gICAgZ2V0IHByaXN0aW5lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0ucHJpc3RpbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byB0b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1RvdWNoZWQgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1RvdWNoZWQodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gdW50b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1VudG91Y2hlZCBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzVW50b3VjaGVkKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZuID0gJHBhcnNlRXZlbnQoZXhwcmVzc2lvbik7XG4gICAgICAgIGZuKHRoaXMudmlld1BhcmVudCwgT2JqZWN0LmFzc2lnbih0aGlzLmNvbnRleHQsIHskZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIG9uIGZvcm0gZGVzdHJveSwgcmVtb3ZpbmcgdGhpcyBmb3JtIGZyb20gdGhlIHBhcmVudEZvcm0gdG9vLlxuICAgICAgICBjb25zdCBjb250cm9scyA9IHRoaXMucGFyZW50Rm9ybSAmJiBfLmdldCh0aGlzLnBhcmVudEZvcm0sICduZ2Zvcm0uY29udHJvbHMnKTtcbiAgICAgICAgaWYgKGNvbnRyb2xzKSB7XG4gICAgICAgICAgICAvLyB3aGVuIGN1cnJlbnQgZm9ybSBpcyBpbnNpZGUgdGhlIGxpc3QgKGkuZS4gaW5jYXNlIG9mIGZvcm1BcnJheSkuXG4gICAgICAgICAgICBpZiAoXy5nZXQodGhpcy5wYXJlbnRMaXN0LCAnbmFtZScpICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMucGFyZW50TGlzdC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLnBhcmVudExpc3QubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgZm9ybUdyb3VwTmFtZSBzZXQgaS5lLiBtdWx0aXBsZSBmb3JtSW5zdGFuY2Ugd2l0aCBjb3VudGVyIGFwcGVuZGVkIHRvIGZvcm1OYW1lXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBOYW1lICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMuZm9ybUdyb3VwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5yZW1vdmVDb250cm9sKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iXX0=