angular-slickgrid 6.6.4 → 6.6.6

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.
@@ -249,15 +249,16 @@ export class AngularSlickgridComponent {
249
249
  }
250
250
  // save resource refs to register before the grid options are merged and possibly deep copied
251
251
  // since a deep copy of grid options would lose original resource refs but we want to keep them as singleton
252
- this._registeredResources = this.gridOptions?.externalResources || this.gridOptions?.registerExternalResources || [];
252
+ const extendedGridOptions = { ...this.forRootConfig, ...this.gridOptions };
253
+ this._registeredResources = extendedGridOptions?.externalResources || extendedGridOptions?.registerExternalResources || [];
253
254
  /* istanbul ignore if */
254
- if (this.gridOptions?.registerExternalResources) {
255
+ if (extendedGridOptions?.registerExternalResources) {
255
256
  console.warn('[Angular-Slickgrid] Please note that the grid option `registerExternalResources` was deprecated and will be removed in next major, please use `externalResources` instead.');
256
257
  }
257
258
  this.initialization(this._eventHandler);
258
259
  this._isGridInitialized = true;
259
260
  // recheck the empty warning message after grid is shown so that it works in every use case
260
- if (this.gridOptions && this.gridOptions.enableEmptyDataWarningMessage && Array.isArray(this.dataset)) {
261
+ if (this.gridOptions?.enableEmptyDataWarningMessage && Array.isArray(this.dataset)) {
261
262
  const finalTotalCount = this.dataset.length;
262
263
  this.displayEmptyDataWarning(finalTotalCount < 1);
263
264
  }
@@ -1259,4 +1260,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1259
1260
  }], datasetHierarchical: [{
1260
1261
  type: Input
1261
1262
  }] } });
