@mediusinc/mng-commons 5.4.0-rc.5 → 5.4.0-rc.7

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 (45) hide show
  1. package/core/data-list/data-list-params-helpers.d.ts +12 -2
  2. package/esm2022/core/data-list/data-list-params-helpers.mjs +14 -8
  3. package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +11 -1
  4. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +10 -5
  5. package/esm2022/form/components/dropdown/dropdown.component.mjs +67 -99
  6. package/esm2022/table/api/descriptors/table.descriptor.mjs +6 -2
  7. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +11 -11
  8. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +4 -3
  9. package/esm2022/table/components/table/table.component.mjs +45 -9
  10. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +4 -18
  11. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +9 -1
  12. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +10 -1
  13. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +14 -2
  14. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +24 -5
  15. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +3 -3
  16. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +3 -3
  17. package/esm2022/tableview/editor/helpers/editor-formly.mjs +7 -1
  18. package/fesm2022/mediusinc-mng-commons-core.mjs +13 -7
  19. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  20. package/fesm2022/mediusinc-mng-commons-filter.mjs +10 -0
  21. package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
  22. package/fesm2022/mediusinc-mng-commons-form.mjs +75 -103
  23. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  24. package/fesm2022/mediusinc-mng-commons-table-api.mjs +5 -1
  25. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  26. package/fesm2022/mediusinc-mng-commons-table.mjs +57 -20
  27. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  28. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +30 -1
  29. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  30. package/fesm2022/mediusinc-mng-commons-tableview.mjs +35 -24
  31. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  32. package/filter/descriptors/filter-generic.descriptor.d.ts +5 -2
  33. package/form/components/autocomplete/autocomplete.component.d.ts +1 -0
  34. package/form/components/dropdown/dropdown.component.d.ts +5 -10
  35. package/package.json +1 -1
  36. package/table/api/descriptors/table.descriptor.d.ts +1 -0
  37. package/table/components/filter/filter-form/filter-form.component.d.ts +11 -8
  38. package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +3 -2
  39. package/table/components/table/table.component.d.ts +6 -2
  40. package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +0 -2
  41. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +3 -0
  42. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +5 -0
  43. package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +8 -0
  44. package/tableview/editor/components/editor/form-editor.component.d.ts +5 -1
  45. package/version-info.json +6 -6