1262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sMEJBQTBCLENBQUM7QUFFbEMsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUVuSyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBdUJsQyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGdCQUFnQixFQUNoQiw4QkFBOEI7QUFFOUIsV0FBVztBQUNYLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGFBQWEsRUFDYixlQUFlLEVBQ2YsV0FBVyxFQUNYLGVBQWU7QUFFZixZQUFZO0FBQ1oseUNBQXlDLEVBQ3pDLFlBQVksRUFDWixhQUFhLEVBQ2IsY0FBYyxHQUNmLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGtCQUFrQixF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Y0FBYztZQUNkLGlCQUFpQjtTQUNsQiwwQkN6RkgsbUtBR007OzRGRHdGTyx5QkFBeUI7a0JBVnJDLFNBQVM7K0JBQ0UsbUJBQW1CLGFBRWxCO3dCQUNULDRDQUE0Qzt3QkFDNUMsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGlCQUFpQjtxQkFDbEI7OzBCQXFMRSxRQUFROzswQkFDUixRQUFROzswQkFDUixNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsaUJBQWlCOzRDQS9IbEIsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBZUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQWdCSSx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBR0gsT0FBTztzQkFEVixLQUFLO2dCQTBCRixtQkFBbUI7c0JBRHRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgM3JkIHBhcnR5IHZlbmRvciBsaWJzXG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5jb3JlJztcbmltcG9ydCAnc2xpY2tncmlkL3NsaWNrLmludGVyYWN0aW9ucyc7XG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5ncmlkJztcbmltcG9ydCAnc2xpY2tncmlkL3NsaWNrLmRhdGF2aWV3JztcblxuLy8gLi4udGhlbiBldmVyeXRoaW5nIGVsc2UuLi5cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIEFwcGxpY2F0aW9uUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHR5cGUge1xuICBBdXRvY29tcGxldGVyRWRpdG9yLFxuICBCYWNrZW5kU2VydmljZUFwaSxcbiAgQmFja2VuZFNlcnZpY2VPcHRpb24sXG4gIENvbHVtbixcbiAgQ29sdW1uRWRpdG9yLFxuICBEYXRhVmlld09wdGlvbixcbiAgRXZlbnRTdWJzY3JpcHRpb24sXG4gIEV4dGVybmFsUmVzb3VyY2UsXG4gIExvY2FsZSxcbiAgTWV0cmljcyxcbiAgUGFnaW5hdGlvbixcbiAgUnhKc0ZhY2FkZSxcbiAgU2VsZWN0RWRpdG9yLFxuICBTZXJ2aWNlUGFnaW5hdGlvbixcbiAgU2xpY2tEYXRhVmlldyxcbiAgU2xpY2tFdmVudEhhbmRsZXIsXG4gIFNsaWNrR3JpZCxcbiAgU2xpY2tOYW1lc3BhY2UsXG59IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2NvbW1vbic7XG5cbmltcG9ydCB7XG4gIEV4dGVuc2lvbk5hbWUsXG4gIEV4dGVuc2lvblV0aWxpdHksXG4gIFNsaWNrR3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcixcblxuICAvLyBzZXJ2aWNlc1xuICBCYWNrZW5kVXRpbGl0eVNlcnZpY2UsXG4gIENvbGxlY3Rpb25TZXJ2aWNlLFxuICBFdmVudE5hbWluZ1N0eWxlLFxuICBFeHRlbnNpb25TZXJ2aWNlLFxuICBGaWx0ZXJGYWN0b3J5LFxuICBGaWx0ZXJTZXJ2aWNlLFxuICBHcmlkRXZlbnRTZXJ2aWNlLFxuICBHcmlkU2VydmljZSxcbiAgR3JpZFN0YXRlU2VydmljZSxcbiAgR3JvdXBpbmdBbmRDb2xzcGFuU2VydmljZSxcbiAgUGFnaW5hdGlvblNlcnZpY2UsXG4gIFJlc2l6ZXJTZXJ2aWNlLFxuICBTaGFyZWRTZXJ2aWNlLFxuICBTbGlja2dyaWRDb25maWcsXG4gIFNvcnRTZXJ2aWNlLFxuICBUcmVlRGF0YVNlcnZpY2UsXG5cbiAgLy8gdXRpbGl0aWVzXG4gIGF1dG9BZGRFZGl0b3JGb3JtYXR0ZXJUb0NvbHVtbnNXaXRoRWRpdG9yLFxuICBlbXB0eUVsZW1lbnQsXG4gIEdyaWRTdGF0ZVR5cGUsXG4gIHVuc3Vic2NyaWJlQWxsLFxufSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jb21tb24nO1xuaW1wb3J0IHsgRXZlbnRQdWJTdWJTZXJ2aWNlIH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvZXZlbnQtcHViLXN1Yic7XG5pbXBvcnQgeyBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2VtcHR5LXdhcm5pbmctY29tcG9uZW50JztcbmltcG9ydCB7IFNsaWNrRm9vdGVyQ29tcG9uZW50IH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY3VzdG9tLWZvb3Rlci1jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvcGFnaW5hdGlvbi1jb21wb25lbnQnO1xuaW1wb3J0IHsgUnhKc1Jlc291cmNlIH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvcnhqcy1vYnNlcnZhYmxlJztcbmltcG9ydCB7IGRlcXVhbCB9IGZyb20gJ2RlcXVhbC9saXRlJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgQW5ndWxhckdyaWRJbnN0YW5jZSwgRXh0ZXJuYWxUZXN0aW5nRGVwZW5kZW5jaWVzLCBHcmlkT3B0aW9uIH0gZnJvbSAnLi8uLi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHsgR2xvYmFsR3JpZE9wdGlvbnMgfSBmcm9tICcuLy4uL2dsb2JhbC1ncmlkLW9wdGlvbnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90cmFuc2xhdGVyLnNlcnZpY2UnO1xuXG4vLyBTZXJ2aWNlc1xuaW1wb3J0IHsgQW5ndWxhclV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYW5ndWxhclV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBTbGlja1Jvd0RldGFpbFZpZXcgfSBmcm9tICcuLi9leHRlbnNpb25zL3NsaWNrUm93RGV0YWlsVmlldyc7XG5pbXBvcnQgeyBDb250YWluZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29udGFpbmVyLnNlcnZpY2UnO1xuXG4vLyB1c2luZyBleHRlcm5hbCBub24tdHlwZWQganMgbGlicmFyaWVzXG5kZWNsYXJlIGNvbnN0IFNsaWNrOiBTbGlja05hbWVzcGFjZTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYW5ndWxhci1zbGlja2dyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBtYWtlIGV2ZXJ5dGhpbmcgdHJhbnNpZW50IChub24tc2luZ2xldG9uKVxuICAgIEFuZ3VsYXJVdGlsU2VydmljZSxcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBUcmFuc2xhdGVyU2VydmljZSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyU2xpY2tncmlkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIF9kYXRhc2V0PzogYW55W10gfCBudWxsO1xuICBwcm90ZWN0ZWQgX2NvbHVtbkRlZmluaXRpb25zITogQ29sdW1uW107XG4gIHByb3RlY3RlZCBfY3VycmVudERhdGFzZXRMZW5ndGggPSAwO1xuICBwcm90ZWN0ZWQgX2V2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIgPSBuZXcgU2xpY2suRXZlbnRIYW5kbGVyKCk7XG4gIHByb3RlY3RlZCBfZXZlbnRQdWJTdWJTZXJ2aWNlITogRXZlbnRQdWJTdWJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgX2FuZ3VsYXJHcmlkSW5zdGFuY2VzOiBBbmd1bGFyR3JpZEluc3RhbmNlIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfaXNHcmlkSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9pc0RhdGFzZXRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfaXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9pc0xvY2FsR3JpZCA9IHRydWU7XG4gIHByb3RlY3RlZCBfcGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfcmVnaXN0ZXJlZFJlc291cmNlczogRXh0ZXJuYWxSZXNvdXJjZVtdID0gW107XG4gIGRhdGFWaWV3ITogU2xpY2tEYXRhVmlldztcbiAgc2xpY2tHcmlkITogU2xpY2tHcmlkO1xuICBncm91cGluZ0RlZmluaXRpb246IGFueSA9IHt9O1xuICBncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyPzogU2xpY2tHcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyO1xuICBiYWNrZW5kU2VydmljZUFwaT86IEJhY2tlbmRTZXJ2aWNlQXBpO1xuICBsb2NhbGVzITogTG9jYWxlO1xuICBtZXRyaWNzPzogTWV0cmljcztcbiAgc2hvd1BhZ2luYXRpb24gPSBmYWxzZTtcbiAgc2VydmljZUxpc3Q6IGFueVtdID0gW107XG4gIHRvdGFsSXRlbXMgPSAwO1xuICBwYWdpbmF0aW9uRGF0YT86IHtcbiAgICBncmlkT3B0aW9uczogR3JpZE9wdGlvbjtcbiAgICBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XG4gIH07XG4gIHN1YnNjcmlwdGlvbnM6IEV2ZW50U3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvLyBjb21wb25lbnRzIC8gcGx1Z2luc1xuICBzbGlja0VtcHR5V2FybmluZz86IFNsaWNrRW1wdHlXYXJuaW5nQ29tcG9uZW50O1xuICBzbGlja0Zvb3Rlcj86IFNsaWNrRm9vdGVyQ29tcG9uZW50O1xuICBzbGlja1BhZ2luYXRpb24/OiBTbGlja1BhZ2luYXRpb25Db21wb25lbnQ7XG4gIHNsaWNrUm93RGV0YWlsVmlldz86IFNsaWNrUm93RGV0YWlsVmlldztcblxuICAvLyBzZXJ2aWNlc1xuICBiYWNrZW5kVXRpbGl0eVNlcnZpY2UhOiBCYWNrZW5kVXRpbGl0eVNlcnZpY2U7XG4gIGNvbGxlY3Rpb25TZXJ2aWNlOiBDb2xsZWN0aW9uU2VydmljZTtcbiAgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZTtcbiAgZXh0ZW5zaW9uVXRpbGl0eTogRXh0ZW5zaW9uVXRpbGl0eTtcbiAgZmlsdGVyRmFjdG9yeSE6IEZpbHRlckZhY3Rvcnk7XG4gIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2U7XG4gIGdyaWRFdmVudFNlcnZpY2U6IEdyaWRFdmVudFNlcnZpY2U7XG4gIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZTtcbiAgZ3JpZFN0YXRlU2VydmljZTogR3JpZFN0YXRlU2VydmljZTtcbiAgZ3JvdXBpbmdTZXJ2aWNlOiBHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlO1xuICBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XG4gIHJlc2l6ZXJTZXJ2aWNlITogUmVzaXplclNlcnZpY2U7XG4gIHJ4anM/OiBSeEpzRmFjYWRlO1xuICBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlO1xuICBzb3J0U2VydmljZTogU29ydFNlcnZpY2U7XG4gIHRyZWVEYXRhU2VydmljZTogVHJlZURhdGFTZXJ2aWNlO1xuXG4gIEBJbnB1dCgpIGN1c3RvbURhdGFWaWV3OiBhbnk7XG4gIEBJbnB1dCgpIGdyaWRJZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGdyaWRPcHRpb25zITogR3JpZE9wdGlvbjtcblxuICBASW5wdXQoKVxuICBnZXQgcGFnaW5hdGlvbk9wdGlvbnMoKTogUGFnaW5hdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zO1xuICB9XG4gIHNldCBwYWdpbmF0aW9uT3B0aW9ucyhuZXdQYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChuZXdQYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucykge1xuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgPSB7IC4uLnRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbiwgLi4udGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMsIC4uLm5ld1BhZ2luYXRpb25PcHRpb25zIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0gbmV3UGFnaW5hdGlvbk9wdGlvbnM7XG4gICAgfVxuICAgIHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbiA9IHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID8/IHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbjtcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVRvdGFsSXRlbXModGhpcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zID8/IDAsIHRydWUpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbHVtbkRlZmluaXRpb25zKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgaWYgKHRoaXMuX2lzR3JpZEluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbHVtbkRlZmluaXRpb25zTGlzdChjb2x1bW5EZWZpbml0aW9ucyk7XG4gICAgfVxuICAgIGlmIChjb2x1bW5EZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvcHlDb2x1bW5XaWR0aHNSZWZlcmVuY2UoY29sdW1uRGVmaW5pdGlvbnMpO1xuICAgIH1cbiAgfVxuICBnZXQgY29sdW1uRGVmaW5pdGlvbnMoKTogQ29sdW1uW10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucztcbiAgfVxuXG4gIC8vIG1ha2UgdGhlIGNvbHVtbkRlZmluaXRpb25zIGEgMi13YXkgYmluZGluZyBzbyB0aGF0IHBsdWdpbiBhZGRpbmcgY29sc1xuICAvLyBhcmUgc3luY2hlZCBvbiB1c2VyJ3Mgc2lkZSBhcyB3ZWxsIChSb3dNb3ZlLCBSb3dEZXRhaWwsIFJvd1NlbGVjdGlvbnMpXG4gIEBPdXRwdXQoKSBjb2x1bW5EZWZpbml0aW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGRhdGFzZXQoKTogYW55W10ge1xuICAgIHJldHVybiAodGhpcy5jdXN0b21EYXRhVmlldyA/IHRoaXMuc2xpY2tHcmlkPy5nZXREYXRhPy4oKSA6IHRoaXMuZGF0YVZpZXc/LmdldEl0ZW1zPy4oKSkgfHwgW107XG4gIH1cbiAgc2V0IGRhdGFzZXQobmV3RGF0YXNldDogYW55W10pIHtcbiAgICBjb25zdCBwcmV2RGF0YXNldExuID0gdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGg7XG4gICAgY29uc3QgaXNEYXRhc2V0RXF1YWwgPSBkZXF1YWwobmV3RGF0YXNldCwgdGhpcy5fZGF0YXNldCB8fCBbXSk7XG4gICAgbGV0IGRhdGEgPSBuZXdEYXRhc2V0O1xuXG4gICAgLy8gd2hlbiBUcmVlIERhdGEgaXMgZW5hYmxlZCBhbmQgd2UgZG9uJ3QgeWV0IGhhdmUgdGhlIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGZpbGxlZCwgd2UgY2FuIGZvcmNlIGEgY29udmVydCtzb3J0IG9mIHRoZSBhcnJheVxuICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVUcmVlRGF0YSAmJiBBcnJheS5pc0FycmF5KG5ld0RhdGFzZXQpICYmIChuZXdEYXRhc2V0Lmxlbmd0aCA+IDAgfHwgbmV3RGF0YXNldC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xuICAgICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIGRhdGEgPSB0aGlzLnNvcnRUcmVlRGF0YXNldChuZXdEYXRhc2V0LCAhaXNEYXRhc2V0RXF1YWwpOyAvLyBpZiBkYXRhc2V0IGNoYW5nZWQsIHRoZW4gZm9yY2UgYSByZWZyZXNoIGFueXdheVxuICAgIH1cbiAgICB0aGlzLl9kYXRhc2V0ID0gZGF0YTtcbiAgICB0aGlzLnJlZnJlc2hHcmlkRGF0YShkYXRhIHx8IFtdKTtcbiAgICB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aCA9IChuZXdEYXRhc2V0IHx8IFtdKS5sZW5ndGg7XG5cbiAgICAvLyBleHBhbmQvYXV0b2ZpdCBjb2x1bW5zIG9uIGZpcnN0IHBhZ2UgbG9hZFxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCBpZiB0aGUgcHJldkRhdGFzZXQgd2FzIGVtcHR5IHRoZW4gd2UgYXJlIG9uIGZpcnN0IGxvYWRcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBwcmV2RGF0YXNldExuID09PSAwKSB7XG4gICAgICB0aGlzLnNsaWNrR3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgZGF0YXNldEhpZXJhcmNoaWNhbCgpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0O1xuICB9XG4gIHNldCBkYXRhc2V0SGllcmFyY2hpY2FsKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQ6IGFueVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaXNEYXRhc2V0RXF1YWwgPSBkZXF1YWwobmV3SGllcmFyY2hpY2FsRGF0YXNldCwgdGhpcy5zaGFyZWRTZXJ2aWNlPy5oaWVyYXJjaGljYWxEYXRhc2V0ID8/IFtdKTtcbiAgICBjb25zdCBwcmV2RmxhdERhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0ID0gbmV3SGllcmFyY2hpY2FsRGF0YXNldDtcblxuICAgIGlmIChuZXdIaWVyYXJjaGljYWxEYXRhc2V0ICYmIHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgJiYgdGhpcy5maWx0ZXJTZXJ2aWNlPy5jbGVhckZpbHRlcnMpIHtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5jbGVhckZpbHRlcnMoKTtcbiAgICB9XG5cbiAgICAvLyB3aGVuIGEgaGllcmFyY2hpY2FsIGRhdGFzZXQgaXMgc2V0IGFmdGVyd2FyZCwgd2UgY2FuIHJlc2V0IHRoZSBmbGF0IGRhdGFzZXQgYW5kIGNhbGwgYSB0cmVlIGRhdGEgc29ydCB0aGF0IHdpbGwgb3ZlcndyaXRlIHRoZSBmbGF0IGRhdGFzZXRcbiAgICBpZiAobmV3SGllcmFyY2hpY2FsRGF0YXNldCAmJiB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLnNvcnRTZXJ2aWNlPy5wcm9jZXNzVHJlZURhdGFJbml0aWFsU29ydCkge1xuICAgICAgdGhpcy5zb3J0U2VydmljZS5wcm9jZXNzVHJlZURhdGFJbml0aWFsU29ydCgpO1xuXG4gICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gcmVzZXQvcmVmcmVzaCB0aGUgVHJlZSBEYXRhIGZpbHRlcnMgYmVjYXVzZSBpZiB3ZSBpbnNlcnRlZCBuZXcgaXRlbShzKSB0aGVuIGl0IG1pZ2h0IG5vdCBzaG93IHVwIHdpdGhvdXQgZG9pbmcgdGhpcyByZWZyZXNoXG4gICAgICAvLyBob3dldmVyIHdlIG5lZWQgMSBjcHUgY3ljbGUgYmVmb3JlIGhhdmluZyB0aGUgRGF0YVZpZXcgcmVmcmVzaGVkLCBzbyB3ZSBuZWVkIHRvIHdyYXAgdGhpcyBjaGVjayBpbiBhIHNldFRpbWVvdXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmbGF0RGF0YXNldExuID0gdGhpcy5kYXRhVmlldy5nZXRJdGVtQ291bnQoKTtcbiAgICAgICAgaWYgKGZsYXREYXRhc2V0TG4gPiAwICYmIChmbGF0RGF0YXNldExuICE9PSBwcmV2RmxhdERhdGFzZXRMbiB8fCAhaXNEYXRhc2V0RXF1YWwpKSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZnJlc2hUcmVlRGF0YUZpbHRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGVsZW1lbnRSZWYoKTogRWxlbWVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuZWxtO1xuICB9XG5cbiAgZ2V0IGV2ZW50SGFuZGxlcigpOiBTbGlja0V2ZW50SGFuZGxlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50SGFuZGxlcjtcbiAgfVxuXG4gIGdldCBncmlkQ29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRDb250YWluZXJJZCB8fCAnJ31gKTtcbiAgfVxuXG4gIC8qKiBHRVRURVIgdG8ga25vdyBpZiBkYXRhc2V0IHdhcyBpbml0aWFsaXplZCBvciBub3QgKi9cbiAgZ2V0IGlzRGF0YXNldEluaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZDtcbiAgfVxuICAvKiogU0VUVEVSIHRvIGNoYW5nZSBpZiBkYXRhc2V0IHdhcyBpbml0aWFsaXplZCBvciBub3QgKHN0cmluZ2x5IHVzZWQgZm9yIHVuaXQgdGVzdGluZyBwdXJwb3NlcykgKi9cbiAgc2V0IGlzRGF0YXNldEluaXRpYWxpemVkKGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IGlzSW5pdGlhbGl6ZWQ7XG4gIH1cbiAgc2V0IGlzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkKGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGlzSW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBnZXQgcmVnaXN0ZXJlZFJlc291cmNlcygpOiBFeHRlcm5hbFJlc291cmNlW10ge1xuICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFuZ3VsYXJVdGlsU2VydmljZTogQW5ndWxhclV0aWxTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRhaW5lclNlcnZpY2U6IENvbnRhaW5lclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGVsbTogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCByZWFkb25seSB0cmFuc2xhdGVyU2VydmljZTogVHJhbnNsYXRlclNlcnZpY2UsXG4gICAgQEluamVjdCgnY29uZmlnJykgcHJvdGVjdGVkIGZvclJvb3RDb25maWc6IEdyaWRPcHRpb24sXG4gICAgQEluamVjdCgnZXh0ZXJuYWxTZXJ2aWNlJykgZXh0ZXJuYWxTZXJ2aWNlczogRXh0ZXJuYWxUZXN0aW5nRGVwZW5kZW5jaWVzXG4gICkge1xuICAgIGNvbnN0IHNsaWNrZ3JpZENvbmZpZyA9IG5ldyBTbGlja2dyaWRDb25maWcoKTtcblxuICAgIC8vIGluaXRpYWxpemUgYW5kIGFzc2lnbiBhbGwgU2VydmljZSBEZXBlbmRlbmNpZXNcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ldmVudFB1YlN1YlNlcnZpY2UgPz8gbmV3IEV2ZW50UHViU3ViU2VydmljZSh0aGlzLmVsbS5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZXZlbnROYW1pbmdTdHlsZSA9IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xuXG4gICAgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UgPz8gbmV3IEJhY2tlbmRVdGlsaXR5U2VydmljZSgpO1xuICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRFdmVudFNlcnZpY2UgPz8gbmV3IEdyaWRFdmVudFNlcnZpY2UoKTtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5zaGFyZWRTZXJ2aWNlID8/IG5ldyBTaGFyZWRTZXJ2aWNlKCk7XG4gICAgdGhpcy5jb2xsZWN0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmNvbGxlY3Rpb25TZXJ2aWNlID8/IG5ldyBDb2xsZWN0aW9uU2VydmljZSh0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkgPSBleHRlcm5hbFNlcnZpY2VzPy5leHRlbnNpb25VdGlsaXR5ID8/IG5ldyBFeHRlbnNpb25VdGlsaXR5KHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IG5ldyBGaWx0ZXJGYWN0b3J5KHNsaWNrZ3JpZENvbmZpZywgdGhpcy50cmFuc2xhdGVyU2VydmljZSwgdGhpcy5jb2xsZWN0aW9uU2VydmljZSk7XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZmlsdGVyU2VydmljZSA/PyBuZXcgRmlsdGVyU2VydmljZSh0aGlzLmZpbHRlckZhY3RvcnkgYXMgYW55LCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xuICAgIHRoaXMucmVzaXplclNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5yZXNpemVyU2VydmljZSA/PyBuZXcgUmVzaXplclNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcbiAgICB0aGlzLnNvcnRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uc29ydFNlcnZpY2UgPz8gbmV3IFNvcnRTZXJ2aWNlKHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSk7XG4gICAgdGhpcy50cmVlRGF0YVNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy50cmVlRGF0YVNlcnZpY2UgPz8gbmV3IFRyZWVEYXRhU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSk7XG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnBhZ2luYXRpb25TZXJ2aWNlID8/IG5ldyBQYWdpbmF0aW9uU2VydmljZSh0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xuXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXh0ZW5zaW9uU2VydmljZSA/PyBuZXcgRXh0ZW5zaW9uU2VydmljZShcbiAgICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSxcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZSxcbiAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSxcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZSxcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UsXG4gICAgICB0aGlzLnRyZWVEYXRhU2VydmljZSxcbiAgICAgIHRoaXMudHJhbnNsYXRlclNlcnZpY2UsXG4gICAgKTtcblxuICAgIHRoaXMuZ3JpZFN0YXRlU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRTdGF0ZVNlcnZpY2UgPz8gbmV3IEdyaWRTdGF0ZVNlcnZpY2UodGhpcy5leHRlbnNpb25TZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XG4gICAgdGhpcy5ncmlkU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmdyaWRTZXJ2aWNlID8/IG5ldyBHcmlkU2VydmljZSh0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsIHRoaXMuZmlsdGVyU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UsIHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcbiAgICB0aGlzLmdyb3VwaW5nU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/Lmdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UgPz8gbmV3IEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UodGhpcy5leHRlbnNpb25VdGlsaXR5LCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UpO1xuXG4gICAgdGhpcy5zZXJ2aWNlTGlzdCA9IFtcbiAgICAgIHRoaXMuY29udGFpbmVyU2VydmljZSxcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSxcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZSxcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZSxcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UsXG4gICAgICB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsXG4gICAgICB0aGlzLmdyb3VwaW5nU2VydmljZSxcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLFxuICAgICAgdGhpcy5zb3J0U2VydmljZSxcbiAgICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlLFxuICAgIF07XG5cbiAgICAvLyByZWdpc3RlciBhbGwgU2VydmljZSBpbnN0YW5jZXMgaW4gdGhlIGNvbnRhaW5lclxuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdFeHRlbnNpb25VdGlsaXR5JywgdGhpcy5leHRlbnNpb25VdGlsaXR5KTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRmlsdGVyU2VydmljZScsIHRoaXMuZmlsdGVyU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0NvbGxlY3Rpb25TZXJ2aWNlJywgdGhpcy5jb2xsZWN0aW9uU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0V4dGVuc2lvblNlcnZpY2UnLCB0aGlzLmV4dGVuc2lvblNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcmlkRXZlbnRTZXJ2aWNlJywgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZFNlcnZpY2UnLCB0aGlzLmdyaWRTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZFN0YXRlU2VydmljZScsIHRoaXMuZ3JpZFN0YXRlU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UnLCB0aGlzLmdyb3VwaW5nU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1BhZ2luYXRpb25TZXJ2aWNlJywgdGhpcy5wYWdpbmF0aW9uU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1Jlc2l6ZXJTZXJ2aWNlJywgdGhpcy5yZXNpemVyU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1NoYXJlZFNlcnZpY2UnLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTb3J0U2VydmljZScsIHRoaXMuc29ydFNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdFdmVudFB1YlN1YlNlcnZpY2UnLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdQdWJTdWJTZXJ2aWNlJywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnVHJhbnNsYXRlclNlcnZpY2UnLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnVHJlZURhdGFTZXJ2aWNlJywgdGhpcy50cmVlRGF0YVNlcnZpY2UpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucyB8fCAhdGhpcy5jb2x1bW5EZWZpbml0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBgPGFuZ3VsYXItc2xpY2tncmlkPmAgcmVxdWlyZXMgW2dyaWRPcHRpb25zXSBhbmQgW2NvbHVtbkRlZmluaXRpb25zXSwgaXQgc2VlbXMgdGhhdCB5b3UgbWlnaHQgaGF2ZSBmb3Jnb3QgdG8gcHJvdmlkZSB0aGVtIHNpbmNlIGF0IGxlYXN0IG9mIHRoZW0gaXMgdW5kZWZpbmVkLicpO1xuICAgIH1cblxuICAgIC8vIHNhdmUgcmVzb3VyY2UgcmVmcyB0byByZWdpc3RlciBiZWZvcmUgdGhlIGdyaWQgb3B0aW9ucyBhcmUgbWVyZ2VkIGFuZCBwb3NzaWJseSBkZWVwIGNvcGllZFxuICAgIC8vIHNpbmNlIGEgZGVlcCBjb3B5IG9mIGdyaWQgb3B0aW9ucyB3b3VsZCBsb3NlIG9yaWdpbmFsIHJlc291cmNlIHJlZnMgYnV0IHdlIHdhbnQgdG8ga2VlcCB0aGVtIGFzIHNpbmdsZXRvblxuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMgPSB0aGlzLmdyaWRPcHRpb25zPy5leHRlcm5hbFJlc291cmNlcyB8fCB0aGlzLmdyaWRPcHRpb25zPy5yZWdpc3RlckV4dGVybmFsUmVzb3VyY2VzIHx8IFtdO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5yZWdpc3RlckV4dGVybmFsUmVzb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tBbmd1bGFyLVNsaWNrZ3JpZF0gUGxlYXNlIG5vdGUgdGhhdCB0aGUgZ3JpZCBvcHRpb24gYHJlZ2lzdGVyRXh0ZXJuYWxSZXNvdXJjZXNgIHdhcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciwgcGxlYXNlIHVzZSBgZXh0ZXJuYWxSZXNvdXJjZXNgIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXphdGlvbih0aGlzLl9ldmVudEhhbmRsZXIpO1xuICAgIHRoaXMuX2lzR3JpZEluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIC8vIHJlY2hlY2sgdGhlIGVtcHR5IHdhcm5pbmcgbWVzc2FnZSBhZnRlciBncmlkIGlzIHNob3duIHNvIHRoYXQgaXQgd29ya3MgaW4gZXZlcnkgdXNlIGNhc2VcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlICYmIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhc2V0KSkge1xuICAgICAgY29uc3QgZmluYWxUb3RhbENvdW50ID0gdGhpcy5kYXRhc2V0Lmxlbmd0aDtcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoZmluYWxUb3RhbENvdW50IDwgMSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZERlc3Ryb3knLCB0aGlzLnNsaWNrR3JpZCk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQWZ0ZXJHcmlkRGVzdHJveWVkJywgdHJ1ZSk7XG4gIH1cblxuICBkZXN0cm95KHNob3VsZEVtcHR5RG9tRWxlbWVudENvbnRhaW5lciA9IGZhbHNlKSB7XG4gICAgLy8gZGlzcG9zZSBvZiBhbGwgU2VydmljZXNcbiAgICB0aGlzLnNlcnZpY2VMaXN0LmZvckVhY2goKHNlcnZpY2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHNlcnZpY2UgJiYgc2VydmljZS5kaXNwb3NlKSB7XG4gICAgICAgIHNlcnZpY2UuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2VydmljZUxpc3QgPSBbXTtcblxuICAgIC8vIGRpc3Bvc2UgYWxsIHJlZ2lzdGVyZWQgZXh0ZXJuYWwgcmVzb3VyY2VzXG4gICAgdGhpcy5kaXNwb3NlRXh0ZXJuYWxSZXNvdXJjZXMoKTtcblxuICAgIC8vIGRpc3Bvc2UgdGhlIENvbXBvbmVudHNcbiAgICB0aGlzLnNsaWNrRW1wdHlXYXJuaW5nPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zbGlja0Zvb3Rlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2xpY2tQYWdpbmF0aW9uPy5kaXNwb3NlKCk7XG5cbiAgICBpZiAodGhpcy5fZXZlbnRIYW5kbGVyPy51bnN1YnNjcmliZUFsbCkge1xuICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZT8udW5zdWJzY3JpYmVBbGwoKTtcbiAgICBpZiAodGhpcy5kYXRhVmlldykge1xuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhbXSk7XG4gICAgICB0aGlzLmRhdGFWaWV3LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2xpY2tHcmlkPy5kZXN0cm95KSB7XG4gICAgICB0aGlzLnNsaWNrR3JpZC5kZXN0cm95KHNob3VsZEVtcHR5RG9tRWxlbWVudENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFja2VuZFNlcnZpY2VBcGkpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKSkge1xuICAgICAgICBkZWxldGUgdGhpcy5iYWNrZW5kU2VydmljZUFwaVtwcm9wIGFzIGtleW9mIEJhY2tlbmRTZXJ2aWNlQXBpXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbkRlZmluaXRpb25zKSkge1xuICAgICAgKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMgYXMgYW55KVtwcm9wXSA9IG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLnNoYXJlZFNlcnZpY2UpKSB7XG4gICAgICAodGhpcy5zaGFyZWRTZXJ2aWNlIGFzIGFueSlbcHJvcF0gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIHdlIGNvdWxkIG9wdGlvbmFsbHkgYWxzbyBlbXB0eSB0aGUgY29udGVudCBvZiB0aGUgZ3JpZCBjb250YWluZXIgRE9NIGVsZW1lbnRcbiAgICBpZiAoc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyKSB7XG4gICAgICB0aGlzLmVtcHR5R3JpZENvbnRhaW5lckVsbSgpO1xuICAgIH1cblxuICAgIC8vIGFsc28gdW5zdWJzY3JpYmUgYWxsIFJ4SlMgc3Vic2NyaXB0aW9uc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHVuc3Vic2NyaWJlQWxsKHRoaXMuc3Vic2NyaXB0aW9ucyk7XG5cbiAgICB0aGlzLl9kYXRhc2V0ID0gbnVsbDtcbiAgICB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNsaWNrR3JpZCA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cblxuICBkaXNwb3NlRXh0ZXJuYWxSZXNvdXJjZXMoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcbiAgICAgIHdoaWxlICh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wb3AoKTtcbiAgICAgICAgaWYgKHJlcz8uZGlzcG9zZSkge1xuICAgICAgICAgIHJlcy5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IFtdO1xuICB9XG5cbiAgZW1wdHlHcmlkQ29udGFpbmVyRWxtKCkge1xuICAgIGNvbnN0IGdyaWRDb250YWluZXJJZCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmdyaWRDb250YWluZXJJZCA/PyAnZ3JpZDEnO1xuICAgIGNvbnN0IGdyaWRDb250YWluZXJFbG0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtncmlkQ29udGFpbmVySWR9YCk7XG4gICAgZW1wdHlFbGVtZW50KGdyaWRDb250YWluZXJFbG0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvdXIgaW50ZXJuYWwgUG9zdCBQcm9jZXNzIGNhbGxiYWNrLCBpdCB3aWxsIGV4ZWN1dGUgaW50ZXJuYWxseSBhZnRlciB3ZSBnZXQgYmFjayByZXN1bHQgZnJvbSB0aGUgUHJvY2VzcyBiYWNrZW5kIGNhbGxcbiAgICogRm9yIG5vdywgdGhpcyBpcyBHcmFwaFFMIFNlcnZpY2UgT05MWSBmZWF0dXJlIGFuZCBpdCB3aWxsIGJhc2ljYWxseSByZWZyZXNoIHRoZSBEYXRhc2V0ICYgUGFnaW5hdGlvbiB3aXRob3V0IGhhdmluZyB0aGUgdXNlciB0byBjcmVhdGUgaGlzIG93biBQb3N0UHJvY2VzcyBldmVyeSB0aW1lXG4gICAqL1xuICBjcmVhdGVCYWNrZW5kQXBpSW50ZXJuYWxQb3N0UHJvY2Vzc0NhbGxiYWNrKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xuICAgIGlmIChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGkuc2VydmljZSkge1xuICAgICAgY29uc3QgYmFja2VuZEFwaVNlcnZpY2UgPSBiYWNrZW5kQXBpLnNlcnZpY2U7XG5cbiAgICAgIC8vIGludGVybmFsUG9zdFByb2Nlc3Mgb25seSB3b3JrcyAoZm9yIG5vdykgd2l0aCBhIEdyYXBoUUwgU2VydmljZSwgc28gbWFrZSBzdXJlIGl0IGlzIG9mIHRoYXQgdHlwZVxuICAgICAgaWYgKHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBiYWNrZW5kQXBpLmludGVybmFsUG9zdFByb2Nlc3MgPSAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSAoYmFja2VuZEFwaSAmJiBiYWNrZW5kQXBpU2VydmljZSAmJiB0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuZ2V0RGF0YXNldE5hbWUgPT09ICdmdW5jdGlvbicpID8gYmFja2VuZEFwaVNlcnZpY2UuZ2V0RGF0YXNldE5hbWUoKSA6ICcnO1xuICAgICAgICAgIGlmIChwcm9jZXNzUmVzdWx0Py5kYXRhW2RhdGFzZXROYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ25vZGVzJykgPyAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdLm5vZGVzIDogKHByb2Nlc3NSZXN1bHQgYXMgYW55KS5kYXRhW2RhdGFzZXROYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBwcm9jZXNzUmVzdWx0LmRhdGFbZGF0YXNldE5hbWVdLmhhc093blByb3BlcnR5KCd0b3RhbENvdW50JykgPyAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdLnRvdGFsQ291bnQgOiAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKGRhdGEsIHRvdGFsQ291bnQgfHwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemF0aW9uKGV2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLmdyaWRPcHRpb25zLnRyYW5zbGF0ZXIgPSB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlO1xuICAgIHRoaXMuX2V2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjtcblxuICAgIC8vIHdoZW4gZGV0ZWN0aW5nIGEgZnJvemVuIGdyaWQsIHdlJ2xsIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSBtb3VzZXdoZWVsIHNjcm9sbCBoYW5kbGVyIHNvIHRoYXQgd2UgY2FuIHNjcm9sbCBmcm9tIGJvdGggbGVmdC9yaWdodCBmcm96ZW4gY29udGFpbmVyc1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmICgodGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Sb3cgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyaWRPcHRpb25zLmZyb3plblJvdyA+PSAwKSB8fCB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uID49IDApICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlTW91c2VXaGVlbFNjcm9sbEhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVNb3VzZVdoZWVsU2Nyb2xsSGFuZGxlciA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSB0aGlzLmdyaWRPcHRpb25zPy5ldmVudE5hbWluZ1N0eWxlID8/IEV2ZW50TmFtaW5nU3R5bGUuY2FtZWxDYXNlO1xuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkJlZm9yZUdyaWRDcmVhdGUnLCB0cnVlKTtcblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YXNldCBpcyBpbml0aWFsaXplZCAoaWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpdCBjYW5ub3QgZ2V0TGVuZ3RoIG9mIG51bGwpXG4gICAgdGhpcy5fZGF0YXNldCA9IHRoaXMuX2RhdGFzZXQgfHwgW107XG4gICAgdGhpcy5ncmlkT3B0aW9ucyA9IHRoaXMubWVyZ2VHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcbiAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb247XG4gICAgdGhpcy5sb2NhbGVzID0gdGhpcy5ncmlkT3B0aW9ucz8ubG9jYWxlcyA/PyBDb25zdGFudHMubG9jYWxlcztcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpID0gdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGk7XG4gICAgdGhpcy5faXNMb2NhbEdyaWQgPSAhdGhpcy5iYWNrZW5kU2VydmljZUFwaTsgLy8gY29uc2lkZXJlZCBhIGxvY2FsIGdyaWQgaWYgaXQgZG9lc24ndCBoYXZlIGEgYmFja2VuZCBzZXJ2aWNlIHNldFxuXG4gICAgdGhpcy5jcmVhdGVCYWNrZW5kQXBpSW50ZXJuYWxQb3N0UHJvY2Vzc0NhbGxiYWNrKHRoaXMuZ3JpZE9wdGlvbnMpO1xuXG4gICAgaWYgKCF0aGlzLmN1c3RvbURhdGFWaWV3KSB7XG4gICAgICBjb25zdCBkYXRhdmlld0lubGluZUZpbHRlcnMgPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3ICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaW5saW5lRmlsdGVycyB8fCBmYWxzZTtcbiAgICAgIGxldCBkYXRhVmlld09wdGlvbnM6IERhdGFWaWV3T3B0aW9uID0geyBpbmxpbmVGaWx0ZXJzOiBkYXRhdmlld0lubGluZUZpbHRlcnMgfTtcblxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZHJhZ2dhYmxlR3JvdXBpbmcgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVHcm91cGluZykge1xuICAgICAgICB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSBuZXcgU2xpY2tHcm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyKCk7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5ncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyID0gdGhpcy5ncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyO1xuICAgICAgICBkYXRhVmlld09wdGlvbnMgPSB7IC4uLmRhdGFWaWV3T3B0aW9ucywgZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcjogdGhpcy5ncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyIH07XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IFNsaWNrLkRhdGEuRGF0YVZpZXcoZGF0YVZpZXdPcHRpb25zKTtcbiAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkRhdGF2aWV3Q3JlYXRlZCcsIHRoaXMuZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIC8vIGdldCBhbnkgcG9zc2libGUgU2VydmljZXMgdGhhdCB1c2VyIHdhbnQgdG8gcmVnaXN0ZXIgd2hpY2ggZG9uJ3QgcmVxdWlyZSBTbGlja0dyaWQgdG8gYmUgaW5zdGFudGlhdGVkXG4gICAgLy8gUnhKUyBSZXNvdXJjZSBpcyBpbiB0aGlzIGxvdCBiZWNhdXNlIGl0IGhhcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGFuZCBkb2Vzbid0IHJlcXVpcmUgU2xpY2tHcmlkIHRvIGJlIGluaXRpYWxpemVkXG4gICAgdGhpcy5wcmVSZWdpc3RlclJlc291cmNlcygpO1xuXG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyLCB3ZSBwcm92aWRlIHRoZSBwcm9wZXJ0eSBcImVkaXRvclwiIGFzIGFuIEFuZ3VsYXItU2xpY2tncmlkIGVkaXRvciBjb21wbGV4IG9iamVjdFxuICAgIC8vIGhvd2V2ZXIgXCJlZGl0b3JcIiBpcyB1c2VkIGludGVybmFsbHkgYnkgU2xpY2tHcmlkIGZvciBpdCdzIG93biBFZGl0b3IgRmFjdG9yeVxuICAgIC8vIHNvIGluIG91ciBsaWIgd2Ugd2lsbCBzd2FwIFwiZWRpdG9yXCIgYW5kIGNvcHkgaXQgaW50byBhIG5ldyBwcm9wZXJ0eSBjYWxsZWQgXCJpbnRlcm5hbENvbHVtbkVkaXRvclwiXG4gICAgLy8gdGhlbiB0YWtlIGJhY2sgXCJlZGl0b3IubW9kZWxcIiBhbmQgbWFrZSBpdCB0aGUgbmV3IFwiZWRpdG9yXCIgc28gdGhhdCBTbGlja0dyaWQgRWRpdG9yIEZhY3Rvcnkgc3RpbGwgd29ya3NcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IHRoaXMuc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKHRoaXMuX2NvbHVtbkRlZmluaXRpb25zKTtcblxuICAgIC8vIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGF1dG9tYXRpY2FsbHkgYWRkIGEgQ3VzdG9tIEVkaXRvciBGb3JtYXR0ZXIsIHdlIG5lZWQgdG8gY2FsbCB0aGUgYXV0byBhZGQgZnVuY3Rpb24gYWdhaW5cbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5hdXRvQWRkQ3VzdG9tRWRpdG9yRm9ybWF0dGVyKSB7XG4gICAgICBhdXRvQWRkRWRpdG9yRm9ybWF0dGVyVG9Db2x1bW5zV2l0aEVkaXRvcih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucy5hdXRvQWRkQ3VzdG9tRWRpdG9yRm9ybWF0dGVyKTtcbiAgICB9XG5cbiAgICAvLyBzYXZlIHJlZmVyZW5jZSBmb3IgYWxsIGNvbHVtbnMgYmVmb3JlIHRoZXkgb3B0aW9uYWxseSBiZWNvbWUgaGlkZGVuL3Zpc2libGVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucyA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS52aXNpYmxlQ29sdW1ucyA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zO1xuXG4gICAgLy8gYmVmb3JlIGNlcnRhaW4gZXh0ZW50aW9ucy9wbHVnaW5zIHBvdGVudGlhbGx5IGFkZHMgZXh0cmEgY29sdW1ucyBub3QgY3JlYXRlZCBieSB0aGUgdXNlciBpdHNlbGYgKFJvd01vdmUsIFJvd0RldGFpbCwgUm93U2VsZWN0aW9ucylcbiAgICAvLyB3ZSdsbCBzdWJzY3JpYmUgdG8gdGhlIGV2ZW50IGFuZCBwdXNoIGJhY2sgdGhlIGNoYW5nZSB0byB0aGUgdXNlciBzbyB0aGV5IGFsd2F5cyB1c2UgZnVsbCBjb2x1bW4gZGVmcyBhcnJheSBpbmNsdWRpbmcgZXh0cmEgY29sc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnN1YnNjcmliZTx7IGNvbHVtbnM6IENvbHVtbltdOyBncmlkOiBTbGlja0dyaWQ7IH0+KCdvblBsdWdpbkNvbHVtbnNDaGFuZ2VkJywgZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gZGF0YS5jb2x1bW5zO1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25zQ2hhbmdlLmVtaXQodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gYWZ0ZXIgc3Vic2NyaWJpbmcgdG8gcG90ZW50aWFsIGNvbHVtbnMgY2hhbmdlZCwgd2UgYXJlIHJlYWR5IHRvIGNyZWF0ZSB0aGVzZSBvcHRpb25hbCBleHRlbnNpb25zXG4gICAgLy8gd2hlbiB3ZSBkaWQgZmluZCBzb21lIHRvIGNyZWF0ZSAoUm93TW92ZSwgUm93RGV0YWlsLCBSb3dTZWxlY3Rpb25zKSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IG1vZGlmeSBjb2x1bW4gZGVmaW5pdGlvbnMgKGJ5IHByZXZpb3VzIHN1YnNjcmliZSlcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuY3JlYXRlRXh0ZW5zaW9uc0JlZm9yZUdyaWRDcmVhdGlvbih0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG5cbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBQaW5uaW5nL0Zyb3plbiBcInByZXNldHNcIiwgd2UgbmVlZCB0byBhcHBseSB0aGVtIGluIHRoZSBncmlkIG9wdGlvbnNcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzPy5waW5uaW5nKSB7XG4gICAgICB0aGlzLmdyaWRPcHRpb25zID0geyAuLi50aGlzLmdyaWRPcHRpb25zLCAuLi50aGlzLmdyaWRPcHRpb25zLnByZXNldHMucGlubmluZyB9O1xuICAgIH1cblxuICAgIC8vIGJ1aWxkIFNsaWNrR3JpZCBHcmlkLCBhbHNvIHVzZXIgbWlnaHQgb3B0aW9uYWxseSBwYXNzIGEgY3VzdG9tIGRhdGF2aWV3IChlLmcuIHJlbW90ZSBtb2RlbClcbiAgICB0aGlzLnNsaWNrR3JpZCA9IG5ldyBTbGljay5HcmlkKGAjJHt0aGlzLmdyaWRJZH1gLCB0aGlzLmN1c3RvbURhdGFWaWV3IHx8IHRoaXMuZGF0YVZpZXcsIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGF0YVZpZXcgPSB0aGlzLmRhdGFWaWV3O1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5zbGlja0dyaWQgPSB0aGlzLnNsaWNrR3JpZDtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ3JpZENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmVsbS5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xuXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmJpbmREaWZmZXJlbnRFeHRlbnNpb25zKCk7XG4gICAgdGhpcy5iaW5kRGlmZmVyZW50SG9va3ModGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuZGF0YVZpZXcpO1xuXG4gICAgLy8gd2hlbiBpdCdzIGEgZnJvemVuIGdyaWQsIHdlIG5lZWQgdG8ga2VlcCB0aGUgZnJvemVuIGNvbHVtbiBpZCBmb3IgcmVmZXJlbmNlIGlmIHdlIGV2ZXIgc2hvdy9oaWRlIGNvbHVtbiBmcm9tIENvbHVtblBpY2tlci9HcmlkTWVudSBhZnRlcndhcmRcbiAgICBjb25zdCBmcm96ZW5Db2x1bW5JbmRleCA9IHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyaWRPcHRpb25zLmZyb3plbkNvbHVtbiA6IC0xO1xuICAgIGlmIChmcm96ZW5Db2x1bW5JbmRleCA+PSAwICYmIGZyb3plbkNvbHVtbkluZGV4IDw9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmZyb3plblZpc2libGVDb2x1bW5JZCA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zW2Zyb3plbkNvbHVtbkluZGV4XS5pZCB8fCAnJztcbiAgICB9XG5cbiAgICAvLyBnZXQgYW55IHBvc3NpYmxlIFNlcnZpY2VzIHRoYXQgdXNlciB3YW50IHRvIHJlZ2lzdGVyXG4gICAgdGhpcy5yZWdpc3RlclJlc291cmNlcygpO1xuXG4gICAgLy8gaW5pdGlhbGl6ZSB0aGUgU2xpY2tHcmlkIGdyaWRcbiAgICB0aGlzLnNsaWNrR3JpZC5pbml0KCk7XG5cbiAgICAvLyBpbml0aWFsaXplZCB0aGUgcmVzaXplciBzZXJ2aWNlIG9ubHkgYWZ0ZXIgU2xpY2tHcmlkIGlzIGluaXRpYWxpemVkXG4gICAgLy8gaWYgd2UgZG9uJ3Qgd2UgZW5kIHVwIGJpbmRpbmcgb3VyIHJlc2l6ZSB0byBhIGdyaWQgZWxlbWVudCB0aGF0IGRvZXNuJ3QgeWV0IGV4aXN0IGluIHRoZSBET00gYW5kIHRoZSByZXNpemVyIHNlcnZpY2Ugd2lsbCBmYWlsIHNpbGVudGx5IChiZWNhdXNlIGl0IGhhcyBhIHRyeS9jYXRjaCB0aGF0IHVuYmluZHMgdGhlIHJlc2l6ZSB3aXRob3V0IHRocm93aW5nIGJhY2spXG4gICAgaWYgKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UuaW5pdCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gdXNlciBjb3VsZCBzaG93IGEgY3VzdG9tIGZvb3RlciB3aXRoIHRoZSBkYXRhIG1ldHJpY3MgKGRhdGFzZXQgbGVuZ3RoIGFuZCBsYXN0IHVwZGF0ZWQgdGltZXN0YW1wKVxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnMuc2hvd0N1c3RvbUZvb3RlciAmJiB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMgJiYgdGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xuICAgICAgdGhpcy5zbGlja0Zvb3RlciA9IG5ldyBTbGlja0Zvb3RlckNvbXBvbmVudCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucy5jdXN0b21Gb290ZXJPcHRpb25zLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xuICAgICAgdGhpcy5zbGlja0Zvb3Rlci5yZW5kZXJGb290ZXIodGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmN1c3RvbURhdGFWaWV3ICYmIHRoaXMuZGF0YVZpZXcpIHtcbiAgICAgIC8vIGxvYWQgdGhlIGRhdGEgaW4gdGhlIERhdGFWaWV3ICh1bmxlc3MgaXQncyBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0LCBpZiBzbyBpdCB3aWxsIGJlIGxvYWRlZCBhZnRlciB0aGUgaW5pdGlhbCB0cmVlIHNvcnQpXG4gICAgICBjb25zdCBpbml0aWFsRGF0YXNldCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVRyZWVEYXRhID8gdGhpcy5zb3J0VHJlZURhdGFzZXQodGhpcy5fZGF0YXNldCkgOiB0aGlzLl9kYXRhc2V0O1xuICAgICAgdGhpcy5kYXRhVmlldy5iZWdpblVwZGF0ZSgpO1xuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhpbml0aWFsRGF0YXNldCB8fCBbXSwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgPz8gJ2lkJyk7XG4gICAgICB0aGlzLmRhdGFWaWV3LmVuZFVwZGF0ZSgpO1xuXG4gICAgICAvLyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgaXRlbXMgdGhhdCBhcmUgbm90IHZpc2libGUgKGR1ZSB0byBiZWluZyBmaWx0ZXJlZCBvdXQgb3IgYmVpbmcgb24gYSBkaWZmZXJlbnQgcGFnZSlcbiAgICAgIC8vIHRvIHN0YXkgc2VsZWN0ZWQsIHBhc3MgJ2ZhbHNlJyB0byB0aGUgc2Vjb25kIGFyZ1xuICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkPy5nZXRTZWxlY3Rpb25Nb2RlbCgpICYmIHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3Lmhhc093blByb3BlcnR5KCdzeW5jR3JpZFNlbGVjdGlvbicpKSB7XG4gICAgICAgIC8vIGlmIHdlIGFyZSB1c2luZyBhIEJhY2tlbmQgU2VydmljZSwgd2Ugd2lsbCBkbyBhbiBleHRyYSBmbGFnIGNoZWNrLCB0aGUgcmVhc29uIGlzIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBzb21lIHVuaW50ZW5kZWQgYmVoYXZpb3JzXG4gICAgICAgIC8vIHdpdGggdGhlIEJhY2tlbmRTZXJ2aWNlQXBpIGJlY2F1c2UgdGVjaG5pY2FsbHkgdGhlIGRhdGEgaW4gdGhlIHBhZ2UgY2hhbmdlcyB0aGUgRGF0YVZpZXcgb24gZXZlcnkgcGFnZSBjaGFuZ2UuXG4gICAgICAgIGxldCBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3Lmhhc093blByb3BlcnR5KCdzeW5jR3JpZFNlbGVjdGlvbldpdGhCYWNrZW5kU2VydmljZScpKSB7XG4gICAgICAgICAgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQgPSB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlIGFzIGJvb2xlYW47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzeW5jR3JpZFNlbGVjdGlvbiA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc3luY0dyaWRTZWxlY3Rpb24gPT09ICdib29sZWFuJykge1xuICAgICAgICAgIGxldCBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24gPSBzeW5jR3JpZFNlbGVjdGlvbjtcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzTG9jYWxHcmlkKSB7XG4gICAgICAgICAgICAvLyB3aGVuIHVzaW5nIEJhY2tlbmRTZXJ2aWNlQXBpLCB3ZSdsbCBiZSB1c2luZyB0aGUgXCJzeW5jR3JpZFNlbGVjdGlvbldpdGhCYWNrZW5kU2VydmljZVwiIGZsYWcgQlVUIFwic3luY0dyaWRTZWxlY3Rpb25cIiBtdXN0IGFsc28gYmUgc2V0IHRvIFRydWVcbiAgICAgICAgICAgIHByZXNlcnZlZFJvd1NlbGVjdGlvbiA9IHN5bmNHcmlkU2VsZWN0aW9uICYmIHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uKHRoaXMuc2xpY2tHcmlkLCBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzeW5jR3JpZFNlbGVjdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLmRhdGFWaWV3LnN5bmNHcmlkU2VsZWN0aW9uKHRoaXMuc2xpY2tHcmlkLCBzeW5jR3JpZFNlbGVjdGlvbi5wcmVzZXJ2ZUhpZGRlbiwgc3luY0dyaWRTZWxlY3Rpb24ucHJlc2VydmVIaWRkZW5PblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldExuID0gdGhpcy5kYXRhVmlldy5nZXRMZW5ndGgoKSB8fCB0aGlzLl9kYXRhc2V0ICYmIHRoaXMuX2RhdGFzZXQubGVuZ3RoIHx8IDA7XG4gICAgICBpZiAoZGF0YXNldExuID4gMCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgdGhpcy5sb2FkUm93U2VsZWN0aW9uUHJlc2V0V2hlbkV4aXN0cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XG4gICAgICAgIHRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1c2VyIG1pZ2h0IHdhbnQgdG8gaGlkZSB0aGUgaGVhZGVyIHJvdyBvbiBwYWdlIGxvYWQgYnV0IHN0aWxsIGhhdmUgYGVuYWJsZUZpbHRlcmluZzogdHJ1ZWBcbiAgICAvLyBpZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBuZWVkIHRvIGhpZGUgdGhlIGhlYWRlclJvdyBPTkxZIEFGVEVSIGFsbCBmaWx0ZXJzIGdvdCBjcmVhdGVkICYgZGF0YVZpZXcgZXhpc3RcbiAgICBpZiAodGhpcy5faGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQpIHtcbiAgICAgIHRoaXMuc2hvd0hlYWRlclJvdyhmYWxzZSk7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZDtcbiAgICB9XG5cbiAgICAvLyBwdWJsaXNoICYgZGlzcGF0Y2ggY2VydGFpbiBldmVudHNcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25HcmlkQ3JlYXRlZCcsIHRoaXMuc2xpY2tHcmlkKTtcblxuICAgIC8vIGFmdGVyIHRoZSBEYXRhVmlldyBpcyBjcmVhdGVkICYgdXBkYXRlZCBleGVjdXRlIHNvbWUgcHJvY2Vzc2VzXG4gICAgaWYgKCF0aGlzLmN1c3RvbURhdGFWaWV3KSB7XG4gICAgICB0aGlzLmV4ZWN1dGVBZnRlckRhdGF2aWV3Q3JlYXRlZCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gYmluZCByZXNpemUgT05MWSBhZnRlciB0aGUgZGF0YVZpZXcgaXMgcmVhZHlcbiAgICB0aGlzLmJpbmRSZXNpemVIb29rKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zKTtcblxuICAgIC8vIGJpbmQgdGhlIEJhY2tlbmQgU2VydmljZSBBUEkgY2FsbGJhY2sgZnVuY3Rpb25zIG9ubHkgYWZ0ZXIgdGhlIGdyaWQgaXMgaW5pdGlhbGl6ZWRcbiAgICAvLyBiZWNhdXNlIHRoZSBwcmVQcm9jZXNzKCkgYW5kIG9uSW5pdCgpIG1pZ2h0IGdldCB0cmlnZ2VyZWRcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkpIHtcbiAgICAgIHRoaXMuYmluZEJhY2tlbmRDYWxsYmFja0Z1bmN0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBsb2NhbCBncmlkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgdGhlIFBhZ2luYXRpb25cbiAgICAvLyBpZiBzbyB0aGVuIGFsc28gY2hlY2sgaWYgdGhlcmUncyBhbnkgcHJlc2V0cyBhbmQgZmluYWxseSBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uU2VydmljZVxuICAgIC8vIGEgbG9jYWwgZ3JpZCB3aXRoIFBhZ2luYXRpb24gcHJlc2V0cyB3aWxsIHBvdGVudGlhbGx5IGhhdmUgYSBkaWZmZXJlbnQgdG90YWwgb2YgaXRlbXMsIHdlJ2xsIG5lZWQgdG8gZ2V0IGl0IGZyb20gdGhlIERhdGFWaWV3IGFuZCB1cGRhdGUgb3VyIHRvdGFsXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVBhZ2luYXRpb24gJiYgdGhpcy5faXNMb2NhbEdyaWQpIHtcbiAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xuICAgICAgdGhpcy5sb2FkTG9jYWxHcmlkUGFnaW5hdGlvbih0aGlzLmRhdGFzZXQpO1xuICAgIH1cblxuICAgIHRoaXMuX2FuZ3VsYXJHcmlkSW5zdGFuY2VzID0ge1xuICAgICAgLy8gU2xpY2sgR3JpZCAmIERhdGFWaWV3IG9iamVjdHNcbiAgICAgIGRhdGFWaWV3OiB0aGlzLmRhdGFWaWV3LFxuICAgICAgc2xpY2tHcmlkOiB0aGlzLnNsaWNrR3JpZCxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9uU2VydmljZT8uZXh0ZW5zaW9uTGlzdCxcblxuICAgICAgLy8gcHVibGljIG1ldGhvZHNcbiAgICAgIGRlc3Ryb3k6IHRoaXMuZGVzdHJveS5iaW5kKHRoaXMpLFxuXG4gICAgICAvLyByZXR1cm4gYWxsIGF2YWlsYWJsZSBTZXJ2aWNlcyAobm9uLXNpbmdsZXRvbilcbiAgICAgIGJhY2tlbmRTZXJ2aWNlOiB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaT8uc2VydmljZSxcbiAgICAgIGV2ZW50UHViU3ViU2VydmljZTogdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLFxuICAgICAgZmlsdGVyU2VydmljZTogdGhpcy5maWx0ZXJTZXJ2aWNlLFxuICAgICAgZ3JpZEV2ZW50U2VydmljZTogdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLFxuICAgICAgZ3JpZFN0YXRlU2VydmljZTogdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLFxuICAgICAgZ3JpZFNlcnZpY2U6IHRoaXMuZ3JpZFNlcnZpY2UsXG4gICAgICBncm91cGluZ1NlcnZpY2U6IHRoaXMuZ3JvdXBpbmdTZXJ2aWNlLFxuICAgICAgZXh0ZW5zaW9uU2VydmljZTogdGhpcy5leHRlbnNpb25TZXJ2aWNlLFxuICAgICAgcGFnaW5hdGlvblNlcnZpY2U6IHRoaXMucGFnaW5hdGlvblNlcnZpY2UsXG4gICAgICByZXNpemVyU2VydmljZTogdGhpcy5yZXNpemVyU2VydmljZSxcbiAgICAgIHNvcnRTZXJ2aWNlOiB0aGlzLnNvcnRTZXJ2aWNlLFxuICAgICAgdHJlZURhdGFTZXJ2aWNlOiB0aGlzLnRyZWVEYXRhU2VydmljZSxcbiAgICB9O1xuXG4gICAgLy8gYWxsIGluc3RhbmNlcyAoU2xpY2tHcmlkLCBEYXRhVmlldyAmIGFsbCBTZXJ2aWNlcylcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25Bbmd1bGFyR3JpZENyZWF0ZWQnLCB0aGlzLl9hbmd1bGFyR3JpZEluc3RhbmNlcyk7XG4gIH1cblxuICAvKipcbiAgICogT24gYSBQYWdpbmF0aW9uIGNoYW5nZWQsIHdlIHdpbGwgdHJpZ2dlciBhIEdyaWQgU3RhdGUgY2hhbmdlZCB3aXRoIHRoZSBuZXcgcGFnaW5hdGlvbiBpbmZvXG4gICAqIEFsc28gaWYgd2UgdXNlIFJvdyBTZWxlY3Rpb24gb3IgdGhlIENoZWNrYm94IFNlbGVjdG9yIHdpdGggYSBCYWNrZW5kIFNlcnZpY2UgKE9kYXRhLCBHcmFwaFFMKSwgd2UgbmVlZCB0byByZXNldCBhbnkgc2VsZWN0aW9uXG4gICAqL1xuICBwYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uOiBTZXJ2aWNlUGFnaW5hdGlvbikge1xuICAgIGNvbnN0IGlzU3luY0dyaWRTZWxlY3Rpb25FbmFibGVkID0gdGhpcy5ncmlkU3RhdGVTZXJ2aWNlPy5uZWVkVG9QcmVzZXJ2ZVJvd1NlbGVjdGlvbigpID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiAhaXNTeW5jR3JpZFNlbGVjdGlvbkVuYWJsZWQgJiYgdGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3RvcikpIHtcbiAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhbXSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfSA9IHBhZ2luYXRpb247XG4gICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZSkge1xuICAgICAgaWYgKHBhZ2VTaXplICE9PSB1bmRlZmluZWQgJiYgcGFnZU51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jdXJyZW50UGFnaW5hdGlvbiA9IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uR3JpZFN0YXRlQ2hhbmdlZCcsIHtcbiAgICAgIGNoYW5nZTogeyBuZXdWYWx1ZXM6IHsgcGFnZU51bWJlciwgcGFnZVNpemUgfSwgdHlwZTogR3JpZFN0YXRlVHlwZS5wYWdpbmF0aW9uIH0sXG4gICAgICBncmlkU3RhdGU6IHRoaXMuZ3JpZFN0YXRlU2VydmljZS5nZXRDdXJyZW50R3JpZFN0YXRlKClcbiAgICB9KTtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gZGF0YXNldCBjaGFuZ2VzLCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGVudGlyZSBncmlkIFVJICYgcG9zc2libHkgcmVzaXplIGl0IGFzIHdlbGxcbiAgICogQHBhcmFtIGRhdGFzZXRcbiAgICovXG4gIHJlZnJlc2hHcmlkRGF0YShkYXRhc2V0OiBhbnlbXSwgdG90YWxDb3VudD86IG51bWJlcikge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UgJiYgQXJyYXkuaXNBcnJheShkYXRhc2V0KSkge1xuICAgICAgY29uc3QgZmluYWxUb3RhbENvdW50ID0gdG90YWxDb3VudCB8fCBkYXRhc2V0Lmxlbmd0aDtcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoZmluYWxUb3RhbENvdW50IDwgMSk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YXNldCkgJiYgdGhpcy5zbGlja0dyaWQgJiYgdGhpcy5kYXRhVmlldz8uc2V0SXRlbXMpIHtcbiAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SXRlbXMoZGF0YXNldCwgdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgPz8gJ2lkJyk7XG4gICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlVHJlZURhdGEpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5yZVNvcnQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFzZXQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzRGF0YXNldEluaXRpYWxpemVkKSB7XG4gICAgICAgICAgdGhpcy5sb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcblxuICAgICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFJvd1NlbGVjdGlvblByZXNldFdoZW5FeGlzdHMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YXNldCkge1xuICAgICAgICB0aGlzLnNsaWNrR3JpZC5pbnZhbGlkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRpc3BsYXkgdGhlIFBhZ2luYXRpb24gY29tcG9uZW50IG9ubHkgYWZ0ZXIgY2FsbGluZyB0aGlzIHJlZnJlc2ggZGF0YSBmaXJzdCwgd2UgY2FsbCBpdCBoZXJlIHNvIHRoYXQgaWYgd2UgcHJlc2V0IHBhZ2luYXRpb24gcGFnZSBudW1iZXIgaXQgd2lsbCBiZSBzaG93biBjb3JyZWN0bHlcbiAgICAgIHRoaXMuc2hvd1BhZ2luYXRpb24gPSAodGhpcy5ncmlkT3B0aW9ucyAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uIHx8ICh0aGlzLmdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkKSkpID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbiAmJiB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xuICAgICAgICBjb25zdCBwYWdpbmF0aW9uT3B0aW9ucyA9IHRoaXMuc2V0UGFnaW5hdGlvbk9wdGlvbnNXaGVuUHJlc2V0RGVmaW5lZCh0aGlzLmdyaWRPcHRpb25zLCB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyBhcyBQYWdpbmF0aW9uKTtcbiAgICAgICAgLy8gd2hlbiB3ZSBoYXZlIGEgdG90YWxDb3VudCB1c2UgaXQsIGVsc2Ugd2UnbGwgdGFrZSBpdCBmcm9tIHRoZSBwYWdpbmF0aW9uIG9iamVjdFxuICAgICAgICAvLyBvbmx5IHVwZGF0ZSB0aGUgdG90YWwgaXRlbXMgaWYgaXQncyBkaWZmZXJlbnQgdG8gYXZvaWQgcmVmcmVzaGluZyB0aGUgVUlcbiAgICAgICAgY29uc3QgdG90YWxSZWNvcmRzID0gKHRvdGFsQ291bnQgIT09IHVuZGVmaW5lZCkgPyB0b3RhbENvdW50IDogKHRoaXMuZ3JpZE9wdGlvbnM/LnBhZ2luYXRpb24/LnRvdGFsSXRlbXMpO1xuICAgICAgICBpZiAodG90YWxSZWNvcmRzICE9PSB1bmRlZmluZWQgJiYgdG90YWxSZWNvcmRzICE9PSB0aGlzLnRvdGFsSXRlbXMpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSArdG90YWxSZWNvcmRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlIHdpdGggbmV3IHBhZ2luYXRpb24gb3B0aW9ucyAod2hpY2ggbWlnaHQgaGF2ZSBwcmVzZXRzKVxuICAgICAgICBpZiAoIXRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcGFnaW5hdGlvbiBzZXJ2aWNlIHdpdGggdGhlIG5ldyB0b3RhbFxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlVG90YWxJdGVtcyh0aGlzLnRvdGFsSXRlbXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHJlc2l6ZSB0aGUgZ3JpZCBpbnNpZGUgYSBzbGlnaHQgdGltZW91dCwgaW4gY2FzZSBvdGhlciBET00gZWxlbWVudCBjaGFuZ2VkIHByaW9yIHRvIHRoZSByZXNpemUgKGxpa2UgYSBmaWx0ZXIvcGFnaW5hdGlvbiBjaGFuZ2VkKVxuICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZSkge1xuICAgICAgICBjb25zdCBkZWxheSA9IHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1Jlc2l6ZSAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9SZXNpemUuZGVsYXk7XG4gICAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZChkZWxheSB8fCAxMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlJ3MgYW55IFBhZ2luYXRpb24gUHJlc2V0cyBkZWZpbmVkIGluIHRoZSBHcmlkIE9wdGlvbnMsXG4gICAqIGlmIHRoZXJlIGFyZSB0aGVuIGxvYWQgdGhlbSBpbiB0aGUgcGFnaW5hdGlvbk9wdGlvbnMgb2JqZWN0XG4gICAqL1xuICBzZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uLCBwYWdpbmF0aW9uT3B0aW9uczogUGFnaW5hdGlvbik6IFBhZ2luYXRpb24ge1xuICAgIGlmIChncmlkT3B0aW9ucy5wcmVzZXRzPy5wYWdpbmF0aW9uICYmIHBhZ2luYXRpb25PcHRpb25zICYmICF0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCkge1xuICAgICAgcGFnaW5hdGlvbk9wdGlvbnMucGFnZVNpemUgPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24ucGFnZVNpemU7XG4gICAgICBwYWdpbmF0aW9uT3B0aW9ucy5wYWdlTnVtYmVyID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uLnBhZ2VOdW1iZXI7XG4gICAgfVxuICAgIHJldHVybiBwYWdpbmF0aW9uT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEeW5hbWljYWxseSBjaGFuZ2Ugb3IgdXBkYXRlIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgbGlzdC5cbiAgICogV2Ugd2lsbCByZS1yZW5kZXIgdGhlIGdyaWQgc28gdGhhdCB0aGUgbmV3IGhlYWRlciBhbmQgZGF0YSBzaG93cyB1cCBjb3JyZWN0bHkuXG4gICAqIElmIHVzaW5nIGkxOG4sIHdlIGFsc28gbmVlZCB0byB0cmlnZ2VyIGEgcmUtdHJhbnNsYXRlIG9mIHRoZSBjb2x1bW4gaGVhZGVyc1xuICAgKi9cbiAgdXBkYXRlQ29sdW1uRGVmaW5pdGlvbnNMaXN0KG5ld0NvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xuICAgIC8vIG1hcC9zd2FwIHRoZSBpbnRlcm5hbCBsaWJyYXJ5IEVkaXRvciB0byB0aGUgU2xpY2tHcmlkIEVkaXRvciBmYWN0b3J5XG4gICAgbmV3Q29sdW1uRGVmaW5pdGlvbnMgPSB0aGlzLnN3YXBJbnRlcm5hbEVkaXRvclRvU2xpY2tHcmlkRmFjdG9yeUVkaXRvcihuZXdDb2x1bW5EZWZpbml0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5IZWFkZXJzKGZhbHNlLCBuZXdDb2x1bW5EZWZpbml0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZW5kZXJDb2x1bW5IZWFkZXJzKG5ld0NvbHVtbkRlZmluaXRpb25zLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlQXV0b1NpemVDb2x1bW5zKSB7XG4gICAgICB0aGlzLnNsaWNrR3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCAmJiB0aGlzLnJlc2l6ZXJTZXJ2aWNlPy5yZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCkge1xuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBmaWx0ZXIgcm93IGRpc3BsYXllZCBvbiBmaXJzdCByb3csIHdlIGNhbiBvcHRpb25hbGx5IHBhc3MgZmFsc2UgdG8gaGlkZSBpdC5cbiAgICogQHBhcmFtIHNob3dpbmdcbiAgICovXG4gIHNob3dIZWFkZXJSb3coc2hvd2luZyA9IHRydWUpIHtcbiAgICB0aGlzLnNsaWNrR3JpZC5zZXRIZWFkZXJSb3dWaXNpYmlsaXR5KHNob3dpbmcsIGZhbHNlKTtcbiAgICBpZiAoc2hvd2luZyA9PT0gdHJ1ZSAmJiB0aGlzLl9pc0dyaWRJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5zbGlja0dyaWQuc2V0Q29sdW1ucyh0aGlzLmNvbHVtbkRlZmluaXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHNob3dpbmc7XG4gIH1cblxuICAvL1xuICAvLyBwcm90ZWN0ZWQgZnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBMb29wIHRocm91Z2ggYWxsIGNvbHVtbiBkZWZpbml0aW9ucyBhbmQgY29weSB0aGUgb3JpZ2luYWwgb3B0aW9uYWwgYHdpZHRoYCBwcm9wZXJ0aWVzIG9wdGlvbmFsbHkgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAqIFdlIHdpbGwgdXNlIHRoaXMgd2hlbiBkb2luZyBhIHJlc2l6ZSBieSBjZWxsIGNvbnRlbnQsIGlmIHVzZXIgcHJvdmlkZWQgYSBgd2lkdGhgIGl0IHdvbid0IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvcHlDb2x1bW5XaWR0aHNSZWZlcmVuY2UoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XG4gICAgY29sdW1uRGVmaW5pdGlvbnMuZm9yRWFjaChjb2wgPT4gY29sLm9yaWdpbmFsV2lkdGggPSBjb2wud2lkdGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc3BsYXlFbXB0eURhdGFXYXJuaW5nKHNob3dXYXJuaW5nID0gdHJ1ZSkge1xuICAgIHRoaXMuc2xpY2tFbXB0eVdhcm5pbmc/LnNob3dFbXB0eURhdGFNZXNzYWdlKHNob3dXYXJuaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kRGlmZmVyZW50SG9va3MoZ3JpZDogU2xpY2tHcmlkLCBncmlkT3B0aW9uczogR3JpZE9wdGlvbiwgZGF0YVZpZXc6IFNsaWNrRGF0YVZpZXcpIHtcbiAgICAvLyBvbiBsb2NhbGUgY2hhbmdlLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHRyYW5zbGF0ZSB0aGUgSGVhZGVycywgR3JpZE1lbnVcbiAgICBpZiAodGhpcy50cmFuc2xhdGU/Lm9uTGFuZ0NoYW5nZSkge1xuICAgICAgLy8gdHJhbnNsYXRlIHNvbWUgb2YgdGhlbSBvbiBmaXJzdCBsb2FkLCB0aGVuIG9uIGVhY2ggbGFuZ3VhZ2UgY2hhbmdlXG4gICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVBbGxFeHRlbnNpb25zKCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyBwdWJsaXNoIGV2ZW50IG9mIHRoZSBzYW1lIG5hbWUgdGhhdCBTbGlja2dyaWQtVW5pdmVyc2FsIHVzZXMgb24gYSBsYW5ndWFnZSBjaGFuZ2UgZXZlbnRcbiAgICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25MYW5ndWFnZUNoYW5nZScpO1xuXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUFsbEV4dGVuc2lvbnMoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpO1xuICAgICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmNyZWF0ZVByZUhlYWRlclBhbmVsICYmICFncmlkT3B0aW9ucy5lbmFibGVEcmFnZ2FibGVHcm91cGluZykge1xuICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nU2VydmljZS50cmFuc2xhdGVHcm91cGluZ0FuZENvbFNwYW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGlmIHVzZXIgc2V0IGFuIG9uSW5pdCBCYWNrZW5kLCB3ZSdsbCBydW4gaXQgcmlnaHQgYXdheSAoYW5kIGlmIHNvLCB3ZSBhbHNvIG5lZWQgdG8gcnVuIHByZVByb2Nlc3MsIGludGVybmFsUG9zdFByb2Nlc3MgJiBwb3N0UHJvY2VzcylcbiAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpIHtcbiAgICAgIGNvbnN0IGJhY2tlbmRBcGkgPSBncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaTtcblxuICAgICAgaWYgKGJhY2tlbmRBcGk/LnNlcnZpY2U/LmluaXQpIHtcbiAgICAgICAgYmFja2VuZEFwaS5zZXJ2aWNlLmluaXQoYmFja2VuZEFwaS5vcHRpb25zLCBncmlkT3B0aW9ucy5wYWdpbmF0aW9uLCB0aGlzLnNsaWNrR3JpZCwgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGF0YVZpZXcgJiYgZ3JpZCkge1xuICAgICAgY29uc3Qgc2xpY2tncmlkRXZlbnRQcmVmaXggPSB0aGlzLmdyaWRPcHRpb25zPy5kZWZhdWx0U2xpY2tncmlkRXZlbnRQcmVmaXggPz8gJyc7XG5cbiAgICAgIC8vIGV4cG9zZSBhbGwgU2xpY2sgR3JpZCBFdmVudHMgdGhyb3VnaCBkaXNwYXRjaFxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGdyaWQpIHtcbiAgICAgICAgaWYgKGdyaWQuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcC5zdGFydHNXaXRoKCdvbicpKSB7XG4gICAgICAgICAgY29uc3QgZ3JpZEV2ZW50TmFtZSA9IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5nZXRFdmVudE5hbWVCeU5hbWluZ0NvbnZlbnRpb24ocHJvcCwgc2xpY2tncmlkRXZlbnRQcmVmaXgpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoKGdyaWQgYXMgYW55KVtwcm9wXSwgKGV2ZW50LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZ3JpZEV2ZW50TmFtZSwgeyBldmVudERhdGE6IGV2ZW50LCBhcmdzIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cG9zZSBhbGwgU2xpY2sgRGF0YVZpZXcgRXZlbnRzIHRocm91Z2ggZGlzcGF0Y2hcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkYXRhVmlldykge1xuICAgICAgICBpZiAoZGF0YVZpZXcuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcC5zdGFydHNXaXRoKCdvbicpKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZSgoZGF0YVZpZXcgYXMgYW55KVtwcm9wXSwgKGV2ZW50LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhVmlld0V2ZW50TmFtZSA9IHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5nZXRFdmVudE5hbWVCeU5hbWluZ0NvbnZlbnRpb24ocHJvcCwgc2xpY2tncmlkRXZlbnRQcmVmaXgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5kaXNwYXRjaEN1c3RvbUV2ZW50KGRhdGFWaWV3RXZlbnROYW1lLCB7IGV2ZW50RGF0YTogZXZlbnQsIGFyZ3MgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb24gY2VsbCBjbGljaywgbWFpbmx5IHVzZWQgd2l0aCB0aGUgY29sdW1uRGVmLmFjdGlvbiBjYWxsYmFja1xuICAgICAgdGhpcy5ncmlkRXZlbnRTZXJ2aWNlLmJpbmRPbkNlbGxDaGFuZ2UoZ3JpZCk7XG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UuYmluZE9uQ2xpY2soZ3JpZCk7XG5cbiAgICAgIGlmIChkYXRhVmlldyAmJiBncmlkKSB7XG4gICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgc29ydGluZyAoYmFja2VuZCkgd2hlbiBhdmFpbGFibGUgb3IgZGVmYXVsdCBvblNvcnQgKGRhdGFWaWV3KVxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlU29ydGluZykge1xuICAgICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgc29ydGluZyAoYmFja2VuZCkgdW5sZXNzIHNwZWNpZmllZCB0byB1c2UgdGhlIGxvY2FsIG9uZVxuICAgICAgICAgIGlmIChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkudXNlTG9jYWxTb3J0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmJpbmRCYWNrZW5kT25Tb3J0KGdyaWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmJpbmRMb2NhbE9uU29ydChncmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiaW5kIGV4dGVybmFsIGZpbHRlciAoYmFja2VuZCkgd2hlbiBhdmFpbGFibGUgb3IgZGVmYXVsdCBvbkZpbHRlciAoZGF0YVZpZXcpXG4gICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcpIHtcbiAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuaW5pdChncmlkKTtcblxuICAgICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgZmlsdGVyIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICFncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaS51c2VMb2NhbEZpbHRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmJpbmRCYWNrZW5kT25GaWx0ZXIoZ3JpZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5iaW5kTG9jYWxPbkZpbHRlcihncmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIGNvbHVtbiBhcmUgcmVvcmRlcmVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdmlzaWJsZUNvbHVtbiBhcnJheVxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGdyaWQub25Db2x1bW5zUmVvcmRlcmVkLCAoX2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFzQ29sdW1uc1Jlb3JkZXJlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gYXJncy5pbXBhY3RlZENvbHVtbnM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGxvYWQgYW55IHByZXNldHMgaWYgYW55IChhZnRlciBkYXRhc2V0IGlzIGluaXRpYWxpemVkKVxuICAgICAgICB0aGlzLmxvYWRDb2x1bW5QcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xuICAgICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xuXG4gICAgICAgIC8vIFdoZW4gZGF0YSBjaGFuZ2VzIGluIHRoZSBEYXRhVmlldywgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBtZXRyaWNzIGFuZC9vciBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgZGF0YXNldCBpcyBlbXB0eVxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGRhdGFWaWV3Lm9uUm93Q291bnRDaGFuZ2VkLCAoKSA9PiB7XG4gICAgICAgICAgZ3JpZC5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB8fCAwLCBkYXRhVmlldy5nZXRJdGVtQ291bnQoKSB8fCAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZGF0YVZpZXcub25TZXRJdGVtc0NhbGxlZCwgKF9lLCBhcmdzKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkl0ZW1Db3VudENoYW5nZWQoZGF0YVZpZXcuZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB8fCAwLCBhcmdzLml0ZW1Db3VudCk7XG5cbiAgICAgICAgICAvLyB3aGVuIHVzZXIgaGFzIHJlc2l6ZSBieSBjb250ZW50IGVuYWJsZWQsIHdlJ2xsIGZvcmNlIGEgZnVsbCB3aWR0aCBjYWxjdWxhdGlvbiBzaW5jZSB3ZSBjaGFuZ2Ugb3VyIGVudGlyZSBkYXRhc2V0XG4gICAgICAgICAgaWYgKGFyZ3MuaXRlbUNvdW50ID4gMCAmJiAodGhpcy5ncmlkT3B0aW9ucy5hdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWQgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KCF0aGlzLmdyaWRPcHRpb25zPy5yZXNpemVCeUNvbnRlbnRPbmx5T25GaXJzdExvYWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGdyaWRPcHRpb25zPy5lbmFibGVGaWx0ZXJpbmcgJiYgIWdyaWRPcHRpb25zLmVuYWJsZVJvd0RldGFpbFZpZXcpIHtcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKGRhdGFWaWV3Lm9uUm93c0NoYW5nZWQsIChfZSwgYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gZmlsdGVyaW5nIGRhdGEgd2l0aCBsb2NhbCBkYXRhc2V0IHdpbGwgbm90IGFsd2F5cyBzaG93IGNvcnJlY3RseSB1bmxlc3Mgd2UgY2FsbCB0aGlzIHVwZGF0ZVJvdy9yZW5kZXJcbiAgICAgICAgICAgIC8vIGFsc28gZG9uJ3QgdXNlIFwiaW52YWxpZGF0ZVJvd3NcIiBzaW5jZSBpdCBkZXN0cm95cyB0aGUgZW50aXJlIHJvdyBhbmQgYXMgYmFkIHVzZXIgZXhwZXJpZW5jZSB3aGVuIHVwZGF0aW5nIGEgcm93XG4gICAgICAgICAgICAvLyBzZWUgY29tbWl0OiBodHRwczovL2dpdGh1Yi5jb20vZ2hpc2NvZGluZy9hdXJlbGlhLXNsaWNrZ3JpZC9jb21taXQvOGM1MDNhNGQ0NWZiYTExY2JkOGQ4Y2M0NjdmYWU4ZDE3N2NjNGY2MFxuICAgICAgICAgICAgaWYgKGFyZ3M/LnJvd3MgJiYgQXJyYXkuaXNBcnJheShhcmdzLnJvd3MpKSB7XG4gICAgICAgICAgICAgIGFyZ3Mucm93cy5mb3JFYWNoKChyb3c6IG51bWJlcikgPT4gZ3JpZC51cGRhdGVSb3cocm93KSk7XG4gICAgICAgICAgICAgIGdyaWQucmVuZGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkaWQgdGhlIHVzZXIgYWRkIGEgY29sc3BhbiBjYWxsYmFjaz8gSWYgc28sIGhvb2sgaXQgaW50byB0aGUgRGF0YVZpZXcgZ2V0SXRlbU1ldGFkYXRhXG4gICAgaWYgKGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjayAmJiBkYXRhVmlldyAmJiBkYXRhVmlldy5nZXRJdGVtICYmIGRhdGFWaWV3LmdldEl0ZW1NZXRhZGF0YSkge1xuICAgICAgZGF0YVZpZXcuZ2V0SXRlbU1ldGFkYXRhID0gKHJvd051bWJlcjogbnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCBjYWxsYmFja1Jlc3VsdCA9IG51bGw7XG4gICAgICAgIGlmIChncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2sgJiYgZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2soZGF0YVZpZXcuZ2V0SXRlbShyb3dOdW1iZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2tSZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kQmFja2VuZENhbGxiYWNrRnVuY3Rpb25zKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XG4gICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xuICAgIGNvbnN0IGJhY2tlbmRBcGlTZXJ2aWNlID0gYmFja2VuZEFwaSAmJiBiYWNrZW5kQXBpLnNlcnZpY2U7XG4gICAgY29uc3Qgc2VydmljZU9wdGlvbnM6IEJhY2tlbmRTZXJ2aWNlT3B0aW9uID0gYmFja2VuZEFwaVNlcnZpY2U/Lm9wdGlvbnMgPz8ge307XG4gICAgY29uc3QgaXNFeGVjdXRlQ29tbWFuZE9uSW5pdCA9ICghc2VydmljZU9wdGlvbnMpID8gZmFsc2UgOiAoKHNlcnZpY2VPcHRpb25zICYmIHNlcnZpY2VPcHRpb25zLmhhc093blByb3BlcnR5KCdleGVjdXRlUHJvY2Vzc0NvbW1hbmRPbkluaXQnKSkgPyBzZXJ2aWNlT3B0aW9uc1snZXhlY3V0ZVByb2Nlc3NDb21tYW5kT25Jbml0J10gOiB0cnVlKTtcblxuICAgIGlmIChiYWNrZW5kQXBpU2VydmljZSkge1xuICAgICAgLy8gdXBkYXRlIGJhY2tlbmQgZmlsdGVycyAoaWYgbmVlZCBiZSkgQkVGT1JFIHRoZSBxdWVyeSBydW5zICh2aWEgdGhlIG9uSW5pdCBjb21tYW5kIGEgZmV3IGxpbmVzIGJlbG93KVxuICAgICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgYW55IFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIGdyaWRcbiAgICAgIGlmIChncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5wcmVzZXRzKSB7XG4gICAgICAgIC8vIEZpbHRlcnMgXCJwcmVzZXRzXCJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMpICYmIGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyhncmlkT3B0aW9ucy5wcmVzZXRzLmZpbHRlcnMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRlcnMgXCJwcmVzZXRzXCJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVNvcnRlcnMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMpICYmIGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gd2hlbiB1c2luZyBtdWx0aS1jb2x1bW4gc29ydCwgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYnV0IG9uIHNpbmdsZSBzb3J0IHRoZW4gb25seSBncmFiIHRoZSBmaXJzdCBzb3J0IHByb3ZpZGVkXG4gICAgICAgICAgY29uc3Qgc29ydENvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLm11bHRpQ29sdW1uU29ydCA/IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycyA6IGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycy5zbGljZSgwLCAxKTtcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVTb3J0ZXJzKHVuZGVmaW5lZCwgc29ydENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhZ2luYXRpb24gXCJwcmVzZXRzXCJcbiAgICAgICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb24gJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9ID0gZ3JpZE9wdGlvbnMucHJlc2V0cy5wYWdpbmF0aW9uO1xuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb24ocGFnZU51bWJlciwgcGFnZVNpemUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW5GaWx0ZXJzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldENvbHVtbkZpbHRlcnMoKTtcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcnMgJiYgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycykge1xuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZUZpbHRlcnMoY29sdW1uRmlsdGVycywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGV4ZWN1dGUgb25Jbml0IGNvbW1hbmQgd2hlbiBuZWNlc3NhcnlcbiAgICAgIGlmIChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIChiYWNrZW5kQXBpLm9uSW5pdCB8fCBpc0V4ZWN1dGVDb21tYW5kT25Jbml0KSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9ICh0eXBlb2YgYmFja2VuZEFwaVNlcnZpY2UuYnVpbGRRdWVyeSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5idWlsZFF1ZXJ5KCkgOiAnJztcbiAgICAgICAgY29uc3QgcHJvY2VzcyA9IChpc0V4ZWN1dGVDb21tYW5kT25Jbml0KSA/IChiYWNrZW5kQXBpLnByb2Nlc3MgJiYgYmFja2VuZEFwaS5wcm9jZXNzKHF1ZXJ5KSB8fCBudWxsKSA6IChiYWNrZW5kQXBpLm9uSW5pdCAmJiBiYWNrZW5kQXBpLm9uSW5pdChxdWVyeSkgfHwgbnVsbCk7XG5cbiAgICAgICAgLy8gd3JhcCB0aGlzIGluc2lkZSBhIHNldFRpbWVvdXQgdG8gYXZvaWQgdGltaW5nIGlzc3VlIHNpbmNlIHRoZSBncmlkT3B0aW9ucyBuZWVkcyB0byBiZSByZWFkeSBiZWZvcmUgcnVubmluZyB0aGlzIG9uSW5pdFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBiYWNrZW5kVXRpbGl0eVNlcnZpY2UgPSB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZSBhcyBCYWNrZW5kVXRpbGl0eVNlcnZpY2U7XG5cbiAgICAgICAgICAvLyBrZWVwIHN0YXJ0IHRpbWUgJiBlbmQgdGltZXN0YW1wcyAmIHJldHVybiBpdCBhZnRlciBwcm9jZXNzIGV4ZWN1dGlvblxuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAvLyBydW4gYW55IHByZS1wcm9jZXNzLCBpZiBkZWZpbmVkLCBmb3IgZXhhbXBsZSBhIHNwaW5uZXJcbiAgICAgICAgICBpZiAoYmFja2VuZEFwaS5wcmVQcm9jZXNzKSB7XG4gICAgICAgICAgICBiYWNrZW5kQXBpLnByZVByb2Nlc3MoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB0aGUgcHJvY2Vzc2VzIGNhbiBiZSBhIFByb21pc2UgKGxpa2UgSHR0cClcbiAgICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbj8udG90YWxJdGVtcyA/PyAwO1xuICAgICAgICAgIGlmIChwcm9jZXNzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcHJvY2Vzc1xuICAgICAgICAgICAgICAudGhlbigocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2UuZXhlY3V0ZUJhY2tlbmRQcm9jZXNzZXNDYWxsYmFjayhzdGFydFRpbWUsIHByb2Nlc3NSZXN1bHQsIGJhY2tlbmRBcGksIHRvdGFsSXRlbXMpKVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2Uub25CYWNrZW5kRXJyb3IoZXJyb3IsIGJhY2tlbmRBcGkpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MgJiYgdGhpcy5yeGpzPy5pc09ic2VydmFibGUocHJvY2VzcykpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAocHJvY2VzcyBhcyBPYnNlcnZhYmxlPGFueT4pLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKHByb2Nlc3NSZXN1bHQ6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLmV4ZWN1dGVCYWNrZW5kUHJvY2Vzc2VzQ2FsbGJhY2soc3RhcnRUaW1lLCBwcm9jZXNzUmVzdWx0LCBiYWNrZW5kQXBpLCB0b3RhbEl0ZW1zKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5vbkJhY2tlbmRFcnJvcihlcnJvciwgYmFja2VuZEFwaSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYmluZFJlc2l6ZUhvb2soZ3JpZDogU2xpY2tHcmlkLCBvcHRpb25zOiBHcmlkT3B0aW9uKSB7XG4gICAgaWYgKChvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5hdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWQpIHx8IChvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucyAmJiBvcHRpb25zLmVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0FuZ3VsYXItU2xpY2tncmlkXSBZb3UgY2Fubm90IGVuYWJsZSBib3RoIGF1dG9zaXplL2ZpdCB2aWV3cG9ydCAmIHJlc2l6ZSBieSBjb250ZW50LCB5b3UgbXVzdCBjaG9vc2Ugd2hpY2ggcmVzaXplIHRlY2huaXF1ZSB0byB1c2UuIFlvdSBjYW4gZW5hYmxlIHRoZXNlIDIgb3B0aW9ucyAoXCJhdXRvRml0Q29sdW1uc09uRmlyc3RMb2FkXCIgYW5kIFwiZW5hYmxlQXV0b1NpemVDb2x1bW5zXCIpIE9SIHRoZXNlIG90aGVyIDIgb3B0aW9ucyAoXCJhdXRvc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50T25GaXJzdExvYWRcIiBhbmQgXCJlbmFibGVBdXRvUmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRcIikuYCk7XG4gICAgfVxuXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcbiAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcbiAgICAgIGdyaWQuYXV0b3NpemVDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gYXV0by1yZXNpemUgZ3JpZCBvbiBicm93c2VyIHJlc2l6ZVxuICAgIGlmIChvcHRpb25zLmdyaWRIZWlnaHQgfHwgb3B0aW9ucy5ncmlkV2lkdGgpIHtcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgwLCB7IGhlaWdodDogb3B0aW9ucy5ncmlkSGVpZ2h0LCB3aWR0aDogb3B0aW9ucy5ncmlkV2lkdGggfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplR3JpZCgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lbmFibGVBdXRvUmVzaXplKSB7XG4gICAgICBpZiAoZ3JpZCAmJiBvcHRpb25zLmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgb3B0aW9ucy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcbiAgICAgICAgZ3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZXhlY3V0ZUFmdGVyRGF0YXZpZXdDcmVhdGVkKF9ncmlkOiBTbGlja0dyaWQsIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKSB7XG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgU29ydCBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBET01cbiAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlU29ydGluZykge1xuICAgICAgaWYgKGdyaWRPcHRpb25zLnByZXNldHMgJiYgQXJyYXkuaXNBcnJheShncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMpKSB7XG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbXVsdGktY29sdW1uIHNvcnQsIHdlIGNhbiBoYXZlIG11bHRpcGxlIGJ1dCBvbiBzaW5nbGUgc29ydCB0aGVuIG9ubHkgZ3JhYiB0aGUgZmlyc3Qgc29ydCBwcm92aWRlZFxuICAgICAgICBjb25zdCBzb3J0Q29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMubXVsdGlDb2x1bW5Tb3J0ID8gZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzIDogZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLnNsaWNlKDAsIDEpO1xuICAgICAgICB0aGlzLnNvcnRTZXJ2aWNlLmxvYWRHcmlkU29ydGVycyhzb3J0Q29sdW1ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZW4gZGF0YSBjaGFuZ2VzIGluIHRoZSBEYXRhVmlldywgd2UnbGwgcmVmcmVzaCB0aGUgbWV0cmljcyBhbmQvb3IgZGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlIGRhdGFzZXQgaXMgZW1wdHkgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZU9uSXRlbUNvdW50Q2hhbmdlZChjdXJyZW50UGFnZVJvd0l0ZW1Db3VudDogbnVtYmVyLCB0b3RhbEl0ZW1Db3VudDogbnVtYmVyKSB7XG4gICAgdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGggPSB0b3RhbEl0ZW1Db3VudDtcbiAgICB0aGlzLm1ldHJpY3MgPSB7XG4gICAgICBzdGFydFRpbWU6IG5ldyBEYXRlKCksXG4gICAgICBlbmRUaW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgaXRlbUNvdW50OiBjdXJyZW50UGFnZVJvd0l0ZW1Db3VudCxcbiAgICAgIHRvdGFsSXRlbUNvdW50XG4gICAgfTtcbiAgICAvLyBpZiBjdXN0b20gZm9vdGVyIGlzIGVuYWJsZWQsIHRoZW4gd2UnbGwgdXBkYXRlIGl0cyBtZXRyaWNzXG4gICAgaWYgKHRoaXMuc2xpY2tGb290ZXIpIHtcbiAgICAgIHRoaXMuc2xpY2tGb290ZXIubWV0cmljcyA9IHRoaXMubWV0cmljcztcbiAgICB9XG5cbiAgICAvLyB3aGVuIHVzaW5nIGxvY2FsIChpbi1tZW1vcnkpIGRhdGFzZXQsIHdlJ2xsIGRpc3BsYXkgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBmaWx0ZXJlZCBkYXRhIGlzIGVtcHR5XG4gICAgaWYgKHRoaXMuX2lzTG9jYWxHcmlkICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZUVtcHR5RGF0YVdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICB0aGlzLmRpc3BsYXlFbXB0eURhdGFXYXJuaW5nKGN1cnJlbnRQYWdlUm93SXRlbUNvdW50ID09PSAwKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZVBhZ2luYXRpb25TZXJ2aWNlKHBhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uKSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMpIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEgPSB7XG4gICAgICAgIGdyaWRPcHRpb25zOiB0aGlzLmdyaWRPcHRpb25zLFxuICAgICAgICBwYWdpbmF0aW9uU2VydmljZTogdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcbiAgICAgIH07XG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnRvdGFsSXRlbXMgPSB0aGlzLnRvdGFsSXRlbXM7XG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmluaXQodGhpcy5zbGlja0dyaWQsIHBhZ2luYXRpb25PcHRpb25zLCB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlKCdvblBhZ2luYXRpb25DaGFuZ2VkJywgKHBhZ2luYXRpb25DaGFuZ2VzOiBTZXJ2aWNlUGFnaW5hdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZWQocGFnaW5hdGlvbkNoYW5nZXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnN1YnNjcmliZSgnb25QYWdpbmF0aW9uVmlzaWJpbGl0eUNoYW5nZWQnLCAodmlzaWJpbGl0eTogeyB2aXNpYmxlOiBib29sZWFuOyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9IHZpc2liaWxpdHk/LnZpc2libGUgPz8gZmFsc2U7XG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZT8ucmVmcmVzaEJhY2tlbmREYXRhc2V0KHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbmRlclBhZ2luYXRpb24odGhpcy5zaG93UGFnaW5hdGlvbik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgLy8gYWxzbyBpbml0aWFsaXplIChyZW5kZXIpIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudFxuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gICAgICB0aGlzLl9pc1BhZ2luYXRpb25Jbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIExvYWQgdGhlIEVkaXRvciBDb2xsZWN0aW9uIGFzeW5jaHJvbm91c2x5IGFuZCByZXBsYWNlIHRoZSBcImNvbGxlY3Rpb25cIiBwcm9wZXJ0eSB3aGVuIE9ic2VydmFibGUgcmVzb2x2ZXMgKi9cbiAgcHJvdGVjdGVkIGxvYWRFZGl0b3JDb2xsZWN0aW9uQXN5bmMoY29sdW1uOiBDb2x1bW4pIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uQXN5bmMgPSBjb2x1bW4gJiYgY29sdW1uLmVkaXRvciAmJiAoY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3IpLmNvbGxlY3Rpb25Bc3luYztcbiAgICBpZiAoY29sbGVjdGlvbkFzeW5jIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbGxlY3Rpb25Bc3luYy5zdWJzY3JpYmUoKHJlc29sdmVkQ29sbGVjdGlvbikgPT4gdGhpcy51cGRhdGVFZGl0b3JDb2xsZWN0aW9uKGNvbHVtbiwgcmVzb2x2ZWRDb2xsZWN0aW9uKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uQXN5bmMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAvLyB3YWl0IGZvciB0aGUgXCJjb2xsZWN0aW9uQXN5bmNcIiwgb25jZSByZXNvbHZlZCB3ZSB3aWxsIHNhdmUgaXQgaW50byB0aGUgXCJjb2xsZWN0aW9uXCJcbiAgICAgIC8vIHRoZSBjb2xsZWN0aW9uQXN5bmMgY2FuIGJlIG9mIDMgdHlwZXMgSHR0cENsaWVudCwgSHR0cEZldGNoIG9yIGEgUHJvbWlzZVxuICAgICAgY29sbGVjdGlvbkFzeW5jLnRoZW4oKHJlc3BvbnNlOiBhbnkgfCBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUVkaXRvckNvbGxlY3Rpb24oY29sdW1uLCByZXNwb25zZSk7IC8vIGZyb20gUHJvbWlzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5zZXJ0RHluYW1pY1ByZXNldENvbHVtbnMoY29sdW1uSWQ6IHN0cmluZywgZ3JpZFByZXNldENvbHVtbnM6IENvbHVtbltdKSB7XG4gICAgaWYgKHRoaXMuX2NvbHVtbkRlZmluaXRpb25zKSB7XG4gICAgICBjb25zdCBjb2x1bW5Qb3NpdGlvbiA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLmZpbmRJbmRleChjID0+IGMuaWQgPT09IGNvbHVtbklkKTtcbiAgICAgIGlmIChjb2x1bW5Qb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgIGNvbnN0IGR5bkNvbHVtbiA9IHRoaXMuX2NvbHVtbkRlZmluaXRpb25zW2NvbHVtblBvc2l0aW9uXTtcbiAgICAgICAgaWYgKGR5bkNvbHVtbj8uaWQgPT09IGNvbHVtbklkICYmICFncmlkUHJlc2V0Q29sdW1ucy5zb21lKGMgPT4gYy5pZCA9PT0gY29sdW1uSWQpKSB7XG4gICAgICAgICAgY29sdW1uUG9zaXRpb24gPiAwXG4gICAgICAgICAgICA/IGdyaWRQcmVzZXRDb2x1bW5zLnNwbGljZShjb2x1bW5Qb3NpdGlvbiwgMCwgZHluQ29sdW1uKVxuICAgICAgICAgICAgOiBncmlkUHJlc2V0Q29sdW1ucy51bnNoaWZ0KGR5bkNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogTG9hZCBhbnkgcG9zc2libGUgQ29sdW1ucyBHcmlkIFByZXNldHMgKi9cbiAgcHJvdGVjdGVkIGxvYWRDb2x1bW5QcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpIHtcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBDb2x1bW5zIFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIGdyaWRcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzICYmIEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMpICYmIHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdyaWRQcmVzZXRDb2x1bW5zOiBDb2x1bW5bXSA9IHRoaXMuZ3JpZFN0YXRlU2VydmljZS5nZXRBc3NvY2lhdGVkR3JpZENvbHVtbnModGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5jb2x1bW5zKTtcbiAgICAgIGlmIChncmlkUHJlc2V0Q29sdW1ucyAmJiBBcnJheS5pc0FycmF5KGdyaWRQcmVzZXRDb2x1bW5zKSAmJiBncmlkUHJlc2V0Q29sdW1ucy5sZW5ndGggPiAwICYmIEFycmF5LmlzQXJyYXkodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpKSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBkeW5hbWljIGNvbHVtbnMgYXJlIGluY2x1ZGVkIGluIHByZXNldHMgKDEuUm93IE1vdmUsIDIuIFJvdyBTZWxlY3Rpb24sIDMuIFJvdyBEZXRhaWwpXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd01vdmVNYW5hZ2VyKSB7XG4gICAgICAgICAgY29uc3Qgcm1tQ29sSWQgPSB0aGlzLmdyaWRPcHRpb25zPy5yb3dNb3ZlTWFuYWdlcj8uY29sdW1uSWQgPz8gJ19tb3ZlJztcbiAgICAgICAgICB0aGlzLmluc2VydER5bmFtaWNQcmVzZXRDb2x1bW5zKHJtbUNvbElkLCBncmlkUHJlc2V0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGNoa0NvbElkID0gdGhpcy5ncmlkT3B0aW9ucz8uY2hlY2tib3hTZWxlY3Rvcj8uY29sdW1uSWQgPz8gJ19jaGVja2JveF9zZWxlY3Rvcic7XG4gICAgICAgICAgdGhpcy5pbnNlcnREeW5hbWljUHJlc2V0Q29sdW1ucyhjaGtDb2xJZCwgZ3JpZFByZXNldENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd0RldGFpbFZpZXcpIHtcbiAgICAgICAgICBjb25zdCByZHZDb2xJZCA9IHRoaXMuZ3JpZE9wdGlvbnM/LnJvd0RldGFpbFZpZXc/LmNvbHVtbklkID8/ICdfZGV0YWlsX3NlbGVjdG9yJztcbiAgICAgICAgICB0aGlzLmluc2VydER5bmFtaWNQcmVzZXRDb2x1bW5zKHJkdkNvbElkLCBncmlkUHJlc2V0Q29sdW1ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBrZWVwIGNvcHkgdGhlIG9yaWdpbmFsIG9wdGlvbmFsIGB3aWR0aGAgcHJvcGVydGllcyBvcHRpb25hbGx5IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAgICAvLyBXZSB3aWxsIHVzZSB0aGlzIHdoZW4gZG9pbmcgYSByZXNpemUgYnkgY2VsbCBjb250ZW50LCBpZiB1c2VyIHByb3ZpZGVkIGEgYHdpZHRoYCBpdCB3b24ndCBvdmVycmlkZSBpdC5cbiAgICAgICAgZ3JpZFByZXNldENvbHVtbnMuZm9yRWFjaChjb2wgPT4gY29sLm9yaWdpbmFsV2lkdGggPSBjb2wud2lkdGgpO1xuXG4gICAgICAgIC8vIGZpbmFsbHkgc2V0IHRoZSBuZXcgcHJlc2V0cyBjb2x1bW5zIChpbmNsdWRpbmcgY2hlY2tib3ggc2VsZWN0b3IgaWYgbmVlZCBiZSlcbiAgICAgICAgdGhpcy5zbGlja0dyaWQuc2V0Q29sdW1ucyhncmlkUHJlc2V0Q29sdW1ucyk7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS52aXNpYmxlQ29sdW1ucyA9IGdyaWRQcmVzZXRDb2x1bW5zO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGFueSBwb3NzaWJsZSBGaWx0ZXJzIEdyaWQgUHJlc2V0cyAqL1xuICBwcm90ZWN0ZWQgbG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCkge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmICF0aGlzLmN1c3RvbURhdGFWaWV3KSB7XG4gICAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBGaWx0ZXIgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgRE9NXG4gICAgICAvLyBhbHNvIG5vdGUgdGhhdCBhIHByZXNldHMgb2YgVHJlZSBEYXRhIFRvZ2dsaW5nIHdpbGwgYWxzbyBjYWxsIHRoaXMgbWV0aG9kIGJlY2F1c2UgVHJlZSBEYXRhIHRvZ2dsaW5nIGRvZXMgd29yayB3aXRoIGRhdGEgZmlsdGVyaW5nXG4gICAgICAvLyAoY29sbGFwc2luZyBhIHBhcmVudCB3aWxsIGJhc2ljYWxseSB1c2UgRmlsdGVyIGZvciBoaWRkaW5nIChha2EgY29sbGFwc2luZykgYXdheSB0aGUgY2hpbGQgdW5kZXJuZWF0IGl0KVxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cyAmJiAoQXJyYXkuaXNBcnJheSh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycykgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmdyaWRPcHRpb25zLnByZXNldHM/LnRyZWVEYXRhPy50b2dnbGVkSXRlbXMpKSkge1xuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucG9wdWxhdGVDb2x1bW5GaWx0ZXJTZWFyY2hUZXJtUHJlc2V0cyh0aGlzLmdyaWRPcHRpb25zLnByZXNldHM/LmZpbHRlcnMgfHwgW10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBsb2NhbCBncmlkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgdGhlIFBhZ2luYXRpb25cbiAgICogaWYgc28gdGhlbiBhbHNvIGNoZWNrIGlmIHRoZXJlJ3MgYW55IHByZXNldHMgYW5kIGZpbmFsbHkgaW5pdGlhbGl6ZSB0aGUgUGFnaW5hdGlvblNlcnZpY2VcbiAgICogYSBsb2NhbCBncmlkIHdpdGggUGFnaW5hdGlvbiBwcmVzZXRzIHdpbGwgcG90ZW50aWFsbHkgaGF2ZSBhIGRpZmZlcmVudCB0b3RhbCBvZiBpdGVtcywgd2UnbGwgbmVlZCB0byBnZXQgaXQgZnJvbSB0aGUgRGF0YVZpZXcgYW5kIHVwZGF0ZSBvdXIgdG90YWxcbiAgICovXG4gIHByb3RlY3RlZCBsb2FkTG9jYWxHcmlkUGFnaW5hdGlvbihkYXRhc2V0PzogYW55W10pIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucykge1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gQXJyYXkuaXNBcnJheShkYXRhc2V0KSA/IGRhdGFzZXQubGVuZ3RoIDogMDtcbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLmRhdGFWaWV3Py5nZXRQYWdpbmdJbmZvKSB7XG4gICAgICAgIGNvbnN0IHNsaWNrUGFnaW5nSW5mbyA9IHRoaXMuZGF0YVZpZXcuZ2V0UGFnaW5nSW5mbygpO1xuICAgICAgICBpZiAoc2xpY2tQYWdpbmdJbmZvPy5oYXNPd25Qcm9wZXJ0eSgndG90YWxSb3dzJykgJiYgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMudG90YWxJdGVtcyAhPT0gc2xpY2tQYWdpbmdJbmZvLnRvdGFsUm93cykge1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHNsaWNrUGFnaW5nSW5mby50b3RhbFJvd3MgfHwgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMudG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcbiAgICAgIGNvbnN0IHBhZ2luYXRpb25PcHRpb25zID0gdGhpcy5zZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVBhZ2luYXRpb25TZXJ2aWNlKHBhZ2luYXRpb25PcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKiogTG9hZCBhbnkgUm93IFNlbGVjdGlvbnMgaW50byB0aGUgRGF0YVZpZXcgdGhhdCB3ZXJlIHByZXNldHMgYnkgdGhlIHVzZXIgKi9cbiAgcHJvdGVjdGVkIGxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCkge1xuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIFJvdyBTZWxlY3Rpb25zIFwicHJlc2V0c1wiXG4gICAgY29uc3QgcHJlc2V0cyA9IHRoaXMuZ3JpZE9wdGlvbnM/LnByZXNldHM7XG4gICAgY29uc3QgZW5hYmxlUm93U2VsZWN0aW9uID0gdGhpcy5ncmlkT3B0aW9ucyAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uKTtcbiAgICBpZiAoZW5hYmxlUm93U2VsZWN0aW9uICYmIHRoaXMuc2xpY2tHcmlkPy5nZXRTZWxlY3Rpb25Nb2RlbCgpICYmIHByZXNldHM/LnJvd1NlbGVjdGlvbiAmJiAoQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5ncmlkUm93SW5kZXhlcykgfHwgQXJyYXkuaXNBcnJheShwcmVzZXRzLnJvd1NlbGVjdGlvbi5kYXRhQ29udGV4dElkcykpKSB7XG4gICAgICBsZXQgZGF0YUNvbnRleHRJZHMgPSBwcmVzZXRzLnJvd1NlbGVjdGlvbi5kYXRhQ29udGV4dElkcztcbiAgICAgIGxldCBncmlkUm93SW5kZXhlcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmdyaWRSb3dJbmRleGVzO1xuXG4gICAgICAvLyBtYXBzIHRoZSBJRHMgdG8gdGhlIEdyaWQgUm93cyBhbmQgdmljZSB2ZXJzYSwgdGhlIFwiZGF0YUNvbnRleHRJZHNcIiBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBvdGhlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUNvbnRleHRJZHMpICYmIGRhdGFDb250ZXh0SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZ3JpZFJvd0luZGV4ZXMgPSB0aGlzLmRhdGFWaWV3Lm1hcElkc1RvUm93cyhkYXRhQ29udGV4dElkcykgfHwgW107XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZ3JpZFJvd0luZGV4ZXMpICYmIGdyaWRSb3dJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGF0YUNvbnRleHRJZHMgPSB0aGlzLmRhdGFWaWV3Lm1hcFJvd3NUb0lkcyhncmlkUm93SW5kZXhlcykgfHwgW107XG4gICAgICB9XG5cbiAgICAgIC8vIGFwcGx5IHJvdyBzZWxlY3Rpb24gd2hlbiBkZWZpbmVkIGFzIGdyaWQgcHJlc2V0c1xuICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIEFycmF5LmlzQXJyYXkoZ3JpZFJvd0luZGV4ZXMpKSB7XG4gICAgICAgIHRoaXMuc2xpY2tHcmlkLnNldFNlbGVjdGVkUm93cyhncmlkUm93SW5kZXhlcyk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXchLnNldFNlbGVjdGVkSWRzKGRhdGFDb250ZXh0SWRzIHx8IFtdLCB7XG4gICAgICAgICAgaXNSb3dCZWluZ0FkZGVkOiB0cnVlLFxuICAgICAgICAgIHNob3VsZFRyaWdnZXJFdmVudDogZmFsc2UsIC8vIGRvIG5vdCB0cmlnZ2VyIHdoZW4gcHJlc2V0dGluZyB0aGUgZ3JpZFxuICAgICAgICAgIGFwcGx5Um93U2VsZWN0aW9uVG9HcmlkOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uKTogR3JpZE9wdGlvbiB7XG4gICAgZ3JpZE9wdGlvbnMuZ3JpZElkID0gdGhpcy5ncmlkSWQ7XG4gICAgZ3JpZE9wdGlvbnMuZ3JpZENvbnRhaW5lcklkID0gYHNsaWNrR3JpZENvbnRhaW5lci0ke3RoaXMuZ3JpZElkfWA7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGEgYmFja2VuZFNlcnZpY2VBcGkgYW5kIHRoZSBlbmFibGVQYWdpbmF0aW9uIGlzIHVuZGVmaW5lZCwgd2UnbGwgYXNzdW1lIHRoYXQgd2UgZG8gd2FudCB0byBzZWUgaXQsIGVsc2UgZ2V0IHRoYXQgZGVmaW5lZCB2YWx1ZVxuICAgIGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gPSAoKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmIGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbikgfHwgZmFsc2U7XG5cbiAgICAvLyB1c2UgZXh0ZW5kIHRvIGRlZXAgbWVyZ2UgJiBjb3B5IHRvIGF2b2lkIGltbXV0YWJsZSBwcm9wZXJ0aWVzIGJlaW5nIGNoYW5nZWQgaW4gR2xvYmFsR3JpZE9wdGlvbnMgYWZ0ZXIgYSByb3V0ZSBjaGFuZ2VcbiAgICBjb25zdCBvcHRpb25zID0gU2xpY2suVXRpbHMuZXh0ZW5kKHRydWUsIHt9LCBHbG9iYWxHcmlkT3B0aW9ucywgdGhpcy5mb3JSb290Q29uZmlnLCBncmlkT3B0aW9ucykgYXMgR3JpZE9wdGlvbjtcblxuICAgIC8vIHVzaW5nIGNvcHkgZXh0ZW5kIHRvIGRvIGEgZGVlcCBjbG9uZSBoYXMgYW4gdW53YW50ZWQgc2lkZSBvbiBvYmplY3RzIGFuZCBwYWdlU2l6ZXMgYnV0IEVTNiBzcHJlYWQgaGFzIG90aGVyIHdvcnN0IHNpZGUgZWZmZWN0c1xuICAgIC8vIHNvIHdlIHdpbGwganVzdCBvdmVyd3JpdGUgdGhlIHBhZ2VTaXplcyB3aGVuIG5lZWRlZCwgdGhpcyBpcyB0aGUgb25seSBvbmUgY2F1c2luZyBpc3N1ZXMgc28gZmFyLlxuICAgIC8vIE9uIGEgZGVlcCBleHRlbmQsIE9iamVjdCBhbmQgQXJyYXkgYXJlIGV4dGVuZGVkLCBidXQgb2JqZWN0IHdyYXBwZXJzIG9uIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIFN0cmluZywgQm9vbGVhbiwgYW5kIE51bWJlciBhcmUgbm90LlxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uICYmIChncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uIHx8IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpKSAmJiAodGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24gfHwgZ3JpZE9wdGlvbnMucGFnaW5hdGlvbikpIHtcbiAgICAgIG9wdGlvbnMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IGdyaWRPcHRpb25zLnBhZ2luYXRpb24/LnBhZ2VTaXplID8/IHRoaXMuZm9yUm9vdENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSA/PyBHbG9iYWxHcmlkT3B0aW9ucy5wYWdpbmF0aW9uIS5wYWdlU2l6ZTtcbiAgICAgIG9wdGlvbnMucGFnaW5hdGlvbi5wYWdlU2l6ZXMgPSBncmlkT3B0aW9ucy5wYWdpbmF0aW9uPy5wYWdlU2l6ZXMgPz8gdGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplcyA/PyBHbG9iYWxHcmlkT3B0aW9ucy5wYWdpbmF0aW9uIS5wYWdlU2l6ZXM7XG4gICAgfVxuXG4gICAgLy8gYWxzbyBtYWtlIHN1cmUgdG8gc2hvdyB0aGUgaGVhZGVyIHJvdyBpZiB1c2VyIGhhdmUgZW5hYmxlZCBmaWx0ZXJpbmdcbiAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IChvcHRpb25zLnNob3dIZWFkZXJSb3cgPT09IGZhbHNlKTtcbiAgICBpZiAob3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcgJiYgIW9wdGlvbnMuc2hvd0hlYWRlclJvdykge1xuICAgICAgb3B0aW9ucy5zaG93SGVhZGVyUm93ID0gb3B0aW9ucy5lbmFibGVGaWx0ZXJpbmc7XG4gICAgfVxuXG4gICAgLy8gd2hlbiB3ZSB1c2UgUGFnaW5hdGlvbiBvbiBMb2NhbCBHcmlkLCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yayB3aXRob3V0IGVuYWJsZUZpbHRlcmluZ1xuICAgIC8vIHNvIHdlJ2xsIGVuYWJsZSB0aGUgZmlsdGVyaW5nIGJ1dCB3ZSdsbCBrZWVwIHRoZSBoZWFkZXIgcm93IGhpZGRlblxuICAgIGlmIChvcHRpb25zICYmICFvcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiBvcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gJiYgdGhpcy5faXNMb2NhbEdyaWQpIHtcbiAgICAgIG9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nID0gdHJ1ZTtcbiAgICAgIG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9IGZhbHNlO1xuICAgICAgdGhpcy5faGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZSkge1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGlkZUhlYWRlclJvd0FmdGVyUGFnZUxvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgLyoqIEFkZCBhIHJlZ2lzdGVyIGEgbmV3IGV4dGVybmFsIHJlc291cmNlLCB1c2VyIGNvdWxkIGFsc28gb3B0aW9uYWwgZGlzcG9zZSBhbGwgcHJldmlvdXMgcmVzb3VyY2VzIGJlZm9yZSBwdXNoaW5nIGFueSBuZXcgcmVzb3VyY2VzIHRvIHRoZSByZXNvdXJjZXMgYXJyYXkgbGlzdC4gKi9cbiAgcmVnaXN0ZXJFeHRlcm5hbFJlc291cmNlcyhyZXNvdXJjZXM6IEV4dGVybmFsUmVzb3VyY2VbXSwgZGlzcG9zZVByZXZpb3VzUmVzb3VyY2VzID0gZmFsc2UpIHtcbiAgICBpZiAoZGlzcG9zZVByZXZpb3VzUmVzb3VyY2VzKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VFeHRlcm5hbFJlc291cmNlcygpO1xuICAgIH1cbiAgICByZXNvdXJjZXMuZm9yRWFjaChyZXMgPT4gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHJlcykpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV4dGVybmFsUmVzb3VyY2VzKHJlc291cmNlcyk7XG4gIH1cblxuICByZXNldEV4dGVybmFsUmVzb3VyY2VzKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMgPSBbXTtcbiAgfVxuXG4gIC8qKiBQcmUtUmVnaXN0ZXIgYW55IFJlc291cmNlIHRoYXQgZG9uJ3QgcmVxdWlyZSBTbGlja0dyaWQgdG8gYmUgaW5zdGFudGlhdGVkIChmb3IgZXhhbXBsZSBSeEpTIFJlc291cmNlICYgUm93RGV0YWlsKSAqL1xuICBwcm90ZWN0ZWQgcHJlUmVnaXN0ZXJSZXNvdXJjZXMoKSB7XG4gICAgLy8gQW5ndWxhci1TbGlja2dyaWQgcmVxdWlyZXMgUnhKUywgc28gd2UnbGwgcmVnaXN0ZXIgaXQgYXMgdGhlIGZpcnN0IHJlc291cmNlXG4gICAgdGhpcy5yZWdpc3RlclJ4SnNSZXNvdXJjZShuZXcgUnhKc1Jlc291cmNlKCkgYXMgUnhKc0ZhY2FkZSk7XG5cbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dEZXRhaWxWaWV3KSB7XG4gICAgICB0aGlzLnNsaWNrUm93RGV0YWlsVmlldyA9IG5ldyBTbGlja1Jvd0RldGFpbFZpZXcodGhpcy5hbmd1bGFyVXRpbFNlcnZpY2UsIHRoaXMuYXBwUmVmLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQsIHRoaXMucnhqcyk7XG4gICAgICB0aGlzLnNsaWNrUm93RGV0YWlsVmlldy5jcmVhdGUodGhpcy5jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5zbGlja1Jvd0RldGFpbFZpZXcpO1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmFkZEV4dGVuc2lvblRvTGlzdChFeHRlbnNpb25OYW1lLnJvd0RldGFpbFZpZXcsIHsgbmFtZTogRXh0ZW5zaW9uTmFtZS5yb3dEZXRhaWxWaWV3LCBpbnN0YW5jZTogdGhpcy5zbGlja1Jvd0RldGFpbFZpZXcgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVFeHRlcm5hbFJlc291cmNlcyhyZXNvdXJjZXM6IEV4dGVybmFsUmVzb3VyY2VbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc291cmNlcykpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgICAgIGlmICh0aGlzLnNsaWNrR3JpZCAmJiB0eXBlb2YgcmVzb3VyY2UuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlc291cmNlLmluaXQodGhpcy5zbGlja0dyaWQsIHRoaXMuY29udGFpbmVyU2VydmljZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJSZXNvdXJjZXMoKSB7XG4gICAgLy8gYXQgdGhpcyBwb2ludCwgd2UgY29uc2lkZXIgYWxsIHRoZSByZWdpc3RlcmVkIHNlcnZpY2VzIGFzIGV4dGVybmFsIHNlcnZpY2VzLCBhbnl0aGluZyBlbHNlIHJlZ2lzdGVyZWQgYWZ0ZXJ3YXJkIGFyZW4ndCBleHRlcm5hbFxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZXh0ZXJuYWxSZWdpc3RlcmVkUmVzb3VyY2VzID0gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcztcbiAgICB9XG5cbiAgICAvLyBwdXNoIGFsbCBvdGhlciBTZXJ2aWNlcyB0aGF0IHdlIHdhbnQgdG8gYmUgcmVnaXN0ZXJlZFxuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLmdyaWRTZXJ2aWNlLCB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UpO1xuXG4gICAgLy8gd2hlbiB1c2luZyBHcm91cGluZy9EcmFnZ2FibGVHcm91cGluZy9Db2xzcGFuIHJlZ2lzdGVyIGl0cyBTZXJ2aWNlXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuY3JlYXRlUHJlSGVhZGVyUGFuZWwgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlRHJhZ2dhYmxlR3JvdXBpbmcpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLmdyb3VwaW5nU2VydmljZSk7XG4gICAgfVxuXG4gICAgLy8gd2hlbiB1c2luZyBUcmVlIERhdGEgVmlldywgcmVnaXN0ZXIgaXRzIFNlcnZpY2VcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmVlRGF0YSkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvLyB3aGVuIHVzZXIgZW5hYmxlcyB0cmFuc2xhdGlvbiwgd2UgbmVlZCB0byB0cmFuc2xhdGUgSGVhZGVycyBvbiBmaXJzdCBwYXNzICYgc3Vic2VxdWVudGx5IGluIHRoZSBiaW5kRGlmZmVyZW50SG9va3NcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS50cmFuc2xhdGVDb2x1bW5IZWFkZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gYWxzbyBpbml0aWFsaXplIChyZW5kZXIpIHRoZSBlbXB0eSB3YXJuaW5nIGNvbXBvbmVudFxuICAgIHRoaXMuc2xpY2tFbXB0eVdhcm5pbmcgPSBuZXcgU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQoKTtcbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy5zbGlja0VtcHR5V2FybmluZyk7XG5cbiAgICAvLyBiaW5kICYgaW5pdGlhbGl6ZSBhbGwgQ29tcG9uZW50cy9TZXJ2aWNlcyB0aGF0IHdlcmUgdGFnZ2VkIGFzIGVuYWJsZWRcbiAgICAvLyByZWdpc3RlciBhbGwgc2VydmljZXMgYnkgZXhlY3V0aW5nIHRoZWlyIGluaXQgbWV0aG9kIGFuZCBwcm92aWRpbmcgdGhlbSB3aXRoIHRoZSBHcmlkIG9iamVjdFxuICAgIHRoaXMuaW5pdGlhbGl6ZUV4dGVybmFsUmVzb3VyY2VzKHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBSeEpTIFJlc291cmNlIGluIGFsbCBuZWNlc3Nhcnkgc2VydmljZXMgd2hpY2ggdXNlcyAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJSeEpzUmVzb3VyY2UocmVzb3VyY2U6IFJ4SnNGYWNhZGUpIHtcbiAgICB0aGlzLnJ4anMgPSByZXNvdXJjZTtcbiAgICB0aGlzLmJhY2tlbmRVdGlsaXR5U2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xuICAgIHRoaXMuc29ydFNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUnhKc1Jlc291cmNlJywgdGhpcy5yeGpzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgKG9yIGRpc3Bvc2UpIHRoZSBQYWdpbmF0aW9uIENvbXBvbmVudCwgdXNlciBjYW4gb3B0aW9uYWxseSBwcm92aWRlIEZhbHNlICh0byBub3Qgc2hvdyBpdCkgd2hpY2ggd2lsbCBpbiB0ZXJtIGRpc3Bvc2Ugb2YgdGhlIFBhZ2luYXRpb24sXG4gICAqIGFsc28gd2hpbGUgZGlzcG9zaW5nIHdlIGNhbiBjaG9vc2UgdG8gb21pdCB0aGUgZGlzcG9zYWJsZSBvZiB0aGUgUGFnaW5hdGlvbiBTZXJ2aWNlIChpZiB3ZSBhcmUgc2ltcGx5IHRvZ2dsaW5nIHRoZSBQYWdpbmF0aW9uLCB3ZSB3YW50IHRvIGtlZXAgdGhlIFNlcnZpY2UgYWxpdmUpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hvd1BhZ2luYXRpb24gLSBzaG93IChuZXcgcmVuZGVyKSBvciBub3QgKGRpc3Bvc2UpIHRoZSBQYWdpbmF0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hvdWxkRGlzcG9zZVBhZ2luYXRpb25TZXJ2aWNlIC0gd2hlbiBkaXNwb3NpbmcgdGhlIFBhZ2luYXRpb24sIGRvIHdlIGFsc28gd2FudCB0byBkaXNwb3NlIG9mIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2U/IChkZWZhdWx0cyB0byBUcnVlKVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlclBhZ2luYXRpb24oc2hvd1BhZ2luYXRpb24gPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmVuYWJsZVBhZ2luYXRpb24gJiYgIXRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkICYmIHNob3dQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbiA9IG5ldyBTbGlja1BhZ2luYXRpb25Db21wb25lbnQodGhpcy5wYWdpbmF0aW9uU2VydmljZSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UpO1xuICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24ucmVuZGVyUGFnaW5hdGlvbih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFzaG93UGFnaW5hdGlvbikge1xuICAgICAgaWYgKHRoaXMuc2xpY2tQYWdpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2xpY2tQYWdpbmF0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgZmxhdCBkYXRhc2V0IHdpdGggcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCwgc29ydCBpdCAodmlhIGl0cyB0cmVlIHN0cnVjdHVyZSkgYW5kIHJldHVybiB0aGUgc29ydGVkIGZsYXQgYXJyYXlcbiAgICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmbGF0RGF0YXNldElucHV0IC0gZmxhdCBkYXRhc2V0IGlucHV0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VHcmlkUmVmcmVzaCAtIG9wdGlvbmFsbHkgZm9yY2UgYSBmdWxsIGdyaWQgcmVmcmVzaFxuICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gc29ydCBmbGF0IHBhcmVudC9jaGlsZCBkYXRhc2V0XG4gICAqL1xuICBwcm90ZWN0ZWQgc29ydFRyZWVEYXRhc2V0PFQ+KGZsYXREYXRhc2V0SW5wdXQ6IFRbXSwgZm9yY2VHcmlkUmVmcmVzaCA9IGZhbHNlKTogVFtdIHtcbiAgICBjb25zdCBwcmV2RGF0YXNldExuID0gdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGg7XG4gICAgbGV0IHNvcnRlZERhdGFzZXRSZXN1bHQ7XG4gICAgbGV0IGZsYXREYXRhc2V0T3V0cHV0OiBhbnlbXSA9IFtdO1xuXG4gICAgLy8gaWYgdGhlIGhpZXJhcmNoaWNhbCBkYXRhc2V0IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIHRoZW4gbm8gbmVlZCB0byByZS1jb252ZXJ0IGl0LCB3ZSBjYW4gdXNlIGl0IGRpcmVjdGx5IGZyb20gdGhlIHNoYXJlZCBzZXJ2aWNlIHJlZlxuICAgIGlmICh0aGlzLl9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCAmJiB0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwpIHtcbiAgICAgIHNvcnRlZERhdGFzZXRSZXN1bHQgPSB0aGlzLnRyZWVEYXRhU2VydmljZS5zb3J0SGllcmFyY2hpY2FsRGF0YXNldCh0aGlzLmRhdGFzZXRIaWVyYXJjaGljYWwpO1xuICAgICAgZmxhdERhdGFzZXRPdXRwdXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmZsYXQ7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZsYXREYXRhc2V0SW5wdXQpICYmIGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LnRyZWVEYXRhT3B0aW9ucz8uaW5pdGlhbFNvcnQpIHtcbiAgICAgICAgLy8gZWxzZSB3ZSBuZWVkIHRvIGZpcnN0IGNvbnZlcnQgdGhlIGZsYXQgZGF0YXNldCB0byBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGFuZCB0aGVuIHNvcnRcbiAgICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0QW5kU29ydChmbGF0RGF0YXNldElucHV0LCB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5oaWVyYXJjaGljYWw7XG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gc29ydGVkRGF0YXNldFJlc3VsdC5mbGF0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZWxzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgdXNlciBwcm92aWRlZCBhbiBhcnJheSB0aGF0IGlzIGFscmVhZHkgc29ydGVkICh1c2VyJ3MgcmVzcG9uc2FiaWxpdHkpXG4gICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gc2ltcGx5IGNvbnZlcnQgdGhlIGFycmF5IHRvIGEgdHJlZSBzdHJ1Y3R1cmUgYW5kIHdlJ3JlIGRvbmUsIG5vIG5lZWQgdG8gc29ydFxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLmNvbnZlcnRGbGF0UGFyZW50Q2hpbGRUb1RyZWVEYXRhc2V0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgICAgICBmbGF0RGF0YXNldE91dHB1dCA9IGZsYXREYXRhc2V0SW5wdXQgfHwgW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYWRkL3JlbW92ZSBpdGVtKHMpIGZyb20gdGhlIGRhdGFzZXQsIHdlIG5lZWQgdG8gYWxzbyByZWZyZXNoIG91ciB0cmVlIGRhdGEgZmlsdGVyc1xuICAgIGlmIChmbGF0RGF0YXNldElucHV0Lmxlbmd0aCA+IDAgJiYgKGZvcmNlR3JpZFJlZnJlc2ggfHwgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggIT09IHByZXZEYXRhc2V0TG4pKSB7XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVmcmVzaFRyZWVEYXRhRmlsdGVycyhmbGF0RGF0YXNldE91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXREYXRhc2V0T3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBjb252ZW5pZW5jZSB0byB0aGUgdXNlciwgd2UgcHJvdmlkZSB0aGUgcHJvcGVydHkgXCJlZGl0b3JcIiBhcyBhbiBBbmd1bGFyLVNsaWNrZ3JpZCBlZGl0b3IgY29tcGxleCBvYmplY3RcbiAgICogaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XG4gICAqIHNvIGluIG91ciBsaWIgd2Ugd2lsbCBzd2FwIFwiZWRpdG9yXCIgYW5kIGNvcHkgaXQgaW50byBhIG5ldyBwcm9wZXJ0eSBjYWxsZWQgXCJpbnRlcm5hbENvbHVtbkVkaXRvclwiXG4gICAqIHRoZW4gdGFrZSBiYWNrIFwiZWRpdG9yLm1vZGVsXCIgYW5kIG1ha2UgaXQgdGhlIG5ldyBcImVkaXRvclwiIHNvIHRoYXQgU2xpY2tHcmlkIEVkaXRvciBGYWN0b3J5IHN0aWxsIHdvcmtzXG4gICAqL1xuICBwcm90ZWN0ZWQgc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5bXSkge1xuICAgIGlmIChjb2x1bW5EZWZpbml0aW9ucy5zb21lKGNvbCA9PiBgJHtjb2wuaWR9YC5pbmNsdWRlcygnLicpKSkge1xuICAgICAgY29uc29sZS5lcnJvcignW0FuZ3VsYXItU2xpY2tncmlkXSBNYWtlIHN1cmUgdGhhdCBub25lIG9mIHlvdXIgQ29sdW1uIERlZmluaXRpb24gXCJpZFwiIHByb3BlcnR5IGluY2x1ZGVzIGEgZG90IGluIGl0cyBuYW1lIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgRWRpdG9ycy4gRm9yIGV4YW1wbGUgaWYgeW91ciBjb2x1bW4gZGVmaW5pdGlvbiBcImZpZWxkXCIgcHJvcGVydHkgaXMgXCJ1c2VyLmZpcnN0TmFtZVwiIHRoZW4gdXNlIFwiZmlyc3ROYW1lXCIgYXMgdGhlIGNvbHVtbiBcImlkXCIuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbkRlZmluaXRpb25zLm1hcCgoY29sdW1uOiBDb2x1bW4gfCBhbnkpID0+IHtcbiAgICAgIC8vIG9uIGV2ZXJ5IEVkaXRvciB0aGF0IGhhdmUgYSBcImNvbGxlY3Rpb25Bc3luY1wiLCByZXNvbHZlIHRoZSBkYXRhIGFuZCBhc3NpZ24gaXQgdG8gdGhlIFwiY29sbGVjdGlvblwiIHByb3BlcnR5XG4gICAgICBpZiAoY29sdW1uPy5lZGl0b3I/LmNvbGxlY3Rpb25Bc3luYykge1xuICAgICAgICB0aGlzLmxvYWRFZGl0b3JDb2xsZWN0aW9uQXN5bmMoY29sdW1uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgZWRpdG9yOiBjb2x1bW4uZWRpdG9yPy5tb2RlbCwgaW50ZXJuYWxDb2x1bW5FZGl0b3I6IHsgLi4uY29sdW1uLmVkaXRvciB9IH07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhbnNsYXRlQ29sdW1uSGVhZGVyVGl0bGVLZXlzKCkge1xuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1ucyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxuICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eS50cmFuc2xhdGVJdGVtcyh0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucywgJ25hbWVLZXknLCAnbmFtZScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZUNvbHVtbkdyb3VwS2V5cygpIHtcbiAgICAvLyB0cmFuc2xhdGUgYWxsIGNvbHVtbiBncm91cHMgKGluY2x1ZGluZyBoaWRkZW4gY29sdW1ucylcbiAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHkudHJhbnNsYXRlSXRlbXModGhpcy5zaGFyZWRTZXJ2aWNlLmFsbENvbHVtbnMsICdjb2x1bW5Hcm91cEtleScsICdjb2x1bW5Hcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgXCJpbnRlcm5hbENvbHVtbkVkaXRvci5jb2xsZWN0aW9uXCIgcHJvcGVydHkuXG4gICAqIFNpbmNlIHRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBhc3luYyBjYWxsIHJlc29sdmVzLCB0aGUgcG9pbnRlciB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgXCJjb2x1bW5cIiBhcmd1bWVudCBwYXNzZWQuXG4gICAqIE9uY2Ugd2UgZm91bmQgdGhlIG5ldyBwb2ludGVyLCB3ZSB3aWxsIHJlYXNzaWduIHRoZSBcImVkaXRvclwiIGFuZCBcImNvbGxlY3Rpb25cIiB0byB0aGUgXCJpbnRlcm5hbENvbHVtbkVkaXRvclwiIHNvIGl0IGhhcyBuZXdlc3QgY29sbGVjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUVkaXRvckNvbGxlY3Rpb248VCA9IGFueT4oY29sdW1uOiBDb2x1bW48VD4sIG5ld0NvbGxlY3Rpb246IFRbXSkge1xuICAgIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuY29sbGVjdGlvbiA9IG5ld0NvbGxlY3Rpb247XG4gICAgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLy8gZmluZCB0aGUgbmV3IGNvbHVtbiByZWZlcmVuY2UgcG9pbnRlciAmIHJlLWFzc2lnbiB0aGUgbmV3IGVkaXRvciB0byB0aGUgaW50ZXJuYWxDb2x1bW5FZGl0b3JcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvbHVtbkRlZmluaXRpb25zKSkge1xuICAgICAgY29uc3QgY29sdW1uUmVmID0gdGhpcy5jb2x1bW5EZWZpbml0aW9ucy5maW5kKChjb2w6IENvbHVtbikgPT4gY29sLmlkID09PSBjb2x1bW4uaWQpO1xuICAgICAgaWYgKGNvbHVtblJlZikge1xuICAgICAgICBjb2x1bW5SZWYuaW50ZXJuYWxDb2x1bW5FZGl0b3IgPSBjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgY3VycmVudCBFZGl0b3IsIHJlbW92ZSBpdCBmcm9tIHRoZSBET00gdGhlbiByZS1lbmFibGUgaXQgYW5kIHJlLXJlbmRlciBpdCB3aXRoIHRoZSBuZXcgY29sbGVjdGlvbi5cbiAgICBjb25zdCBjdXJyZW50RWRpdG9yID0gdGhpcy5zbGlja0dyaWQuZ2V0Q2VsbEVkaXRvcigpIGFzIEF1dG9jb21wbGV0ZXJFZGl0b3IgfCBTZWxlY3RFZGl0b3I7XG4gICAgaWYgKGN1cnJlbnRFZGl0b3I/LmRpc2FibGUgJiYgY3VycmVudEVkaXRvcj8ucmVuZGVyRG9tRWxlbWVudCkge1xuICAgICAgY3VycmVudEVkaXRvci5kZXN0cm95KCk7XG4gICAgICBjdXJyZW50RWRpdG9yLmRpc2FibGUoZmFsc2UpO1xuICAgICAgY3VycmVudEVkaXRvci5yZW5kZXJEb21FbGVtZW50KG5ld0NvbGxlY3Rpb24pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBpZD1cInNsaWNrR3JpZENvbnRhaW5lci17e2dyaWRJZH19XCIgY2xhc3M9XCJncmlkUGFuZVwiPlxuICA8ZGl2IGF0dHIuaWQ9J3t7Z3JpZElkfX0nIGNsYXNzPVwic2xpY2tncmlkLWNvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
1263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2NvbXBvbmVudHMvYW5ndWxhci1zbGlja2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sMEJBQTBCLENBQUM7QUFFbEMsNkJBQTZCO0FBQzdCLE9BQU8sRUFBaUIsY0FBYyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUVuSyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBdUJsQyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGdCQUFnQixFQUNoQiw4QkFBOEI7QUFFOUIsV0FBVztBQUNYLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGFBQWEsRUFDYixlQUFlLEVBQ2YsV0FBVyxFQUNYLGVBQWU7QUFFZixZQUFZO0FBQ1oseUNBQXlDLEVBQ3pDLFlBQVksRUFDWixhQUFhLEVBQ2IsY0FBYyxHQUNmLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGtCQUFrQixF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Qix5VkFQekI7WUFDVCw0Q0FBNEM7WUFDNUMsa0JBQWtCO1lBQ2xCLGNBQWM7WUFDZCxpQkFBaUI7U0FDbEIsMEJDekZILG1LQUdNOzs0RkR3Rk8seUJBQXlCO2tCQVZyQyxTQUFTOytCQUNFLG1CQUFtQixhQUVsQjt3QkFDVCw0Q0FBNEM7d0JBQzVDLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxpQkFBaUI7cUJBQ2xCOzswQkFxTEUsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLGlCQUFpQjs0Q0EvSGxCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWVGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFnQkksdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUdILE9BQU87c0JBRFYsS0FBSztnQkEwQkYsbUJBQW1CO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IDNyZCBwYXJ0eSB2ZW5kb3IgbGlic1xuaW1wb3J0ICdzbGlja2dyaWQvc2xpY2suY29yZSc7XG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5pbnRlcmFjdGlvbnMnO1xuaW1wb3J0ICdzbGlja2dyaWQvc2xpY2suZ3JpZCc7XG5pbXBvcnQgJ3NsaWNrZ3JpZC9zbGljay5kYXRhdmlldyc7XG5cbi8vIC4uLnRoZW4gZXZlcnl0aGluZyBlbHNlLi4uXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBBcHBsaWNhdGlvblJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBPdXRwdXQsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXV0b2NvbXBsZXRlckVkaXRvcixcbiAgQmFja2VuZFNlcnZpY2VBcGksXG4gIEJhY2tlbmRTZXJ2aWNlT3B0aW9uLFxuICBDb2x1bW4sXG4gIENvbHVtbkVkaXRvcixcbiAgRGF0YVZpZXdPcHRpb24sXG4gIEV2ZW50U3Vic2NyaXB0aW9uLFxuICBFeHRlcm5hbFJlc291cmNlLFxuICBMb2NhbGUsXG4gIE1ldHJpY3MsXG4gIFBhZ2luYXRpb24sXG4gIFJ4SnNGYWNhZGUsXG4gIFNlbGVjdEVkaXRvcixcbiAgU2VydmljZVBhZ2luYXRpb24sXG4gIFNsaWNrRGF0YVZpZXcsXG4gIFNsaWNrRXZlbnRIYW5kbGVyLFxuICBTbGlja0dyaWQsXG4gIFNsaWNrTmFtZXNwYWNlLFxufSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jb21tb24nO1xuXG5pbXBvcnQge1xuICBFeHRlbnNpb25OYW1lLFxuICBFeHRlbnNpb25VdGlsaXR5LFxuICBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIsXG5cbiAgLy8gc2VydmljZXNcbiAgQmFja2VuZFV0aWxpdHlTZXJ2aWNlLFxuICBDb2xsZWN0aW9uU2VydmljZSxcbiAgRXZlbnROYW1pbmdTdHlsZSxcbiAgRXh0ZW5zaW9uU2VydmljZSxcbiAgRmlsdGVyRmFjdG9yeSxcbiAgRmlsdGVyU2VydmljZSxcbiAgR3JpZEV2ZW50U2VydmljZSxcbiAgR3JpZFNlcnZpY2UsXG4gIEdyaWRTdGF0ZVNlcnZpY2UsXG4gIEdyb3VwaW5nQW5kQ29sc3BhblNlcnZpY2UsXG4gIFBhZ2luYXRpb25TZXJ2aWNlLFxuICBSZXNpemVyU2VydmljZSxcbiAgU2hhcmVkU2VydmljZSxcbiAgU2xpY2tncmlkQ29uZmlnLFxuICBTb3J0U2VydmljZSxcbiAgVHJlZURhdGFTZXJ2aWNlLFxuXG4gIC8vIHV0aWxpdGllc1xuICBhdXRvQWRkRWRpdG9yRm9ybWF0dGVyVG9Db2x1bW5zV2l0aEVkaXRvcixcbiAgZW1wdHlFbGVtZW50LFxuICBHcmlkU3RhdGVUeXBlLFxuICB1bnN1YnNjcmliZUFsbCxcbn0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY29tbW9uJztcbmltcG9ydCB7IEV2ZW50UHViU3ViU2VydmljZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2V2ZW50LXB1Yi1zdWInO1xuaW1wb3J0IHsgU2xpY2tFbXB0eVdhcm5pbmdDb21wb25lbnQgfSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9lbXB0eS13YXJuaW5nLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGlja0Zvb3RlckNvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2N1c3RvbS1mb290ZXItY29tcG9uZW50JztcbmltcG9ydCB7IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3BhZ2luYXRpb24tY29tcG9uZW50JztcbmltcG9ydCB7IFJ4SnNSZXNvdXJjZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3J4anMtb2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBkZXF1YWwgfSBmcm9tICdkZXF1YWwvbGl0ZSc7XG5cbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IEFuZ3VsYXJHcmlkSW5zdGFuY2UsIEV4dGVybmFsVGVzdGluZ0RlcGVuZGVuY2llcywgR3JpZE9wdGlvbiB9IGZyb20gJy4vLi4vbW9kZWxzL2luZGV4JztcbmltcG9ydCB7IEdsb2JhbEdyaWRPcHRpb25zIH0gZnJvbSAnLi8uLi9nbG9iYWwtZ3JpZC1vcHRpb25zJztcbmltcG9ydCB7IFRyYW5zbGF0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNsYXRlci5zZXJ2aWNlJztcblxuLy8gU2VydmljZXNcbmltcG9ydCB7IEFuZ3VsYXJVdGlsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FuZ3VsYXJVdGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2xpY2tSb3dEZXRhaWxWaWV3IH0gZnJvbSAnLi4vZXh0ZW5zaW9ucy9zbGlja1Jvd0RldGFpbFZpZXcnO1xuaW1wb3J0IHsgQ29udGFpbmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnRhaW5lci5zZXJ2aWNlJztcblxuLy8gdXNpbmcgZXh0ZXJuYWwgbm9uLXR5cGVkIGpzIGxpYnJhcmllc1xuZGVjbGFyZSBjb25zdCBTbGljazogU2xpY2tOYW1lc3BhY2U7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FuZ3VsYXItc2xpY2tncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FuZ3VsYXItc2xpY2tncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gbWFrZSBldmVyeXRoaW5nIHRyYW5zaWVudCAobm9uLXNpbmdsZXRvbilcbiAgICBBbmd1bGFyVXRpbFNlcnZpY2UsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgVHJhbnNsYXRlclNlcnZpY2UsXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhclNsaWNrZ3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBfZGF0YXNldD86IGFueVtdIHwgbnVsbDtcbiAgcHJvdGVjdGVkIF9jb2x1bW5EZWZpbml0aW9ucyE6IENvbHVtbltdO1xuICBwcm90ZWN0ZWQgX2N1cnJlbnREYXRhc2V0TGVuZ3RoID0gMDtcbiAgcHJvdGVjdGVkIF9ldmVudEhhbmRsZXI6IFNsaWNrRXZlbnRIYW5kbGVyID0gbmV3IFNsaWNrLkV2ZW50SGFuZGxlcigpO1xuICBwcm90ZWN0ZWQgX2V2ZW50UHViU3ViU2VydmljZSE6IEV2ZW50UHViU3ViU2VydmljZTtcbiAgcHJvdGVjdGVkIF9hbmd1bGFyR3JpZEluc3RhbmNlczogQW5ndWxhckdyaWRJbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIF9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2lzR3JpZEluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfaXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9pc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfaXNMb2NhbEdyaWQgPSB0cnVlO1xuICBwcm90ZWN0ZWQgX3BhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3JlZ2lzdGVyZWRSZXNvdXJjZXM6IEV4dGVybmFsUmVzb3VyY2VbXSA9IFtdO1xuICBkYXRhVmlldyE6IFNsaWNrRGF0YVZpZXc7XG4gIHNsaWNrR3JpZCE6IFNsaWNrR3JpZDtcbiAgZ3JvdXBpbmdEZWZpbml0aW9uOiBhbnkgPSB7fTtcbiAgZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcj86IFNsaWNrR3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlcjtcbiAgYmFja2VuZFNlcnZpY2VBcGk/OiBCYWNrZW5kU2VydmljZUFwaTtcbiAgbG9jYWxlcyE6IExvY2FsZTtcbiAgbWV0cmljcz86IE1ldHJpY3M7XG4gIHNob3dQYWdpbmF0aW9uID0gZmFsc2U7XG4gIHNlcnZpY2VMaXN0OiBhbnlbXSA9IFtdO1xuICB0b3RhbEl0ZW1zID0gMDtcbiAgcGFnaW5hdGlvbkRhdGE/OiB7XG4gICAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb247XG4gICAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlO1xuICB9O1xuICBzdWJzY3JpcHRpb25zOiBFdmVudFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLy8gY29tcG9uZW50cyAvIHBsdWdpbnNcbiAgc2xpY2tFbXB0eVdhcm5pbmc/OiBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudDtcbiAgc2xpY2tGb290ZXI/OiBTbGlja0Zvb3RlckNvbXBvbmVudDtcbiAgc2xpY2tQYWdpbmF0aW9uPzogU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50O1xuICBzbGlja1Jvd0RldGFpbFZpZXc/OiBTbGlja1Jvd0RldGFpbFZpZXc7XG5cbiAgLy8gc2VydmljZXNcbiAgYmFja2VuZFV0aWxpdHlTZXJ2aWNlITogQmFja2VuZFV0aWxpdHlTZXJ2aWNlO1xuICBjb2xsZWN0aW9uU2VydmljZTogQ29sbGVjdGlvblNlcnZpY2U7XG4gIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2U7XG4gIGV4dGVuc2lvblV0aWxpdHk6IEV4dGVuc2lvblV0aWxpdHk7XG4gIGZpbHRlckZhY3RvcnkhOiBGaWx0ZXJGYWN0b3J5O1xuICBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlO1xuICBncmlkRXZlbnRTZXJ2aWNlOiBHcmlkRXZlbnRTZXJ2aWNlO1xuICBncmlkU2VydmljZTogR3JpZFNlcnZpY2U7XG4gIGdyaWRTdGF0ZVNlcnZpY2U6IEdyaWRTdGF0ZVNlcnZpY2U7XG4gIGdyb3VwaW5nU2VydmljZTogR3JvdXBpbmdBbmRDb2xzcGFuU2VydmljZTtcbiAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlO1xuICByZXNpemVyU2VydmljZSE6IFJlc2l6ZXJTZXJ2aWNlO1xuICByeGpzPzogUnhKc0ZhY2FkZTtcbiAgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZTtcbiAgc29ydFNlcnZpY2U6IFNvcnRTZXJ2aWNlO1xuICB0cmVlRGF0YVNlcnZpY2U6IFRyZWVEYXRhU2VydmljZTtcblxuICBASW5wdXQoKSBjdXN0b21EYXRhVmlldzogYW55O1xuICBASW5wdXQoKSBncmlkSWQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBncmlkT3B0aW9ucyE6IEdyaWRPcHRpb247XG5cbiAgQElucHV0KClcbiAgZ2V0IHBhZ2luYXRpb25PcHRpb25zKCk6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucztcbiAgfVxuICBzZXQgcGFnaW5hdGlvbk9wdGlvbnMobmV3UGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobmV3UGFnaW5hdGlvbk9wdGlvbnMgJiYgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0geyAuLi50aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24sIC4uLnRoaXMuX3BhZ2luYXRpb25PcHRpb25zLCAuLi5uZXdQYWdpbmF0aW9uT3B0aW9ucyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA9IG5ld1BhZ2luYXRpb25PcHRpb25zO1xuICAgIH1cbiAgICB0aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb24gPSB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyA/PyB0aGlzLmdyaWRPcHRpb25zLnBhZ2luYXRpb247XG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVUb3RhbEl0ZW1zKHRoaXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8udG90YWxJdGVtcyA/PyAwLCB0cnVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBjb2x1bW5EZWZpbml0aW9ucyhjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IGNvbHVtbkRlZmluaXRpb25zO1xuICAgIGlmICh0aGlzLl9pc0dyaWRJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy51cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QoY29sdW1uRGVmaW5pdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb3B5Q29sdW1uV2lkdGhzUmVmZXJlbmNlKGNvbHVtbkRlZmluaXRpb25zKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IENvbHVtbltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG4gIH1cblxuICAvLyBtYWtlIHRoZSBjb2x1bW5EZWZpbml0aW9ucyBhIDItd2F5IGJpbmRpbmcgc28gdGhhdCBwbHVnaW4gYWRkaW5nIGNvbHNcbiAgLy8gYXJlIHN5bmNoZWQgb24gdXNlcidzIHNpZGUgYXMgd2VsbCAoUm93TW92ZSwgUm93RGV0YWlsLCBSb3dTZWxlY3Rpb25zKVxuICBAT3V0cHV0KCkgY29sdW1uRGVmaW5pdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBkYXRhc2V0KCk6IGFueVtdIHtcbiAgICByZXR1cm4gKHRoaXMuY3VzdG9tRGF0YVZpZXcgPyB0aGlzLnNsaWNrR3JpZD8uZ2V0RGF0YT8uKCkgOiB0aGlzLmRhdGFWaWV3Py5nZXRJdGVtcz8uKCkpIHx8IFtdO1xuICB9XG4gIHNldCBkYXRhc2V0KG5ld0RhdGFzZXQ6IGFueVtdKSB7XG4gICAgY29uc3QgcHJldkRhdGFzZXRMbiA9IHRoaXMuX2N1cnJlbnREYXRhc2V0TGVuZ3RoO1xuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0RhdGFzZXQsIHRoaXMuX2RhdGFzZXQgfHwgW10pO1xuICAgIGxldCBkYXRhID0gbmV3RGF0YXNldDtcblxuICAgIC8vIHdoZW4gVHJlZSBEYXRhIGlzIGVuYWJsZWQgYW5kIHdlIGRvbid0IHlldCBoYXZlIHRoZSBoaWVyYXJjaGljYWwgZGF0YXNldCBmaWxsZWQsIHdlIGNhbiBmb3JjZSBhIGNvbnZlcnQrc29ydCBvZiB0aGUgYXJyYXlcbiAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlVHJlZURhdGEgJiYgQXJyYXkuaXNBcnJheShuZXdEYXRhc2V0KSAmJiAobmV3RGF0YXNldC5sZW5ndGggPiAwIHx8IG5ld0RhdGFzZXQubGVuZ3RoICE9PSBwcmV2RGF0YXNldExuIHx8ICFpc0RhdGFzZXRFcXVhbCkpIHtcbiAgICAgIHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICBkYXRhID0gdGhpcy5zb3J0VHJlZURhdGFzZXQobmV3RGF0YXNldCwgIWlzRGF0YXNldEVxdWFsKTsgLy8gaWYgZGF0YXNldCBjaGFuZ2VkLCB0aGVuIGZvcmNlIGEgcmVmcmVzaCBhbnl3YXlcbiAgICB9XG4gICAgdGhpcy5fZGF0YXNldCA9IGRhdGE7XG4gICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoZGF0YSB8fCBbXSk7XG4gICAgdGhpcy5fY3VycmVudERhdGFzZXRMZW5ndGggPSAobmV3RGF0YXNldCB8fCBbXSkubGVuZ3RoO1xuXG4gICAgLy8gZXhwYW5kL2F1dG9maXQgY29sdW1ucyBvbiBmaXJzdCBwYWdlIGxvYWRcbiAgICAvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaWYgdGhlIHByZXZEYXRhc2V0IHdhcyBlbXB0eSB0aGVuIHdlIGFyZSBvbiBmaXJzdCBsb2FkXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnM/LmF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWQgJiYgcHJldkRhdGFzZXRMbiA9PT0gMCkge1xuICAgICAgdGhpcy5zbGlja0dyaWQuYXV0b3NpemVDb2x1bW5zKCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGRhdGFzZXRIaWVyYXJjaGljYWwoKTogYW55W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldDtcbiAgfVxuICBzZXQgZGF0YXNldEhpZXJhcmNoaWNhbChuZXdIaWVyYXJjaGljYWxEYXRhc2V0OiBhbnlbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGlzRGF0YXNldEVxdWFsID0gZGVxdWFsKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQsIHRoaXMuc2hhcmVkU2VydmljZT8uaGllcmFyY2hpY2FsRGF0YXNldCA/PyBbXSk7XG4gICAgY29uc3QgcHJldkZsYXREYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGllcmFyY2hpY2FsRGF0YXNldCA9IG5ld0hpZXJhcmNoaWNhbERhdGFzZXQ7XG5cbiAgICBpZiAobmV3SGllcmFyY2hpY2FsRGF0YXNldCAmJiB0aGlzLmNvbHVtbkRlZmluaXRpb25zICYmIHRoaXMuZmlsdGVyU2VydmljZT8uY2xlYXJGaWx0ZXJzKSB7XG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UuY2xlYXJGaWx0ZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gd2hlbiBhIGhpZXJhcmNoaWNhbCBkYXRhc2V0IGlzIHNldCBhZnRlcndhcmQsIHdlIGNhbiByZXNldCB0aGUgZmxhdCBkYXRhc2V0IGFuZCBjYWxsIGEgdHJlZSBkYXRhIHNvcnQgdGhhdCB3aWxsIG92ZXJ3cml0ZSB0aGUgZmxhdCBkYXRhc2V0XG4gICAgaWYgKG5ld0hpZXJhcmNoaWNhbERhdGFzZXQgJiYgdGhpcy5zbGlja0dyaWQgJiYgdGhpcy5zb3J0U2VydmljZT8ucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQpIHtcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UucHJvY2Vzc1RyZWVEYXRhSW5pdGlhbFNvcnQoKTtcblxuICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHJlc2V0L3JlZnJlc2ggdGhlIFRyZWUgRGF0YSBmaWx0ZXJzIGJlY2F1c2UgaWYgd2UgaW5zZXJ0ZWQgbmV3IGl0ZW0ocykgdGhlbiBpdCBtaWdodCBub3Qgc2hvdyB1cCB3aXRob3V0IGRvaW5nIHRoaXMgcmVmcmVzaFxuICAgICAgLy8gaG93ZXZlciB3ZSBuZWVkIDEgY3B1IGN5Y2xlIGJlZm9yZSBoYXZpbmcgdGhlIERhdGFWaWV3IHJlZnJlc2hlZCwgc28gd2UgbmVlZCB0byB3cmFwIHRoaXMgY2hlY2sgaW4gYSBzZXRUaW1lb3V0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZmxhdERhdGFzZXRMbiA9IHRoaXMuZGF0YVZpZXcuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIGlmIChmbGF0RGF0YXNldExuID4gMCAmJiAoZmxhdERhdGFzZXRMbiAhPT0gcHJldkZsYXREYXRhc2V0TG4gfHwgIWlzRGF0YXNldEVxdWFsKSkge1xuICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWZyZXNoVHJlZURhdGFGaWx0ZXJzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiB0aGlzLmVsbTtcbiAgfVxuXG4gIGdldCBldmVudEhhbmRsZXIoKTogU2xpY2tFdmVudEhhbmRsZXIge1xuICAgIHJldHVybiB0aGlzLl9ldmVudEhhbmRsZXI7XG4gIH1cblxuICBnZXQgZ3JpZENvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgfHwgJyd9YCk7XG4gIH1cblxuICAvKiogR0VUVEVSIHRvIGtub3cgaWYgZGF0YXNldCB3YXMgaW5pdGlhbGl6ZWQgb3Igbm90ICovXG4gIGdldCBpc0RhdGFzZXRJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQ7XG4gIH1cbiAgLyoqIFNFVFRFUiB0byBjaGFuZ2UgaWYgZGF0YXNldCB3YXMgaW5pdGlhbGl6ZWQgb3Igbm90IChzdHJpbmdseSB1c2VkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpICovXG4gIHNldCBpc0RhdGFzZXRJbml0aWFsaXplZChpc0luaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSBpc0luaXRpYWxpemVkO1xuICB9XG4gIHNldCBpc0RhdGFzZXRIaWVyYXJjaGljYWxJbml0aWFsaXplZChpc0luaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEYXRhc2V0SGllcmFyY2hpY2FsSW5pdGlhbGl6ZWQgPSBpc0luaXRpYWxpemVkO1xuICB9XG5cbiAgZ2V0IHJlZ2lzdGVyZWRSZXNvdXJjZXMoKTogRXh0ZXJuYWxSZXNvdXJjZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhbmd1bGFyVXRpbFNlcnZpY2U6IEFuZ3VsYXJVdGlsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXJTZXJ2aWNlOiBDb250YWluZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBlbG06IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNsYXRlclNlcnZpY2U6IFRyYW5zbGF0ZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2NvbmZpZycpIHByb3RlY3RlZCBmb3JSb290Q29uZmlnOiBHcmlkT3B0aW9uLFxuICAgIEBJbmplY3QoJ2V4dGVybmFsU2VydmljZScpIGV4dGVybmFsU2VydmljZXM6IEV4dGVybmFsVGVzdGluZ0RlcGVuZGVuY2llc1xuICApIHtcbiAgICBjb25zdCBzbGlja2dyaWRDb25maWcgPSBuZXcgU2xpY2tncmlkQ29uZmlnKCk7XG5cbiAgICAvLyBpbml0aWFsaXplIGFuZCBhc3NpZ24gYWxsIFNlcnZpY2UgRGVwZW5kZW5jaWVzXG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXZlbnRQdWJTdWJTZXJ2aWNlID8/IG5ldyBFdmVudFB1YlN1YlNlcnZpY2UodGhpcy5lbG0ubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmV2ZW50TmFtaW5nU3R5bGUgPSBFdmVudE5hbWluZ1N0eWxlLmNhbWVsQ2FzZTtcblxuICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uYmFja2VuZFV0aWxpdHlTZXJ2aWNlID8/IG5ldyBCYWNrZW5kVXRpbGl0eVNlcnZpY2UoKTtcbiAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncmlkRXZlbnRTZXJ2aWNlID8/IG5ldyBHcmlkRXZlbnRTZXJ2aWNlKCk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8uc2hhcmVkU2VydmljZSA/PyBuZXcgU2hhcmVkU2VydmljZSgpO1xuICAgIHRoaXMuY29sbGVjdGlvblNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5jb2xsZWN0aW9uU2VydmljZSA/PyBuZXcgQ29sbGVjdGlvblNlcnZpY2UodGhpcy50cmFuc2xhdGVyU2VydmljZSk7XG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5ID0gZXh0ZXJuYWxTZXJ2aWNlcz8uZXh0ZW5zaW9uVXRpbGl0eSA/PyBuZXcgRXh0ZW5zaW9uVXRpbGl0eSh0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlLCB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlKTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBuZXcgRmlsdGVyRmFjdG9yeShzbGlja2dyaWRDb25maWcsIHRoaXMudHJhbnNsYXRlclNlcnZpY2UsIHRoaXMuY29sbGVjdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuZmlsdGVyU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmZpbHRlclNlcnZpY2UgPz8gbmV3IEZpbHRlclNlcnZpY2UodGhpcy5maWx0ZXJGYWN0b3J5IGFzIGFueSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcbiAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8ucmVzaXplclNlcnZpY2UgPz8gbmV3IFJlc2l6ZXJTZXJ2aWNlKHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XG4gICAgdGhpcy5zb3J0U2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LnNvcnRTZXJ2aWNlID8/IG5ldyBTb3J0U2VydmljZSh0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5iYWNrZW5kVXRpbGl0eVNlcnZpY2UpO1xuICAgIHRoaXMudHJlZURhdGFTZXJ2aWNlID0gZXh0ZXJuYWxTZXJ2aWNlcz8udHJlZURhdGFTZXJ2aWNlID8/IG5ldyBUcmVlRGF0YVNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuc29ydFNlcnZpY2UpO1xuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5wYWdpbmF0aW9uU2VydmljZSA/PyBuZXcgUGFnaW5hdGlvblNlcnZpY2UodGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLCB0aGlzLnNoYXJlZFNlcnZpY2UsIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlKTtcblxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZSA9IGV4dGVybmFsU2VydmljZXM/LmV4dGVuc2lvblNlcnZpY2UgPz8gbmV3IEV4dGVuc2lvblNlcnZpY2UoXG4gICAgICB0aGlzLmV4dGVuc2lvblV0aWxpdHksXG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UsXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UsXG4gICAgICB0aGlzLnNvcnRTZXJ2aWNlLFxuICAgICAgdGhpcy50cmVlRGF0YVNlcnZpY2UsXG4gICAgICB0aGlzLnRyYW5zbGF0ZXJTZXJ2aWNlLFxuICAgICk7XG5cbiAgICB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncmlkU3RhdGVTZXJ2aWNlID8/IG5ldyBHcmlkU3RhdGVTZXJ2aWNlKHRoaXMuZXh0ZW5zaW9uU2VydmljZSwgdGhpcy5maWx0ZXJTZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy5zb3J0U2VydmljZSwgdGhpcy50cmVlRGF0YVNlcnZpY2UpO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncmlkU2VydmljZSA/PyBuZXcgR3JpZFNlcnZpY2UodGhpcy5ncmlkU3RhdGVTZXJ2aWNlLCB0aGlzLmZpbHRlclNlcnZpY2UsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5wYWdpbmF0aW9uU2VydmljZSwgdGhpcy5zaGFyZWRTZXJ2aWNlLCB0aGlzLnNvcnRTZXJ2aWNlLCB0aGlzLnRyZWVEYXRhU2VydmljZSk7XG4gICAgdGhpcy5ncm91cGluZ1NlcnZpY2UgPSBleHRlcm5hbFNlcnZpY2VzPy5ncm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlID8/IG5ldyBHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlKHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSwgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcblxuICAgIHRoaXMuc2VydmljZUxpc3QgPSBbXG4gICAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UsXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UsXG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2UsXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UsXG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLFxuICAgICAgdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLFxuICAgICAgdGhpcy5ncm91cGluZ1NlcnZpY2UsXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLFxuICAgICAgdGhpcy5yZXNpemVyU2VydmljZSxcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UsXG4gICAgICB0aGlzLnRyZWVEYXRhU2VydmljZSxcbiAgICBdO1xuXG4gICAgLy8gcmVnaXN0ZXIgYWxsIFNlcnZpY2UgaW5zdGFuY2VzIGluIHRoZSBjb250YWluZXJcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXh0ZW5zaW9uVXRpbGl0eScsIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0ZpbHRlclNlcnZpY2UnLCB0aGlzLmZpbHRlclNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdDb2xsZWN0aW9uU2VydmljZScsIHRoaXMuY29sbGVjdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdFeHRlbnNpb25TZXJ2aWNlJywgdGhpcy5leHRlbnNpb25TZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnR3JpZEV2ZW50U2VydmljZScsIHRoaXMuZ3JpZEV2ZW50U2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyaWRTZXJ2aWNlJywgdGhpcy5ncmlkU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ0dyaWRTdGF0ZVNlcnZpY2UnLCB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdHcm91cGluZ0FuZENvbHNwYW5TZXJ2aWNlJywgdGhpcy5ncm91cGluZ1NlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdQYWdpbmF0aW9uU2VydmljZScsIHRoaXMucGFnaW5hdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdSZXNpemVyU2VydmljZScsIHRoaXMucmVzaXplclNlcnZpY2UpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdTaGFyZWRTZXJ2aWNlJywgdGhpcy5zaGFyZWRTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnU29ydFNlcnZpY2UnLCB0aGlzLnNvcnRTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnRXZlbnRQdWJTdWJTZXJ2aWNlJywgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlKTtcbiAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UucmVnaXN0ZXJJbnN0YW5jZSgnUHViU3ViU2VydmljZScsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1RyYW5zbGF0ZXJTZXJ2aWNlJywgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XG4gICAgdGhpcy5jb250YWluZXJTZXJ2aWNlLnJlZ2lzdGVySW5zdGFuY2UoJ1RyZWVEYXRhU2VydmljZScsIHRoaXMudHJlZURhdGFTZXJ2aWNlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMgfHwgIXRoaXMuY29sdW1uRGVmaW5pdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNpbmcgYDxhbmd1bGFyLXNsaWNrZ3JpZD5gIHJlcXVpcmVzIFtncmlkT3B0aW9uc10gYW5kIFtjb2x1bW5EZWZpbml0aW9uc10sIGl0IHNlZW1zIHRoYXQgeW91IG1pZ2h0IGhhdmUgZm9yZ290IHRvIHByb3ZpZGUgdGhlbSBzaW5jZSBhdCBsZWFzdCBvZiB0aGVtIGlzIHVuZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICAvLyBzYXZlIHJlc291cmNlIHJlZnMgdG8gcmVnaXN0ZXIgYmVmb3JlIHRoZSBncmlkIG9wdGlvbnMgYXJlIG1lcmdlZCBhbmQgcG9zc2libHkgZGVlcCBjb3BpZWRcbiAgICAvLyBzaW5jZSBhIGRlZXAgY29weSBvZiBncmlkIG9wdGlvbnMgd291bGQgbG9zZSBvcmlnaW5hbCByZXNvdXJjZSByZWZzIGJ1dCB3ZSB3YW50IHRvIGtlZXAgdGhlbSBhcyBzaW5nbGV0b25cbiAgICBjb25zdCBleHRlbmRlZEdyaWRPcHRpb25zID0geyAuLi50aGlzLmZvclJvb3RDb25maWcsIC4uLnRoaXMuZ3JpZE9wdGlvbnMgfSBhcyBHcmlkT3B0aW9uO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMgPSBleHRlbmRlZEdyaWRPcHRpb25zPy5leHRlcm5hbFJlc291cmNlcyB8fCBleHRlbmRlZEdyaWRPcHRpb25zPy5yZWdpc3RlckV4dGVybmFsUmVzb3VyY2VzIHx8IFtdO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChleHRlbmRlZEdyaWRPcHRpb25zPy5yZWdpc3RlckV4dGVybmFsUmVzb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tBbmd1bGFyLVNsaWNrZ3JpZF0gUGxlYXNlIG5vdGUgdGhhdCB0aGUgZ3JpZCBvcHRpb24gYHJlZ2lzdGVyRXh0ZXJuYWxSZXNvdXJjZXNgIHdhcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciwgcGxlYXNlIHVzZSBgZXh0ZXJuYWxSZXNvdXJjZXNgIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXphdGlvbih0aGlzLl9ldmVudEhhbmRsZXIpO1xuICAgIHRoaXMuX2lzR3JpZEluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIC8vIHJlY2hlY2sgdGhlIGVtcHR5IHdhcm5pbmcgbWVzc2FnZSBhZnRlciBncmlkIGlzIHNob3duIHNvIHRoYXQgaXQgd29ya3MgaW4gZXZlcnkgdXNlIGNhc2VcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFzZXQpKSB7XG4gICAgICBjb25zdCBmaW5hbFRvdGFsQ291bnQgPSB0aGlzLmRhdGFzZXQubGVuZ3RoO1xuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25CZWZvcmVHcmlkRGVzdHJveScsIHRoaXMuc2xpY2tHcmlkKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25BZnRlckdyaWREZXN0cm95ZWQnLCB0cnVlKTtcbiAgfVxuXG4gIGRlc3Ryb3koc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyID0gZmFsc2UpIHtcbiAgICAvLyBkaXNwb3NlIG9mIGFsbCBTZXJ2aWNlc1xuICAgIHRoaXMuc2VydmljZUxpc3QuZm9yRWFjaCgoc2VydmljZTogYW55KSA9PiB7XG4gICAgICBpZiAoc2VydmljZSAmJiBzZXJ2aWNlLmRpc3Bvc2UpIHtcbiAgICAgICAgc2VydmljZS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2aWNlTGlzdCA9IFtdO1xuXG4gICAgLy8gZGlzcG9zZSBhbGwgcmVnaXN0ZXJlZCBleHRlcm5hbCByZXNvdXJjZXNcbiAgICB0aGlzLmRpc3Bvc2VFeHRlcm5hbFJlc291cmNlcygpO1xuXG4gICAgLy8gZGlzcG9zZSB0aGUgQ29tcG9uZW50c1xuICAgIHRoaXMuc2xpY2tFbXB0eVdhcm5pbmc/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNsaWNrRm9vdGVyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zbGlja1BhZ2luYXRpb24/LmRpc3Bvc2UoKTtcblxuICAgIGlmICh0aGlzLl9ldmVudEhhbmRsZXI/LnVuc3Vic2NyaWJlQWxsKSB7XG4gICAgICB0aGlzLl9ldmVudEhhbmRsZXIudW5zdWJzY3JpYmVBbGwoKTtcbiAgICB9XG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlPy51bnN1YnNjcmliZUFsbCgpO1xuICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7XG4gICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKFtdKTtcbiAgICAgIHRoaXMuZGF0YVZpZXcuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zbGlja0dyaWQ/LmRlc3Ryb3kpIHtcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmRlc3Ryb3koc2hvdWxkRW1wdHlEb21FbGVtZW50Q29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYWNrZW5kU2VydmljZUFwaSkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuYmFja2VuZFNlcnZpY2VBcGkpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpW3Byb3AgYXMga2V5b2YgQmFja2VuZFNlcnZpY2VBcGldO1xuICAgICAgfVxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZUFwaSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpKSB7XG4gICAgICAodGhpcy5jb2x1bW5EZWZpbml0aW9ucyBhcyBhbnkpW3Byb3BdID0gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoaXMuc2hhcmVkU2VydmljZSkpIHtcbiAgICAgICh0aGlzLnNoYXJlZFNlcnZpY2UgYXMgYW55KVtwcm9wXSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gd2UgY291bGQgb3B0aW9uYWxseSBhbHNvIGVtcHR5IHRoZSBjb250ZW50IG9mIHRoZSBncmlkIGNvbnRhaW5lciBET00gZWxlbWVudFxuICAgIGlmIChzaG91bGRFbXB0eURvbUVsZW1lbnRDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZW1wdHlHcmlkQ29udGFpbmVyRWxtKCk7XG4gICAgfVxuXG4gICAgLy8gYWxzbyB1bnN1YnNjcmliZSBhbGwgUnhKUyBzdWJzY3JpcHRpb25zXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gdW5zdWJzY3JpYmVBbGwodGhpcy5zdWJzY3JpcHRpb25zKTtcblxuICAgIHRoaXMuX2RhdGFzZXQgPSBudWxsO1xuICAgIHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IFtdO1xuICAgIHRoaXMuX2FuZ3VsYXJHcmlkSW5zdGFuY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2xpY2tHcmlkID0gdW5kZWZpbmVkIGFzIGFueTtcbiAgfVxuXG4gIGRpc3Bvc2VFeHRlcm5hbFJlc291cmNlcygpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzKSkge1xuICAgICAgd2hpbGUgKHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnBvcCgpO1xuICAgICAgICBpZiAocmVzPy5kaXNwb3NlKSB7XG4gICAgICAgICAgcmVzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzID0gW107XG4gIH1cblxuICBlbXB0eUdyaWRDb250YWluZXJFbG0oKSB7XG4gICAgY29uc3QgZ3JpZENvbnRhaW5lcklkID0gdGhpcy5ncmlkT3B0aW9ucz8uZ3JpZENvbnRhaW5lcklkID8/ICdncmlkMSc7XG4gICAgY29uc3QgZ3JpZENvbnRhaW5lckVsbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2dyaWRDb250YWluZXJJZH1gKTtcbiAgICBlbXB0eUVsZW1lbnQoZ3JpZENvbnRhaW5lckVsbSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIG91ciBpbnRlcm5hbCBQb3N0IFByb2Nlc3MgY2FsbGJhY2ssIGl0IHdpbGwgZXhlY3V0ZSBpbnRlcm5hbGx5IGFmdGVyIHdlIGdldCBiYWNrIHJlc3VsdCBmcm9tIHRoZSBQcm9jZXNzIGJhY2tlbmQgY2FsbFxuICAgKiBGb3Igbm93LCB0aGlzIGlzIEdyYXBoUUwgU2VydmljZSBPTkxZIGZlYXR1cmUgYW5kIGl0IHdpbGwgYmFzaWNhbGx5IHJlZnJlc2ggdGhlIERhdGFzZXQgJiBQYWdpbmF0aW9uIHdpdGhvdXQgaGF2aW5nIHRoZSB1c2VyIHRvIGNyZWF0ZSBoaXMgb3duIFBvc3RQcm9jZXNzIGV2ZXJ5IHRpbWVcbiAgICovXG4gIGNyZWF0ZUJhY2tlbmRBcGlJbnRlcm5hbFBvc3RQcm9jZXNzQ2FsbGJhY2soZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pIHtcbiAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XG4gICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaS5zZXJ2aWNlKSB7XG4gICAgICBjb25zdCBiYWNrZW5kQXBpU2VydmljZSA9IGJhY2tlbmRBcGkuc2VydmljZTtcblxuICAgICAgLy8gaW50ZXJuYWxQb3N0UHJvY2VzcyBvbmx5IHdvcmtzIChmb3Igbm93KSB3aXRoIGEgR3JhcGhRTCBTZXJ2aWNlLCBzbyBtYWtlIHN1cmUgaXQgaXMgb2YgdGhhdCB0eXBlXG4gICAgICBpZiAodHlwZW9mIGJhY2tlbmRBcGlTZXJ2aWNlLmdldERhdGFzZXROYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGJhY2tlbmRBcGkuaW50ZXJuYWxQb3N0UHJvY2VzcyA9IChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IChiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGlTZXJ2aWNlICYmIHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSA9PT0gJ2Z1bmN0aW9uJykgPyBiYWNrZW5kQXBpU2VydmljZS5nZXREYXRhc2V0TmFtZSgpIDogJyc7XG4gICAgICAgICAgaWYgKHByb2Nlc3NSZXN1bHQ/LmRhdGFbZGF0YXNldE5hbWVdKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcHJvY2Vzc1Jlc3VsdC5kYXRhW2RhdGFzZXROYW1lXS5oYXNPd25Qcm9wZXJ0eSgnbm9kZXMnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubm9kZXMgOiAocHJvY2Vzc1Jlc3VsdCBhcyBhbnkpLmRhdGFbZGF0YXNldE5hbWVdO1xuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IHByb2Nlc3NSZXN1bHQuZGF0YVtkYXRhc2V0TmFtZV0uaGFzT3duUHJvcGVydHkoJ3RvdGFsQ291bnQnKSA/IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0udG90YWxDb3VudCA6IChwcm9jZXNzUmVzdWx0IGFzIGFueSkuZGF0YVtkYXRhc2V0TmFtZV0ubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoZGF0YSwgdG90YWxDb3VudCB8fCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6YXRpb24oZXZlbnRIYW5kbGVyOiBTbGlja0V2ZW50SGFuZGxlcikge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMudHJhbnNsYXRlciA9IHRoaXMudHJhbnNsYXRlclNlcnZpY2U7XG4gICAgdGhpcy5fZXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyO1xuXG4gICAgLy8gd2hlbiBkZXRlY3RpbmcgYSBmcm96ZW4gZ3JpZCwgd2UnbGwgYXV0b21hdGljYWxseSBlbmFibGUgdGhlIG1vdXNld2hlZWwgc2Nyb2xsIGhhbmRsZXIgc28gdGhhdCB3ZSBjYW4gc2Nyb2xsIGZyb20gYm90aCBsZWZ0L3JpZ2h0IGZyb3plbiBjb250YWluZXJzXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgKCh0aGlzLmdyaWRPcHRpb25zLmZyb3plblJvdyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuUm93ID49IDApIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gPj0gMCkgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVNb3VzZVdoZWVsU2Nyb2xsSGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZU1vdXNlV2hlZWxTY3JvbGxIYW5kbGVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZXZlbnROYW1pbmdTdHlsZSA9IHRoaXMuZ3JpZE9wdGlvbnM/LmV2ZW50TmFtaW5nU3R5bGUgPz8gRXZlbnROYW1pbmdTdHlsZS5jYW1lbENhc2U7XG4gICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uQmVmb3JlR3JpZENyZWF0ZScsIHRydWUpO1xuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBkYXRhc2V0IGlzIGluaXRpYWxpemVkIChpZiBub3QgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB0aGF0IGl0IGNhbm5vdCBnZXRMZW5ndGggb2YgbnVsbClcbiAgICB0aGlzLl9kYXRhc2V0ID0gdGhpcy5fZGF0YXNldCB8fCBbXTtcbiAgICB0aGlzLmdyaWRPcHRpb25zID0gdGhpcy5tZXJnZUdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zID0gdGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbjtcbiAgICB0aGlzLmxvY2FsZXMgPSB0aGlzLmdyaWRPcHRpb25zPy5sb2NhbGVzID8/IENvbnN0YW50cy5sb2NhbGVzO1xuICAgIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkgPSB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaTtcbiAgICB0aGlzLl9pc0xvY2FsR3JpZCA9ICF0aGlzLmJhY2tlbmRTZXJ2aWNlQXBpOyAvLyBjb25zaWRlcmVkIGEgbG9jYWwgZ3JpZCBpZiBpdCBkb2Vzbid0IGhhdmUgYSBiYWNrZW5kIHNlcnZpY2Ugc2V0XG5cbiAgICB0aGlzLmNyZWF0ZUJhY2tlbmRBcGlJbnRlcm5hbFBvc3RQcm9jZXNzQ2FsbGJhY2sodGhpcy5ncmlkT3B0aW9ucyk7XG5cbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcbiAgICAgIGNvbnN0IGRhdGF2aWV3SW5saW5lRmlsdGVycyA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcgJiYgdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5pbmxpbmVGaWx0ZXJzIHx8IGZhbHNlO1xuICAgICAgbGV0IGRhdGFWaWV3T3B0aW9uczogRGF0YVZpZXdPcHRpb24gPSB7IGlubGluZUZpbHRlcnM6IGRhdGF2aWV3SW5saW5lRmlsdGVycyB9O1xuXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kcmFnZ2FibGVHcm91cGluZyB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUdyb3VwaW5nKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBJdGVtTWV0YWRhdGFQcm92aWRlciA9IG5ldyBTbGlja0dyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgPSB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXI7XG4gICAgICAgIGRhdGFWaWV3T3B0aW9ucyA9IHsgLi4uZGF0YVZpZXdPcHRpb25zLCBncm91cEl0ZW1NZXRhZGF0YVByb3ZpZGVyOiB0aGlzLmdyb3VwSXRlbU1ldGFkYXRhUHJvdmlkZXIgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgU2xpY2suRGF0YS5EYXRhVmlldyhkYXRhVmlld09wdGlvbnMpO1xuICAgICAgdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLnB1Ymxpc2goJ29uRGF0YXZpZXdDcmVhdGVkJywgdGhpcy5kYXRhVmlldyk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwb3NzaWJsZSBTZXJ2aWNlcyB0aGF0IHVzZXIgd2FudCB0byByZWdpc3RlciB3aGljaCBkb24ndCByZXF1aXJlIFNsaWNrR3JpZCB0byBiZSBpbnN0YW50aWF0ZWRcbiAgICAvLyBSeEpTIFJlc291cmNlIGlzIGluIHRoaXMgbG90IGJlY2F1c2UgaXQgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgYW5kIGRvZXNuJ3QgcmVxdWlyZSBTbGlja0dyaWQgdG8gYmUgaW5pdGlhbGl6ZWRcbiAgICB0aGlzLnByZVJlZ2lzdGVyUmVzb3VyY2VzKCk7XG5cbiAgICAvLyBmb3IgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIsIHdlIHByb3ZpZGUgdGhlIHByb3BlcnR5IFwiZWRpdG9yXCIgYXMgYW4gQW5ndWxhci1TbGlja2dyaWQgZWRpdG9yIGNvbXBsZXggb2JqZWN0XG4gICAgLy8gaG93ZXZlciBcImVkaXRvclwiIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTbGlja0dyaWQgZm9yIGl0J3Mgb3duIEVkaXRvciBGYWN0b3J5XG4gICAgLy8gc28gaW4gb3VyIGxpYiB3ZSB3aWxsIHN3YXAgXCJlZGl0b3JcIiBhbmQgY29weSBpdCBpbnRvIGEgbmV3IHByb3BlcnR5IGNhbGxlZCBcImludGVybmFsQ29sdW1uRWRpdG9yXCJcbiAgICAvLyB0aGVuIHRha2UgYmFjayBcImVkaXRvci5tb2RlbFwiIGFuZCBtYWtlIGl0IHRoZSBuZXcgXCJlZGl0b3JcIiBzbyB0aGF0IFNsaWNrR3JpZCBFZGl0b3IgRmFjdG9yeSBzdGlsbCB3b3Jrc1xuICAgIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zID0gdGhpcy5zd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xuXG4gICAgLy8gaWYgdGhlIHVzZXIgd2FudHMgdG8gYXV0b21hdGljYWxseSBhZGQgYSBDdXN0b20gRWRpdG9yIEZvcm1hdHRlciwgd2UgbmVlZCB0byBjYWxsIHRoZSBhdXRvIGFkZCBmdW5jdGlvbiBhZ2FpblxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpIHtcbiAgICAgIGF1dG9BZGRFZGl0b3JGb3JtYXR0ZXJUb0NvbHVtbnNXaXRoRWRpdG9yKHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zLmF1dG9BZGRDdXN0b21FZGl0b3JGb3JtYXR0ZXIpO1xuICAgIH1cblxuICAgIC8vIHNhdmUgcmVmZXJlbmNlIGZvciBhbGwgY29sdW1ucyBiZWZvcmUgdGhleSBvcHRpb25hbGx5IGJlY29tZSBoaWRkZW4vdmlzaWJsZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG5cbiAgICAvLyBiZWZvcmUgY2VydGFpbiBleHRlbnRpb25zL3BsdWdpbnMgcG90ZW50aWFsbHkgYWRkcyBleHRyYSBjb2x1bW5zIG5vdCBjcmVhdGVkIGJ5IHRoZSB1c2VyIGl0c2VsZiAoUm93TW92ZSwgUm93RGV0YWlsLCBSb3dTZWxlY3Rpb25zKVxuICAgIC8vIHdlJ2xsIHN1YnNjcmliZSB0byB0aGUgZXZlbnQgYW5kIHB1c2ggYmFjayB0aGUgY2hhbmdlIHRvIHRoZSB1c2VyIHNvIHRoZXkgYWx3YXlzIHVzZSBmdWxsIGNvbHVtbiBkZWZzIGFycmF5IGluY2x1ZGluZyBleHRyYSBjb2xzXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlPHsgY29sdW1uczogQ29sdW1uW107IGdyaWQ6IFNsaWNrR3JpZDsgfT4oJ29uUGx1Z2luQ29sdW1uc0NoYW5nZWQnLCBkYXRhID0+IHtcbiAgICAgICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSBkYXRhLmNvbHVtbnM7XG4gICAgICAgIHRoaXMuY29sdW1uRGVmaW5pdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBhZnRlciBzdWJzY3JpYmluZyB0byBwb3RlbnRpYWwgY29sdW1ucyBjaGFuZ2VkLCB3ZSBhcmUgcmVhZHkgdG8gY3JlYXRlIHRoZXNlIG9wdGlvbmFsIGV4dGVuc2lvbnNcbiAgICAvLyB3aGVuIHdlIGRpZCBmaW5kIHNvbWUgdG8gY3JlYXRlIChSb3dNb3ZlLCBSb3dEZXRhaWwsIFJvd1NlbGVjdGlvbnMpLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgbW9kaWZ5IGNvbHVtbiBkZWZpbml0aW9ucyAoYnkgcHJldmlvdXMgc3Vic2NyaWJlKVxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5jcmVhdGVFeHRlbnNpb25zQmVmb3JlR3JpZENyZWF0aW9uKHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcblxuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIFBpbm5pbmcvRnJvemVuIFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIGFwcGx5IHRoZW0gaW4gdGhlIGdyaWQgb3B0aW9uc1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHM/LnBpbm5pbmcpIHtcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSB7IC4uLnRoaXMuZ3JpZE9wdGlvbnMsIC4uLnRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5waW5uaW5nIH07XG4gICAgfVxuXG4gICAgLy8gYnVpbGQgU2xpY2tHcmlkIEdyaWQsIGFsc28gdXNlciBtaWdodCBvcHRpb25hbGx5IHBhc3MgYSBjdXN0b20gZGF0YXZpZXcgKGUuZy4gcmVtb3RlIG1vZGVsKVxuICAgIHRoaXMuc2xpY2tHcmlkID0gbmV3IFNsaWNrLkdyaWQoYCMke3RoaXMuZ3JpZElkfWAsIHRoaXMuY3VzdG9tRGF0YVZpZXcgfHwgdGhpcy5kYXRhVmlldywgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMsIHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5kYXRhVmlldyA9IHRoaXMuZGF0YVZpZXc7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNsaWNrR3JpZCA9IHRoaXMuc2xpY2tHcmlkO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5ncmlkQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XG5cbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYmluZERpZmZlcmVudEV4dGVuc2lvbnMoKTtcbiAgICB0aGlzLmJpbmREaWZmZXJlbnRIb29rcyh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucywgdGhpcy5kYXRhVmlldyk7XG5cbiAgICAvLyB3aGVuIGl0J3MgYSBmcm96ZW4gZ3JpZCwgd2UgbmVlZCB0byBrZWVwIHRoZSBmcm96ZW4gY29sdW1uIGlkIGZvciByZWZlcmVuY2UgaWYgd2UgZXZlciBzaG93L2hpZGUgY29sdW1uIGZyb20gQ29sdW1uUGlja2VyL0dyaWRNZW51IGFmdGVyd2FyZFxuICAgIGNvbnN0IGZyb3plbkNvbHVtbkluZGV4ID0gdGhpcy5ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW4gIT09IHVuZGVmaW5lZCA/IHRoaXMuZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1uIDogLTE7XG4gICAgaWYgKGZyb3plbkNvbHVtbkluZGV4ID49IDAgJiYgZnJvemVuQ29sdW1uSW5kZXggPD0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZnJvemVuVmlzaWJsZUNvbHVtbklkID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnNbZnJvemVuQ29sdW1uSW5kZXhdLmlkIHx8ICcnO1xuICAgIH1cblxuICAgIC8vIGdldCBhbnkgcG9zc2libGUgU2VydmljZXMgdGhhdCB1c2VyIHdhbnQgdG8gcmVnaXN0ZXJcbiAgICB0aGlzLnJlZ2lzdGVyUmVzb3VyY2VzKCk7XG5cbiAgICAvLyBpbml0aWFsaXplIHRoZSBTbGlja0dyaWQgZ3JpZFxuICAgIHRoaXMuc2xpY2tHcmlkLmluaXQoKTtcblxuICAgIC8vIGluaXRpYWxpemVkIHRoZSByZXNpemVyIHNlcnZpY2Ugb25seSBhZnRlciBTbGlja0dyaWQgaXMgaW5pdGlhbGl6ZWRcbiAgICAvLyBpZiB3ZSBkb24ndCB3ZSBlbmQgdXAgYmluZGluZyBvdXIgcmVzaXplIHRvIGEgZ3JpZCBlbGVtZW50IHRoYXQgZG9lc24ndCB5ZXQgZXhpc3QgaW4gdGhlIERPTSBhbmQgdGhlIHJlc2l6ZXIgc2VydmljZSB3aWxsIGZhaWwgc2lsZW50bHkgKGJlY2F1c2UgaXQgaGFzIGEgdHJ5L2NhdGNoIHRoYXQgdW5iaW5kcyB0aGUgcmVzaXplIHdpdGhvdXQgdGhyb3dpbmcgYmFjaylcbiAgICBpZiAodGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudCkge1xuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5pbml0KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRDb250YWluZXJFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyB1c2VyIGNvdWxkIHNob3cgYSBjdXN0b20gZm9vdGVyIHdpdGggdGhlIGRhdGEgbWV0cmljcyAoZGF0YXNldCBsZW5ndGggYW5kIGxhc3QgdXBkYXRlZCB0aW1lc3RhbXApXG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gJiYgdGhpcy5ncmlkT3B0aW9ucy5zaG93Q3VzdG9tRm9vdGVyICYmIHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tRm9vdGVyT3B0aW9ucyAmJiB0aGlzLmdyaWRDb250YWluZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLnNsaWNrRm9vdGVyID0gbmV3IFNsaWNrRm9vdGVyQ29tcG9uZW50KHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zLmN1c3RvbUZvb3Rlck9wdGlvbnMsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XG4gICAgICB0aGlzLnNsaWNrRm9vdGVyLnJlbmRlckZvb3Rlcih0aGlzLmdyaWRDb250YWluZXJFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldykge1xuICAgICAgLy8gbG9hZCB0aGUgZGF0YSBpbiB0aGUgRGF0YVZpZXcgKHVubGVzcyBpdCdzIGEgaGllcmFyY2hpY2FsIGRhdGFzZXQsIGlmIHNvIGl0IHdpbGwgYmUgbG9hZGVkIGFmdGVyIHRoZSBpbml0aWFsIHRyZWUgc29ydClcbiAgICAgIGNvbnN0IGluaXRpYWxEYXRhc2V0ID0gdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlVHJlZURhdGEgPyB0aGlzLnNvcnRUcmVlRGF0YXNldCh0aGlzLl9kYXRhc2V0KSA6IHRoaXMuX2RhdGFzZXQ7XG4gICAgICB0aGlzLmRhdGFWaWV3LmJlZ2luVXBkYXRlKCk7XG4gICAgICB0aGlzLmRhdGFWaWV3LnNldEl0ZW1zKGluaXRpYWxEYXRhc2V0IHx8IFtdLCB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSA/PyAnaWQnKTtcbiAgICAgIHRoaXMuZGF0YVZpZXcuZW5kVXBkYXRlKCk7XG5cbiAgICAgIC8vIGlmIHlvdSBkb24ndCB3YW50IHRoZSBpdGVtcyB0aGF0IGFyZSBub3QgdmlzaWJsZSAoZHVlIHRvIGJlaW5nIGZpbHRlcmVkIG91dCBvciBiZWluZyBvbiBhIGRpZmZlcmVudCBwYWdlKVxuICAgICAgLy8gdG8gc3RheSBzZWxlY3RlZCwgcGFzcyAnZmFsc2UnIHRvIHRoZSBzZWNvbmQgYXJnXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQ/LmdldFNlbGVjdGlvbk1vZGVsKCkgJiYgdGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmRhdGFWaWV3ICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaGFzT3duUHJvcGVydHkoJ3N5bmNHcmlkU2VsZWN0aW9uJykpIHtcbiAgICAgICAgLy8gaWYgd2UgYXJlIHVzaW5nIGEgQmFja2VuZCBTZXJ2aWNlLCB3ZSB3aWxsIGRvIGFuIGV4dHJhIGZsYWcgY2hlY2ssIHRoZSByZWFzb24gaXMgYmVjYXVzZSBpdCBtaWdodCBoYXZlIHNvbWUgdW5pbnRlbmRlZCBiZWhhdmlvcnNcbiAgICAgICAgLy8gd2l0aCB0aGUgQmFja2VuZFNlcnZpY2VBcGkgYmVjYXVzZSB0ZWNobmljYWxseSB0aGUgZGF0YSBpbiB0aGUgcGFnZSBjaGFuZ2VzIHRoZSBEYXRhVmlldyBvbiBldmVyeSBwYWdlIGNoYW5nZS5cbiAgICAgICAgbGV0IHByZXNlcnZlZFJvd1NlbGVjdGlvbldpdGhCYWNrZW5kID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmIHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuaGFzT3duUHJvcGVydHkoJ3N5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlJykpIHtcbiAgICAgICAgICBwcmVzZXJ2ZWRSb3dTZWxlY3Rpb25XaXRoQmFja2VuZCA9IHRoaXMuZ3JpZE9wdGlvbnMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb25XaXRoQmFja2VuZFNlcnZpY2UgYXMgYm9vbGVhbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN5bmNHcmlkU2VsZWN0aW9uID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhVmlldy5zeW5jR3JpZFNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHR5cGVvZiBzeW5jR3JpZFNlbGVjdGlvbiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbGV0IHByZXNlcnZlZFJvd1NlbGVjdGlvbiA9IHN5bmNHcmlkU2VsZWN0aW9uO1xuICAgICAgICAgIGlmICghdGhpcy5faXNMb2NhbEdyaWQpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gdXNpbmcgQmFja2VuZFNlcnZpY2VBcGksIHdlJ2xsIGJlIHVzaW5nIHRoZSBcInN5bmNHcmlkU2VsZWN0aW9uV2l0aEJhY2tlbmRTZXJ2aWNlXCIgZmxhZyBCVVQgXCJzeW5jR3JpZFNlbGVjdGlvblwiIG11c3QgYWxzbyBiZSBzZXQgdG8gVHJ1ZVxuICAgICAgICAgICAgcHJlc2VydmVkUm93U2VsZWN0aW9uID0gc3luY0dyaWRTZWxlY3Rpb24gJiYgcHJlc2VydmVkUm93U2VsZWN0aW9uV2l0aEJhY2tlbmQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb24odGhpcy5zbGlja0dyaWQsIHByZXNlcnZlZFJvd1NlbGVjdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN5bmNHcmlkU2VsZWN0aW9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc3luY0dyaWRTZWxlY3Rpb24odGhpcy5zbGlja0dyaWQsIHN5bmNHcmlkU2VsZWN0aW9uLnByZXNlcnZlSGlkZGVuLCBzeW5jR3JpZFNlbGVjdGlvbi5wcmVzZXJ2ZUhpZGRlbk9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TG4gPSB0aGlzLmRhdGFWaWV3LmdldExlbmd0aCgpIHx8IHRoaXMuX2RhdGFzZXQgJiYgdGhpcy5fZGF0YXNldC5sZW5ndGggfHwgMDtcbiAgICAgIGlmIChkYXRhc2V0TG4gPiAwKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgJiYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3RvciB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbikpIHtcbiAgICAgICAgICB0aGlzLmxvYWRSb3dTZWxlY3Rpb25QcmVzZXRXaGVuRXhpc3RzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHVzZXIgbWlnaHQgd2FudCB0byBoaWRlIHRoZSBoZWFkZXIgcm93IG9uIHBhZ2UgbG9hZCBidXQgc3RpbGwgaGF2ZSBgZW5hYmxlRmlsdGVyaW5nOiB0cnVlYFxuICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHdlIG5lZWQgdG8gaGlkZSB0aGUgaGVhZGVyUm93IE9OTFkgQUZURVIgYWxsIGZpbHRlcnMgZ290IGNyZWF0ZWQgJiBkYXRhVmlldyBleGlzdFxuICAgIGlmICh0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCkge1xuICAgICAgdGhpcy5zaG93SGVhZGVyUm93KGZhbHNlKTtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkO1xuICAgIH1cblxuICAgIC8vIHB1Ymxpc2ggJiBkaXNwYXRjaCBjZXJ0YWluIGV2ZW50c1xuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkdyaWRDcmVhdGVkJywgdGhpcy5zbGlja0dyaWQpO1xuXG4gICAgLy8gYWZ0ZXIgdGhlIERhdGFWaWV3IGlzIGNyZWF0ZWQgJiB1cGRhdGVkIGV4ZWN1dGUgc29tZSBwcm9jZXNzZXNcbiAgICBpZiAoIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcbiAgICAgIHRoaXMuZXhlY3V0ZUFmdGVyRGF0YXZpZXdDcmVhdGVkKHRoaXMuc2xpY2tHcmlkLCB0aGlzLmdyaWRPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBiaW5kIHJlc2l6ZSBPTkxZIGFmdGVyIHRoZSBkYXRhVmlldyBpcyByZWFkeVxuICAgIHRoaXMuYmluZFJlc2l6ZUhvb2sodGhpcy5zbGlja0dyaWQsIHRoaXMuZ3JpZE9wdGlvbnMpO1xuXG4gICAgLy8gYmluZCB0aGUgQmFja2VuZCBTZXJ2aWNlIEFQSSBjYWxsYmFjayBmdW5jdGlvbnMgb25seSBhZnRlciB0aGUgZ3JpZCBpcyBpbml0aWFsaXplZFxuICAgIC8vIGJlY2F1c2UgdGhlIHByZVByb2Nlc3MoKSBhbmQgb25Jbml0KCkgbWlnaHQgZ2V0IHRyaWdnZXJlZFxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSkge1xuICAgICAgdGhpcy5iaW5kQmFja2VuZENhbGxiYWNrRnVuY3Rpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIGxvY2FsIGdyaWQsIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyB0aGUgUGFnaW5hdGlvblxuICAgIC8vIGlmIHNvIHRoZW4gYWxzbyBjaGVjayBpZiB0aGVyZSdzIGFueSBwcmVzZXRzIGFuZCBmaW5hbGx5IGluaXRpYWxpemUgdGhlIFBhZ2luYXRpb25TZXJ2aWNlXG4gICAgLy8gYSBsb2NhbCBncmlkIHdpdGggUGFnaW5hdGlvbiBwcmVzZXRzIHdpbGwgcG90ZW50aWFsbHkgaGF2ZSBhIGRpZmZlcmVudCB0b3RhbCBvZiBpdGVtcywgd2UnbGwgbmVlZCB0byBnZXQgaXQgZnJvbSB0aGUgRGF0YVZpZXcgYW5kIHVwZGF0ZSBvdXIgdG90YWxcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLl9pc0xvY2FsR3JpZCkge1xuICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRMb2NhbEdyaWRQYWdpbmF0aW9uKHRoaXMuZGF0YXNldCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYW5ndWxhckdyaWRJbnN0YW5jZXMgPSB7XG4gICAgICAvLyBTbGljayBHcmlkICYgRGF0YVZpZXcgb2JqZWN0c1xuICAgICAgZGF0YVZpZXc6IHRoaXMuZGF0YVZpZXcsXG4gICAgICBzbGlja0dyaWQ6IHRoaXMuc2xpY2tHcmlkLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25TZXJ2aWNlPy5leHRlbnNpb25MaXN0LFxuXG4gICAgICAvLyBwdWJsaWMgbWV0aG9kc1xuICAgICAgZGVzdHJveTogdGhpcy5kZXN0cm95LmJpbmQodGhpcyksXG5cbiAgICAgIC8vIHJldHVybiBhbGwgYXZhaWxhYmxlIFNlcnZpY2VzIChub24tc2luZ2xldG9uKVxuICAgICAgYmFja2VuZFNlcnZpY2U6IHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpPy5zZXJ2aWNlLFxuICAgICAgZXZlbnRQdWJTdWJTZXJ2aWNlOiB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsXG4gICAgICBmaWx0ZXJTZXJ2aWNlOiB0aGlzLmZpbHRlclNlcnZpY2UsXG4gICAgICBncmlkRXZlbnRTZXJ2aWNlOiB0aGlzLmdyaWRFdmVudFNlcnZpY2UsXG4gICAgICBncmlkU3RhdGVTZXJ2aWNlOiB0aGlzLmdyaWRTdGF0ZVNlcnZpY2UsXG4gICAgICBncmlkU2VydmljZTogdGhpcy5ncmlkU2VydmljZSxcbiAgICAgIGdyb3VwaW5nU2VydmljZTogdGhpcy5ncm91cGluZ1NlcnZpY2UsXG4gICAgICBleHRlbnNpb25TZXJ2aWNlOiB0aGlzLmV4dGVuc2lvblNlcnZpY2UsXG4gICAgICBwYWdpbmF0aW9uU2VydmljZTogdGhpcy5wYWdpbmF0aW9uU2VydmljZSxcbiAgICAgIHJlc2l6ZXJTZXJ2aWNlOiB0aGlzLnJlc2l6ZXJTZXJ2aWNlLFxuICAgICAgc29ydFNlcnZpY2U6IHRoaXMuc29ydFNlcnZpY2UsXG4gICAgICB0cmVlRGF0YVNlcnZpY2U6IHRoaXMudHJlZURhdGFTZXJ2aWNlLFxuICAgIH07XG5cbiAgICAvLyBhbGwgaW5zdGFuY2VzIChTbGlja0dyaWQsIERhdGFWaWV3ICYgYWxsIFNlcnZpY2VzKVxuICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkFuZ3VsYXJHcmlkQ3JlYXRlZCcsIHRoaXMuX2FuZ3VsYXJHcmlkSW5zdGFuY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBhIFBhZ2luYXRpb24gY2hhbmdlZCwgd2Ugd2lsbCB0cmlnZ2VyIGEgR3JpZCBTdGF0ZSBjaGFuZ2VkIHdpdGggdGhlIG5ldyBwYWdpbmF0aW9uIGluZm9cbiAgICogQWxzbyBpZiB3ZSB1c2UgUm93IFNlbGVjdGlvbiBvciB0aGUgQ2hlY2tib3ggU2VsZWN0b3Igd2l0aCBhIEJhY2tlbmQgU2VydmljZSAoT2RhdGEsIEdyYXBoUUwpLCB3ZSBuZWVkIHRvIHJlc2V0IGFueSBzZWxlY3Rpb25cbiAgICovXG4gIHBhZ2luYXRpb25DaGFuZ2VkKHBhZ2luYXRpb246IFNlcnZpY2VQYWdpbmF0aW9uKSB7XG4gICAgY29uc3QgaXNTeW5jR3JpZFNlbGVjdGlvbkVuYWJsZWQgPSB0aGlzLmdyaWRTdGF0ZVNlcnZpY2U/Lm5lZWRUb1ByZXNlcnZlUm93U2VsZWN0aW9uKCkgPz8gZmFsc2U7XG4gICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmICFpc1N5bmNHcmlkU2VsZWN0aW9uRW5hYmxlZCAmJiB0aGlzLmdyaWRPcHRpb25zPy5iYWNrZW5kU2VydmljZUFwaSAmJiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yKSkge1xuICAgICAgdGhpcy5zbGlja0dyaWQuc2V0U2VsZWN0ZWRSb3dzKFtdKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9ID0gcGFnaW5hdGlvbjtcbiAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlKSB7XG4gICAgICBpZiAocGFnZVNpemUgIT09IHVuZGVmaW5lZCAmJiBwYWdlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmN1cnJlbnRQYWdpbmF0aW9uID0geyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UucHVibGlzaCgnb25HcmlkU3RhdGVDaGFuZ2VkJywge1xuICAgICAgY2hhbmdlOiB7IG5ld1ZhbHVlczogeyBwYWdlTnVtYmVyLCBwYWdlU2l6ZSB9LCB0eXBlOiBHcmlkU3RhdGVUeXBlLnBhZ2luYXRpb24gfSxcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEN1cnJlbnRHcmlkU3RhdGUoKVxuICAgIH0pO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBkYXRhc2V0IGNoYW5nZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgZW50aXJlIGdyaWQgVUkgJiBwb3NzaWJseSByZXNpemUgaXQgYXMgd2VsbFxuICAgKiBAcGFyYW0gZGF0YXNldFxuICAgKi9cbiAgcmVmcmVzaEdyaWREYXRhKGRhdGFzZXQ6IGFueVtdLCB0b3RhbENvdW50PzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVFbXB0eURhdGFXYXJuaW5nTWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KGRhdGFzZXQpKSB7XG4gICAgICBjb25zdCBmaW5hbFRvdGFsQ291bnQgPSB0b3RhbENvdW50IHx8IGRhdGFzZXQubGVuZ3RoO1xuICAgICAgdGhpcy5kaXNwbGF5RW1wdHlEYXRhV2FybmluZyhmaW5hbFRvdGFsQ291bnQgPCAxKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhc2V0KSAmJiB0aGlzLnNsaWNrR3JpZCAmJiB0aGlzLmRhdGFWaWV3Py5zZXRJdGVtcykge1xuICAgICAgdGhpcy5kYXRhVmlldy5zZXRJdGVtcyhkYXRhc2V0LCB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSA/PyAnaWQnKTtcbiAgICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSAmJiAhdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVUcmVlRGF0YSkge1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnJlU29ydCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YXNldC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNEYXRhc2V0SW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRGaWx0ZXJQcmVzZXRzV2hlbkRhdGFzZXRJbml0aWFsaXplZCgpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5sb2FkUm93U2VsZWN0aW9uUHJlc2V0V2hlbkV4aXN0cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0RhdGFzZXRJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhc2V0KSB7XG4gICAgICAgIHRoaXMuc2xpY2tHcmlkLmludmFsaWRhdGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gZGlzcGxheSB0aGUgUGFnaW5hdGlvbiBjb21wb25lbnQgb25seSBhZnRlciBjYWxsaW5nIHRoaXMgcmVmcmVzaCBkYXRhIGZpcnN0LCB3ZSBjYWxsIGl0IGhlcmUgc28gdGhhdCBpZiB3ZSBwcmVzZXQgcGFnaW5hdGlvbiBwYWdlIG51bWJlciBpdCB3aWxsIGJlIHNob3duIGNvcnJlY3RseVxuICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9ICh0aGlzLmdyaWRPcHRpb25zICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgKHRoaXMuZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uID09PSB1bmRlZmluZWQpKSkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnM/LmJhY2tlbmRTZXJ2aWNlQXBpKSB7XG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25PcHRpb25zID0gdGhpcy5zZXRQYWdpbmF0aW9uT3B0aW9uc1doZW5QcmVzZXREZWZpbmVkKHRoaXMuZ3JpZE9wdGlvbnMsIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zIGFzIFBhZ2luYXRpb24pO1xuICAgICAgICAvLyB3aGVuIHdlIGhhdmUgYSB0b3RhbENvdW50IHVzZSBpdCwgZWxzZSB3ZSdsbCB0YWtlIGl0IGZyb20gdGhlIHBhZ2luYXRpb24gb2JqZWN0XG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0b3RhbCBpdGVtcyBpZiBpdCdzIGRpZmZlcmVudCB0byBhdm9pZCByZWZyZXNoaW5nIHRoZSBVSVxuICAgICAgICBjb25zdCB0b3RhbFJlY29yZHMgPSAodG90YWxDb3VudCAhPT0gdW5kZWZpbmVkKSA/IHRvdGFsQ291bnQgOiAodGhpcy5ncmlkT3B0aW9ucz8ucGFnaW5hdGlvbj8udG90YWxJdGVtcyk7XG4gICAgICAgIGlmICh0b3RhbFJlY29yZHMgIT09IHVuZGVmaW5lZCAmJiB0b3RhbFJlY29yZHMgIT09IHRoaXMudG90YWxJdGVtcykge1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9ICt0b3RhbFJlY29yZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2Ugd2l0aCBuZXcgcGFnaW5hdGlvbiBvcHRpb25zICh3aGljaCBtaWdodCBoYXZlIHByZXNldHMpXG4gICAgICAgIGlmICghdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVQYWdpbmF0aW9uU2VydmljZShwYWdpbmF0aW9uT3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBwYWdpbmF0aW9uIHNlcnZpY2Ugd2l0aCB0aGUgbmV3IHRvdGFsXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVUb3RhbEl0ZW1zKHRoaXMudG90YWxJdGVtcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmVzaXplIHRoZSBncmlkIGluc2lkZSBhIHNsaWdodCB0aW1lb3V0LCBpbiBjYXNlIG90aGVyIERPTSBlbGVtZW50IGNoYW5nZWQgcHJpb3IgdG8gdGhlIHJlc2l6ZSAobGlrZSBhIGZpbHRlci9wYWdpbmF0aW9uIGNoYW5nZWQpXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVBdXRvUmVzaXplKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5ncmlkT3B0aW9ucy5hdXRvUmVzaXplICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1Jlc2l6ZS5kZWxheTtcbiAgICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKGRlbGF5IHx8IDEwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUncyBhbnkgUGFnaW5hdGlvbiBQcmVzZXRzIGRlZmluZWQgaW4gdGhlIEdyaWQgT3B0aW9ucyxcbiAgICogaWYgdGhlcmUgYXJlIHRoZW4gbG9hZCB0aGVtIGluIHRoZSBwYWdpbmF0aW9uT3B0aW9ucyBvYmplY3RcbiAgICovXG4gIHNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24sIHBhZ2luYXRpb25PcHRpb25zOiBQYWdpbmF0aW9uKTogUGFnaW5hdGlvbiB7XG4gICAgaWYgKGdyaWRPcHRpb25zLnByZXNldHM/LnBhZ2luYXRpb24gJiYgcGFnaW5hdGlvbk9wdGlvbnMgJiYgIXRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkKSB7XG4gICAgICBwYWdpbmF0aW9uT3B0aW9ucy5wYWdlU2l6ZSA9IGdyaWRPcHRpb25zLnByZXNldHMucGFnaW5hdGlvbi5wYWdlU2l6ZTtcbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLnBhZ2VOdW1iZXIgPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24ucGFnZU51bWJlcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2luYXRpb25PcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIER5bmFtaWNhbGx5IGNoYW5nZSBvciB1cGRhdGUgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBsaXN0LlxuICAgKiBXZSB3aWxsIHJlLXJlbmRlciB0aGUgZ3JpZCBzbyB0aGF0IHRoZSBuZXcgaGVhZGVyIGFuZCBkYXRhIHNob3dzIHVwIGNvcnJlY3RseS5cbiAgICogSWYgdXNpbmcgaTE4biwgd2UgYWxzbyBuZWVkIHRvIHRyaWdnZXIgYSByZS10cmFuc2xhdGUgb2YgdGhlIGNvbHVtbiBoZWFkZXJzXG4gICAqL1xuICB1cGRhdGVDb2x1bW5EZWZpbml0aW9uc0xpc3QobmV3Q29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XG4gICAgLy8gbWFwL3N3YXAgdGhlIGludGVybmFsIGxpYnJhcnkgRWRpdG9yIHRvIHRoZSBTbGlja0dyaWQgRWRpdG9yIGZhY3RvcnlcbiAgICBuZXdDb2x1bW5EZWZpbml0aW9ucyA9IHRoaXMuc3dhcEludGVybmFsRWRpdG9yVG9TbGlja0dyaWRGYWN0b3J5RWRpdG9yKG5ld0NvbHVtbkRlZmluaXRpb25zKTtcblxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoZmFsc2UsIG5ld0NvbHVtbkRlZmluaXRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnJlbmRlckNvbHVtbkhlYWRlcnMobmV3Q29sdW1uRGVmaW5pdGlvbnMsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zPy5lbmFibGVBdXRvU2l6ZUNvbHVtbnMpIHtcbiAgICAgIHRoaXMuc2xpY2tHcmlkLmF1dG9zaXplQ29sdW1ucygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50ICYmIHRoaXMucmVzaXplclNlcnZpY2U/LnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSB7XG4gICAgICB0aGlzLnJlc2l6ZXJTZXJ2aWNlLnJlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIGZpbHRlciByb3cgZGlzcGxheWVkIG9uIGZpcnN0IHJvdywgd2UgY2FuIG9wdGlvbmFsbHkgcGFzcyBmYWxzZSB0byBoaWRlIGl0LlxuICAgKiBAcGFyYW0gc2hvd2luZ1xuICAgKi9cbiAgc2hvd0hlYWRlclJvdyhzaG93aW5nID0gdHJ1ZSkge1xuICAgIHRoaXMuc2xpY2tHcmlkLnNldEhlYWRlclJvd1Zpc2liaWxpdHkoc2hvd2luZywgZmFsc2UpO1xuICAgIGlmIChzaG93aW5nID09PSB0cnVlICYmIHRoaXMuX2lzR3JpZEluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLnNsaWNrR3JpZC5zZXRDb2x1bW5zKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gc2hvd2luZztcbiAgfVxuXG4gIC8vXG4gIC8vIHByb3RlY3RlZCBmdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIExvb3AgdGhyb3VnaCBhbGwgY29sdW1uIGRlZmluaXRpb25zIGFuZCBjb3B5IHRoZSBvcmlnaW5hbCBvcHRpb25hbCBgd2lkdGhgIHByb3BlcnRpZXMgb3B0aW9uYWxseSBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAgICogV2Ugd2lsbCB1c2UgdGhpcyB3aGVuIGRvaW5nIGEgcmVzaXplIGJ5IGNlbGwgY29udGVudCwgaWYgdXNlciBwcm92aWRlZCBhIGB3aWR0aGAgaXQgd29uJ3Qgb3ZlcnJpZGUgaXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29weUNvbHVtbldpZHRoc1JlZmVyZW5jZShjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uW10pIHtcbiAgICBjb2x1bW5EZWZpbml0aW9ucy5mb3JFYWNoKGNvbCA9PiBjb2wub3JpZ2luYWxXaWR0aCA9IGNvbC53aWR0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoc2hvd1dhcm5pbmcgPSB0cnVlKSB7XG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZz8uc2hvd0VtcHR5RGF0YU1lc3NhZ2Uoc2hvd1dhcm5pbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmREaWZmZXJlbnRIb29rcyhncmlkOiBTbGlja0dyaWQsIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9uLCBkYXRhVmlldzogU2xpY2tEYXRhVmlldykge1xuICAgIC8vIG9uIGxvY2FsZSBjaGFuZ2UsIHdlIGhhdmUgdG8gbWFudWFsbHkgdHJhbnNsYXRlIHRoZSBIZWFkZXJzLCBHcmlkTWVudVxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZT8ub25MYW5nQ2hhbmdlKSB7XG4gICAgICAvLyB0cmFuc2xhdGUgc29tZSBvZiB0aGVtIG9uIGZpcnN0IGxvYWQsIHRoZW4gb24gZWFjaCBsYW5ndWFnZSBjaGFuZ2VcbiAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVUcmFuc2xhdGUpIHtcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUFsbEV4dGVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVDb2x1bW5IZWFkZXJUaXRsZUtleXMoKTtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVDb2x1bW5Hcm91cEtleXMoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIC8vIHB1Ymxpc2ggZXZlbnQgb2YgdGhlIHNhbWUgbmFtZSB0aGF0IFNsaWNrZ3JpZC1Vbml2ZXJzYWwgdXNlcyBvbiBhIGxhbmd1YWdlIGNoYW5nZSBldmVudFxuICAgICAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5wdWJsaXNoKCdvbkxhbmd1YWdlQ2hhbmdlJyk7XG5cbiAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuZW5hYmxlVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudHJhbnNsYXRlQWxsRXh0ZW5zaW9ucygpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVDb2x1bW5IZWFkZXJUaXRsZUtleXMoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCk7XG4gICAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuY3JlYXRlUHJlSGVhZGVyUGFuZWwgJiYgIWdyaWRPcHRpb25zLmVuYWJsZURyYWdnYWJsZUdyb3VwaW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXBpbmdTZXJ2aWNlLnRyYW5zbGF0ZUdyb3VwaW5nQW5kQ29sU3BhbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaWYgdXNlciBzZXQgYW4gb25Jbml0IEJhY2tlbmQsIHdlJ2xsIHJ1biBpdCByaWdodCBhd2F5IChhbmQgaWYgc28sIHdlIGFsc28gbmVlZCB0byBydW4gcHJlUHJvY2VzcywgaW50ZXJuYWxQb3N0UHJvY2VzcyAmIHBvc3RQcm9jZXNzKVxuICAgIGlmIChncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaSkge1xuICAgICAgY29uc3QgYmFja2VuZEFwaSA9IGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpO1xuXG4gICAgICBpZiAoYmFja2VuZEFwaT8uc2VydmljZT8uaW5pdCkge1xuICAgICAgICBiYWNrZW5kQXBpLnNlcnZpY2UuaW5pdChiYWNrZW5kQXBpLm9wdGlvbnMsIGdyaWRPcHRpb25zLnBhZ2luYXRpb24sIHRoaXMuc2xpY2tHcmlkLCB0aGlzLnNoYXJlZFNlcnZpY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkYXRhVmlldyAmJiBncmlkKSB7XG4gICAgICBjb25zdCBzbGlja2dyaWRFdmVudFByZWZpeCA9IHRoaXMuZ3JpZE9wdGlvbnM/LmRlZmF1bHRTbGlja2dyaWRFdmVudFByZWZpeCA/PyAnJztcblxuICAgICAgLy8gZXhwb3NlIGFsbCBTbGljayBHcmlkIEV2ZW50cyB0aHJvdWdoIGRpc3BhdGNoXG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZ3JpZCkge1xuICAgICAgICBpZiAoZ3JpZC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wLnN0YXJ0c1dpdGgoJ29uJykpIHtcbiAgICAgICAgICBjb25zdCBncmlkRXZlbnROYW1lID0gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmdldEV2ZW50TmFtZUJ5TmFtaW5nQ29udmVudGlvbihwcm9wLCBzbGlja2dyaWRFdmVudFByZWZpeCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZSgoZ3JpZCBhcyBhbnkpW3Byb3BdLCAoZXZlbnQsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UuZGlzcGF0Y2hDdXN0b21FdmVudChncmlkRXZlbnROYW1lLCB7IGV2ZW50RGF0YTogZXZlbnQsIGFyZ3MgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZXhwb3NlIGFsbCBTbGljayBEYXRhVmlldyBFdmVudHMgdGhyb3VnaCBkaXNwYXRjaFxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGRhdGFWaWV3KSB7XG4gICAgICAgIGlmIChkYXRhVmlldy5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wLnN0YXJ0c1dpdGgoJ29uJykpIHtcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKChkYXRhVmlldyBhcyBhbnkpW3Byb3BdLCAoZXZlbnQsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3RXZlbnROYW1lID0gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmdldEV2ZW50TmFtZUJ5TmFtaW5nQ29udmVudGlvbihwcm9wLCBzbGlja2dyaWRFdmVudFByZWZpeCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQdWJTdWJTZXJ2aWNlLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZGF0YVZpZXdFdmVudE5hbWUsIHsgZXZlbnREYXRhOiBldmVudCwgYXJncyB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvbiBjZWxsIGNsaWNrLCBtYWlubHkgdXNlZCB3aXRoIHRoZSBjb2x1bW5EZWYuYWN0aW9uIGNhbGxiYWNrXG4gICAgICB0aGlzLmdyaWRFdmVudFNlcnZpY2UuYmluZE9uQ2VsbENoYW5nZShncmlkKTtcbiAgICAgIHRoaXMuZ3JpZEV2ZW50U2VydmljZS5iaW5kT25DbGljayhncmlkKTtcblxuICAgICAgaWYgKGRhdGFWaWV3ICYmIGdyaWQpIHtcbiAgICAgICAgLy8gYmluZCBleHRlcm5hbCBzb3J0aW5nIChiYWNrZW5kKSB3aGVuIGF2YWlsYWJsZSBvciBkZWZhdWx0IG9uU29ydCAoZGF0YVZpZXcpXG4gICAgICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVTb3J0aW5nKSB7XG4gICAgICAgICAgLy8gYmluZCBleHRlcm5hbCBzb3J0aW5nIChiYWNrZW5kKSB1bmxlc3Mgc3BlY2lmaWVkIHRvIHVzZSB0aGUgbG9jYWwgb25lXG4gICAgICAgICAgaWYgKGdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpICYmICFncmlkT3B0aW9ucy5iYWNrZW5kU2VydmljZUFwaS51c2VMb2NhbFNvcnRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydFNlcnZpY2UuYmluZEJhY2tlbmRPblNvcnQoZ3JpZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc29ydFNlcnZpY2UuYmluZExvY2FsT25Tb3J0KGdyaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJpbmQgZXh0ZXJuYWwgZmlsdGVyIChiYWNrZW5kKSB3aGVuIGF2YWlsYWJsZSBvciBkZWZhdWx0IG9uRmlsdGVyIChkYXRhVmlldylcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmVuYWJsZUZpbHRlcmluZykge1xuICAgICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5pbml0KGdyaWQpO1xuXG4gICAgICAgICAgLy8gYmluZCBleHRlcm5hbCBmaWx0ZXIgKGJhY2tlbmQpIHVubGVzcyBzcGVjaWZpZWQgdG8gdXNlIHRoZSBsb2NhbCBvbmVcbiAgICAgICAgICBpZiAoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgIWdyaWRPcHRpb25zLmJhY2tlbmRTZXJ2aWNlQXBpLnVzZUxvY2FsRmlsdGVyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuYmluZEJhY2tlbmRPbkZpbHRlcihncmlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmJpbmRMb2NhbE9uRmlsdGVyKGdyaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gY29sdW1uIGFyZSByZW9yZGVyZWQsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB2aXNpYmxlQ29sdW1uIGFycmF5XG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZ3JpZC5vbkNvbHVtbnNSZW9yZGVyZWQsIChfZSwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oYXNDb2x1bW5zUmVvcmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UudmlzaWJsZUNvbHVtbnMgPSBhcmdzLmltcGFjdGVkQ29sdW1ucztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gbG9hZCBhbnkgcHJlc2V0cyBpZiBhbnkgKGFmdGVyIGRhdGFzZXQgaXMgaW5pdGlhbGl6ZWQpXG4gICAgICAgIHRoaXMubG9hZENvbHVtblByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XG4gICAgICAgIHRoaXMubG9hZEZpbHRlclByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCk7XG5cbiAgICAgICAgLy8gV2hlbiBkYXRhIGNoYW5nZXMgaW4gdGhlIERhdGFWaWV3LCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIG1ldHJpY3MgYW5kL29yIGRpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZSBkYXRhc2V0IGlzIGVtcHR5XG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZGF0YVZpZXcub25Sb3dDb3VudENoYW5nZWQsICgpID0+IHtcbiAgICAgICAgICBncmlkLmludmFsaWRhdGUoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uSXRlbUNvdW50Q2hhbmdlZChkYXRhVmlldy5nZXRGaWx0ZXJlZEl0ZW1Db3VudCgpIHx8IDAsIGRhdGFWaWV3LmdldEl0ZW1Db3VudCgpIHx8IDApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLnN1YnNjcmliZShkYXRhVmlldy5vblNldEl0ZW1zQ2FsbGVkLCAoX2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uSXRlbUNvdW50Q2hhbmdlZChkYXRhVmlldy5nZXRGaWx0ZXJlZEl0ZW1Db3VudCgpIHx8IDAsIGFyZ3MuaXRlbUNvdW50KTtcblxuICAgICAgICAgIC8vIHdoZW4gdXNlciBoYXMgcmVzaXplIGJ5IGNvbnRlbnQgZW5hYmxlZCwgd2UnbGwgZm9yY2UgYSBmdWxsIHdpZHRoIGNhbGN1bGF0aW9uIHNpbmNlIHdlIGNoYW5nZSBvdXIgZW50aXJlIGRhdGFzZXRcbiAgICAgICAgICBpZiAoYXJncy5pdGVtQ291bnQgPiAwICYmICh0aGlzLmdyaWRPcHRpb25zLmF1dG9zaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRPbkZpcnN0TG9hZCB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplclNlcnZpY2UucmVzaXplQ29sdW1uc0J5Q2VsbENvbnRlbnQoIXRoaXMuZ3JpZE9wdGlvbnM/LnJlc2l6ZUJ5Q29udGVudE9ubHlPbkZpcnN0TG9hZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZ3JpZE9wdGlvbnM/LmVuYWJsZUZpbHRlcmluZyAmJiAhZ3JpZE9wdGlvbnMuZW5hYmxlUm93RGV0YWlsVmlldykge1xuICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlci5zdWJzY3JpYmUoZGF0YVZpZXcub25Sb3dzQ2hhbmdlZCwgKF9lLCBhcmdzKSA9PiB7XG4gICAgICAgICAgICAvLyBmaWx0ZXJpbmcgZGF0YSB3aXRoIGxvY2FsIGRhdGFzZXQgd2lsbCBub3QgYWx3YXlzIHNob3cgY29ycmVjdGx5IHVubGVzcyB3ZSBjYWxsIHRoaXMgdXBkYXRlUm93L3JlbmRlclxuICAgICAgICAgICAgLy8gYWxzbyBkb24ndCB1c2UgXCJpbnZhbGlkYXRlUm93c1wiIHNpbmNlIGl0IGRlc3Ryb3lzIHRoZSBlbnRpcmUgcm93IGFuZCBhcyBiYWQgdXNlciBleHBlcmllbmNlIHdoZW4gdXBkYXRpbmcgYSByb3dcbiAgICAgICAgICAgIC8vIHNlZSBjb21taXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9naGlzY29kaW5nL2F1cmVsaWEtc2xpY2tncmlkL2NvbW1pdC84YzUwM2E0ZDQ1ZmJhMTFjYmQ4ZDhjYzQ2N2ZhZThkMTc3Y2M0ZjYwXG4gICAgICAgICAgICBpZiAoYXJncz8ucm93cyAmJiBBcnJheS5pc0FycmF5KGFyZ3Mucm93cykpIHtcbiAgICAgICAgICAgICAgYXJncy5yb3dzLmZvckVhY2goKHJvdzogbnVtYmVyKSA9PiBncmlkLnVwZGF0ZVJvdyhyb3cpKTtcbiAgICAgICAgICAgICAgZ3JpZC5yZW5kZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRpZCB0aGUgdXNlciBhZGQgYSBjb2xzcGFuIGNhbGxiYWNrPyBJZiBzbywgaG9vayBpdCBpbnRvIHRoZSBEYXRhVmlldyBnZXRJdGVtTWV0YWRhdGFcbiAgICBpZiAoZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuY29sc3BhbkNhbGxiYWNrICYmIGRhdGFWaWV3ICYmIGRhdGFWaWV3LmdldEl0ZW0gJiYgZGF0YVZpZXcuZ2V0SXRlbU1ldGFkYXRhKSB7XG4gICAgICBkYXRhVmlldy5nZXRJdGVtTWV0YWRhdGEgPSAocm93TnVtYmVyOiBudW1iZXIpID0+IHtcbiAgICAgICAgbGV0IGNhbGxiYWNrUmVzdWx0ID0gbnVsbDtcbiAgICAgICAgaWYgKGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjayAmJiBncmlkT3B0aW9ucy5jb2xzcGFuQ2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGdyaWRPcHRpb25zLmNvbHNwYW5DYWxsYmFjayhkYXRhVmlldy5nZXRJdGVtKHJvd051bWJlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRCYWNrZW5kQ2FsbGJhY2tGdW5jdGlvbnMoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pIHtcbiAgICBjb25zdCBiYWNrZW5kQXBpID0gZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGk7XG4gICAgY29uc3QgYmFja2VuZEFwaVNlcnZpY2UgPSBiYWNrZW5kQXBpICYmIGJhY2tlbmRBcGkuc2VydmljZTtcbiAgICBjb25zdCBzZXJ2aWNlT3B0aW9uczogQmFja2VuZFNlcnZpY2VPcHRpb24gPSBiYWNrZW5kQXBpU2VydmljZT8ub3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBpc0V4ZWN1dGVDb21tYW5kT25Jbml0ID0gKCFzZXJ2aWNlT3B0aW9ucykgPyBmYWxzZSA6ICgoc2VydmljZU9wdGlvbnMgJiYgc2VydmljZU9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2V4ZWN1dGVQcm9jZXNzQ29tbWFuZE9uSW5pdCcpKSA/IHNlcnZpY2VPcHRpb25zWydleGVjdXRlUHJvY2Vzc0NvbW1hbmRPbkluaXQnXSA6IHRydWUpO1xuXG4gICAgaWYgKGJhY2tlbmRBcGlTZXJ2aWNlKSB7XG4gICAgICAvLyB1cGRhdGUgYmFja2VuZCBmaWx0ZXJzIChpZiBuZWVkIGJlKSBCRUZPUkUgdGhlIHF1ZXJ5IHJ1bnMgKHZpYSB0aGUgb25Jbml0IGNvbW1hbmQgYSBmZXcgbGluZXMgYmVsb3cpXG4gICAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBhbnkgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgZ3JpZFxuICAgICAgaWYgKGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLnByZXNldHMpIHtcbiAgICAgICAgLy8gRmlsdGVycyBcInByZXNldHNcIlxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycykgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzKGdyaWRPcHRpb25zLnByZXNldHMuZmlsdGVycywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGVycyBcInByZXNldHNcIlxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlU29ydGVycyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycykgJiYgZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyB3aGVuIHVzaW5nIG11bHRpLWNvbHVtbiBzb3J0LCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBidXQgb24gc2luZ2xlIHNvcnQgdGhlbiBvbmx5IGdyYWIgdGhlIGZpcnN0IHNvcnQgcHJvdmlkZWRcbiAgICAgICAgICBjb25zdCBzb3J0Q29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMubXVsdGlDb2x1bW5Tb3J0ID8gZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzIDogZ3JpZE9wdGlvbnMucHJlc2V0cy5zb3J0ZXJzLnNsaWNlKDAsIDEpO1xuICAgICAgICAgIGJhY2tlbmRBcGlTZXJ2aWNlLnVwZGF0ZVNvcnRlcnModW5kZWZpbmVkLCBzb3J0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFnaW5hdGlvbiBcInByZXNldHNcIlxuICAgICAgICBpZiAoYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlUGFnaW5hdGlvbiAmJiBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb24pIHtcbiAgICAgICAgICBjb25zdCB7IHBhZ2VOdW1iZXIsIHBhZ2VTaXplIH0gPSBncmlkT3B0aW9ucy5wcmVzZXRzLnBhZ2luYXRpb247XG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlUGFnaW5hdGlvbihwYWdlTnVtYmVyLCBwYWdlU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0Q29sdW1uRmlsdGVycygpO1xuICAgICAgICBpZiAoY29sdW1uRmlsdGVycyAmJiBiYWNrZW5kQXBpU2VydmljZS51cGRhdGVGaWx0ZXJzKSB7XG4gICAgICAgICAgYmFja2VuZEFwaVNlcnZpY2UudXBkYXRlRmlsdGVycyhjb2x1bW5GaWx0ZXJzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZXhlY3V0ZSBvbkluaXQgY29tbWFuZCB3aGVuIG5lY2Vzc2FyeVxuICAgICAgaWYgKGJhY2tlbmRBcGkgJiYgYmFja2VuZEFwaVNlcnZpY2UgJiYgKGJhY2tlbmRBcGkub25Jbml0IHx8IGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gKHR5cGVvZiBiYWNrZW5kQXBpU2VydmljZS5idWlsZFF1ZXJ5ID09PSAnZnVuY3Rpb24nKSA/IGJhY2tlbmRBcGlTZXJ2aWNlLmJ1aWxkUXVlcnkoKSA6ICcnO1xuICAgICAgICBjb25zdCBwcm9jZXNzID0gKGlzRXhlY3V0ZUNvbW1hbmRPbkluaXQpID8gKGJhY2tlbmRBcGkucHJvY2VzcyAmJiBiYWNrZW5kQXBpLnByb2Nlc3MocXVlcnkpIHx8IG51bGwpIDogKGJhY2tlbmRBcGkub25Jbml0ICYmIGJhY2tlbmRBcGkub25Jbml0KHF1ZXJ5KSB8fCBudWxsKTtcblxuICAgICAgICAvLyB3cmFwIHRoaXMgaW5zaWRlIGEgc2V0VGltZW91dCB0byBhdm9pZCB0aW1pbmcgaXNzdWUgc2luY2UgdGhlIGdyaWRPcHRpb25zIG5lZWRzIHRvIGJlIHJlYWR5IGJlZm9yZSBydW5uaW5nIHRoaXMgb25Jbml0XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhY2tlbmRVdGlsaXR5U2VydmljZSA9IHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlIGFzIEJhY2tlbmRVdGlsaXR5U2VydmljZTtcblxuICAgICAgICAgIC8vIGtlZXAgc3RhcnQgdGltZSAmIGVuZCB0aW1lc3RhbXBzICYgcmV0dXJuIGl0IGFmdGVyIHByb2Nlc3MgZXhlY3V0aW9uXG4gICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcblxuICAgICAgICAgIC8vIHJ1biBhbnkgcHJlLXByb2Nlc3MsIGlmIGRlZmluZWQsIGZvciBleGFtcGxlIGEgc3Bpbm5lclxuICAgICAgICAgIGlmIChiYWNrZW5kQXBpLnByZVByb2Nlc3MpIHtcbiAgICAgICAgICAgIGJhY2tlbmRBcGkucHJlUHJvY2VzcygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHRoZSBwcm9jZXNzZXMgY2FuIGJlIGEgUHJvbWlzZSAobGlrZSBIdHRwKVxuICAgICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB0aGlzLmdyaWRPcHRpb25zPy5wYWdpbmF0aW9uPy50b3RhbEl0ZW1zID8/IDA7XG4gICAgICAgICAgaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBwcm9jZXNzXG4gICAgICAgICAgICAgIC50aGVuKChwcm9jZXNzUmVzdWx0OiBhbnkpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5leGVjdXRlQmFja2VuZFByb2Nlc3Nlc0NhbGxiYWNrKHN0YXJ0VGltZSwgcHJvY2Vzc1Jlc3VsdCwgYmFja2VuZEFwaSwgdG90YWxJdGVtcykpXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGJhY2tlbmRVdGlsaXR5U2VydmljZS5vbkJhY2tlbmRFcnJvcihlcnJvciwgYmFja2VuZEFwaSkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2VzcyAmJiB0aGlzLnJ4anM/LmlzT2JzZXJ2YWJsZShwcm9jZXNzKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgIChwcm9jZXNzIGFzIE9ic2VydmFibGU8YW55Pikuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAocHJvY2Vzc1Jlc3VsdDogYW55KSA9PiBiYWNrZW5kVXRpbGl0eVNlcnZpY2UuZXhlY3V0ZUJhY2tlbmRQcm9jZXNzZXNDYWxsYmFjayhzdGFydFRpbWUsIHByb2Nlc3NSZXN1bHQsIGJhY2tlbmRBcGksIHRvdGFsSXRlbXMpLFxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4gYmFja2VuZFV0aWxpdHlTZXJ2aWNlLm9uQmFja2VuZEVycm9yKGVycm9yLCBiYWNrZW5kQXBpKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kUmVzaXplSG9vayhncmlkOiBTbGlja0dyaWQsIG9wdGlvbnM6IEdyaWRPcHRpb24pIHtcbiAgICBpZiAoKG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmF1dG9zaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRPbkZpcnN0TG9hZCkgfHwgKG9wdGlvbnMuZW5hYmxlQXV0b1NpemVDb2x1bW5zICYmIG9wdGlvbnMuZW5hYmxlQXV0b1Jlc2l6ZUNvbHVtbnNCeUNlbGxDb250ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbQW5ndWxhci1TbGlja2dyaWRdIFlvdSBjYW5ub3QgZW5hYmxlIGJvdGggYXV0b3NpemUvZml0IHZpZXdwb3J0ICYgcmVzaXplIGJ5IGNvbnRlbnQsIHlvdSBtdXN0IGNob29zZSB3aGljaCByZXNpemUgdGVjaG5pcXVlIHRvIHVzZS4gWW91IGNhbiBlbmFibGUgdGhlc2UgMiBvcHRpb25zIChcImF1dG9GaXRDb2x1bW5zT25GaXJzdExvYWRcIiBhbmQgXCJlbmFibGVBdXRvU2l6ZUNvbHVtbnNcIikgT1IgdGhlc2Ugb3RoZXIgMiBvcHRpb25zIChcImF1dG9zaXplQ29sdW1uc0J5Q2VsbENvbnRlbnRPbkZpcnN0TG9hZFwiIGFuZCBcImVuYWJsZUF1dG9SZXNpemVDb2x1bW5zQnlDZWxsQ29udGVudFwiKS5gKTtcbiAgICB9XG5cbiAgICAvLyBleHBhbmQvYXV0b2ZpdCBjb2x1bW5zIG9uIGZpcnN0IHBhZ2UgbG9hZFxuICAgIGlmIChncmlkICYmIG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xuICAgICAgZ3JpZC5hdXRvc2l6ZUNvbHVtbnMoKTtcbiAgICB9XG5cbiAgICAvLyBhdXRvLXJlc2l6ZSBncmlkIG9uIGJyb3dzZXIgcmVzaXplXG4gICAgaWYgKG9wdGlvbnMuZ3JpZEhlaWdodCB8fCBvcHRpb25zLmdyaWRXaWR0aCkge1xuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKDAsIHsgaGVpZ2h0OiBvcHRpb25zLmdyaWRIZWlnaHQsIHdpZHRoOiBvcHRpb25zLmdyaWRXaWR0aCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNpemVyU2VydmljZS5yZXNpemVHcmlkKCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmVuYWJsZUF1dG9SZXNpemUpIHtcbiAgICAgIGlmIChncmlkICYmIG9wdGlvbnMuYXV0b0ZpdENvbHVtbnNPbkZpcnN0TG9hZCAmJiBvcHRpb25zLmVuYWJsZUF1dG9TaXplQ29sdW1ucykge1xuICAgICAgICBncmlkLmF1dG9zaXplQ29sdW1ucygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBleGVjdXRlQWZ0ZXJEYXRhdmlld0NyZWF0ZWQoX2dyaWQ6IFNsaWNrR3JpZCwgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pIHtcbiAgICAvLyBpZiB1c2VyIGVudGVyZWQgc29tZSBTb3J0IFwicHJlc2V0c1wiLCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhlbSBhbGwgaW4gdGhlIERPTVxuICAgIGlmIChncmlkT3B0aW9ucy5lbmFibGVTb3J0aW5nKSB7XG4gICAgICBpZiAoZ3JpZE9wdGlvbnMucHJlc2V0cyAmJiBBcnJheS5pc0FycmF5KGdyaWRPcHRpb25zLnByZXNldHMuc29ydGVycykpIHtcbiAgICAgICAgLy8gd2hlbiB1c2luZyBtdWx0aS1jb2x1bW4gc29ydCwgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYnV0IG9uIHNpbmdsZSBzb3J0IHRoZW4gb25seSBncmFiIHRoZSBmaXJzdCBzb3J0IHByb3ZpZGVkXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5tdWx0aUNvbHVtblNvcnQgPyBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMgOiBncmlkT3B0aW9ucy5wcmVzZXRzLnNvcnRlcnMuc2xpY2UoMCwgMSk7XG4gICAgICAgIHRoaXMuc29ydFNlcnZpY2UubG9hZEdyaWRTb3J0ZXJzKHNvcnRDb2x1bW5zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogV2hlbiBkYXRhIGNoYW5nZXMgaW4gdGhlIERhdGFWaWV3LCB3ZSdsbCByZWZyZXNoIHRoZSBtZXRyaWNzIGFuZC9vciBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgZGF0YXNldCBpcyBlbXB0eSAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlT25JdGVtQ291bnRDaGFuZ2VkKGN1cnJlbnRQYWdlUm93SXRlbUNvdW50OiBudW1iZXIsIHRvdGFsSXRlbUNvdW50OiBudW1iZXIpIHtcbiAgICB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aCA9IHRvdGFsSXRlbUNvdW50O1xuICAgIHRoaXMubWV0cmljcyA9IHtcbiAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKSxcbiAgICAgIGVuZFRpbWU6IG5ldyBEYXRlKCksXG4gICAgICBpdGVtQ291bnQ6IGN1cnJlbnRQYWdlUm93SXRlbUNvdW50LFxuICAgICAgdG90YWxJdGVtQ291bnRcbiAgICB9O1xuICAgIC8vIGlmIGN1c3RvbSBmb290ZXIgaXMgZW5hYmxlZCwgdGhlbiB3ZSdsbCB1cGRhdGUgaXRzIG1ldHJpY3NcbiAgICBpZiAodGhpcy5zbGlja0Zvb3Rlcikge1xuICAgICAgdGhpcy5zbGlja0Zvb3Rlci5tZXRyaWNzID0gdGhpcy5tZXRyaWNzO1xuICAgIH1cblxuICAgIC8vIHdoZW4gdXNpbmcgbG9jYWwgKGluLW1lbW9yeSkgZGF0YXNldCwgd2UnbGwgZGlzcGxheSBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIGZpbHRlcmVkIGRhdGEgaXMgZW1wdHlcbiAgICBpZiAodGhpcy5faXNMb2NhbEdyaWQgJiYgdGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlRW1wdHlEYXRhV2FybmluZ01lc3NhZ2UpIHtcbiAgICAgIHRoaXMuZGlzcGxheUVtcHR5RGF0YVdhcm5pbmcoY3VycmVudFBhZ2VSb3dJdGVtQ291bnQgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnM6IFBhZ2luYXRpb24pIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucykge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uRGF0YSA9IHtcbiAgICAgICAgZ3JpZE9wdGlvbnM6IHRoaXMuZ3JpZE9wdGlvbnMsXG4gICAgICAgIHBhZ2luYXRpb25TZXJ2aWNlOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuaW5pdCh0aGlzLnNsaWNrR3JpZCwgcGFnaW5hdGlvbk9wdGlvbnMsIHRoaXMuYmFja2VuZFNlcnZpY2VBcGkpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZS5zdWJzY3JpYmUoJ29uUGFnaW5hdGlvbkNoYW5nZWQnLCAocGFnaW5hdGlvbkNoYW5nZXM6IFNlcnZpY2VQYWdpbmF0aW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uQ2hhbmdlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2Uuc3Vic2NyaWJlKCdvblBhZ2luYXRpb25WaXNpYmlsaXR5Q2hhbmdlZCcsICh2aXNpYmlsaXR5OiB7IHZpc2libGU6IGJvb2xlYW47IH0pID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gdmlzaWJpbGl0eT8udmlzaWJsZSA/PyBmYWxzZTtcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uYmFja2VuZFNlcnZpY2VBcGkpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlPy5yZWZyZXNoQmFja2VuZERhdGFzZXQodGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbih0aGlzLnNob3dQYWdpbmF0aW9uKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIHBhZ2luYXRpb24gY29tcG9uZW50XG4gICAgICB0aGlzLnJlbmRlclBhZ2luYXRpb24oKTtcbiAgICAgIHRoaXMuX2lzUGFnaW5hdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogTG9hZCB0aGUgRWRpdG9yIENvbGxlY3Rpb24gYXN5bmNocm9ub3VzbHkgYW5kIHJlcGxhY2UgdGhlIFwiY29sbGVjdGlvblwiIHByb3BlcnR5IHdoZW4gT2JzZXJ2YWJsZSByZXNvbHZlcyAqL1xuICBwcm90ZWN0ZWQgbG9hZEVkaXRvckNvbGxlY3Rpb25Bc3luYyhjb2x1bW46IENvbHVtbikge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25Bc3luYyA9IGNvbHVtbiAmJiBjb2x1bW4uZWRpdG9yICYmIChjb2x1bW4uZWRpdG9yIGFzIENvbHVtbkVkaXRvcikuY29sbGVjdGlvbkFzeW5jO1xuICAgIGlmIChjb2xsZWN0aW9uQXN5bmMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29sbGVjdGlvbkFzeW5jLnN1YnNjcmliZSgocmVzb2x2ZWRDb2xsZWN0aW9uKSA9PiB0aGlzLnVwZGF0ZUVkaXRvckNvbGxlY3Rpb24oY29sdW1uLCByZXNvbHZlZENvbGxlY3Rpb24pKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25Bc3luYyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIC8vIHdhaXQgZm9yIHRoZSBcImNvbGxlY3Rpb25Bc3luY1wiLCBvbmNlIHJlc29sdmVkIHdlIHdpbGwgc2F2ZSBpdCBpbnRvIHRoZSBcImNvbGxlY3Rpb25cIlxuICAgICAgLy8gdGhlIGNvbGxlY3Rpb25Bc3luYyBjYW4gYmUgb2YgMyB0eXBlcyBIdHRwQ2xpZW50LCBIdHRwRmV0Y2ggb3IgYSBQcm9taXNlXG4gICAgICBjb2xsZWN0aW9uQXN5bmMudGhlbigocmVzcG9uc2U6IGFueSB8IGFueVtdKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlRWRpdG9yQ29sbGVjdGlvbihjb2x1bW4sIHJlc3BvbnNlKTsgLy8gZnJvbSBQcm9taXNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNlcnREeW5hbWljUHJlc2V0Q29sdW1ucyhjb2x1bW5JZDogc3RyaW5nLCBncmlkUHJlc2V0Q29sdW1uczogQ29sdW1uW10pIHtcbiAgICBpZiAodGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpIHtcbiAgICAgIGNvbnN0IGNvbHVtblBvc2l0aW9uID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMuZmluZEluZGV4KGMgPT4gYy5pZCA9PT0gY29sdW1uSWQpO1xuICAgICAgaWYgKGNvbHVtblBvc2l0aW9uID49IDApIHtcbiAgICAgICAgY29uc3QgZHluQ29sdW1uID0gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnNbY29sdW1uUG9zaXRpb25dO1xuICAgICAgICBpZiAoZHluQ29sdW1uPy5pZCA9PT0gY29sdW1uSWQgJiYgIWdyaWRQcmVzZXRDb2x1bW5zLnNvbWUoYyA9PiBjLmlkID09PSBjb2x1bW5JZCkpIHtcbiAgICAgICAgICBjb2x1bW5Qb3NpdGlvbiA+IDBcbiAgICAgICAgICAgID8gZ3JpZFByZXNldENvbHVtbnMuc3BsaWNlKGNvbHVtblBvc2l0aW9uLCAwLCBkeW5Db2x1bW4pXG4gICAgICAgICAgICA6IGdyaWRQcmVzZXRDb2x1bW5zLnVuc2hpZnQoZHluQ29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGFueSBwb3NzaWJsZSBDb2x1bW5zIEdyaWQgUHJlc2V0cyAqL1xuICBwcm90ZWN0ZWQgbG9hZENvbHVtblByZXNldHNXaGVuRGF0YXNldEluaXRpYWxpemVkKCkge1xuICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIENvbHVtbnMgXCJwcmVzZXRzXCIsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGVtIGFsbCBpbiB0aGUgZ3JpZFxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmdyaWRPcHRpb25zLnByZXNldHMuY29sdW1ucykgJiYgdGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ3JpZFByZXNldENvbHVtbnM6IENvbHVtbltdID0gdGhpcy5ncmlkU3RhdGVTZXJ2aWNlLmdldEFzc29jaWF0ZWRHcmlkQ29sdW1ucyh0aGlzLnNsaWNrR3JpZCwgdGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzLmNvbHVtbnMpO1xuICAgICAgaWYgKGdyaWRQcmVzZXRDb2x1bW5zICYmIEFycmF5LmlzQXJyYXkoZ3JpZFByZXNldENvbHVtbnMpICYmIGdyaWRQcmVzZXRDb2x1bW5zLmxlbmd0aCA+IDAgJiYgQXJyYXkuaXNBcnJheSh0aGlzLl9jb2x1bW5EZWZpbml0aW9ucykpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGR5bmFtaWMgY29sdW1ucyBhcmUgaW5jbHVkZWQgaW4gcHJlc2V0cyAoMS5Sb3cgTW92ZSwgMi4gUm93IFNlbGVjdGlvbiwgMy4gUm93IERldGFpbClcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93TW92ZU1hbmFnZXIpIHtcbiAgICAgICAgICBjb25zdCBybW1Db2xJZCA9IHRoaXMuZ3JpZE9wdGlvbnM/LnJvd01vdmVNYW5hZ2VyPy5jb2x1bW5JZCA/PyAnX21vdmUnO1xuICAgICAgICAgIHRoaXMuaW5zZXJ0RHluYW1pY1ByZXNldENvbHVtbnMocm1tQ29sSWQsIGdyaWRQcmVzZXRDb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lbmFibGVDaGVja2JveFNlbGVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgY2hrQ29sSWQgPSB0aGlzLmdyaWRPcHRpb25zPy5jaGVja2JveFNlbGVjdG9yPy5jb2x1bW5JZCA/PyAnX2NoZWNrYm94X3NlbGVjdG9yJztcbiAgICAgICAgICB0aGlzLmluc2VydER5bmFtaWNQcmVzZXRDb2x1bW5zKGNoa0NvbElkLCBncmlkUHJlc2V0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93RGV0YWlsVmlldykge1xuICAgICAgICAgIGNvbnN0IHJkdkNvbElkID0gdGhpcy5ncmlkT3B0aW9ucz8ucm93RGV0YWlsVmlldz8uY29sdW1uSWQgPz8gJ19kZXRhaWxfc2VsZWN0b3InO1xuICAgICAgICAgIHRoaXMuaW5zZXJ0RHluYW1pY1ByZXNldENvbHVtbnMocmR2Q29sSWQsIGdyaWRQcmVzZXRDb2x1bW5zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGtlZXAgY29weSB0aGUgb3JpZ2luYWwgb3B0aW9uYWwgYHdpZHRoYCBwcm9wZXJ0aWVzIG9wdGlvbmFsbHkgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAgICAgIC8vIFdlIHdpbGwgdXNlIHRoaXMgd2hlbiBkb2luZyBhIHJlc2l6ZSBieSBjZWxsIGNvbnRlbnQsIGlmIHVzZXIgcHJvdmlkZWQgYSBgd2lkdGhgIGl0IHdvbid0IG92ZXJyaWRlIGl0LlxuICAgICAgICBncmlkUHJlc2V0Q29sdW1ucy5mb3JFYWNoKGNvbCA9PiBjb2wub3JpZ2luYWxXaWR0aCA9IGNvbC53aWR0aCk7XG5cbiAgICAgICAgLy8gZmluYWxseSBzZXQgdGhlIG5ldyBwcmVzZXRzIGNvbHVtbnMgKGluY2x1ZGluZyBjaGVja2JveCBzZWxlY3RvciBpZiBuZWVkIGJlKVxuICAgICAgICB0aGlzLnNsaWNrR3JpZC5zZXRDb2x1bW5zKGdyaWRQcmVzZXRDb2x1bW5zKTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnZpc2libGVDb2x1bW5zID0gZ3JpZFByZXNldENvbHVtbnM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIExvYWQgYW55IHBvc3NpYmxlIEZpbHRlcnMgR3JpZCBQcmVzZXRzICovXG4gIHByb3RlY3RlZCBsb2FkRmlsdGVyUHJlc2V0c1doZW5EYXRhc2V0SW5pdGlhbGl6ZWQoKSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgIXRoaXMuY3VzdG9tRGF0YVZpZXcpIHtcbiAgICAgIC8vIGlmIHVzZXIgZW50ZXJlZCBzb21lIEZpbHRlciBcInByZXNldHNcIiwgd2UgbmVlZCB0byByZWZsZWN0IHRoZW0gYWxsIGluIHRoZSBET01cbiAgICAgIC8vIGFsc28gbm90ZSB0aGF0IGEgcHJlc2V0cyBvZiBUcmVlIERhdGEgVG9nZ2xpbmcgd2lsbCBhbHNvIGNhbGwgdGhpcyBtZXRob2QgYmVjYXVzZSBUcmVlIERhdGEgdG9nZ2xpbmcgZG9lcyB3b3JrIHdpdGggZGF0YSBmaWx0ZXJpbmdcbiAgICAgIC8vIChjb2xsYXBzaW5nIGEgcGFyZW50IHdpbGwgYmFzaWNhbGx5IHVzZSBGaWx0ZXIgZm9yIGhpZGRpbmcgKGFrYSBjb2xsYXBzaW5nKSBhd2F5IHRoZSBjaGlsZCB1bmRlcm5lYXQgaXQpXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5wcmVzZXRzICYmIChBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cy5maWx0ZXJzKSB8fCBBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cz8udHJlZURhdGE/LnRvZ2dsZWRJdGVtcykpKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5wb3B1bGF0ZUNvbHVtbkZpbHRlclNlYXJjaFRlcm1QcmVzZXRzKHRoaXMuZ3JpZE9wdGlvbnMucHJlc2V0cz8uZmlsdGVycyB8fCBbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGxvY2FsIGdyaWQsIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyB0aGUgUGFnaW5hdGlvblxuICAgKiBpZiBzbyB0aGVuIGFsc28gY2hlY2sgaWYgdGhlcmUncyBhbnkgcHJlc2V0cyBhbmQgZmluYWxseSBpbml0aWFsaXplIHRoZSBQYWdpbmF0aW9uU2VydmljZVxuICAgKiBhIGxvY2FsIGdyaWQgd2l0aCBQYWdpbmF0aW9uIHByZXNldHMgd2lsbCBwb3RlbnRpYWxseSBoYXZlIGEgZGlmZmVyZW50IHRvdGFsIG9mIGl0ZW1zLCB3ZSdsbCBuZWVkIHRvIGdldCBpdCBmcm9tIHRoZSBEYXRhVmlldyBhbmQgdXBkYXRlIG91ciB0b3RhbFxuICAgKi9cbiAgcHJvdGVjdGVkIGxvYWRMb2NhbEdyaWRQYWdpbmF0aW9uKGRhdGFzZXQ/OiBhbnlbXSkge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuX3BhZ2luYXRpb25PcHRpb25zKSB7XG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSBBcnJheS5pc0FycmF5KGRhdGFzZXQpID8gZGF0YXNldC5sZW5ndGggOiAwO1xuICAgICAgaWYgKHRoaXMuX3BhZ2luYXRpb25PcHRpb25zICYmIHRoaXMuZGF0YVZpZXc/LmdldFBhZ2luZ0luZm8pIHtcbiAgICAgICAgY29uc3Qgc2xpY2tQYWdpbmdJbmZvID0gdGhpcy5kYXRhVmlldy5nZXRQYWdpbmdJbmZvKCk7XG4gICAgICAgIGlmIChzbGlja1BhZ2luZ0luZm8/Lmhhc093blByb3BlcnR5KCd0b3RhbFJvd3MnKSAmJiB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucy50b3RhbEl0ZW1zICE9PSBzbGlja1BhZ2luZ0luZm8udG90YWxSb3dzKSB7XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gc2xpY2tQYWdpbmdJbmZvLnRvdGFsUm93cyB8fCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9wYWdpbmF0aW9uT3B0aW9ucy50b3RhbEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xuICAgICAgY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSB0aGlzLnNldFBhZ2luYXRpb25PcHRpb25zV2hlblByZXNldERlZmluZWQodGhpcy5ncmlkT3B0aW9ucywgdGhpcy5fcGFnaW5hdGlvbk9wdGlvbnMpO1xuICAgICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvblNlcnZpY2UocGFnaW5hdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGFueSBSb3cgU2VsZWN0aW9ucyBpbnRvIHRoZSBEYXRhVmlldyB0aGF0IHdlcmUgcHJlc2V0cyBieSB0aGUgdXNlciAqL1xuICBwcm90ZWN0ZWQgbG9hZFJvd1NlbGVjdGlvblByZXNldFdoZW5FeGlzdHMoKSB7XG4gICAgLy8gaWYgdXNlciBlbnRlcmVkIHNvbWUgUm93IFNlbGVjdGlvbnMgXCJwcmVzZXRzXCJcbiAgICBjb25zdCBwcmVzZXRzID0gdGhpcy5ncmlkT3B0aW9ucz8ucHJlc2V0cztcbiAgICBjb25zdCBlbmFibGVSb3dTZWxlY3Rpb24gPSB0aGlzLmdyaWRPcHRpb25zICYmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IgfHwgdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVSb3dTZWxlY3Rpb24pO1xuICAgIGlmIChlbmFibGVSb3dTZWxlY3Rpb24gJiYgdGhpcy5zbGlja0dyaWQ/LmdldFNlbGVjdGlvbk1vZGVsKCkgJiYgcHJlc2V0cz8ucm93U2VsZWN0aW9uICYmIChBcnJheS5pc0FycmF5KHByZXNldHMucm93U2VsZWN0aW9uLmdyaWRSb3dJbmRleGVzKSB8fCBBcnJheS5pc0FycmF5KHByZXNldHMucm93U2VsZWN0aW9uLmRhdGFDb250ZXh0SWRzKSkpIHtcbiAgICAgIGxldCBkYXRhQ29udGV4dElkcyA9IHByZXNldHMucm93U2VsZWN0aW9uLmRhdGFDb250ZXh0SWRzO1xuICAgICAgbGV0IGdyaWRSb3dJbmRleGVzID0gcHJlc2V0cy5yb3dTZWxlY3Rpb24uZ3JpZFJvd0luZGV4ZXM7XG5cbiAgICAgIC8vIG1hcHMgdGhlIElEcyB0byB0aGUgR3JpZCBSb3dzIGFuZCB2aWNlIHZlcnNhLCB0aGUgXCJkYXRhQ29udGV4dElkc1wiIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG90aGVyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhQ29udGV4dElkcykgJiYgZGF0YUNvbnRleHRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBncmlkUm93SW5kZXhlcyA9IHRoaXMuZGF0YVZpZXcubWFwSWRzVG9Sb3dzKGRhdGFDb250ZXh0SWRzKSB8fCBbXTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykgJiYgZ3JpZFJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBkYXRhQ29udGV4dElkcyA9IHRoaXMuZGF0YVZpZXcubWFwUm93c1RvSWRzKGdyaWRSb3dJbmRleGVzKSB8fCBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgcm93IHNlbGVjdGlvbiB3aGVuIGRlZmluZWQgYXMgZ3JpZCBwcmVzZXRzXG4gICAgICBpZiAodGhpcy5zbGlja0dyaWQgJiYgQXJyYXkuaXNBcnJheShncmlkUm93SW5kZXhlcykpIHtcbiAgICAgICAgdGhpcy5zbGlja0dyaWQuc2V0U2VsZWN0ZWRSb3dzKGdyaWRSb3dJbmRleGVzKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldyEuc2V0U2VsZWN0ZWRJZHMoZGF0YUNvbnRleHRJZHMgfHwgW10sIHtcbiAgICAgICAgICBpc1Jvd0JlaW5nQWRkZWQ6IHRydWUsXG4gICAgICAgICAgc2hvdWxkVHJpZ2dlckV2ZW50OiBmYWxzZSwgLy8gZG8gbm90IHRyaWdnZXIgd2hlbiBwcmVzZXR0aW5nIHRoZSBncmlkXG4gICAgICAgICAgYXBwbHlSb3dTZWxlY3Rpb25Ub0dyaWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1lcmdlR3JpZE9wdGlvbnMoZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb24pOiBHcmlkT3B0aW9uIHtcbiAgICBncmlkT3B0aW9ucy5ncmlkSWQgPSB0aGlzLmdyaWRJZDtcbiAgICBncmlkT3B0aW9ucy5ncmlkQ29udGFpbmVySWQgPSBgc2xpY2tHcmlkQ29udGFpbmVyLSR7dGhpcy5ncmlkSWR9YDtcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBiYWNrZW5kU2VydmljZUFwaSBhbmQgdGhlIGVuYWJsZVBhZ2luYXRpb24gaXMgdW5kZWZpbmVkLCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBkbyB3YW50IHRvIHNlZSBpdCwgZWxzZSBnZXQgdGhhdCBkZWZpbmVkIHZhbHVlXG4gICAgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9ICgoZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkgJiYgZ3JpZE9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBncmlkT3B0aW9ucy5lbmFibGVQYWdpbmF0aW9uKSB8fCBmYWxzZTtcblxuICAgIC8vIHVzZSBleHRlbmQgdG8gZGVlcCBtZXJnZSAmIGNvcHkgdG8gYXZvaWQgaW1tdXRhYmxlIHByb3BlcnRpZXMgYmVpbmcgY2hhbmdlZCBpbiBHbG9iYWxHcmlkT3B0aW9ucyBhZnRlciBhIHJvdXRlIGNoYW5nZVxuICAgIGNvbnN0IG9wdGlvbnMgPSBTbGljay5VdGlscy5leHRlbmQodHJ1ZSwge30sIEdsb2JhbEdyaWRPcHRpb25zLCB0aGlzLmZvclJvb3RDb25maWcsIGdyaWRPcHRpb25zKSBhcyBHcmlkT3B0aW9uO1xuXG4gICAgLy8gdXNpbmcgY29weSBleHRlbmQgdG8gZG8gYSBkZWVwIGNsb25lIGhhcyBhbiB1bndhbnRlZCBzaWRlIG9uIG9iamVjdHMgYW5kIHBhZ2VTaXplcyBidXQgRVM2IHNwcmVhZCBoYXMgb3RoZXIgd29yc3Qgc2lkZSBlZmZlY3RzXG4gICAgLy8gc28gd2Ugd2lsbCBqdXN0IG92ZXJ3cml0ZSB0aGUgcGFnZVNpemVzIHdoZW4gbmVlZGVkLCB0aGlzIGlzIHRoZSBvbmx5IG9uZSBjYXVzaW5nIGlzc3VlcyBzbyBmYXIuXG4gICAgLy8gT24gYSBkZWVwIGV4dGVuZCwgT2JqZWN0IGFuZCBBcnJheSBhcmUgZXh0ZW5kZWQsIGJ1dCBvYmplY3Qgd3JhcHBlcnMgb24gcHJpbWl0aXZlIHR5cGVzIHN1Y2ggYXMgU3RyaW5nLCBCb29sZWFuLCBhbmQgTnVtYmVyIGFyZSBub3QuXG4gICAgaWYgKG9wdGlvbnM/LnBhZ2luYXRpb24gJiYgKGdyaWRPcHRpb25zLmVuYWJsZVBhZ2luYXRpb24gfHwgZ3JpZE9wdGlvbnMuYmFja2VuZFNlcnZpY2VBcGkpICYmICh0aGlzLmZvclJvb3RDb25maWcucGFnaW5hdGlvbiB8fCBncmlkT3B0aW9ucy5wYWdpbmF0aW9uKSkge1xuICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gZ3JpZE9wdGlvbnMucGFnaW5hdGlvbj8ucGFnZVNpemUgPz8gdGhpcy5mb3JSb290Q29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplID8/IEdsb2JhbEdyaWRPcHRpb25zLnBhZ2luYXRpb24hLnBhZ2VTaXplO1xuICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uLnBhZ2VTaXplcyA9IGdyaWRPcHRpb25zLnBhZ2luYXRpb24/LnBhZ2VTaXplcyA/PyB0aGlzLmZvclJvb3RDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVzID8/IEdsb2JhbEdyaWRPcHRpb25zLnBhZ2luYXRpb24hLnBhZ2VTaXplcztcbiAgICB9XG5cbiAgICAvLyBhbHNvIG1ha2Ugc3VyZSB0byBzaG93IHRoZSBoZWFkZXIgcm93IGlmIHVzZXIgaGF2ZSBlbmFibGVkIGZpbHRlcmluZ1xuICAgIHRoaXMuX2hpZGVIZWFkZXJSb3dBZnRlclBhZ2VMb2FkID0gKG9wdGlvbnMuc2hvd0hlYWRlclJvdyA9PT0gZmFsc2UpO1xuICAgIGlmIChvcHRpb25zLmVuYWJsZUZpbHRlcmluZyAmJiAhb3B0aW9ucy5zaG93SGVhZGVyUm93KSB7XG4gICAgICBvcHRpb25zLnNob3dIZWFkZXJSb3cgPSBvcHRpb25zLmVuYWJsZUZpbHRlcmluZztcbiAgICB9XG5cbiAgICAvLyB3aGVuIHdlIHVzZSBQYWdpbmF0aW9uIG9uIExvY2FsIEdyaWQsIGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHdpdGhvdXQgZW5hYmxlRmlsdGVyaW5nXG4gICAgLy8gc28gd2UnbGwgZW5hYmxlIHRoZSBmaWx0ZXJpbmcgYnV0IHdlJ2xsIGtlZXAgdGhlIGhlYWRlciByb3cgaGlkZGVuXG4gICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuZW5hYmxlRmlsdGVyaW5nICYmIG9wdGlvbnMuZW5hYmxlUGFnaW5hdGlvbiAmJiB0aGlzLl9pc0xvY2FsR3JpZCkge1xuICAgICAgb3B0aW9ucy5lbmFibGVGaWx0ZXJpbmcgPSB0cnVlO1xuICAgICAgb3B0aW9ucy5zaG93SGVhZGVyUm93ID0gZmFsc2U7XG4gICAgICB0aGlzLl9oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWRlSGVhZGVyUm93QWZ0ZXJQYWdlTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICAvKiogQWRkIGEgcmVnaXN0ZXIgYSBuZXcgZXh0ZXJuYWwgcmVzb3VyY2UsIHVzZXIgY291bGQgYWxzbyBvcHRpb25hbCBkaXNwb3NlIGFsbCBwcmV2aW91cyByZXNvdXJjZXMgYmVmb3JlIHB1c2hpbmcgYW55IG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlcyBhcnJheSBsaXN0LiAqL1xuICByZWdpc3RlckV4dGVybmFsUmVzb3VyY2VzKHJlc291cmNlczogRXh0ZXJuYWxSZXNvdXJjZVtdLCBkaXNwb3NlUHJldmlvdXNSZXNvdXJjZXMgPSBmYWxzZSkge1xuICAgIGlmIChkaXNwb3NlUHJldmlvdXNSZXNvdXJjZXMpIHtcbiAgICAgIHRoaXMuZGlzcG9zZUV4dGVybmFsUmVzb3VyY2VzKCk7XG4gICAgfVxuICAgIHJlc291cmNlcy5mb3JFYWNoKHJlcyA9PiB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2gocmVzKSk7XG4gICAgdGhpcy5pbml0aWFsaXplRXh0ZXJuYWxSZXNvdXJjZXMocmVzb3VyY2VzKTtcbiAgfVxuXG4gIHJlc2V0RXh0ZXJuYWxSZXNvdXJjZXMoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyA9IFtdO1xuICB9XG5cbiAgLyoqIFByZS1SZWdpc3RlciBhbnkgUmVzb3VyY2UgdGhhdCBkb24ndCByZXF1aXJlIFNsaWNrR3JpZCB0byBiZSBpbnN0YW50aWF0ZWQgKGZvciBleGFtcGxlIFJ4SlMgUmVzb3VyY2UgJiBSb3dEZXRhaWwpICovXG4gIHByb3RlY3RlZCBwcmVSZWdpc3RlclJlc291cmNlcygpIHtcbiAgICAvLyBBbmd1bGFyLVNsaWNrZ3JpZCByZXF1aXJlcyBSeEpTLCBzbyB3ZSdsbCByZWdpc3RlciBpdCBhcyB0aGUgZmlyc3QgcmVzb3VyY2VcbiAgICB0aGlzLnJlZ2lzdGVyUnhKc1Jlc291cmNlKG5ldyBSeEpzUmVzb3VyY2UoKSBhcyBSeEpzRmFjYWRlKTtcblxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd0RldGFpbFZpZXcpIHtcbiAgICAgIHRoaXMuc2xpY2tSb3dEZXRhaWxWaWV3ID0gbmV3IFNsaWNrUm93RGV0YWlsVmlldyh0aGlzLmFuZ3VsYXJVdGlsU2VydmljZSwgdGhpcy5hcHBSZWYsIHRoaXMuX2V2ZW50UHViU3ViU2VydmljZSwgdGhpcy5lbG0ubmF0aXZlRWxlbWVudCwgdGhpcy5yeGpzKTtcbiAgICAgIHRoaXMuc2xpY2tSb3dEZXRhaWxWaWV3LmNyZWF0ZSh0aGlzLmNvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnNsaWNrUm93RGV0YWlsVmlldyk7XG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYWRkRXh0ZW5zaW9uVG9MaXN0KEV4dGVuc2lvbk5hbWUucm93RGV0YWlsVmlldywgeyBuYW1lOiBFeHRlbnNpb25OYW1lLnJvd0RldGFpbFZpZXcsIGluc3RhbmNlOiB0aGlzLnNsaWNrUm93RGV0YWlsVmlldyB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZUV4dGVybmFsUmVzb3VyY2VzKHJlc291cmNlczogRXh0ZXJuYWxSZXNvdXJjZVtdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzb3VyY2VzKSkge1xuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2xpY2tHcmlkICYmIHR5cGVvZiByZXNvdXJjZS5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVzb3VyY2UuaW5pdCh0aGlzLnNsaWNrR3JpZCwgdGhpcy5jb250YWluZXJTZXJ2aWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclJlc291cmNlcygpIHtcbiAgICAvLyBhdCB0aGlzIHBvaW50LCB3ZSBjb25zaWRlciBhbGwgdGhlIHJlZ2lzdGVyZWQgc2VydmljZXMgYXMgZXh0ZXJuYWwgc2VydmljZXMsIGFueXRoaW5nIGVsc2UgcmVnaXN0ZXJlZCBhZnRlcndhcmQgYXJlbid0IGV4dGVybmFsXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcykpIHtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5leHRlcm5hbFJlZ2lzdGVyZWRSZXNvdXJjZXMgPSB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzO1xuICAgIH1cblxuICAgIC8vIHB1c2ggYWxsIG90aGVyIFNlcnZpY2VzIHRoYXQgd2Ugd2FudCB0byBiZSByZWdpc3RlcmVkXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuZ3JpZFNlcnZpY2UsIHRoaXMuZ3JpZFN0YXRlU2VydmljZSk7XG5cbiAgICAvLyB3aGVuIHVzaW5nIEdyb3VwaW5nL0RyYWdnYWJsZUdyb3VwaW5nL0NvbHNwYW4gcmVnaXN0ZXIgaXRzIFNlcnZpY2VcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jcmVhdGVQcmVIZWFkZXJQYW5lbCAmJiAhdGhpcy5ncmlkT3B0aW9ucy5lbmFibGVEcmFnZ2FibGVHcm91cGluZykge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcy5wdXNoKHRoaXMuZ3JvdXBpbmdTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvLyB3aGVuIHVzaW5nIFRyZWUgRGF0YSBWaWV3LCByZWdpc3RlciBpdHMgU2VydmljZVxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyZWVEYXRhKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlcmVkUmVzb3VyY2VzLnB1c2godGhpcy50cmVlRGF0YVNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8vIHdoZW4gdXNlciBlbmFibGVzIHRyYW5zbGF0aW9uLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBIZWFkZXJzIG9uIGZpcnN0IHBhc3MgJiBzdWJzZXF1ZW50bHkgaW4gdGhlIGJpbmREaWZmZXJlbnRIb29rc1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSkge1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnRyYW5zbGF0ZUNvbHVtbkhlYWRlcnMoKTtcbiAgICB9XG5cbiAgICAvLyBhbHNvIGluaXRpYWxpemUgKHJlbmRlcikgdGhlIGVtcHR5IHdhcm5pbmcgY29tcG9uZW50XG4gICAgdGhpcy5zbGlja0VtcHR5V2FybmluZyA9IG5ldyBTbGlja0VtcHR5V2FybmluZ0NvbXBvbmVudCgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRSZXNvdXJjZXMucHVzaCh0aGlzLnNsaWNrRW1wdHlXYXJuaW5nKTtcblxuICAgIC8vIGJpbmQgJiBpbml0aWFsaXplIGFsbCBDb21wb25lbnRzL1NlcnZpY2VzIHRoYXQgd2VyZSB0YWdnZWQgYXMgZW5hYmxlZFxuICAgIC8vIHJlZ2lzdGVyIGFsbCBzZXJ2aWNlcyBieSBleGVjdXRpbmcgdGhlaXIgaW5pdCBtZXRob2QgYW5kIHByb3ZpZGluZyB0aGVtIHdpdGggdGhlIEdyaWQgb2JqZWN0XG4gICAgdGhpcy5pbml0aWFsaXplRXh0ZXJuYWxSZXNvdXJjZXModGhpcy5fcmVnaXN0ZXJlZFJlc291cmNlcyk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIFJ4SlMgUmVzb3VyY2UgaW4gYWxsIG5lY2Vzc2FyeSBzZXJ2aWNlcyB3aGljaCB1c2VzICovXG4gIHByb3RlY3RlZCByZWdpc3RlclJ4SnNSZXNvdXJjZShyZXNvdXJjZTogUnhKc0ZhY2FkZSkge1xuICAgIHRoaXMucnhqcyA9IHJlc291cmNlO1xuICAgIHRoaXMuYmFja2VuZFV0aWxpdHlTZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UuYWRkUnhKc1Jlc291cmNlKHRoaXMucnhqcyk7XG4gICAgdGhpcy5zb3J0U2VydmljZS5hZGRSeEpzUmVzb3VyY2UodGhpcy5yeGpzKTtcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmFkZFJ4SnNSZXNvdXJjZSh0aGlzLnJ4anMpO1xuICAgIHRoaXMuY29udGFpbmVyU2VydmljZS5yZWdpc3Rlckluc3RhbmNlKCdSeEpzUmVzb3VyY2UnLCB0aGlzLnJ4anMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciAob3IgZGlzcG9zZSkgdGhlIFBhZ2luYXRpb24gQ29tcG9uZW50LCB1c2VyIGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgRmFsc2UgKHRvIG5vdCBzaG93IGl0KSB3aGljaCB3aWxsIGluIHRlcm0gZGlzcG9zZSBvZiB0aGUgUGFnaW5hdGlvbixcbiAgICogYWxzbyB3aGlsZSBkaXNwb3Npbmcgd2UgY2FuIGNob29zZSB0byBvbWl0IHRoZSBkaXNwb3NhYmxlIG9mIHRoZSBQYWdpbmF0aW9uIFNlcnZpY2UgKGlmIHdlIGFyZSBzaW1wbHkgdG9nZ2xpbmcgdGhlIFBhZ2luYXRpb24sIHdlIHdhbnQgdG8ga2VlcCB0aGUgU2VydmljZSBhbGl2ZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBzaG93UGFnaW5hdGlvbiAtIHNob3cgKG5ldyByZW5kZXIpIG9yIG5vdCAoZGlzcG9zZSkgdGhlIFBhZ2luYXRpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBzaG91bGREaXNwb3NlUGFnaW5hdGlvblNlcnZpY2UgLSB3aGVuIGRpc3Bvc2luZyB0aGUgUGFnaW5hdGlvbiwgZG8gd2UgYWxzbyB3YW50IHRvIGRpc3Bvc2Ugb2YgdGhlIFBhZ2luYXRpb24gU2VydmljZT8gKGRlZmF1bHRzIHRvIFRydWUpXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyUGFnaW5hdGlvbihzaG93UGFnaW5hdGlvbiA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8uZW5hYmxlUGFnaW5hdGlvbiAmJiAhdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgJiYgc2hvd1BhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2xpY2tQYWdpbmF0aW9uID0gbmV3IFNsaWNrUGFnaW5hdGlvbkNvbXBvbmVudCh0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLCB0aGlzLl9ldmVudFB1YlN1YlNlcnZpY2UsIHRoaXMuc2hhcmVkU2VydmljZSwgdGhpcy50cmFuc2xhdGVyU2VydmljZSk7XG4gICAgICB0aGlzLnNsaWNrUGFnaW5hdGlvbi5yZW5kZXJQYWdpbmF0aW9uKHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXNob3dQYWdpbmF0aW9uKSB7XG4gICAgICBpZiAodGhpcy5zbGlja1BhZ2luYXRpb24pIHtcbiAgICAgICAgdGhpcy5zbGlja1BhZ2luYXRpb24uZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5faXNQYWdpbmF0aW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBmbGF0IGRhdGFzZXQgd2l0aCBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwLCBzb3J0IGl0ICh2aWEgaXRzIHRyZWUgc3RydWN0dXJlKSBhbmQgcmV0dXJuIHRoZSBzb3J0ZWQgZmxhdCBhcnJheVxuICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGZsYXREYXRhc2V0SW5wdXQgLSBmbGF0IGRhdGFzZXQgaW5wdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUdyaWRSZWZyZXNoIC0gb3B0aW9uYWxseSBmb3JjZSBhIGZ1bGwgZ3JpZCByZWZyZXNoXG4gICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBzb3J0IGZsYXQgcGFyZW50L2NoaWxkIGRhdGFzZXRcbiAgICovXG4gIHByb3RlY3RlZCBzb3J0VHJlZURhdGFzZXQ8VD4oZmxhdERhdGFzZXRJbnB1dDogVFtdLCBmb3JjZUdyaWRSZWZyZXNoID0gZmFsc2UpOiBUW10ge1xuICAgIGNvbnN0IHByZXZEYXRhc2V0TG4gPSB0aGlzLl9jdXJyZW50RGF0YXNldExlbmd0aDtcbiAgICBsZXQgc29ydGVkRGF0YXNldFJlc3VsdDtcbiAgICBsZXQgZmxhdERhdGFzZXRPdXRwdXQ6IGFueVtdID0gW107XG5cbiAgICAvLyBpZiB0aGUgaGllcmFyY2hpY2FsIGRhdGFzZXQgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlbiBubyBuZWVkIHRvIHJlLWNvbnZlcnQgaXQsIHdlIGNhbiB1c2UgaXQgZGlyZWN0bHkgZnJvbSB0aGUgc2hhcmVkIHNlcnZpY2UgcmVmXG4gICAgaWYgKHRoaXMuX2lzRGF0YXNldEhpZXJhcmNoaWNhbEluaXRpYWxpemVkICYmIHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCkge1xuICAgICAgc29ydGVkRGF0YXNldFJlc3VsdCA9IHRoaXMudHJlZURhdGFTZXJ2aWNlLnNvcnRIaWVyYXJjaGljYWxEYXRhc2V0KHRoaXMuZGF0YXNldEhpZXJhcmNoaWNhbCk7XG4gICAgICBmbGF0RGF0YXNldE91dHB1dCA9IHNvcnRlZERhdGFzZXRSZXN1bHQuZmxhdDtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmxhdERhdGFzZXRJbnB1dCkgJiYgZmxhdERhdGFzZXRJbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucz8udHJlZURhdGFPcHRpb25zPy5pbml0aWFsU29ydCkge1xuICAgICAgICAvLyBlbHNlIHdlIG5lZWQgdG8gZmlyc3QgY29udmVydCB0aGUgZmxhdCBkYXRhc2V0IHRvIGEgaGllcmFyY2hpY2FsIGRhdGFzZXQgYW5kIHRoZW4gc29ydFxuICAgICAgICBzb3J0ZWREYXRhc2V0UmVzdWx0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2UuY29udmVydEZsYXRQYXJlbnRDaGlsZFRvVHJlZURhdGFzZXRBbmRTb3J0KGZsYXREYXRhc2V0SW5wdXQsIHRoaXMuX2NvbHVtbkRlZmluaXRpb25zLCB0aGlzLmdyaWRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhpZXJhcmNoaWNhbERhdGFzZXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmhpZXJhcmNoaWNhbDtcbiAgICAgICAgZmxhdERhdGFzZXRPdXRwdXQgPSBzb3J0ZWREYXRhc2V0UmVzdWx0LmZsYXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlbHNlIHdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIHByb3ZpZGVkIGFuIGFycmF5IHRoYXQgaXMgYWxyZWFkeSBzb3J0ZWQgKHVzZXIncyByZXNwb25zYWJpbGl0eSlcbiAgICAgICAgLy8gYW5kIHNvIHdlIGNhbiBzaW1wbHkgY29udmVydCB0aGUgYXJyYXkgdG8gYSB0cmVlIHN0cnVjdHVyZSBhbmQgd2UncmUgZG9uZSwgbm8gbmVlZCB0byBzb3J0XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oaWVyYXJjaGljYWxEYXRhc2V0ID0gdGhpcy50cmVlRGF0YVNlcnZpY2UuY29udmVydEZsYXRQYXJlbnRDaGlsZFRvVHJlZURhdGFzZXQoZmxhdERhdGFzZXRJbnB1dCwgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgICAgIGZsYXREYXRhc2V0T3V0cHV0ID0gZmxhdERhdGFzZXRJbnB1dCB8fCBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBhZGQvcmVtb3ZlIGl0ZW0ocykgZnJvbSB0aGUgZGF0YXNldCwgd2UgbmVlZCB0byBhbHNvIHJlZnJlc2ggb3VyIHRyZWUgZGF0YSBmaWx0ZXJzXG4gICAgaWYgKGZsYXREYXRhc2V0SW5wdXQubGVuZ3RoID4gMCAmJiAoZm9yY2VHcmlkUmVmcmVzaCB8fCBmbGF0RGF0YXNldElucHV0Lmxlbmd0aCAhPT0gcHJldkRhdGFzZXRMbikpIHtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWZyZXNoVHJlZURhdGFGaWx0ZXJzKGZsYXREYXRhc2V0T3V0cHV0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdERhdGFzZXRPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyLCB3ZSBwcm92aWRlIHRoZSBwcm9wZXJ0eSBcImVkaXRvclwiIGFzIGFuIEFuZ3VsYXItU2xpY2tncmlkIGVkaXRvciBjb21wbGV4IG9iamVjdFxuICAgKiBob3dldmVyIFwiZWRpdG9yXCIgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFNsaWNrR3JpZCBmb3IgaXQncyBvd24gRWRpdG9yIEZhY3RvcnlcbiAgICogc28gaW4gb3VyIGxpYiB3ZSB3aWxsIHN3YXAgXCJlZGl0b3JcIiBhbmQgY29weSBpdCBpbnRvIGEgbmV3IHByb3BlcnR5IGNhbGxlZCBcImludGVybmFsQ29sdW1uRWRpdG9yXCJcbiAgICogdGhlbiB0YWtlIGJhY2sgXCJlZGl0b3IubW9kZWxcIiBhbmQgbWFrZSBpdCB0aGUgbmV3IFwiZWRpdG9yXCIgc28gdGhhdCBTbGlja0dyaWQgRWRpdG9yIEZhY3Rvcnkgc3RpbGwgd29ya3NcbiAgICovXG4gIHByb3RlY3RlZCBzd2FwSW50ZXJuYWxFZGl0b3JUb1NsaWNrR3JpZEZhY3RvcnlFZGl0b3IoY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbltdKSB7XG4gICAgaWYgKGNvbHVtbkRlZmluaXRpb25zLnNvbWUoY29sID0+IGAke2NvbC5pZH1gLmluY2x1ZGVzKCcuJykpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbQW5ndWxhci1TbGlja2dyaWRdIE1ha2Ugc3VyZSB0aGF0IG5vbmUgb2YgeW91ciBDb2x1bW4gRGVmaW5pdGlvbiBcImlkXCIgcHJvcGVydHkgaW5jbHVkZXMgYSBkb3QgaW4gaXRzIG5hbWUgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2Ugc29tZSBwcm9ibGVtcyB3aXRoIHRoZSBFZGl0b3JzLiBGb3IgZXhhbXBsZSBpZiB5b3VyIGNvbHVtbiBkZWZpbml0aW9uIFwiZmllbGRcIiBwcm9wZXJ0eSBpcyBcInVzZXIuZmlyc3ROYW1lXCIgdGhlbiB1c2UgXCJmaXJzdE5hbWVcIiBhcyB0aGUgY29sdW1uIFwiaWRcIi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1uRGVmaW5pdGlvbnMubWFwKChjb2x1bW46IENvbHVtbiB8IGFueSkgPT4ge1xuICAgICAgLy8gb24gZXZlcnkgRWRpdG9yIHRoYXQgaGF2ZSBhIFwiY29sbGVjdGlvbkFzeW5jXCIsIHJlc29sdmUgdGhlIGRhdGEgYW5kIGFzc2lnbiBpdCB0byB0aGUgXCJjb2xsZWN0aW9uXCIgcHJvcGVydHlcbiAgICAgIGlmIChjb2x1bW4/LmVkaXRvcj8uY29sbGVjdGlvbkFzeW5jKSB7XG4gICAgICAgIHRoaXMubG9hZEVkaXRvckNvbGxlY3Rpb25Bc3luYyhjb2x1bW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uY29sdW1uLCBlZGl0b3I6IGNvbHVtbi5lZGl0b3I/Lm1vZGVsLCBpbnRlcm5hbENvbHVtbkVkaXRvcjogeyAuLi5jb2x1bW4uZWRpdG9yIH0gfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0cmFuc2xhdGVDb2x1bW5IZWFkZXJUaXRsZUtleXMoKSB7XG4gICAgLy8gdHJhbnNsYXRlIGFsbCBjb2x1bW5zIChpbmNsdWRpbmcgaGlkZGVuIGNvbHVtbnMpXG4gICAgdGhpcy5leHRlbnNpb25VdGlsaXR5LnRyYW5zbGF0ZUl0ZW1zKHRoaXMuc2hhcmVkU2VydmljZS5hbGxDb2x1bW5zLCAnbmFtZUtleScsICduYW1lJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhbnNsYXRlQ29sdW1uR3JvdXBLZXlzKCkge1xuICAgIC8vIHRyYW5zbGF0ZSBhbGwgY29sdW1uIGdyb3VwcyAoaW5jbHVkaW5nIGhpZGRlbiBjb2x1bW5zKVxuICAgIHRoaXMuZXh0ZW5zaW9uVXRpbGl0eS50cmFuc2xhdGVJdGVtcyh0aGlzLnNoYXJlZFNlcnZpY2UuYWxsQ29sdW1ucywgJ2NvbHVtbkdyb3VwS2V5JywgJ2NvbHVtbkdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBcImludGVybmFsQ29sdW1uRWRpdG9yLmNvbGxlY3Rpb25cIiBwcm9wZXJ0eS5cbiAgICogU2luY2UgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzeW5jIGNhbGwgcmVzb2x2ZXMsIHRoZSBwb2ludGVyIHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBcImNvbHVtblwiIGFyZ3VtZW50IHBhc3NlZC5cbiAgICogT25jZSB3ZSBmb3VuZCB0aGUgbmV3IHBvaW50ZXIsIHdlIHdpbGwgcmVhc3NpZ24gdGhlIFwiZWRpdG9yXCIgYW5kIFwiY29sbGVjdGlvblwiIHRvIHRoZSBcImludGVybmFsQ29sdW1uRWRpdG9yXCIgc28gaXQgaGFzIG5ld2VzdCBjb2xsZWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlRWRpdG9yQ29sbGVjdGlvbjxUID0gYW55Pihjb2x1bW46IENvbHVtbjxUPiwgbmV3Q29sbGVjdGlvbjogVFtdKSB7XG4gICAgKGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yKS5jb2xsZWN0aW9uID0gbmV3Q29sbGVjdGlvbjtcbiAgICAoY29sdW1uLmVkaXRvciBhcyBDb2x1bW5FZGl0b3IpLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvLyBmaW5kIHRoZSBuZXcgY29sdW1uIHJlZmVyZW5jZSBwb2ludGVyICYgcmUtYXNzaWduIHRoZSBuZXcgZWRpdG9yIHRvIHRoZSBpbnRlcm5hbENvbHVtbkVkaXRvclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpKSB7XG4gICAgICBjb25zdCBjb2x1bW5SZWYgPSB0aGlzLmNvbHVtbkRlZmluaXRpb25zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiBjb2wuaWQgPT09IGNvbHVtbi5pZCk7XG4gICAgICBpZiAoY29sdW1uUmVmKSB7XG4gICAgICAgIGNvbHVtblJlZi5pbnRlcm5hbENvbHVtbkVkaXRvciA9IGNvbHVtbi5lZGl0b3IgYXMgQ29sdW1uRWRpdG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBjdXJyZW50IEVkaXRvciwgcmVtb3ZlIGl0IGZyb20gdGhlIERPTSB0aGVuIHJlLWVuYWJsZSBpdCBhbmQgcmUtcmVuZGVyIGl0IHdpdGggdGhlIG5ldyBjb2xsZWN0aW9uLlxuICAgIGNvbnN0IGN1cnJlbnRFZGl0b3IgPSB0aGlzLnNsaWNrR3JpZC5nZXRDZWxsRWRpdG9yKCkgYXMgQXV0b2NvbXBsZXRlckVkaXRvciB8IFNlbGVjdEVkaXRvcjtcbiAgICBpZiAoY3VycmVudEVkaXRvcj8uZGlzYWJsZSAmJiBjdXJyZW50RWRpdG9yPy5yZW5kZXJEb21FbGVtZW50KSB7XG4gICAgICBjdXJyZW50RWRpdG9yLmRlc3Ryb3koKTtcbiAgICAgIGN1cnJlbnRFZGl0b3IuZGlzYWJsZShmYWxzZSk7XG4gICAgICBjdXJyZW50RWRpdG9yLnJlbmRlckRvbUVsZW1lbnQobmV3Q29sbGVjdGlvbik7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGlkPVwic2xpY2tHcmlkQ29udGFpbmVyLXt7Z3JpZElkfX1cIiBjbGFzcz1cImdyaWRQYW5lXCI+XG4gIDxkaXYgYXR0ci5pZD0ne3tncmlkSWR9fScgY2xhc3M9XCJzbGlja2dyaWQtY29udGFpbmVyXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==