@@ -604,8 +604,12 @@ export class TableDescriptorInst {
604
604
  addFilterFromColumn(property, displayType, forceSimple = false) {
605
605
  return this.addFilterFromColumnUnsafe(property, displayType, forceSimple);
606
606
  }
607
- withGenericFilter(propertyLookupDataProvider, valueLookupDataProvider) {
607
+ addGenericFilter(propertyLookupDataProvider) {
608
608
  this._genericFilter = new FilterGenericDescriptor(propertyLookupDataProvider);
609
+ return this._genericFilter;
610
+ }
611
+ withGenericFilter(propertyLookupDataProvider, valueLookupDataProvider) {
612
+ this._genericFilter = this.addGenericFilter(propertyLookupDataProvider);
609
613
  if (valueLookupDataProvider) {
610
614
  this._genericFilter.withValueLookup(valueLookupDataProvider);
611
615
  }
@@ -1085,4 +1089,4 @@ export class TableDynamicDescriptorInst extends TableDescriptorInst {
1085
1089
  return descriptor;
1086
1090
  }
1087
1091
  }
1088
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RhYmxlL2FwaS9zcmMvZGVzY3JpcHRvcnMvdGFibGUuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsb0JBQW9CLEVBQTJFLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0osT0FBTyxFQUNILGdCQUFnQixFQUVoQix1QkFBdUIsRUFFdkIsc0JBQXNCLEVBQ3RCLDBCQUEwQixFQUMxQixjQUFjLEVBQ2pCLE1BQU0sK0JBQStCLENBQUM7QUFJdkMsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUF3QixjQUFjLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUc3RSxPQUFPLEVBQUMsMkJBQTJCLEVBQTJCLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxNQUFNLE9BQU8sbUJBQW1CO0lBd0Q1QixZQUFtQixLQUFrQyxFQUFFLGFBQWEsR0FBRyxLQUFLO1FBN0NsRSxhQUFRLEdBQTZDLEVBQUUsQ0FBQztRQUUxRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixpQkFBWSxHQUFrQixlQUFlLENBQUM7UUFFdEQsUUFBUTtRQUNBLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBT3JDLFVBQVU7UUFDRixVQUFLLEdBQWtCLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUt4QixnQkFBZ0I7UUFDUixhQUFRLEdBQXdDLEVBQUUsQ0FB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QUksRUFBRSxDQUFDLENBQUM7UUFDdEQsVUFBVSxDQUFDLGdCQUFnQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6RCxVQUFVLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsVUFBVSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELFVBQVUsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDdEQsVUFBVSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2xELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxpQkFBaUI7UUFDcEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxtQkFBbUIsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QixPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge0NvbW1vbnNJbnRlcm5hbEVycm9yLCBEYXRhTGlzdFJlc3VsdCwgRW51bUNvbnN0YW50VHlwZSwgSUxvb2t1cERhdGFQcm92aWRlciwgSVRhYmxlRGVzY3JpcHRvciwgZmxhdHRlbk9iamVjdEtleXN9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge1xuICAgIEZpbHRlckRlc2NyaXB0b3IsXG4gICAgRmlsdGVyRGlzcGxheVR5cGVFbnVtLFxuICAgIEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yLFxuICAgIEZpbHRlckdlbmVyaWNQcm9wZXJ0eSxcbiAgICBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLFxuICAgIEZpbHRlckxvb2t1cEVudW1EZXNjcmlwdG9yLFxuICAgIEZpbHRlclR5cGVFbnVtXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7TG9va3VwRGF0YVByb3ZpZGVySW5zdH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9mb3JtL2FwaSc7XG5pbXBvcnQge0VudW1EZXNjcmlwdG9yLCBNb2RlbERlc2NyaXB0b3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvbW9kZWwnO1xuXG5pbXBvcnQge2NvbHVtblRvRGF0ZU51bWJlck9yQm9vbGVhbn0gZnJvbSAnLi4vaGVscGVycy9jbGFzcy1hdHRyaWJ1dGUtY29udmVydGVyJztcbmltcG9ydCB7Q29sdW1uRGlzcGxheVR5cGVFbnVtLCBDb2x1bW5UeXBlRW51bX0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi5tb2RlbCc7XG5pbXBvcnQge0lSb3dFeHBhbmRhYmxlQ29tcG9uZW50fSBmcm9tICcuLi9tb2RlbHMvcm93LWV4cGFuZGFibGUtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7SUNvbHVtbnNNYW5hZ2VJbnRlcmZhY2V9IGZyb20gJy4uL21vZGVscy90YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7VGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLCBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSwgVGFibGVTaXplRW51bX0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7Q29sdW1uRGVzY3JpcHRvciwgQ29sdW1uRHluYW1pY0Rlc2NyaXB0b3J9IGZyb20gJy4vY29sdW1uLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtTb3J0RGVzY3JpcHRvcn0gZnJvbSAnLi9zb3J0LmRlc2NyaXB0b3InO1xuXG5leHBvcnQgY2xhc3MgVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZU1vZGVsLCBTb3J0cyA9IGtleW9mIFRhYmxlTW9kZWwsIEZpbHRlcnMgPSBrZXlvZiBUYWJsZU1vZGVsPlxuICAgIGltcGxlbWVudHMgSVRhYmxlRGVzY3JpcHRvcjxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz4sIElDb2x1bW5zTWFuYWdlSW50ZXJmYWNlPFRhYmxlTW9kZWwsIFNvcnRzLCBGaWx0ZXJzPlxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGVsOiBNb2RlbERlc2NyaXB0b3I8VGFibGVNb2RlbD47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hdXRvR2VuZXJhdGVkO1xuXG4gICAgcHJpdmF0ZSBfaWRlbnRpZmllcj86IHN0cmluZztcbiAgICBwcml2YXRlIF90cmFja1Byb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3BhZ2luYXRpb25Nb2RlPzogVGFibGVQYWdpbmF0aW9uTW9kZUVudW07XG4gICAgcHJpdmF0ZSBfcm93c1BlclBhZ2VPcHRpb25zPzogbnVtYmVyW107XG4gICAgcHJpdmF0ZSBfZGVmYXVsdE51bVJvd3M/OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9jb2x1bW5zOiBBcnJheTxDb2x1bW5EZXNjcmlwdG9yPGFueSwgVGFibGVNb2RlbD4+ID0gW107XG4gICAgcHJpdmF0ZSBfdGl0bGU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfaGlkZUhlYWRlciA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xvYWRpbmdUZXh0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2xvYWRpbmdJY29uOiBzdHJpbmcgfCBudWxsID0gJ3BpIHBpLXNwaW5uZXInO1xuXG4gICAgLy8gZXh0cmFcbiAgICBwcml2YXRlIF9oYXNIb3ZlciA9IHRydWU7XG4gICAgcHJpdmF0ZSBfaGFzR3JpZGxpbmVzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaGFzUmVzaXphYmxlQ29sdW1ucyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NvbHVtblJlc2l6ZU1vZGU/OiAnZml0JyB8ICdleHBhbmQnO1xuXG4gICAgLy8gc3BlY2lhbCBjb2x1bW5zXG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uQ29sdW1uRnJvemVuPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9hY3Rpb25Db2x1bW5Gcm96ZW4/OiBib29sZWFuO1xuXG4gICAgLy8gc3R5bGluZ1xuICAgIHByaXZhdGUgX3NpemU6IFRhYmxlU2l6ZUVudW0gPSBUYWJsZVNpemVFbnVtLkxhcmdlO1xuICAgIHByaXZhdGUgX2NsYXNzTmFtZSA9ICcnO1xuICAgIHByaXZhdGUgX2hlYWRlckNsYXNzTmFtZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9yb3dDbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93Q2xhc3NOYW1lTWFwRm4/OiAoY2xhc3NOYW1lPzogc3RyaW5nLCBpdGVtPzogVGFibGVNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgLy8gZmlsdGVycyZzb3J0c1xuICAgIHByaXZhdGUgX2ZpbHRlcnM6IEZpbHRlckRlc2NyaXB0b3I8YW55LCBUYWJsZU1vZGVsPltdID0gW107XG4gICAgcHJpdmF0ZSBfZ2VuZXJpY0ZpbHRlcj86IEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yO1xuICAgIHByaXZhdGUgX3NvcnRzOiBTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPltdID0gW107XG5cbiAgICAvLyBsb2NhbGl6YXRpb25cbiAgICBwcml2YXRlIF9pc0xvY2FsaXplZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5Pzogc3RyaW5nO1xuXG4gICAgLy8gcm93IGV4cGFuZFxuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRhYmxlQ29sU3BhbiA9IDEwMDtcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRhYmxlUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGU/OiBUeXBlPElSb3dFeHBhbmRhYmxlQ29tcG9uZW50PFRhYmxlTW9kZWw+PjtcblxuICAgIC8vIHJvdyByZW9yZGVyXG4gICAgcHJpdmF0ZSBfcm93UmVvcmRlcmFibGUgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX3NlYXJjaD86IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfc2VhcmNoTGltaXRNYXhXb3Jkcz86IG51bWJlciB8IG51bGw7XG4gICAgcHJpdmF0ZSBfc2VhcmNoRmllbGRzPzogc3RyaW5nW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUYWJsZU1vZGVsPiwgYXV0b0dlbmVyYXRlZCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMuX3RyYWNrUHJvcGVydHkgPSB0aGlzLl9tb2RlbC5pZFByb3BlcnR5O1xuICAgICAgICB0aGlzLl9hdXRvR2VuZXJhdGVkID0gYXV0b0dlbmVyYXRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlkZW50aWZpZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHJhY2tQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNrUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdpbmF0aW9uTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRpb25Nb2RlO1xuICAgIH1cblxuICAgIGdldCByb3dzUGVyUGFnZU9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dzUGVyUGFnZU9wdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0IGRlZmF1bHROdW1Sb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdE51bVJvd3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoaWRlSGVhZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZUhlYWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmdUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ1RleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2FkaW5nSWNvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdJY29uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBnZW5lcmljRmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJpY0ZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VhcmNoTGltaXRNYXhXb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaExpbWl0TWF4V29yZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hGaWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0hvdmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzSG92ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNHcmlkbGluZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNHcmlkbGluZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSZXNpemFibGVDb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzUmVzaXphYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHVtblJlc2l6ZU1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5SZXNpemVNb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93Q2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93Q2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93Q2xhc3NOYW1lTWFwRm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dDbGFzc05hbWVNYXBGbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkNvbHVtbkZyb3plbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbkNvbHVtbkZyb3plbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbkNvbHVtbkZyb3plbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbkNvbHVtbkZyb3plbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlckNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzTG9jYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2NhbGl6ZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93UmVvcmRlcmFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dSZW9yZGVyYWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0V4cGFuZGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFeHBhbmRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kYWJsZUNvbFNwYW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFeHBhbmRhYmxlQ29sU3BhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHRhYmxlIG1vZGVsIHByb3BlcnR5IHRlbGxzIHVzIGlmIHRoZSBzcGVjaWZpYyByb3cgc2hvdWxkIGJlIGV4cGFuZGFibGUgb3Igbm90IGJhc2VkIG9uIHJvdyBpdGVtIHZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFeHBhbmRhYmxlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFeHBhbmRhYmxlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgdHlwZSBvZiB0aGUgY3VzdG9tIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIGV4cGFuZGVkIHJvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBpcyB1c2VkIGZvciB0aGUgcHVycG9zZSBvZiBjb21iaW5lZCBzYXZpbmcgdXNlciBwcmVmZXJlbmNlcyBpbiBsb2NhbHN0b3JhZ2UgaWYgMiB0YWJsZXMgaGF2ZSB0aGUgc2FtZSB0cmFjayBwcm9wZXJ0aWVzIHRoZXkgd2lsbCBzaGFyZSB0aGUgc2FtZSBsb2NhbHN0b3JhZ2UgZW50cnkuXG4gICAgICogU2ltaWxhcmx5LCB0aGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0d28gdGFibGVzIG9mIHRoZSBzYW1lIG1vZGVsIG9uIHRoZSBzYW1lIHVybCAoc28gdGhhdCB0aGV5IGhhdmUgc2VwYXJhdGUgZW50cmllcyBpbiBsb2NhbHN0b3JhZ2UpLlxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyXG4gICAgICovXG4gICAgcHVibGljIHdpdGhJZGVudGlmaWVyKGlkZW50aWZpZXI6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdHJhY2sgcHJvcGVydHkgKGlkZW50aWZpZXIgb2YgdGFibGUgcm93KSBmb3IgdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtrZXlvZiBUYWJsZU1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byB0cmFjayB0aGUgcm93IGl0ZW1zIGJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoVHJhY2tQcm9wZXJ0eShwcm9wZXJ0eT86IGtleW9mIFRhYmxlTW9kZWwpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFRyYWNrUHJvcGVydHlVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0cmFjayBwcm9wZXJ0eSAoaWRlbnRpZmllciBvZiB0YWJsZSByb3cpIGZvciB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBzZXQgJ190cmFja1Byb3BlcnR5JyB0by5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRyYWNrUHJvcGVydHlVbnNhZmUocHJvcGVydHk/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdHJhY2tQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbHVtbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2tleW9mIFRhYmxlTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGZvciBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb2x1bW48UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsLCBDb2x1bW5Nb2RlbCA9IE5vbk51bGxhYmxlPFRhYmxlTW9kZWxbUHJvcGVydHldPiwgQ29sdW1uVmFsdWUgPSBUYWJsZU1vZGVsW1Byb3BlcnR5XT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eVxuICAgICk6IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5VbnNhZmU8Q29sdW1uTW9kZWwsIENvbHVtblZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgY29sdW1uIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtrZXlvZiBUYWJsZU1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBmb3IgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sdW1uVW5zYWZlPENvbHVtbk1vZGVsID0gYW55LCBDb2x1bW5WYWx1ZSA9IENvbHVtbk1vZGVsPihwcm9wZXJ0eTogc3RyaW5nKTogQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbCwgQ29sdW1uVmFsdWU+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY29sdW1uIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7a2V5b2YgVGFibGVNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgZm9yIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVDb2x1bW4ocHJvcGVydHk6IGtleW9mIFRhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDb2x1bW5VbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjb2x1bW4gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2tleW9mIFRhYmxlTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGZvciBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlQ29sdW1uVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29sdW1uSWR4ID0gdGhpcy5fY29sdW1ucy5maW5kSW5kZXgoYyA9PiBjLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMuc3BsaWNlKGNvbHVtbklkeCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBjb2x1bW4gZGVzY3JpcHRvciB0byB0YWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsLCBDb2x1bW5WYWx1ZT59IGNvbHVtbiAtIFRoZSBwcm9wZXJ0eSBmb3IgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW48Q29sdW1uTW9kZWwsIENvbHVtblZhbHVlID0gQ29sdW1uTW9kZWw+KGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbCwgQ29sdW1uVmFsdWU+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgY29sdW1uIGluIHRoZSB0YWJsZSBtb2RlbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXdseSBhZGRlZCBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29sdW1uPFByb3BlcnR5S2V5IGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbD4ocHJvcGVydHk6IFByb3BlcnR5S2V5KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yPE5vbk51bGxhYmxlPFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPiwgVGFibGVNb2RlbCwgVGFibGVNb2RlbFtQcm9wZXJ0eUtleV0+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gd2l0aCBlbnVtIGRpc3BsYXkgdG8gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eUtleX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSB0YWJsZSBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge0VudW1EZXNjcmlwdG9yPEVudW0+fSBlbnVtRGVzYyAtIFRoZSBlbnVtIGRlc2NyaXB0b3IgZm9yIGNvbHVtbiBkaXNwbGF5LlxuICAgICAqIEByZXR1cm4ge0NvbHVtbkRlc2NyaXB0b3I8RW51bSwgVGFibGVNb2RlbCwgVGFibGVNb2RlbFtQcm9wZXJ0eUtleV0+fSAtIFRoZSBhZGRlZCBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29sdW1uRW51bTxQcm9wZXJ0eUtleSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwsIEVudW0gZXh0ZW5kcyBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4+KHByb3BlcnR5OiBQcm9wZXJ0eUtleSwgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yPEVudW0sIFRhYmxlTW9kZWwsIFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgICAgICBjb2x1bW4uYXNFbnVtVW5zYWZlKGVudW1EZXNjKTtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGNvbHVtbiBpbiB0aGUgdGFibGUgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgYWRkZWQgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZENvbHVtblVuc2FmZTxDb2x1bW5Nb2RlbCA9IHVua25vd24+KHByb3BlcnR5OiBzdHJpbmcpOiBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgb25lIG9yIG1vcmUgY29sdW1ucyB0byB0aGUgdGFibGUgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRvIGFkZCBhcyBjb2x1bW5zLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1ucyguLi5wcm9wZXJ0aWVzOiAoa2V5b2YgVGFibGVNb2RlbClbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB0aGlzLmFkZENvbHVtbihwKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcGFnaW5hdGlvbiBtb2RlIGZvciB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RhYmxlUGFnaW5hdGlvbk1vZGVFbnVtfSBwYWdpbmF0aW9uTW9kZSAtIFRoZSBwYWdpbmF0aW9uIG1vZGUgdG8gc2V0LiBNdXN0IGJlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gdGhlIFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUGFnaW5hdGlvbk1vZGUocGFnaW5hdGlvbk1vZGU6IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25Nb2RlID0gcGFnaW5hdGlvbk1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlIGZvciBhIHBhZ2luYXRlZCBkaXNwbGF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd3MgLSBUaGUgZGVmYXVsdCBudW1iZXIgb2Ygcm93cyB0byBkaXNwbGF5IHBlciBwYWdlLlxuICAgICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnNdIC0gUm93cyBwZXIgcGFnZSBvcHRpb25zIHRvIGJlIGF2YWlsYWJsZSBpbiB0YWJsZSBwYWdpbmF0b3IuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSb3dzUGVyUGFnZShyb3dzOiBudW1iZXIsIG9wdGlvbnM/OiBBcnJheTxudW1iZXI+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHROdW1Sb3dzID0gcm93cztcbiAgICAgICAgdGhpcy5fcm93c1BlclBhZ2VPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGl0bGVdIC0gVGhlIHRpdGxlIHZhbHVlIHRvIGJlIHNldC4gSXQgdW5kZWZpZW5kLCBubyB0aXRsZSB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MvaGlkZXMgdGhlIGhlYWRlciByb3cgd2l0aCBjb2x1bW4gdGl0bGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlSGVhZGVyIC0gQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byBoaWRlIHRoZSBoZWFkZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhIaWRlSGVhZGVyKGhpZGVIZWFkZXIgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX2hpZGVIZWFkZXIgPSBoaWRlSGVhZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGp1c3RzIGxvYWRpbmcgZGlzcGxheSB3aXRoIGN1c3RvbSB0ZXh0IGFuZC9vciBpY29uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XSAtIFRleHQgdG8gYmUgZGlzcGxheWVkIHdoZW4gbG9hZGluZyBpbmRpY2F0b3IgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBbaWNvbl0gLSBJY29uIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIGluZGljYXRvciBpcyBzaG93bi5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aExvYWRpbmcodGV4dD86IHN0cmluZywgaWNvbj86IHN0cmluZyB8IG51bGwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9hZGluZ1RleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLl9sb2FkaW5nSWNvbiA9IGljb24gPT09IHVuZGVmaW5lZCA/ICdwaSBwaS1zcGlubmVyJyA6IGljb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc29ydCBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTb3J0c30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gcmV0cmlldmUgdGhlIHNvcnQgZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4gfCBudWxsfSBUaGUgc29ydCBkZXNjcmlwdG9yIG9yIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIGdldFNvcnQocHJvcGVydHk6IFNvcnRzKTogU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U29ydFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc29ydCBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NvcnRzfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZSB0aGUgc29ydCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPiB8IG51bGx9IFRoZSBzb3J0IGRlc2NyaXB0b3Igb3IgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRzLmZpbmQocyA9PiBzLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzb3J0IGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTb3J0c30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gcmVtb3ZlIHRoZSBzb3J0IGZvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlU29ydChwcm9wZXJ0eTogU29ydHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlU29ydFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNvcnQgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U29ydHN9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHJlbW92ZSB0aGUgc29ydCBmb3IuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3J0SWR4ID0gdGhpcy5fc29ydHMuZmluZEluZGV4KGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9zb3J0cy5zcGxpY2Uoc29ydElkeCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBzb3J0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYWRkIHRoZSBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0IElmIGRlZmF1bHQgc29ydGluZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgSWYgZGVmYXVsdCBzb3J0IHNob3VsZCBiZSBhc2NlbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgc29ydCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTb3J0KHByb3BlcnR5OiBTb3J0cywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiBTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nLCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBzb3J0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBhZGQgdGhlIHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBpc0RlZmF1bHQgSWYgZGVmYXVsdCBzb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIGFzY2VuZGluZyBJZiBkZWZhdWx0IHNvcnQgc2hvdWxkIGJlIGFzY2VuZGluZy5cblxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBzb3J0IGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiBTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IHNvcnQgPSBuZXcgU29ydERlc2NyaXB0b3I8VGFibGVNb2RlbD4ocHJvcGVydHkpO1xuICAgICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0T3JkZXJNYXggPSB0aGlzLl9zb3J0c1xuICAgICAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmRlZmF1bHRJc0VuYWJsZWQpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBzKSA9PiAocy5kZWZhdWx0T3JkZXIgIT09IHVuZGVmaW5lZCAmJiBzLmRlZmF1bHRPcmRlciA+IGFjYyA/IHMuZGVmYXVsdE9yZGVyIDogYWNjKSwgLTEpO1xuICAgICAgICAgICAgc29ydC53aXRoRGVmYXVsdFNvcnQodHJ1ZSwgYXNjZW5kaW5nLCBkZWZhdWx0T3JkZXJNYXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0cy5wdXNoKHNvcnQpO1xuICAgICAgICByZXR1cm4gc29ydDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHNvcnQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBhZGQgdGhlIHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBpc0RlZmF1bHQgSWYgZGVmYXVsdCBzb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIGFzY2VuZGluZyBJZiBkZWZhdWx0IHNvcnQgc2hvdWxkIGJlIGFzY2VuZGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNvcnQocHJvcGVydHk6IFNvcnRzLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU29ydFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIGlzRGVmYXVsdCwgYXNjZW5kaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHNvcnQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IHRvIGFkZCB0aGUgc29ydCBmb3IuXG4gICAgICogQHBhcmFtIGlzRGVmYXVsdCBJZiBkZWZhdWx0IHNvcnRpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIElmIGRlZmF1bHQgc29ydCBzaG91bGQgYmUgYXNjZW5kaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoU29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNvcnRVbnNhZmUocHJvcGVydHksIGlzRGVmYXVsdCwgYXNjZW5kaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGVmYXVsdCBzb3J0aW5nIGZvciB0aGUgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gc2V0IGRlZmF1bHQgc29ydCBmb3IuXG4gICAgICogQHBhcmFtIGFzY2VuZGluZyAtIElmIHRoZSBzb3J0aW5nIHNob3VsZCBiZSBhc2NlbmRpbmcgKGRlZmF1bHQ6IHRydWUpLlxuICAgICAqIEBwYXJhbSBvcmRlciAtIFRoZSBvcmRlciBmb3IgdGhpcyBkZWZhdWx0IHNvcnQgKGRlZmF1bHQ6IDApLlxuICAgICAqIEBwYXJhbSBlbmFibGVkIC0gRW5hYmxlcy9kaXNhYmxlZCB0aGUgZGVmYXVsdCBzb3J0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFNvcnQocHJvcGVydHk6IFNvcnRzLCBhc2NlbmRpbmc/OiBib29sZWFuLCBvcmRlcj86IG51bWJlciwgZW5hYmxlZD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aERlZmF1bHRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgYXNjZW5kaW5nLCBvcmRlciwgZW5hYmxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGVmYXVsdCBzb3J0aW5nIGZvciB0aGUgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBzZXQgZGVmYXVsdCBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIC0gSWYgdGhlIHNvcnRpbmcgc2hvdWxkIGJlIGFzY2VuZGluZyAoZGVmYXVsdDogdHJ1ZSkuXG4gICAgICogQHBhcmFtIG9yZGVyIC0gVGhlIG9yZGVyIGZvciB0aGlzIGRlZmF1bHQgc29ydCAoZGVmYXVsdDogMCkuXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBFbmFibGVzL2Rpc2FibGVkIHRoZSBkZWZhdWx0IHNvcnQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhEZWZhdWx0U29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBhc2NlbmRpbmc/OiBib29sZWFuLCBvcmRlcj86IG51bWJlciwgZW5hYmxlZD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgbGV0IHNvcnQgPSB0aGlzLl9zb3J0cy5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICBpZiAoIXNvcnQpIHtcbiAgICAgICAgICAgIHNvcnQgPSBuZXcgU29ydERlc2NyaXB0b3IocHJvcGVydHkpO1xuICAgICAgICAgICAgdGhpcy5fc29ydHMucHVzaChzb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0LndpdGhEZWZhdWx0U29ydChlbmFibGVkID8/IHRydWUsIGFzY2VuZGluZywgb3JkZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgc29ydHMgZm9yIG1vcmUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFByb3BlcnRpZXMgdG8gYWRkIHRoZSBzb3J0cyBmb3IuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTb3J0cyguLi5wcm9wZXJ0aWVzOiBTb3J0c1tdKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTb3J0c1Vuc2FmZSguLi4ocHJvcGVydGllcyBhcyBzdHJpbmdbXSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBzb3J0cyBmb3IgbW9yZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIHRvIGFkZCB0aGUgc29ydHMgZm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoU29ydHNVbnNhZmUoLi4ucHJvcGVydGllczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc29ydHMucHVzaChuZXcgU29ydERlc2NyaXB0b3IocCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEZpbHRlciBkZXNjcmlwdG9yIGZvciBwcm9wZXJ0eSBvciBudWxsIGlmIG5vdCBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIGdldEZpbHRlcjxGaWx0ZXJNb2RlbCA9IEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsID8gTm9uTnVsbGFibGU8VGFibGVNb2RlbFtGaWx0ZXJzXT4gOiBhbnk+KHByb3BlcnR5OiBGaWx0ZXJzKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEZpbHRlciBkZXNjcmlwdG9yIGZvciBwcm9wZXJ0eSBvciBudWxsIGlmIG5vdCBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIGdldEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbCA9IGFueT4ocHJvcGVydHk6IHN0cmluZyk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJzLmZpbmQocyA9PiBzLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGZpbHRlciBkZXNjcmlwdG9yIGZvciBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRmlsdGVyKHByb3BlcnR5OiBGaWx0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUZpbHRlclVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUZpbHRlclVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcklkeCA9IHRoaXMuX2ZpbHRlcnMuZmluZEluZGV4KGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnNwbGljZShmaWx0ZXJJZHgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlcjxGaWx0ZXJNb2RlbCA9IEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsID8gVGFibGVNb2RlbFtGaWx0ZXJzXSA6IG5ldmVyPihwcm9wZXJ0eTogRmlsdGVycyk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihwcm9wZXJ0eTogc3RyaW5nKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ocHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBsb29rdXAgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgTG9va3VwIHByb3ZpZGVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zVmFsdWVQcm9wZXJ0eSBQcm9wZXJ0eSBvbiBsb29rdXAgcHJvdmlkZXIncyBpdGVtIChGaWx0ZXJNb2RlbCkgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwgPyBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW0ZpbHRlcnNdPiA6IG5ldmVyLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihcbiAgICAgICAgcHJvcGVydHk6IEZpbHRlcnMsXG4gICAgICAgIHByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxGaWx0ZXJNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5Pzoga2V5b2YgRmlsdGVyTW9kZWxcbiAgICApOiBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsLCBTZXJ2aWNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpbHRlckxvb2t1cFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIHByb3ZpZGVyLCBvcHRpb25zVmFsdWVQcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGxvb2t1cCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIExvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1ZhbHVlUHJvcGVydHkgUHJvcGVydHkgb24gbG9va3VwIHByb3ZpZGVyJ3MgaXRlbSAoRmlsdGVyTW9kZWwpIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckxvb2t1cFVuc2FmZTxGaWx0ZXJNb2RlbCwgU2VydmljZSA9IHVuZGVmaW5lZD4oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxGaWx0ZXJNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nXG4gICAgKTogRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbCwgU2VydmljZT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbCwgU2VydmljZT4ocHJvcGVydHksIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlcjogcHJvdmlkZXIsXG4gICAgICAgICAgICBvcHRpb25zVmFsdWVQcm9wZXJ0eTogb3B0aW9uc1ZhbHVlUHJvcGVydHlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGxvb2t1cCBlbnVtIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGVudW1EZXNjIERlc2NyaXB0b3IgZm9yIGVudW0uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgb3B0aW9ucyBvZiBlbnVtIHZhbHVlcyB0byBiZSBhdmFpbGFibGUgdG8gZmlsdGVyIGJ5LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBsb29rdXAgZW51bSBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXBFbnVtPEVudW0+KHByb3BlcnR5OiBGaWx0ZXJzLCBlbnVtRGVzYzogRW51bURlc2NyaXB0b3I8RW51bT4sIG9wdGlvbnM/OiBBcnJheTxFbnVtPikge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2MsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGxvb2t1cCBlbnVtIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gZW51bURlc2MgRGVzY3JpcHRvciBmb3IgZW51bS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBvcHRpb25zIG9mIGVudW0gdmFsdWVzIHRvIGJlIGF2YWlsYWJsZSB0byBmaWx0ZXIgYnkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGxvb2t1cCBlbnVtIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckxvb2t1cEVudW1VbnNhZmU8RW51bSA9IEVudW1Db25zdGFudFR5cGU+KHByb3BlcnR5OiBzdHJpbmcsIGVudW1EZXNjOiBFbnVtRGVzY3JpcHRvcjxFbnVtPiwgb3B0aW9ucz86IEFycmF5PEVudW0+KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXJMb29rdXBFbnVtRGVzY3JpcHRvcihwcm9wZXJ0eSwgZW51bURlc2MsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9yIGZyb20gY29sdW1uLiBUaGUgY29sdW1uIG11c3QgZXhpc3Qgb24gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBDb2x1bW4gcHJvcGVydHkgdG8gYWRkIGZpbHRlciBmb3IuXG4gICAgICogQHBhcmFtIGRpc3BsYXlUeXBlIE9wdGlvbmFsIGRpc3BsYXkgdHlwZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBmb3JjZVNpbXBsZSBGb3JjZXMgc2ltcGxlIGNyZWF0aW9uIG9mIGZpbHRlciAobm8gbG9va3VwIG9yIGxvb2t1cCBlbnVtIGZpbHRlcnMpLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIGNvbHVtbiBmb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgZGVzY3JpcHRvclxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCwgRmlsdGVyTW9kZWwgPSBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW1Byb3BlcnR5XT4+KFxuICAgICAgICBwcm9wZXJ0eTogRXh0cmFjdDxGaWx0ZXJzLCBQcm9wZXJ0eT4sXG4gICAgICAgIGRpc3BsYXlUeXBlPzogRmlsdGVyRGlzcGxheVR5cGVFbnVtLFxuICAgICAgICBmb3JjZVNpbXBsZSA9IGZhbHNlXG4gICAgKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJGcm9tQ29sdW1uVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgZGlzcGxheVR5cGUsIGZvcmNlU2ltcGxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEdlbmVyaWNGaWx0ZXIoXG4gICAgICAgIHByb3BlcnR5TG9va3VwRGF0YVByb3ZpZGVyOiBMb29rdXBEYXRhUHJvdmlkZXJJbnN0PEZpbHRlckdlbmVyaWNQcm9wZXJ0eT4sXG4gICAgICAgIHZhbHVlTG9va3VwRGF0YVByb3ZpZGVyPzogTG9va3VwRGF0YVByb3ZpZGVySW5zdDxzdHJpbmcsIGFueSwgYW55LCAnZmllbGQnPlxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLl9nZW5lcmljRmlsdGVyID0gbmV3IEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yKHByb3BlcnR5TG9va3VwRGF0YVByb3ZpZGVyKTtcblxuICAgICAgICBpZiAodmFsdWVMb29rdXBEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlbmVyaWNGaWx0ZXIud2l0aFZhbHVlTG9va3VwKHZhbHVlTG9va3VwRGF0YVByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9ycyBmcm9tIGNvbHVtbnMuIFRoZSBjb2x1bW5zIG11c3QgZXhpc3Qgb24gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIENvbHVtbiBwcm9wZXJ0aWVzIHRvIGFkZCBmaWx0ZXJzIGZvci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBjb2x1bW4gZm9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWx0ZXJzRnJvbUNvbHVtbnMoLi4ucHJvcGVydGllczogRXh0cmFjdDxGaWx0ZXJzLCBrZXlvZiBUYWJsZU1vZGVsPltdKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhGaWx0ZXJzRnJvbUNvbHVtbnNVbnNhZmUoLi4uKHByb3BlcnRpZXMgYXMgc3RyaW5nW10pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9ycyBmcm9tIGNvbHVtbnMuIFRoZSBjb2x1bW5zIG11c3QgZXhpc3Qgb24gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQ29sdW1uIHByb3BlcnRpZXMgdG8gYWRkIGZpbHRlcnMgZm9yLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIGNvbHVtbiBmb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZpbHRlcnNGcm9tQ29sdW1uc1Vuc2FmZSguLi5wcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZEZpbHRlckZyb21Db2x1bW5VbnNhZmUocCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9yIGZyb20gY29sdW1uLiBUaGUgY29sdW1uIG11c3QgZXhpc3Qgb24gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IENvbHVtbiBwcm9wZXJ0eSB0byBhZGQgZmlsdGVyIGZvci5cbiAgICAgKiBAcGFyYW0gZGlzcGxheVR5cGUgT3B0aW9uYWwgZGlzcGxheSB0eXBlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGZvcmNlU2ltcGxlIEZvcmNlcyBzaW1wbGUgY3JlYXRpb24gb2YgZmlsdGVyIChubyBsb29rdXAgb3IgbG9va3VwIGVudW0gZmlsdGVycykuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gSWYgY29sdW1uIGZvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBkZXNjcmlwdG9yXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckZyb21Db2x1bW5VbnNhZmU8RmlsdGVyTW9kZWwgPSBhbnk+KHByb3BlcnR5OiBzdHJpbmcsIGRpc3BsYXlUeXBlPzogRmlsdGVyRGlzcGxheVR5cGVFbnVtLCBmb3JjZVNpbXBsZSA9IGZhbHNlKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtblVuc2FmZTxGaWx0ZXJNb2RlbCwgYW55Pihwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYE5vIGNvbHVtbiBmb3VuZCBmb3IgZmlsdGVyIHByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmU8RmlsdGVyTW9kZWw+KGNvbHVtbiwgZm9yY2VTaW1wbGUpO1xuICAgICAgICBpZiAoZGlzcGxheVR5cGUgIT0gbnVsbCkgZmlsdGVyLndpdGhEaXNwbGF5VHlwZShkaXNwbGF5VHlwZSk7XG4gICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmcm9tIHByb3ZpZGVkIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29sdW1uIENvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBmb3JjZVNpbXBsZSBGb3JjZXMgc2ltcGxlIGNyZWF0aW9uIG9mIGZpbHRlciAobm8gbG9va3VwIG9yIGxvb2t1cCBlbnVtIGZpbHRlcnMpLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIGNvbHVtbiBmb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgZGVzY3JpcHRvclxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uRGVzY3JpcHRvclVuc2FmZTxGaWx0ZXJNb2RlbD4oXG4gICAgICAgIGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbCwgYW55PixcbiAgICAgICAgZm9yY2VTaW1wbGUgPSBmYWxzZVxuICAgICk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgbGV0IGZpbHRlckRlc2NyaXB0b3IgPSBuZXcgRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4oY29sdW1uLnByb3BlcnR5KTtcbiAgICAgICAgbGV0IGZpbHRlclR5cGU6IEZpbHRlclR5cGVFbnVtO1xuXG4gICAgICAgIHN3aXRjaCAoY29sdW1uLmNvbHVtblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uTnVtYmVyOlxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5OdW1iZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLkJvb2xlYW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkRhdGU6XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLkRhdGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkVudW06XG4gICAgICAgICAgICAgICAgaWYgKCFmb3JjZVNpbXBsZSAmJiBjb2x1bW4uZW51bSkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yID0gbmV3IEZpbHRlckxvb2t1cEVudW1EZXNjcmlwdG9yKGNvbHVtbi5wcm9wZXJ0eSwgY29sdW1uLmVudW0pIGFzIEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+O1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uTG9va3VwRW51bTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uU3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uU3RyaW5nOlxuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5DdXN0b206XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yLmFzRmlsdGVyVHlwZShmaWx0ZXJUeXBlKTtcbiAgICAgICAgaWYgKChmaWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5OdW1iZXIgfHwgZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uRGF0ZSkgJiYgY29sdW1uLmRpc3BsYXlGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpbHRlckRlc2NyaXB0b3Iud2l0aERpc3BsYXlGb3JtYXQoY29sdW1uLmRpc3BsYXlGb3JtYXQsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlckRlc2NyaXB0b3IpO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGZpbHRlciBEZXNjcmlwdG9yIGZvciBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZpbHRlcjxGaWx0ZXJNb2RlbD4ocHJvcGVydHk6IEZpbHRlcnMsIGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgaWYgKGZpbHRlci5wcm9wZXJ0eSAhPT0gcHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRmlsdGVyIHByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cIiBhbmQgRmlsdGVyIGRlc2NyaXB0b3IgcHJvcGVydHkgXCIke2ZpbHRlci5wcm9wZXJ0eX1cIiBkbyBub3QgbWF0Y2guYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4oZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGZpbHRlciBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXIgRGVzY3JpcHRvciBmb3IgcHJvcGVydHkuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGdsb2JhbCBzZWFyY2ggb3B0aW9uIGZvciB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlYXJjaCAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBnbG9iYWwgc2VhcmNoIHNob3VsZCBiZSBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIGZvciBzZWFyY2guIGxpbWl0TWF4V29yZHMgY2FuIGxpbWl0IG1heCB3b3JkcyBhcyBzZWFyY2ggaW5wdXQgYW5kIGZpZWxkcyBjYW4gbGltaXRcbiAgICAgKiB0aGUgZmlsdGVyaW5nIGZpZWxkcyBpbmNsdWRlZCBpbiBzZWFyY2ggd2hlbiBsYXp5IGxvYWQgaXMgbm90IGJlaW5nIHVzZWQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTZWFyY2goc2VhcmNoID0gdHJ1ZSwgb3B0cz86IHtsaW1pdE1heFdvcmRzPzogbnVtYmVyIHwgbnVsbDsgZmllbGRzPzogKGtleW9mIFRhYmxlTW9kZWwpW119KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZWFyY2hVbnNhZmUoc2VhcmNoLCB7XG4gICAgICAgICAgICBmaWVsZHM6IG9wdHM/LmZpZWxkcyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxpbWl0TWF4V29yZHM6IG9wdHM/LmxpbWl0TWF4V29yZHNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZ2xvYmFsIHNlYXJjaCBvcHRpb24gZm9yIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VhcmNoIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdsb2JhbCBzZWFyY2ggc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHNlYXJjaC4gbGltaXRNYXhXb3JkcyBjYW4gbGltaXQgbWF4IHdvcmRzIGFzIHNlYXJjaCBpbnB1dCBhbmQgZmllbGRzIGNhbiBsaW1pdFxuICAgICAqIHRoZSBmaWx0ZXJpbmcgZmllbGRzIGluY2x1ZGVkIGluIHNlYXJjaCB3aGVuIGxhenkgbG9hZCBpcyBub3QgYmVpbmcgdXNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNlYXJjaFVuc2FmZShzZWFyY2ggPSB0cnVlLCBvcHRzPzoge2xpbWl0TWF4V29yZHM/OiBudW1iZXIgfCBudWxsOyBmaWVsZHM/OiBzdHJpbmdbXX0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoID0gc2VhcmNoO1xuICAgICAgICB0aGlzLl9zZWFyY2hMaW1pdE1heFdvcmRzID0gb3B0cz8ubGltaXRNYXhXb3JkcztcbiAgICAgICAgdGhpcy5fc2VhcmNoRmllbGRzID0gb3B0cz8uZmllbGRzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNsYXNzZXMgZm9yIHRhYmxlIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbGFzc05hbWUgQ2xhc3MgbmFtZXMuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRhYmxlIHNpemluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIFRhYmxlIHNpemUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IFRhYmxlU2l6ZUVudW0gPSBUYWJsZVNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBob3ZlciBlZmZlY3Qgb24gdGFibGUgcm93cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBob3ZlciBFbmFibGVzL2Rpc2FibGVzIHRoZSBob3Zlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEhvdmVyKGhvdmVyID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNIb3ZlciA9IGhvdmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGdyaWRsaW5lcyBvbiB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncmlkbGluZXMgRW5hYmxlcy9kaXNhYmxlcyB0aGUgZ3JpZGxpbmVzLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoR3JpZGxpbmVzKGdyaWRsaW5lcyA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzR3JpZGxpbmVzID0gZ3JpZGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHJlb3JkZXJhYmxlIHByb3BlcnR5IG9uIGFsbCBjb2x1bW5zIGN1cnJlbnRseSBpbiB0aGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbHVtbnNSZW9yZGVyYWJsZV0gLSBCb29sZWFuIGZsYWcgdG8gc2V0IHJlb3JkZXJpbmcgb24gY29sdW1ucyB0by5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEN1cnJlbnRDb2x1bW5zUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbC53aXRoUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRvZ2dsZWFibGUgcHJvcGVydHkgb24gYWxsIGNvbHVtbnMgY3VycmVudGx5IGluIHRoZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sdW1uc1RvZ2dsZWFibGVdIC0gQm9vbGVhbiBmbGFnIHRvIHNldCB0b2dnbGVhYmxlIG9uIGNvbHVtbnMgdG8uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDdXJyZW50Q29sdW1uc1RvZ2dsZWFibGUoY29sdW1uc1RvZ2dsZWFibGUgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgICAgICAgY29sLndpdGhUb2dnbGVhYmxlKGNvbHVtbnNUb2dnbGVhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVkIGNvbHVtbiByZXNpemUgZmVhdHVyZSB3aXRoIGNvbHVtblJlc2l6ZU1vZGUgb24gYWxsIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzaXphYmxlQ29sdW1ucyBUcnVlIGlmIGVuYWJsZWRcbiAgICAgKiBAcGFyYW0gY29sdW1uUmVzaXplTW9kZSAnZml0JyBvciAnZXhwYW5kJyBtb2RlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5zUmVzaXphYmxlKHJlc2l6YWJsZUNvbHVtbnMgPSB0cnVlLCBjb2x1bW5SZXNpemVNb2RlOiAnZml0JyB8ICdleHBhbmQnID0gJ2ZpdCcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzUmVzaXphYmxlQ29sdW1ucyA9IHJlc2l6YWJsZUNvbHVtbnM7XG4gICAgICAgIHRoaXMuX2NvbHVtblJlc2l6ZU1vZGUgPSBjb2x1bW5SZXNpemVNb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNvbHVtbiB0byAodW4pZnJvemVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbkNvbHVtbkZyb3plbiBUcnVlIHRvIGZyZWV6ZSBzZWxlY3Rpb24gY29sdW1uLCBmYWxzZSB0byB1bmZyZWV6ZSBpdC5cbiAgICAgKiBAcGFyYW0gYWN0aW9uQ29sdW1uRnJvemVuIFRydWUgdG8gZnJlZXplIGFjdGlvbiBjb2x1bW4sIGZhbHNlIHRvIHVuZnJlZXplIGl0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uRnJvemVuKHNlbGVjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4sIGFjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29sdW1uRnJvemVuID0gc2VsZWN0aW9uQ29sdW1uRnJvemVuO1xuICAgICAgICB0aGlzLl9hY3Rpb25Db2x1bW5Gcm96ZW4gPSBhY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgZm9yIHJvd3MgaW4gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJvd0NsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSBhcHBsaWVkIHRvIGVhY2ggcm93LlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjbGFzc05hbWVNYXBGbl0gLSBPcHRpb25hbCBmdW5jdGlvbiB0byBtYXAgdGhlIGNsYXNzIG5hbWUgZHluYW1pY2FsbHkgYmFzZWQgb24gcm93J3MgaXRlbSBhbmQgY3VycmVudCBjbGFzcyBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93Q2xhc3NOYW1lKHJvd0NsYXNzTmFtZT86IHN0cmluZywgY2xhc3NOYW1lTWFwRm4/OiAoY2xhc3NOYW1lPzogc3RyaW5nLCBpdGVtPzogVGFibGVNb2RlbCkgPT4gc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Jvd0NsYXNzTmFtZSA9IHJvd0NsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fcm93Q2xhc3NOYW1lTWFwRm4gPSBjbGFzc05hbWVNYXBGbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBoZWFkZXIgcm93IGNsYXNzIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGVhZGVyQ2xhc3NOYW1lIENsYXNzIG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhIZWFkZXJDbGFzc05hbWUoaGVhZGVyQ2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGVhZGVyQ2xhc3NOYW1lID0gaGVhZGVyQ2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGxvY2FsaXphdGlvbiBvZiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhMb2NhbGl6ZWQoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzTG9jYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NhbGUgcHJvcGVydHkgZm9yIGxvY2FsaXphdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBMb2NhbGUgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aExvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHJvdyBleHBhbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gY2hlY2sgaWYgcm93IGNhbiBiZSBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0gY29sU3BhbiBzZXQgY3VzdG9tIHJvdyBzcGFuIGZvciBleHBhbmRlZCByb3cuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgQ29tcG9uZW50IHRvIGJlIGRpc3BsYXllZCBvbiByb3cgZXhwYW5kLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93RXhwYW5kYWJsZShwcm9wZXJ0eT86IGtleW9mIFRhYmxlTW9kZWwsIGNvbFNwYW4/OiBudW1iZXIsIGNvbXBvbmVudFR5cGU/OiBUeXBlPElSb3dFeHBhbmRhYmxlQ29tcG9uZW50PFRhYmxlTW9kZWw+Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlUHJvcGVydHkgPSBwcm9wZXJ0eSBhcyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbFNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gY29sU3BhbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgcm93IHJlb3JkZXJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVvcmRhYmxlIEVuYWJsZXMvZGlzYWJsZXMgZmVhdHVyZS5cbiAgICAgKi9cbiAgICB3aXRoUm93UmVvcmRlcmFibGUocmVvcmRhYmxlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9yb3dSZW9yZGVyYWJsZSA9IHJlb3JkYWJsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvcHlGaWVsZHNUbyhvYmo6IFRhYmxlRGVzY3JpcHRvckluc3Q8YW55LCBhbnksIGFueT4pIHtcbiAgICAgICAgb2JqLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBvYmouX2hpZGVIZWFkZXIgPSB0aGlzLl9oaWRlSGVhZGVyO1xuICAgICAgICBvYmouX3RyYWNrUHJvcGVydHkgPSB0aGlzLl90cmFja1Byb3BlcnR5O1xuICAgICAgICBvYmouX2ZpbHRlcnMgPSB0aGlzLl9maWx0ZXJzLm1hcChmID0+IGYuY29weSgpKTtcbiAgICAgICAgb2JqLl9zb3J0cyA9IHRoaXMuX3NvcnRzLm1hcChzID0+IHMuY29weSgpKTtcbiAgICAgICAgb2JqLl9zZWFyY2ggPSB0aGlzLl9zZWFyY2g7XG4gICAgICAgIG9iai5fc2VhcmNoTGltaXRNYXhXb3JkcyA9IHRoaXMuX3NlYXJjaExpbWl0TWF4V29yZHM7XG4gICAgICAgIG9iai5fc2VhcmNoRmllbGRzID0gdGhpcy5fc2VhcmNoRmllbGRzID8gWy4uLnRoaXMuX3NlYXJjaEZpZWxkc10gOiB1bmRlZmluZWQ7XG4gICAgICAgIG9iai5fY2xhc3NOYW1lID0gdGhpcy5fY2xhc3NOYW1lO1xuICAgICAgICBvYmouX3NpemUgPSB0aGlzLl9zaXplO1xuICAgICAgICBvYmouX2hhc0hvdmVyID0gdGhpcy5faGFzSG92ZXI7XG4gICAgICAgIG9iai5faGFzR3JpZGxpbmVzID0gdGhpcy5faGFzR3JpZGxpbmVzO1xuICAgICAgICBvYmouX2hhc1Jlc2l6YWJsZUNvbHVtbnMgPSB0aGlzLl9oYXNSZXNpemFibGVDb2x1bW5zO1xuICAgICAgICBvYmouX2NvbHVtblJlc2l6ZU1vZGUgPSB0aGlzLl9jb2x1bW5SZXNpemVNb2RlO1xuICAgICAgICBvYmouX2FjdGlvbkNvbHVtbkZyb3plbiA9IHRoaXMuX2FjdGlvbkNvbHVtbkZyb3plbjtcbiAgICAgICAgb2JqLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPSB0aGlzLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIG9iai5faXNMb2NhbGl6ZWQgPSB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICAgICAgb2JqLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5O1xuICAgICAgICBvYmouX3BhZ2luYXRpb25Nb2RlID0gdGhpcy5fcGFnaW5hdGlvbk1vZGU7XG4gICAgICAgIG9iai5fcm93c1BlclBhZ2VPcHRpb25zID0gdGhpcy5fcm93c1BlclBhZ2VPcHRpb25zO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGUgPSB0aGlzLl9yb3dFeHBhbmRhYmxlO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gdGhpcy5fcm93RXhwYW5kYWJsZUNvbFNwYW47XG4gICAgICAgIG9iai5fcm93RXhwYW5kYWJsZVByb3BlcnR5ID0gdGhpcy5fcm93RXhwYW5kYWJsZVByb3BlcnR5O1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlID0gdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGU7XG4gICAgICAgIG9iai5fcm93UmVvcmRlcmFibGUgPSB0aGlzLl9yb3dSZW9yZGVyYWJsZTtcbiAgICAgICAgb2JqLl9nZW5lcmljRmlsdGVyID0gdGhpcy5fZ2VuZXJpY0ZpbHRlcj8uY29weSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBjdXJyZW50IGRlc2NyaXB0b3IgdG8gYSBuZXcgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGNvcHkoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV3IFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+KHRoaXMubW9kZWwuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZGVzY3JpcHRvcik7XG4gICAgICAgIGRlc2NyaXB0b3IuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGMgPT4gYy5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCBleHRlbmRzIFRhYmxlRGVzY3JpcHRvckluc3Q8YW55PiB7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZWRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgX3NvcnRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfc29ydENvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERTtcbiAgICBwcml2YXRlIF9maWx0ZXJDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLkVYQ0xVREU7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2NvbHVtbnM6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPGFueT4pIHtcbiAgICAgICAgc3VwZXIobW9kZWwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwudGl0bGVQcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFRpdGxlKG1vZGVsLnRpdGxlUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIGV4Y2x1ZGVkIGNvbHVtbnMgd2hlbiBnZW5lcmF0aW5nIGRlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gZXhjbHVkZWRDb2x1bW4gbmFtZXMgb2YgZXhjbHVkZWQgY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0V4Y2x1ZGVkKGV4Y2x1ZGVkQ29sdW1uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9leGNsdWRlZENvbHVtbnMgPSBleGNsdWRlZENvbHVtbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGVmaW5lcyBjb2x1bW4gcHJvcGVydGllcyBvbiB3aGljaCBzb3J0IGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBzb3J0Q29sdW1uTW9kZVxuICAgICAqIEBwYXJhbSBzb3J0T25Db2x1bW5zIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBzb3J0Q29sdW1uTW9kZSBJTkNMVURFX09OTFkgKGRlZmF1bHQpIG9ubHkgZ2l2ZW4gY29sdW1ucyB3aWxsIGhhdmUgc29ydCwgRVhDTFVERSBnaXZlbiBjb2x1bW5zIHdpbGwgTk9UIGhhdmUgc29ydFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc1NvcnQoc29ydE9uQ29sdW1uczogc3RyaW5nW10sIHNvcnRDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLklOQ0xVREVfT05MWSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1uTW9kZSA9IHNvcnRDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1ucyA9IHNvcnRPbkNvbHVtbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlZmluZXMgY29sdW1uIHByb3BlcnRpZXMgb24gd2hpY2ggZmlsdGVyIGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBmaWx0ZXJDb2x1bW5Nb2RlXG4gICAgICogQHBhcmFtIGZpbHRlck9uQ29sdW1uIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJDb2x1bW5Nb2RlIElOQ0xVREVfT05MWSAoZGVmYXVsdCkgb25seSBnaXZlbiBjb2x1bW5zIHdpbGwgaGF2ZSBmaWx0ZXIsIEVYQ0xVREUgZ2l2ZW4gY29sdW1ucyB3aWxsIE5PVCBoYXZlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0ZpbHRlcihmaWx0ZXJPbkNvbHVtbjogc3RyaW5nW10sIGZpbHRlckNvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPSBmaWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zID0gZmlsdGVyT25Db2x1bW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgZ2l2ZW4gdHlwZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGUgY3VzdG9tIHR5cGUgZm9yIGNvbHVtblxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBjdXN0b20gY29sdW1uIHZhbHVlIGRpc3BsYXkgdHlwZVxuICAgICAqIEBwYXJhbSBhcmdzIGFkZGl0aW9uIGFyZ3VtZW50cyBmb3IgY29sdW1uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5QcmVzZXRUeXBlKHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENvbHVtblR5cGVFbnVtLCBkaXNwbGF5VHlwZT86IENvbHVtbkRpc3BsYXlUeXBlRW51bSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBwcm9wZXJ0eSA9PT0gY29sLnByb3BlcnR5KSA/PyB0aGlzLmFkZENvbHVtbihwcm9wZXJ0eSkud2l0aFRpdGxlKHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmFzVHlwZSh0eXBlLCBkaXNwbGF5VHlwZSwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0cyB0aXRsZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlIGNvbHVtbidzIHRpdGxlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5UaXRsZShwcm9wZXJ0eTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gcHJvcGVydHkgPT09IGNvbC5wcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFRpdGxlKHRpdGxlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGNvbHVtbnMgZGVmaW5lZCBvbiB0YWJsZSBiYXNlZCBvbiBkYXRhIGZldGNoZWQgZnJvbSBhcGlcbiAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIGZyb20gYXBpXG4gICAgICovXG4gICAgcHVibGljIHRvVGFibGVEZXNjcmlwdG9yRnJvbURhdGEoZGF0YTogRGF0YUxpc3RSZXN1bHQpOiBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4ge1xuICAgICAgICBjb25zdCB0YWJsZURlc2NyaXB0b3IgPSB0aGlzLnRvVGFibGVEZXNjcmlwdG9yKCk7XG5cbiAgICAgICAgaWYgKGRhdGEuZGF0YSA9PSBudWxsIHx8IGRhdGEuZGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdE1vZGVsID0gZGF0YS5kYXRhWzBdO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZmxhdHRlbk9iamVjdEtleXMob2JqZWN0TW9kZWwpXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIXRoaXMuX2V4Y2x1ZGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpOyAvL2V4Y2x1ZGUgYXJyYXlzIGFuZCBzZXRzXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgbWV0YUNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBrZXkpO1xuICAgICAgICAgICAgbGV0IGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxhbnksIGFueT47XG4gICAgICAgICAgICBpZiAobWV0YUNvbHVtbikge1xuICAgICAgICAgICAgICAgIGlmICghbWV0YUNvbHVtbi52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtZXRhQ29sdW1uLnRvQ29sdW1uRGVzY3JpcHRvcigpO1xuICAgICAgICAgICAgICAgIHRhYmxlRGVzY3JpcHRvci53aXRoQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IHRhYmxlRGVzY3JpcHRvci5hZGRDb2x1bW4oa2V5KS53aXRoVGl0bGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb2x1bW5Ub0RhdGVOdW1iZXJPckJvb2xlYW4oY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmkxOG5CYXNlS2V5ICYmICFjb2x1bW4ucHJvcGVydHkuaW5jbHVkZXMoJ3JldicpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLndpdGhUaXRsZShbdGhpcy5tb2RlbC5pMThuQmFzZUtleSwgJ3Byb3BlcnRpZXMnLCBjb2x1bW4ucHJvcGVydHldLmpvaW4oJy4nKS5yZXBsYWNlKCdzdGF0ZS4nLCAnJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZTb3J0Q29sdW1ucyA9IHRoaXMuX3NvcnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mU29ydENvbHVtbnMpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZICYmIGVsZW1lbnRPZlNvcnRDb2x1bW5zKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGFibGVEZXNjcmlwdG9yLndpdGhTb3J0VW5zYWZlKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRPZkZpbHRlckNvbHVtbnMgPSB0aGlzLl9maWx0ZXJDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mRmlsdGVyQ29sdW1ucykgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPT09IFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bS5JTkNMVURFX09OTFkgJiYgZWxlbWVudE9mRmlsdGVyQ29sdW1ucykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0YWJsZURlc2NyaXB0b3IuYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmUoY29sdW1uLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGFkZHMgQ29sdW1uRHluYW1pY0Rlc2NyaXB0b3IgdG8gdGhpcyB0YWJsZVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4ncyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBhZGRDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZSBkeW5hbWljIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QodGhpcy5tb2RlbC5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhkZXNjcmlwdG9yKTtcbiAgICAgICAgZGVzY3JpcHRvci5fY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoYyA9PiBjLmNvcHkoKSk7XG4gICAgICAgIGRlc2NyaXB0b3IuX2V4Y2x1ZGVkQ29sdW1ucyA9IFsuLi50aGlzLl9leGNsdWRlZENvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9maWx0ZXJDb2x1bW5zID0gWy4uLnRoaXMuX2ZpbHRlckNvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1ucyA9IFsuLi50aGlzLl9zb3J0Q29sdW1uc107XG4gICAgICAgIGRlc2NyaXB0b3IuX2ZpbHRlckNvbHVtbk1vZGUgPSB0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1uTW9kZSA9IHRoaXMuX3NvcnRDb2x1bW5Nb2RlO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UYWJsZURlc2NyaXB0b3IoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxhbnk+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4odGhpcy5tb2RlbCk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGRlc2NyaXB0b3IpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG4iXX0=
1092
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RhYmxlL2FwaS9zcmMvZGVzY3JpcHRvcnMvdGFibGUuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsb0JBQW9CLEVBQTJFLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0osT0FBTyxFQUNILGdCQUFnQixFQUVoQix1QkFBdUIsRUFFdkIsc0JBQXNCLEVBQ3RCLDBCQUEwQixFQUMxQixjQUFjLEVBQ2pCLE1BQU0sK0JBQStCLENBQUM7QUFJdkMsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUF3QixjQUFjLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUc3RSxPQUFPLEVBQUMsMkJBQTJCLEVBQTJCLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxNQUFNLE9BQU8sbUJBQW1CO0lBd0Q1QixZQUFtQixLQUFrQyxFQUFFLGFBQWEsR0FBRyxLQUFLO1FBN0NsRSxhQUFRLEdBQTZDLEVBQUUsQ0FBQztRQUUxRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixpQkFBWSxHQUFrQixlQUFlLENBQUM7UUFFdEQsUUFBUTtRQUNBLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBT3JDLFVBQVU7UUFDRixVQUFLLEdBQWtCLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUt4QixnQkFBZ0I7UUFDUixhQUFRLEdBQXdDLEVBQUUsQ0FB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QztRQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELFVBQVUsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRCxVQUFVLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsVUFBVSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RCxVQUFVLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDbEQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixNQUFNLFVBQVUsR0FBRyxJQUFJLG1CQUFtQixDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7Q29tbW9uc0ludGVybmFsRXJyb3IsIERhdGFMaXN0UmVzdWx0LCBFbnVtQ29uc3RhbnRUeXBlLCBJTG9va3VwRGF0YVByb3ZpZGVyLCBJVGFibGVEZXNjcmlwdG9yLCBmbGF0dGVuT2JqZWN0S2V5c30gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7XG4gICAgRmlsdGVyRGVzY3JpcHRvcixcbiAgICBGaWx0ZXJEaXNwbGF5VHlwZUVudW0sXG4gICAgRmlsdGVyR2VuZXJpY0Rlc2NyaXB0b3IsXG4gICAgRmlsdGVyR2VuZXJpY1Byb3BlcnR5LFxuICAgIEZpbHRlckxvb2t1cERlc2NyaXB0b3IsXG4gICAgRmlsdGVyTG9va3VwRW51bURlc2NyaXB0b3IsXG4gICAgRmlsdGVyVHlwZUVudW1cbn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9maWx0ZXInO1xuaW1wb3J0IHtMb29rdXBEYXRhUHJvdmlkZXJJbnN0fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2Zvcm0vYXBpJztcbmltcG9ydCB7RW51bURlc2NyaXB0b3IsIE1vZGVsRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5cbmltcG9ydCB7Y29sdW1uVG9EYXRlTnVtYmVyT3JCb29sZWFufSBmcm9tICcuLi9oZWxwZXJzL2NsYXNzLWF0dHJpYnV0ZS1jb252ZXJ0ZXInO1xuaW1wb3J0IHtDb2x1bW5EaXNwbGF5VHlwZUVudW0sIENvbHVtblR5cGVFbnVtfSBmcm9tICcuLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcbmltcG9ydCB7SVJvd0V4cGFuZGFibGVDb21wb25lbnR9IGZyb20gJy4uL21vZGVscy9yb3ctZXhwYW5kYWJsZS1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHtJQ29sdW1uc01hbmFnZUludGVyZmFjZX0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLWNvbHVtbnMubW9kZWwnO1xuaW1wb3J0IHtUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0sIFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLCBUYWJsZVNpemVFbnVtfSBmcm9tICcuLi9tb2RlbHMvdGFibGUubW9kZWwnO1xuaW1wb3J0IHtDb2x1bW5EZXNjcmlwdG9yLCBDb2x1bW5EeW5hbWljRGVzY3JpcHRvcn0gZnJvbSAnLi9jb2x1bW4uZGVzY3JpcHRvcic7XG5pbXBvcnQge1NvcnREZXNjcmlwdG9yfSBmcm9tICcuL3NvcnQuZGVzY3JpcHRvcic7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZURlc2NyaXB0b3JJbnN0PFRhYmxlTW9kZWwsIFNvcnRzID0ga2V5b2YgVGFibGVNb2RlbCwgRmlsdGVycyA9IGtleW9mIFRhYmxlTW9kZWw+XG4gICAgaW1wbGVtZW50cyBJVGFibGVEZXNjcmlwdG9yPFRhYmxlTW9kZWwsIFNvcnRzLCBGaWx0ZXJzPiwgSUNvbHVtbnNNYW5hZ2VJbnRlcmZhY2U8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUYWJsZU1vZGVsPjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2F1dG9HZW5lcmF0ZWQ7XG5cbiAgICBwcml2YXRlIF9pZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3RyYWNrUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcGFnaW5hdGlvbk1vZGU/OiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bTtcbiAgICBwcml2YXRlIF9yb3dzUGVyUGFnZU9wdGlvbnM/OiBudW1iZXJbXTtcbiAgICBwcml2YXRlIF9kZWZhdWx0TnVtUm93cz86IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2NvbHVtbnM6IEFycmF5PENvbHVtbkRlc2NyaXB0b3I8YW55LCBUYWJsZU1vZGVsPj4gPSBbXTtcbiAgICBwcml2YXRlIF90aXRsZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9oaWRlSGVhZGVyID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbG9hZGluZ1RleHQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfbG9hZGluZ0ljb246IHN0cmluZyB8IG51bGwgPSAncGkgcGktc3Bpbm5lcic7XG5cbiAgICAvLyBleHRyYVxuICAgIHByaXZhdGUgX2hhc0hvdmVyID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9oYXNHcmlkbGluZXMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9oYXNSZXNpemFibGVDb2x1bW5zID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY29sdW1uUmVzaXplTW9kZT86ICdmaXQnIHwgJ2V4cGFuZCc7XG5cbiAgICAvLyBzcGVjaWFsIGNvbHVtbnNcbiAgICBwcml2YXRlIF9zZWxlY3Rpb25Db2x1bW5Gcm96ZW4/OiBib29sZWFuO1xuICAgIHByaXZhdGUgX2FjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW47XG5cbiAgICAvLyBzdHlsaW5nXG4gICAgcHJpdmF0ZSBfc2l6ZTogVGFibGVTaXplRW51bSA9IFRhYmxlU2l6ZUVudW0uTGFyZ2U7XG4gICAgcHJpdmF0ZSBfY2xhc3NOYW1lID0gJyc7XG4gICAgcHJpdmF0ZSBfaGVhZGVyQ2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Jvd0NsYXNzTmFtZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9yb3dDbGFzc05hbWVNYXBGbj86IChjbGFzc05hbWU/OiBzdHJpbmcsIGl0ZW0/OiBUYWJsZU1vZGVsKSA9PiBzdHJpbmc7XG5cbiAgICAvLyBmaWx0ZXJzJnNvcnRzXG4gICAgcHJpdmF0ZSBfZmlsdGVyczogRmlsdGVyRGVzY3JpcHRvcjxhbnksIFRhYmxlTW9kZWw+W10gPSBbXTtcbiAgICBwcml2YXRlIF9nZW5lcmljRmlsdGVyPzogRmlsdGVyR2VuZXJpY0Rlc2NyaXB0b3I7XG4gICAgcHJpdmF0ZSBfc29ydHM6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+W10gPSBbXTtcblxuICAgIC8vIGxvY2FsaXphdGlvblxuICAgIHByaXZhdGUgX2lzTG9jYWxpemVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk/OiBzdHJpbmc7XG5cbiAgICAvLyByb3cgZXhwYW5kXG4gICAgcHJpdmF0ZSBfcm93RXhwYW5kYWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gMTAwO1xuICAgIHByaXZhdGUgX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRhYmxlQ29tcG9uZW50VHlwZT86IFR5cGU8SVJvd0V4cGFuZGFibGVDb21wb25lbnQ8VGFibGVNb2RlbD4+O1xuXG4gICAgLy8gcm93IHJlb3JkZXJcbiAgICBwcml2YXRlIF9yb3dSZW9yZGVyYWJsZSA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfc2VhcmNoPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9zZWFyY2hMaW1pdE1heFdvcmRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICBwcml2YXRlIF9zZWFyY2hGaWVsZHM/OiBzdHJpbmdbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFRhYmxlTW9kZWw+LCBhdXRvR2VuZXJhdGVkID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fdHJhY2tQcm9wZXJ0eSA9IHRoaXMuX21vZGVsLmlkUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2F1dG9HZW5lcmF0ZWQgPSBhdXRvR2VuZXJhdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0cmFja1Byb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2tQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgZ2V0IHJvd3NQZXJQYWdlT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdE51bVJvd3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0TnVtUm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZGVIZWFkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlSGVhZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9hZGluZ1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nVGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmdJY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ0ljb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGdlbmVyaWNGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmljRmlsdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc29ydHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWFyY2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2g7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWFyY2hMaW1pdE1heFdvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoTGltaXRNYXhXb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaEZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzSG92ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNIb3ZlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0dyaWRsaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0dyaWRsaW5lcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1Jlc2l6YWJsZUNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNSZXNpemFibGVDb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sdW1uUmVzaXplTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblJlc2l6ZU1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dDbGFzc05hbWVNYXBGbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0NsYXNzTmFtZU1hcEZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uQ29sdW1uRnJvemVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uQ29sdW1uRnJvemVuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uQ29sdW1uRnJvemVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aW9uQ29sdW1uRnJvemVuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2NhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dSZW9yZGVyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1Jlb3JkZXJhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dFeHBhbmRhYmxlQ29sU3BhbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGVDb2xTcGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgdGFibGUgbW9kZWwgcHJvcGVydHkgdGVsbHMgdXMgaWYgdGhlIHNwZWNpZmljIHJvdyBzaG91bGQgYmUgZXhwYW5kYWJsZSBvciBub3QgYmFzZWQgb24gcm93IGl0ZW0gdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0V4cGFuZGFibGVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0V4cGFuZGFibGVQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSB0eXBlIG9mIHRoZSBjdXN0b20gY29tcG9uZW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZXhwYW5kZWQgcm93LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFeHBhbmRhYmxlQ29tcG9uZW50VHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIGlzIHVzZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbWJpbmVkIHNhdmluZyB1c2VyIHByZWZlcmVuY2VzIGluIGxvY2Fsc3RvcmFnZSBpZiAyIHRhYmxlcyBoYXZlIHRoZSBzYW1lIHRyYWNrIHByb3BlcnRpZXMgdGhleSB3aWxsIHNoYXJlIHRoZSBzYW1lIGxvY2Fsc3RvcmFnZSBlbnRyeS5cbiAgICAgKiBTaW1pbGFybHksIHRoaXMgcHJvcGVydHkgY2FuIGFsc28gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHR3byB0YWJsZXMgb2YgdGhlIHNhbWUgbW9kZWwgb24gdGhlIHNhbWUgdXJsIChzbyB0aGF0IHRoZXkgaGF2ZSBzZXBhcmF0ZSBlbnRyaWVzIGluIGxvY2Fsc3RvcmFnZSkuXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aElkZW50aWZpZXIoaWRlbnRpZmllcjogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0cmFjayBwcm9wZXJ0eSAoaWRlbnRpZmllciBvZiB0YWJsZSByb3cpIGZvciB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2tleW9mIFRhYmxlTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHRyYWNrIHRoZSByb3cgaXRlbXMgYnkuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhUcmFja1Byb3BlcnR5KHByb3BlcnR5Pzoga2V5b2YgVGFibGVNb2RlbCk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoVHJhY2tQcm9wZXJ0eVVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRyYWNrIHByb3BlcnR5IChpZGVudGlmaWVyIG9mIHRhYmxlIHJvdykgZm9yIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHNldCAnX3RyYWNrUHJvcGVydHknIHRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoVHJhY2tQcm9wZXJ0eVVuc2FmZShwcm9wZXJ0eT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90cmFja1Byb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgY29sdW1uIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7a2V5b2YgVGFibGVNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgZm9yIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGdldENvbHVtbjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwsIENvbHVtbk1vZGVsID0gTm9uTnVsbGFibGU8VGFibGVNb2RlbFtQcm9wZXJ0eV0+LCBDb2x1bW5WYWx1ZSA9IFRhYmxlTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5XG4gICAgKTogQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGVNb2RlbCwgQ29sdW1uVmFsdWU+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbHVtblVuc2FmZTxDb2x1bW5Nb2RlbCwgQ29sdW1uVmFsdWU+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjb2x1bW4gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2tleW9mIFRhYmxlTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGZvciBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb2x1bW5VbnNhZmU8Q29sdW1uTW9kZWwgPSBhbnksIENvbHVtblZhbHVlID0gQ29sdW1uTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcpOiBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsLCBDb2x1bW5WYWx1ZT4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjb2x1bW4gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtrZXlvZiBUYWJsZU1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBmb3IgY29sdW1uIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUNvbHVtbihwcm9wZXJ0eToga2V5b2YgVGFibGVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUNvbHVtblVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbHVtbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7a2V5b2YgVGFibGVNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgZm9yIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVDb2x1bW5VbnNhZmUocHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2x1bW5JZHggPSB0aGlzLl9jb2x1bW5zLmZpbmRJbmRleChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5zcGxpY2UoY29sdW1uSWR4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGNvbHVtbiBkZXNjcmlwdG9yIHRvIHRhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0NvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWwsIENvbHVtblZhbHVlPn0gY29sdW1uIC0gVGhlIHByb3BlcnR5IGZvciBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbjxDb2x1bW5Nb2RlbCwgQ29sdW1uVmFsdWUgPSBDb2x1bW5Nb2RlbD4oY29sdW1uOiBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZU1vZGVsLCBDb2x1bW5WYWx1ZT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eUtleX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlIG1vZGVsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5ld2x5IGFkZGVkIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRDb2x1bW48UHJvcGVydHlLZXkgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsPihwcm9wZXJ0eTogUHJvcGVydHlLZXkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkRlc2NyaXB0b3I8Tm9uTnVsbGFibGU8VGFibGVNb2RlbFtQcm9wZXJ0eUtleV0+LCBUYWJsZU1vZGVsLCBUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB3aXRoIGVudW0gZGlzcGxheSB0byB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHRhYmxlIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7RW51bURlc2NyaXB0b3I8RW51bT59IGVudW1EZXNjIC0gVGhlIGVudW0gZGVzY3JpcHRvciBmb3IgY29sdW1uIGRpc3BsYXkuXG4gICAgICogQHJldHVybiB7Q29sdW1uRGVzY3JpcHRvcjxFbnVtLCBUYWJsZU1vZGVsLCBUYWJsZU1vZGVsW1Byb3BlcnR5S2V5XT59IC0gVGhlIGFkZGVkIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRDb2x1bW5FbnVtPFByb3BlcnR5S2V5IGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCwgRW51bSBleHRlbmRzIE5vbk51bGxhYmxlPFRhYmxlTW9kZWxbUHJvcGVydHlLZXldPj4ocHJvcGVydHk6IFByb3BlcnR5S2V5LCBlbnVtRGVzYzogRW51bURlc2NyaXB0b3I8RW51bT4pIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkRlc2NyaXB0b3I8RW51bSwgVGFibGVNb2RlbCwgVGFibGVNb2RlbFtQcm9wZXJ0eUtleV0+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIGNvbHVtbi5hc0VudW1VbnNhZmUoZW51bURlc2MpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgY29sdW1uIGluIHRoZSB0YWJsZSBtb2RlbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXdseSBhZGRlZCBjb2x1bW4gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29sdW1uVW5zYWZlPENvbHVtbk1vZGVsID0gdW5rbm93bj4ocHJvcGVydHk6IHN0cmluZyk6IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxlTW9kZWw+KHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBvbmUgb3IgbW9yZSBjb2x1bW5zIHRvIHRoZSB0YWJsZSBtb2RlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gQW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gYWRkIGFzIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5zKC4uLnByb3BlcnRpZXM6IChrZXlvZiBUYWJsZU1vZGVsKVtdKTogdGhpcyB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwID0+IHRoaXMuYWRkQ29sdW1uKHApKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwYWdpbmF0aW9uIG1vZGUgZm9yIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VGFibGVQYWdpbmF0aW9uTW9kZUVudW19IHBhZ2luYXRpb25Nb2RlIC0gVGhlIHBhZ2luYXRpb24gbW9kZSB0byBzZXQuIE11c3QgYmUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSB0aGUgVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhQYWdpbmF0aW9uTW9kZShwYWdpbmF0aW9uTW9kZTogVGFibGVQYWdpbmF0aW9uTW9kZUVudW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbk1vZGUgPSBwYWdpbmF0aW9uTW9kZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UgZm9yIGEgcGFnaW5hdGVkIGRpc3BsYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93cyAtIFRoZSBkZWZhdWx0IG51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgcGVyIHBhZ2UuXG4gICAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9uc10gLSBSb3dzIHBlciBwYWdlIG9wdGlvbnMgdG8gYmUgYXZhaWxhYmxlIGluIHRhYmxlIHBhZ2luYXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFJvd3NQZXJQYWdlKHJvd3M6IG51bWJlciwgb3B0aW9ucz86IEFycmF5PG51bWJlcj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdE51bVJvd3MgPSByb3dzO1xuICAgICAgICB0aGlzLl9yb3dzUGVyUGFnZU9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0aXRsZSBmb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0aXRsZV0gLSBUaGUgdGl0bGUgdmFsdWUgdG8gYmUgc2V0LiBJdCB1bmRlZmllbmQsIG5vIHRpdGxlIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoVGl0bGUodGl0bGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cy9oaWRlcyB0aGUgaGVhZGVyIHJvdyB3aXRoIGNvbHVtbiB0aXRsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpZGVIZWFkZXIgLSBBIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGhpZGUgdGhlIGhlYWRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEhpZGVIZWFkZXIoaGlkZUhlYWRlciA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5faGlkZUhlYWRlciA9IGhpZGVIZWFkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkanVzdHMgbG9hZGluZyBkaXNwbGF5IHdpdGggY3VzdG9tIHRleHQgYW5kL29yIGljb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RleHRdIC0gVGV4dCB0byBiZSBkaXNwbGF5ZWQgd2hlbiBsb2FkaW5nIGluZGljYXRvciBpcyBzaG93bi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IFtpY29uXSAtIEljb24gdG8gYmUgdXNlZCB3aGVuIGxvYWRpbmcgaW5kaWNhdG9yIGlzIHNob3duLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoTG9hZGluZyh0ZXh0Pzogc3RyaW5nLCBpY29uPzogc3RyaW5nIHwgbnVsbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb2FkaW5nVGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJY29uID0gaWNvbiA9PT0gdW5kZWZpbmVkID8gJ3BpIHBpLXNwaW5uZXInIDogaWNvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBzb3J0IGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NvcnRzfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZSB0aGUgc29ydCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPiB8IG51bGx9IFRoZSBzb3J0IGRlc2NyaXB0b3Igb3IgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U29ydChwcm9wZXJ0eTogU29ydHMpOiBTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBzb3J0IGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U29ydHN9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIHRoZSBzb3J0IGZvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHwgbnVsbH0gVGhlIHNvcnQgZGVzY3JpcHRvciBvciBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpOiBTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydHMuZmluZChzID0+IHMucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNvcnQgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NvcnRzfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byByZW1vdmUgdGhlIHNvcnQgZm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVTb3J0KHByb3BlcnR5OiBTb3J0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc29ydCBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTb3J0c30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gcmVtb3ZlIHRoZSBzb3J0IGZvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlU29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNvcnRJZHggPSB0aGlzLl9zb3J0cy5maW5kSW5kZXgoYyA9PiBjLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX3NvcnRzLnNwbGljZShzb3J0SWR4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHNvcnQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBhZGQgdGhlIHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBpc0RlZmF1bHQgSWYgZGVmYXVsdCBzb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIGFzY2VuZGluZyBJZiBkZWZhdWx0IHNvcnQgc2hvdWxkIGJlIGFzY2VuZGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBzb3J0IGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZFNvcnQocHJvcGVydHk6IFNvcnRzLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbik6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkU29ydFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIGlzRGVmYXVsdCwgYXNjZW5kaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHNvcnQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IHRvIGFkZCB0aGUgc29ydCBmb3IuXG4gICAgICogQHBhcmFtIGlzRGVmYXVsdCBJZiBkZWZhdWx0IHNvcnRpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIElmIGRlZmF1bHQgc29ydCBzaG91bGQgYmUgYXNjZW5kaW5nLlxuXG4gICAgICogQHJldHVybiBDcmVhdGVkIHNvcnQgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkU29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbik6IFNvcnREZXNjcmlwdG9yPFRhYmxlTW9kZWw+IHtcbiAgICAgICAgY29uc3Qgc29ydCA9IG5ldyBTb3J0RGVzY3JpcHRvcjxUYWJsZU1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcmRlck1heCA9IHRoaXMuX3NvcnRzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzID0+IHMuZGVmYXVsdElzRW5hYmxlZClcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIHMpID0+IChzLmRlZmF1bHRPcmRlciAhPT0gdW5kZWZpbmVkICYmIHMuZGVmYXVsdE9yZGVyID4gYWNjID8gcy5kZWZhdWx0T3JkZXIgOiBhY2MpLCAtMSk7XG4gICAgICAgICAgICBzb3J0LndpdGhEZWZhdWx0U29ydCh0cnVlLCBhc2NlbmRpbmcsIGRlZmF1bHRPcmRlck1heCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvcnRzLnB1c2goc29ydCk7XG4gICAgICAgIHJldHVybiBzb3J0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgc29ydCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IHRvIGFkZCB0aGUgc29ydCBmb3IuXG4gICAgICogQHBhcmFtIGlzRGVmYXVsdCBJZiBkZWZhdWx0IHNvcnRpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIElmIGRlZmF1bHQgc29ydCBzaG91bGQgYmUgYXNjZW5kaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoU29ydChwcm9wZXJ0eTogU29ydHMsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTb3J0VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgc29ydCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYWRkIHRoZSBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0IElmIGRlZmF1bHQgc29ydGluZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgSWYgZGVmYXVsdCBzb3J0IHNob3VsZCBiZSBhc2NlbmRpbmcuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkU29ydFVuc2FmZShwcm9wZXJ0eSwgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHNvcnRpbmcgZm9yIHRoZSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBzZXQgZGVmYXVsdCBzb3J0IGZvci5cbiAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIC0gSWYgdGhlIHNvcnRpbmcgc2hvdWxkIGJlIGFzY2VuZGluZyAoZGVmYXVsdDogdHJ1ZSkuXG4gICAgICogQHBhcmFtIG9yZGVyIC0gVGhlIG9yZGVyIGZvciB0aGlzIGRlZmF1bHQgc29ydCAoZGVmYXVsdDogMCkuXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBFbmFibGVzL2Rpc2FibGVkIHRoZSBkZWZhdWx0IHNvcnQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhEZWZhdWx0U29ydChwcm9wZXJ0eTogU29ydHMsIGFzY2VuZGluZz86IGJvb2xlYW4sIG9yZGVyPzogbnVtYmVyLCBlbmFibGVkPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoRGVmYXVsdFNvcnRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nLCBhc2NlbmRpbmcsIG9yZGVyLCBlbmFibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHNvcnRpbmcgZm9yIHRoZSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHNldCBkZWZhdWx0IHNvcnQgZm9yLlxuICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgLSBJZiB0aGUgc29ydGluZyBzaG91bGQgYmUgYXNjZW5kaW5nIChkZWZhdWx0OiB0cnVlKS5cbiAgICAgKiBAcGFyYW0gb3JkZXIgLSBUaGUgb3JkZXIgZm9yIHRoaXMgZGVmYXVsdCBzb3J0IChkZWZhdWx0OiAwKS5cbiAgICAgKiBAcGFyYW0gZW5hYmxlZCAtIEVuYWJsZXMvZGlzYWJsZWQgdGhlIGRlZmF1bHQgc29ydC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERlZmF1bHRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGFzY2VuZGluZz86IGJvb2xlYW4sIG9yZGVyPzogbnVtYmVyLCBlbmFibGVkPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICBsZXQgc29ydCA9IHRoaXMuX3NvcnRzLmZpbmQocyA9PiBzLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghc29ydCkge1xuICAgICAgICAgICAgc29ydCA9IG5ldyBTb3J0RGVzY3JpcHRvcihwcm9wZXJ0eSk7XG4gICAgICAgICAgICB0aGlzLl9zb3J0cy5wdXNoKHNvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHNvcnQud2l0aERlZmF1bHRTb3J0KGVuYWJsZWQgPz8gdHJ1ZSwgYXNjZW5kaW5nLCBvcmRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBzb3J0cyBmb3IgbW9yZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgUHJvcGVydGllcyB0byBhZGQgdGhlIHNvcnRzIGZvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNvcnRzKC4uLnByb3BlcnRpZXM6IFNvcnRzW10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNvcnRzVW5zYWZlKC4uLihwcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHNvcnRzIGZvciBtb3JlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFByb3BlcnRpZXMgdG8gYWRkIHRoZSBzb3J0cyBmb3IuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTb3J0c1Vuc2FmZSguLi5wcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0cy5wdXNoKG5ldyBTb3J0RGVzY3JpcHRvcihwKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGZpbHRlciBkZXNjcmlwdG9yIGZvciBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gRmlsdGVyIGRlc2NyaXB0b3IgZm9yIHByb3BlcnR5IG9yIG51bGwgaWYgbm90IGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwgPyBOb25OdWxsYWJsZTxUYWJsZU1vZGVsW0ZpbHRlcnNdPiA6IGFueT4ocHJvcGVydHk6IEZpbHRlcnMpOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gRmlsdGVyIGRlc2NyaXB0b3IgZm9yIHByb3BlcnR5IG9yIG51bGwgaWYgbm90IGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsID0gYW55Pihwcm9wZXJ0eTogc3RyaW5nKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMuZmluZChzID0+IHMucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVGaWx0ZXIocHJvcGVydHk6IEZpbHRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlRmlsdGVyVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRmlsdGVyVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlsdGVySWR4ID0gdGhpcy5fZmlsdGVycy5maW5kSW5kZXgoYyA9PiBjLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuc3BsaWNlKGZpbHRlcklkeCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxlTW9kZWwgPyBUYWJsZU1vZGVsW0ZpbHRlcnNdIDogbmV2ZXI+KHByb3BlcnR5OiBGaWx0ZXJzKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcpOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGxvb2t1cCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBMb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnNWYWx1ZVByb3BlcnR5IFByb3BlcnR5IG9uIGxvb2t1cCBwcm92aWRlcidzIGl0ZW0gKEZpbHRlck1vZGVsKSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXA8RmlsdGVyTW9kZWwgPSBGaWx0ZXJzIGV4dGVuZHMga2V5b2YgVGFibGVNb2RlbCA/IE5vbk51bGxhYmxlPFRhYmxlTW9kZWxbRmlsdGVyc10+IDogbmV2ZXIsIFNlcnZpY2UgPSB1bmRlZmluZWQ+KFxuICAgICAgICBwcm9wZXJ0eTogRmlsdGVycyxcbiAgICAgICAgcHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPEZpbHRlck1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgb3B0aW9uc1ZhbHVlUHJvcGVydHk/OiBrZXlvZiBGaWx0ZXJNb2RlbFxuICAgICk6IEZpbHRlckxvb2t1cERlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWwsIFNlcnZpY2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyTG9va3VwVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgcHJvdmlkZXIsIG9wdGlvbnNWYWx1ZVByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgbG9va3VwIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgTG9va3VwIHByb3ZpZGVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zVmFsdWVQcm9wZXJ0eSBQcm9wZXJ0eSBvbiBsb29rdXAgcHJvdmlkZXIncyBpdGVtIChGaWx0ZXJNb2RlbCkgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwVW5zYWZlPEZpbHRlck1vZGVsLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPEZpbHRlck1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgb3B0aW9uc1ZhbHVlUHJvcGVydHk/OiBzdHJpbmdcbiAgICApOiBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsLCBTZXJ2aWNlPiB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsLCBTZXJ2aWNlPihwcm9wZXJ0eSwge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyOiBwcm92aWRlcixcbiAgICAgICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5OiBvcHRpb25zVmFsdWVQcm9wZXJ0eVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgbG9va3VwIGVudW0gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IEZpbHRlciBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gZW51bURlc2MgRGVzY3JpcHRvciBmb3IgZW51bS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBvcHRpb25zIG9mIGVudW0gdmFsdWVzIHRvIGJlIGF2YWlsYWJsZSB0byBmaWx0ZXIgYnkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWQgZmlsdGVyIGxvb2t1cCBlbnVtIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckxvb2t1cEVudW08RW51bT4ocHJvcGVydHk6IEZpbHRlcnMsIGVudW1EZXNjOiBFbnVtRGVzY3JpcHRvcjxFbnVtPiwgb3B0aW9ucz86IEFycmF5PEVudW0+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpbHRlckxvb2t1cEVudW1VbnNhZmU8RW51bT4ocHJvcGVydHkgYXMgc3RyaW5nLCBlbnVtRGVzYywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgbG9va3VwIGVudW0gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgRmlsdGVyIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBlbnVtRGVzYyBEZXNjcmlwdG9yIGZvciBlbnVtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIG9wdGlvbnMgb2YgZW51bSB2YWx1ZXMgdG8gYmUgYXZhaWxhYmxlIHRvIGZpbHRlciBieS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgbG9va3VwIGVudW0gZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwRW51bVVuc2FmZTxFbnVtID0gRW51bUNvbnN0YW50VHlwZT4ocHJvcGVydHk6IHN0cmluZywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlckxvb2t1cEVudW1EZXNjcmlwdG9yKHByb3BlcnR5LCBlbnVtRGVzYywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZmlsdGVyIGRlc2NyaXB0b3IgZnJvbSBjb2x1bW4uIFRoZSBjb2x1bW4gbXVzdCBleGlzdCBvbiB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IENvbHVtbiBwcm9wZXJ0eSB0byBhZGQgZmlsdGVyIGZvci5cbiAgICAgKiBAcGFyYW0gZGlzcGxheVR5cGUgT3B0aW9uYWwgZGlzcGxheSB0eXBlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGZvcmNlU2ltcGxlIEZvcmNlcyBzaW1wbGUgY3JlYXRpb24gb2YgZmlsdGVyIChubyBsb29rdXAgb3IgbG9va3VwIGVudW0gZmlsdGVycykuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gSWYgY29sdW1uIGZvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBkZXNjcmlwdG9yXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckZyb21Db2x1bW48UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZU1vZGVsLCBGaWx0ZXJNb2RlbCA9IE5vbk51bGxhYmxlPFRhYmxlTW9kZWxbUHJvcGVydHldPj4oXG4gICAgICAgIHByb3BlcnR5OiBFeHRyYWN0PEZpbHRlcnMsIFByb3BlcnR5PixcbiAgICAgICAgZGlzcGxheVR5cGU/OiBGaWx0ZXJEaXNwbGF5VHlwZUVudW0sXG4gICAgICAgIGZvcmNlU2ltcGxlID0gZmFsc2VcbiAgICApOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZU1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpbHRlckZyb21Db2x1bW5VbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nLCBkaXNwbGF5VHlwZSwgZm9yY2VTaW1wbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRHZW5lcmljRmlsdGVyKHByb3BlcnR5TG9va3VwRGF0YVByb3ZpZGVyOiBMb29rdXBEYXRhUHJvdmlkZXJJbnN0PEZpbHRlckdlbmVyaWNQcm9wZXJ0eT4pOiBGaWx0ZXJHZW5lcmljRGVzY3JpcHRvciB7XG4gICAgICAgIHRoaXMuX2dlbmVyaWNGaWx0ZXIgPSBuZXcgRmlsdGVyR2VuZXJpY0Rlc2NyaXB0b3IocHJvcGVydHlMb29rdXBEYXRhUHJvdmlkZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJpY0ZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEdlbmVyaWNGaWx0ZXIoXG4gICAgICAgIHByb3BlcnR5TG9va3VwRGF0YVByb3ZpZGVyOiBMb29rdXBEYXRhUHJvdmlkZXJJbnN0PEZpbHRlckdlbmVyaWNQcm9wZXJ0eT4sXG4gICAgICAgIHZhbHVlTG9va3VwRGF0YVByb3ZpZGVyPzogTG9va3VwRGF0YVByb3ZpZGVySW5zdDxzdHJpbmcsIGFueSwgYW55LCAnZmllbGQnPlxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLl9nZW5lcmljRmlsdGVyID0gdGhpcy5hZGRHZW5lcmljRmlsdGVyKHByb3BlcnR5TG9va3VwRGF0YVByb3ZpZGVyKTtcblxuICAgICAgICBpZiAodmFsdWVMb29rdXBEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlbmVyaWNGaWx0ZXIud2l0aFZhbHVlTG9va3VwKHZhbHVlTG9va3VwRGF0YVByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9ycyBmcm9tIGNvbHVtbnMuIFRoZSBjb2x1bW5zIG11c3QgZXhpc3Qgb24gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIENvbHVtbiBwcm9wZXJ0aWVzIHRvIGFkZCBmaWx0ZXJzIGZvci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBjb2x1bW4gZm9yIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWx0ZXJzRnJvbUNvbHVtbnMoLi4ucHJvcGVydGllczogRXh0cmFjdDxGaWx0ZXJzLCBrZXlvZiBUYWJsZU1vZGVsPltdKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhGaWx0ZXJzRnJvbUNvbHVtbnNVbnNhZmUoLi4uKHByb3BlcnRpZXMgYXMgc3RyaW5nW10pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9ycyBmcm9tIGNvbHVtbnMuIFRoZSBjb2x1bW5zIG11c3QgZXhpc3Qgb24gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQ29sdW1uIHByb3BlcnRpZXMgdG8gYWRkIGZpbHRlcnMgZm9yLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIGNvbHVtbiBmb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZpbHRlcnNGcm9tQ29sdW1uc1Vuc2FmZSguLi5wcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZEZpbHRlckZyb21Db2x1bW5VbnNhZmUocCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGZpbHRlciBkZXNjcmlwdG9yIGZyb20gY29sdW1uLiBUaGUgY29sdW1uIG11c3QgZXhpc3Qgb24gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IENvbHVtbiBwcm9wZXJ0eSB0byBhZGQgZmlsdGVyIGZvci5cbiAgICAgKiBAcGFyYW0gZGlzcGxheVR5cGUgT3B0aW9uYWwgZGlzcGxheSB0eXBlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGZvcmNlU2ltcGxlIEZvcmNlcyBzaW1wbGUgY3JlYXRpb24gb2YgZmlsdGVyIChubyBsb29rdXAgb3IgbG9va3VwIGVudW0gZmlsdGVycykuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gSWYgY29sdW1uIGZvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBDcmVhdGVkIGZpbHRlciBkZXNjcmlwdG9yXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpbHRlckZyb21Db2x1bW5VbnNhZmU8RmlsdGVyTW9kZWwgPSBhbnk+KHByb3BlcnR5OiBzdHJpbmcsIGRpc3BsYXlUeXBlPzogRmlsdGVyRGlzcGxheVR5cGVFbnVtLCBmb3JjZVNpbXBsZSA9IGZhbHNlKTogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtblVuc2FmZTxGaWx0ZXJNb2RlbCwgYW55Pihwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYE5vIGNvbHVtbiBmb3VuZCBmb3IgZmlsdGVyIHByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmU8RmlsdGVyTW9kZWw+KGNvbHVtbiwgZm9yY2VTaW1wbGUpO1xuICAgICAgICBpZiAoZGlzcGxheVR5cGUgIT0gbnVsbCkgZmlsdGVyLndpdGhEaXNwbGF5VHlwZShkaXNwbGF5VHlwZSk7XG4gICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBmaWx0ZXIgZGVzY3JpcHRvciBmcm9tIHByb3ZpZGVkIGNvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29sdW1uIENvbHVtbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBmb3JjZVNpbXBsZSBGb3JjZXMgc2ltcGxlIGNyZWF0aW9uIG9mIGZpbHRlciAobm8gbG9va3VwIG9yIGxvb2t1cCBlbnVtIGZpbHRlcnMpLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIGNvbHVtbiBmb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZCBmaWx0ZXIgZGVzY3JpcHRvclxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uRGVzY3JpcHRvclVuc2FmZTxGaWx0ZXJNb2RlbD4oXG4gICAgICAgIGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbCwgYW55PixcbiAgICAgICAgZm9yY2VTaW1wbGUgPSBmYWxzZVxuICAgICk6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+IHtcbiAgICAgICAgbGV0IGZpbHRlckRlc2NyaXB0b3IgPSBuZXcgRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4oY29sdW1uLnByb3BlcnR5KTtcbiAgICAgICAgbGV0IGZpbHRlclR5cGU6IEZpbHRlclR5cGVFbnVtO1xuXG4gICAgICAgIHN3aXRjaCAoY29sdW1uLmNvbHVtblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uTnVtYmVyOlxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5OdW1iZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLkJvb2xlYW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkRhdGU6XG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZpbHRlclR5cGVFbnVtLkRhdGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbHVtblR5cGVFbnVtLkVudW06XG4gICAgICAgICAgICAgICAgaWYgKCFmb3JjZVNpbXBsZSAmJiBjb2x1bW4uZW51bSkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yID0gbmV3IEZpbHRlckxvb2t1cEVudW1EZXNjcmlwdG9yKGNvbHVtbi5wcm9wZXJ0eSwgY29sdW1uLmVudW0pIGFzIEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxlTW9kZWw+O1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uTG9va3VwRW51bTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRmlsdGVyVHlwZUVudW0uU3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZUVudW0uU3RyaW5nOlxuICAgICAgICAgICAgY2FzZSBDb2x1bW5UeXBlRW51bS5DdXN0b206XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yLmFzRmlsdGVyVHlwZShmaWx0ZXJUeXBlKTtcbiAgICAgICAgaWYgKChmaWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5OdW1iZXIgfHwgZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uRGF0ZSkgJiYgY29sdW1uLmRpc3BsYXlGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpbHRlckRlc2NyaXB0b3Iud2l0aERpc3BsYXlGb3JtYXQoY29sdW1uLmRpc3BsYXlGb3JtYXQsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlckRlc2NyaXB0b3IpO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgZmlsdGVyIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBGaWx0ZXIgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGZpbHRlciBEZXNjcmlwdG9yIGZvciBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZpbHRlcjxGaWx0ZXJNb2RlbD4ocHJvcGVydHk6IEZpbHRlcnMsIGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgaWYgKGZpbHRlci5wcm9wZXJ0eSAhPT0gcHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRmlsdGVyIHByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cIiBhbmQgRmlsdGVyIGRlc2NyaXB0b3IgcHJvcGVydHkgXCIke2ZpbHRlci5wcm9wZXJ0eX1cIiBkbyBub3QgbWF0Y2guYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4oZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGZpbHRlciBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXIgRGVzY3JpcHRvciBmb3IgcHJvcGVydHkuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGVNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGdsb2JhbCBzZWFyY2ggb3B0aW9uIGZvciB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlYXJjaCAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBnbG9iYWwgc2VhcmNoIHNob3VsZCBiZSBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIGZvciBzZWFyY2guIGxpbWl0TWF4V29yZHMgY2FuIGxpbWl0IG1heCB3b3JkcyBhcyBzZWFyY2ggaW5wdXQgYW5kIGZpZWxkcyBjYW4gbGltaXRcbiAgICAgKiB0aGUgZmlsdGVyaW5nIGZpZWxkcyBpbmNsdWRlZCBpbiBzZWFyY2ggd2hlbiBsYXp5IGxvYWQgaXMgbm90IGJlaW5nIHVzZWQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTZWFyY2goc2VhcmNoID0gdHJ1ZSwgb3B0cz86IHtsaW1pdE1heFdvcmRzPzogbnVtYmVyIHwgbnVsbDsgZmllbGRzPzogKGtleW9mIFRhYmxlTW9kZWwpW119KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZWFyY2hVbnNhZmUoc2VhcmNoLCB7XG4gICAgICAgICAgICBmaWVsZHM6IG9wdHM/LmZpZWxkcyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxpbWl0TWF4V29yZHM6IG9wdHM/LmxpbWl0TWF4V29yZHNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZ2xvYmFsIHNlYXJjaCBvcHRpb24gZm9yIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VhcmNoIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdsb2JhbCBzZWFyY2ggc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHNlYXJjaC4gbGltaXRNYXhXb3JkcyBjYW4gbGltaXQgbWF4IHdvcmRzIGFzIHNlYXJjaCBpbnB1dCBhbmQgZmllbGRzIGNhbiBsaW1pdFxuICAgICAqIHRoZSBmaWx0ZXJpbmcgZmllbGRzIGluY2x1ZGVkIGluIHNlYXJjaCB3aGVuIGxhenkgbG9hZCBpcyBub3QgYmVpbmcgdXNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFNlYXJjaFVuc2FmZShzZWFyY2ggPSB0cnVlLCBvcHRzPzoge2xpbWl0TWF4V29yZHM/OiBudW1iZXIgfCBudWxsOyBmaWVsZHM/OiBzdHJpbmdbXX0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoID0gc2VhcmNoO1xuICAgICAgICB0aGlzLl9zZWFyY2hMaW1pdE1heFdvcmRzID0gb3B0cz8ubGltaXRNYXhXb3JkcztcbiAgICAgICAgdGhpcy5fc2VhcmNoRmllbGRzID0gb3B0cz8uZmllbGRzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNsYXNzZXMgZm9yIHRhYmxlIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbGFzc05hbWUgQ2xhc3MgbmFtZXMuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRhYmxlIHNpemluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIFRhYmxlIHNpemUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IFRhYmxlU2l6ZUVudW0gPSBUYWJsZVNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBob3ZlciBlZmZlY3Qgb24gdGFibGUgcm93cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBob3ZlciBFbmFibGVzL2Rpc2FibGVzIHRoZSBob3Zlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEhvdmVyKGhvdmVyID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNIb3ZlciA9IGhvdmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGdyaWRsaW5lcyBvbiB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncmlkbGluZXMgRW5hYmxlcy9kaXNhYmxlcyB0aGUgZ3JpZGxpbmVzLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoR3JpZGxpbmVzKGdyaWRsaW5lcyA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzR3JpZGxpbmVzID0gZ3JpZGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHJlb3JkZXJhYmxlIHByb3BlcnR5IG9uIGFsbCBjb2x1bW5zIGN1cnJlbnRseSBpbiB0aGUgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbHVtbnNSZW9yZGVyYWJsZV0gLSBCb29sZWFuIGZsYWcgdG8gc2V0IHJlb3JkZXJpbmcgb24gY29sdW1ucyB0by5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEN1cnJlbnRDb2x1bW5zUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbC53aXRoUmVvcmRlcmFibGUoY29sdW1uc1Jlb3JkZXJhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRvZ2dsZWFibGUgcHJvcGVydHkgb24gYWxsIGNvbHVtbnMgY3VycmVudGx5IGluIHRoZSBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sdW1uc1RvZ2dsZWFibGVdIC0gQm9vbGVhbiBmbGFnIHRvIHNldCB0b2dnbGVhYmxlIG9uIGNvbHVtbnMgdG8uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDdXJyZW50Q29sdW1uc1RvZ2dsZWFibGUoY29sdW1uc1RvZ2dsZWFibGUgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgICAgICAgY29sLndpdGhUb2dnbGVhYmxlKGNvbHVtbnNUb2dnbGVhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVkIGNvbHVtbiByZXNpemUgZmVhdHVyZSB3aXRoIGNvbHVtblJlc2l6ZU1vZGUgb24gYWxsIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzaXphYmxlQ29sdW1ucyBUcnVlIGlmIGVuYWJsZWRcbiAgICAgKiBAcGFyYW0gY29sdW1uUmVzaXplTW9kZSAnZml0JyBvciAnZXhwYW5kJyBtb2RlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5zUmVzaXphYmxlKHJlc2l6YWJsZUNvbHVtbnMgPSB0cnVlLCBjb2x1bW5SZXNpemVNb2RlOiAnZml0JyB8ICdleHBhbmQnID0gJ2ZpdCcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzUmVzaXphYmxlQ29sdW1ucyA9IHJlc2l6YWJsZUNvbHVtbnM7XG4gICAgICAgIHRoaXMuX2NvbHVtblJlc2l6ZU1vZGUgPSBjb2x1bW5SZXNpemVNb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNvbHVtbiB0byAodW4pZnJvemVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbkNvbHVtbkZyb3plbiBUcnVlIHRvIGZyZWV6ZSBzZWxlY3Rpb24gY29sdW1uLCBmYWxzZSB0byB1bmZyZWV6ZSBpdC5cbiAgICAgKiBAcGFyYW0gYWN0aW9uQ29sdW1uRnJvemVuIFRydWUgdG8gZnJlZXplIGFjdGlvbiBjb2x1bW4sIGZhbHNlIHRvIHVuZnJlZXplIGl0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uRnJvemVuKHNlbGVjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4sIGFjdGlvbkNvbHVtbkZyb3plbj86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29sdW1uRnJvemVuID0gc2VsZWN0aW9uQ29sdW1uRnJvemVuO1xuICAgICAgICB0aGlzLl9hY3Rpb25Db2x1bW5Gcm96ZW4gPSBhY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgZm9yIHJvd3MgaW4gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJvd0NsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSBhcHBsaWVkIHRvIGVhY2ggcm93LlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjbGFzc05hbWVNYXBGbl0gLSBPcHRpb25hbCBmdW5jdGlvbiB0byBtYXAgdGhlIGNsYXNzIG5hbWUgZHluYW1pY2FsbHkgYmFzZWQgb24gcm93J3MgaXRlbSBhbmQgY3VycmVudCBjbGFzcyBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93Q2xhc3NOYW1lKHJvd0NsYXNzTmFtZT86IHN0cmluZywgY2xhc3NOYW1lTWFwRm4/OiAoY2xhc3NOYW1lPzogc3RyaW5nLCBpdGVtPzogVGFibGVNb2RlbCkgPT4gc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Jvd0NsYXNzTmFtZSA9IHJvd0NsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fcm93Q2xhc3NOYW1lTWFwRm4gPSBjbGFzc05hbWVNYXBGbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBoZWFkZXIgcm93IGNsYXNzIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGVhZGVyQ2xhc3NOYW1lIENsYXNzIG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhIZWFkZXJDbGFzc05hbWUoaGVhZGVyQ2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGVhZGVyQ2xhc3NOYW1lID0gaGVhZGVyQ2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGxvY2FsaXphdGlvbiBvZiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhMb2NhbGl6ZWQoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzTG9jYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NhbGUgcHJvcGVydHkgZm9yIGxvY2FsaXphdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBMb2NhbGUgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aExvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHJvdyBleHBhbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gY2hlY2sgaWYgcm93IGNhbiBiZSBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0gY29sU3BhbiBzZXQgY3VzdG9tIHJvdyBzcGFuIGZvciBleHBhbmRlZCByb3cuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgQ29tcG9uZW50IHRvIGJlIGRpc3BsYXllZCBvbiByb3cgZXhwYW5kLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUm93RXhwYW5kYWJsZShwcm9wZXJ0eT86IGtleW9mIFRhYmxlTW9kZWwsIGNvbFNwYW4/OiBudW1iZXIsIGNvbXBvbmVudFR5cGU/OiBUeXBlPElSb3dFeHBhbmRhYmxlQ29tcG9uZW50PFRhYmxlTW9kZWw+Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9yb3dFeHBhbmRhYmxlUHJvcGVydHkgPSBwcm9wZXJ0eSBhcyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbFNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gY29sU3BhbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgcm93IHJlb3JkZXJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVvcmRhYmxlIEVuYWJsZXMvZGlzYWJsZXMgZmVhdHVyZS5cbiAgICAgKi9cbiAgICB3aXRoUm93UmVvcmRlcmFibGUocmVvcmRhYmxlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9yb3dSZW9yZGVyYWJsZSA9IHJlb3JkYWJsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvcHlGaWVsZHNUbyhvYmo6IFRhYmxlRGVzY3JpcHRvckluc3Q8YW55LCBhbnksIGFueT4pIHtcbiAgICAgICAgb2JqLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBvYmouX2hpZGVIZWFkZXIgPSB0aGlzLl9oaWRlSGVhZGVyO1xuICAgICAgICBvYmouX3RyYWNrUHJvcGVydHkgPSB0aGlzLl90cmFja1Byb3BlcnR5O1xuICAgICAgICBvYmouX2ZpbHRlcnMgPSB0aGlzLl9maWx0ZXJzLm1hcChmID0+IGYuY29weSgpKTtcbiAgICAgICAgb2JqLl9zb3J0cyA9IHRoaXMuX3NvcnRzLm1hcChzID0+IHMuY29weSgpKTtcbiAgICAgICAgb2JqLl9zZWFyY2ggPSB0aGlzLl9zZWFyY2g7XG4gICAgICAgIG9iai5fc2VhcmNoTGltaXRNYXhXb3JkcyA9IHRoaXMuX3NlYXJjaExpbWl0TWF4V29yZHM7XG4gICAgICAgIG9iai5fc2VhcmNoRmllbGRzID0gdGhpcy5fc2VhcmNoRmllbGRzID8gWy4uLnRoaXMuX3NlYXJjaEZpZWxkc10gOiB1bmRlZmluZWQ7XG4gICAgICAgIG9iai5fY2xhc3NOYW1lID0gdGhpcy5fY2xhc3NOYW1lO1xuICAgICAgICBvYmouX3NpemUgPSB0aGlzLl9zaXplO1xuICAgICAgICBvYmouX2hhc0hvdmVyID0gdGhpcy5faGFzSG92ZXI7XG4gICAgICAgIG9iai5faGFzR3JpZGxpbmVzID0gdGhpcy5faGFzR3JpZGxpbmVzO1xuICAgICAgICBvYmouX2hhc1Jlc2l6YWJsZUNvbHVtbnMgPSB0aGlzLl9oYXNSZXNpemFibGVDb2x1bW5zO1xuICAgICAgICBvYmouX2NvbHVtblJlc2l6ZU1vZGUgPSB0aGlzLl9jb2x1bW5SZXNpemVNb2RlO1xuICAgICAgICBvYmouX2FjdGlvbkNvbHVtbkZyb3plbiA9IHRoaXMuX2FjdGlvbkNvbHVtbkZyb3plbjtcbiAgICAgICAgb2JqLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPSB0aGlzLl9zZWxlY3Rpb25Db2x1bW5Gcm96ZW47XG4gICAgICAgIG9iai5faXNMb2NhbGl6ZWQgPSB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICAgICAgb2JqLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5O1xuICAgICAgICBvYmouX3BhZ2luYXRpb25Nb2RlID0gdGhpcy5fcGFnaW5hdGlvbk1vZGU7XG4gICAgICAgIG9iai5fcm93c1BlclBhZ2VPcHRpb25zID0gdGhpcy5fcm93c1BlclBhZ2VPcHRpb25zO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGUgPSB0aGlzLl9yb3dFeHBhbmRhYmxlO1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGVDb2xTcGFuID0gdGhpcy5fcm93RXhwYW5kYWJsZUNvbFNwYW47XG4gICAgICAgIG9iai5fcm93RXhwYW5kYWJsZVByb3BlcnR5ID0gdGhpcy5fcm93RXhwYW5kYWJsZVByb3BlcnR5O1xuICAgICAgICBvYmouX3Jvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlID0gdGhpcy5fcm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGU7XG4gICAgICAgIG9iai5fcm93UmVvcmRlcmFibGUgPSB0aGlzLl9yb3dSZW9yZGVyYWJsZTtcbiAgICAgICAgb2JqLl9nZW5lcmljRmlsdGVyID0gdGhpcy5fZ2VuZXJpY0ZpbHRlcj8uY29weSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBjdXJyZW50IGRlc2NyaXB0b3IgdG8gYSBuZXcgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGNvcHkoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZU1vZGVsLCBTb3J0cywgRmlsdGVycz4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV3IFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGVNb2RlbCwgU29ydHMsIEZpbHRlcnM+KHRoaXMubW9kZWwuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZGVzY3JpcHRvcik7XG4gICAgICAgIGRlc2NyaXB0b3IuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGMgPT4gYy5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCBleHRlbmRzIFRhYmxlRGVzY3JpcHRvckluc3Q8YW55PiB7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZWRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgX3NvcnRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfc29ydENvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERTtcbiAgICBwcml2YXRlIF9maWx0ZXJDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLkVYQ0xVREU7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2NvbHVtbnM6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPGFueT4pIHtcbiAgICAgICAgc3VwZXIobW9kZWwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwudGl0bGVQcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFRpdGxlKG1vZGVsLnRpdGxlUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBjb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIGV4Y2x1ZGVkIGNvbHVtbnMgd2hlbiBnZW5lcmF0aW5nIGRlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gZXhjbHVkZWRDb2x1bW4gbmFtZXMgb2YgZXhjbHVkZWQgY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0V4Y2x1ZGVkKGV4Y2x1ZGVkQ29sdW1uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9leGNsdWRlZENvbHVtbnMgPSBleGNsdWRlZENvbHVtbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGVmaW5lcyBjb2x1bW4gcHJvcGVydGllcyBvbiB3aGljaCBzb3J0IGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBzb3J0Q29sdW1uTW9kZVxuICAgICAqIEBwYXJhbSBzb3J0T25Db2x1bW5zIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBzb3J0Q29sdW1uTW9kZSBJTkNMVURFX09OTFkgKGRlZmF1bHQpIG9ubHkgZ2l2ZW4gY29sdW1ucyB3aWxsIGhhdmUgc29ydCwgRVhDTFVERSBnaXZlbiBjb2x1bW5zIHdpbGwgTk9UIGhhdmUgc29ydFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc1NvcnQoc29ydE9uQ29sdW1uczogc3RyaW5nW10sIHNvcnRDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLklOQ0xVREVfT05MWSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1uTW9kZSA9IHNvcnRDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9zb3J0Q29sdW1ucyA9IHNvcnRPbkNvbHVtbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlZmluZXMgY29sdW1uIHByb3BlcnRpZXMgb24gd2hpY2ggZmlsdGVyIGlzIGRlZmluZWQgb3Igbm90IGRlcGVuZGluZyBvbiBmaWx0ZXJDb2x1bW5Nb2RlXG4gICAgICogQHBhcmFtIGZpbHRlck9uQ29sdW1uIGNvbHVtbiBuYW1lc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJDb2x1bW5Nb2RlIElOQ0xVREVfT05MWSAoZGVmYXVsdCkgb25seSBnaXZlbiBjb2x1bW5zIHdpbGwgaGF2ZSBmaWx0ZXIsIEVYQ0xVREUgZ2l2ZW4gY29sdW1ucyB3aWxsIE5PVCBoYXZlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uc0ZpbHRlcihmaWx0ZXJPbkNvbHVtbjogc3RyaW5nW10sIGZpbHRlckNvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPSBmaWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zID0gZmlsdGVyT25Db2x1bW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgZ2l2ZW4gdHlwZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGUgY3VzdG9tIHR5cGUgZm9yIGNvbHVtblxuICAgICAqIEBwYXJhbSBkaXNwbGF5VHlwZSBjdXN0b20gY29sdW1uIHZhbHVlIGRpc3BsYXkgdHlwZVxuICAgICAqIEBwYXJhbSBhcmdzIGFkZGl0aW9uIGFyZ3VtZW50cyBmb3IgY29sdW1uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5QcmVzZXRUeXBlKHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENvbHVtblR5cGVFbnVtLCBkaXNwbGF5VHlwZT86IENvbHVtbkRpc3BsYXlUeXBlRW51bSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBwcm9wZXJ0eSA9PT0gY29sLnByb3BlcnR5KSA/PyB0aGlzLmFkZENvbHVtbihwcm9wZXJ0eSkud2l0aFRpdGxlKHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmFzVHlwZSh0eXBlLCBkaXNwbGF5VHlwZSwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0cyB0aXRsZSB0byBjb2x1bW4gd2l0aCBnaXZlbiBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGlzIHRhYmxlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlIGNvbHVtbidzIHRpdGxlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhDb2x1bW5UaXRsZShwcm9wZXJ0eTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gcHJvcGVydHkgPT09IGNvbC5wcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFRpdGxlKHRpdGxlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGNvbHVtbnMgZGVmaW5lZCBvbiB0YWJsZSBiYXNlZCBvbiBkYXRhIGZldGNoZWQgZnJvbSBhcGlcbiAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIGZyb20gYXBpXG4gICAgICovXG4gICAgcHVibGljIHRvVGFibGVEZXNjcmlwdG9yRnJvbURhdGEoZGF0YTogRGF0YUxpc3RSZXN1bHQpOiBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4ge1xuICAgICAgICBjb25zdCB0YWJsZURlc2NyaXB0b3IgPSB0aGlzLnRvVGFibGVEZXNjcmlwdG9yKCk7XG5cbiAgICAgICAgaWYgKGRhdGEuZGF0YSA9PSBudWxsIHx8IGRhdGEuZGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdE1vZGVsID0gZGF0YS5kYXRhWzBdO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZmxhdHRlbk9iamVjdEtleXMob2JqZWN0TW9kZWwpXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIXRoaXMuX2V4Y2x1ZGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpOyAvL2V4Y2x1ZGUgYXJyYXlzIGFuZCBzZXRzXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgbWV0YUNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBrZXkpO1xuICAgICAgICAgICAgbGV0IGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxhbnksIGFueT47XG4gICAgICAgICAgICBpZiAobWV0YUNvbHVtbikge1xuICAgICAgICAgICAgICAgIGlmICghbWV0YUNvbHVtbi52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtZXRhQ29sdW1uLnRvQ29sdW1uRGVzY3JpcHRvcigpO1xuICAgICAgICAgICAgICAgIHRhYmxlRGVzY3JpcHRvci53aXRoQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IHRhYmxlRGVzY3JpcHRvci5hZGRDb2x1bW4oa2V5KS53aXRoVGl0bGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb2x1bW5Ub0RhdGVOdW1iZXJPckJvb2xlYW4oY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmkxOG5CYXNlS2V5ICYmICFjb2x1bW4ucHJvcGVydHkuaW5jbHVkZXMoJ3JldicpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLndpdGhUaXRsZShbdGhpcy5tb2RlbC5pMThuQmFzZUtleSwgJ3Byb3BlcnRpZXMnLCBjb2x1bW4ucHJvcGVydHldLmpvaW4oJy4nKS5yZXBsYWNlKCdzdGF0ZS4nLCAnJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZTb3J0Q29sdW1ucyA9IHRoaXMuX3NvcnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mU29ydENvbHVtbnMpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZICYmIGVsZW1lbnRPZlNvcnRDb2x1bW5zKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGFibGVEZXNjcmlwdG9yLndpdGhTb3J0VW5zYWZlKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRPZkZpbHRlckNvbHVtbnMgPSB0aGlzLl9maWx0ZXJDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mRmlsdGVyQ29sdW1ucykgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPT09IFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bS5JTkNMVURFX09OTFkgJiYgZWxlbWVudE9mRmlsdGVyQ29sdW1ucykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0YWJsZURlc2NyaXB0b3IuYWRkRmlsdGVyRnJvbUNvbHVtbkRlc2NyaXB0b3JVbnNhZmUoY29sdW1uLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGFkZHMgQ29sdW1uRHluYW1pY0Rlc2NyaXB0b3IgdG8gdGhpcyB0YWJsZVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4ncyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBhZGRDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yKHByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDb2x1bW4ocHJvcGVydHk6IGtleW9mIGFueSk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZSBkeW5hbWljIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QodGhpcy5tb2RlbC5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhkZXNjcmlwdG9yKTtcbiAgICAgICAgZGVzY3JpcHRvci5fY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoYyA9PiBjLmNvcHkoKSk7XG4gICAgICAgIGRlc2NyaXB0b3IuX2V4Y2x1ZGVkQ29sdW1ucyA9IFsuLi50aGlzLl9leGNsdWRlZENvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9maWx0ZXJDb2x1bW5zID0gWy4uLnRoaXMuX2ZpbHRlckNvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1ucyA9IFsuLi50aGlzLl9zb3J0Q29sdW1uc107XG4gICAgICAgIGRlc2NyaXB0b3IuX2ZpbHRlckNvbHVtbk1vZGUgPSB0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1uTW9kZSA9IHRoaXMuX3NvcnRDb2x1bW5Nb2RlO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UYWJsZURlc2NyaXB0b3IoKTogVGFibGVEZXNjcmlwdG9ySW5zdDxhbnk+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBUYWJsZURlc2NyaXB0b3JJbnN0PGFueT4odGhpcy5tb2RlbCk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGRlc2NyaXB0b3IpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG4iXX0=