igniteui-angular 11.1.44 → 11.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/igniteui-angular.umd.js +14 -6
- package/bundles/igniteui-angular.umd.js.map +1 -1
- package/bundles/igniteui-angular.umd.min.js +1 -1
- package/bundles/igniteui-angular.umd.min.js.map +1 -1
- package/esm2015/lib/grids/grid-base.directive.js +6 -5
- package/esm2015/lib/grids/state.directive.js +5 -2
- package/esm2015/lib/time-picker/time-picker.component.js +3 -1
- package/fesm2015/igniteui-angular.js +11 -5
- package/fesm2015/igniteui-angular.js.map +1 -1
- package/igniteui-angular.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -996,7 +996,7 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
|
|
|
996
996
|
this._filteringPipeTrigger++;
|
|
997
997
|
this.filteringExpressionsTreeChange.emit(this._filteringExpressionsTree);
|
|
998
998
|
if (this.filteringService.isFilteringExpressionsTreeEmpty(this._filteringExpressionsTree) &&
|
|
999
|
-
|
|
999
|
+
this.filteringService.isFilteringExpressionsTreeEmpty(this._advancedFilteringExpressionsTree)) {
|
|
1000
1000
|
this.filteredData = null;
|
|
1001
1001
|
}
|
|
1002
1002
|
this.filteringService.refreshExpressions();
|
|
@@ -1027,8 +1027,8 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
|
|
|
1027
1027
|
this._advancedFilteringExpressionsTree = null;
|
|
1028
1028
|
}
|
|
1029
1029
|
this.advancedFilteringExpressionsTreeChange.emit(this._advancedFilteringExpressionsTree);
|
|
1030
|
-
if (this.filteringService.isFilteringExpressionsTreeEmpty(this.
|
|
1031
|
-
|
|
1030
|
+
if (this.filteringService.isFilteringExpressionsTreeEmpty(this._filteringExpressionsTree) &&
|
|
1031
|
+
this.filteringService.isFilteringExpressionsTreeEmpty(this._advancedFilteringExpressionsTree)) {
|
|
1032
1032
|
this.filteredData = null;
|
|
1033
1033
|
}
|
|
1034
1034
|
this.selectionService.clearHeaderCBState();
|
|
@@ -3946,7 +3946,8 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
|
|
|
3946
3946
|
* ```
|
|
3947
3947
|
*/
|
|
3948
3948
|
get hasSummarizedColumns() {
|
|
3949
|
-
|
|
3949
|
+
const summarizedColumns = this.columnList.filter(col => col.hasSummary && !col.hidden);
|
|
3950
|
+
return summarizedColumns.length > 0;
|
|
3950
3951
|
}
|
|
3951
3952
|
/**
|
|
3952
3953
|
* @hidden @internal
|
|
@@ -6483,4 +6484,4 @@ __decorate([
|
|
|
6483
6484
|
__decorate([
|
|
6484
6485
|
WatchChanges()
|
|
6485
6486
|
], IgxGridBaseDirective.prototype, "selectRowOnClick", null);
|
|
6486
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZJLE9BQU8sRUFHSCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxlQUFlLEVBQ2YsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxRQUFRLEVBRVIsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTywwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJB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WSxFQUFFO2lEQUlkO0FBZ0NEO0lBRkMsWUFBWSxFQUFFO3FEQUlkO0FBZ0JEO0lBRkMsWUFBWSxFQUFFO3VEQUlkO0FBaUNEO0lBRkMsWUFBWSxFQUFFO3FEQVdkO0FBaUREO0lBRkMsaUJBQWlCLENBQUMsbUNBQW1DLENBQUM7NkRBSXREO0FBNkNEO0lBRkMsaUJBQWlCLENBQUMsK0JBQStCLENBQUM7eURBSWxEO0FBa0JEO0lBRkMsaUJBQWlCLENBQUMsb0NBQW9DLENBQUM7OERBSXZEO0FBaWZEO0lBRkMsWUFBWSxFQUFFOzhEQUlkO0FBNkVEO0lBRkMsaUJBQWlCLENBQUMsbUNBQW1DLENBQUM7NkRBSXREO0FBbUREO0lBRkMsaUJBQWlCLENBQUMsNkJBQTZCLENBQUM7dURBSWhEO0FBaUJEO0lBRkMsaUJBQWlCLENBQUMsOEJBQThCLENBQUM7d0RBSWpEO0FBbUJEO0lBRkMsaUJBQWlCLENBQUMsNkJBQTZCLENBQUM7dURBSWhEO0FBa0JEO0lBRkMsaUJBQWlCLENBQUMsMkJBQTJCLENBQUM7cURBSTlDO0FBa0JEO0lBRkMsaUJBQWlCLENBQUMsNEJBQTRCLENBQUM7c0RBSS9DO0FBa0JEO0lBRkMsaUJBQWlCLENBQUMsaUNBQWlDLENBQUM7MkRBSXBEO0FBa0JEO0lBRkMsaUJBQWlCLENBQUMsK0JBQStCLENBQUM7eURBSWxEO0FBZUQ7SUFGQyxZQUFZLEVBQUU7eURBSWQ7QUFtQkQ7SUFGQyxZQUFZLEVBQUU7d0RBSWQ7QUFtQkQ7SUFGQyxZQUFZLEVBQUU7MkRBSWQ7QUE4cEZEO0lBRkMsWUFBWSxFQUFFOzREQUlkIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQsIERhdGVQaXBlLCBEZWNpbWFsUGlwZSwgZ2V0TG9jYWxlTnVtYmVyRm9ybWF0LCBOdW1iZXJGb3JtYXRTdHlsZSwgQ3VycmVuY3lQaXBlLCBQZXJjZW50UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVDaGFuZ2VSZWNvcmQsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIE9wdGlvbmFsLFxuICAgIERvQ2hlY2ssXG4gICAgRGlyZWN0aXZlLFxuICAgIExPQ0FMRV9JRCxcbiAgICBIb3N0TGlzdGVuZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmVzaXplLW9ic2VydmVyLXBvbHlmaWxsJztcbmltcG9ydCAnaWduaXRldWktdHJpYWwtd2F0ZXJtYXJrJztcbmltcG9ydCB7IFN1YmplY3QsIHBpcGUsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBmaXJzdCwgZmlsdGVyLCB0aHJvdHRsZVRpbWUsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjbG9uZUFycmF5LCBmbGF0dGVuLCBtZXJnZU9iamVjdHMsIGlzSUUsIGNvbXBhcmVNYXBzLCByZXNvbHZlTmVzdGVkUGF0aCwgaXNPYmplY3QsIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiwgU29ydGluZ0RpcmVjdGlvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncywgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90ZXh0LWhpZ2hsaWdodC90ZXh0LWhpZ2hsaWdodC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgICBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LFxuICAgIEhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgVmVydGljYWxBbGlnbm1lbnQsXG4gICAgSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgT3ZlcmxheVNldHRpbmdzLFxuICAgIFBvc2l0aW9uU2V0dGluZ3MsXG4gICAgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSxcbiAgICBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5LFxuICAgIFN0YXRlVXBkYXRlRXZlbnQsXG4gICAgVHJhbnNhY3Rpb25FdmVudE9yaWdpblxufSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZENlbGxDb21wb25lbnQgfSBmcm9tICcuL2NlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElTdW1tYXJ5RXhwcmVzc2lvbiB9IGZyb20gJy4vc3VtbWFyaWVzL2dyaWQtc3VtbWFyeSc7XG5pbXBvcnQgeyBSb3dFZGl0UG9zaXRpb25TdHJhdGVneSwgSVBpbm5pbmdDb25maWcgfSBmcm9tICcuL2dyaWQuY29tbW9uJztcbmltcG9ydCB7IElneEdyaWRUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi90b29sYmFyL2dyaWQtdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Um93RGlyZWN0aXZlIH0gZnJvbSAnLi9yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIElneFRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgICBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGVcbn0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdPcGVyYXRpb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25UeXBlLCBUcmFuc2FjdGlvblNlcnZpY2UsIFN0YXRlIH0gZnJvbSAnLi4vc2VydmljZXMvcHVibGljX2FwaSc7XG5pbXBvcnQge1xuICAgIElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGV4dERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZVxufSBmcm9tICcuL2dyaWQucm93RWRpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLCBJQWN0aXZlTm9kZSB9IGZyb20gJy4vZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURpc3BsYXlEZW5zaXR5T3B0aW9ucywgRGlzcGxheURlbnNpdHlUb2tlbiwgRGlzcGxheURlbnNpdHlCYXNlLCBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHsgSWd4R3JpZFJvd0NvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXYXRjaENoYW5nZXMgfSBmcm9tICcuL3dhdGNoLWNoYW5nZXMnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JpZFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9ncmlkLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UgfSBmcm9tICcuL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50IH0gZnJvbSAnLi9zdW1tYXJpZXMvc3VtbWFyeS1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UsXG4gICAgR3JpZFNlbGVjdGlvblJhbmdlLFxuICAgIElneEdyaWRDUlVEU2VydmljZSxcbiAgICBJZ3hSb3csXG4gICAgSWd4Q2VsbFxufSBmcm9tICcuL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBEcmFnU2Nyb2xsRGlyZWN0aW9uIH0gZnJvbSAnLi9zZWxlY3Rpb24vZHJhZy1zZWxlY3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzLCBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGVtcGxhdGUtb3V0bGV0L3RlbXBsYXRlX291dGxldC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLXNlYXJjaC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQgfSBmcm9tICcuL3Jlc2l6aW5nL3Jlc2l6ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2hhclNlcGFyYXRlZFZhbHVlRGF0YSB9IGZyb20gJy4uL3NlcnZpY2VzL2Nzdi9jaGFyLXNlcGFyYXRlZC12YWx1ZS1kYXRhJztcbmltcG9ydCB7IElneENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4vcmVzaXppbmcvcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7XG4gICAgSWd4Um93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsIElneFJvd0NvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZSxcbiAgICBJZ3hIZWFkZXJFeHBhbmRJbmRpY2F0b3JEaXJlY3RpdmUsIElneEhlYWRlckNvbGxhcHNlSW5kaWNhdG9yRGlyZWN0aXZlLCBJZ3hFeGNlbFN0eWxlSGVhZGVySWNvbkRpcmVjdGl2ZVxufSBmcm9tICcuL2dyaWQvZ3JpZC5kaXJlY3RpdmVzJztcbmltcG9ydCB7XG4gICAgR3JpZEtleWRvd25UYXJnZXRUeXBlLFxuICAgIEdyaWRTZWxlY3Rpb25Nb2RlLFxuICAgIEdyaWRTdW1tYXJ5UG9zaXRpb24sXG4gICAgR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUsXG4gICAgRmlsdGVyTW9kZSxcbiAgICBDb2x1bW5QaW5uaW5nUG9zaXRpb24sXG4gICAgUm93UGlubmluZ1Bvc2l0aW9uLFxuICAgIEdyaWRQYWdpbmdNb2RlXG59IGZyb20gJy4vY29tbW9uL2VudW1zJztcbmltcG9ydCB7XG4gICAgSUdyaWRDZWxsRXZlbnRBcmdzLFxuICAgIElSb3dTZWxlY3Rpb25FdmVudEFyZ3MsXG4gICAgSVBpbkNvbHVtbkV2ZW50QXJncyxcbiAgICBJR3JpZEVkaXRFdmVudEFyZ3MsXG4gICAgSVBhZ2VFdmVudEFyZ3MsXG4gICAgSVJvd0RhdGFFdmVudEFyZ3MsXG4gICAgSUNvbHVtblJlc2l6ZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3MsXG4gICAgSUNvbHVtbk1vdmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkS2V5ZG93bkV2ZW50QXJncyxcbiAgICBJUm93RHJhZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElSb3dEcmFnRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkQ2xpcGJvYXJkRXZlbnQsXG4gICAgSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzLFxuICAgIElTZWFyY2hJbmZvLFxuICAgIElDZWxsUG9zaXRpb24sXG4gICAgSVJvd1RvZ2dsZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Sb3dFdmVudEFyZ3MsXG4gICAgSUdyaWRTY3JvbGxFdmVudEFyZ3MsXG4gICAgSUdyaWRFZGl0RG9uZUV2ZW50QXJncyxcbiAgICBJQWN0aXZlTm9kZUNoYW5nZUV2ZW50QXJncyxcbiAgICBJU29ydGluZ0V2ZW50QXJncyxcbiAgICBJRmlsdGVyaW5nRXZlbnRBcmdzLFxuICAgIElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZEV2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5naW5nRXZlbnRBcmdzLFxuICAgIElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJnc1xufSBmcm9tICcuL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IHsgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9hZHZhbmNlZC1maWx0ZXJpbmcvYWR2YW5jZWQtZmlsdGVyaW5nLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3JpZFR5cGUgfSBmcm9tICcuL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wUG9zaXRpb24gfSBmcm9tICcuL21vdmluZy9tb3Zpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIElneFJvd1NlbGVjdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi9zZWxlY3Rpb24vcm93LXNlbGVjdG9ycyc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElHcmlkU29ydGluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4Um93RHJhZ0dob3N0RGlyZWN0aXZlLCBJZ3hEcmFnSW5kaWNhdG9ySWNvbkRpcmVjdGl2ZSB9IGZyb20gJy4vcm93LWRyYWcuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneFNuYWNrYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vc25hY2tiYXIvc25hY2tiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSWd4QWN0aW9uU3RyaXBDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb24tc3RyaXAvYWN0aW9uLXN0cmlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZXByZWNhdGVQcm9wZXJ0eSB9IGZyb20gJy4uL2NvcmUvZGVwcmVjYXRlRGVjb3JhdG9ycyc7XG5sZXQgRkFLRV9ST1dfSUQgPSAtMTtcblxuY29uc3QgTUlOSU1VTV9DT0xVTU5fV0lEVEggPSAxMzY7XG5jb25zdCBGSUxURVJfUk9XX0hFSUdIVCA9IDUwO1xuLy8gQnkgZGVmYXVsdCByb3cgZWRpdGluZyBvdmVybGF5IG91dGxldCBpcyBpbnNpZGUgZ3JpZCBib2R5IHNvIHRoYXQgb3ZlcmxheSBpcyBoaWRkZW4gYmVsb3cgZ3JpZCBoZWFkZXIgd2hlbiBzY3JvbGxpbmcuXG4vLyBJbiBjYXNlcyB3aGVuIGdyaWQgaGFzIDEtMiByb3dzIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSBpbiBncmlkIGJvZHkgYW5kIHJvdyBlZGl0aW5nIG92ZXJsYXkgc2hvdWxkIGJlIHNob3duIGFib3ZlIGhlYWRlci5cbi8vIERlZmF1bHQgcm93IGVkaXRpbmcgb3ZlcmxheSBoZWlnaHQgaXMgaGlnaGVyIHRoZW4gcm93IGhlaWdodCB0aGF0IGlzIHdoeSB0aGUgY2FzZSBpcyB2YWxpZCBhbHNvIGZvciByb3cgd2l0aCAyIHJvd3MuXG4vLyBNb3JlIGFjY3VyYXRlIGNhbGN1bGF0aW9uIGlzIG5vdCBwb3NzaWJsZSwgY2F1c2Ugcm93IGVkaXRpbmcgb3ZlcmxheSBpcyBzdGlsbCBub3Qgc2hvd24gYW5kIHdlIGRvbid0IGtub3cgaXRzIGhlaWdodCxcbi8vIGJ1dCBpbiB0aGUgc2FtZSB0aW1lIHdlIG5lZWQgdG8gc2V0IHJvdyBlZGl0aW5nIG92ZXJsYXkgb3V0bGV0IGJlZm9yZSBvcGVuaW5nIHRoZSBvdmVybGF5IGl0c2VsZi5cbmNvbnN0IE1JTl9ST1dfRURJVElOR19DT1VOVF9USFJFU0hPTEQgPSAyO1xuXG5leHBvcnQgY29uc3QgSWd4R3JpZFRyYW5zYWN0aW9uID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ0lneEdyaWRUcmFuc2FjdGlvbicpO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJZ3hHcmlkQmFzZURpcmVjdGl2ZSBleHRlbmRzIERpc3BsYXlEZW5zaXR5QmFzZSBpbXBsZW1lbnRzIEdyaWRUeXBlLFxuICAgIE9uSW5pdCwgRG9DaGVjaywgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGRpc3BsYXkgdGltZSBmb3IgdGhlIHJvdyBhZGRpbmcgc25hY2tiYXIgbm90aWZpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIDYwMDBtcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzbmFja2JhckRpc3BsYXlUaW1lID0gNjAwMDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB0aGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIFdoZW4gc2V0IHRvIHRydWUsIGl0IHdpbGwgb3ZlcnJpZGUgYWxsIGNvbHVtbnMgZGVjbGFyZWQgdGhyb3VnaCBjb2RlIG9yIGluIG1hcmt1cC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXV0b0dlbmVyYXRlID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSBjdXN0b20gdGVtcGxhdGUgd2hlbiBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFtlbXB0eUdyaWRUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlbXB0eUdyaWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgYWRkaW5nIHJvdyBVSSB3aGVuIGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbYWRkUm93RW1wdHlUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhZGRSb3dFbXB0eVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHdoZW4gbG9hZGluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFtsb2FkaW5nR3JpZFRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxvYWRpbmdHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgY29weSBiZWhhdmlvciBvZiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjbGlwYm9hcmRPcHRpb25zID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgY29weSBiZWhhdmlvclxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluY2x1ZGUgdGhlIGNvbHVtbnMgaGVhZGVycyBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlIZWFkZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbHkgdGhlIGNvbHVtbnMgZm9ybWF0dGVycyAoaWYgYW55KSBvbiB0aGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlGb3JtYXR0ZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNlcGFyYXRvciB1c2VkIGZvciBmb3JtYXR0aW5nIHRoZSBjb3B5IG91dHB1dC4gRGVmYXVsdHMgdG8gYFxcdGAuXG4gICAgICAgICAqL1xuICAgICAgICBzZXBhcmF0b3I6ICdcXHQnXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUgb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggZmlsdGVyaW5nIHdhcyBwZXJmb3JtZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UpPVwiZmlsdGVyaW5nRXhwclRyZWVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgIChhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSk9XCJhZHZhbmNlZEZpbHRlcmluZ0V4cHJUcmVlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBncmlkIGlzIHNjcm9sbGVkIGhvcml6b250YWxseS92ZXJ0aWNhbGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChvblNjcm9sbCk9XCJvblNjcm9sbCgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25TY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkU2Nyb2xsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgY3VycmVudCBwYWdlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYHBlclBhZ2VgIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBncmlkIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHBlclBhZ2VDaGFuZ2UpPVwib25QZXJQYWdlQ2hhbmdlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QZXJQYWdlQ2hhbmdlKHBlclBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5wZXJQYWdlID0gcGVyUGFnZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBlclBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSBgbmctdGVtcGxhdGVgIGZvciB0aGUgcGFnaW5hdGlvbiBVSSBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbcGFnaW5nXT1cInRydWVcIiBbbXlUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2hlaWdodF09XCInMzA1cHgnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYWdpbmF0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY2xhc3MgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3R5bGluZyBjbGFzc2VzIGFwcGxpZWQgdG8gYWxsIGV2ZW4gYElneEdyaWRSb3dDb21wb25lbnRgcyBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2V2ZW5Sb3dDU1NdPVwiJ2lneC1ncmlkLS1teS1ldmVuLWNsYXNzJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZXZlblJvd0NTUyA9ICdpZ3gtZ3JpZF9fdHItLWV2ZW4nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdHlsaW5nIGNsYXNzZXMgYXBwbGllZCB0byBhbGwgb2RkIGBJZ3hHcmlkUm93Q29tcG9uZW50YHMgaW4gdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtldmVuUm93Q1NTXT1cIidpZ3gtZ3JpZC0tbXktb2RkLWNsYXNzJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb2RkUm93Q1NTID0gJ2lneC1ncmlkX190ci0tb2RkJztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcHJpbWFyeUtleTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIHVuaXF1ZSB2YWx1ZXMgc3RyYXRlZ3kgdXNlZCBieSB0aGUgRXhjZWwgU3R5bGUgRmlsdGVyaW5nXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFByb3ZpZGVzIGEgY2FsbGJhY2sgZm9yIGxvYWRpbmcgdW5pcXVlIGNvbHVtbiB2YWx1ZXMgb24gZGVtYW5kLlxuICAgICAqIElmIHRoaXMgcHJvcGVydHkgaXMgcHJvdmlkZWQsIHRoZSB1bmlxdWUgdmFsdWVzIGl0IGdlbmVyYXRlcyB3aWxsIGJlIHVzZWQgYnkgdGhlIEV4Y2VsIFN0eWxlIEZpbHRlcmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlck1vZGVdPVwiJ2V4Y2VsU3R5bGVGaWx0ZXInXCIgW3VuaXF1ZUNvbHVtblZhbHVlc1N0cmF0ZWd5XT1cImNvbHVtblZhbHVlc1N0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB1bmlxdWVDb2x1bW5WYWx1ZXNTdHJhdGVneTogKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LFxuICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGRvbmU6ICh2YWx1ZXM6IGFueVtdKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB7IHJlYWQ6IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50LCB7IHJlYWQ6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBoZWFkZXJHcm91cHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGBJZ3hHcmlkQ2VsbENvbXBvbmVudGAgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsQ29tcG9uZW50YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKG9uQ2VsbENsaWNrKT1cIm9uQ2VsbENsaWNrKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNlbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGBJZ3hHcmlkQ2VsbENvbXBvbmVudGAgaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqICBSZXR1cm5zIHRoZSBgSWd4R3JpZENlbGxDb21wb25lbnRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAob25TZWxlY3Rpb24pPVwib25DZWxsU2VsZWN0KCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEVtaXR0ZWQgd2hlbiBgSWd4R3JpZFJvd0NvbXBvbmVudGAgaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKG9uUm93U2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2VsbENsaWNrQ2hhbmdlKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblJvd1NlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1NlbGVjdGlvbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqICBFbWl0dGVkIHdoZW4gYElneENvbHVtbkNvbXBvbmVudGAgaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKG9uQ29sdW1uU2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ29sdW1uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNvbHVtblNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblNlbGVjdGlvbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGlzIHBpbm5lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgY29sdW1uIG1heSBiZSBjaGFuZ2VkIHRocm91Z2ggdGhlIGBpbnNlcnRBdEluZGV4YCBwcm9wZXJ0eS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgY29sdW1uUGlubmluZyhldmVudCkge1xuICAgICAqICAgICBpZiAoZXZlbnQuY29sdW1uLmZpZWxkID09PSBcIk5hbWVcIikge1xuICAgICAqICAgICAgIGV2ZW50Lmluc2VydEF0SW5kZXggPSAwO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNvbHVtblBpbm5pbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYElneENvbHVtbkNvbXBvbmVudGAgaXMgcGlubmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgaW5kZXggdGhhdCB0aGUgY29sdW1uIGlzIGluc2VydGVkIGF0IG1heSBiZSBjaGFuZ2VkIHRocm91Z2ggdGhlIGBpbnNlcnRBdEluZGV4YCBwcm9wZXJ0eS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgY29sdW1uUGlubmluZyhldmVudCkge1xuICAgICAqICAgICBpZiAoZXZlbnQuY29sdW1uLmZpZWxkID09PSBcIk5hbWVcIikge1xuICAgICAqICAgICAgIGV2ZW50Lmluc2VydEF0SW5kZXggPSAwO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5QaW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Db2x1bW5FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBlbnRlcnMgZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGV4aXRzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXRFeGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgaGFzIGJlZW4gZWRpdGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFdmVudCBpcyBmaXJlZCBhZnRlciBlZGl0aW5nIGlzIGNvbXBsZXRlZCwgd2hlbiB0aGUgY2VsbCBpcyBleGl0aW5nIGVkaXQgbW9kZS5cbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXQpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNlbGwgaGFzIGJlZW4gZWRpdGVkIGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0RG9uZSk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXREb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGVudGVycyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RW50ZXIpPVwiZWRpdFN0YXJ0KCRldmVudClcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFbWl0dGVkIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KHRydWUpYCBpcyBjYWxsZWQuXG4gICAgICogRW1pdHRlZCB3aGVuIGNoYW5naW5nIHJvd3MgZHVyaW5nIGVkaXQgbW9kZSwgc2VsZWN0aW5nIGFuIHVuLWVkaXRhYmxlIGNlbGwgaW4gdGhlIGVkaXRlZCByb3csXG4gICAgICogcGVyZm9ybWluZyBwYWdpbmcgb3BlcmF0aW9uLCBjb2x1bW4gcmVzaXppbmcsIHBpbm5pbmcsIG1vdmluZyBvciBoaXR0aW5nIGBEb25lYFxuICAgICAqIGJ1dHRvbiBpbnNpZGUgb2YgdGhlIHJvd0VkaXRpbmdPdmVybGF5LCBvciBoaXR0aW5nIHRoZSBgRW50ZXJgIGtleSB3aGlsZSBlZGl0aW5nIGEgY2VsbC5cbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdCk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGV4aXRpbmcgZWRpdCBtb2RlIGZvciBhIHJvdyBhbmQgZWRpdGluZyBoYXMgYmVlbiBjb21taXR0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXREb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHJvdyBlZGl0aW5nIGlzIGNhbmNlbGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFbWl0cyB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdChmYWxzZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgaGl0dGluZyBgRXNjYCBrZXkgZHVyaW5nIGNlbGwgZWRpdGluZyBhbmQgd2hlbiBjbGljayBvbiB0aGUgYENhbmNlbGAgYnV0dG9uXG4gICAgICogaW4gdGhlIHJvdyBlZGl0aW5nIG92ZXJsYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdEV4aXQpPVwiZWRpdEV4aXQoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdEV4aXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb2x1bW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtvbkNvbHVtbkluaXRdPVwiaW5pdENvbHVtbnMoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29sdW1uSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8SWd4Q29sdW1uQ29tcG9uZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc29ydGluZyBleHByZXNzaW9ucyBhcmUgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBgSVNvcnRpbmdFdmVudEFyZ3NgIG9iamVjdC4gYHNvcnRpbmdFeHByZXNzaW9uc2Aga2V5IGhvbGRzIHRoZSBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAob25Tb3J0aW5nKT1cInNvcnRpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNvcnRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBzb3J0aW5nIGlzIGNvbXBsZXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc29ydGluZyBleHByZXNzaW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAob25Tb3J0aW5nRG9uZSk9XCJzb3J0aW5nRG9uZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Tb3J0aW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFeHByZXNzaW9uIHwgQXJyYXk8SVNvcnRpbmdFeHByZXNzaW9uPj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIGZpbHRlcmluZyBleHByZXNzaW9ucyBhcmUgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBgSUZpbHRlcmluZ0V2ZW50QXJnc2Agb2JqZWN0LiBgZmlsdGVyaW5nRXhwcmVzc2lvbnNgIGtleSBob2xkcyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgY29sdW1uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZmlsdGVyaW5nKT1cImZpbHRlcmluZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZmlsdGVyaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIHRocm91Z2ggdGhlIFVJLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgdHJlZSBvZiB0aGUgY29sdW1uIGZvciB3aGljaCBmaWx0ZXJpbmcgd2FzIHBlcmZvcm1lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKG9uRmlsdGVyaW5nRG9uZSk9XCJmaWx0ZXJpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkZpbHRlcmluZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHBhZ2luZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIHByZXZpb3VzIGFuZCBuZXh0IHBhZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAob25QYWdpbmdEb25lKT1cInBhZ2luZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUGFnaW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgYWRkZWQgdGhyb3VnaCB0aGUgQVBJLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZvciB0aGUgbmV3IGBJZ3hHcmlkUm93Q29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChvblJvd0FkZGVkKT1cInJvd0FkZGVkKCRldmVudClcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblJvd0FkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHJvdyBpcyBkZWxldGVkIHRocm91Z2ggQVBJLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJUm93RGF0YUV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAob25Sb3dEZWxldGVkKT1cInJvd0RlbGV0ZWQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUm93RGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RhdGFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNvbHVtbiBpcyByZXNpemVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QncyBvbGQgYW5kIG5ldyB3aWR0aC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKG9uQ29sdW1uUmVzaXplZCk9XCJyZXNpemluZygkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Db2x1bW5SZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uUmVzaXplRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyByaWdodCBjbGlja2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4R3JpZENlbGxDb21wb25lbnRgIG9iamVjdC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChvbkNvbnRleHRNZW51KT1cImNvbnRleHRNZW51KCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNvbnRleHRNZW51ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIGRvdWJsZSBjbGlja2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4R3JpZENlbGxDb21wb25lbnRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKG9uRG91YmxlQ2xpY2spPVwiZGJsQ2xpY2soJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uRG91YmxlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIGNvbHVtbiB2aXNpYmlsaXR5IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFyZ3M6IHsgY29sdW1uOiBhbnksIG5ld1ZhbHVlOiBib29sZWFuIH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiAoY29sdW1uVmlzaWJpbGl0eUNoYW5naW5nKT1cInZpc2liaWxpdHlDaGFuZ2luZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uVmlzaWJpbGl0eUNoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uVmlzaWJpbGl0eUNoYW5naW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBjb2x1bW4gdmlzaWJpbGl0eSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBcmdzOiB7IGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LCBuZXdWYWx1ZTogYm9vbGVhbiB9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWQpPVwidmlzaWJpbGl0eUNoYW5nZWQoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjb2x1bW4gbW92aW5nIHN0YXJ0cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgbW92ZWQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIChvbkNvbHVtbk1vdmluZ1N0YXJ0KT1cIm1vdmluZ1N0YXJ0KCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNvbHVtbk1vdmluZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGR1cmluZyB0aGUgY29sdW1uIG1vdmluZyBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGBJZ3hDb2x1bW5Db21wb25lbnRgIG9iamVjdHMuIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiAob25Db2x1bW5Nb3ZpbmcpPVwibW92aW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNvbHVtbk1vdmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbk1vdmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjb2x1bW4gbW92aW5nIGVuZHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGBJZ3hDb2x1bW5Db21wb25lbnRgIG9iamVjdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKG9uQ29sdW1uTW92aW5nRW5kKT1cIm1vdmluZ0VuZHMoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29sdW1uTW92aW5nRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGtleWRvd24gaXMgdHJpZ2dlcmVkIG92ZXIgZWxlbWVudCBpbnNpZGUgZ3JpZCdzIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgb25seSBpZiB0aGUga2V5IGNvbWJpbmF0aW9uIGlzIHN1cHBvcnRlZCBpbiB0aGUgZ3JpZC5cbiAgICAgKiBSZXR1cm4gdGhlIHRhcmdldCB0eXBlLCB0YXJnZXQgb2JqZWN0IGFuZCB0aGUgb3JpZ2luYWwgZXZlbnQuIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkIChvbkdyaWRLZXlkb3duKT1cImN1c3RvbUtleWRvd24oJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uR3JpZEtleWRvd24gPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkS2V5ZG93bkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBzdGFydCBkcmFnZ2luZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJuIHRoZSBkcmFnZ2VkIHJvdy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Sb3dEcmFnU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEcmFnU3RhcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZHJvcHBpbmcgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybiB0aGUgZHJvcHBlZCByb3cuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUm93RHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb3B5IG9wZXJhdGlvbiBpcyBleGVjdXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRmlyZWQgb25seSBpZiBjb3B5IGJlaGF2aW9yIGlzIGVuYWJsZWQgdGhyb3VnaCB0aGUgW2BjbGlwYm9hcmRPcHRpb25zYF17QGxpbmsgSWd4R3JpZEJhc2VEaXJlY3RpdmUjY2xpcGJvYXJkT3B0aW9uc30uXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgb25HcmlkQ29weSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDbGlwYm9hcmRFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGV4cGFuc2lvblN0YXRlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWFwPGFueSwgYm9vbGVhbj4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGV4cGFuZGVkIHN0YXRlIG9mIGEgcm93IGdldHMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJlbXBsb3llZURhdGFcIiAob25Sb3dUb2dnbGUpPVwicm93VG9nZ2xlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblJvd1RvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1RvZ2dsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGlubmVkIHN0YXRlIG9mIGEgcm93IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKG9uUm93UGlubmluZyk9XCJyb3dQaW4oJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUm93UGlubmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQgd2hlbiB0aGUgYWN0aXZlIG5vZGUgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoYWN0aXZlTm9kZUNoYW5nZSk9XCJhY3RpdmVOb2RlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVOb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQWN0aXZlTm9kZUNoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHNvcnRpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoc29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlKT1cInNvcnRpbmdFeHByQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYW4gZXhwb3J0IHByb2Nlc3MgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdG9vbGJhckV4cG9ydGluZyhldmVudDogSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzKXtcbiAgICAgKiAgICAgY29uc3QgdG9vbGJhckV4cG9ydGluZyA9IGV2ZW50O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Ub29sYmFyRXhwb3J0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiBFbmQgb2YgdG9vbGJhciByZWxhdGVkIGRlZmluaXRpb25zICovXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbWFraW5nIGEgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSYW5nZSBzZWxlY3Rpb24gY2FuIGJlIG1hZGUgZWl0aGVyIHRocm91Z2ggZHJhZyBzZWxlY3Rpb24gb3IgdGhyb3VnaCBrZXlib2FyZCBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUmFuZ2VTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRTZWxlY3Rpb25SYW5nZT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIGFmdGVyIHRoZSBuZ0FmdGVyVmlld0luaXQgaG9vay4gQXQgdGhpcyBwb2ludCB0aGUgZ3JpZCBleGlzdHMgaW4gdGhlIERPTSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW5kZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGxvY2FsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHRoZSBncmlkJ3MgZGF0YSB2aWV3IGlzIGNoYW5nZWQgYmVjYXVzZSBvZiBhIGRhdGEgb3BlcmF0aW9uLCByZWJpbmRpbmcsIGV0Yy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGRhdGFDaGFuZ2luZyk9J2hhbmRsZURhdGFDaGFuZ2luZ0V2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgIEBPdXRwdXQoKVxuICAgICBwdWJsaWMgZGF0YUNoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJRm9yT2ZEYXRhQ2hhbmdpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHRoZSBncmlkJ3MgZGF0YSB2aWV3IGlzIGNoYW5nZWQgYmVjYXVzZSBvZiBhIGRhdGEgb3BlcmF0aW9uLCByZWJpbmRpbmcsIGV0Yy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGRhdGFDaGFuZ2VkKT0naGFuZGxlRGF0YUNoYW5nZWRFdmVudCgpJz48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneFNuYWNrYmFyQ29tcG9uZW50KVxuICAgIHB1YmxpYyBhZGRSb3dTbmFja2JhcjogSWd4U25hY2tiYXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQpXG4gICAgcHVibGljIHJlc2l6ZUxpbmU6IElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsb2FkaW5nT3ZlcmxheScsIHsgcmVhZDogSWd4VG9nZ2xlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ092ZXJsYXk6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nT3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneENvbHVtbkNvbXBvbmVudCwgeyByZWFkOiBJZ3hDb2x1bW5Db21wb25lbnQsIGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIGNvbHVtbkxpc3Q6IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+ID0gbmV3IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KCk7XG5cbiAgICBAQ29udGVudENoaWxkKElneEFjdGlvblN0cmlwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBhY3Rpb25TdHJpcDogSWd4QWN0aW9uU3RyaXBDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEEgdGVtcGxhdGUgcmVmZXJlbmNlIGZvciB0aGUgdGVtcGxhdGUgd2hlbiB0aGUgZmlsdGVyZWQgZ3JpZCBpcyBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogY29uc3QgZW1wdHlUZW1wYWx0ZSA9IHRoaXMuZ3JpZC5lbXB0eUdyaWRUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdlbXB0eUZpbHRlcmVkR3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBlbXB0eUZpbHRlcmVkR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSByZWZlcmVuY2UgZm9yIHRoZSB0ZW1wbGF0ZSB3aGVuIHRoZSBncmlkIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBlbXB0eVRlbXBhbHRlID0gdGhpcy5ncmlkLmVtcHR5R3JpZFRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFbXB0eUdyaWQnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZW1wdHlHcmlkRGVmYXVsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0TG9hZGluZ0dyaWQnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ0dyaWREZWZhdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcGFyZW50VmlydERpcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIHsgcmVhZDogSWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgaGVhZFNlbGVjdG9yc1RlbXBsYXRlczogUXVlcnlMaXN0PElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZSwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIHJvd1NlbGVjdG9yc1RlbXBsYXRlczogUXVlcnlMaXN0PElneFJvd1NlbGVjdG9yRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0RyYWdHaG9zdERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd2ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdmVydGljYWxTY3JvbGxDb250YWluZXI6IElneEdyaWRGb3JPZkRpcmVjdGl2ZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd2ZXJ0aWNhbFNjcm9sbEhvbGRlcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdmVydGljYWxTY3JvbGw6IElneEdyaWRGb3JPZkRpcmVjdGl2ZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzY3InLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBzY3I6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2Zvb3RlcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBmb290ZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlckNvbnRhaW5lcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclNlbGVjdG9yQ29udGFpbmVyJylcbiAgICBwdWJsaWMgaGVhZGVyU2VsZWN0b3JDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlckRyYWdDb250YWluZXInKVxuICAgIHB1YmxpYyBoZWFkZXJEcmFnQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJHcm91cENvbnRhaW5lcicpXG4gICAgcHVibGljIGhlYWRlckdyb3VwQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdmaWx0ZXJpbmdSb3cnLCB7IHJlYWQ6IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQgfSlcbiAgICBwdWJsaWMgZmlsdGVyaW5nUm93OiBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0aGVhZFJvdycsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRoZWFkUm93OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRib2R5OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdwaW5Db250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgcGluQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Zm9vdCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRmb290OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hSb3dFZGl0aW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUsIHsgcmVhZDogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdG1wT3V0bGV0czogUXVlcnlMaXN0PGFueT4gPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkcmFnSW5kaWNhdG9ySWNvbkJhc2UnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZHJhZ0luZGljYXRvckljb25CYXNlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRDdXN0b21EaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRleHREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFZGl0VGV4dERpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRBY3Rpb25zRGlyZWN0aXZlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xuXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSByb3cgZXhwYW5kIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFJvd0V4cGFuZGVkSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgcm93IGNvbGxhcHNlIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFJvd0NvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgZXhwYW5kIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckV4cGFuZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBoZWFkZXJFeHBhbmRJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgY29sbGFwc2UgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4SGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgaGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSByb3cgZXhwYW5kIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4RHJhZ0luZGljYXRvckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBkcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlKVxuICAgIHB1YmxpYyByb3dFZGl0VGFic0RFRkFVTFQ6IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgcm93RWRpdFRhYnNDVVNUT006IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Jvd0VkaXRpbmdPdmVybGF5JywgeyByZWFkOiBJZ3hUb2dnbGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgcm93RWRpdGluZ092ZXJsYXk6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGhvc3RSb2xlID0gJ2dyaWQnO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hHcmlkVG9vbGJhckNvbXBvbmVudClcbiAgICBwdWJsaWMgdG9vbGJhcjogUXVlcnlMaXN0PElneEdyaWRUb29sYmFyQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaWd4RmlsdGVyaW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIF9vdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFeHBhbmRlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRFeHBhbmRlZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0Q29sbGFwc2VkVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdENvbGxhcHNlZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RVNGSGVhZGVySWNvbicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RVNGSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZHJlbignc3VtbWFyeVJvdycsIHsgcmVhZDogSWd4U3VtbWFyeVJvd0NvbXBvbmVudCB9KVxuICAgIHByb3RlY3RlZCBfc3VtbWFyeVJvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hTdW1tYXJ5Um93Q29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3JvdycpXG4gICAgcHJpdmF0ZSBfcm93TGlzdDogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncGlubmVkUm93JylcbiAgICBwcml2YXRlIF9waW5uZWRSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRSb3dFZGl0VGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIGRlZmF1bHRSb3dFZGl0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0RpcmVjdGl2ZSwgeyByZWFkOiBJZ3hSb3dEaXJlY3RpdmUgfSlcbiAgICBwcml2YXRlIF9kYXRhUm93TGlzdDogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZT4+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElHcmlkUmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Jlc291cmNlU3RyaW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElHcmlkUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MuR3JpZFJlc1N0cmluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsQWRkTW9kZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBmaWx0ZXJpbmcgbG9naWMgb2YgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgaXMgQU5ELlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2ZpbHRlcmluZ0xvZ2ljXT1cImZpbHRlcmluZ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmluZ0xvZ2ljKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyaW5nTG9naWModmFsdWU6IEZpbHRlcmluZ0xvZ2ljKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbKGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSldPVwibW9kZWwuZmlsdGVyaW5nRXhwcmVzc2lvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAodmFsdWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWwuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQsIHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0uZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2godmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gPSBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZS50eXBlID0gRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZS5SZWd1bGFyO1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVmcmVzaEV4cHJlc3Npb25zKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAqIHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGxvZ2ljO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICB2YWx1ZS50eXBlID0gRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZS5BZHZhbmNlZDtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSAmJlxuICAgICAgICAgICAgIXRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMub25GaWx0ZXJpbmdEb25lLmVtaXQodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGxvY2FsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbm90IHNldCwgcmV0dXJucyBicm93c2VyJ3MgbGFuZ3VhZ2UuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9sb2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZUNoYW5nZS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ01vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmdNb2RlKHZhbDogR3JpZFBhZ2luZ01vZGUpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nTW9kZSA9IHZhbDtcbiAgICAgICAgdGhpcy5fcGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBwYWdpbmcgZmVhdHVyZSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBzdGF0ZSBpcyBkaXNhYmxlZCAoZmFsc2UpLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW3BhZ2luZ109XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luZyA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBjdXJyZW50IHBhZ2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbcGFnaW5nXT1cInRydWVcIiBbKHBhZ2UpXT1cIm1vZGVsLnBhZ2VcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsID09PSB0aGlzLl9wYWdlIHx8IHZhbCA8IDAgfHwgdmFsID4gdGhpcy50b3RhbFBhZ2VzIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5vblBhZ2luZ0RvbmUuZW1pdCh7IHByZXZpb3VzOiB0aGlzLl9wYWdlLCBjdXJyZW50OiB2YWwgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2UgPSB2YWw7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMuX3BhZ2UpO1xuICAgICAgICB0aGlzLm5hdmlnYXRlVG8oMCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgbnVtYmVyIG9mIHZpc2libGUgaXRlbXMgcGVyIHBhZ2UuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IGlzIDE1LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3BhZ2luZ109XCJ0cnVlXCIgWyhwZXJQYWdlKV09XCJtb2RlbC5wZXJQYWdlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGVyUGFnZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGVyUGFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBlclBhZ2UodmFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHZhbCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodHJ1ZSk7XG4gICAgICAgIHRoaXMuX3BlclBhZ2UgPSB2YWw7XG4gICAgICAgIHRoaXMucGVyUGFnZUNoYW5nZS5lbWl0KHRoaXMuX3BlclBhZ2UpO1xuICAgICAgICB0aGlzLnBhZ2UgPSAwO1xuICAgICAgICB0aGlzLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgY29sdW1uIGhpZGluZyBVSSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyBkaXNhYmxlZCAoZmFsc2UpLiBJbiBvcmRlciBmb3IgdGhlIFVJIHRvIHdvcmssIHlvdSBuZWVkIHRvIGVuYWJsZSB0aGUgdG9vbGJhciBhcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2Bjb2x1bW5IaWRpbmdgIGlzIGRlcHJlY2F0ZWQuJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uSGlkaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uSGlkaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uSGlkaW5nKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkhpZGluZyA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgaWYgdGhlIHJvdyBzZWxlY3RvcnMgYXJlIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogIEJ5IGRlZmF1bHQgcm93IHNlbGVjdG9ycyBhcmUgc2hvd25cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGlkZVJvd1NlbGVjdG9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVSb3dTZWxlY3RvcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoaWRlUm93U2VsZWN0b3JzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2hpZGVSb3dTZWxlY3RvcnMgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHJvd3MgY2FuIGJlIG1vdmVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtyb3dEcmFnZ2FibGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0RyYWdnYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0RyYWcgJiYgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucztcbiAgICB9XG5cblxuICAgIHB1YmxpYyBzZXQgcm93RHJhZ2dhYmxlKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yb3dEcmFnID0gdmFsO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IElEIHRoYXQgaXMgYmVpbmcgZHJhZ2dlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHJvdyBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkcmFnUm93SUQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJhbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRSb3dQYXJlbnQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIHJvd3MgYXJlIGVkaXRhYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFZGl0YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJvd0VkaXRhYmxlKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEdyaWRTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jvd0VkaXRhYmxlID0gdmFsO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGhlaWdodC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhlaWdodCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5faGVpZ2h0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKVxuICAgIHB1YmxpYyBnZXQgaG9zdFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGggfHwgdGhpcy5faG9zdFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgd2lkdGggb2YgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZ3JpZFdpZHRoID0gdGhpcy5ncmlkLndpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgd2lkdGgodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dpZHRoICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIGhlYWRlci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIGxldCBncmlkSGVhZGVyV2lkdGggPSB0aGlzLmdyaWQuaGVhZGVyV2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSAtIDE3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcm93IGhlaWdodC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtyb3dIZWlnaHRdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93SGVpZ2h0ID8gdGhpcy5fcm93SGVpZ2h0IDogdGhpcy5kZWZhdWx0Um93SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93SGVpZ2h0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3Jvd0hlaWdodCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2NvbHVtbldpZHRoXT1cIjEwMFwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbldpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2x1bW5XaWR0aCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbldpZHRoID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0L1NldHMgdGhlIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlY29yZHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtlbXB0eUdyaWRNZXNzYWdlXT1cIidUaGUgZ3JpZCBpcyBlbXB0eSdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBlbXB0eUdyaWRNZXNzYWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZW1wdHlHcmlkTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGVtcHR5R3JpZE1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtcHR5R3JpZE1lc3NhZ2UgfHwgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZW1wdHlHcmlkX21lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIGdyaWQgaXMgZ29pbmcgdG8gc2hvdyBhIGxvYWRpbmcgaW5kaWNhdG9yLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbaXNMb2FkaW5nXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBpc0xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9hZGluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzTG9hZGluZyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGN1cnJlbnQgZGV0ZWN0aW9uIGN5Y2xlIHRvIGVuZCBiZWZvcmUgdHJpZ2dlcmluZyBhIG5ldyBvbmUuXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvYWRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIGNvbHVtbnMgc2hvdWxkIGJlIGF1dG8tZ2VuZXJhdGVkIG9uY2UgYWdhaW4gYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBncmlkXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgd2lsbCBhbGxvdyB0byBiaW5kIHRoZSBncmlkIHRvIHJlbW90ZSBkYXRhIGFuZCBoYXZpbmcgYXV0by1nZW5lcmF0ZWQgY29sdW1ucyBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAqIE5vdGUgdGhhdCBhZnRlciBnZW5lcmF0aW5nIHRoZSBjb2x1bW5zLCB0aGlzIHByb3BlcnR5IHdvdWxkIGJlIGRpc2FibGVkIHRvIGF2b2lkIHJlLWNyZWF0aW5nXG4gICAgICogY29sdW1ucyBlYWNoIHRpbWUgYSBuZXcgZGF0YSBpcyBhc3NpZ25lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgdGhpcy5ncmlkLnNob3VsZEdlbmVyYXRlID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvdWxkR2VuZXJhdGU6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlY29yZHMgYW5kIHRoZSBncmlkIGlzIGZpbHRlcmVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkTWVzc2FnZV09XCInVGhlIGdyaWQgaXMgZW1wdHknXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSB8fCB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9lbXB0eUZpbHRlcmVkR3JpZF9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGl0bGUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBidWlsdC1pbiBjb2x1bW4gaGlkaW5nIFVJLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIGNvbHVtbkhpZGluZ1RpdGxlPVwiQ29sdW1uIEhpZGluZ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgY29sdW1uSGlkaW5nVGl0bGVgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5IaWRpbmdUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uSGlkaW5nVGl0bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uSGlkaW5nVGl0bGUodjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkhpZGluZ1RpdGxlID0gdjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkhpZGluZ1RpdGxlSW50ZXJuYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkhpZGluZ1RpdGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaW5pdGlhbCBwaW5uaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsbG93cyB0byBhcHBseSBwaW5uaW5nIHRoZSBjb2x1bW5zIHRvIHRoZSBzdGFydCBvciB0aGUgZW5kLlxuICAgICAqIE5vdGUgdGhhdCBwaW5uaW5nIHRvIGJvdGggc2lkZXMgYXQgYSB0aW1lIGlzIG5vdCBhbGxvd2VkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbcGlubmluZ109XCJwaW5uaW5nQ29uZmlnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5pbmc7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcGlubmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uaW5nID0gdmFsdWU7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgaWYgdGhlIGJ1aWx0LWluIGNvbHVtbiBwaW5uaW5nIFVJIHNob3VsZCBiZSBzaG93biBpbiB0aGUgdG9vbGJhci5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2NvbHVtblBpbm5pbmddPVwiJ3RydWVcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBEZXByZWNhdGVQcm9wZXJ0eSgnYGNvbHVtblBpbm5pbmdgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5QaW5uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUGlubmluZztcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2x1bW5QaW5uaW5nKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblBpbm5pbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0aXRsZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJIG9mIHRoZSBjb2x1bW4gcGlubmluZy5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2NvbHVtblBpbm5pbmddPVwiJ3RydWVcIiBbY29sdW1uUGlubmluZ1RpdGxlXT1cIidDb2x1bW4gSGlkaW5nJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgY29sdW1uUGlubmluZ1RpdGxlYCBpcyBkZXByZWNhdGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uUGlubmluZ1RpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5QaW5uaW5nVGl0bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uUGlubmluZ1RpdGxlKHY6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jb2x1bW5QaW5uaW5nVGl0bGUgPSB2O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uUGlubmluZ1RpdGxlSW50ZXJuYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblBpbm5pbmdUaXRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgaWYgdGhlIGZpbHRlcmluZyBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthbGxvd0ZpbHRlcmluZ109XCJ0cnVlXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWxsb3dGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxvd0ZpbHRlcmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFsbG93RmlsdGVyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbGxvd0ZpbHRlcmluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FsbG93RmlsdGVyaW5nID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVnaXN0ZXJTVkdJY29ucygpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGNHcmlkSGVhZFJvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW4gPSBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthbGxvd0FkdmFuY2VkRmlsdGVyaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGFsbG93QWR2YW5jZWRGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyIG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlck1vZGVdPVwiJ3F1aWNrRmlsdGVyJ1wiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0J3Mgc2V0IHRvIEZpbHRlck1vZGUucXVpY2tGaWx0ZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlck1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJNb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyTW9kZSh2YWx1ZTogRmlsdGVyTW9kZSkge1xuICAgICAgICB0aGlzLl9maWx0ZXJNb2RlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3VtbWFyeSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBzdW1tYXJ5UG9zaXRpb249XCJ0b3BcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyBib3R0b20uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcnlQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlQb3NpdGlvbih2YWx1ZTogR3JpZFN1bW1hcnlQb3NpdGlvbikge1xuICAgICAgICB0aGlzLl9zdW1tYXJ5UG9zaXRpb24gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdW1tYXJ5IGNhbGN1bGF0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZT1cInJvb3RMZXZlbE9ubHlcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyByb290QW5kQ2hpbGRMZXZlbHMgd2hpY2ggbWVhbnMgdGhlIHN1bW1hcmllcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGhlIHJvb3QgbGV2ZWwgYW5kIGVhY2ggY2hpbGQgbGV2ZWwuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSh2YWx1ZTogR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSA9IHZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnJlc2V0U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgc3VtbWFyeSByb3cgaXMgdmlzaWJsZSB3aGVuIGdyb3VwQnkvcGFyZW50IHJvdyBpcyBjb2xsYXBzZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dTdW1tYXJ5T25Db2xsYXBzZV09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlIGlzIHNldCB0byAnZmFsc2UnIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN1bW1hcnkgcm93IGlzIG5vdCB2aXNpYmxlXG4gICAgICogd2hlbiB0aGUgZ3JvdXBCeS9wYXJlbnQgcm93IGlzIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd1N1bW1hcnlPbkNvbGxhcHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBzdHJhdGVneSBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlclN0cmF0ZWd5XT1cImZpbHRlclN0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyU3RyYXRlZ3koKTogSUZpbHRlcmluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmluZ1N0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyU3RyYXRlZ3koY2xhc3NSZWY6IElGaWx0ZXJpbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLl9maWx0ZXJpbmdTdHJhdGVneSA9IGNsYXNzUmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc29ydGluZyBzdHJhdGVneSBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3NvcnRTdHJhdGVneV09XCJzb3J0U3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0U3RyYXRlZ3koKTogSUdyaWRTb3J0aW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZ1N0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc29ydFN0cmF0ZWd5KHZhbHVlOiBJR3JpZFNvcnRpbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLl9zb3J0aW5nU3RyYXRlZ3kgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXByZXNlbnRzIHRoZSBzZWxlY3RlZCByb3dzJyBJRHMgKHByaW1hcnkga2V5IG9yIHJvd0RhdGEpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIHByaW1hcnlLZXk9XCJJRFwiIHJvd1NlbGVjdGlvbj1cIm11bHRpcGxlXCIgW3NlbGVjdGVkUm93c109XCJbMCwgMSwgMl1cIj48aWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkUm93cyhyb3dJRHM6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Um93cyhyb3dJRHMgfHwgW10sIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHMuZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCBgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGhlYWRlckdyb3Vwc0xpc3QgPSB0aGlzLmdyaWQuaGVhZGVyR3JvdXBzTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3Vwc0xpc3QoKTogSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJHcm91cHMgPyBmbGF0dGVuKHRoaXMuaGVhZGVyR3JvdXBzLnRvQXJyYXkoKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIGBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmdyaWQuaGVhZGVyQ2VsbExpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJDZWxsTGlzdCgpOiBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJHcm91cHNMaXN0Lm1hcCgoaGVhZGVyR3JvdXApID0+IGhlYWRlckdyb3VwLmhlYWRlckNlbGwpLmZpbHRlcigoaGVhZGVyQ2VsbCkgPT4gaGVhZGVyQ2VsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCBgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlsdGVyQ2VsbHMgPSB0aGlzLmdyaWQuZmlsdGVyQ2VsbExpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJDZWxsTGlzdCgpOiBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5tYXAoKGhlYWRlckdyb3VwKSA9PiBoZWFkZXJHcm91cC5maWx0ZXJDZWxsKS5maWx0ZXIoKGZpbHRlckNlbGwpID0+IGZpbHRlckNlbGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXNSb3dMaXN0KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9zdW1tYXJ5Um93TGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdW1MaXN0ID0gdGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKTtcbiAgICAgICAgcmVzLnJlc2V0KHN1bUxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgSWd4R3JpZFJvd0NvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dMaXN0ID0gdGhpcy5ncmlkLnJvd0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dMaXN0KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9yb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJMaXN0ID0gdGhpcy5fcm93TGlzdFxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIHJlcy5yZXNldChyTGlzdCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGN1cnJlbnRseSByZW5kZXJlZCBgSWd4R3JpZFJvd0NvbXBvbmVudGAncy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRhdGFMaXN0ID0gdGhpcy5ncmlkLmRhdGFSb3dMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVJvd0xpc3QoKTogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZT4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmU+PigpO1xuICAgICAgICBpZiAoIXRoaXMuX2RhdGFSb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJMaXN0ID0gdGhpcy5fZGF0YVJvd0xpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbCkuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICByZXMucmVzZXQockxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRTZWxlY3RvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZT4ge1xuICAgICAgICBpZiAodGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzICYmIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcy5maXJzdC50ZW1wbGF0ZVJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGlubmluZ1RvU3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5pbmcuY29sdW1ucyAhPT0gQ29sdW1uUGlubmluZ1Bvc2l0aW9uLkVuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Jvd1Bpbm5pbmdUb1RvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmluZy5yb3dzICE9PSBSb3dQaW5uaW5nUG9zaXRpb24uQm90dG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JEaXJlY3RpdmU+IHtcbiAgICAgICAgaWYgKHRoaXMucm93U2VsZWN0b3JzVGVtcGxhdGVzICYmIHRoaXMucm93U2VsZWN0b3JzVGVtcGxhdGVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMuZmlyc3QudGVtcGxhdGVSZWY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0Q3VzdG9tKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5yb3dFZGl0Q3VzdG9tRGlyZWN0aXZlcyAmJiB0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0Q3VzdG9tRGlyZWN0aXZlcy5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRleHQoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcyAmJiB0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdFRleHREaXJlY3RpdmVzLmZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0QWN0aW9ucygpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXMuZmlyc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDb250YWluZXIoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRDdXN0b20gPyB0aGlzLnJvd0VkaXRDdXN0b20gOiB0aGlzLmRlZmF1bHRSb3dFZGl0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSByb3cgZHJhZyBpbmRpY2F0b3IgaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgfHwgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlcy5maXJzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUodmFsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0luRWRpdE1vZGUoKTogSWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+IHtcbiAgICAgICAgY29uc3QgZWRpdFJvd1N0YXRlID0gdGhpcy5jcnVkU2VydmljZS5yb3c7XG4gICAgICAgIHJldHVybiBlZGl0Um93U3RhdGUgIT09IG51bGwgPyB0aGlzLnJvd0xpc3QuZmluZChlID0+IGUucm93SUQgPT09IGVkaXRSb3dTdGF0ZS5pZCkgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVkaXRhYmxlKVxuICAgICAgICAgICAgLm1hcChjID0+IGMudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIHJldHVybiBpbmRleC5sZW5ndGggPyBpbmRleFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxhc3RFZGl0YWJsZUNvbHVtbkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lZGl0YWJsZSlcbiAgICAgICAgICAgIC5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSA+IGIgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gaW5kZXgubGVuZ3RoID8gaW5kZXhbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVE9ETzogTmF2IHNlcnZpY2UgbG9naWMgZG9lc24ndCBoYW5kbGUgMCByZXN1bHRzIGZyb20gdGhpcyBxdWVyeWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRUYWJzKCk6IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0VGFic0NVU1RPTS5sZW5ndGggPyB0aGlzLnJvd0VkaXRUYWJzQ1VTVE9NIDogdGhpcy5yb3dFZGl0VGFic0RFRkFVTFQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmVEZXNjZW5kYW50KCkge1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtID0gdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGU7XG5cbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtIHx8ICFPYmplY3Qua2V5cyhhY3RpdmVFbGVtKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW0ucm93IDwgMCA/XG4gICAgICAgIGAke3RoaXMuaWR9XyR7YWN0aXZlRWxlbS5yb3d9XyR7YWN0aXZlRWxlbS5tY2hDYWNoZS5sZXZlbH1fJHthY3RpdmVFbGVtLmNvbHVtbn1gIDpcbiAgICAgICAgYCR7dGhpcy5pZH1fJHthY3RpdmVFbGVtLnJvd31fJHthY3RpdmVFbGVtLmNvbHVtbn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmNsYXNzJylcbiAgICBwdWJsaWMgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gW3RoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtZ3JpZCcpXTtcbiAgICAgICAgLy8gVGhlIGN1c3RvbSBjbGFzc2VzIHNob3VsZCBiZSBhdCB0aGUgZW5kLlxuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5jbGFzcyk7XG4gICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJhbm5lckNsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneS5pc1RvcCA/ICdpZ3gtYmFubmVyX19ib3JkZXItdG9wJyA6ICdpZ3gtYmFubmVyX19ib3JkZXItYm90dG9tJztcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtYmFubmVyJyl9ICR7cG9zaXRpb259YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlwZVRyaWdnZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpcGVUcmlnZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdQaXBlVHJpZ2dlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nUGlwZVRyaWdnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlQaXBlVHJpZ2dlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeVBpcGVUcmlnZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc29ydGluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBkYXRhIGJpbmRpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbKHNvcnRpbmdFeHByZXNzaW9ucyldPVwibW9kZWwuc29ydGluZ0V4cHJlc3Npb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc29ydGluZ0V4cHJlc3Npb25zKCk6IElTb3J0aW5nRXhwcmVzc2lvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNvcnRpbmdFeHByZXNzaW9ucyh2YWx1ZTogSVNvcnRpbmdFeHByZXNzaW9uW10pIHtcbiAgICAgICAgdGhpcy5fc29ydGluZ0V4cHJlc3Npb25zID0gY2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlLmVtaXQodGhpcy5fc29ydGluZ0V4cHJlc3Npb25zKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heExldmVsSGVhZGVyRGVwdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhMZXZlbEhlYWRlckRlcHRoID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhMZXZlbEhlYWRlckRlcHRoID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVkdWNlKChhY2MsIGNvbCkgPT4gTWF0aC5tYXgoYWNjLCBjb2wucm93U3RhcnQpLCAwKSA6XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlZHVjZSgoYWNjLCBjb2wpID0+IE1hdGgubWF4KGFjYywgY29sLmxldmVsKSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGhpZGRlbiBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGlkZGVuQ29sID0gdGhpcy5ncmlkLmhpZGRlbkNvbHVtbnNDb3VudDtcbiAgICAgKiBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGlkZGVuQ29sdW1uc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoY29sKSA9PiBjb2wuY29sdW1uR3JvdXAgPT09IGZhbHNlICYmIGNvbC5oaWRkZW4gPT09IHRydWUpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcGlubmVkIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5lZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkxheW91dCkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW5zaWRlIHRoZSB0b2dnbGUgYnV0dG9uLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXNlZCBmb3IgdGhlIGJ1aWx0LWluIGNvbHVtbiBoaWRpbmcgVUkgb2YgdGhlYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2hpZGRlbkNvbHVtbnNUZXh0XT1cIidIaWRkZW4gQ29sdW1ucydcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIC8vIEBEZXByZWNhdGVQcm9wZXJ0eSgnYGhpZGRlbkNvbHVtbnNUZXh0YCBpcyBkZXByZWNhdGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGlkZGVuQ29sdW1uc1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRkZW5Db2x1bW5zVGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhpZGRlbkNvbHVtbnNUZXh0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hpZGRlbkNvbHVtbnNUZXh0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbnNpZGUgdGhlIHRvZ2dsZSBidXR0b24uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGZvciB0aGUgYnVpbHQtaW4gY29sdW1uIHBpbm5pbmcgVUkgb2YgdGhlYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtwaW5uZWRDb2x1bW5zVGV4dF09XCInUGlubmVkQ29scyBUZXh0XCIgW2RhdGFdPVwiZGF0YVwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIic1MDBweCdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBEZXByZWNhdGVQcm9wZXJ0eSgnYHBpbm5lZENvbHVtbnNUZXh0YCBpcyBkZXByZWNhdGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRDb2x1bW5zVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHNldCBwaW5uZWRDb2x1bW5zVGV4dCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zVGV4dCA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNUZXh0SW50ZXJuYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRDb2x1bW5zVGV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdHJhbnNhY3Rpb25zIHNlcnZpY2UgZm9yIHRoZSBncmlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdHJhbnNhY3Rpb25zKCk6IFRyYW5zYWN0aW9uU2VydmljZTxUcmFuc2FjdGlvbiwgU3RhdGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFJvd1N0YXRlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93U3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5UG9zaXRpb25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpO1xuICAgICAgICBjb25zdCBmb3JtYXRQYXJ0cyA9IGZvcm1hdC5zcGxpdCgnLCcpO1xuICAgICAgICBjb25zdCBpID0gZm9ybWF0UGFydHMuaW5kZXhPZihmb3JtYXRQYXJ0cy5maW5kKGMgPT4gYy5pbmNsdWRlcygnwqQnKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSBpIDwgMTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSB0b29sYmFyIGlzIHNob3duLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiID48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBEZXByZWNhdGVQcm9wZXJ0eSgnYHNob3dUb29sYmFyYCBpcyBkZXByZWNhdGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2hvd1Rvb2xiYXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93VG9vbGJhcjtcbiAgICB9XG4gICAgcHVibGljIHNldCBzaG93VG9vbGJhcihuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zaG93VG9vbGJhciA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdG9vbGJhcidzIHRpdGxlLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFt0b29sYmFyVGl0bGVdPVwiJ015IEdyaWQnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2B0b29sYmFyVGl0bGVgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b29sYmFyVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rvb2xiYXJUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvb2xiYXJUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3Rvb2xiYXJUaXRsZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciBleHBvcnRpbmcgdG8gTVMgRXhjZWwgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZXhwb3J0RXhjZWxdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgZXhwb3J0RXhjZWxgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBvcnRFeGNlbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhwb3J0RXhjZWwoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cG9ydEV4Y2VsKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydEV4Y2VsID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBvcHRpb24gZm9yIGV4cG9ydGluZyB0byBDU1YgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2V4cG9ydENzdl09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2BleHBvcnRDc3ZgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBvcnRDc3YoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEV4cG9ydENzdigpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGV4cG9ydENzdihuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9leHBvcnRDc3YgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0ZXh0dWFsIGNvbnRlbnQgZm9yIHRoZSBtYWluIGV4cG9ydCBidXR0b24uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2V4cG9ydFRleHRdPVwiJ015IEV4cG9ydGVyJ1wiIFtleHBvcnRDc3ZdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgZXhwb3J0VGV4dGAgaXMgZGVwcmVjYXRlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydFRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBleHBvcnRUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0VGV4dCA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHR1YWwgY29udGVudCBmb3IgdGhlIE1TIEV4Y2VsIGV4cG9ydCBidXR0b24uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZXhwb3J0RXhjZWxUZXh0XT1cIidNeSBFeGNlbCBFeHBvcnRlclwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2V4cG9ydFRleHRdPVwiJ015IEV4cG9ydGVyJ1wiIFtleHBvcnRDc3ZdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgZXhwb3J0RXhjZWxUZXh0YCBpcyBkZXByZWNhdGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhwb3J0RXhjZWxUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRFeGNlbFRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZXhwb3J0RXhjZWxUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0RXhjZWxUZXh0ID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dHVhbCBjb250ZW50IGZvciB0aGUgQ1NWIGV4cG9ydCBidXR0b24uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtleHBvcnRDc3ZUZXh0XT1cIidNeSBDc3YgRXhwb3J0ZXJcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtleHBvcnRUZXh0XT1cIidNeSBFeHBvcnRlcidcIiBbZXhwb3J0RXhjZWxdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgZXhwb3J0Q3N2VGV4dGAgaXMgZGVwcmVjYXRlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydENzdlRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydENzdlRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZXhwb3J0Q3N2VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydENzdlRleHQgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNlbGwgc2VsZWN0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNlbGwgc2VsZWN0aW9uIG1vZGUgaXMgbXVsdGlwbGVcbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGVcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY2VsbFNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NlbGxTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2VsbFNlbGVjdGlvbihzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSkge1xuICAgICAgICB0aGlzLl9jZWxsU2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGU7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgcm93IHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyAnbm9uZSdcbiAgICAgKiBOb3RlIHRoYXQgaW4gSWd4R3JpZCBhbmQgSWd4SGllcmFyY2hpY2FsR3JpZCAnbXVsdGlwbGVDYXNjYWRlJyBiZWhhdmVzIGxpa2UgJ211bHRpcGxlJ1xuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93U2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNvbHVtbiBzZWxlY3Rpb24gbW9kZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSByb3cgc2VsZWN0aW9uIG1vZGUgaXMgbm9uZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5TZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcm93RWRpdE1lc3NhZ2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzbmFja2JhckFjdGlvblRleHQgPSB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9zbmFja2Jhcl9hZGRyb3dfYWN0aW9udGV4dDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBhZ2luZ1N0YXRlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbGNXaWR0aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbGNIZWlnaHQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRmb290SGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hpcHNHb3VwaW5nRXhwcmVzc2lvbnMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdW1tYXJpZXNIZWlnaHQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRyYWdnZWRDb2x1bW46IElneENvbHVtbkNvbXBvbmVudDtcblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVRyYW5zaXRpb25zID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBsYXN0U2VhcmNoSW5mbzogSVNlYXJjaEluZm8gPSB7XG4gICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgZXhhY3RNYXRjaDogZmFsc2UsXG4gICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgIG1hdGNoSW5mb0NhY2hlOiBbXVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5XaWR0aFNldEJ5VXNlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGlubmVkUmVjb3JkczogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbm5lZFJlY29yZHM6IGFueVtdO1xuXG4gICAgcHVibGljIHJlbmRlcmVkJCA9IHRoaXMucmVuZGVyZWQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVzaXplTm90aWZ5ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBhZ2luYXRvclNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRVbnBpbm5lZERhdGE7XG4gICAgcHVibGljIF9kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlY2ltYWxQaXBlOiBEZWNpbWFsUGlwZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRlUGlwZTogRGF0ZVBpcGU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGVyY2VudFBpcGU6IFBlcmNlbnRQaXBlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF90b3RhbFJlY29yZHMgPSAtMTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbHVtbnNXaXRoTm9TZXRXaWR0aHMgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGVyUGFnZSA9IDE1O1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2UgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2luZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2luZ01vZGUgPSBHcmlkUGFnaW5nTW9kZS5Mb2NhbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oaWRlUm93U2VsZWN0b3JzID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcm93RHJhZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BpcGVUcmlnZ2VyID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9maWx0ZXJpbmdQaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc3VtbWFyeVBpcGVUcmlnZ2VyID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Bpbm5lZENvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfdW5waW5uZWRDb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kKTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zb3J0aW5nRXhwcmVzc2lvbnM6IEFycmF5PElTb3J0aW5nRXhwcmVzc2lvbj4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tYXhMZXZlbEhlYWRlckRlcHRoID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb2x1bW5IaWRpbmcgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb2x1bW5QaW5uaW5nID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX3Bpbm5lZFJlY29yZElEcyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAgIHByb3RlY3RlZCBfZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhOiBhbnlbXTtcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhOiBhbnlbXTtcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmVkUGlubmVkRGF0YTogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICBwcm90ZWN0ZWQgX2FsbG93RmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJNb2RlOiBGaWx0ZXJNb2RlID0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcjtcblxuICAgIHByb3RlY3RlZCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4geyB9KTtcblxuICAgIHByb3RlY3RlZCBfZGVmYXVsdFRhcmdldFJlY29yZE51bWJlciA9IDEwO1xuICAgIHByb3RlY3RlZCBfZXhwYW5zaW9uU3RhdGVzOiBNYXA8YW55LCBib29sZWFuPiA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdEV4cGFuZFN0YXRlID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9iYXNlRm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2hlYWRlckZlYXR1cmVzV2lkdGggPSBOYU47XG4gICAgcHJvdGVjdGVkIF9pbml0ID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX2NkclJlcXVlc3RSZXBhaW50ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF91c2VyT3V0bGV0RGlyZWN0aXZlOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNjcm9sbFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbE5hdGl2ZVNpemUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb2x1bW5QaW5uaW5nVGl0bGU6IHN0cmluZztcbiAgICBwcml2YXRlIF9jb2x1bW5IaWRpbmdUaXRsZTogc3RyaW5nO1xuXG4gICAgLyogVG9vbGJhciByZWxhdGVkIGRlZmluaXRpb25zICovXG4gICAgcHJpdmF0ZSBfc2hvd1Rvb2xiYXIgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9leHBvcnRFeGNlbCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2V4cG9ydENzdiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Rvb2xiYXJUaXRsZTogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIF9leHBvcnRUZXh0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZXhwb3J0RXhjZWxUZXh0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZXhwb3J0Q3N2VGV4dDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Jvd0VkaXRhYmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY3VycmVudFJvd1N0YXRlOiBhbnk7XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWRTb3J0ZWREYXRhID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHJpdmF0ZSBfY2RyUmVxdWVzdHMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3M7XG4gICAgcHJpdmF0ZSBfZW1wdHlHcmlkTWVzc2FnZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlID0gbnVsbDtcbiAgICBwcml2YXRlIF9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgICBwcml2YXRlIG92ZXJsYXlJRHMgPSBbXTtcbiAgICBwcml2YXRlIF9maWx0ZXJpbmdTdHJhdGVneTogSUZpbHRlcmluZ1N0cmF0ZWd5O1xuICAgIHByaXZhdGUgX3NvcnRpbmdTdHJhdGVneTogSUdyaWRTb3J0aW5nU3RyYXRlZ3k7XG4gICAgcHJpdmF0ZSBfcGlubmluZzogSVBpbm5pbmdDb25maWcgPSB7IGNvbHVtbnM6IENvbHVtblBpbm5pbmdQb3NpdGlvbi5TdGFydCB9O1xuXG4gICAgcHJpdmF0ZSBfaG9zdFdpZHRoO1xuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdQb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuTWlkZGxlLFxuICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ1Bvc2l0aW9uU2V0dGluZ3MpLFxuICAgIH07XG5cbiAgICBwcml2YXRlIGNvbHVtbkxpc3REaWZmZXI7XG4gICAgcHJpdmF0ZSByb3dMaXN0RGlmZmVyO1xuICAgIHByaXZhdGUgX2hpZGRlbkNvbHVtbnNUZXh0ID0gJyc7XG4gICAgcHJpdmF0ZSBfcGlubmVkQ29sdW1uc1RleHQgPSAnJztcbiAgICBwcml2YXRlIF9oZWlnaHQ6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfcm93SGVpZ2h0O1xuICAgIHByaXZhdGUgX2hvcml6b250YWxGb3JPZnM6IEFycmF5PElneEdyaWRGb3JPZkRpcmVjdGl2ZTxhbnk+PiA9IFtdO1xuICAgIHByaXZhdGUgX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IDE7XG4gICAgLy8gQ2FjaGVzXG4gICAgcHJpdmF0ZSBfdG90YWxXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF9waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfcGlubmVkV2lkdGggPSBOYU47XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF92aXNpYmxlQ29sdW1ucyA9IFtdO1xuICAgIHByaXZhdGUgX2NvbHVtbkdyb3VwcyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2F1dG9HZW5lcmF0ZWRDb2xzID0gW107XG5cbiAgICBwcml2YXRlIF9jb2x1bW5XaWR0aDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBfc3VtbWFyeVBvc2l0aW9uOiBHcmlkU3VtbWFyeVBvc2l0aW9uID0gR3JpZFN1bW1hcnlQb3NpdGlvbi5ib3R0b207XG4gICAgcHJpdmF0ZSBfc3VtbWFyeUNhbGN1bGF0aW9uTW9kZTogR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUgPSBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZS5yb290QW5kQ2hpbGRMZXZlbHM7XG4gICAgcHJpdmF0ZSBfc2hvd1N1bW1hcnlPbkNvbGxhcHNlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY2VsbFNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUubXVsdGlwbGU7XG4gICAgcHJpdmF0ZSBfcm93U2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lO1xuICAgIHByaXZhdGUgX3NlbGVjdFJvd09uQ2xpY2sgPSB0cnVlO1xuICAgIHByaXZhdGUgX2NvbHVtblNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcblxuICAgIHByaXZhdGUgbGFzdEFkZGVkUm93SW5kZXg7XG4gICAgcHJpdmF0ZSBfY3VycmVuY3lQb3NpdGlvbkxlZnQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5ID0gbmV3IFJvd0VkaXRQb3NpdGlvblN0cmF0ZWd5KHtcbiAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgIGNsb3NlQW5pbWF0aW9uOiBudWxsXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJvd0VkaXRTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgb3V0bGV0OiB0aGlzLnJvd091dGxldERpcmVjdGl2ZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5yb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9yZW5kZXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgaWQ6IHN0cmluZztcbiAgICBhYnN0cmFjdCBkYXRhOiBhbnlbXSB8IG51bGw7XG4gICAgcHVibGljIGFic3RyYWN0IGZpbHRlcmVkRGF0YTogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbHRlcmVkIHNvcnRlZCBkYXRhLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlsdGVyZWRTb3J0ZWREYXRhID0gdGhpcy5ncmlkMS5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJlZFNvcnRlZERhdGEoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dDaGFuZ2VzQ291bnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jcnVkU2VydmljZS5yb3cpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGYgPSAob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gMDtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4gaXNPYmplY3Qob2JqW2tleV0pID8gY2hhbmdlcyArPSBmKG9ialtrZXldKSA6IGNoYW5nZXMrKyk7XG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlcztcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgcm93Q2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRWYWx1ZSh0aGlzLmNydWRTZXJ2aWNlLnJvdy5pZCwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gcm93Q2hhbmdlcyA/IGYocm93Q2hhbmdlcykgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhV2l0aEFkZGVkSW5UcmFuc2FjdGlvblJvd3MoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNsb25lQXJyYXkodGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSgpKTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRDaGFuZ2VzKHRydWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcih0ID0+IHQudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFERClcbiAgICAgICAgICAgICAgICAubWFwKHQgPT4gdC5uZXdWYWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YUxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQgPyB0aGlzLmRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cy5sZW5ndGggOiB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nICYmICh0aGlzLmhhc1plcm9SZXN1bHRGaWx0ZXIgfHwgdGhpcy5oYXNOb0RhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nR3JpZFRlbXBsYXRlID8gdGhpcy5sb2FkaW5nR3JpZFRlbXBsYXRlIDogdGhpcy5sb2FkaW5nR3JpZERlZmF1bHRUZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1plcm9SZXN1bHRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlID8gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA6IHRoaXMuZW1wdHlGaWx0ZXJlZEdyaWRUZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc05vRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgPyB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlIDogdGhpcy5lbXB0eUdyaWREZWZhdWx0VGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0IGhhc1plcm9SZXN1bHRGaWx0ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRGF0YSAmJiB0aGlzLmZpbHRlcmVkRGF0YS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBoYXNOb0RhdGEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kYXRhIHx8IHRoaXMuZGF0YUxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvdWxkT3ZlcmxheUxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTG9hZGluZyAmJiAhdGhpcy5oYXNOb0RhdGEgJiYgIXRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUubXVsdGlwbGVcbiAgICAgICAgICAgIHx8IHRoaXMucm93U2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZUNhc2NhZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUm93U2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uICE9PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0NlbGxTZWxlY3RhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsU2VsZWN0aW9uICE9PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgc2VsZWN0aW9uU2VydmljZTogSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjcnVkU2VydmljZTogSWd4R3JpZENSVURTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29sUmVzaXppbmdTZXJ2aWNlOiBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4sXG4gICAgICAgIEBJbmplY3QoSWd4R3JpZFRyYW5zYWN0aW9uKSBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4sXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHB1YmxpYyBkb2N1bWVudCxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwcm90ZWN0ZWQgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgICAgICBwcm90ZWN0ZWQgdmlld1JlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHVibGljIG5hdmlnYXRpb246IElneEdyaWROYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByb3RlY3RlZCBvdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBzdW1tYXJ5U2VydmljZTogSWd4R3JpZFN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByb3RlY3RlZCBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zLFxuICAgICAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBsb2NhbGVJZDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcGxhdGZvcm1VdGlsOiBQbGF0Zm9ybVV0aWwpIHtcbiAgICAgICAgc3VwZXIoX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5sb2NhbGVJZDtcbiAgICAgICAgdGhpcy5kYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSh0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRoaXMuZGVjaW1hbFBpcGUgPSBuZXcgRGVjaW1hbFBpcGUodGhpcy5sb2NhbGUpO1xuICAgICAgICB0aGlzLmN1cnJlbmN5UGlwZSA9IG5ldyBDdXJyZW5jeVBpcGUodGhpcy5sb2NhbGUpO1xuICAgICAgICB0aGlzLnBlcmNlbnRQaXBlID0gbmV3IFBlcmNlbnRQaXBlKHRoaXMubG9jYWxlKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIHB1YmxpYyBoaWRlQWN0aW9uU3RyaXAoKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJGZWF0dXJlc1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGV0YWlsUmVjb3JkKHJlYykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0dyb3VwQnlSZWNvcmQocmVjKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0dob3N0UmVjb3JkKHJlY29yZDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZWNvcmQuZ2hvc3RSZWNvcmQgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNBZGRSb3dSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5hZGRSb3cgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmV0dXJucyB0aGUgcm93IGluZGV4IG9mIGEgcm93IHRoYXQgdGFrZXMgaW50byBhY2NvdW50IHRoZSBmdWxsIHZpZXcgZGF0YSBsaWtlIHBpbm5pbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldERhdGFWaWV3SW5kZXgocm93SW5kZXgsIHBpbm5lZCkge1xuICAgICAgICBpZiAocGlubmVkICYmICF0aGlzLmlzUm93UGlubmluZ1RvVG9wKSB7XG4gICAgICAgICAgICByb3dJbmRleCA9IHJvd0luZGV4ICsgdGhpcy51bnBpbm5lZERhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmICghcGlubmVkICYmIHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3ApIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyB0aGlzLnBpbm5lZERhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93SW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRGV0YWlscygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBncmlkIHZpcnR1YWxpemF0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJbmNsdWRlcyB0aGUgc3RhcnQgaW5kZXggYW5kIGhvdyBtYW55IHJlY29yZHMgYXJlIHJlbmRlcmVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyaWRWaXJ0U3RhdGUgPSB0aGlzLmdyaWQxLnZpcnR1YWxpemF0aW9uU3RhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXJ0dWFsaXphdGlvblN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHNldCB2aXJ0dWFsaXphdGlvblN0YXRlKHN0YXRlKSB7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhpZGVPdmVybGF5cygpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5SURzLmZvckVhY2gob3ZlcmxheUlEID0+IHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuaGlkZShvdmVybGF5SUQpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vbkNsb3NlZC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihvID0+IG8uaWQgPT09IG92ZXJsYXlJRCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWNvcmQgaXMgcGlubmVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByb3dJbmRleCBJbmRleCBvZiB0aGUgcmVjb3JkIGluIHRoZSBgZGF0YVZpZXdgIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkQnlWaWV3SW5kZXgocm93SW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmICh0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4IDwgdGhpcy5waW5uZWREYXRhVmlldy5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPj0gdGhpcy51bnBpbm5lZERhdGFWaWV3Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWNvcmQgaXMgcGlubmVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByb3dJbmRleCBJbmRleCBvZiB0aGUgcmVjb3JkIGluIHRoZSBgZmlsdGVyZWRTb3J0ZWREYXRhYCBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmICh0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4IDwgdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICghdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA+PSB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YS5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWQocmVjKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEluaXRpYWxQaW5uZWRJbmRleChyZWMpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICogUmV0dXJucyB0aGUgcmVjb3JkIGluZGV4IGluIG9yZGVyIG9mIHBpbm5pbmcgYnkgdGhlIHVzZXIuIERvZXMgbm90IGNvbnNpZGVyIHNvcnRpbmcvZmlsdGVyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbml0aWFsUGlubmVkSW5kZXgocmVjKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaWQocmVjKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNQaW5uZWRSZWNvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUmVjb3JkSURzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkUmVjb3Jkc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUmVjb3JkSURzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NldHVwU2VydmljZXMoKSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5ncmlkID0gdGhpcztcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5ncmlkID0gdGhpcztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdyaWQgPSB0aGlzO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb24uZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkID0gdGhpcztcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5ncmlkID0gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NldHVwTGlzdGVuZXJzKCkge1xuICAgICAgICBjb25zdCBkZXN0cnVjdG9yID0gdGFrZVVudGlsPGFueT4odGhpcy5kZXN0cm95JCk7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLm5hdGl2ZUVsZW1lbnQsICdmb2N1c291dCcpLnBpcGUoZmlsdGVyKCgpID0+ICEhdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUpLCBkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRyYWdNb2RlICYmIGlzSUUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5jcnVkU2VydmljZS5jZWxsICYmXG4gICAgICAgICAgICAgICAgISF0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSAmJlxuICAgICAgICAgICAgICAgICgoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID49IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93IDwgdGhpcy5kYXRhVmlldy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHx8IChldmVudC50YXJnZXQgPT09IHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudCAmJiB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZS5yb3cgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRmb290Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA9PT0gdGhpcy5kYXRhVmlldy5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICEodGhpcy5yb3dFZGl0YWJsZSAmJiB0aGlzLmNydWRTZXJ2aWNlLnJvd0VkaXRpbmdCbG9ja2VkICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSA9IHt9IGFzIElBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vblJvd0FkZGVkLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5yZWZyZXNoR3JpZFN0YXRlKGFyZ3MpKTtcbiAgICAgICAgdGhpcy5vblJvd0RlbGV0ZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoYXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmRlbGV0ZU9wZXJhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5vblN0YXRlVXBkYXRlLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudDogU3RhdGVVcGRhdGVFdmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IFRyYW5zYWN0aW9uRXZlbnRPcmlnaW4uUkVETykge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMgPSBldmVudC5hY3Rpb25zID8gZXZlbnQuYWN0aW9ucy5maWx0ZXIoeCA9PiB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUpIDogW107XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5VTkRPKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9ucyA9IGV2ZW50LmFjdGlvbnMgPyBldmVudC5hY3Rpb25zLmZpbHRlcih4ID0+IHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFERCkgOiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNSb3dTZWxlY3RlZChhY3Rpb24udHJhbnNhY3Rpb24uaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RSb3coYWN0aW9uLnRyYW5zYWN0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVOb3RpZnkucGlwZShkZXN0cnVjdG9yLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpLCB0aHJvdHRsZVRpbWUoMTAwLCB1bmRlZmluZWQsIHsgbGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWUgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vblBhZ2luZ0RvbmUucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbkNvbHVtbk1vdmluZ0VuZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmVuZEVkaXQoZmFsc2UpKTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9uT3BlbmluZy5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuaW5pdGlhbGl6ZSh0aGlzLCB0aGlzLm92ZXJsYXlTZXJ2aWNlLCBldmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9uT3BlbmVkLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheVNldHRpbmdzID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZChldmVudC5pZCk/LnNldHRpbmdzO1xuXG4gICAgICAgICAgICAvLyBkbyBub3QgaGlkZSB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIG92ZXJsYXkgb24gc2Nyb2xsXG4gICAgICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBldmVudC5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmxhc3RBY3RpdmVOb2RlID0gdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnNldEFkZEJ1dHRvbkZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZG8gbm90IGhpZGUgdGhlIG92ZXJsYXkgaWYgaXQncyBhdHRhY2hlZCB0byBhIHJvd1xuICAgICAgICAgICAgaWYgKHRoaXMucm93RWRpdGluZ092ZXJsYXk/Lm92ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvdmVybGF5U2V0dGluZ3M/Lm91dGxldCA9PT0gdGhpcy5vdXRsZXQgJiYgdGhpcy5vdmVybGF5SURzLmluZGV4T2YoZXZlbnQuaWQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUlEcy5wdXNoKGV2ZW50LmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vbkNsb3NlZC5waXBlKGRlc3RydWN0b3IsIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbmQgPSB0aGlzLm92ZXJsYXlJRHMuaW5kZXhPZihldmVudC5pZCk7XG4gICAgICAgICAgICBpZiAoaW5kICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUlEcy5zcGxpY2UoaW5kLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5vbkRhdGFDaGFuZ2luZy5waXBlKGRlc3RydWN0b3IsIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZWNhbGNTaXplID0gdGhpcy5pc1BlcmNlbnRIZWlnaHQgJiZcbiAgICAgICAgICAgICAgICAoIXRoaXMuY2FsY0hlaWdodCB8fCB0aGlzLmNhbGNIZWlnaHQgPT09IHRoaXMuZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5yZW5kZXJlZFJvd0hlaWdodCAqIHRoaXMuX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIpO1xuICAgICAgICAgICAgaWYgKHNob3VsZFJlY2FsY1NpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICAkZXZlbnQuY29udGFpbmVyU2l6ZSA9IHRoaXMuY2FsY0hlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5vblNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGNhbGxlZCB0byByZWNhbGMgYWxsIHdpZHRocyB0aGF0IG1heSBoYXZlIGNoYW5nZXMgYXMgYSByZXN1bHQgb2ZcbiAgICAgICAgICAgIC8vIHRoZSB2ZXJ0LiBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5vbkNvbnRlbnRTaXplQ2hhbmdlLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKGZhbHNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbkRlbnNpdHlDaGFuZ2VkLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnN1bW1hcnlIZWlnaHQgPSAwO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLl9zZXR1cFNlcnZpY2VzKCk7XG4gICAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMucm93TGlzdERpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdERpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuY2FsY1dpZHRoID0gdGhpcy53aWR0aCAmJiB0aGlzLndpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBwYXJzZUludCh0aGlzLndpZHRoLCAxMCkgOiAwO1xuICAgICAgICB0aGlzLnNob3VsZEdlbmVyYXRlID0gdGhpcy5hdXRvR2VuZXJhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENvbHVtbnNDYWNoZXMoKSB7XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5mb3JFYWNoKGNvbHVtbiA9PiBjb2x1bW4ucmVzZXRDYWNoZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVSb3dJRCgpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgICAgICBjb25zdCBwcmltYXJ5Q29sdW1uID0gdGhpcy5jb2x1bW5MaXN0LmZpbmQoY29sID0+IGNvbC5maWVsZCA9PT0gdGhpcy5wcmltYXJ5S2V5KTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gdGhpcy5kYXRhLmxlbmd0aCA/IHR5cGVvZiAodGhpcy5kYXRhWzBdW3RoaXMucHJpbWFyeUtleV0pIDogcHJpbWFyeUNvbHVtbiA/IHByaW1hcnlDb2x1bW4uZGF0YVR5cGUgOiAnc3RyaW5nJztcbiAgICAgICAgcmV0dXJuIGlkVHlwZSA9PT0gJ3N0cmluZycgPyB1dWlkdjQoKSA6IEZBS0VfUk9XX0lELS07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldEZvck9mQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlydFJvdyA9IHRoaXMuZGF0YVJvd0xpc3QuZmlyc3Q7XG4gICAgICAgIGlmIChmaXJzdFZpcnRSb3cpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIGZpcnN0VmlydFJvdy52aXJ0RGlyUm93LmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdFZpcnRSb3cudmlydERpclJvdy5hc3N1bWVNYXN0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVyZWREYXRhKGRhdGEsIHBpbm5lZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmIHBpbm5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRQaW5uZWREYXRhID0gZGF0YSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkVW5waW5uZWQgPSB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IFsuLi4gdGhpcy5fZmlsdGVyZWRQaW5uZWREYXRhLCAuLi5maWx0ZXJlZFVucGlubmVkXTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZERhdGEgOiB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgIXBpbm5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRVbnBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENvbHVtbkNvbGxlY3Rpb25zKCkge1xuICAgICAgICB0aGlzLl92aXNpYmxlQ29sdW1ucy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9waW5uZWRWaXNpYmxlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3VucGlubmVkVmlzaWJsZS5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDYWNoZWRXaWR0aHMoKSB7XG4gICAgICAgIHRoaXMuX3VucGlubmVkV2lkdGggPSBOYU47XG4gICAgICAgIHRoaXMuX3Bpbm5lZFdpZHRoID0gTmFOO1xuICAgICAgICB0aGlzLl90b3RhbFdpZHRoID0gTmFOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDYWNoZXMocmVjYWxjRmVhdHVyZVdpZHRoID0gdHJ1ZSkge1xuICAgICAgICBpZiAocmVjYWxjRmVhdHVyZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoID0gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRGb3JPZkNhY2hlKCk7XG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5zQ2FjaGVzKCk7XG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5Db2xsZWN0aW9ucygpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVkV2lkdGhzKCk7XG4gICAgICAgIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NvbHVtbkdyb3VwcyA9IHRoaXMuY29sdW1uTGlzdC5zb21lKGNvbCA9PiBjb2wuY29sdW1uR3JvdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB0aGlzLnRvb2xiYXIuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgpID0+IHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKSk7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvblN0cmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0cmlwLm1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhUmViaW5kaW5nKGV2ZW50OiBJRm9yT2ZEYXRhQ2hhbmdpbmdFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdpbmcuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YVJlYm91bmQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcmVkU29ydGVkRGF0YShkYXRhLCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgZGF0YSA9IGRhdGEgfHwgW107XG4gICAgICAgIGlmICh0aGlzLnBpbm5lZFJlY29yZHNDb3VudCA+IDAgJiYgcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5waW5uZWRSZWNvcmRzID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YSA9IHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgPyBbLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YSwgLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhXSA6XG4gICAgICAgICAgICAgICAgWy4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSwgLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YV07XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2godHJ1ZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlubmVkUmVjb3Jkc0NvdW50ID4gMCAmJiAhcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0SG9yaXpvbnRhbEZvck9mcygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZpbHRlciA9IChpdGVtOiBJZ3hSb3dEaXJlY3RpdmU8YW55PiB8IElneFN1bW1hcnlSb3dDb21wb25lbnQpID0+IHRoaXMuaXNEZWZpbmVkKGl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGFSb3dMaXN0LmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpLFxuICAgICAgICAgICAgLi4udGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdylcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBSb3dPYnNlcnZlcnMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGaWx0ZXIgPSAoaXRlbTogSWd4Um93RGlyZWN0aXZlPGFueT4gfCBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50KSA9PiB0aGlzLmlzRGVmaW5lZChpdGVtLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RGb3JPZnMgPSBwaXBlKG1hcCgoY29sbGVjdGlvbjogYW55W10pID0+IGNvbGxlY3Rpb24uZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdykpKTtcbiAgICAgICAgY29uc3Qgcm93TGlzdE9ic2VydmVyID0gZXh0cmFjdEZvck9mcyh0aGlzLl9kYXRhUm93TGlzdC5jaGFuZ2VzKTtcbiAgICAgICAgY29uc3Qgc3VtbWFyeVJvd09ic2VydmVyID0gZXh0cmFjdEZvck9mcyh0aGlzLl9zdW1tYXJ5Um93TGlzdC5jaGFuZ2VzKTtcbiAgICAgICAgcm93TGlzdE9ic2VydmVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldEhvcml6b250YWxGb3JPZnMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1bW1hcnlSb3dPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsRm9yT2ZzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0SG9yaXpvbnRhbEZvck9mcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF96b25lQmVnb25lTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5nZXRTY3JvbGwoKS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnZlcnRpY2FsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLmdldFNjcm9sbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaG9yaXpvbnRhbFNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMucmVzaXplTm90aWZ5Lm5leHQoKSk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdFBpbm5pbmcoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5faW5pdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5yZWF0dGFjaCgpO1xuICAgICAgICB0aGlzLl9zZXR1cFJvd09ic2VydmVycygpO1xuICAgICAgICB0aGlzLl96b25lQmVnb25lTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgdGhpcy5wYWdpbmF0b3JTZXR0aW5ncyA9IHsgb3V0bGV0OiB0aGlzLm91dGxldCB9O1xuXG4gICAgICAgIGNvbnN0IHZlcnRTY3JEQyA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGlzcGxheUNvbnRhaW5lcjtcbiAgICAgICAgdmVydFNjckRDLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMucHJldmVudENvbnRhaW5lclNjcm9sbC5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLl9waW5uZWRSb3dMaXN0LmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblBpbm5lZFJvd3NDaGFuZ2VkKGNoYW5nZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZFJvd1NuYWNrYmFyPy5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWMgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YVt0aGlzLmxhc3RBZGRlZFJvd0luZGV4XTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8ocmVjLCAwKTtcbiAgICAgICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIuY2xvc2UoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gS2VlcCB0aGUgc3RyZWFtIG9wZW4gZm9yIGZ1dHVyZSBzdWJzY3JpYmVyc1xuICAgICAgICB0aGlzLnJlbmRlcmVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5yZW5kZXJlZC5uZXh0KHRydWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBub3RpZnlDaGFuZ2VzKHJlcGFpbnQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9jZHJSZXF1ZXN0cyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RSZXBhaW50ID0gcmVwYWludDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICBzdXBlci5uZ0RvQ2hlY2soKTtcbiAgICAgICAgaWYgKHRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0UmVwYWludCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldE5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2godHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY2RyUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXROb3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldERyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXMgJiYgdGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcy5maXJzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRtcE91dGxldHMuZm9yRWFjaCgodG1wbE91dGxldCkgPT4ge1xuICAgICAgICAgICAgdG1wbE91dGxldC5jbGVhbkNhY2hlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXI/LmdldFNjcm9sbCgpPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnZlcnRpY2FsU2Nyb2xsSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lcj8uZ2V0U2Nyb2xsKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaG9yaXpvbnRhbFNjcm9sbEhhbmRsZXIpO1xuICAgICAgICAgICAgY29uc3QgdmVydFNjckRDID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uZGlzcGxheUNvbnRhaW5lcjtcbiAgICAgICAgICAgIHZlcnRTY3JEQz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wcmV2ZW50Q29udGFpbmVyU2Nyb2xsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgc3BlY2lmaWVkIGNvbHVtbidzIHZpc2liaWxpdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnRvZ2dsZUNvbHVtblZpc2liaWxpdHkoe1xuICAgICAqICAgICAgIGNvbHVtbjogdGhpcy5ncmlkMS5jb2x1bW5zWzBdLFxuICAgICAqICAgICAgIG5ld1ZhbHVlOiB0cnVlXG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNvbHVtblZpc2liaWxpdHkoYXJnczogSUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGFyZ3MuY29sdW1uID8gdGhpcy5jb2x1bW5MaXN0LmZpbmQoKGMpID0+IGMgPT09IGFyZ3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIWNvbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbC50b2dnbGVWaXNpYmlsaXR5KGFyZ3MubmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIFtyb3cgSUQsIGV4cGFuc2lvbiBzdGF0ZV0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEluY2x1ZGVzIG9ubHkgc3RhdGVzIHRoYXQgZGlmZmVyIGZyb20gdGhlIGRlZmF1bHQgb25lLlxuICAgICAqIFN1cHBvcnRzIHR3by13YXkgYmluZGluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiZGF0YVwiIFsoZXhwYW5zaW9uU3RhdGVzKV09XCJtb2RlbC5leHBhbnNpb25TdGF0ZXNcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBhbnNpb25TdGF0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBhbnNpb25TdGF0ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBleHBhbnNpb25TdGF0ZXModmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5zaW9uU3RhdGVzID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KHZhbHVlKTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXNDaGFuZ2UuZW1pdCh0aGlzLl9leHBhbnNpb25TdGF0ZXMpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyBhbGwgcm93cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5leHBhbmRBbGwoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kQWxsKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyBhbGwgcm93cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jb2xsYXBzZUFsbCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZUFsbCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGFuZFN0YXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZXhwYW5kUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRSb3cocm93SUQ6IGFueSkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuc2V0X3Jvd19leHBhbnNpb25fc3RhdGUocm93SUQsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY29sbGFwc2VSb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGNvbGxhcHNlUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLnNldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJvd0lELCBmYWxzZSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC50b2dnbGVSb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZ3JpZEFQSS5nZXRfcmVjX2J5X2lkKHJvd0lEKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19leHBhbnNpb25fc3RhdGUocmVjKTtcbiAgICAgICAgdGhpcy5ncmlkQVBJLnNldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJvd0lELCAhc3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKHJlYzogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmF0aXZlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBuYXRpdmVFbCA9IHRoaXMuZ3JpZC5uYXRpdmVFbGVtZW50LlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgb3V0bGV0IHVzZWQgdG8gYXR0YWNoIHRoZSBncmlkJ3Mgb3ZlcmxheXMgdG8uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrXG4gICAgICogSWYgc2V0LCByZXR1cm5zIHRoZSBvdXRsZXQgZGVmaW5lZCBvdXRzaWRlIHRoZSBncmlkLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgZ3JpZCdzIGludGVybmFsIG91dGxldCBkaXJlY3RpdmUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IG91dGxldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU91dGxldCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgb3V0bGV0KHZhbDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSkge1xuICAgICAgICB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlID0gdmFsO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgcm93SGVpZ2ggPSB0aGlzLmdyaWQuZGVmYXVsdFJvd0hlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQwO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDUwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRTdW1tYXJ5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb3N5OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMDtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzNjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgJ3MgbWluaW11bSBhbGxvd2VkIHdpZHRoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGludGVybmFsbHkgZm9yIHJlc3RyaWN0aW5nIGhlYWRlciBncm91cCBjb21wb25lbnQgd2lkdGguXG4gICAgICogVGhlIHZhbHVlcyBiZWxvdyBkZXBlbmQgb24gdGhlIGhlYWRlciBjZWxsIGRlZmF1bHQgcmlnaHQvbGVmdCBwYWRkaW5nIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb3N5OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiA0ODtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBhZ2luYXRvckNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29zeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2lneC1wYWdpbmF0b3ItLWNvc3knO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnaWd4LXBhZ2luYXRvci0tY29tcGFjdCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnaWd4LXBhZ2luYXRvcic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHdpZHRoIG9mIHRoZSBjb250YWluZXIgZm9yIHRoZSBwaW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkV2lkdGggPSB0aGlzLmdyaWQuZ2V0UGlubmVkV2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRXaWR0aCgpIHtcbiAgICAgICAgaWYgKCFpc05hTih0aGlzLl9waW5uZWRXaWR0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uZWRXaWR0aCA9IHRoaXMuZ2V0UGlubmVkV2lkdGgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBmb3IgdGhlIHVucGlubmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHVucGlubmVkV2lkdGggPSB0aGlzLmdyaWQuZ2V0VW5waW5uZWRXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkV2lkdGgoKSB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5fdW5waW5uZWRXaWR0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VucGlubmVkV2lkdGggPSB0aGlzLmdldFVucGlubmVkV2lkdGgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlbigpIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMudW5waW5uZWRXaWR0aCAtIHRoaXMudG90YWxXaWR0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggPT09IG51bGwgfHwgZGlmZiA+PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgY29tYmluZWQgd2lkdGggb2YgdGhlIGNvbHVtbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGVuYWJsZWQgZ3JpZCBmZWF0dXJlcy4gVGhleSBhcmUgZml4ZWQuXG4gICAgICovXG4gICAgcHVibGljIGZlYXR1cmVDb2x1bW5zV2lkdGgoZXhwYW5kZXI/OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4odGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHBsYXRmb3JtVXRpbC5pc0Jyb3dzZXIgY2hlY2tcbiAgICAgICAgICAgIGNvbnN0IHJvd1NlbGVjdEFyZWEgPSB0aGlzLmhlYWRlclNlbGVjdG9yQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyU2VsZWN0b3JDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCByb3dEcmFnQXJlYSA9IHRoaXMucm93RHJhZ2dhYmxlICYmIHRoaXMuaGVhZGVyRHJhZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckRyYWdDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCBncm91cGFibGVBcmVhID0gdGhpcy5oZWFkZXJHcm91cENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckdyb3VwQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZXJXaWR0aCA9IGV4cGFuZGVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPyBleHBhbmRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGggPSByb3dTZWxlY3RBcmVhICsgcm93RHJhZ0FyZWEgKyBncm91cGFibGVBcmVhICsgZXhwYW5kZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyaWVzTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29sdW1zID0gdGhpcy5ncmlkLmNvbHVtbnNDb2xsZWN0aW9uLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uc0NvbGxlY3Rpb24oKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZWQgPyAgdGhpcy5fY29sdW1ucyA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRDb2x1bW5zID0gdGhpcy5ncmlkLnBpbm5lZENvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZFZpc2libGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkVmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uZWRWaXNpYmxlID0gdGhpcy5fcGlubmVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFZpc2libGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcGlubmVkIGBJZ3hSb3dDb21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZFJvdyA9IHRoaXMuZ3JpZC5waW5uZWRSb3dzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkUm93cygpOiBJZ3hHcmlkUm93Q29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUm93TGlzdC50b0FycmF5KCkuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdW5waW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdW5waW5uZWRDb2x1bW5zID0gdGhpcy5ncmlkLnVucGlubmVkQ29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl91bnBpbm5lZFZpc2libGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRWaXNpYmxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VucGlubmVkVmlzaWJsZSA9IHRoaXMuX3VucGlubmVkQ29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gIWNvbC5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRWaXNpYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB3aWR0aGAgdG8gYmUgc2V0IG9uIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIZWFkZXJHcm91cFdpZHRoKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoID0gcGFyc2VGbG9hdChjb2x1bW4uY2FsY1dpZHRoKTtcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSB0aGlzLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoO1xuXG4gICAgICAgIGlmIChjb2xXaWR0aCA8IG1pbldpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWluV2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xXaWR0aCArICdweCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgYnkgZmllbGQgbmFtZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q29sID0gdGhpcy5ncmlkMS5nZXRDb2x1bW5CeU5hbWUoXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb2x1bW5CeU5hbWUobmFtZTogc3RyaW5nKTogSWd4Q29sdW1uQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbkJ5VmlzaWJsZUluZGV4KGluZGV4OiBudW1iZXIpOiBJZ3hDb2x1bW5Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKChjb2wpID0+XG4gICAgICAgICAgICAhY29sLmNvbHVtbkdyb3VwICYmICFjb2wuY29sdW1uTGF5b3V0ICYmXG4gICAgICAgICAgICBjb2wudmlzaWJsZUluZGV4ID09PSBpbmRleFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hSb3dEaXJlY3RpdmVgIGJ5IGluZGV4LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlSb3cgPSB0aGlzLmdyaWQxLmdldFJvd0J5SW5kZXgoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19ieV9pbmRleChpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgSWd4R3JpZFJvd0NvbXBvbmVudGAgb2JqZWN0IGJ5IHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Um93ID0gdGhpcy5ncmlkMS5nZXRSb3dCeUtleShcImNlbGw1XCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBrZXlWYWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb3dCeUtleShrZXlWYWx1ZTogYW55KTogSWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2tleShrZXlWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB2aXNpYmxlIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkLnZpc2libGVDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUNvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBpZiAodGhpcy5fdmlzaWJsZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGMgPT4gIWMuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGVDb2x1bW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbENvbXBvbmVudGAgdGhhdCBtYXRjaGVzIHRoZSBjb25kaXRpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDZWxsID0gdGhpcy5ncmlkMS5nZXRDZWxsQnlDb2x1bW4oMixcIlVuaXRQcmljZVwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SW5kZXhcbiAgICAgKiBAcGFyYW0gY29sdW1uRmllbGRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5Q29sdW1uKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBJZ3hHcmlkQ2VsbENvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0IGNvbHVtbklkID0gdGhpcy5jb2x1bW5MaXN0Lm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZmllbGQpLmluZGV4T2YoY29sdW1uRmllbGQpO1xuICAgICAgICBpZiAoY29sdW1uSWQgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdldF9jZWxsX2J5X2luZGV4KHJvd0luZGV4LCBjb2x1bW5JZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5Q29sdW1uVmlzaWJsZUluZGV4KHJvd0luZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBJZ3hHcmlkQ2VsbENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ2V0X2NlbGxfYnlfdmlzaWJsZV9pbmRleChyb3dJbmRleCwgaW5kZXgpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBgSWd4R3JpZENlbGxDb21wb25lbnRgIG9iamVjdCBieSB0aGUgc3BlY2lmaWVkIHByaW1hcnkga2V5IGFuZCBjb2x1bW4gZmllbGQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIHByaW1hcnlLZXkgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZ2V0Q2VsbEJ5S2V5KDEsICdpbmRleCcpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBtYXRjaCBhbnkgcm93SURcbiAgICAgKiBAcGFyYW0gY29sdW1uRmllbGRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5S2V5KHJvd1NlbGVjdG9yOiBhbnksIGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBJZ3hHcmlkQ2VsbENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ2V0X2NlbGxfYnlfa2V5KHJvd1NlbGVjdG9yLCBjb2x1bW5GaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG90YWxQYWdlcyA9IHRoaXMuZ3JpZC50b3RhbFBhZ2VzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxQYWdlcygpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmdTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5nU3RhdGUubWV0YWRhdGEuY291bnRQYWdlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxSZWNvcmRzID49IDAgPyBNYXRoLmNlaWwodGhpcy5fdG90YWxSZWNvcmRzIC8gdGhpcy5wZXJQYWdlKSA6IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpcnN0UGFnZSA9IHRoaXMuZ3JpZC5pc0ZpcnN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvZXMgdG8gdGhlIG5leHQgcGFnZSwgaWYgdGhlIGdyaWQgaXMgbm90IGFscmVhZHkgYXQgdGhlIGxhc3QgcGFnZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEubmV4dFBhZ2UoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UgKz0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvZXMgdG8gdGhlIHByZXZpb3VzIHBhZ2UsIGlmIHRoZSBncmlkIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBmaXJzdCBwYWdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5wcmV2aW91c1BhZ2UoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlvdXNQYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNGaXJzdFBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZSAtPSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE9ubHkgZnVuY3Rpb25zIHdoZW4gcGFnaW5nIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG90YWxSZWNvcmRzID0gdGhpcy5ncmlkLnRvdGFsUmVjb3JkcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdG90YWxSZWNvcmRzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbFJlY29yZHMgPj0gMCA/IHRoaXMuX3RvdGFsUmVjb3JkcyA6IHRoaXMucGFnaW5nU3RhdGU/Lm1ldGFkYXRhLmNvdW50UmVjb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvdGFsUmVjb3Jkcyh0b3RhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0b3RhbCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl90b3RhbFJlY29yZHMgPSB0b3RhbDtcbiAgICAgICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBwYWdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGFzdFBhZ2UgPSB0aGlzLmdyaWQuaXNMYXN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UgKyAxID49IHRoaXMudG90YWxQYWdlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JpZFdpZHRoID0gdGhpcy5ncmlkLnRvdGFsV2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbFdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5fdG90YWxXaWR0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90b3RhbFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRha2Ugb25seSB0b3AgbGV2ZWwgY29sdW1uc1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5sZXZlbCA9PT0gMCAmJiAhY29sLnBpbm5lZCk7XG4gICAgICAgIGxldCB0b3RhbFdpZHRoID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGk7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHBhcnNlSW50KGNvbHNbaV0uY2FsY1dpZHRoLCAxMCkgfHwgMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90b3RhbFdpZHRoID0gdG90YWxXaWR0aDtcbiAgICAgICAgcmV0dXJuIHRvdGFsV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd1Jvd1NlbGVjdG9ycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNSb3dTZWxlY3RhYmxlICYmIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnMgJiYgIXRoaXMuaGlkZVJvd1NlbGVjdG9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93QWRkQnV0dG9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0YWJsZSAmJiB0aGlzLmRhdGFWaWV3Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93RHJhZ0ljb25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dEcmFnZ2FibGUgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IHRoaXMuaGlkZGVuQ29sdW1uc0NvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWNlcyBhIGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0YXJnZXQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5tb3ZlQ29sdW1uKGNvbHVtbiwgdGFyZ2V0KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZUNvbHVtbihjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgdGFyZ2V0OiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uID0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCkge1xuXG4gICAgICAgIGlmIChjb2x1bW4gPT09IHRhcmdldCB8fCAoY29sdW1uLmxldmVsICE9PSB0YXJnZXQubGV2ZWwpIHx8XG4gICAgICAgICAgICAoY29sdW1uLnRvcExldmVsUGFyZW50ICE9PSB0YXJnZXQudG9wTGV2ZWxQYXJlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uLmxldmVsKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3ZlQ2hpbGRDb2x1bW5zKGNvbHVtbi5wYXJlbnQsIGNvbHVtbiwgdGFyZ2V0LCBwb3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbHVtblBpblN0YXRlQ2hhbmdlZDtcbiAgICAgICAgLy8gcGlubmluZyBhbmQgdW5waW5uaW5nIHdpbGwgd29yayBjb3JyZWN0bHkgZXZlbiB3aXRob3V0IHBhc3NpbmcgaW5kZXhcbiAgICAgICAgLy8gYnV0IGlzIGVhc2llciB0byBjYWxjbHVsYXRlIHRoZSBpbmRleCBoZXJlLCBhbmQgbGF0ZXIgdXNlIGl0IGluIHRoZSBwaW5uaW5nIGV2ZW50IGFyZ3NcbiAgICAgICAgaWYgKHRhcmdldC5waW5uZWQgJiYgIWNvbHVtbi5waW5uZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBvcyA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCA/IHBpbm5lZEluZGV4ICsgMSA6IHBpbm5lZEluZGV4O1xuICAgICAgICAgICAgY29sdW1uUGluU3RhdGVDaGFuZ2VkID0gY29sdW1uLnBpbihpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5waW5uZWQgJiYgY29sdW1uLnBpbm5lZCkge1xuICAgICAgICAgICAgY29uc3QgdW5waW5uZWRJbmRleCA9IHRoaXMuX3VucGlubmVkQ29sdW1ucy5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBvcyA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCA/IHVucGlubmVkSW5kZXggKyAxIDogdW5waW5uZWRJbmRleDtcbiAgICAgICAgICAgIGNvbHVtblBpblN0YXRlQ2hhbmdlZCA9IGNvbHVtbi51bnBpbihpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0LnBpbm5lZCAmJiBjb2x1bW4ucGlubmVkICYmICFjb2x1bW5QaW5TdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MsIHRoaXMuX3Bpbm5lZENvbHVtbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0YXJnZXQucGlubmVkICYmICFjb2x1bW4ucGlubmVkICYmICFjb2x1bW5QaW5TdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MsIHRoaXMuX3VucGlubmVkQ29sdW1ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3ZlQ29sdW1ucyhjb2x1bW4sIHRhcmdldCwgcG9zKTtcbiAgICAgICAgdGhpcy5fY29sdW1uc1Jlb3JkZXJlZChjb2x1bW4sIHRhcmdldCk7XG5cbiAgICAgICAgdGhpcy5vbkNvbHVtbk1vdmluZ0VuZC5lbWl0KHsgc291cmNlOiBjb2x1bW4sIHRhcmdldCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHb2VzIHRvIHRoZSBkZXNpcmVkIHBhZ2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnBhZ2luYXRlKDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5hdGUodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gdGhpcy50b3RhbFBhZ2VzIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWdlID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gZm9yIHRoZSBgSWd4R3JpZENvbXBvbmVudGAuXG4gICAgICogQ2FsbGluZyBtYXJrRm9yQ2hlY2sgYWxzbyB0cmlnZ2VycyB0aGUgZ3JpZCBwaXBlcyBleHBsaWNpdGx5LCByZXN1bHRpbmcgaW4gYWxsIHVwZGF0ZXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIE1heSBkZWdyYWRlIHBlcmZvcm1hbmNlIGlmIHVzZWQgd2hlbiBub3QgbmVlZGVkLCBvciBpZiBtaXN1c2VkOlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBET04nVHM6XG4gICAgICogLy8gZG9uJ3QgY2FsbCBtYXJrRm9yQ2hlY2sgZnJvbSBpbnNpZGUgYSBsb29wXG4gICAgICogLy8gZG9uJ3QgY2FsbCBtYXJrRm9yQ2hlY2sgd2hlbiBhIHByaW1pdGl2ZSBoYXMgY2hhbmdlZFxuICAgICAqIGdyaWQuZGF0YS5mb3JFYWNoKHJlYyA9PiB7XG4gICAgICogIHJlYyA9IG5ld1ZhbHVlO1xuICAgICAqICBncmlkLm1hcmtGb3JDaGVjaygpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gRE9zXG4gICAgICogLy8gY2FsbCBtYXJrRm9yQ2hlY2sgYWZ0ZXIgdXBkYXRpbmcgYSBuZXN0ZWQgcHJvcGVydHlcbiAgICAgKiBncmlkLmRhdGEuZm9yRWFjaChyZWMgPT4ge1xuICAgICAqICByZWMubmVzdGVkUHJvcDEubmVzdGVkUHJvcDIgPSBuZXdWYWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiBncmlkLm1hcmtGb3JDaGVjaygpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbWFya0ZvckNoZWNrKCkge1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVnaW5BZGRSb3dCeUluZGV4KHJvd0lEOiBhbnksIGluZGV4OiBudW1iZXIsIGFzQ2hpbGQ/OiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgZ3JpZCBtdXN0IHVzZSByb3cgZWRpdCBtb2RlIHRvIHBlcmZvcm0gcm93IGFkZGluZyEgUGxlYXNlIHNldCByb3dFZGl0YWJsZSB0byB0cnVlLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5kRWRpdCh0cnVlLCBldmVudCk7XG4gICAgICAgIHRoaXMuY2FuY2VsQWRkTW9kZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0luUGlubmVkQXJlYSA9IHRoaXMuaXNSZWNvcmRQaW5uZWRCeVZpZXdJbmRleChpbmRleCk7XG4gICAgICAgIGNvbnN0IHBpbkluZGV4ID0gdGhpcy5waW5uZWRSZWNvcmRzLmZpbmRJbmRleCh4ID0+IHhbdGhpcy5wcmltYXJ5S2V5XSA9PT0gcm93SUQpO1xuICAgICAgICBjb25zdCB1bnBpbkluZGV4ID0gdGhpcy5nZXRVbnBpbm5lZEluZGV4QnlJZChyb3dJRCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXhwYW5zaW9uU3RhdGVzLmdldChyb3dJRCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VSb3cocm93SUQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRSb3dQYXJlbnQgPSB7XG4gICAgICAgICAgICByb3dJRCxcbiAgICAgICAgICAgIGluZGV4OiBpc0luUGlubmVkQXJlYSA/IHBpbkluZGV4IDogdW5waW5JbmRleCxcbiAgICAgICAgICAgIGFzQ2hpbGQsXG4gICAgICAgICAgICBpc1Bpbm5lZDogaXNJblBpbm5lZEFyZWFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBpZiAoaXNJblBpbm5lZEFyZWEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1Jvd0luZGV4ID0gdGhpcy5hZGRSb3dQYXJlbnQuaW5kZXggKyAxO1xuICAgICAgICAvLyBlbnN1cmUgYWRkaW5nIHJvdyBpcyBpbiB2aWV3LlxuICAgICAgICBjb25zdCBzaG91bGRTY3JvbGwgPSB0aGlzLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybVZlcnRpY2FsU2Nyb2xsKG5ld1Jvd0luZGV4LCAtMSk7XG4gICAgICAgIGlmIChzaG91bGRTY3JvbGwpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyhuZXdSb3dJbmRleCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlJbmRleChpbmRleCArIDEpO1xuICAgICAgICByb3cuYW5pbWF0ZUFkZCA9IHRydWU7XG4gICAgICAgIHJvdy5vbkFuaW1hdGlvbkVuZC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICByb3cuYW5pbWF0ZUFkZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxscy5maW5kKGMgPT4gYy5lZGl0YWJsZSk7XG4gICAgICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5zdWJtaXRfdmFsdWUoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW50ZXJFZGl0TW9kZShjZWxsLCBldmVudCk7XG4gICAgICAgICAgICAgICAgY2VsbC5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBJZ3hHcmlkUm93Q29tcG9uZW50YCBhbmQgYWRkcyB0aGUgZGF0YSByZWNvcmQgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YSBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLmFkZFJvdyhyZWNvcmQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGFkZFJvdyhkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gY29tbWl0IHBlbmRpbmcgc3RhdGVzIHByaW9yIHRvIGFkZGluZyBhIHJvd1xuICAgICAgICB0aGlzLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5hZGRSb3dUb0RhdGEoZGF0YSk7XG5cbiAgICAgICAgdGhpcy5vblJvd0FkZGVkLmVtaXQoeyBkYXRhIH0pO1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIFRoZSBtZXRob2QgYWNjZXB0IHJvd1NlbGVjdG9yIGFzIGEgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgcm93SUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5kZWxldGVSb3coMCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVJvdyhyb3dTZWxlY3RvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnByaW1hcnlLZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByaW1hcnlLZXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlUm93QnlJZChyb3dTZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBkZWxldGVSb3dCeUlkKHJvd0lkOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmRlbGV0ZVJvd0J5SWQocm93SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSByZWNvcmQgYnkgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIGBwcmltYXJ5S2V5YCBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkV2l0aFBLLnVwZGF0ZUNlbGwoJ1VwZGF0ZWQnLCAxLCAnUHJvZHVjdE5hbWUnKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSB3aGljaCBpcyB0byBiZSBzZXQuXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmRzIHRvIHJvd0lELlxuICAgICAqIEBwYXJhbSBjb2x1bW4gY29ycmVzcG9uZHMgdG8gY29sdW1uIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVDZWxsKHZhbHVlOiBhbnksIHJvd1NlbGVjdG9yOiBhbnksIGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVmaW5lZCh0aGlzLnByaW1hcnlLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpLmZpbmQoYyA9PiBjLmZpZWxkID09PSBjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKGNvbCkge1xuICAgICAgICAgICAgICAgIC8vIFNpbXBsaWZ5XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHRoaXMuZ3JpZEFQSS5nZXRSb3dEYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2luZGV4X2luX2RhdGEocm93U2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIC8vIElmIHJvdyBwYXNzZWQgaXMgaW52YWxpZFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SUQ6IHJvd1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JRDogY29sLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG5ldyBJZ3hDZWxsKGlkLCBpbmRleCwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0sIHJvd0RhdGFbY29sLmZpZWxkXSwgcm93RGF0YSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuZ3JpZEFQSS51cGRhdGVfY2VsbChjZWxsLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcnVkU2VydmljZS5jZWxsICYmIHRoaXMuY3J1ZFNlcnZpY2Uuc2FtZUNlbGwoY2VsbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5leGl0Q2VsbEVkaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYElneEdyaWRSb3dDb21wb25lbnRgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSByb3cgaXMgc3BlY2lmaWVkIGJ5XG4gICAgICogcm93U2VsZWN0b3IgcGFyYW1ldGVyIGFuZCB0aGUgZGF0YSBzb3VyY2UgcmVjb3JkIHdpdGggdGhlIHBhc3NlZCB2YWx1ZS5cbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFwcGx5IHJlcXVlc3RlZCB1cGRhdGUgb25seSBpZiBwcmltYXJ5IGtleSBpcyBzcGVjaWZpZWQgaW4gdGhlIGdyaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC51cGRhdGVSb3coe1xuICAgICAqICAgICAgIFByb2R1Y3RJRDogMSwgUHJvZHVjdE5hbWU6ICdTcGVhcm1pbnQnLCBJblN0b2NrOiB0cnVlLCBVbml0c0luU3RvY2s6IDEsIE9yZGVyRGF0ZTogbmV3IERhdGUoJzIwMDUtMDMtMjEnKVxuICAgICAqICAgfSwgMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUm93KHZhbHVlOiBhbnksIHJvd1NlbGVjdG9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZWZpbmVkKHRoaXMucHJpbWFyeUtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlQ2VsbCA9IHRoaXMuY3J1ZFNlcnZpY2UuY2VsbDtcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZUNlbGwgJiYgZWRpdGFibGVDZWxsLmlkLnJvd0lEID09PSByb3dTZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZXhpdENlbGxFZGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3cgPSBuZXcgSWd4Um93KHJvd1NlbGVjdG9yLCAtMSwgdGhpcy5ncmlkQVBJLmdldFJvd0RhdGEocm93U2VsZWN0b3IpLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS51cGRhdGVfcm93KHJvdywgdmFsdWUpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBmaXggZm9yICM1OTM0IGFuZCBwcm9iYWJseSBicmVhayBmb3IgIzU3NjNcbiAgICAgICAgICAgIC8vIGNvbnNpZGVyIGFkZGluZyBvZiB0aGlyZCBvcHRpb25hbCBib29sZWFuIHBhcmFtZXRlciBpbiB1cGRhdGVSb3cuXG4gICAgICAgICAgICAvLyBJZiBkZXZlbG9wZXIgc2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgd2Ugc2hvdWxkIGNhbGwgbm90aWZ5Q2hhbmdlcyh0cnVlKSwgYW5kXG4gICAgICAgICAgICAvLyB2aXNlLXZlcnNhIGlmIGRldmVsb3BlciBzZXQgaXQgdG8gZmFsc2Ugd2Ugc2hvdWxkIGNhbGwgbm90aWZ5Q2hhbmdlcyhmYWxzZSkuXG4gICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIHNob3VsZCBkZWZhdWx0IHRvIGZhbHNlXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIHJvdyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHRoZSBwcmltYXJ5IGtleSBpcyBub3Qgc3BlY2lmaWVkIHRoZSByb3cgc2VsZWN0b3IgbWF0Y2ggdGhlIHJvdyBkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRhdGEgPSBncmlkLmdldFJvd0RhdGEoOTQ3NDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kIHRvIHJvd0lEXG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0RhdGEocm93U2VsZWN0b3I6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMucHJpbWFyeUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1NlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2luZGV4X2luX2RhdGEocm93U2VsZWN0b3IpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8ge30gOiBkYXRhW2luZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0IGEgc2luZ2xlIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTb3J0IHRoZSBgSWd4R3JpZENvbXBvbmVudGAncyBgSWd4Q29sdW1uQ29tcG9uZW50YCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJyYXkgb2Ygc29ydGluZyBleHByZXNzaW9ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc29ydCh7IGZpZWxkTmFtZTogbmFtZSwgZGlyOiBTb3J0aW5nRGlyZWN0aW9uLkFzYywgaWdub3JlQ2FzZTogZmFsc2UgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNvcnQoZXhwcmVzc2lvbjogSVNvcnRpbmdFeHByZXNzaW9uIHwgQXJyYXk8SVNvcnRpbmdFeHByZXNzaW9uPik6IHZvaWQge1xuICAgICAgICBjb25zdCBzb3J0aW5nU3RhdGUgPSBjbG9uZUFycmF5KHRoaXMuc29ydGluZ0V4cHJlc3Npb25zKTtcblxuICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVhY2ggb2YgZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmIChlYWNoLmRpciA9PT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5yZW1vdmVfZ3JvdXBpbmdfZXhwcmVzc2lvbihlYWNoLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5wcmVwYXJlX3NvcnRpbmdfZXhwcmVzc2lvbihbc29ydGluZ1N0YXRlXSwgZWFjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5kaXIgPT09IFNvcnRpbmdEaXJlY3Rpb24uTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5yZW1vdmVfZ3JvdXBpbmdfZXhwcmVzc2lvbihleHByZXNzaW9uLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkucHJlcGFyZV9zb3J0aW5nX2V4cHJlc3Npb24oW3NvcnRpbmdTdGF0ZV0sIGV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJU29ydGluZ0V2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIHNvcnRpbmdFeHByZXNzaW9uczogc29ydGluZ1N0YXRlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuc29ydGluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5zb3J0X211bHRpcGxlKGV4cHJlc3Npb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnQoZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMub25Tb3J0aW5nRG9uZS5lbWl0KGV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGEgc2luZ2xlIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGZpbHRlcih0ZXJtKSB7XG4gICAgICogICAgICB0aGlzLmdyaWQuZmlsdGVyKFwiUHJvZHVjdE5hbWVcIiwgdGVybSwgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihcImNvbnRhaW5zXCIpKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZVxuICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcihuYW1lLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSwgaWdub3JlQ2FzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBhbGwgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGluIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgd2l0aCB0aGUgc2FtZSBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmZpbHRlckdsb2JhbCgnc29tZScsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oJ2NvbnRhaW5zJykpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyR2xvYmFsKHZhbHVlLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc3VtbWFyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgYXBwbGllcyB5b3VyIGN1c3RvbVN1bW1hcnkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSB0aGUgY3VzdG9tU3VtbWFyeSwgdGhlbiB0aGUgZGVmYXVsdCBzdW1tYXJ5IGZvciB0aGUgY29sdW1uIGRhdGEgdHlwZSB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH0sIHsgZmllbGROYW1lOiAnSUQnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKiBFbmFibGUgc3VtbWFyaWVzIGZvciB0aGUgbGlzdGVkIGNvbHVtbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU3VtbWFyaWVzKC4uLnJlc3QpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkocmVzdFswXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlU3VtbWFyaWVzKHJlc3RbMF0sIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKHJlc3RbMF0sIHRydWUsIHJlc3RbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5kaXNhYmxlU3VtbWFyaWVzKCdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBsaXN0ZWQgY29sdW1ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmRpc2FibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVN1bW1hcmllcyguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHJlc3RbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMocmVzdFswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMocmVzdFswXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmFtZSBpcyBwcm92aWRlZCwgY2xlYXJzIHRoZSBmaWx0ZXJpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcmluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhckZpbHRlcigpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIG5hbWUgaXMgcHJvdmlkZWQsIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogb3RoZXJ3aXNlIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU29ydCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU29ydChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfc29ydChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoR3JpZFN0YXRlKGFyZ3M/KSB7XG4gICAgICAgIHRoaXMuZW5kRWRpdCh0cnVlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBXZSBoYXZlIHJldHVybiB2YWx1ZXMgaGVyZS4gTW92ZSB0aGVtIHRvIGV2ZW50IGFyZ3MgPz9cblxuICAgIC8qKlxuICAgICAqIFBpbnMgYSBjb2x1bW4gYnkgZmllbGQgbmFtZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucGluQ29sdW1uKFwiSURcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKi9cbiAgICBwdWJsaWMgcGluQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgaW5kZXg/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wucGluKGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnBpbnMgYSBjb2x1bW4gYnkgZmllbGQgbmFtZS4gUmV0dXJucyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Db2x1bW4oXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbkNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcgfCBJZ3hDb2x1bW5Db21wb25lbnQsIGluZGV4Pyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb2wgPSBjb2x1bW5OYW1lIGluc3RhbmNlb2YgSWd4Q29sdW1uQ29tcG9uZW50ID8gY29sdW1uTmFtZSA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgICAgICByZXR1cm4gY29sLnVucGluKGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaW4gdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpblJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgcm93IGluIHRoZSBwaW5uZWQgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGluUm93KHJvd0lEOiBhbnksIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfYnlfa2V5KHJvd0lEKTtcblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElQaW5Sb3dFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBpbnNlcnRBdEluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGlzUGlubmVkOiB0cnVlLFxuICAgICAgICAgICAgcm93SUQsXG4gICAgICAgICAgICByb3csXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25Sb3dQaW5uaW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbmRFZGl0KGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHR5cGVvZiBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA9PT0gJ251bWJlcicgPyBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA6IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHJvd0lEKTtcbiAgICAgICAgdGhpcy5fcGlwZVRyaWdnZXIrKztcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucGluIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC51bnBpblJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5Sb3cocm93SUQ6IGFueSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKHJvd0lEKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2tleShyb3dJRCk7XG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSVBpblJvd0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIGlzUGlubmVkOiBmYWxzZSxcbiAgICAgICAgICAgIHJvd0lELFxuICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uUm93UGlubmluZy5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcGlubmVkUmVjb3JkSURzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGlubmVkUm93SGVpZ2h0KCkge1xuICAgICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLnBpbkNvbnRhaW5lciA/IHRoaXMucGluQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyA/IGNvbnRhaW5lckhlaWdodCA6IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b3RhbEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY0hlaWdodCA/IHRoaXMuY2FsY0hlaWdodCArIHRoaXMucGlubmVkUm93SGVpZ2h0IDogdGhpcy5jYWxjSGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY2FsY3VsYXRlcyBncmlkIHdpZHRoL2hlaWdodCBkaW1lbnNpb25zLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTaG91bGQgYmUgcnVuIHdoZW4gY2hhbmdpbmcgRE9NIGVsZW1lbnRzIGRpbWVudGlvbnMgbWFudWFsbHkgdGhhdCBhZmZlY3QgdGhlIGdyaWQncyBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5yZWZsb3coKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmbG93KCkge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgYSBnaXZlbiBzdHJpbmcgaW4gdGhlIGdyaWQgYW5kIHNjcm9sbHMgdG8gdGhlIGNlbGwgaWYgaXQgaXNuJ3QgdmlzaWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgZ3JpZCBjb250YWlucyB0aGUgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5maW5kTmV4dChcImZpbmFuY2lhbFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSBvcHRpb25hbGx5LCBpZiB0aGUgc2VhcmNoIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqIEBwYXJhbSBleGFjdE1hdGNoIG9wdGlvbmFsbHksIGlmIHRoZSB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZW50aXJlIHZhbHVlICAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kTmV4dCh0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmQodGV4dCwgMSwgY2FzZVNlbnNpdGl2ZSwgZXhhY3RNYXRjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHByZXZpb3VzIG9jY3VycmVuY2Ugb2YgYSBnaXZlbiBzdHJpbmcgaW4gdGhlIGdyaWQgYW5kIHNjcm9sbHMgdG8gdGhlIGNlbGwgaWYgaXQgaXNuJ3QgdmlzaWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgZ3JpZCBjb250YWlucyB0aGUgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5maW5kUHJldihcImZpbmFuY2lhbFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSBvcHRpb25hbGx5LCBpZiB0aGUgc2VhcmNoIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqIEBwYXJhbSBleGFjdE1hdGNoIG9wdGlvbmFsbHksIGlmIHRoZSB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZW50aXJlIHZhbHVlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRQcmV2KHRleHQ6IHN0cmluZywgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIGV4YWN0TWF0Y2g/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0ZXh0LCAtMSwgY2FzZVNlbnNpdGl2ZSwgZXhhY3RNYXRjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhcHBsaWVzIHRoZSBleGlzdGluZyBzZWFyY2guXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIGxhc3Qgc2VhcmNoLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5yZWZyZXNoU2VhcmNoKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHVwZGF0ZUFjdGl2ZUluZm9cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaFNlYXJjaCh1cGRhdGVBY3RpdmVJbmZvPzogYm9vbGVhbiwgZW5kRWRpdCA9IHRydWUpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRNYXRjaENhY2hlKCk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVBY3RpdmVJbmZvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5mbyA9IElneFRleHRIaWdobGlnaHREaXJlY3RpdmUuaGlnaGxpZ2h0R3JvdXBzTWFwLmdldCh0aGlzLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmZvckVhY2goKG1hdGNoLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5jb2x1bW4gPT09IGFjdGl2ZUluZm8uY29sdW1uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5yb3cgPT09IGFjdGl2ZUluZm8ucm93ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5pbmRleCA9PT0gYWN0aXZlSW5mby5pbmRleCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hcHMobWF0Y2gubWV0YWRhdGEsIGFjdGl2ZUluZm8ubWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmQodGhpcy5sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0LFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlLFxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbmRFZGl0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgdGhlIGhpZ2hsaWdodHMgaW4gdGhlIGNlbGwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY2xlYXJTZWFyY2goKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTZWFyY2goKSB7XG4gICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7XG4gICAgICAgICAgICBzZWFyY2hUZXh0OiAnJyxcbiAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICAgICAgZXhhY3RNYXRjaDogZmFsc2UsXG4gICAgICAgICAgICBhY3RpdmVNYXRjaEluZGV4OiAwLFxuICAgICAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yb3dMaXN0LmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgaWYgKHJvdy5jZWxscykge1xuICAgICAgICAgICAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBzb3J0YWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc29ydGFibGVHcmlkID0gdGhpcy5ncmlkLmhhc1NvcnRhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1NvcnRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC5zb21lKChjb2wpID0+IGNvbC5zb3J0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBlZGl0YWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZWRpdGFibGVHcmlkID0gdGhpcy5ncmlkLmhhc0VkaXRhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0VkaXRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC5zb21lKChjb2wpID0+IGNvbC5lZGl0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBmaWx0ZXJhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJhYmxlR3JpZCA9IHRoaXMuZ3JpZC5oYXNGaWx0ZXJhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0ZpbHRlcmFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLmZpbHRlcmFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgc3VtbWFyaXplZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3VtbWFyaXplZEdyaWQgPSB0aGlzLmdyaWQuaGFzU3VtbWFyaXplZENvbHVtbnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNTdW1tYXJpemVkQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeVNlcnZpY2UuaGFzU3VtbWFyaXplZENvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3RTdW1tYXJpZXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlICE9PSBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZS5jaGlsZExldmVsc09ubHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1Zpc2libGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5faGFzVmlzaWJsZUNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdCA/IHRoaXMuY29sdW1uTGlzdC5zb21lKGMgPT4gIWMuaGlkZGVuKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDb2x1bW5zKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgbW92ZWFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG1vdmFibGVHcmlkID0gdGhpcy5ncmlkLmhhc01vdmFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzTW92YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QgJiYgdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLm1vdmFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgY29sdW1uIGdyb3Vwcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwR3JpZCA9IHRoaXMuZ3JpZC5oYXNDb2x1bW5Hcm91cHM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb2x1bW5Hcm91cHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5Hcm91cHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgY29sdW1uIGxheW91dHMgZm9yIG11bHRpLXJvdyBsYXlvdXQgZGVmaW5pdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxheW91dEdyaWQgPSB0aGlzLmdyaWQuaGFzQ29sdW1uTGF5b3V0cztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0NvbHVtbkxheW91dHMoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuY29sdW1uTGlzdC5zb21lKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBgSWd4R3JpZENlbGxDb21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0aGlzLmdyaWQuc2VsZWN0ZWRDZWxscztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ2VsbHMoKTogSWd4R3JpZENlbGxDb21wb25lbnRbXSB8IGFueVtdIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFSb3dMaXN0Lm1hcCgocm93KSA9PiByb3cuY2VsbHMuZmlsdGVyKChjZWxsKSA9PiBjZWxsLnNlbGVjdGVkKSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbXVsdGlSb3dMYXlvdXRSb3dTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHJvd0Jhc2VkSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhTGVuZ3RoICogdGhpcy5yb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgaXNQZXJjZW50V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoICYmIHRoaXMud2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNQZXJjZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0ICYmIHRoaXMuX2hlaWdodC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gdGhpcy5kYXRhTGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFJvd0hlaWdodCAqIE1hdGgubWluKHRoaXMuX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIsXG4gICAgICAgICAgICB0aGlzLnBhZ2luZyA/IE1hdGgubWluKGFsbEl0ZW1zLCB0aGlzLnBlclBhZ2UpIDogYWxsSXRlbXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVGhlIHJvd0hlaWdodCBpbnB1dCBpcyBib3VuZCB0byBtaW4taGVpZ2h0IGNzcyBwcm9wIG9mIHJvd3MgdGhhdCBhZGRzIGEgMXB4IGJvcmRlciBpbiBhbGwgY2FzZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlbmRlcmVkUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodCArIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG91dGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgPyB0aGlzLmNhbGNXaWR0aCArIHRoaXMuc2Nyb2xsU2l6ZSA6IHRoaXMuY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgdmlzaWJsZSBjb250ZW50IGhlaWdodCB0aGF0IGluY2x1ZGVzIGhlYWRlciArIHRib2R5ICsgZm9vdGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWaXNpYmxlQ29udGVudEhlaWdodCgpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgKyB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5oYXNTdW1tYXJpemVkQ29sdW1ucykge1xuICAgICAgICAgICAgaGVpZ2h0ICs9IHRoaXMudGZvb3QubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQb3NzaWJsZUNvbHVtbldpZHRoKGJhc2VXaWR0aDogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICBsZXQgY29tcHV0ZWRXaWR0aDtcbiAgICAgICAgaWYgKGJhc2VXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IGJhc2VXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSB0aGlzLmNhbGNXaWR0aCB8fFxuICAgICAgICAgICAgICAgIHBhcnNlSW50KHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyksIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXB1dGVkV2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ29sdW1uIGxheW91dHMgcmVsYXRlZFxuICAgICAgICBsZXQgdmlzaWJsZUNvbHMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uQmxvY2tzID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29uc3QgY29sc1BlckJsb2NrID0gY29sdW1uQmxvY2tzLm1hcChibG9jayA9PiBibG9jay5nZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyhibG9jay5jaGlsZHJlbikpO1xuICAgICAgICBjb25zdCBjb21iaW5lZEJsb2Nrc1NpemUgPSBjb2xzUGVyQmxvY2sucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIGl0ZW0ubGVuZ3RoLCAwKTtcbiAgICAgICAgY29sc1BlckJsb2NrLmZvckVhY2goYmxvY2tDb2xzID0+IHZpc2libGVDb2xzID0gdmlzaWJsZUNvbHMuY29uY2F0KGJsb2NrQ29scykpO1xuICAgICAgICAvL1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNXaXRoU2V0V2lkdGhzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHZpc2libGVDb2xzLmZpbHRlcihjID0+IGMud2lkdGhTZXRCeVVzZXIpIDpcbiAgICAgICAgICAgIHZpc2libGVDaGlsZENvbHVtbnMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlcik7XG5cbiAgICAgICAgY29uc3QgY29sdW1uc1RvU2l6ZSA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICBjb21iaW5lZEJsb2Nrc1NpemUgLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGggOlxuICAgICAgICAgICAgdmlzaWJsZUNoaWxkQ29sdW1ucy5sZW5ndGggLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHN1bUV4aXN0aW5nV2lkdGhzID0gY29sdW1uc1dpdGhTZXRXaWR0aHNcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xXaWR0aCA9IGN1cnIud2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGhWYWx1ZSA9IHBhcnNlSW50KGNvbFdpZHRoLCAxMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycldpZHRoID0gY29sV2lkdGggJiYgdHlwZW9mIGNvbFdpZHRoID09PSAnc3RyaW5nJyAmJiBjb2xXaWR0aC5pbmRleE9mKCclJykgIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgd2lkdGhWYWx1ZSAvIDEwMCAqIGNvbXB1dGVkV2lkdGggOlxuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3VycldpZHRoO1xuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiBhbGwgY29sdW1ucyBhcmUgaGlkZGVuLCByZXR1cm4gMHB4IHdpZHRoXG4gICAgICAgIGlmICghc3VtRXhpc3RpbmdXaWR0aHMgJiYgIWNvbHVtbnNUb1NpemUpIHtcbiAgICAgICAgICAgIHJldHVybiAnMHB4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5mbG9vcighTnVtYmVyLmlzRmluaXRlKHN1bUV4aXN0aW5nV2lkdGhzKSA/XG4gICAgICAgICAgICBNYXRoLm1heChjb21wdXRlZFdpZHRoIC8gY29sdW1uc1RvU2l6ZSwgTUlOSU1VTV9DT0xVTU5fV0lEVEgpIDpcbiAgICAgICAgICAgIE1hdGgubWF4KChjb21wdXRlZFdpZHRoIC0gc3VtRXhpc3RpbmdXaWR0aHMpIC8gY29sdW1uc1RvU2l6ZSwgTUlOSU1VTV9DT0xVTU5fV0lEVEgpKTtcblxuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGggKyAncHgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc1ZlcnRpY2FsU2Nyb2xsKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsYWJsZSA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIgPyB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlzU2Nyb2xsYWJsZSgpIDogZmFsc2U7XG4gICAgICAgIHJldHVybiAhISh0aGlzLmNhbGNXaWR0aCAmJiB0aGlzLmRhdGFWaWV3ICYmIHRoaXMuZGF0YVZpZXcubGVuZ3RoID4gMCAmJiBpc1Njcm9sbGFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZmMgPSB0YWtlSGlkZGVuID8gdGhpcy5fcGlubmVkQ29sdW1ucyA6IHRoaXMucGlubmVkQ29sdW1ucztcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGZjKSB7XG4gICAgICAgICAgICBpZiAoY29sLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHBhcnNlSW50KGNvbC5jYWxjV2lkdGgsIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1Bpbm5pbmdUb1N0YXJ0KSB7XG4gICAgICAgICAgICBzdW0gKz0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25seVRvcExldmVsKGFycikge1xuICAgICAgICByZXR1cm4gYXJyLmZpbHRlcihjID0+IGMubGV2ZWwgPT09IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzQ29sdW1uR3JvdXBlZChmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25IZWFkZXJTZWxlY3RvckNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyUm93U2VsZWN0aW9uKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGxSb3dzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkU2VsZWN0b3JCYXNlQXJpYUxhYmVsKCkge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSA/ICdEZXNlbGVjdCBhbGwgZmlsdGVyZWQnIDogJ1NlbGVjdCBhbGwgZmlsdGVyZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpID8gJ0Rlc2VsZWN0IGFsbCcgOiAnU2VsZWN0IGFsbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxSb3dzQ291bnRBZnRlckZpbHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hbGxEYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCBwaW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgcGlubmVkRGF0YVZpZXcgPSB0aGlzLmdyaWQucGlubmVkRGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWREYXRhVmlldygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5lZFJlY29yZHMgPyB0aGlzLnBpbm5lZFJlY29yZHMgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCB1bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBwaW5uZWREYXRhVmlldyA9IHRoaXMuZ3JpZC5waW5uZWREYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMgPyB0aGlzLnVucGlubmVkUmVjb3JkcyA6IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuaWd4Rm9yT2YgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHRyYW5zZm9ybWVkIHBhZ2VkL2ZpbHRlcmVkL3NvcnRlZC9ncm91cGVkL3Bpbm5lZC91bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBkYXRhVmlldyA9IHRoaXMuZ3JpZC5kYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFWaWV3KCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgP1xuICAgICAgICAgICAgWy4uLnRoaXMucGlubmVkRGF0YVZpZXcsIC4uLnRoaXMudW5waW5uZWREYXRhVmlld10gOlxuICAgICAgICAgICAgWy4uLnRoaXMudW5waW5uZWREYXRhVmlldywgLi4udGhpcy5waW5uZWREYXRhVmlld107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgY2xpY2tpbmcgb3ZlciBhIHJvdyBzaG91bGQgc2VsZWN0L2Rlc2VsZWN0IGl0XG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIHRydWVcbiAgICAgKiBAcGFyYW0gZW5hYmxlZDogYm9vbGVhblxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdFJvd09uQ2xpY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RSb3dPbkNsaWNrO1xuICAgIH1cblxuICAgIHNldCBzZWxlY3RSb3dPbkNsaWNrKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Um93T25DbGljayA9IGVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCByb3dzIGJ5IElELlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdFJvd3MoWzEsMiw1XSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEc1xuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdFJvd3Mocm93SURzOiBhbnlbXSwgY2xlYXJDdXJyZW50U2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcywgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc3BlY2lmaWVkIHJvd3MgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RSb3dzKFsxLDIsNV0pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgYWxsIHJvd3NcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpZiBmaWx0ZXJpbmcgaXMgaW4gcGxhY2UsIHNlbGVjdEFsbFJvd3MoKSBhbmQgZGVzZWxlY3RBbGxSb3dzKCkgc2VsZWN0L2Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCByb3dzLlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHBhcmFtZXRlciBvbmx5RmlsdGVyRGF0YSB0byBmYWxzZSB0aGF0IHdpbGwgc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0QWxsUm93cygpO1xuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKGZhbHNlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb25seUZpbHRlckRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhID8gdGhpcy5maWx0ZXJlZERhdGEgOiB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRydWUpO1xuICAgICAgICBjb25zdCByb3dJRHMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0Um93SURzKGRhdGEpLmZpbHRlcihySUQgPT4gIXRoaXMuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihySUQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIGFsbCByb3dzXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaWYgZmlsdGVyaW5nIGlzIGluIHBsYWNlLCBzZWxlY3RBbGxSb3dzKCkgYW5kIGRlc2VsZWN0QWxsUm93cygpIHNlbGVjdC9kZXNlbGVjdCBhbGwgZmlsdGVyZWQgcm93cy5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSBwYXJhbWV0ZXIgb25seUZpbHRlckRhdGEgdG8gZmFsc2UgdGhhdCB3aWxsIGRlc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxSb3dzKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9ubHlGaWx0ZXJEYXRhXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgaWYgKG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RSb3dzKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRSb3dJRHModGhpcy5maWx0ZXJlZERhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckNlbGxTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ1Njcm9sbChkaXI6IERyYWdTY3JvbGxEaXJlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSA0ODtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLmdldFNjcm9sbCgpO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIHN3aXRjaCAoZGlyKSB7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uTEVGVDpcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsLnNjcm9sbExlZnQgLT0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uUklHSFQ6XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5zY3JvbGxMZWZ0ICs9IHNjcm9sbERlbHRhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEcmFnU2Nyb2xsRGlyZWN0aW9uLlRPUDpcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbC5zY3JvbGxUb3AgLT0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uQk9UVE9NOlxuICAgICAgICAgICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCArPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRHJhZ1Njcm9sbERpcmVjdGlvbi5CT1RUT01MRUZUOlxuICAgICAgICAgICAgICAgIGhvcml6b250YWwuc2Nyb2xsTGVmdCAtPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbC5zY3JvbGxUb3AgKz0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uQk9UVE9NUklHSFQ6XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5zY3JvbGxMZWZ0ICs9IHNjcm9sbERlbHRhO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCArPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRHJhZ1Njcm9sbERpcmVjdGlvbi5UT1BMRUZUOlxuICAgICAgICAgICAgICAgIGhvcml6b250YWwuc2Nyb2xsTGVmdCAtPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbC5zY3JvbGxUb3AgLT0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uVE9QUklHSFQ6XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5zY3JvbGxMZWZ0ICs9IHNjcm9sbERlbHRhO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCAtPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEZWZpbmVkKGFyZzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhcmcgIT09IHVuZGVmaW5lZCAmJiBhcmcgIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0UmFuZ2UoYXJnOiBHcmlkU2VsZWN0aW9uUmFuZ2UgfCBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2VsbFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYXJnLmZvckVhY2gocmFuZ2UgPT4gdGhpcy5zZXRTZWxlY3Rpb24ocmFuZ2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uVG9WaXNpYmxlSW5kZXgoZmllbGQ6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCkudmlzaWJsZUluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGVjdGlvbihyYW5nZTogR3JpZFNlbGVjdGlvblJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHsgcm93OiByYW5nZS5yb3dTdGFydCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtblN0YXJ0KSB9O1xuICAgICAgICBjb25zdCBlbmROb2RlID0geyByb3c6IHJhbmdlLnJvd0VuZCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtbkVuZCkgfTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlLm5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSYW5nZShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFkZFJhbmdlTWV0YShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmluaXRQb2ludGVyU3RhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZFJhbmdlcygpOiBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UucmFuZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY3VycmVudCBjZWxsIHNlbGVjdGlvbiBpbiB0aGUgZm9ybSBvZiBgW3sgY29sdW1uLmZpZWxkOiBjZWxsLnZhbHVlIH0sIC4uLl1gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgZm9ybWF0dGVyc2AgaXMgZW5hYmxlZCwgdGhlIGNlbGwgdmFsdWUgd2lsbCBiZSBmb3JtYXR0ZWQgYnkgaXRzIHJlc3BlY3RpdmUgY29sdW1uIGZvcm1hdHRlciAoaWYgYW55KS5cbiAgICAgKiBJZiBgaGVhZGVyc2AgaXMgZW5hYmxlZCwgaXQgd2lsbCB1c2UgdGhlIGNvbHVtbiBoZWFkZXIgKGlmIGFueSkgaW5zdGVhZCBvZiB0aGUgY29sdW1uIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZERhdGEoZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjdXJyZW50IHNlbGVjdGVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBzZWxlY3RlZCBjb2x1bW5zXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5zZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICByZXR1cm4gZmllbGRzLm1hcChmaWVsZCA9PiB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZCkpLmZpbHRlcihmaWVsZCA9PiBmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKiBAcGFyYW0gY2xlYXJDdXJyZW50U2VsZWN0aW9uIGlmIHRydWUgY2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgSWd4Q29sdW1uQ29tcG9uZW50W10sIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGZpZWxkVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY29sdW1uc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgSWd4Q29sdW1uQ29tcG9uZW50W10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb1NlbGVjdCA9IFsuLi5maWVsZFRvU2VsZWN0LCAuLi5jaGlsZHJlbl07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb1NlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9TZWxlY3QsIGNsZWFyQ3VycmVudFNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zIGJ5IGZpbGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0Q29sdW1ucyhbJ0lEJywnTmFtZSddKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbnMoY29sdW1uczogc3RyaW5nW10gfCBJZ3hDb2x1bW5Db21wb25lbnRbXSkge1xuICAgICAgICBsZXQgZmllbGRUb0Rlc2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgSWd4Q29sdW1uQ29tcG9uZW50W10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb0Rlc2VsZWN0ID0gWy4uLmZpZWxkVG9EZXNlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9EZXNlbGVjdCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGFsbCBjb2x1bW5zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgY29sdW1ucyBzZWxlY3Rpb24gaW4gdGhlIGZvcm0gb2YgYFt7IGNvbHVtbi5maWVsZDogY2VsbC52YWx1ZSB9LCAuLi5dYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGZvcm1hdHRlcnNgIGlzIGVuYWJsZWQsIHRoZSBjZWxsIHZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IGl0cyByZXNwZWN0aXZlIGNvbHVtbiBmb3JtYXR0ZXIgKGlmIGFueSkuXG4gICAgICogSWYgYGhlYWRlcnNgIGlzIGVuYWJsZWQsIGl0IHdpbGwgdXNlIHRoZSBjb2x1bW4gaGVhZGVyIChpZiBhbnkpIGluc3RlYWQgb2YgdGhlIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb2x1bW5zRGF0YShmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSA/IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhIDogdGhpcy5kYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21Db2x1bW5zU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbWJpbmVTZWxlY3RlZENlbGxBbmRDb2x1bW5EYXRhKGNvbHVtbkRhdGE6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycywgY29sdW1uRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmVudENvbnRhaW5lclNjcm9sbCA9IChldnQpID0+IHtcbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmFkZFNjcm9sbFRvcChldnQudGFyZ2V0LnNjcm9sbFRvcCk7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsTGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb24gKz0gZXZ0LnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvcHlIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuZ3JpZEFQSS5ncmlkLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBjb25zdCBjb2x1bW5EYXRhID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnNEYXRhKHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycywgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb3B5Jyl7XG4gICAgICAgICAgICBzZWxlY3RlZERhdGEgPSB0aGlzLmdldFNlbGVjdGVkRGF0YSh0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0tleUMnICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xhc3NOYW1lID09PSAnaWd4LWdyaWRfX3RoZWFkLXdyYXBwZXInKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgc2VsZWN0ZWREYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5jb21iaW5lU2VsZWN0ZWRDZWxsQW5kQ29sdW1uRGF0YShjb2x1bW5EYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YVswXSwgZGF0YVsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gY29sdW1uRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0lFKCkpIHtcbiAgICAgICAgICAgICAgICAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCdUZXh0JywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChyZXN1bHQpLnRoZW4oKS5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuZW5hYmxlZCB8fCB0aGlzLmNydWRTZXJ2aWNlLmNlbGxJbkVkaXRNb2RlIHx8ICghaXNJRSgpICYmIGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0lFKCkpIHtcbiAgICAgICAgICAgICAgICAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCdUZXh0JywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhLCBrZXlzPykge1xuICAgICAgICBjb25zdCBldiA9IHsgZGF0YSwgY2FuY2VsOiBmYWxzZSB9IGFzIElHcmlkQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgIHRoaXMub25HcmlkQ29weS5lbWl0KGV2KTtcblxuICAgICAgICBpZiAoZXYuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhKGV2LmRhdGEsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5zZXBhcmF0b3IpO1xuICAgICAgICBsZXQgcmVzdWx0ID0ga2V5cyA/IHRyYW5zZm9ybWVyLnByZXBhcmVEYXRhKGtleXMpIDogdHJhbnNmb3JtZXIucHJlcGFyZURhdGEoKTtcblxuICAgICAgICBpZiAoIXRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQuaW5kZXhPZignXFxuJykgKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLyogTmVjZXNzYXJ5IGZvciB0aGUgaGllYXJhY2hpY2FsIGNhc2UgYnV0IHdpbGwgcHJvYmFibHkgaGF2ZSB0b1xuICAgICAgICAgICBjaGFuZ2UgaG93IGdldFNlbGVjdGVkRGF0YSBpcyBwcm9wYWdhdGVkIGluIHRoZSBoaWVhcmFjaGljYWwgZ3JpZFxuICAgICAgICAqL1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNob3dTbmFja2JhckZvcihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIuYWN0aW9uVGV4dCA9IGluZGV4ID09PSAtMSA/ICcnIDogdGhpcy5zbmFja2JhckFjdGlvblRleHQ7XG4gICAgICAgIHRoaXMubGFzdEFkZGVkUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGVzIHRvIGEgcG9zaXRpb24gaW4gdGhlIGdyaWQgYmFzZWQgb24gcHJvdmlkZWQgYHJvd2luZGV4YCBhbmQgYHZpc2libGVDb2x1bW5JbmRleGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsc28gY2FuIGV4ZWN1dGUgYSBjdXN0b20gbG9naWMgb3ZlciB0aGUgdGFyZ2V0IGVsZW1lbnQsXG4gICAgICogdGhyb3VnaCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB7IHRhcmdldFR5cGU6IEdyaWRLZXlkb3duVGFyZ2V0VHlwZSwgdGFyZ2V0OiBPYmplY3QgfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICB0aGlzLmdyaWQubmF2aWdhdGVUbygxMCwgMywgKGFyZ3MpID0+IHsgYXJncy50YXJnZXQubmF0aXZlRWxlbWVudC5mb2N1cygpOyB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVUbyhyb3dJbmRleDogbnVtYmVyLCB2aXNpYmxlQ29sSW5kZXggPSAtMSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSAodGhpcyBhcyBhbnkpLnRvdGFsSXRlbUNvdW50ID8/IHRoaXMuZGF0YVZpZXcubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKHJvd0luZGV4IDwgMCB8fCByb3dJbmRleCA+IHRvdGFsSXRlbXMgfHwgKHZpc2libGVDb2xJbmRleCAhPT0gLTFcbiAgICAgICAgICAgICYmIHRoaXMuY29sdW1uTGlzdC5tYXAoY29sID0+IGNvbC52aXNpYmxlSW5kZXgpLmluZGV4T2YodmlzaWJsZUNvbEluZGV4KSA9PT0gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2Uocm93SW5kZXgsIHJvd0luZGV4ICsgMSkuZmluZChyZWMgPT4gcmVjLmV4cHJlc3Npb24gfHwgcmVjLmNoaWxkR3JpZHNEYXRhKSkge1xuICAgICAgICAgICAgdmlzaWJsZUNvbEluZGV4ID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCByb3cgaXMgcGlubmVkIG5vIG5lZWQgdG8gc2Nyb2xsIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbFZlcnRpY2FsbHkgPSB0aGlzLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybVZlcnRpY2FsU2Nyb2xsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBjb25zdCBzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkgPSB0aGlzLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybUhvcml6b250YWxTY3JvbGwodmlzaWJsZUNvbEluZGV4LCByb3dJbmRleCk7XG4gICAgICAgIGlmIChzaG91bGRTY3JvbGxWZXJ0aWNhbGx5KSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybVZlcnRpY2FsU2Nyb2xsVG9DZWxsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsSG9yaXpvbnRhbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtSG9yaXpvbnRhbFNjcm9sbFRvQ2VsbCh2aXNpYmxlQ29sSW5kZXgsICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtSG9yaXpvbnRhbFNjcm9sbFRvQ2VsbCh2aXNpYmxlQ29sSW5kZXgsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsVmVydGljYWxseSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybVZlcnRpY2FsU2Nyb2xsVG9DZWxsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYElDZWxsUG9zaXRpb25gIHdoaWNoIGRlZmluZXMgdGhlIG5leHQgY2VsbCxcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24sIHRoYXQgbWF0Y2ggc3BlY2lmaWMgY3JpdGVyaWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFlvdSBjYW4gcGFzcyBjYWxsYmFjayBmdW5jdGlvbiBhcyBhIHRoaXJkIHBhcmFtZXRlciBvZiBgZ2V0UHJldmlvdXNDZWxsYCBtZXRob2QuXG4gICAgICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFjY2VwdHMgSWd4Q29sdW1uQ29tcG9uZW50IGFzIGEgcGFyYW1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgY29uc3QgbmV4dEVkaXRhYmxlQ2VsbFBvc2l0aW9uID0gdGhpcy5ncmlkLmdldE5leHRDZWxsKDAsIDMsIChjb2x1bW4pID0+IGNvbHVtbi5lZGl0YWJsZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldE5leHRDZWxsKGN1cnJSb3dJbmRleDogbnVtYmVyLCBjdXJWaXNpYmxlQ29sSW5kZXg6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChJZ3hDb2x1bW5Db21wb25lbnQpID0+IGJvb2xlYW4gPSBudWxsKTogSUNlbGxQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwICYmIGNvbC52aXNpYmxlSW5kZXggPj0gMCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQb3NpdGlvbihjdXJyUm93SW5kZXgsIGN1clZpc2libGVDb2xJbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sSW5kZXhlcyA9IGNhbGxiYWNrID8gY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY2FsbGJhY2soY29sKSkubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSA6XG4gICAgICAgICAgICBjb2x1bW5zLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IG5leHRDZWxsSW5kZXggPSBjb2xJbmRleGVzLmZpbmQoaW5kZXggPT4gaW5kZXggPiBjdXJWaXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zbGljZShjdXJyUm93SW5kZXgsIGN1cnJSb3dJbmRleCArIDEpXG4gICAgICAgICAgICAuZmluZChyZWMgPT4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSkgJiYgbmV4dENlbGxJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IG5leHRDZWxsSW5kZXggfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb2xJbmRleGVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4KSA9PT0gY3VyclJvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgpLCB2aXNpYmxlQ29sdW1uSW5kZXg6IGNvbEluZGV4ZXNbMF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYElDZWxsUG9zaXRpb25gIHdoaWNoIGRlZmluZXMgdGhlIHByZXZpb3VzIGNlbGwsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGF0IG1hdGNoIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgY2FuIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYSB0aGlyZCBwYXJhbWV0ZXIgb2YgYGdldFByZXZpb3VzQ2VsbGAgbWV0aG9kLlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhY2NlcHRzIElneENvbHVtbkNvbXBvbmVudCBhcyBhIHBhcmFtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IHByZXZpb3VzRWRpdGFibGVDZWxsUG9zaXRpb24gPSB0aGlzLmdyaWQuZ2V0UHJldmlvdXNDZWxsKDAsIDMsIChjb2x1bW4pID0+IGNvbHVtbi5lZGl0YWJsZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFByZXZpb3VzQ2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cCAmJiBjb2wudmlzaWJsZUluZGV4ID49IDApO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUG9zaXRpb24oY3VyclJvd0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ZXMgPSBjYWxsYmFjayA/IGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNhbGxiYWNrKGNvbCkpLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBiIC0gYSkgOlxuICAgICAgICAgICAgY29sdW1ucy5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBjb25zdCBwcmV2Q2VsbEluZGV4ID0gY29sSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4IDwgY3VyVmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2UoY3VyclJvd0luZGV4LCBjdXJyUm93SW5kZXggKyAxKVxuICAgICAgICAgICAgLmZpbmQocmVjID0+ICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEpICYmIHByZXZDZWxsSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBwcmV2Q2VsbEluZGV4IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29sSW5kZXhlcy5sZW5ndGggPT09IDAgfHwgdGhpcy5nZXROZXh0RGF0YVJvd0luZGV4KGN1cnJSb3dJbmRleCwgdHJ1ZSkgPT09IGN1cnJSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4LCB0cnVlKSwgdmlzaWJsZUNvbHVtbkluZGV4OiBjb2xJbmRleGVzWzBdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFja0NvbHVtbkNoYW5nZXMoaW5kZXgsIGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmZpZWxkICsgY29sLl9jYWxjV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cGFuZGVkR3JvdXAoX2dyb3VwOiBJR3JvdXBCeVJlY29yZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9wZW5Sb3dPdmVybGF5KGlkKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkoaWQsIHRoaXMucm93TGlzdC5sZW5ndGggPD0gTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCk7XG5cbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5vcGVuKHRoaXMucm93RWRpdFNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5yb3dFZGl0aW5nV2hlZWxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlUm93RWRpdGluZ092ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMucm93RWRpdGluZ1doZWVsSGFuZGxlcik7XG4gICAgICAgIHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3BJbml0aWFsUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNsb3NlKCk7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShzaG93KSB7XG4gICAgICAgIGNvbnN0IHJvd1N0eWxlID0gdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnN0eWxlO1xuICAgICAgICBpZiAoc2hvdykge1xuICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwb3NpdGlvblJvd0VkaXRpbmdPdmVybGF5KHJvdzogSWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+KSB7XG4gICAgICAgIGlmIChyb3cgJiYgIXRoaXMucm93RWRpdGluZ092ZXJsYXkuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICBjb25zdCByb3dTdHlsZSA9IHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlO1xuICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KHJvdy5yb3dJRCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWNoZWRWaWV3TG9hZGVkKGFyZ3M6IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0hvcml6b250YWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgY29uc3QgdG1wbElkID0gYXJncy5jb250ZXh0LnRlbXBsYXRlSUQudHlwZTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYXJncy5jb250ZXh0LmluZGV4O1xuICAgICAgICAgICAgYXJncy52aWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdG1wbElkID09PSAnZGF0YVJvdycgPyB0aGlzLmdldFJvd0J5SW5kZXgoaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5Um93ID0gdG1wbElkID09PSAnc3VtbWFyeVJvdycgPyB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmluZCgoc3IpID0+IHNyLmRhdGFSb3dJbmRleCA9PT0gaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocm93ICYmIHJvdyBpbnN0YW5jZW9mIElneFJvd0RpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN0b3JlVmlydFN0YXRlKHJvdyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVWaXJ0U3RhdGUoc3VtbWFyeVJvdyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nKG92ZXJsYXlTZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncykge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG92ZXJsYXlTZXR0aW5ncyA/IG92ZXJsYXlTZXR0aW5ncyA6IHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzO1xuICAgICAgICBpZiAoIXRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncy50YXJnZXQgPVxuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkucm9vdEdyaWQgPyAodGhpcyBhcyBhbnkpLnJvb3RHcmlkLm5hdGl2ZUVsZW1lbnQgOiB0aGlzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmF0dGFjaChcbiAgICAgICAgICAgICAgICBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdG9yOiB0aGlzLnZpZXdSZWYuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogdGhpcy5yZXNvbHZlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcHBseUNoYW5nZXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhhcHBseUNoYW5nZXM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZ092ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nID0gYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcblxuICAgICAgICAgICAgaWYgKGFwcGx5Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nLmFwcGx5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbXB0eVJlY29yZE9iamVjdEZvcihyZWMpIHtcbiAgICAgICAgY29uc3Qgcm93ID0geyAuLi5yZWMgfTtcbiAgICAgICAgT2JqZWN0LmtleXMocm93KS5mb3JFYWNoKGtleSA9PiByb3dba2V5XSA9IHVuZGVmaW5lZCk7XG4gICAgICAgIHJvd1t0aGlzLnByaW1hcnlLZXldID0gdGhpcy5nZW5lcmF0ZVJvd0lEKCk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzSG9yaXpvbnRhbFNjcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxXaWR0aCAtIHRoaXMudW5waW5uZWRXaWR0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdW1tYXJ5Um93KHJvd0RhdGEpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJvd0RhdGEuc3VtbWFyaWVzICYmIChyb3dEYXRhLnN1bW1hcmllcyBpbnN0YW5jZW9mIE1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5kUm93VHJhbnNhY3Rpb24oY29tbWl0OiBib29sZWFuLCByb3c6IElneFJvdywgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICByb3cubmV3RGF0YSA9IHRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRWYWx1ZShyb3cuaWQsIHRydWUpO1xuICAgICAgICBsZXQgcm93RWRpdEFyZ3MgPSByb3cuY3JlYXRlRWRpdEV2ZW50QXJncyh0cnVlLCBldmVudCk7XG5cbiAgICAgICAgaWYgKCFjb21taXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLmVuZFBlbmRpbmcoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93RWRpdEFyZ3MgPSB0aGlzLmdyaWRBUEkudXBkYXRlX3Jvdyhyb3csIHJvdy5uZXdEYXRhLCBldmVudCk7XG4gICAgICAgICAgICBpZiAocm93RWRpdEFyZ3M/LmNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRSb3dFZGl0KCk7XG5cbiAgICAgICAgY29uc3Qgbm9uQ2FuY2VsYWJsZUFyZ3MgPSByb3cuY3JlYXRlRG9uZUVkaXRFdmVudEFyZ3Mocm93RWRpdEFyZ3Mub2xkVmFsdWUsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5yb3dFZGl0RXhpdC5lbWl0KG5vbkNhbmNlbGFibGVBcmdzKTtcbiAgICAgICAgdGhpcy5jbG9zZVJvd0VkaXRpbmdPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogUmVmYWN0b3JcbiAgICAvKipcbiAgICAgKiBGaW5pc2hlcyB0aGUgcm93IHRyYW5zYWN0aW9ucyBvbiB0aGUgY3VycmVudCByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBjb21taXQgPT09IHRydWVgLCBwYXNzZXMgdGhlbSBmcm9tIHRoZSBwZW5kaW5nIHN0YXRlIHRvIHRoZSBkYXRhIChvciB0cmFuc2FjdGlvbiBzZXJ2aWNlKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gaWd4QnV0dG9uIChjbGljayk9XCJncmlkLmVuZEVkaXQodHJ1ZSlcIj5Db21taXQgUm93PC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbW1pdFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmRFZGl0KGNvbW1pdCA9IHRydWUsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5jcnVkU2VydmljZS5yb3c7XG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmNydWRTZXJ2aWNlLmNlbGw7XG4gICAgICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgY3J1ZFNlcnZpY2Ugd2l0aCB3aXRoIEJhc2VBUEkgc2VydmljZVxuICAgICAgICBpZiAoIXJvdyAmJiAhY2VsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdz8uaXNBZGRSb3cpIHtcbiAgICAgICAgICAgIGNhbmNlbGVkID0gdGhpcy5lbmRBZGQoY29tbWl0LCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm4gY2FuY2VsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgICAgICBjYW5jZWxlZCA9IHRoaXMuZ3JpZEFQSS5zdWJtaXRfdmFsdWUoZXZlbnQpO1xuICAgICAgICAgICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmV4aXRDZWxsRWRpdChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYW5jZWxlZCA9IHRoaXMuY3J1ZFNlcnZpY2UuZXhpdFJvd0VkaXQoY29tbWl0LCBldmVudCk7XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2Uucm93RWRpdGluZ0Jsb2NrZWQgPSBjYW5jZWxlZDtcbiAgICAgICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGV2ZW50ICYmIGFjdGl2ZUNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gYWN0aXZlQ2VsbC5yb3c7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlQ29sSW5kZXggPSBhY3RpdmVDZWxsLmxheW91dCA/IGFjdGl2ZUNlbGwubGF5b3V0LmNvbHVtblZpc2libGVJbmRleCA6IGFjdGl2ZUNlbGwuY29sdW1uO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmRBZGQoY29tbWl0ID0gdHJ1ZSwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmNydWRTZXJ2aWNlLnJvdztcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuY3J1ZFNlcnZpY2UuY2VsbDtcbiAgICAgICAgY29uc3QgY2FjaGVkUm93RGF0YSA9IHsgLi4ucm93LmRhdGEgfTtcbiAgICAgICAgbGV0IGNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFyb3cgJiYgIWNlbGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgICAgICB0aGlzLm9uUm93QWRkZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKGFyZ3M6IElSb3dEYXRhRXZlbnRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGFyZ3MuZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWRJbmRleCA9IHRoaXMucGlubmVkUmVjb3Jkcy5maW5kSW5kZXgoeCA9PiB4W3RoaXMucHJpbWFyeUtleV0gPT09IHJvd0RhdGFbdGhpcy5wcmltYXJ5S2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gQSBjaGVjayB3aGV0aGVyIHRoZSByb3cgaXMgaW4gdGhlIGN1cnJlbnQgdmlld1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdJbmRleCA9IHBpbm5lZEluZGV4ICE9PSAtMSA/IHBpbm5lZEluZGV4IDogdGhpcy5maW5kUmVjb3JkSW5kZXhJblZpZXcocm93RGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEuZmluZEluZGV4KGRhdGEgPT4gZGF0YVt0aGlzLnByaW1hcnlLZXldID09PSByb3dEYXRhW3RoaXMucHJpbWFyeUtleV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5WaWV3ID0gdmlld0luZGV4ICE9PSAtMSAmJiAhdGhpcy5uYXZpZ2F0aW9uLnNob3VsZFBlcmZvcm1WZXJ0aWNhbFNjcm9sbCh2aWV3SW5kZXgsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dJbmRleCA9IGlzSW5WaWV3ID8gLTEgOiBkYXRhSW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U25hY2tiYXJGb3Ioc2hvd0luZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FuY2VsYWJsZSA9IHRoaXMuZ3JpZEFQSS5zdWJtaXRfYWRkX3ZhbHVlKGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSByb3cuY3JlYXRlRWRpdEV2ZW50QXJncyh0cnVlLCBldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0LmVtaXQoYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdzLmNhbmNlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLl9nZXRQYXJlbnRSZWNvcmRJZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5hZGRSb3dUb0RhdGEocm93LmRhdGEsIHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkb25lQXJncyA9IHJvdy5jcmVhdGVEb25lRWRpdEV2ZW50QXJncyhjYWNoZWRSb3dEYXRhLCBldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0RG9uZS5lbWl0KGRvbmVBcmdzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZFJvd0VkaXQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRSb3dQYXJlbnQuaXNQaW5uZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5Sb3cocm93LmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZFJvd1BhcmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEFkZE1vZGUgPSBjYW5jZWxhYmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5leGl0Q2VsbEVkaXQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxBZGRNb2RlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZFJvd0VkaXQoKTtcbiAgICAgICAgdGhpcy5jbG9zZVJvd0VkaXRpbmdPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxBZGRNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLm9uUm93QWRkZWQuZW1pdCh7IGRhdGE6IHJvdy5kYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vbkNhbmNlbGFibGVBcmdzID0gcm93LmNyZWF0ZURvbmVFZGl0RXZlbnRBcmdzKGNhY2hlZFJvd0RhdGEsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5yb3dFZGl0RXhpdC5lbWl0KG5vbkNhbmNlbGFibGVBcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsQWRkTW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZFJvd0VkaXQoY29tbWl0ID0gdHJ1ZSwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBjb25zdCBjYW5jZWxlZCA9IHRoaXMuZW5kRWRpdChjb21taXQsIGV2ZW50KTtcblxuICAgICAgICBpZiAoY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICBpZiAoYWN0aXZlQ2VsbCAmJiBhY3RpdmVDZWxsLnJvdyAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlclBpcGVzKCkge1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5kQWRkUm93KCkge1xuICAgICAgICB0aGlzLmNhbmNlbEFkZE1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyaWdnZXJQaXBlcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB3cml0ZVRvRGF0YShyb3dJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIG1lcmdlT2JqZWN0cyh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKClbcm93SW5kZXhdLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ2V0UGFyZW50UmVjb3JkSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJvd1BhcmVudC5hc0NoaWxkID8gdGhpcy5hZGRSb3dQYXJlbnQucm93SUQgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbmRSZWNvcmRJbmRleEluVmlldyhyZWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVZpZXcuZmluZEluZGV4KGRhdGEgPT4gZGF0YVt0aGlzLnByaW1hcnlLZXldID09PSByZWNbdGhpcy5wcmltYXJ5S2V5XSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFVucGlubmVkSW5kZXhCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVucGlubmVkUmVjb3Jkcy5maW5kSW5kZXgoeCA9PiB4W3RoaXMucHJpbWFyeUtleV0gPT09IGlkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3RvcmVWaXJ0U3RhdGUocm93KSB7XG4gICAgICAgIC8vIGNoZWNrIHZpcnR1YWxpemF0aW9uIHN0YXRlIG9mIGRhdGEgcmVjb3JkIGFkZGVkIGZyb20gY2FjaGVcbiAgICAgICAgLy8gaW4gY2FzZSBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQgLSB1cGRhdGUgaXQuXG4gICAgICAgIGNvbnN0IHJvd0Zvck9mID0gcm93LnZpcnREaXJSb3c7XG4gICAgICAgIGNvbnN0IGdyaWRTY3JMZWZ0ID0gcm93Rm9yT2YuZ2V0U2Nyb2xsKCkuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgbGVmdCA9IC1wYXJzZUludChyb3dGb3JPZi5kYy5pbnN0YW5jZS5fdmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCwgMTApO1xuICAgICAgICBjb25zdCBhY3R1YWxTY3JvbGxMZWZ0ID0gbGVmdCArIHJvd0Zvck9mLmdldENvbHVtblNjcm9sbExlZnQocm93Rm9yT2Yuc3RhdGUuc3RhcnRJbmRleCk7XG4gICAgICAgIGlmIChncmlkU2NyTGVmdCAhPT0gYWN0dWFsU2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgcm93Rm9yT2Yub25IU2Nyb2xsKGdyaWRTY3JMZWZ0KTtcbiAgICAgICAgICAgIHJvd0Zvck9mLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEV4cG9ydEV4Y2VsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0RXhjZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFeHBvcnRDc3YoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRDc3Y7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbChyb3c6IElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPikge1xuICAgICAgICBpZiAoIXRoaXMucm93RWRpdGFibGUgfHwgIXRoaXMucm93RWRpdGluZ092ZXJsYXkgfHwgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRhdGEgYW5kL29yIGlzTG9hZGluZyBpbnB1dCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG92ZXJsYXkgY2FuIGJlXG4gICAgICogaGlkZGVuL3Nob3duIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNob3VsZE92ZXJsYXlMb2FkaW5nXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV2YWx1YXRlTG9hZGluZ1N0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRPdmVybGF5TG9hZGluZykge1xuICAgICAgICAgICAgLy8gYSBuZXcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd25cbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgIG91dGxldDogdGhpcy5sb2FkaW5nT3V0bGV0LFxuICAgICAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5KClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdPdmVybGF5Lm9wZW4ob3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ092ZXJsYXkuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGdyaWQgd2lkdGggaS5lLiB0aGlzLmNhbGNXaWR0aFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkV2lkdGgoKSB7XG4gICAgICAgIGxldCB3aWR0aDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRXaWR0aCkge1xuICAgICAgICAgICAgLyogd2lkdGggaW4gJSovXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyk7XG4gICAgICAgICAgICB3aWR0aCA9IGNvbXB1dGVkLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBwYXJzZUludChjb21wdXRlZCwgMTApIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF3aWR0aCAmJiB0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCB8fCAhd2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aFN1bSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSAmJiB0aGlzLndpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8IHdpZHRoID09PSBudWxsKSAmJiB3aWR0aCAhPT0gdGhpcy5jYWxjV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVyaXZlUG9zc2libGVXaWR0aCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGNvbHVtbnMgZGVmYXVsdFdpZHRoIHByb3BlcnR5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZXJpdmVQb3NzaWJsZVdpZHRoKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbldpZHRoID0gdGhpcy53aWR0aCAhPT0gbnVsbCA/IHRoaXMuZ2V0UG9zc2libGVDb2x1bW5XaWR0aCgpIDogTUlOSU1VTV9DT0xVTU5fV0lEVEggKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiBwYXJzZUludCh0aGlzLl9jb2x1bW5XaWR0aCwgMTApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGhDb21iaW5lZCA9IHBhcnNlSW50KHRoaXMuX2NvbHVtbldpZHRoLCAxMCkgKiAoY29sdW1uLmNvbEVuZCA/IGNvbHVtbi5jb2xFbmQgLSBjb2x1bW4uY29sU3RhcnQgOiAxKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gY29sdW1uV2lkdGhDb21iaW5lZCArICdweCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEQuSy4gTWFyY2ggMjl0aCwgMjAyMSAjOTE0NSBDb25zaWRlciBtaW4vbWF4IHdpZHRoIHdoZW4gc2V0dGluZyBkZWZhdWx0V2lkdGggcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gdGhpcy5nZXRFeHRyZW11bUJhc2VkQ29sV2lkdGgoY29sdW1uKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4ucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEV4dHJlbXVtQmFzZWRDb2xXaWR0aChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuX2NvbHVtbldpZHRoO1xuICAgICAgICBpZiAod2lkdGggJiYgdHlwZW9mIHdpZHRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcod2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gd2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IGNvbHVtbi5taW5XaWR0aFB4IDogY29sdW1uLm1pbldpZHRoUGVyY2VudDtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSB3aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gY29sdW1uLm1heFdpZHRoUHggOiBjb2x1bW4ubWF4V2lkdGhQZXJjZW50O1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbldpZHRoID4gcGFyc2VGbG9hdCh3aWR0aCkpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKGNvbHVtbi5taW5XaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4V2lkdGggPCBwYXJzZUZsb2F0KHdpZHRoKSkge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcoY29sdW1uLm1heFdpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5vIHB4IG9yICUgYXJlIGRlZmluZWQgaW4gbWF4V2lkdGgvbWluV2lkdGggY29uc2lkZXIgaXQgcHhcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgJiYgd2lkdGguaW5kZXhPZigncHgnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHdpZHRoICs9ICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNldE5vdGlmeUNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RSZXBhaW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVPdXRsZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlID8gdGhpcy5fdXNlck91dGxldERpcmVjdGl2ZSA6IHRoaXMuX291dGxldERpcmVjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbnMgaW4gdGhlIG1haW4gY29sdW1uTGlzdCBhbmQgX2NvbHVtbnMgY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tb3ZlQ29sdW1ucyhmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBsaXN0KTtcbiAgICAgICAgY29uc3QgbmV3TGlzdCA9IHRoaXMuX3Jlc2V0Q29sdW1uTGlzdChsaXN0KTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KG5ld0xpc3QpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlc2V0Q29sdW1uTGlzdChsaXN0Pykge1xuICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgIGxpc3QgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdMaXN0ID0gW107XG4gICAgICAgIGxpc3QuZmlsdGVyKGMgPT4gYy5sZXZlbCA9PT0gMCkuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIG5ld0xpc3QucHVzaChwKTtcbiAgICAgICAgICAgIGlmIChwLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ld0xpc3QuY29uY2F0KHAuYWxsQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlcnMgY29sdW1ucyBpbnNpZGUgdGhlIHBhc3NlZCBjb2x1bW4gY29sbGVjdGlvbi5cbiAgICAgKiBXaGVuIHJlb3JkZXJpbmcgY29sdW1uIGdyb3VwIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBmbGF0dGVuZWQuXG4gICAgICogSW4gYWxsIG90aGVyIGNhc2VzLCB0aGUgY29sdW1ucyBjb2xsZWN0aW9uIGlzIGZsYXR0ZW5lZCwgdGhpcyBpcyB3aHkgYWRpdHRpb25hbCBjYWxjdWxhdGlvbnMgb24gdGhlIGRyb3BJbmRleCBhcmUgZG9uZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlb3JkZXJDb2x1bW5zKGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zaXRpb246IERyb3BQb3NpdGlvbiwgY29sdW1uQ29sbGVjdGlvbjogYW55W10sXG4gICAgICAgIGluR3JvdXAgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmcm9tSW5kZXggPSBjb2x1bW5Db2xsZWN0aW9uLmluZGV4T2YoZnJvbSk7XG4gICAgICAgIGNvbnN0IGNoaWxkQ29sdW1uc0NvdW50ID0gaW5Hcm91cCA/IDEgOiBmcm9tLmFsbENoaWxkcmVuLmxlbmd0aCArIDE7XG4gICAgICAgIGNvbHVtbkNvbGxlY3Rpb24uc3BsaWNlKGZyb21JbmRleCwgY2hpbGRDb2x1bW5zQ291bnQpO1xuICAgICAgICBsZXQgZHJvcEluZGV4ID0gY29sdW1uQ29sbGVjdGlvbi5pbmRleE9mKHRvKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSB7XG4gICAgICAgICAgICBkcm9wSW5kZXgrKztcbiAgICAgICAgICAgIGlmICghaW5Hcm91cCAmJiB0by5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGRyb3BJbmRleCArPSB0by5hbGxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1uQ29sbGVjdGlvbi5zcGxpY2UoZHJvcEluZGV4LCAwLCBmcm9tKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbiBncm91cCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbW92ZUNoaWxkQ29sdW1ucyhwYXJlbnQ6IElneENvbHVtbkNvbXBvbmVudCwgZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwYXJlbnQuY2hpbGRyZW4udG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBidWZmZXIsIHRydWUpO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucmVzZXQoYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0dXBDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5hdXRvR2VuZXJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2dlbmVyYXRlQ29sdW1ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QsIChjb2w6IElneENvbHVtbkNvbXBvbmVudCkgPT4gdGhpcy5vbkNvbHVtbkluaXQuZW1pdChjb2wpKTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0RGlmZmVyLmRpZmYodGhpcy5jb2x1bW5MaXN0KTtcblxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlZChjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWxldGVSb3dGcm9tRGF0YShyb3dJRDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBhIHJvdyAoaW5kZXggIT09IDApIGRlbGV0ZSBpdFxuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgYSByb3cgaW4gQUREIG9yIFVQREFURSBzdGF0ZSBjaGFuZ2UgaXQncyBzdGF0ZSB0byBERUxFVEVcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSB7IGlkOiByb3dJRCwgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkRFTEVURSwgbmV3VmFsdWU6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5hZGQodHJhbnNhY3Rpb24sIHRoaXMuZGF0YVtpbmRleF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlOiBTdGF0ZSA9IHRoaXMudHJhbnNhY3Rpb25zLmdldFN0YXRlKHJvd0lEKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLmFkZCh7IGlkOiByb3dJRCwgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkRFTEVURSwgbmV3VmFsdWU6IG51bGwgfSwgc3RhdGUgJiYgc3RhdGUucmVjb3JkUmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0YSB8fCAodGhpcy5kYXRhLmxlbmd0aCA8IHRoaXMuX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIpID9cbiAgICAgICAgICAgIDAgOiB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMucm93TGlzdERpZmZlci5kaWZmKGNoYW5nZSk7XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQ29sdW1uc0NoYW5nZWQoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50Pikge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5jb2x1bW5MaXN0RGlmZmVyLmRpZmYoY2hhbmdlKTtcblxuICAgICAgICBpZiAodGhpcy5hdXRvR2VuZXJhdGUgJiYgdGhpcy5jb2x1bW5MaXN0Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJbiBJdnkgaWYgdGhlcmUgYXJlIG5lc3RlZCBjb25kaXRpb25hbCB0ZW1wbGF0ZXMgdGhlIGNvbnRlbnQgY2hpbGRyZW4gYXJlIHJlLWV2YWx1YXRlZFxuICAgICAgICAgICAgLy8gaGVuY2UgYXV0b2dlbmVyYXRlZCBjb2x1bW5zIGFyZSBjbGVhcmVkIGFuZCBuZWVkIHRvIGJlIHJlc2V0LlxuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZGlmZi5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneENvbHVtbkNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29sdW1uSW5pdC5lbWl0KHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5pdGVtLnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zLnB1c2gocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucy5wdXNoKHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QpO1xuXG4gICAgICAgICAgICBkaWZmLmZvckVhY2hSZW1vdmVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxJZ3hDb2x1bW5Db21wb25lbnQgfCBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NvbHVtbkdyb3VwID0gcmVjb3JkLml0ZW0gaW5zdGFuY2VvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgR3JvdXBpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX2dyb3VwYnkocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIEZpbHRlcmluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJfZmlsdGVyKHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBmaWx0ZXIgcm93XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbi5maWVsZCA9PT0gcmVjb3JkLml0ZW0uZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBTb3J0aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5jbGVhcl9zb3J0KHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgY29sdW1uIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoW3JlY29yZC5pdGVtLmZpZWxkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcblxuICAgICAgICAgICAgaWYgKGFkZGVkIHx8IHJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBvbkNvbHVtbnNDaGFuZ2VkYCBjYW4gYmUgZXhlY3V0ZWQgbWlkd2F5IGEgY3VycmVudCBkZXRlY3RDaGFuZ2UgY3ljbGUgYW5kIG1hcmtGb3JDaGVjayB3aWxsIGJlIGlnbm9yZWQgdGhlbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3YWl0IGZvciB0aGUgY3VycmVudCBjeWNsZSB0byBlbmQgc28gd2UgY2FuIHRyaWdnZXIgYSBuZXcgb25lIGFuZCBuZ0RvQ2hlY2sgdG8gZmlyZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkU2l6ZXMocmVjYWxjRmVhdHVyZVdpZHRoID0gdHJ1ZSkge1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETzogKFIuSy4pIFRoaXMgbGF5ZXJlZCBsYXNhZ25lIHNob3VsZCBiZSByZWZhY3RvcmVkXG4gICAgICAgICAgICBBU0FQLiBUaGUgcmVhc29uIEkgaGF2ZSB0byByZXNldCB0aGUgY2FjaGVzIHNvIG1hbnkgdGltZXMgaXMgYmVjYXVzZVxuICAgICAgICAgICAgYWZ0ZXIgdGVhY2ggYGRldGVjdENoYW5nZXNgIGNhbGwgdGhleSBhcmUgZmlsbGVkIHdpdGggaW52YWxpZFxuICAgICAgICAgICAgc3RhdGUuIE9mIGNvdXJzZSBhbGwgb2YgdGhpcyBoYXBwZW5zIG1pZHdheSB0aHJvdWdoIHRoZSBncmlkXG4gICAgICAgICAgICBzaXppbmcgcHJvY2VzcyB3aGljaCBvZiBjb3Vyc2UsIHVzZXMgdmFsdWVzIGZyb20gdGhlIGNhY2hlcywgdGh1cyByZXN1bHRpbmdcbiAgICAgICAgICAgIGluIGEgYnJva2VuIGxheW91dC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheSh0aGlzLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LnJlc2V0Q2hpcHNBcmVhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIC8vIGluIGNhc2Ugc2Nyb2xsYmFyIGhhcyBhcHBlYXJlZCByZWNhbGMgdG8gc2l6ZSBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChoYXNTY3JvbGwgIT09IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy56b25lLmlzU3RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVdpZHRoSG9zdEJpbmRpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY0dyaWRIZWFkUm93KCkge1xuICAgICAgICBpZiAodGhpcy5tYXhMZXZlbEhlYWRlckRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKTtcbiAgICAgICAgICAgIGxldCBtaW5TaXplID0gKHRoaXMubWF4TGV2ZWxIZWFkZXJEZXB0aCArIDEpICogdGhpcy5kZWZhdWx0Um93SGVpZ2h0IC8gdGhpcy5fYmFzZUZvbnRTaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICYmIHRoaXMuX2ZpbHRlck1vZGUgPT09IEZpbHRlck1vZGUucXVpY2tGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5TaXplICs9IChGSUxURVJfUk9XX0hFSUdIVCArIDEpIC8gdGhpcy5fYmFzZUZvbnRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbkhlaWdodCA9IGAke21pblNpemV9cmVtYDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIFRCT0RZIGhlaWdodCBpLmUuIHRoaXMuY2FsY0hlaWdodFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkSGVpZ2h0KCkge1xuICAgICAgICB0aGlzLmNhbGNHcmlkSGVhZFJvdygpO1xuICAgICAgICB0aGlzLnN1bW1hcmllc0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmhhc1N1bW1hcml6ZWRDb2x1bW5zICYmIHRoaXMucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyaWVzSGVpZ2h0ID0gdGhpcy5zdW1tYXJ5U2VydmljZS5jYWxjTWF4U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID0gdGhpcy5fY2FsY3VsYXRlR3JpZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGlubmVkUm93SGVpZ2h0ICYmIHRoaXMuY2FsY0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0IC09IHRoaXMucGlubmVkUm93SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRHcm91cEFyZWFIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRDb21wdXRlZEhlaWdodChlbGVtKSB7XG4gICAgICAgIHJldHVybiBlbGVtLm9mZnNldEhlaWdodCA/IHBhcnNlRmxvYXQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpKSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9vdGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1bW1hcmllc0hlaWdodCB8fCB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudGZvb3QubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VGhlYWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gKCF0aGlzLmFsbG93RmlsdGVyaW5nIHx8ICh0aGlzLmFsbG93RmlsdGVyaW5nICYmIHRoaXMuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcikpID9cbiAgICAgICAgICAgIGhlaWdodCAtIHRoaXMuZ2V0RmlsdGVyQ2VsbEhlaWdodCgpIDpcbiAgICAgICAgICAgIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRvb2xiYXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHRvb2xiYXJIZWlnaHQgPSAwO1xuICAgICAgICBpZiAodGhpcy50b29sYmFyLmZpcnN0KSB7XG4gICAgICAgICAgICB0b29sYmFySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRvb2xiYXIuZmlyc3QubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xiYXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYWdpbmdGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhZ2luZ0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmZvb3Rlcikge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLmZvb3Rlci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIHBhZ2luZ0hlaWdodCA9IHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgP1xuICAgICAgICAgICAgICAgIGhlaWdodCA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2luZ0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlckNlbGxIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVhZGVyR3JvdXBOYXRpdmVFbCA9ICh0aGlzLmhlYWRlckdyb3Vwc0xpc3QubGVuZ3RoICE9PSAwKSA/XG4gICAgICAgICAgICB0aGlzLmhlYWRlckdyb3Vwc0xpc3RbMF0uZWxlbWVudC5uYXRpdmVFbGVtZW50IDogbnVsbDtcbiAgICAgICAgY29uc3QgZmlsdGVyQ2VsbE5hdGl2ZUVsID0gKGhlYWRlckdyb3VwTmF0aXZlRWwpID9cbiAgICAgICAgICAgIGhlYWRlckdyb3VwTmF0aXZlRWwucXVlcnlTZWxlY3RvcignaWd4LWdyaWQtZmlsdGVyaW5nLWNlbGwnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiAoZmlsdGVyQ2VsbE5hdGl2ZUVsKSA/IGZpbHRlckNlbGxOYXRpdmVFbC5vZmZzZXRIZWlnaHQgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZUdyaWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5faGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3R1YWxUaGVhZFJvdyA9IHRoaXMuZ2V0VGhlYWRSb3dIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZm9vdGVySGVpZ2h0ID0gdGhpcy5nZXRGb290ZXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHRoaXMuZ2V0VG9vbGJhckhlaWdodCgpO1xuICAgICAgICBjb25zdCBwYWdpbmdIZWlnaHQgPSB0aGlzLmdldFBhZ2luZ0Zvb3RlckhlaWdodCgpO1xuICAgICAgICBjb25zdCBncm91cEFyZWFIZWlnaHQgPSB0aGlzLmdldEdyb3VwQXJlYUhlaWdodCgpO1xuICAgICAgICBjb25zdCBzY3JIZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMuc2NyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCByZW5kZXJlZEhlaWdodCA9IHRvb2xiYXJIZWlnaHQgKyBhY3R1YWxUaGVhZFJvdyArXG4gICAgICAgICAgICBmb290ZXJIZWlnaHQgKyBwYWdpbmdIZWlnaHQgKyBncm91cEFyZWFIZWlnaHQgK1xuICAgICAgICAgICAgc2NySGVpZ2h0O1xuXG4gICAgICAgIGxldCBncmlkSGVpZ2h0ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0Jyk7XG4gICAgICAgICAgICBjb25zdCBhdXRvU2l6ZSA9IHRoaXMuX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KTtcbiAgICAgICAgICAgIGlmIChhdXRvU2l6ZSB8fCBjb21wdXRlZC5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBib2R5SGVpZ2h0ID4gMCA/IGJvZHlIZWlnaHQgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlSW50KHRoaXMuX2hlaWdodCwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKGdyaWRIZWlnaHQgLSByZW5kZXJlZEhlaWdodCk7XG5cbiAgICAgICAgaWYgKE1hdGgucm91bmQoaGVpZ2h0KSA9PT0gMCB8fCBpc05hTihncmlkSGVpZ2h0KSkge1xuICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gYm9keUhlaWdodCA+IDAgPyBib2R5SGVpZ2h0IDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja0NvbnRhaW5lclNpemVDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IG9yaWdIZWlnaHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiBvcmlnSGVpZ2h0ICE9PSBoZWlnaHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCkge1xuICAgICAgICB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgbGV0IHJlcyA9ICF0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ID09PSAwIHx8XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPT09IHJlbmRlcmVkSGVpZ2h0O1xuICAgICAgICBpZiAoIXRoaXMucGxhdGZvcm1VdGlsLmlzQ2hyb21pdW0gJiYgIXRoaXMucGxhdGZvcm1VdGlsLmlzRmlyZWZveCkge1xuICAgICAgICAgICAgLy8gSWYgZ3JpZCBjYXVzZXMgdGhlIHBhcmVudCBjb250YWluZXIgdG8gZXh0ZW5kIChmb3IgZXhhbXBsZSB3aGVuIGNvbnRhaW5lciBpcyBmbGV4KVxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBhdXRvLXNpemUgc2luY2UgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb250YWluZXIgd2lsbCBjb250aW51b3VzbHkgY2hhbmdlIGFzIHRoZSBncmlkIHJlbmRlcnMgZWxlbWVudHMuXG4gICAgICAgICAgICByZXMgPSB0aGlzLmNoZWNrQ29udGFpbmVyU2l6ZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgdW5waW5uZWQgYXJlYVxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRVbnBpbm5lZFdpZHRoKHRha2VIaWRkZW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmlzUGVyY2VudFdpZHRoID9cbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoIDpcbiAgICAgICAgICAgIHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSB8fCBwYXJzZUludCh0aGlzLmhvc3RXaWR0aCwgMTApIHx8IHRoaXMuY2FsY1dpZHRoO1xuICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpICYmICF0aGlzLmlzUGVyY2VudFdpZHRoKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGlubmluZ1RvU3RhcnQpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdpZHRoIC0gdGhpcy5nZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJpZXMoZmllbGROYW1lOiBzdHJpbmcsIGhhc1N1bW1hcnk6IGJvb2xlYW4sIHN1bW1hcnlPcGVyYW5kPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUoZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmhhc1N1bW1hcnkgPSBoYXNTdW1tYXJ5O1xuICAgICAgICAgICAgaWYgKHN1bW1hcnlPcGVyYW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXRyaWdnZXJSb290UGlwZSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4uc3VtbWFyaWVzID0gc3VtbWFyeU9wZXJhbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tdWx0aXBsZVN1bW1hcmllcyhleHByZXNzaW9uczogSVN1bW1hcnlFeHByZXNzaW9uW10sIGhhc1N1bW1hcnk6IGJvb2xlYW4pIHtcbiAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKGVsZW1lbnQuZmllbGROYW1lLCBoYXNTdW1tYXJ5LCBlbGVtZW50LmN1c3RvbVN1bW1hcnkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZU11bHRpcGxlU3VtbWFyaWVzKGV4cHJlc3Npb25zKSB7XG4gICAgICAgIGV4cHJlc3Npb25zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNvbHVtbiAmJiBjb2x1bW4uZmllbGROYW1lID8gY29sdW1uLmZpZWxkTmFtZSA6IGNvbHVtbjtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhjb2x1bW5OYW1lLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZURhdGFUeXBlcyhyZWMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0YVR5cGUuTnVtYmVyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlLkJvb2xlYW47XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlYyA9PT0gJ29iamVjdCcgJiYgcmVjIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlLkRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERhdGFUeXBlLlN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9nZW5lcmF0ZUNvbHVtbnMoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2RhdGEoKTtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcblxuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGZhY3RvcnkuY3JlYXRlKHRoaXMudmlld1JlZi5pbmplY3Rvcik7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5kYXRhVHlwZSA9IHRoaXMucmVzb2x2ZURhdGFUeXBlcyhkYXRhWzBdW2ZpZWxkXSk7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyA9IGNvbHVtbnM7XG5cbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KGNvbHVtbnMpO1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURhdGFGaWVsZHMoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkYXRhICYmIGRhdGEubGVuZ3RoICE9PSAwID8gZGF0YVswXSA6IFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRDb2x1bW5zKGNvbGxlY3Rpb246IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+LCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gdGhpcy5jb2x1bW5MaXN0LnNvbWUoY29sID0+IGNvbC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIC8vIFNldCBvdmVyYWxsIHJvdyBsYXlvdXQgc2l6ZVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uTGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFNpemUgPSBjb2wuY2hpbGRyZW4gP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlZHVjZSgoYWNjLCB2YWwpID0+IE1hdGgubWF4KHZhbC5yb3dTdGFydCArIHZhbC5ncmlkUm93U3BhbiAtIDEsIGFjYyksIDEpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IE1hdGgubWF4KGxheW91dFNpemUsIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiB0aGlzLmhhc0NvbHVtbkdyb3Vwcykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb25maWd1cmF0aW9uIC0gbXVsdGktcm93IGFuZCBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICAvLyByZW1vdmUgY29sdW1uIGdyb3Vwc1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTGF5b3V0Q29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkxheW91dCB8fCBjb2wuY29sdW1uTGF5b3V0Q2hpbGQpO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KGNvbHVtbkxheW91dENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29sdW1uLmRlZmF1bHRXaWR0aCA9IHRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIgPyB0aGlzLl9jb2x1bW5XaWR0aCA6IGNvbHVtbi5kZWZhdWx0V2lkdGggPyBjb2x1bW4uZGVmYXVsdFdpZHRoIDogJyc7XG5cbiAgICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgICAgIGNiKGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVpbml0UGluU3RhdGVzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbHVtbi5wb3B1bGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVpbml0UGluU3RhdGVzKCkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnBpbm5lZCkuc29ydCgoYSwgYikgPT4gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGEpIC0gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGIpKTtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gdGhpcy5oYXNDb2x1bW5Hcm91cHMgPyB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpIDpcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UsIGNvbHVtbkRhdGE/OiBhbnlbXSk6IGFueVtdIHtcbiAgICAgICAgbGV0IGNvbHVtbnNBcnJheTogSWd4Q29sdW1uQ29tcG9uZW50W107XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YSA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25Db2xsZWN0aW9uID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBrZXlzQW5kRGF0YSA9IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWd4LWhpZXJhcmNoaWNhbC1ncmlkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5zaW9uUm93SW5kZXhlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5leHBhbnNpb25TdGF0ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvblJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRLZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihyb3cuSUQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4ID0gTnVtYmVyKHJvdy5JRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXggPSBOdW1iZXIocm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZEtleSA+IE51bWJlcihyb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEtleS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGVjdGlvbi5zZXQodXBkYXRlZEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVFbCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbnNpb25Sb3dJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uUm93SW5kZXhlcy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWwucm93ID4gTnVtYmVyKHJvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFbC5yb3ctLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9ICh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3QgaXNSZW1vdGUgPSB0b3RhbEl0ZW1zICYmIHRvdGFsSXRlbXMgPiB0aGlzLmRhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgbGV0IHNlbGVjdGlvbk1hcDtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZ3gtaGllcmFyY2hpY2FsLWdyaWQnICYmIHNlbGVjdGlvbkNvbGxlY3Rpb24uc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcCA9IGlzUmVtb3RlID8gQXJyYXkuZnJvbShzZWxlY3Rpb25Db2xsZWN0aW9uKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcCA9IGlzUmVtb3RlID8gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZWxsU2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5zaW5nbGUgJiYgYWN0aXZlRWwpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5wdXNoKFthY3RpdmVFbC5yb3csIG5ldyBTZXQ8bnVtYmVyPigpLmFkZChhY3RpdmVFbC5jb2x1bW4pXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZWxsU2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lICYmIGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAucHVzaChbYWN0aXZlRWwucm93LCBuZXcgU2V0PG51bWJlcj4oKS5hZGQoYWN0aXZlRWwuY29sdW1uKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbkRhdGEpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgIGZvciAobGV0IFtyb3csIHNldF0gb2Ygc2VsZWN0aW9uTWFwKSB7XG4gICAgICAgICAgICByb3cgPSB0aGlzLnBhZ2luZyAmJiBzb3VyY2UgPT09IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhID8gcm93ICsgKHRoaXMucGVyUGFnZSAqIHRoaXMucGFnZSkgOiByb3c7XG4gICAgICAgICAgICByb3cgPSBpc1JlbW90ZSA/IHJvdyAtIHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4IDogcm93O1xuICAgICAgICAgICAgaWYgKCFzb3VyY2Vbcm93XSB8fCBzb3VyY2Vbcm93XS5kZXRhaWxzRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gQXJyYXkuZnJvbShzZXQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlYWNoIG9mIHRlbXApIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJyYXkgPSB0aGlzLmdldFNlbGVjdGFibGVDb2x1bW5zQXQoZWFjaCk7XG4gICAgICAgICAgICAgICAgY29sdW1uc0FycmF5LmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBoZWFkZXJzID8gY29sLmhlYWRlciB8fCBjb2wuZmllbGQgOiBjb2wuZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dEYXRhID0gc291cmNlW3Jvd10uZ2hvc3RSZWNvcmQgPyBzb3VyY2Vbcm93XS5yZWNvcmRSZWYgOiBzb3VyY2Vbcm93XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZU5lc3RlZFBhdGgocm93RGF0YSwgY29sLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcih2YWx1ZSwgcm93RGF0YSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IHJlY29yZFtrZXldLnRvU3RyaW5nKCkuY29uY2F0KCdyZWNvcmRSb3ctJyArIHJvdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhjb2x1bW5EYXRhWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGM6IGFueSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93TnVtYmVyID0gK2Muc3BsaXQoJ3JlY29yZFJvdy0nKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjLnNwbGl0KCdyZWNvcmRSb3ctJylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRPYmogPSBPYmplY3QuYXNzaWduKHNlbGVjdGVkRGF0YVtyb3dOdW1iZXJdLCByZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW3Jvd051bWJlcl0gPSBtZXJnZWRPYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGEucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKHNlbGVjdGVkRGF0YSk7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKGtleXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXNBbmREYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRTZWxlY3RhYmxlQ29sdW1uc0F0KGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVMYXlvdXRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5jb2x1bW5MYXlvdXQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgY29sTGF5b3V0ID0gdmlzaWJsZUxheW91dENvbHVtbnNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIGNvbExheW91dCA/IGNvbExheW91dC5jaGlsZHJlbi50b0FycmF5KCkgOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXApXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFt2aXNpYmxlQ29sdW1uc1tpbmRleF1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3REYXRhRnJvbUNvbHVtbnNTZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpOiBhbnlbXSB7XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRhID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2Ygc291cmNlKSB7XG4gICAgICAgICAgICBzZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVycyA/IGNvbC5oZWFkZXIgfHwgY29sLmZpZWxkIDogY29sLmZpZWxkO1xuICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcihkYXRhW2NvbC5maWVsZF0sIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgIDogZGF0YVtjb2wuZmllbGRdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YS5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaW5pdFBpbm5pbmcoKSB7XG4gICAgICAgIGNvbnN0IHBpbm5lZENvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgdW5waW5uZWRDb2x1bW5zID0gW107XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICAvLyBXaGVuIGEgY29sdW1uIGlzIGEgZ3JvdXAgb3IgaXMgaW5zaWRlIGEgZ3JvdXAsIHBpbiBhbGwgcmVsYXRlZC5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGNvbC5wYXJlbnQucGlubmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBjb2wuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5waW5uZWQgPSB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGV4Y2VlZCB1bnBpbm5lZCBhcmVhIG1pbiB3aWR0aCBhbmQgZ2V0IHBpbm5lZCBhbmQgdW5waW5uZWQgY29sIGNvbGxlY3Rpb25zLlxuICAgICAgICAvLyBXZSB0YWtlIGludG8gYWNjb3VudCB0b3AgbGV2ZWwgY29sdW1ucyAodG9wIGxldmVsIGdyb3VwcyBhbmQgbm9uIGdyb3VwcykuXG4gICAgICAgIC8vIElmIHRvcCBsZXZlbCBpcyB1bnBpbm5lZCB0aGUgcGlubmluZyBoYW5kbGVzIGFsbCBjaGlsZHJlbiB0byBiZSB1bnBpbm5lZCBhcyB3ZWxsLlxuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIHBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucGlubmVkICYmIGNvbHVtbi5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnRvcExldmVsUGFyZW50LnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucGlubmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHVucGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1bnBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXNzaWduIHRoZSBhcHBsaWNhcGxlIGNvbGxlY3Rpb25zLlxuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gcGlubmVkQ29sdW1ucztcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gdW5waW5uZWRDb2x1bW5zO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvKHJvdzogYW55IHwgbnVtYmVyLCBjb2x1bW46IGFueSB8IG51bWJlciwgaW5Db2xsZWN0aW9uID0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEpOiB2b2lkIHtcbiAgICAgICAgbGV0IGRlbGF5U2Nyb2xsaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMucGFnaW5nICYmIHR5cGVvZiAocm93KSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gaW5Db2xsZWN0aW9uLmluZGV4T2Yocm93KTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKHJvd0luZGV4IC8gdGhpcy5wZXJQYWdlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgICAgICAgICAgIGRlbGF5U2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlbGF5U2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uRGF0YUNoYW5nZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiAocm93KSA9PT0gJ251bWJlcicgPyByb3cgOiB0aGlzLnVucGlubmVkRGF0YVZpZXcuaW5kZXhPZihyb3cpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICB0eXBlb2YgKHJvdykgPT09ICdudW1iZXInID8gcm93IDogdGhpcy51bnBpbm5lZERhdGFWaWV3LmluZGV4T2Yocm93KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjcm9sbFRvSG9yaXpvbnRhbGx5KGNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxUb0hvcml6b250YWxseShjb2x1bW46IGFueSB8IG51bWJlcikge1xuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSB0eXBlb2YgY29sdW1uID09PSAnbnVtYmVyJyA/IGNvbHVtbiA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbikudmlzaWJsZUluZGV4O1xuICAgICAgICBjb25zdCBzY3JvbGxSb3cgPSB0aGlzLnJvd0xpc3QuZmluZChyID0+IHIudmlydERpclJvdyk7XG4gICAgICAgIGNvbnN0IHZpcnREaXIgPSBzY3JvbGxSb3cgPyBzY3JvbGxSb3cudmlydERpclJvdyA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzUGlubmluZ1RvU3RhcnQgJiYgdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID49IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCAtPSB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsRGlyZWN0aXZlKGRpcmVjdGl2ZTogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4sIGdvYWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZS5zY3JvbGxUbyhnb2FsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbHVtbldpZHRoU3VtKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBjb2xTdW0gPSAwO1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpIDogdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIGNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgY29sU3VtICs9IHBhcnNlSW50KChpdGVtLmNhbGNXaWR0aCB8fCBpdGVtLmRlZmF1bHRXaWR0aCksIDEwKSB8fCBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY29sU3VtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbFN1bSArPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgcmV0dXJuIGNvbFN1bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpeSBjaGFuZ2VzLCByZXNldCBjYWNoZSBhbmQgcG9wdWxhdGVWaXNpYmxlSW5kZXhlcy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jb2x1bW5zUmVvcmRlcmVkKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LCB0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoeCA9PiB4LmNvbHVtbkxheW91dCkuZm9yRWFjaCh4ID0+IHgucG9wdWxhdGVWaXNpYmxlSW5kZXhlcygpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZnRlciByZW9yZGVyaW5nIGlzIGRvbmUgcmVzZXQgY2FjaGVkIGNvbHVtbiBjb2xsZWN0aW9ucy5cbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIGNvbHVtbi5yZXNldENhY2hlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FwcGx5V2lkdGhIb3N0QmluZGluZygpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5fd2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IHRoaXMuY2FsY1dpZHRoO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCArPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aWR0aCA9IGN1cnJlbnRXaWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faG9zdFdpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVydGljYWxTY3JvbGxIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIub25TY3JvbGwoZXZlbnQpO1xuICAgICAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9ucyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIub25DaHVua0xvYWQuZW1pdCh0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbCh0aGlzLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmhpZGVPdmVybGF5cygpO1xuICAgICAgICB0aGlzLmFjdGlvblN0cmlwPy5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvblN0cmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0cmlwLmNvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiAndmVydGljYWwnLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbjogdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQb3NpdGlvblxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uU2Nyb2xsLmVtaXQoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBob3Jpem9udGFsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLm9uSFNjcm9sbChzY3JvbGxMZWZ0KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcy5mb3JFYWNoKHZmb3IgPT4gdmZvci5vbkhTY3JvbGwoc2Nyb2xsTGVmdCkpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRWaXJ0RGlyLm9uQ2h1bmtMb2FkLmVtaXQodGhpcy5oZWFkZXJDb250YWluZXIuc3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0geyBkaXJlY3Rpb246ICdob3Jpem9udGFsJywgZXZlbnQsIHNjcm9sbFBvc2l0aW9uOiB0aGlzLmhlYWRlckNvbnRhaW5lci5zY3JvbGxQb3NpdGlvbiB9O1xuICAgICAgICB0aGlzLm9uU2Nyb2xsLmVtaXQoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCA9IC0xLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3cgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmZpbmQociA9PiByLmluZGV4ID09PSByb3dJbmRleCk7XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIub25EYXRhQ2hhbmdlZC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5maW5kKHIgPT4gci5pbmRleCA9PT0gcm93SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYkFyZ3MgPSB0aGlzLmdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjYihjYkFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlld1tyb3dJbmRleF0uZGV0YWlsc0RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uc2V0QWN0aXZlTm9kZSh7IHJvdzogcm93SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGNiKGFyZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCkge1xuICAgICAgICBsZXQgdGFyZ2V0VHlwZTogR3JpZEtleWRvd25UYXJnZXRUeXBlOyBsZXQgdGFyZ2V0O1xuICAgICAgICBzd2l0Y2ggKHJvdy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAnaWd4LWdyaWQtZ3JvdXBieS1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnZ3JvdXBSb3cnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvdztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lneC1ncmlkLXN1bW1hcnktcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ3N1bW1hcnlDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgcm93LnN1bW1hcnlDZWxscy5maW5kKGMgPT4gYy52aXNpYmxlQ29sdW1uSW5kZXggPT09IHZpc2libGVDb2xJbmRleCkgOiByb3cuc3VtbWFyeUNlbGxzLmZpcnN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaWd4LWNoaWxkLWdyaWQtcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2hpZXJhcmNoaWNhbFJvdyc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm93O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2RhdGFDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID8gcm93LmNlbGxzLmZpbmQoYyA9PiBjLnZpc2libGVDb2x1bW5JbmRleCA9PT0gdmlzaWJsZUNvbEluZGV4KSA6IHJvdy5jZWxscy5maXJzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0YXJnZXRUeXBlLCB0YXJnZXQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5leHREYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4LCBwcmV2aW91cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSb3dJbmRleCA8IDAgfHwgKGN1cnJlbnRSb3dJbmRleCA9PT0gMCAmJiBwcmV2aW91cykgfHwgKGN1cnJlbnRSb3dJbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAtIDEgJiYgIXByZXZpb3VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSb3dJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIG5leHQvcHJldiByZWNvcmQgdGhhdCBpcyBlZGl0YWJsZS5cbiAgICAgICAgY29uc3QgbmV4dFJvd0luZGV4ID0gcHJldmlvdXMgPyB0aGlzLmZpbmRQcmV2RWRpdGFibGVEYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4KSA6XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmZpbmRJbmRleCgocmVjLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICBpbmRleCA+IGN1cnJlbnRSb3dJbmRleCAmJiB0aGlzLmlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChpbmRleCkpO1xuICAgICAgICByZXR1cm4gbmV4dFJvd0luZGV4ICE9PSAtMSA/IG5leHRSb3dJbmRleCA6IGN1cnJlbnRSb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBlZGl0YWJsZSByb3cgaW5kZXggb3IgLTEgaWYgbm8gc3VjaCByb3cgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3VycmVudEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlZGl0YWJsZSByZWNvcmQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kUHJldkVkaXRhYmxlRGF0YVJvd0luZGV4KGN1cnJlbnRJbmRleCk6IG51bWJlciB7XG4gICAgICAgIGxldCBpID0gdGhpcy5kYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIGlmIChpIDwgY3VycmVudEluZGV4ICYmIHRoaXMuaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgZGF0YSB2aWV3IGluZGV4IGlzIGEgYW4gZWRpdGFibGUgZGF0YSByZWNvcmQuXG4gICAgICogSWYgcmVjb3JkIGlzIGdyb3VwIHJlYywgc3VtbWFyeSByZWMsIGNoaWxkIHJlYywgZ2hvc3QgcmVjLiBldGMuIGl0IGlzIG5vdCBlZGl0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhVmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGF0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpIHtcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5kYXRhVmlld1tkYXRhVmlld0luZGV4XTtcbiAgICAgICAgcmV0dXJuICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEgJiZcbiAgICAgICAgICAgICF0aGlzLmlzR2hvc3RSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHJlY29yZCBhdCB0aGUgc3BlY2lmaWVkIGRhdGEgdmlldyBpbmRleCBpcyBhIGdob3N0LlxuICAgICAqIElmIHJlY29yZCBpcyBwaW5uZWQgYnV0IGlzIG5vdCBpbiBwaW5uZWQgYXJlYSB0aGVuIGl0IGlzIGEgZ2hvc3QgcmVjb3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFWaWV3SW5kZXggVGhlIGluZGV4IG9mIHRoYXQgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0dob3N0UmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KSB7XG4gICAgICAgIGNvbnN0IGlzUGlubmVkID0gdGhpcy5pc1JlY29yZFBpbm5lZCh0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdKTtcbiAgICAgICAgY29uc3QgaXNJblBpbm5lZEFyZWEgPSB0aGlzLmlzUmVjb3JkUGlubmVkQnlWaWV3SW5kZXgoZGF0YVZpZXdJbmRleCk7XG4gICAgICAgIHJldHVybiBpc1Bpbm5lZCAmJiAhaXNJblBpbm5lZEFyZWE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkUG9zaXRpb24ocm93SW5kZXgsIGNvbEluZGV4KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwICYmICFjb2wuaGlkZGVuKS5sZW5ndGg7XG4gICAgICAgIGlmIChyb3dzIDwgMSB8fCBjb2xzIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3dJbmRleCA+IC0xICYmIHJvd0luZGV4IDwgdGhpcy5kYXRhVmlldy5sZW5ndGggJiZcbiAgICAgICAgICAgIGNvbEluZGV4ID4gLSAxICYmIGNvbEluZGV4IDw9IE1hdGgubWF4KC4uLnRoaXMudmlzaWJsZUNvbHVtbnMubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZCh0ZXh0OiBzdHJpbmcsIGluY3JlbWVudDogbnVtYmVyLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4sIHNjcm9sbD86IGJvb2xlYW4sIGVuZEVkaXQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRFZGl0KSB7XG4gICAgICAgICAgICB0aGlzLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCA9IGNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2hSZXNvbHZlZCA9IGV4YWN0TWF0Y2ggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGxldCByZWJ1aWxkQ2FjaGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0ICE9PSB0ZXh0IHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUgIT09IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoICE9PSBleGFjdE1hdGNoUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoVGV4dDogdGV4dCxcbiAgICAgICAgICAgICAgICBhY3RpdmVNYXRjaEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBleGFjdE1hdGNoOiBleGFjdE1hdGNoUmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZWJ1aWxkQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ICs9IGluY3JlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWJ1aWxkQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMucm93TGlzdC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmhpZ2hsaWdodFRleHQodGV4dCwgY2FzZVNlbnNpdGl2ZVJlc29sdmVkLCBleGFjdE1hdGNoUmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkTWF0Y2hDYWNoZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA+PSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5mbyA9IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGVbdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7IC4uLnRoaXMubGFzdFNlYXJjaEluZm8gfTtcblxuICAgICAgICAgICAgaWYgKHNjcm9sbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKG1hdGNoSW5mby5yb3csIG1hdGNoSW5mby5jb2x1bW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLnNldEFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBtYXRjaEluZm8uY29sdW1uLFxuICAgICAgICAgICAgICAgIHJvdzogbWF0Y2hJbmZvLnJvdyxcbiAgICAgICAgICAgICAgICBpbmRleDogbWF0Y2hJbmZvLmluZGV4LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtYXRjaEluZm8ubWV0YWRhdGEsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5jbGVhckFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYnVpbGRNYXRjaENhY2hlKCkge1xuICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlID0gW107XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHRoaXMubGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IHRoaXMubGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaDtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IGNhc2VTZW5zaXRpdmUgPyB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQgOiB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICBjb25zdCBjb2x1bW5JdGVtcyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5jb2x1bW5Hcm91cCkuc29ydCgoYzEsIGMyKSA9PiBjMS52aXNpYmxlSW5kZXggLSBjMi52aXNpYmxlSW5kZXgpO1xuICAgICAgICBkYXRhLmZvckVhY2goKGRhdGFSb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICBjb2x1bW5JdGVtcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlwZUFyZ3MgPSB0aGlzLmdldENvbHVtbkJ5TmFtZShjLmZpZWxkKS5waXBlQXJncztcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGMuZm9ybWF0dGVyID8gYy5mb3JtYXR0ZXIocmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCksIGRhdGFSb3cpIDpcbiAgICAgICAgICAgICAgICAgICAgYy5kYXRhVHlwZSA9PT0gJ251bWJlcicgPyB0aGlzLmRlY2ltYWxQaXBlLnRyYW5zZm9ybShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVBcmdzLmRpZ2l0c0luZm8sIHRoaXMubG9jYWxlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmRhdGFUeXBlID09PSAnZGF0ZScgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlQXJncy5mb3JtYXQsIHBpcGVBcmdzLnRpbWV6b25lLCB0aGlzLmxvY2FsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIGMuc2VhcmNoYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoVmFsdWUgPSBjYXNlU2Vuc2l0aXZlID8gU3RyaW5nKHZhbHVlKSA6IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFZhbHVlID09PSBzZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnNldCgncGlubmVkJywgdGhpcy5pc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IGRhdGFSb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VyZW5jZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hJbmRleCA9IHNlYXJjaFZhbHVlLmluZGV4T2Yoc2VhcmNoVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZWFyY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KCdwaW5uZWQnLCB0aGlzLmlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZGF0YVJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogb2NjdXJlbmNlSW5kZXgrKyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlLnN1YnN0cmluZyhzZWFyY2hJbmRleCArIHNlYXJjaFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmRleCA9IHNlYXJjaFZhbHVlLmluZGV4T2Yoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maWd1cmVSb3dFZGl0aW5nT3ZlcmxheShyb3dJRDogYW55LCB1c2VPdXRlciA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBzZXR0aW5ncyA9IHRoaXMucm93RWRpdFNldHRpbmdzO1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZCh0aGlzLnJvd0VkaXRpbmdPdmVybGF5Lm92ZXJsYXlJZCk7XG4gICAgICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IG92ZXJsYXkuc2V0dGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3Mub3V0bGV0ID0gdXNlT3V0ZXIgPyB0aGlzLnBhcmVudFJvd091dGxldERpcmVjdGl2ZSA6IHRoaXMucm93T3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LnNldHRpbmdzLmNvbnRhaW5lciA9IHRoaXMudGJvZHkubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgcGlubmVkID0gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpICE9PSAtMTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Um93ID0gIXBpbm5lZCA/IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2tleShyb3dJRCkgOiB0aGlzLnBpbm5lZFJvd3MuZmluZCh4ID0+IHgucm93SUQgPT09IHJvd0lEKTtcbiAgICAgICAgaWYgKCF0YXJnZXRSb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy50YXJnZXQgPSB0YXJnZXRSb3cuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnRvZ2dsZVJvd0VkaXRpbmdPdmVybGF5KHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJvd0VkaXRpbmdXaGVlbEhhbmRsZXIoZXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsTmV4dCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQcmV2KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
6487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZJLE9BQU8sRUFHSCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxlQUFlLEVBQ2YsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxRQUFRLEVBRVIsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTywwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJB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WyJpbXBvcnQgeyBET0NVTUVOVCwgRGF0ZVBpcGUsIERlY2ltYWxQaXBlLCBnZXRMb2NhbGVOdW1iZXJGb3JtYXQsIE51bWJlckZvcm1hdFN0eWxlLCBDdXJyZW5jeVBpcGUsIFBlcmNlbnRQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBJdGVyYWJsZUNoYW5nZVJlY29yZCxcbiAgICBJdGVyYWJsZURpZmZlcnMsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgSW5qZWN0aW9uVG9rZW4sXG4gICAgT3B0aW9uYWwsXG4gICAgRG9DaGVjayxcbiAgICBEaXJlY3RpdmUsXG4gICAgTE9DQUxFX0lELFxuICAgIEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwnO1xuaW1wb3J0ICdpZ25pdGV1aS10cmlhbC13YXRlcm1hcmsnO1xuaW1wb3J0IHsgU3ViamVjdCwgcGlwZSwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIGZpcnN0LCBmaWx0ZXIsIHRocm90dGxlVGltZSwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lQXJyYXksIGZsYXR0ZW4sIG1lcmdlT2JqZWN0cywgaXNJRSwgY29tcGFyZU1hcHMsIHJlc29sdmVOZXN0ZWRQYXRoLCBpc09iamVjdCwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJR3JvdXBCeVJlY29yZCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGJ5LXJlY29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uLCBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUZvck9mRGF0YUNoYW5naW5nRXZlbnRBcmdzLCBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFRleHRIaWdobGlnaHREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RleHQtaGlnaGxpZ2h0L3RleHQtaGlnaGxpZ2h0LmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIEFic29sdXRlU2Nyb2xsU3RyYXRlZ3ksXG4gICAgSG9yaXpvbnRhbEFsaWdubWVudCxcbiAgICBWZXJ0aWNhbEFsaWdubWVudCxcbiAgICBJZ3hPdmVybGF5U2VydmljZSxcbiAgICBPdmVybGF5U2V0dGluZ3MsXG4gICAgUG9zaXRpb25TZXR0aW5ncyxcbiAgICBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5LFxuICAgIENvbnRhaW5lclBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgU3RhdGVVcGRhdGVFdmVudCxcbiAgICBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luXG59IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVN1bW1hcnlFeHByZXNzaW9uIH0gZnJvbSAnLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5JztcbmltcG9ydCB7IFJvd0VkaXRQb3NpdGlvblN0cmF0ZWd5LCBJUGlubmluZ0NvbmZpZyB9IGZyb20gJy4vZ3JpZC5jb21tb24nO1xuaW1wb3J0IHsgSWd4R3JpZFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXIvZ3JpZC10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dEaXJlY3RpdmUgfSBmcm9tICcuL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vaGVhZGVycy9ncmlkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgSWd4VG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZVxufSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uU2VydmljZSwgU3RhdGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7XG4gICAgSWd4Um93RWRpdFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlLFxuICAgIElneFJvd0VkaXRUZXh0RGlyZWN0aXZlLFxuICAgIElneFJvd0VkaXRBY3Rpb25zRGlyZWN0aXZlXG59IGZyb20gJy4vZ3JpZC5yb3dFZGl0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hHcmlkTmF2aWdhdGlvblNlcnZpY2UsIElBY3RpdmVOb2RlIH0gZnJvbSAnLi9ncmlkLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQgeyBJZ3hHcmlkUm93Q29tcG9uZW50IH0gZnJvbSAnLi9ncmlkL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4RmlsdGVyaW5nU2VydmljZSB9IGZyb20gJy4vZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFdhdGNoQ2hhbmdlcyB9IGZyb20gJy4vd2F0Y2gtY2hhbmdlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElHcmlkUmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL2dyaWQtcmVzb3VyY2VzJztcbmltcG9ydCB7IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4vc3VtbWFyaWVzL2dyaWQtc3VtbWFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSBmcm9tICcuL3N1bW1hcmllcy9zdW1tYXJ5LXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICBHcmlkU2VsZWN0aW9uUmFuZ2UsXG4gICAgSWd4R3JpZENSVURTZXJ2aWNlLFxuICAgIElneFJvdyxcbiAgICBJZ3hDZWxsXG59IGZyb20gJy4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IERyYWdTY3JvbGxEaXJlY3Rpb24gfSBmcm9tICcuL3NlbGVjdGlvbi9kcmFnLXNlbGVjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSUNhY2hlZFZpZXdMb2FkZWRFdmVudEFyZ3MsIElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90ZW1wbGF0ZS1vdXRsZXQvdGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudCB9IGZyb20gJy4vcmVzaXppbmcvcmVzaXplci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2Jhc2UvZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY3N2L2NoYXItc2VwYXJhdGVkLXZhbHVlLWRhdGEnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemluZy9yZXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdTdHJhdGVneSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHtcbiAgICBJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLFxuICAgIElneEhlYWRlckV4cGFuZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4SGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JEaXJlY3RpdmUsIElneEV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlXG59IGZyb20gJy4vZ3JpZC9ncmlkLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHtcbiAgICBHcmlkS2V5ZG93blRhcmdldFR5cGUsXG4gICAgR3JpZFNlbGVjdGlvbk1vZGUsXG4gICAgR3JpZFN1bW1hcnlQb3NpdGlvbixcbiAgICBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSxcbiAgICBGaWx0ZXJNb2RlLFxuICAgIENvbHVtblBpbm5pbmdQb3NpdGlvbixcbiAgICBSb3dQaW5uaW5nUG9zaXRpb24sXG4gICAgR3JpZFBhZ2luZ01vZGVcbn0gZnJvbSAnLi9jb21tb24vZW51bXMnO1xuaW1wb3J0IHtcbiAgICBJR3JpZENlbGxFdmVudEFyZ3MsXG4gICAgSVJvd1NlbGVjdGlvbkV2ZW50QXJncyxcbiAgICBJUGluQ29sdW1uRXZlbnRBcmdzLFxuICAgIElHcmlkRWRpdEV2ZW50QXJncyxcbiAgICBJUGFnZUV2ZW50QXJncyxcbiAgICBJUm93RGF0YUV2ZW50QXJncyxcbiAgICBJQ29sdW1uUmVzaXplRXZlbnRBcmdzLFxuICAgIElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nRXZlbnRBcmdzLFxuICAgIElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3MsXG4gICAgSUdyaWRLZXlkb3duRXZlbnRBcmdzLFxuICAgIElSb3dEcmFnU3RhcnRFdmVudEFyZ3MsXG4gICAgSVJvd0RyYWdFbmRFdmVudEFyZ3MsXG4gICAgSUdyaWRDbGlwYm9hcmRFdmVudCxcbiAgICBJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3MsXG4gICAgSVNlYXJjaEluZm8sXG4gICAgSUNlbGxQb3NpdGlvbixcbiAgICBJUm93VG9nZ2xlRXZlbnRBcmdzLFxuICAgIElDb2x1bW5TZWxlY3Rpb25FdmVudEFyZ3MsXG4gICAgSVBpblJvd0V2ZW50QXJncyxcbiAgICBJR3JpZFNjcm9sbEV2ZW50QXJncyxcbiAgICBJR3JpZEVkaXREb25lRXZlbnRBcmdzLFxuICAgIElBY3RpdmVOb2RlQ2hhbmdlRXZlbnRBcmdzLFxuICAgIElTb3J0aW5nRXZlbnRBcmdzLFxuICAgIElGaWx0ZXJpbmdFdmVudEFyZ3MsXG4gICAgSUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzLFxuICAgIElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmdFdmVudEFyZ3MsXG4gICAgSVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzXG59IGZyb20gJy4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2FkdmFuY2VkLWZpbHRlcmluZy9hZHZhbmNlZC1maWx0ZXJpbmctZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERyb3BQb3NpdGlvbiB9IGZyb20gJy4vbW92aW5nL21vdmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZSwgSWd4Um93U2VsZWN0b3JEaXJlY3RpdmUgfSBmcm9tICcuL3NlbGVjdGlvbi9yb3ctc2VsZWN0b3JzJztcbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW5zL2NvbHVtbi1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUdyaWRTb3J0aW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hSb3dEcmFnR2hvc3REaXJlY3RpdmUsIElneERyYWdJbmRpY2F0b3JJY29uRGlyZWN0aXZlIH0gZnJvbSAnLi9yb3ctZHJhZy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9ncmlkLmV4Y2VsLXN0eWxlLWZpbHRlcmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U25hY2tiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zbmFja2Jhci9zbmFja2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBJZ3hBY3Rpb25TdHJpcENvbXBvbmVudCB9IGZyb20gJy4uL2FjdGlvbi1zdHJpcC9hY3Rpb24tc3RyaXAuY29tcG9uZW50JztcbmltcG9ydCB7IERlcHJlY2F0ZVByb3BlcnR5IH0gZnJvbSAnLi4vY29yZS9kZXByZWNhdGVEZWNvcmF0b3JzJztcbmxldCBGQUtFX1JPV19JRCA9IC0xO1xuXG5jb25zdCBNSU5JTVVNX0NPTFVNTl9XSURUSCA9IDEzNjtcbmNvbnN0IEZJTFRFUl9ST1dfSEVJR0hUID0gNTA7XG4vLyBCeSBkZWZhdWx0IHJvdyBlZGl0aW5nIG92ZXJsYXkgb3V0bGV0IGlzIGluc2lkZSBncmlkIGJvZHkgc28gdGhhdCBvdmVybGF5IGlzIGhpZGRlbiBiZWxvdyBncmlkIGhlYWRlciB3aGVuIHNjcm9sbGluZy5cbi8vIEluIGNhc2VzIHdoZW4gZ3JpZCBoYXMgMS0yIHJvd3MgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIGluIGdyaWQgYm9keSBhbmQgcm93IGVkaXRpbmcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd24gYWJvdmUgaGVhZGVyLlxuLy8gRGVmYXVsdCByb3cgZWRpdGluZyBvdmVybGF5IGhlaWdodCBpcyBoaWdoZXIgdGhlbiByb3cgaGVpZ2h0IHRoYXQgaXMgd2h5IHRoZSBjYXNlIGlzIHZhbGlkIGFsc28gZm9yIHJvdyB3aXRoIDIgcm93cy5cbi8vIE1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gaXMgbm90IHBvc3NpYmxlLCBjYXVzZSByb3cgZWRpdGluZyBvdmVybGF5IGlzIHN0aWxsIG5vdCBzaG93biBhbmQgd2UgZG9uJ3Qga25vdyBpdHMgaGVpZ2h0LFxuLy8gYnV0IGluIHRoZSBzYW1lIHRpbWUgd2UgbmVlZCB0byBzZXQgcm93IGVkaXRpbmcgb3ZlcmxheSBvdXRsZXQgYmVmb3JlIG9wZW5pbmcgdGhlIG92ZXJsYXkgaXRzZWxmLlxuY29uc3QgTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCA9IDI7XG5cbmV4cG9ydCBjb25zdCBJZ3hHcmlkVHJhbnNhY3Rpb24gPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignSWd4R3JpZFRyYW5zYWN0aW9uJyk7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElneEdyaWRCYXNlRGlyZWN0aXZlIGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIGltcGxlbWVudHMgR3JpZFR5cGUsXG4gICAgT25Jbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGlzcGxheSB0aW1lIGZvciB0aGUgcm93IGFkZGluZyBzbmFja2JhciBub3RpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgNjAwMG1zLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNuYWNrYmFyRGlzcGxheVRpbWUgPSA2MDAwO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIHRoZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gV2hlbiBzZXQgdG8gdHJ1ZSwgaXQgd2lsbCBvdmVycmlkZSBhbGwgY29sdW1ucyBkZWNsYXJlZCB0aHJvdWdoIGNvZGUgb3IgaW4gbWFya3VwLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvR2VuZXJhdGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZF09XCInaWd4LWdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZFRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVtcHR5R3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIGZvciBhZGRpbmcgcm93IFVJIHdoZW4gZ3JpZCBpcyBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFthZGRSb3dFbXB0eVRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZFJvd0VtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSBjdXN0b20gdGVtcGxhdGUgd2hlbiBsb2FkaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZF09XCInaWd4LWdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2xvYWRpbmdHcmlkVGVtcGxhdGVdPVwibXlUZW1wbGF0ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbG9hZGluZ0dyaWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBjb3B5IGJlaGF2aW9yIG9mIHRoZSBncmlkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNsaXBib2FyZE9wdGlvbnMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSBjb3B5IGJlaGF2aW9yXG4gICAgICAgICAqL1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogSW5jbHVkZSB0aGUgY29sdW1ucyBoZWFkZXJzIGluIHRoZSBjbGlwYm9hcmQgb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29weUhlYWRlcnM6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcHBseSB0aGUgY29sdW1ucyBmb3JtYXR0ZXJzIChpZiBhbnkpIG9uIHRoZSBkYXRhIGluIHRoZSBjbGlwYm9hcmQgb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29weUZvcm1hdHRlcnM6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2VwYXJhdG9yIHVzZWQgZm9yIGZvcm1hdHRpbmcgdGhlIGNvcHkgb3V0cHV0LiBEZWZhdWx0cyB0byBgXFx0YC5cbiAgICAgICAgICovXG4gICAgICAgIHNlcGFyYXRvcjogJ1xcdCdcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgdHJlZSBvZiB0aGUgY29sdW1uIGZvciB3aGljaCBmaWx0ZXJpbmcgd2FzIHBlcmZvcm1lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgICAgKGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSk9XCJmaWx0ZXJpbmdFeHByVHJlZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBhZHZhbmNlZCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgdHJlZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgKGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlKT1cImFkdmFuY2VkRmlsdGVyaW5nRXhwclRyZWVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGdyaWQgaXMgc2Nyb2xsZWQgaG9yaXpvbnRhbGx5L3ZlcnRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgICAgKG9uU2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRTY3JvbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHRoZSBjdXJyZW50IHBhZ2UgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgICogICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBgcGVyUGFnZWAgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdyaWQgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAocGVyUGFnZUNoYW5nZSk9XCJvblBlclBhZ2VDaGFuZ2UoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvblBlclBhZ2VDaGFuZ2UocGVyUGFnZTogbnVtYmVyKSB7XG4gICAgICogICB0aGlzLnBlclBhZ2UgPSBwZXJQYWdlO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGVyUGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIGBuZy10ZW1wbGF0ZWAgZm9yIHRoZSBwYWdpbmF0aW9uIFVJIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtwYWdpbmddPVwidHJ1ZVwiIFtteVRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbaGVpZ2h0XT1cIiczMDVweCdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHBhZ2luYXRpb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjbGFzcyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdHlsaW5nIGNsYXNzZXMgYXBwbGllZCB0byBhbGwgZXZlbiBgSWd4R3JpZFJvd0NvbXBvbmVudGBzIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbZXZlblJvd0NTU109XCInaWd4LWdyaWQtLW15LWV2ZW4tY2xhc3MnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBldmVuUm93Q1NTID0gJ2lneC1ncmlkX190ci0tZXZlbic7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN0eWxpbmcgY2xhc3NlcyBhcHBsaWVkIHRvIGFsbCBvZGQgYElneEdyaWRSb3dDb21wb25lbnRgcyBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2V2ZW5Sb3dDU1NdPVwiJ2lneC1ncmlkLS1teS1vZGQtY2xhc3MnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvZGRSb3dDU1MgPSAnaWd4LWdyaWRfX3RyLS1vZGQnO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcmltYXJ5S2V5O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgdW5pcXVlIHZhbHVlcyBzdHJhdGVneSB1c2VkIGJ5IHRoZSBFeGNlbCBTdHlsZSBGaWx0ZXJpbmdcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHJvdmlkZXMgYSBjYWxsYmFjayBmb3IgbG9hZGluZyB1bmlxdWUgY29sdW1uIHZhbHVlcyBvbiBkZW1hbmQuXG4gICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBwcm92aWRlZCwgdGhlIHVuaXF1ZSB2YWx1ZXMgaXQgZ2VuZXJhdGVzIHdpbGwgYmUgdXNlZCBieSB0aGUgRXhjZWwgU3R5bGUgRmlsdGVyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbZmlsdGVyTW9kZV09XCInZXhjZWxTdHlsZUZpbHRlcidcIiBbdW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3ldPVwiY29sdW1uVmFsdWVzU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVuaXF1ZUNvbHVtblZhbHVlc1N0cmF0ZWd5OiAoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsXG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgZG9uZTogKHZhbHVlczogYW55W10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIHsgcmVhZDogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBleGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50czogUXVlcnlMaXN0PElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQsIHsgcmVhZDogSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0pXG4gICAgcHVibGljIGhlYWRlckdyb3VwczogUXVlcnlMaXN0PElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYElneEdyaWRDZWxsQ29tcG9uZW50YCBpcyBjbGlja2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4R3JpZENlbGxDb21wb25lbnRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAob25DZWxsQ2xpY2spPVwib25DZWxsQ2xpY2soJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2VsbENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYElneEdyaWRDZWxsQ29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbENvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChvblNlbGVjdGlvbik9XCJvbkNlbGxTZWxlY3QoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiAgRW1pdHRlZCB3aGVuIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAob25Sb3dTZWxlY3Rpb25DaGFuZ2UpPVwib25DZWxsQ2xpY2tDaGFuZ2UoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUm93U2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93U2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEVtaXR0ZWQgd2hlbiBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAob25Db2x1bW5TZWxlY3Rpb25DaGFuZ2UpPVwib25Db2x1bW5TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29sdW1uU2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgYElneENvbHVtbkNvbXBvbmVudGAgaXMgcGlubmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjb2x1bW4gbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29sdW1uUGlubmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBwaW5uZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBpbmRleCB0aGF0IHRoZSBjb2x1bW4gaXMgaW5zZXJ0ZWQgYXQgbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGVudGVycyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdEVudGVyKT1cImVkaXRTdGFydCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXRFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgZXhpdHMgZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXRFeGl0KT1cImVkaXRFeGl0KCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdEV4aXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBoYXMgYmVlbiBlZGl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEV2ZW50IGlzIGZpcmVkIGFmdGVyIGVkaXRpbmcgaXMgY29tcGxldGVkLCB3aGVuIHRoZSBjZWxsIGlzIGV4aXRpbmcgZWRpdCBtb2RlLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdCk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY2VsbCBoYXMgYmVlbiBlZGl0ZWQgYW5kIGVkaXRpbmcgaGFzIGJlZW4gY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBleGl0aW5nIGVkaXQgbW9kZSBmb3IgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93IGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdCh0cnVlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyByb3dzIGR1cmluZyBlZGl0IG1vZGUsIHNlbGVjdGluZyBhbiB1bi1lZGl0YWJsZSBjZWxsIGluIHRoZSBlZGl0ZWQgcm93LFxuICAgICAqIHBlcmZvcm1pbmcgcGFnaW5nIG9wZXJhdGlvbiwgY29sdW1uIHJlc2l6aW5nLCBwaW5uaW5nLCBtb3Zpbmcgb3IgaGl0dGluZyBgRG9uZWBcbiAgICAgKiBidXR0b24gaW5zaWRlIG9mIHRoZSByb3dFZGl0aW5nT3ZlcmxheSwgb3IgaGl0dGluZyB0aGUgYEVudGVyYCBrZXkgd2hpbGUgZWRpdGluZyBhIGNlbGwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdERvbmUpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcm93IGVkaXRpbmcgaXMgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXRzIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KGZhbHNlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyBoaXR0aW5nIGBFc2NgIGtleSBkdXJpbmcgY2VsbCBlZGl0aW5nIGFuZCB3aGVuIGNsaWNrIG9uIHRoZSBgQ2FuY2VsYCBidXR0b25cbiAgICAgKiBpbiB0aGUgcm93IGVkaXRpbmcgb3ZlcmxheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbHVtbiBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW29uQ29sdW1uSW5pdF09XCJpbml0Q29sdW1ucygkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Db2x1bW5Jbml0ID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hDb2x1bW5Db21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBzb3J0aW5nIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJU29ydGluZ0V2ZW50QXJnc2Agb2JqZWN0LiBgc29ydGluZ0V4cHJlc3Npb25zYCBrZXkgaG9sZHMgdGhlIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChvblNvcnRpbmcpPVwic29ydGluZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHNvcnRpbmcgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChvblNvcnRpbmdEb25lKT1cInNvcnRpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblNvcnRpbmdEb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJU29ydGluZ0V4cHJlc3Npb24gfCBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJRmlsdGVyaW5nRXZlbnRBcmdzYCBvYmplY3QuIGBmaWx0ZXJpbmdFeHByZXNzaW9uc2Aga2V5IGhvbGRzIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBjb2x1bW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChmaWx0ZXJpbmcpPVwiZmlsdGVyaW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgVUkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyB0cmVlIG9mIHRoZSBjb2x1bW4gZm9yIHdoaWNoIGZpbHRlcmluZyB3YXMgcGVyZm9ybWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAob25GaWx0ZXJpbmdEb25lKT1cImZpbHRlcmluZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uRmlsdGVyaW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgcGFnaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBvYmplY3QgY29uc2lzdGluZyBvZiB0aGUgcHJldmlvdXMgYW5kIG5leHQgcGFnZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChvblBhZ2luZ0RvbmUpPVwicGFnaW5nRG9uZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25QYWdpbmdEb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJUGFnZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHJvdyBhZGRlZCB0aHJvdWdoIHRoZSBBUEkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGRhdGEgZm9yIHRoZSBuZXcgYElneEdyaWRSb3dDb21wb25lbnRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKG9uUm93QWRkZWQpPVwicm93QWRkZWQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGRlbGV0ZWQgdGhyb3VnaCBBUEkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElSb3dEYXRhRXZlbnRBcmdzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChvblJvd0RlbGV0ZWQpPVwicm93RGVsZXRlZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Sb3dEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY29sdW1uIGlzIHJlc2l6ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIG9iamVjdCdzIG9sZCBhbmQgbmV3IHdpZHRoLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAob25Db2x1bW5SZXNpemVkKT1cInJlc2l6aW5nKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5SZXNpemVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIHJpZ2h0IGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbENvbXBvbmVudGAgb2JqZWN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKG9uQ29udGV4dE1lbnUpPVwiY29udGV4dE1lbnUoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29udGV4dE1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgZG91YmxlIGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbENvbXBvbmVudGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAob25Eb3VibGVDbGljayk9XCJkYmxDbGljaygkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Eb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgY29sdW1uIHZpc2liaWxpdHkgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQXJnczogeyBjb2x1bW46IGFueSwgbmV3VmFsdWU6IGJvb2xlYW4gfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIChjb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmcpPVwidmlzaWJpbGl0eUNoYW5naW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNvbHVtbiB2aXNpYmlsaXR5IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFyZ3M6IHsgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIG5ld1ZhbHVlOiBib29sZWFuIH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiAob25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCk9XCJ2aXNpYmlsaXR5Q2hhbmdlZCgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNvbHVtbiBtb3Zpbmcgc3RhcnRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZlZCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKG9uQ29sdW1uTW92aW5nU3RhcnQpPVwibW92aW5nU3RhcnQoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29sdW1uTW92aW5nU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgZHVyaW5nIHRoZSBjb2x1bW4gbW92aW5nIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIGFuZCB0YXJnZXQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0cy4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIChvbkNvbHVtbk1vdmluZyk9XCJtb3ZpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29sdW1uTW92aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNvbHVtbiBtb3ZpbmcgZW5kcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIGFuZCB0YXJnZXQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiAob25Db2x1bW5Nb3ZpbmdFbmQpPVwibW92aW5nRW5kcygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Db2x1bW5Nb3ZpbmdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ga2V5ZG93biBpcyB0cmlnZ2VyZWQgb3ZlciBlbGVtZW50IGluc2lkZSBncmlkJ3MgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBvbmx5IGlmIHRoZSBrZXkgY29tYmluYXRpb24gaXMgc3VwcG9ydGVkIGluIHRoZSBncmlkLlxuICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IHR5cGUsIHRhcmdldCBvYmplY3QgYW5kIHRoZSBvcmlnaW5hbCBldmVudC4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgKG9uR3JpZEtleWRvd24pPVwiY3VzdG9tS2V5ZG93bigkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25HcmlkS2V5ZG93biA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRLZXlkb3duRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHN0YXJ0IGRyYWdnaW5nIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm4gdGhlIGRyYWdnZWQgcm93LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblJvd0RyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBkcm9wcGluZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJuIHRoZSBkcm9wcGVkIHJvdy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Sb3dEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RHJhZ0VuZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvcHkgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGaXJlZCBvbmx5IGlmIGNvcHkgYmVoYXZpb3IgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBbYGNsaXBib2FyZE9wdGlvbnNgXXtAbGluayBJZ3hHcmlkQmFzZURpcmVjdGl2ZSNjbGlwYm9hcmRPcHRpb25zfS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBvbkdyaWRDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENsaXBib2FyZEV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwYW5zaW9uU3RhdGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXA8YW55LCBib29sZWFuPj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgYSByb3cgZ2V0cyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChvblJvd1RvZ2dsZSk9XCJyb3dUb2dnbGUoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUm93VG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93VG9nZ2xlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBwaW5uZWQgc3RhdGUgb2YgYSByb3cgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJlbXBsb3llZURhdGFcIiAob25Sb3dQaW5uaW5nKT1cInJvd1BpbigkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25Sb3dQaW5uaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluUm93RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1taXRlZCB3aGVuIHRoZSBhY3RpdmUgbm9kZSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChhY3RpdmVOb2RlQ2hhbmdlKT1cImFjdGl2ZU5vZGVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFjdGl2ZU5vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElBY3RpdmVOb2RlQ2hhbmdlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc29ydGluZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChzb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UpPVwic29ydGluZ0V4cHJDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNvcnRpbmdFeHByZXNzaW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFeHByZXNzaW9uW10+KCk7XG5cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhbiBleHBvcnQgcHJvY2VzcyBpcyBpbml0aWF0ZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0b29sYmFyRXhwb3J0aW5nKGV2ZW50OiBJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCB0b29sYmFyRXhwb3J0aW5nID0gZXZlbnQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblRvb2xiYXJFeHBvcnRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkVG9vbGJhckV4cG9ydEV2ZW50QXJncz4oKTtcblxuICAgIC8qIEVuZCBvZiB0b29sYmFyIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi9cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBtYWtpbmcgYSByYW5nZSBzZWxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJhbmdlIHNlbGVjdGlvbiBjYW4gYmUgbWFkZSBlaXRoZXIgdGhyb3VnaCBkcmFnIHNlbGVjdGlvbiBvciB0aHJvdWdoIGtleWJvYXJkIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25SYW5nZVNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZFNlbGVjdGlvblJhbmdlPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgYWZ0ZXIgdGhlIG5nQWZ0ZXJWaWV3SW5pdCBob29rLiBBdCB0aGlzIHBvaW50IHRoZSBncmlkIGV4aXN0cyBpbiB0aGUgRE9NICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlbmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbG9jYWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgdGhlIGdyaWQncyBkYXRhIHZpZXcgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEgZGF0YSBvcGVyYXRpb24sIHJlYmluZGluZywgZXRjLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZGF0YUNoYW5naW5nKT0naGFuZGxlRGF0YUNoYW5naW5nRXZlbnQoKSc+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAgQE91dHB1dCgpXG4gICAgIHB1YmxpYyBkYXRhQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGdyaWQncyBkYXRhIHZpZXcgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEgZGF0YSBvcGVyYXRpb24sIHJlYmluZGluZywgZXRjLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZGF0YUNoYW5nZWQpPSdoYW5kbGVEYXRhQ2hhbmdlZEV2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4U25hY2tiYXJDb21wb25lbnQpXG4gICAgcHVibGljIGFkZFJvd1NuYWNrYmFyOiBJZ3hTbmFja2JhckNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudClcbiAgICBwdWJsaWMgcmVzaXplTGluZTogSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xvYWRpbmdPdmVybGF5JywgeyByZWFkOiBJZ3hUb2dnbGVEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nT3ZlcmxheTogSWd4VG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hMb2FkaW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGxvYWRpbmdPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q29sdW1uQ29tcG9uZW50LCB7IHJlYWQ6IElneENvbHVtbkNvbXBvbmVudCwgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgY29sdW1uTGlzdDogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4gPSBuZXcgUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4QWN0aW9uU3RyaXBDb21wb25lbnQpXG4gICAgcHVibGljIGFjdGlvblN0cmlwOiBJZ3hBY3Rpb25TdHJpcENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBleGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSByZWZlcmVuY2UgZm9yIHRoZSB0ZW1wbGF0ZSB3aGVuIHRoZSBmaWx0ZXJlZCBncmlkIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBlbXB0eVRlbXBhbHRlID0gdGhpcy5ncmlkLmVtcHR5R3JpZFRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5RmlsdGVyZWRHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGVtcHR5RmlsdGVyZWRHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBBIHRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgdGhlIHRlbXBsYXRlIHdoZW4gdGhlIGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGVtcHR5VGVtcGFsdGUgPSB0aGlzLmdyaWQuZW1wdHlHcmlkVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVtcHR5R3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBlbXB0eUdyaWREZWZhdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRMb2FkaW5nR3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nR3JpZERlZmF1bHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBwYXJlbnRWaXJ0RGlyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBoZWFkU2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8SWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgcm93U2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8SWd4Um93U2VsZWN0b3JEaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RHJhZ0dob3N0RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsSG9sZGVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbDogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NjcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHNjcjogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZm9vdGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHVibGljIGZvb3RlcjogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgaGVhZGVyQ29udGFpbmVyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyU2VsZWN0b3JDb250YWluZXInKVxuICAgIHB1YmxpYyBoZWFkZXJTZWxlY3RvckNvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyRHJhZ0NvbnRhaW5lcicpXG4gICAgcHVibGljIGhlYWRlckRyYWdDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlckdyb3VwQ29udGFpbmVyJylcbiAgICBwdWJsaWMgaGVhZGVyR3JvdXBDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbHRlcmluZ1JvdycsIHsgcmVhZDogSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBmaWx0ZXJpbmdSb3c6IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3RoZWFkUm93JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdGhlYWRSb3c6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Rib2R5JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdGJvZHk6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3BpbkNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBwaW5Db250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Rmb290JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdGZvb3Q6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneFJvd0VkaXRpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcm93RWRpdGluZ091dGxldERpcmVjdGl2ZTogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyB0bXBPdXRsZXRzOiBRdWVyeUxpc3Q8YW55PiA9IG5ldyBRdWVyeUxpc3Q8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RyYWdJbmRpY2F0b3JJY29uQmFzZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkcmFnSW5kaWNhdG9ySWNvbkJhc2U6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRlbXBsYXRlRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93RWRpdEN1c3RvbURpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0VGV4dERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRUZXh0RGlyZWN0aXZlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRBY3Rpb25zRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBleHBhbmQgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSByb3cgY29sbGFwc2UgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBleHBhbmQgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4SGVhZGVyRXhwYW5kSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckV4cGFuZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBjb2xsYXBzZSBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hIZWFkZXJDb2xsYXBzZUluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBoZWFkZXJDb2xsYXBzZUluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBleHBhbmQgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hEcmFnSW5kaWNhdG9ySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUpXG4gICAgcHVibGljIHJvd0VkaXRUYWJzREVGQVVMVDogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyByb3dFZGl0VGFic0NVU1RPTTogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncm93RWRpdGluZ092ZXJsYXknLCB7IHJlYWQ6IElneFRvZ2dsZURpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyByb3dFZGl0aW5nT3ZlcmxheTogSWd4VG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgaG9zdFJvbGUgPSAnZ3JpZCc7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEdyaWRUb29sYmFyQ29tcG9uZW50KVxuICAgIHB1YmxpYyB0b29sYmFyOiBRdWVyeUxpc3Q8SWd4R3JpZFRvb2xiYXJDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hGaWx0ZXJpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgX291dGxldERpcmVjdGl2ZTogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0Q29sbGFwc2VkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFU0ZIZWFkZXJJY29uJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRFU0ZIZWFkZXJJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdzdW1tYXJ5Um93JywgeyByZWFkOiBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50IH0pXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJ5Um93TGlzdDogUXVlcnlMaXN0PElneFN1bW1hcnlSb3dDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93JylcbiAgICBwcml2YXRlIF9yb3dMaXN0OiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdwaW5uZWRSb3cnKVxuICAgIHByaXZhdGUgX3Bpbm5lZFJvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Um93RGlyZWN0aXZlLCB7IHJlYWQ6IElneFJvd0RpcmVjdGl2ZSB9KVxuICAgIHByaXZhdGUgX2RhdGFSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlPj47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSUdyaWRSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSUdyaWRSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICBpZiAoIXRoaXMuX3Jlc291cmNlU3RyaW5ncykge1xuICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gQ3VycmVudFJlc291cmNlU3RyaW5ncy5HcmlkUmVzU3RyaW5ncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxBZGRNb2RlID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBsb2dpYyBvZiB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyBBTkQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZmlsdGVyaW5nTG9naWNdPVwiZmlsdGVyaW5nXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nTG9naWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJpbmdMb2dpYyh2YWx1ZTogRmlsdGVyaW5nTG9naWMpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBmaWx0ZXJpbmcgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFsoZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKV09XCJtb2RlbC5maWx0ZXJpbmdFeHByZXNzaW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGJpbmRpbmcuXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9ICh2YWx1ZSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZhbC5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoISh2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLkFuZCwgdmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XS5maWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBuZXdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaCh2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XSA9IG5ld0V4cHJlc3Npb25zVHJlZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlLnR5cGUgPSBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVUeXBlLlJlZ3VsYXI7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmluZ1BpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVFbXB0eSh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVmcmVzaEV4cHJlc3Npb25zKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAqIHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGxvZ2ljO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICB2YWx1ZS50eXBlID0gRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZS5BZHZhbmNlZDtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkgJiZcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5vbkZpbHRlcmluZ0RvbmUuZW1pdCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgbG9jYWxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBub3Qgc2V0LCByZXR1cm5zIGJyb3dzZXIncyBsYW5ndWFnZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX2xvY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW5jeVBvc2l0aW9uTGVmdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxlQ2hhbmdlLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmdNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5nTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhZ2luZ01vZGUodmFsOiBHcmlkUGFnaW5nTW9kZSkge1xuICAgICAgICB0aGlzLl9wYWdpbmdNb2RlID0gdmFsO1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIHBhZ2luZyBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IHN0YXRlIGlzIGRpc2FibGVkIChmYWxzZSkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbcGFnaW5nXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGN1cnJlbnQgcGFnZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtwYWdpbmddPVwidHJ1ZVwiIFsocGFnZSldPVwibW9kZWwucGFnZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGJpbmRpbmcuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWwgPT09IHRoaXMuX3BhZ2UgfHwgdmFsIDwgMCB8fCB2YWwgPiB0aGlzLnRvdGFsUGFnZXMgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICB0aGlzLm9uUGFnaW5nRG9uZS5lbWl0KHsgcHJldmlvdXM6IHRoaXMuX3BhZ2UsIGN1cnJlbnQ6IHZhbCB9KTtcbiAgICAgICAgdGhpcy5fcGFnZSA9IHZhbDtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5fcGFnZSk7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUbygwKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBudW1iZXIgb2YgdmlzaWJsZSBpdGVtcyBwZXIgcGFnZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgaXMgMTUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbcGFnaW5nXT1cInRydWVcIiBbKHBlclBhZ2UpXT1cIm1vZGVsLnBlclBhZ2VcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwZXJQYWdlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJQYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGVyUGFnZSh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5fcGVyUGFnZSA9IHZhbDtcbiAgICAgICAgdGhpcy5wZXJQYWdlQ2hhbmdlLmVtaXQodGhpcy5fcGVyUGFnZSk7XG4gICAgICAgIHRoaXMucGFnZSA9IDA7XG4gICAgICAgIHRoaXMuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaGlkaW5nIFVJIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIGRpc2FibGVkIChmYWxzZSkuIEluIG9yZGVyIGZvciB0aGUgVUkgdG8gd29yaywgeW91IG5lZWQgdG8gZW5hYmxlIHRoZSB0b29sYmFyIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbY29sdW1uSGlkaW5nXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBEZXByZWNhdGVQcm9wZXJ0eSgnYGNvbHVtbkhpZGluZ2AgaXMgZGVwcmVjYXRlZC4nKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5IaWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5IaWRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb2x1bW5IaWRpbmcodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uSGlkaW5nID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgcm93IHNlbGVjdG9ycyBhcmUgaGlkZGVuLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgQnkgZGVmYXVsdCByb3cgc2VsZWN0b3JzIGFyZSBzaG93blxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoaWRlUm93U2VsZWN0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZVJvd1NlbGVjdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhpZGVSb3dTZWxlY3RvcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faGlkZVJvd1NlbGVjdG9ycyA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgcm93cyBjYW4gYmUgbW92ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW3Jvd0RyYWdnYWJsZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RHJhZyAmJiB0aGlzLmhhc1Zpc2libGVDb2x1bW5zO1xuICAgIH1cblxuXG4gICAgcHVibGljIHNldCByb3dEcmFnZ2FibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Jvd0RyYWcgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvd0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgSUQgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgcm93IElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGRyYWdSb3dJRCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZFJvd1BhcmVudCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgcm93cyBhcmUgZWRpdGFibGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbY29sdW1uSGlkaW5nXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93RWRpdGFibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3JpZFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcm93RWRpdGFibGUgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgcHVibGljIGdldCBob3N0V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aCB8fCB0aGlzLl9ob3N0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBncmlkV2lkdGggPSB0aGlzLmdyaWQud2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3aWR0aCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgaGVhZGVyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogbGV0IGdyaWRIZWFkZXJXaWR0aCA9IHRoaXMuZ3JpZC5oZWFkZXJXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcldpZHRoKCkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIC0gMTc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW3Jvd0hlaWdodF09XCIxMDBcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dIZWlnaHQgPyB0aGlzLl9yb3dIZWlnaHQgOiB0aGlzLmRlZmF1bHRSb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dIZWlnaHQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcm93SGVpZ2h0ID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGRlZmF1bHQgd2lkdGggb2YgdGhlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbY29sdW1uV2lkdGhdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbldpZHRoO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtbldpZHRoKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uV2lkdGggPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlciA9IHRydWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQvU2V0cyB0aGUgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5R3JpZE1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9lbXB0eUdyaWRNZXNzYWdlID0gdmFsdWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZW1wdHlHcmlkTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1wdHlHcmlkTWVzc2FnZSB8fCB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9lbXB0eUdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBpcyBnb2luZyB0byBzaG93IGEgbG9hZGluZyBpbmRpY2F0b3IuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGlzTG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5faXNMb2FkaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5faXNMb2FkaW5nID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlTG9hZGluZ1N0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgY3VycmVudCBkZXRlY3Rpb24gY3ljbGUgdG8gZW5kIGJlZm9yZSB0cmlnZ2VyaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTG9hZGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgY29sdW1ucyBzaG91bGQgYmUgYXV0by1nZW5lcmF0ZWQgb25jZSBhZ2FpbiBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGdyaWRcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyB3aWxsIGFsbG93IHRvIGJpbmQgdGhlIGdyaWQgdG8gcmVtb3RlIGRhdGEgYW5kIGhhdmluZyBhdXRvLWdlbmVyYXRlZCBjb2x1bW5zIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICogTm90ZSB0aGF0IGFmdGVyIGdlbmVyYXRpbmcgdGhlIGNvbHVtbnMsIHRoaXMgcHJvcGVydHkgd291bGQgYmUgZGlzYWJsZWQgdG8gYXZvaWQgcmUtY3JlYXRpbmdcbiAgICAgKiBjb2x1bW5zIGVhY2ggdGltZSBhIG5ldyBkYXRhIGlzIGFzc2lnbmVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICB0aGlzLmdyaWQuc2hvdWxkR2VuZXJhdGUgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG91bGRHZW5lcmF0ZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVjb3JkcyBhbmQgdGhlIGdyaWQgaXMgZmlsdGVyZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtlbXB0eUdyaWRNZXNzYWdlXT1cIidUaGUgZ3JpZCBpcyBlbXB0eSdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBlbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlIHx8IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2VtcHR5RmlsdGVyZWRHcmlkX21lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0aXRsZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGJ1aWx0LWluIGNvbHVtbiBoaWRpbmcgVUkuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgY29sdW1uSGlkaW5nVGl0bGU9XCJDb2x1bW4gSGlkaW5nXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2Bjb2x1bW5IaWRpbmdUaXRsZWAgaXMgZGVwcmVjYXRlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkhpZGluZ1RpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5IaWRpbmdUaXRsZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2x1bW5IaWRpbmdUaXRsZSh2OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uSGlkaW5nVGl0bGUgPSB2O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uSGlkaW5nVGl0bGVJbnRlcm5hbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uSGlkaW5nVGl0bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBpbml0aWFsIHBpbm5pbmcgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQWxsb3dzIHRvIGFwcGx5IHBpbm5pbmcgdGhlIGNvbHVtbnMgdG8gdGhlIHN0YXJ0IG9yIHRoZSBlbmQuXG4gICAgICogTm90ZSB0aGF0IHBpbm5pbmcgdG8gYm90aCBzaWRlcyBhdCBhIHRpbWUgaXMgbm90IGFsbG93ZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtwaW5uaW5nXT1cInBpbm5pbmdDb25maWdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwaW5uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmluZztcbiAgICB9XG4gICAgcHVibGljIHNldCBwaW5uaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fcGlubmluZykge1xuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bpbm5pbmcgPSB2YWx1ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgYnVpbHQtaW4gY29sdW1uIHBpbm5pbmcgVUkgc2hvdWxkIGJlIHNob3duIGluIHRoZSB0b29sYmFyLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbY29sdW1uUGlubmluZ109XCIndHJ1ZVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgY29sdW1uUGlubmluZ2AgaXMgZGVwcmVjYXRlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtblBpbm5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5QaW5uaW5nO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtblBpbm5pbmcodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uUGlubmluZyA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRpdGxlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkgb2YgdGhlIGNvbHVtbiBwaW5uaW5nLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbY29sdW1uUGlubmluZ109XCIndHJ1ZVwiIFtjb2x1bW5QaW5uaW5nVGl0bGVdPVwiJ0NvbHVtbiBIaWRpbmcnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2Bjb2x1bW5QaW5uaW5nVGl0bGVgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5QaW5uaW5nVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblBpbm5pbmdUaXRsZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2x1bW5QaW5uaW5nVGl0bGUodjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblBpbm5pbmdUaXRsZSA9IHY7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBjb2x1bW5QaW5uaW5nVGl0bGVJbnRlcm5hbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUGlubmluZ1RpdGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93RmlsdGVyaW5nXT1cInRydWVcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhbGxvd0ZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93RmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYWxsb3dGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93QWR2YW5jZWRGaWx0ZXJpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhbGxvd0FkdmFuY2VkRmlsdGVyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnJlZ2lzdGVyU1ZHSWNvbnMoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBmaWx0ZXIgbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbZmlsdGVyTW9kZV09XCIncXVpY2tGaWx0ZXInXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gRmlsdGVyTW9kZS5xdWlja0ZpbHRlci5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlck1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJNb2RlKHZhbHVlOiBGaWx0ZXJNb2RlKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlck1vZGUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdSb3cuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdW1tYXJ5IHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIHN1bW1hcnlQb3NpdGlvbj1cInRvcFwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIGJvdHRvbS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc3VtbWFyeVBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeVBvc2l0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc3VtbWFyeVBvc2l0aW9uKHZhbHVlOiBHcmlkU3VtbWFyeVBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlQb3NpdGlvbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN1bW1hcnkgY2FsY3VsYXRpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBzdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlPVwicm9vdExldmVsT25seVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHJvb3RBbmRDaGlsZExldmVscyB3aGljaCBtZWFucyB0aGUgc3VtbWFyaWVzIGFyZSBjYWxjdWxhdGVkIGZvciB0aGUgcm9vdCBsZXZlbCBhbmQgZWFjaCBjaGlsZCBsZXZlbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKHZhbHVlOiBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSkge1xuICAgICAgICB0aGlzLl9zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlID0gdmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UucmVzZXRTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBzdW1tYXJ5IHJvdyBpcyB2aXNpYmxlIHdoZW4gZ3JvdXBCeS9wYXJlbnQgcm93IGlzIGNvbGxhcHNlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1N1bW1hcnlPbkNvbGxhcHNlXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBzaG93U3VtbWFyeU9uQ29sbGFwc2UgaXMgc2V0IHRvICdmYWxzZScgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3VtbWFyeSByb3cgaXMgbm90IHZpc2libGVcbiAgICAgKiB3aGVuIHRoZSBncm91cEJ5L3BhcmVudCByb3cgaXMgY29sbGFwc2VkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93U3VtbWFyeU9uQ29sbGFwc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2hvd1N1bW1hcnlPbkNvbGxhcHNlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIHN0cmF0ZWd5IG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbZmlsdGVyU3RyYXRlZ3ldPVwiZmlsdGVyU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJTdHJhdGVneSgpOiBJRmlsdGVyaW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJTdHJhdGVneShjbGFzc1JlZjogSUZpbHRlcmluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcmluZ1N0cmF0ZWd5ID0gY2xhc3NSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzb3J0aW5nIHN0cmF0ZWd5IG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc29ydFN0cmF0ZWd5XT1cInNvcnRTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRTdHJhdGVneSgpOiBJR3JpZFNvcnRpbmdTdHJhdGVneSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3J0U3RyYXRlZ3kodmFsdWU6IElHcmlkU29ydGluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHRoaXMuX3NvcnRpbmdTdHJhdGVneSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcHJlc2VudHMgdGhlIHNlbGVjdGVkIHJvd3MnIElEcyAocHJpbWFyeSBrZXkgb3Igcm93RGF0YSlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgcHJpbWFyeUtleT1cIklEXCIgcm93U2VsZWN0aW9uPVwibXVsdGlwbGVcIiBbc2VsZWN0ZWRSb3dzXT1cIlswLCAxLCAyXVwiPjxpZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyB8fCBbXSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFJvd3MoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkUm93cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBleGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50cy5maXJzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGVhZGVyR3JvdXBzTGlzdCA9IHRoaXMuZ3JpZC5oZWFkZXJHcm91cHNMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyR3JvdXBzTGlzdCgpOiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRlckdyb3VwcyA/IGZsYXR0ZW4odGhpcy5oZWFkZXJHcm91cHMudG9BcnJheSgpKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRIZWFkZXJDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGVhZGVycyA9IHRoaXMuZ3JpZC5oZWFkZXJDZWxsTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckNlbGxMaXN0KCk6IElneEdyaWRIZWFkZXJDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRlckdyb3Vwc0xpc3QubWFwKChoZWFkZXJHcm91cCkgPT4gaGVhZGVyR3JvdXAuaGVhZGVyQ2VsbCkuZmlsdGVyKChoZWFkZXJDZWxsKSA9PiBoZWFkZXJDZWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIGBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJDZWxscyA9IHRoaXMuZ3JpZC5maWx0ZXJDZWxsTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlckNlbGxMaXN0KCk6IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJHcm91cHNMaXN0Lm1hcCgoaGVhZGVyR3JvdXApID0+IGhlYWRlckdyb3VwLmZpbHRlckNlbGwpLmZpbHRlcigoZmlsdGVyQ2VsbCkgPT4gZmlsdGVyQ2VsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcmllc1Jvd0xpc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBRdWVyeUxpc3Q8YW55PigpO1xuICAgICAgICBpZiAoIXRoaXMuX3N1bW1hcnlSb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN1bUxpc3QgPSB0aGlzLl9zdW1tYXJ5Um93TGlzdC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IG51bGwpO1xuICAgICAgICByZXMucmVzZXQoc3VtTGlzdCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBJZ3hHcmlkUm93Q29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHJvd0xpc3QgPSB0aGlzLmdyaWQucm93TGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0xpc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBRdWVyeUxpc3Q8YW55PigpO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgckxpc3QgPSB0aGlzLl9yb3dMaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgcmVzLnJlc2V0KHJMaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY3VycmVudGx5IHJlbmRlcmVkIGBJZ3hHcmlkUm93Q29tcG9uZW50YCdzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZGF0YUxpc3QgPSB0aGlzLmdyaWQuZGF0YVJvd0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhUm93TGlzdCgpOiBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlPj4ge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZT4+KCk7XG4gICAgICAgIGlmICghdGhpcy5fZGF0YVJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgckxpc3QgPSB0aGlzLl9kYXRhUm93TGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIHJlcy5yZXNldChyTGlzdCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZFNlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlPiB7XG4gICAgICAgIGlmICh0aGlzLmhlYWRTZWxlY3RvcnNUZW1wbGF0ZXMgJiYgdGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzLmZpcnN0LnRlbXBsYXRlUmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNQaW5uaW5nVG9TdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmluZy5jb2x1bW5zICE9PSBDb2x1bW5QaW5uaW5nUG9zaXRpb24uRW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUm93UGlubmluZ1RvVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uaW5nLnJvd3MgIT09IFJvd1Bpbm5pbmdQb3NpdGlvbi5Cb3R0b207XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93U2VsZWN0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZT4ge1xuICAgICAgICBpZiAodGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMgJiYgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdG9yc1RlbXBsYXRlcy5maXJzdC50ZW1wbGF0ZVJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdGluZ091dGxldERpcmVjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFyZW50Um93T3V0bGV0RGlyZWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDdXN0b20oKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdEN1c3RvbURpcmVjdGl2ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzLmZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0VGV4dCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucm93RWRpdFRleHREaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdFRleHREaXJlY3RpdmVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0VGV4dERpcmVjdGl2ZXMuZmlyc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRBY3Rpb25zKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5yb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXMgJiYgdGhpcy5yb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRBY3Rpb25zRGlyZWN0aXZlcy5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdENvbnRhaW5lcigpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdEN1c3RvbSA/IHRoaXMucm93RWRpdEN1c3RvbSA6IHRoaXMuZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIHJvdyBkcmFnIGluZGljYXRvciBpY29uXG4gICAgICovXG4gICAgcHVibGljIGdldCBkcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tRHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSB8fCB0aGlzLmRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGVzLmZpcnN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSh2YWw6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5fY3VzdG9tRHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93SW5FZGl0TW9kZSgpOiBJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4ge1xuICAgICAgICBjb25zdCBlZGl0Um93U3RhdGUgPSB0aGlzLmNydWRTZXJ2aWNlLnJvdztcbiAgICAgICAgcmV0dXJuIGVkaXRSb3dTdGF0ZSAhPT0gbnVsbCA/IHRoaXMucm93TGlzdC5maW5kKGUgPT4gZS5yb3dJRCA9PT0gZWRpdFJvd1N0YXRlLmlkKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZWRpdGFibGUpXG4gICAgICAgICAgICAubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgcmV0dXJuIGluZGV4Lmxlbmd0aCA/IGluZGV4WzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdEVkaXRhYmxlQ29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVkaXRhYmxlKVxuICAgICAgICAgICAgLm1hcChjID0+IGMudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBpbmRleC5sZW5ndGggPyBpbmRleFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUT0RPOiBOYXYgc2VydmljZSBsb2dpYyBkb2Vzbid0IGhhbmRsZSAwIHJlc3VsdHMgZnJvbSB0aGlzIHF1ZXJ5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRhYnMoKTogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRUYWJzQ1VTVE9NLmxlbmd0aCA/IHRoaXMucm93RWRpdFRhYnNDVVNUT00gOiB0aGlzLnJvd0VkaXRUYWJzREVGQVVMVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW0gPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcblxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0gfHwgIU9iamVjdC5rZXlzKGFjdGl2ZUVsZW0pLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbS5yb3cgPCAwID9cbiAgICAgICAgYCR7dGhpcy5pZH1fJHthY3RpdmVFbGVtLnJvd31fJHthY3RpdmVFbGVtLm1jaENhY2hlLmxldmVsfV8ke2FjdGl2ZUVsZW0uY29sdW1ufWAgOlxuICAgICAgICBgJHt0aGlzLmlkfV8ke2FjdGl2ZUVsZW0ucm93fV8ke2FjdGl2ZUVsZW0uY29sdW1ufWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuY2xhc3MnKVxuICAgIHB1YmxpYyBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBbdGhpcy5nZXRDb21wb25lbnREZW5zaXR5Q2xhc3MoJ2lneC1ncmlkJyldO1xuICAgICAgICAvLyBUaGUgY3VzdG9tIGNsYXNzZXMgc2hvdWxkIGJlIGF0IHRoZSBlbmQuXG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmNsYXNzKTtcbiAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmFubmVyQ2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LmlzVG9wID8gJ2lneC1iYW5uZXJfX2JvcmRlci10b3AnIDogJ2lneC1iYW5uZXJfX2JvcmRlci1ib3R0b20nO1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5nZXRDb21wb25lbnREZW5zaXR5Q2xhc3MoJ2lneC1iYW5uZXInKX0gJHtwb3NpdGlvbn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaXBlVHJpZ2dlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlwZVRyaWdnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmluZ1BpcGVUcmlnZ2VyKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdQaXBlVHJpZ2dlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyeVBpcGVUcmlnZ2VyKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5UGlwZVRyaWdnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzb3J0aW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGRhdGEgYmluZGluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFsoc29ydGluZ0V4cHJlc3Npb25zKV09XCJtb2RlbC5zb3J0aW5nRXhwcmVzc2lvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0aW5nRXhwcmVzc2lvbnMoKTogSVNvcnRpbmdFeHByZXNzaW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZ0V4cHJlc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc29ydGluZ0V4cHJlc3Npb25zKHZhbHVlOiBJU29ydGluZ0V4cHJlc3Npb25bXSkge1xuICAgICAgICB0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnMgPSBjbG9uZUFycmF5KHZhbHVlKTtcbiAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UuZW1pdCh0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnMpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4TGV2ZWxIZWFkZXJEZXB0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZWR1Y2UoKGFjYywgY29sKSA9PiBNYXRoLm1heChhY2MsIGNvbC5yb3dTdGFydCksIDApIDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVkdWNlKChhY2MsIGNvbCkgPT4gTWF0aC5tYXgoYWNjLCBjb2wubGV2ZWwpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaGlkZGVuIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoaWRkZW5Db2wgPSB0aGlzLmdyaWQuaGlkZGVuQ29sdW1uc0NvdW50O1xuICAgICAqIGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoaWRkZW5Db2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjb2wpID0+IGNvbC5jb2x1bW5Hcm91cCA9PT0gZmFsc2UgJiYgY29sLmhpZGRlbiA9PT0gdHJ1ZSkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBwaW5uZWQgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uTGF5b3V0KS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbnNpZGUgdGhlIHRvZ2dsZSBidXR0b24uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGZvciB0aGUgYnVpbHQtaW4gY29sdW1uIGhpZGluZyBVSSBvZiB0aGVgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbaGlkZGVuQ29sdW1uc1RleHRdPVwiJ0hpZGRlbiBDb2x1bW5zJ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLy8gQERlcHJlY2F0ZVByb3BlcnR5KCdgaGlkZGVuQ29sdW1uc1RleHRgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoaWRkZW5Db2x1bW5zVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGRlbkNvbHVtbnNUZXh0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGlkZGVuQ29sdW1uc1RleHQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faGlkZGVuQ29sdW1uc1RleHQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHQgdG8gYmUgZGlzcGxheWVkIGluc2lkZSB0aGUgdG9nZ2xlIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVzZWQgZm9yIHRoZSBidWlsdC1pbiBjb2x1bW4gcGlubmluZyBVSSBvZiB0aGVgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW3Bpbm5lZENvbHVtbnNUZXh0XT1cIidQaW5uZWRDb2xzIFRleHRcIiBbZGF0YV09XCJkYXRhXCIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzUwMHB4J1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgcGlubmVkQ29sdW1uc1RleHRgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZENvbHVtbnNUZXh0O1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHBpbm5lZENvbHVtbnNUZXh0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnNUZXh0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc1RleHRJbnRlcm5hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZENvbHVtbnNUZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2FjdGlvbnMgc2VydmljZSBmb3IgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50Um93U3RhdGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVuY3lQb3NpdGlvbkxlZnQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW5jeVBvc2l0aW9uTGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlLCBOdW1iZXJGb3JtYXRTdHlsZS5DdXJyZW5jeSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdFBhcnRzID0gZm9ybWF0LnNwbGl0KCcsJyk7XG4gICAgICAgIGNvbnN0IGkgPSBmb3JtYXRQYXJ0cy5pbmRleE9mKGZvcm1hdFBhcnRzLmZpbmQoYyA9PiBjLmluY2x1ZGVzKCfCpCcpKSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW5jeVBvc2l0aW9uTGVmdCA9IGkgPCAxO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIHRvb2xiYXIgaXMgc2hvd24uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KCdgc2hvd1Rvb2xiYXJgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzaG93VG9vbGJhcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dUb29sYmFyO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHNob3dUb29sYmFyKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Nob3dUb29sYmFyID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0b29sYmFyJ3MgdGl0bGUuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW3Rvb2xiYXJUaXRsZV09XCInTXkgR3JpZCdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBEZXByZWNhdGVQcm9wZXJ0eSgnYHRvb2xiYXJUaXRsZWAgaXMgZGVwcmVjYXRlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHRvb2xiYXJUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbGJhclRpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG9vbGJhclRpdGxlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fdG9vbGJhclRpdGxlID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIGV4cG9ydGluZyB0byBNUyBFeGNlbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFtleHBvcnRFeGNlbF09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2BleHBvcnRFeGNlbGAgaXMgZGVwcmVjYXRlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydEV4Y2VsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFeHBvcnRFeGNlbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZXhwb3J0RXhjZWwobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0RXhjZWwgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIG9wdGlvbiBmb3IgZXhwb3J0aW5nIHRvIENTViBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZXhwb3J0Q3N2XT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBEZXByZWNhdGVQcm9wZXJ0eSgnYGV4cG9ydENzdmAgaXMgZGVwcmVjYXRlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydENzdigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhwb3J0Q3N2KCk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZXhwb3J0Q3N2KG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydENzdiA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHR1YWwgY29udGVudCBmb3IgdGhlIG1haW4gZXhwb3J0IGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbZXhwb3J0VGV4dF09XCInTXkgRXhwb3J0ZXInXCIgW2V4cG9ydENzdl09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2BleHBvcnRUZXh0YCBpcyBkZXByZWNhdGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhwb3J0VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0VGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cG9ydFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9leHBvcnRUZXh0ID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dHVhbCBjb250ZW50IGZvciB0aGUgTVMgRXhjZWwgZXhwb3J0IGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtleHBvcnRFeGNlbFRleHRdPVwiJ015IEV4Y2VsIEV4cG9ydGVyXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbZXhwb3J0VGV4dF09XCInTXkgRXhwb3J0ZXInXCIgW2V4cG9ydENzdl09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2BleHBvcnRFeGNlbFRleHRgIGlzIGRlcHJlY2F0ZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBvcnRFeGNlbFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydEV4Y2VsVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHNldCBleHBvcnRFeGNlbFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9leHBvcnRFeGNlbFRleHQgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0ZXh0dWFsIGNvbnRlbnQgZm9yIHRoZSBDU1YgZXhwb3J0IGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2V4cG9ydENzdlRleHRdPVwiJ015IENzdiBFeHBvcnRlclwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2V4cG9ydFRleHRdPVwiJ015IEV4cG9ydGVyJ1wiIFtleHBvcnRFeGNlbF09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBARGVwcmVjYXRlUHJvcGVydHkoJ2BleHBvcnRDc3ZUZXh0YCBpcyBkZXByZWNhdGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhwb3J0Q3N2VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0Q3N2VGV4dDtcbiAgICB9XG4gICAgcHVibGljIHNldCBleHBvcnRDc3ZUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0Q3N2VGV4dCA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgY2VsbCBzZWxlY3Rpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCB0aGUgY2VsbCBzZWxlY3Rpb24gbW9kZSBpcyBtdWx0aXBsZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjZWxsU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2VsbFNlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjZWxsU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NlbGxTZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyByb3cgc2VsZWN0aW9uIG1vZGVcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCB0aGUgcm93IHNlbGVjdGlvbiBtb2RlIGlzICdub25lJ1xuICAgICAqIE5vdGUgdGhhdCBpbiBJZ3hHcmlkIGFuZCBJZ3hIaWVyYXJjaGljYWxHcmlkICdtdWx0aXBsZUNhc2NhZGUnIGJlaGF2ZXMgbGlrZSAnbXVsdGlwbGUnXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dTZWxlY3Rpb24oc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGU7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRSb3dzKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgY29sdW1uIHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyBub25lXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtblNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb2x1bW5TZWxlY3Rpb24oc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uU2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGU7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dFZGl0TWVzc2FnZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNuYWNrYmFyQWN0aW9uVGV4dCA9IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3NuYWNrYmFyX2FkZHJvd19hY3Rpb250ZXh0O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5nU3RhdGU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FsY1dpZHRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FsY0hlaWdodCA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdGZvb3RIZWlnaHQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGlwc0dvdXBpbmdFeHByZXNzaW9ucyA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHN1bW1hcmllc0hlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ2dlZENvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50O1xuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGxhc3RTZWFyY2hJbmZvOiBJU2VhcmNoSW5mbyA9IHtcbiAgICAgICAgc2VhcmNoVGV4dDogJycsXG4gICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgYWN0aXZlTWF0Y2hJbmRleDogMCxcbiAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbHVtbldpZHRoU2V0QnlVc2VyID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5uZWRSZWNvcmRzOiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHVucGlubmVkUmVjb3JkczogYW55W107XG5cbiAgICBwdWJsaWMgcmVuZGVyZWQkID0gdGhpcy5yZW5kZXJlZC5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZXNpemVOb3RpZnkgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5hdG9yU2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9maWx0ZXJlZFVucGlubmVkRGF0YTtcbiAgICBwdWJsaWMgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVjaW1hbFBpcGU6IERlY2ltYWxQaXBlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGVQaXBlOiBEYXRlUGlwZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwZXJjZW50UGlwZTogUGVyY2VudFBpcGU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3RvdGFsUmVjb3JkcyA9IC0xO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uc1dpdGhOb1NldFdpZHRocyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9wZXJQYWdlID0gMTU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnZSA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nTW9kZSA9IEdyaWRQYWdpbmdNb2RlLkxvY2FsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hpZGVSb3dTZWxlY3RvcnMgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yb3dEcmFnID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGlwZVRyaWdnZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmluZ1BpcGVUcmlnZ2VyID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJ5UGlwZVRyaWdnZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGlubmVkQ29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF91bnBpbm5lZENvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NvcnRpbmdFeHByZXNzaW9uczogQXJyYXk8SVNvcnRpbmdFeHByZXNzaW9uPiA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbkhpZGluZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtblBpbm5pbmcgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBfcGlubmVkUmVjb3JkSURzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgcHJvdGVjdGVkIF9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGE6IGFueVtdO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGE6IGFueVtdO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyZWRQaW5uZWREYXRhOiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hhc1Zpc2libGVDb2x1bW5zO1xuICAgIHByb3RlY3RlZCBfYWxsb3dGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlck1vZGU6IEZpbHRlck1vZGUgPSBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyO1xuXG4gICAgcHJvdGVjdGVkIG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7IH0pO1xuXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyID0gMTA7XG4gICAgcHJvdGVjdGVkIF9leHBhbnNpb25TdGF0ZXM6IE1hcDxhbnksIGJvb2xlYW4+ID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0RXhwYW5kU3RhdGUgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2Jhc2VGb250U2l6ZTogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfaGVhZGVyRmVhdHVyZXNXaWR0aCA9IE5hTjtcbiAgICBwcm90ZWN0ZWQgX2luaXQgPSB0cnVlO1xuICAgIHByb3RlY3RlZCBfY2RyUmVxdWVzdFJlcGFpbnQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3VzZXJPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2Nyb2xsU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsTmF0aXZlU2l6ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbHVtblBpbm5pbmdUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgX2NvbHVtbkhpZGluZ1RpdGxlOiBzdHJpbmc7XG5cbiAgICAvKiBUb29sYmFyIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi9cbiAgICBwcml2YXRlIF9zaG93VG9vbGJhciA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2V4cG9ydEV4Y2VsID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhwb3J0Q3N2ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfdG9vbGJhclRpdGxlOiBzdHJpbmcgPSBudWxsO1xuICAgIHByaXZhdGUgX2V4cG9ydFRleHQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9leHBvcnRFeGNlbFRleHQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9leHBvcnRDc3ZUZXh0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93RWRpdGFibGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jdXJyZW50Um93U3RhdGU6IGFueTtcbiAgICBwcml2YXRlIF9maWx0ZXJlZFNvcnRlZERhdGEgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY3VzdG9tRHJhZ0luZGljYXRvckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcml2YXRlIF9jZHJSZXF1ZXN0cyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncztcbiAgICBwcml2YXRlIF9lbXB0eUdyaWRNZXNzYWdlID0gbnVsbDtcbiAgICBwcml2YXRlIF9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgPSBudWxsO1xuICAgIHByaXZhdGUgX2lzTG9hZGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3ZlcmxheUlEcyA9IFtdO1xuICAgIHByaXZhdGUgX2ZpbHRlcmluZ1N0cmF0ZWd5OiBJRmlsdGVyaW5nU3RyYXRlZ3k7XG4gICAgcHJpdmF0ZSBfc29ydGluZ1N0cmF0ZWd5OiBJR3JpZFNvcnRpbmdTdHJhdGVneTtcbiAgICBwcml2YXRlIF9waW5uaW5nOiBJUGlubmluZ0NvbmZpZyA9IHsgY29sdW1uczogQ29sdW1uUGlubmluZ1Bvc2l0aW9uLlN0YXJ0IH07XG5cbiAgICBwcml2YXRlIF9ob3N0V2lkdGg7XG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ1Bvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuTWlkZGxlXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nUG9zaXRpb25TZXR0aW5ncyksXG4gICAgfTtcblxuICAgIHByaXZhdGUgY29sdW1uTGlzdERpZmZlcjtcbiAgICBwcml2YXRlIHJvd0xpc3REaWZmZXI7XG4gICAgcHJpdmF0ZSBfaGlkZGVuQ29sdW1uc1RleHQgPSAnJztcbiAgICBwcml2YXRlIF9waW5uZWRDb2x1bW5zVGV4dCA9ICcnO1xuICAgIHByaXZhdGUgX2hlaWdodDogc3RyaW5nIHwgbnVsbCA9ICcxMDAlJztcbiAgICBwcml2YXRlIF93aWR0aDogc3RyaW5nIHwgbnVsbCA9ICcxMDAlJztcbiAgICBwcml2YXRlIF9yb3dIZWlnaHQ7XG4gICAgcHJpdmF0ZSBfaG9yaXpvbnRhbEZvck9mczogQXJyYXk8SWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4+ID0gW107XG4gICAgcHJpdmF0ZSBfbXVsdGlSb3dMYXlvdXRSb3dTaXplID0gMTtcbiAgICAvLyBDYWNoZXNcbiAgICBwcml2YXRlIF90b3RhbFdpZHRoID0gTmFOO1xuICAgIHByaXZhdGUgX3Bpbm5lZFZpc2libGUgPSBbXTtcbiAgICBwcml2YXRlIF91bnBpbm5lZFZpc2libGUgPSBbXTtcbiAgICBwcml2YXRlIF9waW5uZWRXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF91bnBpbm5lZFdpZHRoID0gTmFOO1xuICAgIHByaXZhdGUgX3Zpc2libGVDb2x1bW5zID0gW107XG4gICAgcHJpdmF0ZSBfY29sdW1uR3JvdXBzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYXV0b0dlbmVyYXRlZENvbHMgPSBbXTtcblxuICAgIHByaXZhdGUgX2NvbHVtbldpZHRoOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9zdW1tYXJ5UG9zaXRpb246IEdyaWRTdW1tYXJ5UG9zaXRpb24gPSBHcmlkU3VtbWFyeVBvc2l0aW9uLmJvdHRvbTtcbiAgICBwcml2YXRlIF9zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlOiBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSA9IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLnJvb3RBbmRDaGlsZExldmVscztcbiAgICBwcml2YXRlIF9zaG93U3VtbWFyeU9uQ29sbGFwc2UgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jZWxsU2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZTtcbiAgICBwcml2YXRlIF9yb3dTZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgcHJpdmF0ZSBfc2VsZWN0Um93T25DbGljayA9IHRydWU7XG4gICAgcHJpdmF0ZSBfY29sdW1uU2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lO1xuXG4gICAgcHJpdmF0ZSBsYXN0QWRkZWRSb3dJbmRleDtcbiAgICBwcml2YXRlIF9jdXJyZW5jeVBvc2l0aW9uTGVmdDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgcm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kgPSBuZXcgUm93RWRpdFBvc2l0aW9uU3RyYXRlZ3koe1xuICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgY2xvc2VBbmltYXRpb246IG51bGxcbiAgICB9KTtcblxuICAgIHByaXZhdGUgcm93RWRpdFNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBvdXRsZXQ6IHRoaXMucm93T3V0bGV0RGlyZWN0aXZlLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5XG4gICAgfTtcblxuICAgIHByaXZhdGUgX3JlbmRlcmVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpZDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGRhdGE6IGFueVtdIHwgbnVsbDtcbiAgICBwdWJsaWMgYWJzdHJhY3QgZmlsdGVyZWREYXRhOiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZmlsdGVyZWQgc29ydGVkIGRhdGEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJlZFNvcnRlZERhdGEgPSB0aGlzLmdyaWQxLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkU29ydGVkRGF0YSgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0NoYW5nZXNDb3VudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNydWRTZXJ2aWNlLnJvdykge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZiA9IChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSAwO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiBpc09iamVjdChvYmpba2V5XSkgPyBjaGFuZ2VzICs9IGYob2JqW2tleV0pIDogY2hhbmdlcysrKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByb3dDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmlkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiByb3dDaGFuZ2VzID8gZihyb3dDaGFuZ2VzKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cygpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2xvbmVBcnJheSh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKCkpO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZENoYW5nZXModHJ1ZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKVxuICAgICAgICAgICAgICAgIC5tYXAodCA9PiB0Lm5ld1ZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCA/IHRoaXMuZGF0YVdpdGhBZGRlZEluVHJhbnNhY3Rpb25Sb3dzLmxlbmd0aCA6IHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgJiYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlciB8fCB0aGlzLmhhc05vRGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgPyB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgOiB0aGlzLmxvYWRpbmdHcmlkRGVmYXVsdFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgPyB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlIDogdGhpcy5lbXB0eUZpbHRlcmVkR3JpZFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzTm9EYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA/IHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgOiB0aGlzLmVtcHR5R3JpZERlZmF1bHRUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaGFzWmVyb1Jlc3VsdEZpbHRlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0IGhhc05vRGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhTGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG91bGRPdmVybGF5TG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nICYmICF0aGlzLmhhc05vRGF0YSAmJiAhdGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZVxuICAgICAgICAgICAgfHwgdGhpcy5yb3dTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlQ2FzY2FkZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSb3dTZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ2VsbFNlbGVjdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGNydWRTZXJ2aWNlOiBJZ3hHcmlkQ1JVRFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjb2xSZXNpemluZ1NlcnZpY2U6IElneENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPixcbiAgICAgICAgQEluamVjdChJZ3hHcmlkVHJhbnNhY3Rpb24pIHByb3RlY3RlZCBfdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvblNlcnZpY2U8VHJhbnNhY3Rpb24sIFN0YXRlPixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50LFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByb3RlY3RlZCBkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIHByb3RlY3RlZCB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwdWJsaWMgbmF2aWdhdGlvbjogSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZmlsdGVyaW5nU2VydmljZTogSWd4RmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgcHVibGljIHN1bW1hcnlTZXJ2aWNlOiBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIGxvY2FsZUlkOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBwbGF0Zm9ybVV0aWw6IFBsYXRmb3JtVXRpbCkge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmxvY2FsZSB8fCB0aGlzLmxvY2FsZUlkO1xuICAgICAgICB0aGlzLmRhdGVQaXBlID0gbmV3IERhdGVQaXBlKHRoaXMubG9jYWxlKTtcbiAgICAgICAgdGhpcy5kZWNpbWFsUGlwZSA9IG5ldyBEZWNpbWFsUGlwZSh0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRoaXMuY3VycmVuY3lQaXBlID0gbmV3IEN1cnJlbmN5UGlwZSh0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRoaXMucGVyY2VudFBpcGUgPSBuZXcgUGVyY2VudFBpcGUodGhpcy5sb2NhbGUpO1xuICAgICAgICB0aGlzLmNkci5kZXRhY2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gICAgcHVibGljIGhpZGVBY3Rpb25TdHJpcCgpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25TdHJpcD8uaGlkZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckZlYXR1cmVzV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEZXRhaWxSZWNvcmQocmVjKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzR3JvdXBCeVJlY29yZChyZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzR2hvc3RSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5naG9zdFJlY29yZCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0FkZFJvd1JlY29yZChyZWNvcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLmFkZFJvdyAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSZXR1cm5zIHRoZSByb3cgaW5kZXggb2YgYSByb3cgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZ1bGwgdmlldyBkYXRhIGxpa2UgcGlubmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCwgcGlubmVkKSB7XG4gICAgICAgIGlmIChwaW5uZWQgJiYgIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3ApIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyB0aGlzLnVucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKCFwaW5uZWQgJiYgdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCArIHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdmlydHVhbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEluY2x1ZGVzIHRoZSBzdGFydCBpbmRleCBhbmQgaG93IG1hbnkgcmVjb3JkcyBhcmUgcmVuZGVyZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JpZFZpcnRTdGF0ZSA9IHRoaXMuZ3JpZDEudmlydHVhbGl6YXRpb25TdGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZU92ZXJsYXlzKCkge1xuICAgICAgICB0aGlzLm92ZXJsYXlJRHMuZm9yRWFjaChvdmVybGF5SUQgPT4ge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5oaWRlKG92ZXJsYXlJRCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9uQ2xvc2VkLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKG8gPT4gby5pZCA9PT0gb3ZlcmxheUlEKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY29yZCBpcyBwaW5uZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvd0luZGV4IEluZGV4IG9mIHRoZSByZWNvcmQgaW4gdGhlIGBkYXRhVmlld2AgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWRCeVZpZXdJbmRleChyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgKHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPCB0aGlzLnBpbm5lZERhdGFWaWV3Lmxlbmd0aCkgfHxcbiAgICAgICAgICAgICghdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA+PSB0aGlzLnVucGlubmVkRGF0YVZpZXcubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY29yZCBpcyBwaW5uZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvd0luZGV4IEluZGV4IG9mIHRoZSByZWNvcmQgaW4gdGhlIGBmaWx0ZXJlZFNvcnRlZERhdGFgIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgKHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPCB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGEubGVuZ3RoKSB8fFxuICAgICAgICAgICAgKCF0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4ID49IHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZChyZWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5pdGlhbFBpbm5lZEluZGV4KHJlYykgIT09IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBSZXR1cm5zIHRoZSByZWNvcmQgaW5kZXggaW4gb3JkZXIgb2YgcGlubmluZyBieSB0aGUgdXNlci4gRG9lcyBub3QgY29uc2lkZXIgc29ydGluZy9maWx0ZXJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldEluaXRpYWxQaW5uZWRJbmRleChyZWMpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pZChyZWMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2YoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1Bpbm5lZFJlY29yZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSZWNvcmRzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2V0dXBTZXJ2aWNlcygpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmdyaWQgPSB0aGlzO1xuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmdyaWQgPSB0aGlzO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbi5ncmlkID0gdGhpcztcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQgPSB0aGlzO1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmdyaWQgPSB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2V0dXBMaXN0ZW5lcnMoKSB7XG4gICAgICAgIGNvbnN0IGRlc3RydWN0b3IgPSB0YWtlVW50aWw8YW55Pih0aGlzLmRlc3Ryb3kkKTtcbiAgICAgICAgZnJvbUV2ZW50KHRoaXMubmF0aXZlRWxlbWVudCwgJ2ZvY3Vzb3V0JykucGlwZShmaWx0ZXIoKCkgPT4gISF0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZHJhZ01vZGUgJiYgaXNJRSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmNydWRTZXJ2aWNlLmNlbGwgJiZcbiAgICAgICAgICAgICAgICAhIXRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlICYmXG4gICAgICAgICAgICAgICAgKChldmVudC50YXJnZXQgPT09IHRoaXMudGJvZHkubmF0aXZlRWxlbWVudCAmJiB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZS5yb3cgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZS5yb3cgPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHx8IChldmVudC50YXJnZXQgPT09IHRoaXMudGZvb3QubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID09PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkpICYmXG4gICAgICAgICAgICAgICAgISh0aGlzLnJvd0VkaXRhYmxlICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93RWRpdGluZ0Jsb2NrZWQgJiYgdGhpcy5jcnVkU2VydmljZS5yb3dJbkVkaXRNb2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5sYXN0QWN0aXZlTm9kZSA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlID0ge30gYXMgSUFjdGl2ZU5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uUm93QWRkZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLnJlZnJlc2hHcmlkU3RhdGUoYXJncykpO1xuICAgICAgICB0aGlzLm9uUm93RGVsZXRlZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZShhcmdzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuZGVsZXRlT3BlcmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoYXJncyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLm9uU3RhdGVVcGRhdGUucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50OiBTdGF0ZVVwZGF0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgYWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5SRURPKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9ucyA9IGV2ZW50LmFjdGlvbnMgPyBldmVudC5hY3Rpb25zLmZpbHRlcih4ID0+IHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkRFTEVURSkgOiBbXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlVORE8pIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zID0gZXZlbnQuYWN0aW9ucyA/IGV2ZW50LmFjdGlvbnMuZmlsdGVyKHggPT4geC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKSA6IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc1Jvd1NlbGVjdGVkKGFjdGlvbi50cmFuc2FjdGlvbi5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdFJvdyhhY3Rpb24udHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICAgICAgdGhpcy5fcGlwZVRyaWdnZXIrKztcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2l6ZU5vdGlmeS5waXBlKGRlc3RydWN0b3IsIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIHRocm90dGxlVGltZSgxMDAsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZSB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uUGFnaW5nRG9uZS5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uQ29sdW1uTW92aW5nRW5kLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgpID0+IHRoaXMuZW5kRWRpdChmYWxzZSkpO1xuXG4gICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uub25PcGVuaW5nLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZXZlbnQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0aWFsaXplKHRoaXMsIHRoaXMub3ZlcmxheVNlcnZpY2UsIGV2ZW50LmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uub25PcGVuZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKGV2ZW50LmlkKT8uc2V0dGluZ3M7XG5cbiAgICAgICAgICAgIC8vIGRvIG5vdCBoaWRlIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgb3ZlcmxheSBvbiBzY3JvbGxcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2V0QWRkQnV0dG9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkbyBub3QgaGlkZSB0aGUgb3ZlcmxheSBpZiBpdCdzIGF0dGFjaGVkIHRvIGEgcm93XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0aW5nT3ZlcmxheT8ub3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG92ZXJsYXlTZXR0aW5ncz8ub3V0bGV0ID09PSB0aGlzLm91dGxldCAmJiB0aGlzLm92ZXJsYXlJRHMuaW5kZXhPZihldmVudC5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnB1c2goZXZlbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9uQ2xvc2VkLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZCA9IHRoaXMub3ZlcmxheUlEcy5pbmRleE9mKGV2ZW50LmlkKTtcbiAgICAgICAgICAgIGlmIChpbmQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnNwbGljZShpbmQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uRGF0YUNoYW5naW5nLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY2FsY1NpemUgPSB0aGlzLmlzUGVyY2VudEhlaWdodCAmJlxuICAgICAgICAgICAgICAgICghdGhpcy5jYWxjSGVpZ2h0IHx8IHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID09PSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcik7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVjYWxjU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICAgICAgICAgICRldmVudC5jb250YWluZXJTaXplID0gdGhpcy5jYWxjSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uU2Nyb2xsYmFyVmlzaWJpbGl0eUNoYW5nZWQucGlwZShkZXN0cnVjdG9yLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gY2FsbGVkIHRvIHJlY2FsYyBhbGwgd2lkdGhzIHRoYXQgbWF5IGhhdmUgY2hhbmdlcyBhcyBhIHJlc3VsdCBvZlxuICAgICAgICAgICAgLy8gdGhlIHZlcnQuIHNjcm9sbGJhciBzaG93aW5nL2hpZGluZ1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uQ29udGVudFNpemVDaGFuZ2UucGlwZShkZXN0cnVjdG9yLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKS5zdWJzY3JpYmUoKCRldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoZmFsc2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uRGVuc2l0eUNoYW5nZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IDA7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuX3NldHVwU2VydmljZXMoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5yb3dMaXN0RGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0RGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5jYWxjV2lkdGggPSB0aGlzLndpZHRoICYmIHRoaXMud2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSA6IDA7XG4gICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSB0aGlzLmF1dG9HZW5lcmF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q29sdW1uc0NhY2hlcygpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmZvckVhY2goY29sdW1uID0+IGNvbHVtbi5yZXNldENhY2hlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVJvd0lEKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW4gPSB0aGlzLmNvbHVtbkxpc3QuZmluZChjb2wgPT4gY29sLmZpZWxkID09PSB0aGlzLnByaW1hcnlLZXkpO1xuICAgICAgICBjb25zdCBpZFR5cGUgPSB0aGlzLmRhdGEubGVuZ3RoID8gdHlwZW9mICh0aGlzLmRhdGFbMF1bdGhpcy5wcmltYXJ5S2V5XSkgOiBwcmltYXJ5Q29sdW1uID8gcHJpbWFyeUNvbHVtbi5kYXRhVHlwZSA6ICdzdHJpbmcnO1xuICAgICAgICByZXR1cm4gaWRUeXBlID09PSAnc3RyaW5nJyA/IHV1aWR2NCgpIDogRkFLRV9ST1dfSUQtLTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Rm9yT2ZDYWNoZSgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RWaXJ0Um93ID0gdGhpcy5kYXRhUm93TGlzdC5maXJzdDtcbiAgICAgICAgaWYgKGZpcnN0VmlydFJvdykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RWaXJ0Um93LnZpcnREaXJSb3cuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0VmlydFJvdy52aXJ0RGlyUm93LmFzc3VtZU1hc3RlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaWx0ZXJlZERhdGEoZGF0YSwgcGlubmVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFBpbm5lZERhdGEgPSBkYXRhIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRVbnBpbm5lZCA9IHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gWy4uLiB0aGlzLl9maWx0ZXJlZFBpbm5lZERhdGEsIC4uLmZpbHRlcmVkVW5waW5uZWRdO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEubGVuZ3RoID4gMCA/IGZpbHRlcmVkRGF0YSA6IHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAhcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2x1bW5zLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFZpc2libGUubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRWaXNpYmxlLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENhY2hlZFdpZHRocygpIHtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRXaWR0aCA9IE5hTjtcbiAgICAgICAgdGhpcy5fcGlubmVkV2lkdGggPSBOYU47XG4gICAgICAgIHRoaXMuX3RvdGFsV2lkdGggPSBOYU47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGggPSB0cnVlKSB7XG4gICAgICAgIGlmIChyZWNhbGNGZWF0dXJlV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGggPSBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEZvck9mQ2FjaGUoKTtcbiAgICAgICAgdGhpcy5yZXNldENvbHVtbnNDYWNoZXMoKTtcbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICAgICAgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gdGhpcy5jb2x1bW5MaXN0LnNvbWUoY29sID0+IGNvbC5jb2x1bW5Hcm91cCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMudG9vbGJhci5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uU3RyaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uU3RyaXAubWVudU92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm91dGxldDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFSZWJpbmRpbmcoZXZlbnQ6IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncykge1xuICAgICAgICB0aGlzLmRhdGFDaGFuZ2luZy5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhUmVib3VuZChldmVudCkge1xuICAgICAgICB0aGlzLmRhdGFDaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVyZWRTb3J0ZWREYXRhKGRhdGEsIHBpbm5lZDogYm9vbGVhbikge1xuICAgICAgICBkYXRhID0gZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKHRoaXMucGlubmVkUmVjb3Jkc0NvdW50ID4gMCAmJiBwaW5uZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLnBpbm5lZFJlY29yZHMgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhID0gdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCA/IFsuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhLCAuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGFdIDpcbiAgICAgICAgICAgICAgICBbLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhLCAuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhXTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waW5uZWRSZWNvcmRzQ291bnQgPiAwICYmICFwaW5uZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2godHJ1ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRIb3Jpem9udGFsRm9yT2ZzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50RmlsdGVyID0gKGl0ZW06IElneFJvd0RpcmVjdGl2ZTxhbnk+IHwgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCkgPT4gdGhpcy5pc0RlZmluZWQoaXRlbS5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICB0aGlzLl9ob3Jpem9udGFsRm9yT2ZzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5fZGF0YVJvd0xpc3QuZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdyksXG4gICAgICAgICAgICAuLi50aGlzLl9zdW1tYXJ5Um93TGlzdC5maWx0ZXIoZWxlbWVudEZpbHRlcikubWFwKGl0ZW0gPT4gaXRlbS52aXJ0RGlyUm93KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF9zZXR1cFJvd09ic2VydmVycygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZpbHRlciA9IChpdGVtOiBJZ3hSb3dEaXJlY3RpdmU8YW55PiB8IElneFN1bW1hcnlSb3dDb21wb25lbnQpID0+IHRoaXMuaXNEZWZpbmVkKGl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgY29uc3QgZXh0cmFjdEZvck9mcyA9IHBpcGUobWFwKChjb2xsZWN0aW9uOiBhbnlbXSkgPT4gY29sbGVjdGlvbi5maWx0ZXIoZWxlbWVudEZpbHRlcikubWFwKGl0ZW0gPT4gaXRlbS52aXJ0RGlyUm93KSkpO1xuICAgICAgICBjb25zdCByb3dMaXN0T2JzZXJ2ZXIgPSBleHRyYWN0Rm9yT2ZzKHRoaXMuX2RhdGFSb3dMaXN0LmNoYW5nZXMpO1xuICAgICAgICBjb25zdCBzdW1tYXJ5Um93T2JzZXJ2ZXIgPSBleHRyYWN0Rm9yT2ZzKHRoaXMuX3N1bW1hcnlSb3dMaXN0LmNoYW5nZXMpO1xuICAgICAgICByb3dMaXN0T2JzZXJ2ZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0SG9yaXpvbnRhbEZvck9mcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3VtbWFyeVJvd09ic2VydmVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldEhvcml6b250YWxGb3JPZnMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsRm9yT2ZzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3pvbmVCZWdvbmVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudmVydGljYWxTY3JvbGxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIuZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5yZXNpemVOb3RpZnkubmV4dCgpKTtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0UGlubmluZygpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcygpO1xuICAgICAgICB0aGlzLl9pbml0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLnJlYXR0YWNoKCk7XG4gICAgICAgIHRoaXMuX3NldHVwUm93T2JzZXJ2ZXJzKCk7XG4gICAgICAgIHRoaXMuX3pvbmVCZWdvbmVMaXN0ZW5lcnMoKTtcblxuICAgICAgICB0aGlzLnBhZ2luYXRvclNldHRpbmdzID0geyBvdXRsZXQ6IHRoaXMub3V0bGV0IH07XG5cbiAgICAgICAgY29uc3QgdmVydFNjckRDID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICB2ZXJ0U2NyREMuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wcmV2ZW50Q29udGFpbmVyU2Nyb2xsLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZFJvd0xpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXI/LmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhW3RoaXMubGFzdEFkZGVkUm93SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhyZWMsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBLZWVwIHRoZSBzdHJlYW0gb3BlbiBmb3IgZnV0dXJlIHN1YnNjcmliZXJzXG4gICAgICAgIHRoaXMucmVuZGVyZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLnJlbmRlcmVkLm5leHQodHJ1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeUNoYW5nZXMocmVwYWludCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQgPSByZXBhaW50O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIHN1cGVyLm5nRG9DaGVjaygpO1xuICAgICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RSZXBhaW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Tm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0cykge1xuICAgICAgICAgICAgdGhpcy5yZXNldE5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcyAmJiB0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGVzLmZpcnN0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG1wT3V0bGV0cy5mb3JFYWNoKCh0bXBsT3V0bGV0KSA9PiB7XG4gICAgICAgICAgICB0bXBsT3V0bGV0LmNsZWFuQ2FjaGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmhpZGUodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uZ2V0U2Nyb2xsKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudmVydGljYWxTY3JvbGxIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyPy5nZXRTY3JvbGwoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlcik7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0U2NyREMgPSB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPy5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICAgICAgdmVydFNjckRDPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnByZXZlbnRDb250YWluZXJTY3JvbGwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBzcGVjaWZpZWQgY29sdW1uJ3MgdmlzaWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEudG9nZ2xlQ29sdW1uVmlzaWJpbGl0eSh7XG4gICAgICogICAgICAgY29sdW1uOiB0aGlzLmdyaWQxLmNvbHVtbnNbMF0sXG4gICAgICogICAgICAgbmV3VmFsdWU6IHRydWVcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShhcmdzOiBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29sID0gYXJncy5jb2x1bW4gPyB0aGlzLmNvbHVtbkxpc3QuZmluZCgoYykgPT4gYyA9PT0gYXJncy5jb2x1bW4pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICghY29sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29sLnRvZ2dsZVZpc2liaWxpdHkoYXJncy5uZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgbGlzdCBvZiBrZXktdmFsdWUgcGFpcnMgW3JvdyBJRCwgZXhwYW5zaW9uIHN0YXRlXS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSW5jbHVkZXMgb25seSBzdGF0ZXMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdCBvbmUuXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJkYXRhXCIgWyhleHBhbnNpb25TdGF0ZXMpXT1cIm1vZGVsLmV4cGFuc2lvblN0YXRlc1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cGFuc2lvblN0YXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuc2lvblN0YXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cGFuc2lvblN0YXRlcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4odmFsdWUpO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlc0NoYW5nZS5lbWl0KHRoaXMuX2V4cGFuc2lvblN0YXRlcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIGFsbCByb3dzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmV4cGFuZEFsbCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRBbGwoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2VzIGFsbCByb3dzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNvbGxhcHNlQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbGxhcHNlQWxsKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5leHBhbmRSb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZFJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2VzIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jb2xsYXBzZVJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VSb3cocm93SUQ6IGFueSkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuc2V0X3Jvd19leHBhbnNpb25fc3RhdGUocm93SUQsIGZhbHNlKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnRvZ2dsZVJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5ncmlkQVBJLmdldF9yZWNfYnlfaWQocm93SUQpO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWMpO1xuICAgICAgICB0aGlzLmdyaWRBUEkuc2V0X3Jvd19leHBhbnNpb25fc3RhdGUocm93SUQsICFzdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREZWZhdWx0RXhwYW5kU3RhdGUocmVjOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5hdGl2ZUVsID0gdGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBvdXRsZXQgdXNlZCB0byBhdHRhY2ggdGhlIGdyaWQncyBvdmVybGF5cyB0by5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBJZiBzZXQsIHJldHVybnMgdGhlIG91dGxldCBkZWZpbmVkIG91dHNpZGUgdGhlIGdyaWQuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBncmlkJ3MgaW50ZXJuYWwgb3V0bGV0IGRpcmVjdGl2ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgb3V0bGV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3V0bGV0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvdXRsZXQodmFsOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgPSB2YWw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dIZWlnaCA9IHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29zeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gNDA7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFN1bW1hcnlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMwO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAyNDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM2O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAncyBtaW5pbXVtIGFsbG93ZWQgd2lkdGguXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVzZWQgaW50ZXJuYWxseSBmb3IgcmVzdHJpY3RpbmcgaGVhZGVyIGdyb3VwIGNvbXBvbmVudCB3aWR0aC5cbiAgICAgKiBUaGUgdmFsdWVzIGJlbG93IGRlcGVuZCBvbiB0aGUgaGVhZGVyIGNlbGwgZGVmYXVsdCByaWdodC9sZWZ0IHBhZGRpbmcgdmFsdWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAyNDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQ4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5hdG9yQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb3N5OlxuICAgICAgICAgICAgICAgIHJldHVybiAnaWd4LXBhZ2luYXRvci0tY29zeSc7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdpZ3gtcGFnaW5hdG9yLS1jb21wYWN0JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdpZ3gtcGFnaW5hdG9yJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBmb3IgdGhlIHBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRQaW5uZWRXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3Bpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bpbm5lZFdpZHRoID0gdGhpcy5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgY29udGFpbmVyIGZvciB0aGUgdW5waW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdW5waW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRVbnBpbm5lZFdpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRXaWR0aCgpIHtcbiAgICAgICAgaWYgKCFpc05hTih0aGlzLl91bnBpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5waW5uZWRXaWR0aCA9IHRoaXMuZ2V0VW5waW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNIb3Jpem9udGFsU2Nyb2xsSGlkZGVuKCkge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy51bnBpbm5lZFdpZHRoIC0gdGhpcy50b3RhbFdpZHRoO1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aCA9PT0gbnVsbCB8fCBkaWZmID49IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSBjb21iaW5lZCB3aWR0aCBvZiB0aGUgY29sdW1ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgZW5hYmxlZCBncmlkIGZlYXR1cmVzLiBUaGV5IGFyZSBmaXhlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmVhdHVyZUNvbHVtbnNXaWR0aChleHBhbmRlcj86IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTih0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogcGxhdGZvcm1VdGlsLmlzQnJvd3NlciBjaGVja1xuICAgICAgICAgICAgY29uc3Qgcm93U2VsZWN0QXJlYSA9IHRoaXMuaGVhZGVyU2VsZWN0b3JDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3RvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0RyYWdBcmVhID0gdGhpcy5yb3dEcmFnZ2FibGUgJiYgdGhpcy5oZWFkZXJEcmFnQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRHJhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwYWJsZUFyZWEgPSB0aGlzLmhlYWRlckdyb3VwQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyR3JvdXBDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlcldpZHRoID0gZXhwYW5kZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IGV4cGFuZGVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCA9IHJvd1NlbGVjdEFyZWEgKyByb3dEcmFnQXJlYSArIGdyb3VwYWJsZUFyZWEgKyBleHBhbmRlcldpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXNNYXJnaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBjb2x1bXMgPSB0aGlzLmdyaWQuY29sdW1uc0NvbGxlY3Rpb24uXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2x1bW5zQ29sbGVjdGlvbigpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZCA/ICB0aGlzLl9jb2x1bW5zIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcGlubmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZENvbHVtbnMgPSB0aGlzLmdyaWQucGlubmVkQ29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBpZiAodGhpcy5fcGlubmVkVmlzaWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRWaXNpYmxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bpbm5lZFZpc2libGUgPSB0aGlzLl9waW5uZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkVmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwaW5uZWQgYElneFJvd0NvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkUm93ID0gdGhpcy5ncmlkLnBpbm5lZFJvd3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dzKCk6IElneEdyaWRSb3dDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSb3dMaXN0LnRvQXJyYXkoKS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiB1bnBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB1bnBpbm5lZENvbHVtbnMgPSB0aGlzLmdyaWQudW5waW5uZWRDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3VucGlubmVkVmlzaWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5waW5uZWRWaXNpYmxlID0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmZpbHRlcigoY29sKSA9PiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFZpc2libGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHdpZHRoYCB0byBiZSBzZXQgb24gYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAuXG4gICAgICovXG4gICAgcHVibGljIGdldEhlYWRlckdyb3VwV2lkdGgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sV2lkdGggPSBwYXJzZUZsb2F0KGNvbHVtbi5jYWxjV2lkdGgpO1xuICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHRoaXMuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg7XG5cbiAgICAgICAgaWYgKGNvbFdpZHRoIDwgbWluV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW5XaWR0aCArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbFdpZHRoICsgJ3B4JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBieSBmaWVsZCBuYW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDb2wgPSB0aGlzLmdyaWQxLmdldENvbHVtbkJ5TmFtZShcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldENvbHVtbkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBJZ3hDb2x1bW5Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29sdW1uQnlWaXNpYmxlSW5kZXgoaW5kZXg6IG51bWJlcik6IElneENvbHVtbkNvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zLmZpbmQoKGNvbCkgPT5cbiAgICAgICAgICAgICFjb2wuY29sdW1uR3JvdXAgJiYgIWNvbC5jb2x1bW5MYXlvdXQgJiZcbiAgICAgICAgICAgIGNvbC52aXNpYmxlSW5kZXggPT09IGluZGV4XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneFJvd0RpcmVjdGl2ZWAgYnkgaW5kZXguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteVJvdyA9IHRoaXMuZ3JpZDEuZ2V0Um93QnlJbmRleCgxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93QnlJbmRleChpbmRleDogbnVtYmVyKTogSWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2luZGV4KGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBvYmplY3QgYnkgdGhlIHNwZWNpZmllZCBwcmltYXJ5IGtleSAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIGBwcmltYXJ5S2V5YCBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlSb3cgPSB0aGlzLmdyaWQxLmdldFJvd0J5S2V5KFwiY2VsbDVcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGtleVZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0J5S2V5KGtleVZhbHVlOiBhbnkpOiBJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdldF9yb3dfYnlfa2V5KGtleVZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZpc2libGUgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdyaWQudmlzaWJsZUNvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXNpYmxlQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoYyA9PiAhYy5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsQ29tcG9uZW50YCB0aGF0IG1hdGNoZXMgdGhlIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUNlbGwgPSB0aGlzLmdyaWQxLmdldENlbGxCeUNvbHVtbigyLFwiVW5pdFByaWNlXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJbmRleFxuICAgICAqIEBwYXJhbSBjb2x1bW5GaWVsZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDZWxsQnlDb2x1bW4ocm93SW5kZXg6IG51bWJlciwgY29sdW1uRmllbGQ6IHN0cmluZyk6IElneEdyaWRDZWxsQ29tcG9uZW50IHtcbiAgICAgICAgY29uc3QgY29sdW1uSWQgPSB0aGlzLmNvbHVtbkxpc3QubWFwKChjb2x1bW4pID0+IGNvbHVtbi5maWVsZCkuaW5kZXhPZihjb2x1bW5GaWVsZCk7XG4gICAgICAgIGlmIChjb2x1bW5JZCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ2V0X2NlbGxfYnlfaW5kZXgocm93SW5kZXgsIGNvbHVtbklkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDZWxsQnlDb2x1bW5WaXNpYmxlSW5kZXgocm93SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IElneEdyaWRDZWxsQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfY2VsbF9ieV92aXNpYmxlX2luZGV4KHJvd0luZGV4LCBpbmRleCk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGBJZ3hHcmlkQ2VsbENvbXBvbmVudGAgb2JqZWN0IGJ5IHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgYW5kIGNvbHVtbiBmaWVsZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhhdCB0aGUgcHJpbWFyeUtleSBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5nZXRDZWxsQnlLZXkoMSwgJ2luZGV4Jyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIG1hdGNoIGFueSByb3dJRFxuICAgICAqIEBwYXJhbSBjb2x1bW5GaWVsZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDZWxsQnlLZXkocm93U2VsZWN0b3I6IGFueSwgY29sdW1uRmllbGQ6IHN0cmluZyk6IElneEdyaWRDZWxsQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfY2VsbF9ieV9rZXkocm93U2VsZWN0b3IsIGNvbHVtbkZpZWxkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b3RhbFBhZ2VzID0gdGhpcy5ncmlkLnRvdGFsUGFnZXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luZ1N0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmdTdGF0ZS5tZXRhZGF0YS5jb3VudFBhZ2VzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbFJlY29yZHMgPj0gMCA/IE1hdGguY2VpbCh0aGlzLl90b3RhbFJlY29yZHMgLyB0aGlzLnBlclBhZ2UpIDogLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBwYWdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlyc3RQYWdlID0gdGhpcy5ncmlkLmlzRmlyc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UgPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR29lcyB0byB0aGUgbmV4dCBwYWdlLCBpZiB0aGUgZ3JpZCBpcyBub3QgYWxyZWFkeSBhdCB0aGUgbGFzdCBwYWdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5uZXh0UGFnZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0UGFnZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZSArPSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR29lcyB0byB0aGUgcHJldmlvdXMgcGFnZSwgaWYgdGhlIGdyaWQgaXMgbm90IGFscmVhZHkgYXQgdGhlIGZpcnN0IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnByZXZpb3VzUGFnZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlIC09IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogT25seSBmdW5jdGlvbnMgd2hlbiBwYWdpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b3RhbFJlY29yZHMgPSB0aGlzLmdyaWQudG90YWxSZWNvcmRzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b3RhbFJlY29yZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcyA+PSAwID8gdGhpcy5fdG90YWxSZWNvcmRzIDogdGhpcy5wYWdpbmdTdGF0ZT8ubWV0YWRhdGEuY291bnRSZWNvcmRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRvdGFsID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHRvdGFsO1xuICAgICAgICAgICAgdGhpcy5fcGlwZVRyaWdnZXIrKztcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXN0UGFnZSA9IHRoaXMuZ3JpZC5pc0xhc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZSArIDEgPj0gdGhpcy50b3RhbFBhZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBgSWd4R3JpZENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncmlkV2lkdGggPSB0aGlzLmdyaWQudG90YWxXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFpc05hTih0aGlzLl90b3RhbFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGFrZSBvbmx5IHRvcCBsZXZlbCBjb2x1bW5zXG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmxldmVsID09PSAwICYmICFjb2wucGlubmVkKTtcbiAgICAgICAgbGV0IHRvdGFsV2lkdGggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoaTsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gcGFyc2VJbnQoY29sc1tpXS5jYWxjV2lkdGgsIDEwKSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RvdGFsV2lkdGggPSB0b3RhbFdpZHRoO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93Um93U2VsZWN0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1Jvd1NlbGVjdGFibGUgJiYgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucyAmJiAhdGhpcy5oaWRlUm93U2VsZWN0b3JzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dBZGRCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRhYmxlICYmIHRoaXMuZGF0YVZpZXcubGVuZ3RoID09PSAwICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dEcmFnSWNvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0RyYWdnYWJsZSAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gdGhpcy5oaWRkZW5Db2x1bW5zQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgY29sdW1uIGJlZm9yZSBvciBhZnRlciB0aGUgc3BlY2lmaWVkIHRhcmdldCBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLm1vdmVDb2x1bW4oY29sdW1uLCB0YXJnZXQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlQ29sdW1uKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LCB0YXJnZXQ6IElneENvbHVtbkNvbXBvbmVudCwgcG9zOiBEcm9wUG9zaXRpb24gPSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSB7XG5cbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gdGFyZ2V0IHx8IChjb2x1bW4ubGV2ZWwgIT09IHRhcmdldC5sZXZlbCkgfHxcbiAgICAgICAgICAgIChjb2x1bW4udG9wTGV2ZWxQYXJlbnQgIT09IHRhcmdldC50b3BMZXZlbFBhcmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4ubGV2ZWwpIHtcbiAgICAgICAgICAgIHRoaXMuX21vdmVDaGlsZENvbHVtbnMoY29sdW1uLnBhcmVudCwgY29sdW1uLCB0YXJnZXQsIHBvcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29sdW1uUGluU3RhdGVDaGFuZ2VkO1xuICAgICAgICAvLyBwaW5uaW5nIGFuZCB1bnBpbm5pbmcgd2lsbCB3b3JrIGNvcnJlY3RseSBldmVuIHdpdGhvdXQgcGFzc2luZyBpbmRleFxuICAgICAgICAvLyBidXQgaXMgZWFzaWVyIHRvIGNhbGNsdWxhdGUgdGhlIGluZGV4IGhlcmUsIGFuZCBsYXRlciB1c2UgaXQgaW4gdGhlIHBpbm5pbmcgZXZlbnQgYXJnc1xuICAgICAgICBpZiAodGFyZ2V0LnBpbm5lZCAmJiAhY29sdW1uLnBpbm5lZCkge1xuICAgICAgICAgICAgY29uc3QgcGlubmVkSW5kZXggPSB0aGlzLl9waW5uZWRDb2x1bW5zLmluZGV4T2YodGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gcGlubmVkSW5kZXggKyAxIDogcGlubmVkSW5kZXg7XG4gICAgICAgICAgICBjb2x1bW5QaW5TdGF0ZUNoYW5nZWQgPSBjb2x1bW4ucGluKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGFyZ2V0LnBpbm5lZCAmJiBjb2x1bW4ucGlubmVkKSB7XG4gICAgICAgICAgICBjb25zdCB1bnBpbm5lZEluZGV4ID0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YodGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gdW5waW5uZWRJbmRleCArIDEgOiB1bnBpbm5lZEluZGV4O1xuICAgICAgICAgICAgY29sdW1uUGluU3RhdGVDaGFuZ2VkID0gY29sdW1uLnVucGluKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQucGlubmVkICYmIGNvbHVtbi5waW5uZWQgJiYgIWNvbHVtblBpblN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcywgdGhpcy5fcGlubmVkQ29sdW1ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5waW5uZWQgJiYgIWNvbHVtbi5waW5uZWQgJiYgIWNvbHVtblBpblN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcywgdGhpcy5fdW5waW5uZWRDb2x1bW5zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21vdmVDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zUmVvcmRlcmVkKGNvbHVtbiwgdGFyZ2V0KTtcblxuICAgICAgICB0aGlzLm9uQ29sdW1uTW92aW5nRW5kLmVtaXQoeyBzb3VyY2U6IGNvbHVtbiwgdGFyZ2V0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvZXMgdG8gdGhlIGRlc2lyZWQgcGFnZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEucGFnaW5hdGUoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbFxuICAgICAqL1xuICAgIHB1YmxpYyBwYWdpbmF0ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiB0aGlzLnRvdGFsUGFnZXMgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhZ2UgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbiBmb3IgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YC5cbiAgICAgKiBDYWxsaW5nIG1hcmtGb3JDaGVjayBhbHNvIHRyaWdnZXJzIHRoZSBncmlkIHBpcGVzIGV4cGxpY2l0bHksIHJlc3VsdGluZyBpbiBhbGwgdXBkYXRlcyBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogTWF5IGRlZ3JhZGUgcGVyZm9ybWFuY2UgaWYgdXNlZCB3aGVuIG5vdCBuZWVkZWQsIG9yIGlmIG1pc3VzZWQ6XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIERPTidUczpcbiAgICAgKiAvLyBkb24ndCBjYWxsIG1hcmtGb3JDaGVjayBmcm9tIGluc2lkZSBhIGxvb3BcbiAgICAgKiAvLyBkb24ndCBjYWxsIG1hcmtGb3JDaGVjayB3aGVuIGEgcHJpbWl0aXZlIGhhcyBjaGFuZ2VkXG4gICAgICogZ3JpZC5kYXRhLmZvckVhY2gocmVjID0+IHtcbiAgICAgKiAgcmVjID0gbmV3VmFsdWU7XG4gICAgICogIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBET3NcbiAgICAgKiAvLyBjYWxsIG1hcmtGb3JDaGVjayBhZnRlciB1cGRhdGluZyBhIG5lc3RlZCBwcm9wZXJ0eVxuICAgICAqIGdyaWQuZGF0YS5mb3JFYWNoKHJlYyA9PiB7XG4gICAgICogIHJlYy5uZXN0ZWRQcm9wMS5uZXN0ZWRQcm9wMiA9IG5ld1ZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLm1hcmtGb3JDaGVjaygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXJrRm9yQ2hlY2soKSB7XG4gICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBiZWdpbkFkZFJvd0J5SW5kZXgocm93SUQ6IGFueSwgaW5kZXg6IG51bWJlciwgYXNDaGlsZD86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBncmlkIG11c3QgdXNlIHJvdyBlZGl0IG1vZGUgdG8gcGVyZm9ybSByb3cgYWRkaW5nISBQbGVhc2Ugc2V0IHJvd0VkaXRhYmxlIHRvIHRydWUuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmRFZGl0KHRydWUsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5jYW5jZWxBZGRNb2RlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzSW5QaW5uZWRBcmVhID0gdGhpcy5pc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KGluZGV4KTtcbiAgICAgICAgY29uc3QgcGluSW5kZXggPSB0aGlzLnBpbm5lZFJlY29yZHMuZmluZEluZGV4KHggPT4geFt0aGlzLnByaW1hcnlLZXldID09PSByb3dJRCk7XG4gICAgICAgIGNvbnN0IHVucGluSW5kZXggPSB0aGlzLmdldFVucGlubmVkSW5kZXhCeUlkKHJvd0lEKTtcblxuICAgICAgICBpZiAodGhpcy5leHBhbnNpb25TdGF0ZXMuZ2V0KHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZVJvdyhyb3dJRCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZFJvd1BhcmVudCA9IHtcbiAgICAgICAgICAgIHJvd0lELFxuICAgICAgICAgICAgaW5kZXg6IGlzSW5QaW5uZWRBcmVhID8gcGluSW5kZXggOiB1bnBpbkluZGV4LFxuICAgICAgICAgICAgYXNDaGlsZCxcbiAgICAgICAgICAgIGlzUGlubmVkOiBpc0luUGlubmVkQXJlYVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGlmIChpc0luUGlubmVkQXJlYSkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkSGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3Um93SW5kZXggPSB0aGlzLmFkZFJvd1BhcmVudC5pbmRleCArIDE7XG4gICAgICAgIC8vIGVuc3VyZSBhZGRpbmcgcm93IGlzIGluIHZpZXcuXG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbCA9IHRoaXMubmF2aWdhdGlvbi5zaG91bGRQZXJmb3JtVmVydGljYWxTY3JvbGwobmV3Um93SW5kZXgsIC0xKTtcbiAgICAgICAgaWYgKHNob3VsZFNjcm9sbCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKG5ld1Jvd0luZGV4LCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3dCeUluZGV4KGluZGV4ICsgMSk7XG4gICAgICAgIHJvdy5hbmltYXRlQWRkID0gdHJ1ZTtcbiAgICAgICAgcm93Lm9uQW5pbWF0aW9uRW5kLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHJvdy5hbmltYXRlQWRkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNlbGxzLmZpbmQoYyA9PiBjLmVkaXRhYmxlKTtcbiAgICAgICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnN1Ym1pdF92YWx1ZShldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbnRlckVkaXRNb2RlKGNlbGwsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICBjZWxsLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCBhZGRzIHRoZSBkYXRhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEuYWRkUm93KHJlY29yZCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUm93KGRhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBjb21taXQgcGVuZGluZyBzdGF0ZXMgcHJpb3IgdG8gYWRkaW5nIGEgcm93XG4gICAgICAgIHRoaXMuZW5kRWRpdCh0cnVlKTtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmFkZFJvd1RvRGF0YShkYXRhKTtcblxuICAgICAgICB0aGlzLm9uUm93QWRkZWQuZW1pdCh7IGRhdGEgfSk7XG4gICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSByZWNvcmQgYnkgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIGBwcmltYXJ5S2V5YCBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogVGhlIG1ldGhvZCBhY2NlcHQgcm93U2VsZWN0b3IgYXMgYSBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSByb3dJRC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLmRlbGV0ZVJvdygwKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93U2VsZWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlUm93KHJvd1NlbGVjdG9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucHJpbWFyeUtleSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVSb3dCeUlkKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGRlbGV0ZVJvd0J5SWQocm93SWQ6IGFueSkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuZGVsZXRlUm93QnlJZChyb3dJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHJlY29yZCBieSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhhdCB0aGUgYHByaW1hcnlLZXlgIHByb3BlcnR5IGlzIHNldC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWRXaXRoUEsudXBkYXRlQ2VsbCgnVXBkYXRlZCcsIDEsICdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIHdoaWNoIGlzIHRvIGJlIHNldC5cbiAgICAgKiBAcGFyYW0gcm93U2VsZWN0b3IgY29ycmVzcG9uZHMgdG8gcm93SUQuXG4gICAgICogQHBhcmFtIGNvbHVtbiBjb3JyZXNwb25kcyB0byBjb2x1bW4gZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUNlbGwodmFsdWU6IGFueSwgcm93U2VsZWN0b3I6IGFueSwgY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZWZpbmVkKHRoaXMucHJpbWFyeUtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sdW1uTGlzdC50b0FycmF5KCkuZmluZChjID0+IGMuZmllbGQgPT09IGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgLy8gU2ltcGxpZnlcbiAgICAgICAgICAgICAgICBjb25zdCByb3dEYXRhID0gdGhpcy5ncmlkQVBJLmdldFJvd0RhdGEocm93U2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaW5kZXhfaW5fZGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgLy8gSWYgcm93IHBhc3NlZCBpcyBpbnZhbGlkXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0ge1xuICAgICAgICAgICAgICAgICAgICByb3dJRDogcm93U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbklEOiBjb2wuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3IElneENlbGwoaWQsIGluZGV4LCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSwgcm93RGF0YVtjb2wuZmllbGRdLCByb3dEYXRhLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5ncmlkQVBJLnVwZGF0ZV9jZWxsKGNlbGwsIHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNydWRTZXJ2aWNlLmNlbGwgJiYgdGhpcy5jcnVkU2VydmljZS5zYW1lQ2VsbChjZWxsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmV4aXRDZWxsRWRpdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnlcbiAgICAgKiByb3dTZWxlY3RvciBwYXJhbWV0ZXIgYW5kIHRoZSBkYXRhIHNvdXJjZSByZWNvcmQgd2l0aCB0aGUgcGFzc2VkIHZhbHVlLlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYXBwbHkgcmVxdWVzdGVkIHVwZGF0ZSBvbmx5IGlmIHByaW1hcnkga2V5IGlzIHNwZWNpZmllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLnVwZGF0ZVJvdyh7XG4gICAgICogICAgICAgUHJvZHVjdElEOiAxLCBQcm9kdWN0TmFtZTogJ1NwZWFybWludCcsIEluU3RvY2s6IHRydWUsIFVuaXRzSW5TdG9jazogMSwgT3JkZXJEYXRlOiBuZXcgRGF0ZSgnMjAwNS0wMy0yMScpXG4gICAgICogICB9LCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gcm93U2VsZWN0b3IgY29ycmVzcG9uZCB0byByb3dJRFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVSb3codmFsdWU6IGFueSwgcm93U2VsZWN0b3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQodGhpcy5wcmltYXJ5S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgZWRpdGFibGVDZWxsID0gdGhpcy5jcnVkU2VydmljZS5jZWxsO1xuICAgICAgICAgICAgaWYgKGVkaXRhYmxlQ2VsbCAmJiBlZGl0YWJsZUNlbGwuaWQucm93SUQgPT09IHJvd1NlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5leGl0Q2VsbEVkaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IG5ldyBJZ3hSb3cocm93U2VsZWN0b3IsIC0xLCB0aGlzLmdyaWRBUEkuZ2V0Um93RGF0YShyb3dTZWxlY3RvciksIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnVwZGF0ZV9yb3cocm93LCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IGZpeCBmb3IgIzU5MzQgYW5kIHByb2JhYmx5IGJyZWFrIGZvciAjNTc2M1xuICAgICAgICAgICAgLy8gY29uc2lkZXIgYWRkaW5nIG9mIHRoaXJkIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIGluIHVwZGF0ZVJvdy5cbiAgICAgICAgICAgIC8vIElmIGRldmVsb3BlciBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKHRydWUpLCBhbmRcbiAgICAgICAgICAgIC8vIHZpc2UtdmVyc2EgaWYgZGV2ZWxvcGVyIHNldCBpdCB0byBmYWxzZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKGZhbHNlKS5cbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgc2hvdWxkIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcm93IGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIHByaW1hcnkga2V5IGlzIG5vdCBzcGVjaWZpZWQgdGhlIHJvdyBzZWxlY3RvciBtYXRjaCB0aGUgcm93IGRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZGF0YSA9IGdyaWQuZ2V0Um93RGF0YSg5NDc0MSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93RGF0YShyb3dTZWxlY3RvcjogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gcm93U2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaW5kZXhfaW5fZGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgIHJldHVybiBpbmRleCA8IDAgPyB7fSA6IGRhdGFbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvcnQgYSBzaW5nbGUgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNvcnQgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCdzIGBJZ3hDb2x1bW5Db21wb25lbnRgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcnJheSBvZiBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zb3J0KHsgZmllbGROYW1lOiBuYW1lLCBkaXI6IFNvcnRpbmdEaXJlY3Rpb24uQXNjLCBpZ25vcmVDYXNlOiBmYWxzZSB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc29ydChleHByZXNzaW9uOiBJU29ydGluZ0V4cHJlc3Npb24gfCBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNvcnRpbmdTdGF0ZSA9IGNsb25lQXJyYXkodGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMpO1xuXG4gICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWFjaCBvZiBleHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVhY2guZGlyID09PSBTb3J0aW5nRGlyZWN0aW9uLk5vbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnJlbW92ZV9ncm91cGluZ19leHByZXNzaW9uKGVhY2guZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnByZXBhcmVfc29ydGluZ19leHByZXNzaW9uKFtzb3J0aW5nU3RhdGVdLCBlYWNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uLmRpciA9PT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnJlbW92ZV9ncm91cGluZ19leHByZXNzaW9uKGV4cHJlc3Npb24uZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5wcmVwYXJlX3NvcnRpbmdfZXhwcmVzc2lvbihbc29ydGluZ1N0YXRlXSwgZXhwcmVzc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElTb3J0aW5nRXZlbnRBcmdzID0geyBvd25lcjogdGhpcywgc29ydGluZ0V4cHJlc3Npb25zOiBzb3J0aW5nU3RhdGUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5zb3J0aW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnRfbXVsdGlwbGUoZXhwcmVzc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkuc29ydChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5vblNvcnRpbmdEb25lLmVtaXQoZXhwcmVzc2lvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYSBzaW5nbGUgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgZmlsdGVyKHRlcm0pIHtcbiAgICAgKiAgICAgIHRoaXMuZ3JpZC5maWx0ZXIoXCJQcm9kdWN0TmFtZVwiLCB0ZXJtLCBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKFwiY29udGFpbnNcIikpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqIEBwYXJhbSBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlXG4gICAgICogQHBhcmFtIGlnbm9yZUNhc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZT86IElGaWx0ZXJpbmdPcGVyYXRpb24gfCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBpZ25vcmVDYXNlPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyKG5hbWUsIHZhbHVlLCBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlLCBpZ25vcmVDYXNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGFsbCB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgaW4gdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCB3aXRoIHRoZSBzYW1lIGNvbmRpdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZmlsdGVyR2xvYmFsKCdzb21lJywgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbignY29udGFpbnMnKSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICogQHBhcmFtIGNvbmRpdGlvblxuICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlckdsb2JhbCh2YWx1ZTogYW55LCBjb25kaXRpb24sIGlnbm9yZUNhc2U/KSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJHbG9iYWwodmFsdWUsIGNvbmRpdGlvbiwgaWdub3JlQ2FzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBzdW1tYXJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uIGFuZCBhcHBsaWVzIHlvdXIgY3VzdG9tU3VtbWFyeS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgeW91IGRvIG5vdCBwcm92aWRlIHRoZSBjdXN0b21TdW1tYXJ5LCB0aGVuIHRoZSBkZWZhdWx0IHN1bW1hcnkgZm9yIHRoZSBjb2x1bW4gZGF0YSB0eXBlIHdpbGwgYmUgYXBwbGllZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmVuYWJsZVN1bW1hcmllcyhbeyBmaWVsZE5hbWU6ICdQcm9kdWN0TmFtZScgfSwgeyBmaWVsZE5hbWU6ICdJRCcgfV0pO1xuICAgICAqIGBgYFxuICAgICAqIEVuYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBsaXN0ZWQgY29sdW1ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmVuYWJsZVN1bW1hcmllcygnUHJvZHVjdE5hbWUnKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcmVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmFibGVTdW1tYXJpZXMoLi4ucmVzdCkge1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShyZXN0WzBdKSkge1xuICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGVTdW1tYXJpZXMocmVzdFswXSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMocmVzdFswXSwgdHJ1ZSwgcmVzdFsxXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHN1bW1hcmllcyBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmRpc2FibGVTdW1tYXJpZXMoJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEaXNhYmxlIHN1bW1hcmllcyBmb3IgdGhlIGxpc3RlZCBjb2x1bW5zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZGlzYWJsZVN1bW1hcmllcyhbeyBmaWVsZE5hbWU6ICdQcm9kdWN0TmFtZScgfV0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlU3VtbWFyaWVzKC4uLnJlc3QpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkocmVzdFswXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVNdWx0aXBsZVN1bW1hcmllcyhyZXN0WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhyZXN0WzBdLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhcnMgdGhlIGZpbHRlcmluZyBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogT3RoZXJ3aXNlIGNsZWFycyB0aGUgZmlsdGVyaW5nIHN0YXRlIG9mIGFsbCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyRmlsdGVyKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIobmFtZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJGaWx0ZXIobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmFtZSBpcyBwcm92aWRlZCwgY2xlYXJzIHRoZSBzb3J0aW5nIHN0YXRlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBvdGhlcndpc2UgY2xlYXJzIHRoZSBzb3J0aW5nIHN0YXRlIG9mIGFsbCBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY2xlYXJTb3J0KCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTb3J0KG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRpbmdFeHByZXNzaW9ucyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5ncmlkQVBJLmdldF9jb2x1bW5fYnlfbmFtZShuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5jbGVhcl9zb3J0KG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hHcmlkU3RhdGUoYXJncz8pIHtcbiAgICAgICAgdGhpcy5lbmRFZGl0KHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFdlIGhhdmUgcmV0dXJuIHZhbHVlcyBoZXJlLiBNb3ZlIHRoZW0gdG8gZXZlbnQgYXJncyA/P1xuXG4gICAgLyoqXG4gICAgICogUGlucyBhIGNvbHVtbiBieSBmaWVsZCBuYW1lLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Db2x1bW4oXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Db2x1bW4oY29sdW1uTmFtZTogc3RyaW5nIHwgSWd4Q29sdW1uQ29tcG9uZW50LCBpbmRleD8pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29sID0gY29sdW1uTmFtZSBpbnN0YW5jZW9mIElneENvbHVtbkNvbXBvbmVudCA/IGNvbHVtbk5hbWUgOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICAgICAgcmV0dXJuIGNvbC5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucGlucyBhIGNvbHVtbiBieSBmaWVsZCBuYW1lLiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpbkNvbHVtbihcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIHVucGluQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgaW5kZXg/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wudW5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpbiB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucGluUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSByb3cgaW4gdGhlIHBpbm5lZCBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Sb3cocm93SUQ6IGFueSwgaW5kZXg/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKHJvd0lEKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19ieV9rZXkocm93SUQpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSVBpblJvd0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIGluc2VydEF0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgaXNQaW5uZWQ6IHRydWUsXG4gICAgICAgICAgICByb3dJRCxcbiAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblJvd1Bpbm5pbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gdHlwZW9mIGV2ZW50QXJncy5pbnNlcnRBdEluZGV4ID09PSAnbnVtYmVyJyA/IGV2ZW50QXJncy5pbnNlcnRBdEluZGV4IDogdGhpcy5fcGlubmVkUmVjb3JkSURzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fcGlubmVkUmVjb3JkSURzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgcm93SUQpO1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5waW4gdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnVucGluUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpblJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfYnlfa2V5KHJvd0lEKTtcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJUGluUm93RXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgaXNQaW5uZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcm93SUQsXG4gICAgICAgICAgICByb3csXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25Sb3dQaW5uaW5nLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9waW5uZWRSZWNvcmRJRHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5fcGlwZVRyaWdnZXIrKztcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMucGluQ29udGFpbmVyID8gdGhpcy5waW5Db250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgOiAwO1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQaW5uZWRSZWNvcmRzID8gY29udGFpbmVySGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvdGFsSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxjSGVpZ2h0ID8gdGhpcy5jYWxjSGVpZ2h0ICsgdGhpcy5waW5uZWRSb3dIZWlnaHQgOiB0aGlzLmNhbGNIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhdGVzIGdyaWQgd2lkdGgvaGVpZ2h0IGRpbWVuc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNob3VsZCBiZSBydW4gd2hlbiBjaGFuZ2luZyBET00gZWxlbWVudHMgZGltZW50aW9ucyBtYW51YWxseSB0aGF0IGFmZmVjdCB0aGUgZ3JpZCdzIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnJlZmxvdygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZsb3coKSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyBpbiB0aGUgZ3JpZCBhbmQgc2Nyb2xscyB0byB0aGUgY2VsbCBpZiBpdCBpc24ndCB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmZpbmROZXh0KFwiZmluYW5jaWFsXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIG9wdGlvbmFsbHksIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICogQHBhcmFtIGV4YWN0TWF0Y2ggb3B0aW9uYWxseSwgaWYgdGhlIHRleHQgc2hvdWxkIG1hdGNoIHRoZSBlbnRpcmUgdmFsdWUgIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICovXG4gICAgcHVibGljIGZpbmROZXh0KHRleHQ6IHN0cmluZywgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIGV4YWN0TWF0Y2g/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0ZXh0LCAxLCBjYXNlU2Vuc2l0aXZlLCBleGFjdE1hdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgcHJldmlvdXMgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyBpbiB0aGUgZ3JpZCBhbmQgc2Nyb2xscyB0byB0aGUgY2VsbCBpZiBpdCBpc24ndCB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmZpbmRQcmV2KFwiZmluYW5jaWFsXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIG9wdGlvbmFsbHksIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICogQHBhcmFtIGV4YWN0TWF0Y2ggb3B0aW9uYWxseSwgaWYgdGhlIHRleHQgc2hvdWxkIG1hdGNoIHRoZSBlbnRpcmUgdmFsdWUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZFByZXYodGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRleHQsIC0xLCBjYXNlU2Vuc2l0aXZlLCBleGFjdE1hdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFwcGxpZXMgdGhlIGV4aXN0aW5nIHNlYXJjaC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgZ3JpZCBjb250YWlucyB0aGUgbGFzdCBzZWFyY2guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnJlZnJlc2hTZWFyY2goKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdXBkYXRlQWN0aXZlSW5mb1xuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoU2VhcmNoKHVwZGF0ZUFjdGl2ZUluZm8/OiBib29sZWFuLCBlbmRFZGl0ID0gdHJ1ZSk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZE1hdGNoQ2FjaGUoKTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZUFjdGl2ZUluZm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbmZvID0gSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUuZm9yRWFjaCgobWF0Y2gsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmNvbHVtbiA9PT0gYWN0aXZlSW5mby5jb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLnJvdyA9PT0gYWN0aXZlSW5mby5yb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLmluZGV4ID09PSBhY3RpdmVJbmZvLmluZGV4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFwcyhtYXRjaC5tZXRhZGF0YSwgYWN0aXZlSW5mby5tZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoLFxuICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGVuZEVkaXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0aGUgaGlnaGxpZ2h0cyBpbiB0aGUgY2VsbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhclNlYXJjaCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlYXJjaCgpIHtcbiAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgICAgICBtYXRjaEluZm9DYWNoZTogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYy5jbGVhckhpZ2hsaWdodCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIHNvcnRhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzb3J0YWJsZUdyaWQgPSB0aGlzLmdyaWQuaGFzU29ydGFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzU29ydGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLnNvcnRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIGVkaXRhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBlZGl0YWJsZUdyaWQgPSB0aGlzLmdyaWQuaGFzRWRpdGFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRWRpdGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLmVkaXRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIGZpbHRlcmFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpbHRlcmFibGVHcmlkID0gdGhpcy5ncmlkLmhhc0ZpbHRlcmFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRmlsdGVyYWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3Quc29tZSgoY29sKSA9PiBjb2wuZmlsdGVyYWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBzdW1tYXJpemVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzdW1tYXJpemVkR3JpZCA9IHRoaXMuZ3JpZC5oYXNTdW1tYXJpemVkQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcml6ZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzdW1tYXJpemVkQ29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoY29sID0+IGNvbC5oYXNTdW1tYXJ5ICYmICFjb2wuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHN1bW1hcml6ZWRDb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3RTdW1tYXJpZXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlICE9PSBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZS5jaGlsZExldmVsc09ubHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1Zpc2libGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5faGFzVmlzaWJsZUNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdCA/IHRoaXMuY29sdW1uTGlzdC5zb21lKGMgPT4gIWMuaGlkZGVuKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDb2x1bW5zKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgbW92ZWFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG1vdmFibGVHcmlkID0gdGhpcy5ncmlkLmhhc01vdmFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzTW92YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QgJiYgdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLm1vdmFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgY29sdW1uIGdyb3Vwcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwR3JpZCA9IHRoaXMuZ3JpZC5oYXNDb2x1bW5Hcm91cHM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb2x1bW5Hcm91cHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5Hcm91cHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgY29sdW1uIGxheW91dHMgZm9yIG11bHRpLXJvdyBsYXlvdXQgZGVmaW5pdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxheW91dEdyaWQgPSB0aGlzLmdyaWQuaGFzQ29sdW1uTGF5b3V0cztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0NvbHVtbkxheW91dHMoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuY29sdW1uTGlzdC5zb21lKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBgSWd4R3JpZENlbGxDb21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0aGlzLmdyaWQuc2VsZWN0ZWRDZWxscztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ2VsbHMoKTogSWd4R3JpZENlbGxDb21wb25lbnRbXSB8IGFueVtdIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFSb3dMaXN0Lm1hcCgocm93KSA9PiByb3cuY2VsbHMuZmlsdGVyKChjZWxsKSA9PiBjZWxsLnNlbGVjdGVkKSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbXVsdGlSb3dMYXlvdXRSb3dTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHJvd0Jhc2VkSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhTGVuZ3RoICogdGhpcy5yb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgaXNQZXJjZW50V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoICYmIHRoaXMud2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNQZXJjZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0ICYmIHRoaXMuX2hlaWdodC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gdGhpcy5kYXRhTGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFJvd0hlaWdodCAqIE1hdGgubWluKHRoaXMuX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIsXG4gICAgICAgICAgICB0aGlzLnBhZ2luZyA/IE1hdGgubWluKGFsbEl0ZW1zLCB0aGlzLnBlclBhZ2UpIDogYWxsSXRlbXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVGhlIHJvd0hlaWdodCBpbnB1dCBpcyBib3VuZCB0byBtaW4taGVpZ2h0IGNzcyBwcm9wIG9mIHJvd3MgdGhhdCBhZGRzIGEgMXB4IGJvcmRlciBpbiBhbGwgY2FzZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlbmRlcmVkUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodCArIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG91dGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgPyB0aGlzLmNhbGNXaWR0aCArIHRoaXMuc2Nyb2xsU2l6ZSA6IHRoaXMuY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgdmlzaWJsZSBjb250ZW50IGhlaWdodCB0aGF0IGluY2x1ZGVzIGhlYWRlciArIHRib2R5ICsgZm9vdGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWaXNpYmxlQ29udGVudEhlaWdodCgpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgKyB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5oYXNTdW1tYXJpemVkQ29sdW1ucykge1xuICAgICAgICAgICAgaGVpZ2h0ICs9IHRoaXMudGZvb3QubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQb3NzaWJsZUNvbHVtbldpZHRoKGJhc2VXaWR0aDogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICBsZXQgY29tcHV0ZWRXaWR0aDtcbiAgICAgICAgaWYgKGJhc2VXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IGJhc2VXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSB0aGlzLmNhbGNXaWR0aCB8fFxuICAgICAgICAgICAgICAgIHBhcnNlSW50KHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyksIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXB1dGVkV2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ29sdW1uIGxheW91dHMgcmVsYXRlZFxuICAgICAgICBsZXQgdmlzaWJsZUNvbHMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uQmxvY2tzID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29uc3QgY29sc1BlckJsb2NrID0gY29sdW1uQmxvY2tzLm1hcChibG9jayA9PiBibG9jay5nZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyhibG9jay5jaGlsZHJlbikpO1xuICAgICAgICBjb25zdCBjb21iaW5lZEJsb2Nrc1NpemUgPSBjb2xzUGVyQmxvY2sucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIGl0ZW0ubGVuZ3RoLCAwKTtcbiAgICAgICAgY29sc1BlckJsb2NrLmZvckVhY2goYmxvY2tDb2xzID0+IHZpc2libGVDb2xzID0gdmlzaWJsZUNvbHMuY29uY2F0KGJsb2NrQ29scykpO1xuICAgICAgICAvL1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNXaXRoU2V0V2lkdGhzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHZpc2libGVDb2xzLmZpbHRlcihjID0+IGMud2lkdGhTZXRCeVVzZXIpIDpcbiAgICAgICAgICAgIHZpc2libGVDaGlsZENvbHVtbnMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlcik7XG5cbiAgICAgICAgY29uc3QgY29sdW1uc1RvU2l6ZSA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICBjb21iaW5lZEJsb2Nrc1NpemUgLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGggOlxuICAgICAgICAgICAgdmlzaWJsZUNoaWxkQ29sdW1ucy5sZW5ndGggLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHN1bUV4aXN0aW5nV2lkdGhzID0gY29sdW1uc1dpdGhTZXRXaWR0aHNcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xXaWR0aCA9IGN1cnIud2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGhWYWx1ZSA9IHBhcnNlSW50KGNvbFdpZHRoLCAxMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycldpZHRoID0gY29sV2lkdGggJiYgdHlwZW9mIGNvbFdpZHRoID09PSAnc3RyaW5nJyAmJiBjb2xXaWR0aC5pbmRleE9mKCclJykgIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgd2lkdGhWYWx1ZSAvIDEwMCAqIGNvbXB1dGVkV2lkdGggOlxuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3VycldpZHRoO1xuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiBhbGwgY29sdW1ucyBhcmUgaGlkZGVuLCByZXR1cm4gMHB4IHdpZHRoXG4gICAgICAgIGlmICghc3VtRXhpc3RpbmdXaWR0aHMgJiYgIWNvbHVtbnNUb1NpemUpIHtcbiAgICAgICAgICAgIHJldHVybiAnMHB4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5mbG9vcighTnVtYmVyLmlzRmluaXRlKHN1bUV4aXN0aW5nV2lkdGhzKSA/XG4gICAgICAgICAgICBNYXRoLm1heChjb21wdXRlZFdpZHRoIC8gY29sdW1uc1RvU2l6ZSwgTUlOSU1VTV9DT0xVTU5fV0lEVEgpIDpcbiAgICAgICAgICAgIE1hdGgubWF4KChjb21wdXRlZFdpZHRoIC0gc3VtRXhpc3RpbmdXaWR0aHMpIC8gY29sdW1uc1RvU2l6ZSwgTUlOSU1VTV9DT0xVTU5fV0lEVEgpKTtcblxuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGggKyAncHgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc1ZlcnRpY2FsU2Nyb2xsKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsYWJsZSA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIgPyB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlzU2Nyb2xsYWJsZSgpIDogZmFsc2U7XG4gICAgICAgIHJldHVybiAhISh0aGlzLmNhbGNXaWR0aCAmJiB0aGlzLmRhdGFWaWV3ICYmIHRoaXMuZGF0YVZpZXcubGVuZ3RoID4gMCAmJiBpc1Njcm9sbGFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZmMgPSB0YWtlSGlkZGVuID8gdGhpcy5fcGlubmVkQ29sdW1ucyA6IHRoaXMucGlubmVkQ29sdW1ucztcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGZjKSB7XG4gICAgICAgICAgICBpZiAoY29sLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHBhcnNlSW50KGNvbC5jYWxjV2lkdGgsIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1Bpbm5pbmdUb1N0YXJ0KSB7XG4gICAgICAgICAgICBzdW0gKz0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25seVRvcExldmVsKGFycikge1xuICAgICAgICByZXR1cm4gYXJyLmZpbHRlcihjID0+IGMubGV2ZWwgPT09IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzQ29sdW1uR3JvdXBlZChmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25IZWFkZXJTZWxlY3RvckNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyUm93U2VsZWN0aW9uKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGxSb3dzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkU2VsZWN0b3JCYXNlQXJpYUxhYmVsKCkge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSA/ICdEZXNlbGVjdCBhbGwgZmlsdGVyZWQnIDogJ1NlbGVjdCBhbGwgZmlsdGVyZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpID8gJ0Rlc2VsZWN0IGFsbCcgOiAnU2VsZWN0IGFsbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxSb3dzQ291bnRBZnRlckZpbHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hbGxEYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCBwaW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgcGlubmVkRGF0YVZpZXcgPSB0aGlzLmdyaWQucGlubmVkRGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWREYXRhVmlldygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5lZFJlY29yZHMgPyB0aGlzLnBpbm5lZFJlY29yZHMgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCB1bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBwaW5uZWREYXRhVmlldyA9IHRoaXMuZ3JpZC5waW5uZWREYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMgPyB0aGlzLnVucGlubmVkUmVjb3JkcyA6IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuaWd4Rm9yT2YgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHRyYW5zZm9ybWVkIHBhZ2VkL2ZpbHRlcmVkL3NvcnRlZC9ncm91cGVkL3Bpbm5lZC91bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBkYXRhVmlldyA9IHRoaXMuZ3JpZC5kYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFWaWV3KCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgP1xuICAgICAgICAgICAgWy4uLnRoaXMucGlubmVkRGF0YVZpZXcsIC4uLnRoaXMudW5waW5uZWREYXRhVmlld10gOlxuICAgICAgICAgICAgWy4uLnRoaXMudW5waW5uZWREYXRhVmlldywgLi4udGhpcy5waW5uZWREYXRhVmlld107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgY2xpY2tpbmcgb3ZlciBhIHJvdyBzaG91bGQgc2VsZWN0L2Rlc2VsZWN0IGl0XG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIHRydWVcbiAgICAgKiBAcGFyYW0gZW5hYmxlZDogYm9vbGVhblxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdFJvd09uQ2xpY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RSb3dPbkNsaWNrO1xuICAgIH1cblxuICAgIHNldCBzZWxlY3RSb3dPbkNsaWNrKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Um93T25DbGljayA9IGVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCByb3dzIGJ5IElELlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdFJvd3MoWzEsMiw1XSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEc1xuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdFJvd3Mocm93SURzOiBhbnlbXSwgY2xlYXJDdXJyZW50U2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcywgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc3BlY2lmaWVkIHJvd3MgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RSb3dzKFsxLDIsNV0pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgYWxsIHJvd3NcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpZiBmaWx0ZXJpbmcgaXMgaW4gcGxhY2UsIHNlbGVjdEFsbFJvd3MoKSBhbmQgZGVzZWxlY3RBbGxSb3dzKCkgc2VsZWN0L2Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCByb3dzLlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHBhcmFtZXRlciBvbmx5RmlsdGVyRGF0YSB0byBmYWxzZSB0aGF0IHdpbGwgc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0QWxsUm93cygpO1xuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKGZhbHNlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb25seUZpbHRlckRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhID8gdGhpcy5maWx0ZXJlZERhdGEgOiB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRydWUpO1xuICAgICAgICBjb25zdCByb3dJRHMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0Um93SURzKGRhdGEpLmZpbHRlcihySUQgPT4gIXRoaXMuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihySUQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIGFsbCByb3dzXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaWYgZmlsdGVyaW5nIGlzIGluIHBsYWNlLCBzZWxlY3RBbGxSb3dzKCkgYW5kIGRlc2VsZWN0QWxsUm93cygpIHNlbGVjdC9kZXNlbGVjdCBhbGwgZmlsdGVyZWQgcm93cy5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSBwYXJhbWV0ZXIgb25seUZpbHRlckRhdGEgdG8gZmFsc2UgdGhhdCB3aWxsIGRlc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxSb3dzKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9ubHlGaWx0ZXJEYXRhXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgaWYgKG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RSb3dzKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRSb3dJRHModGhpcy5maWx0ZXJlZERhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckNlbGxTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ1Njcm9sbChkaXI6IERyYWdTY3JvbGxEaXJlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSA0ODtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLmdldFNjcm9sbCgpO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIHN3aXRjaCAoZGlyKSB7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uTEVGVDpcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsLnNjcm9sbExlZnQgLT0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uUklHSFQ6XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5zY3JvbGxMZWZ0ICs9IHNjcm9sbERlbHRhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEcmFnU2Nyb2xsRGlyZWN0aW9uLlRPUDpcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbC5zY3JvbGxUb3AgLT0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uQk9UVE9NOlxuICAgICAgICAgICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCArPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRHJhZ1Njcm9sbERpcmVjdGlvbi5CT1RUT01MRUZUOlxuICAgICAgICAgICAgICAgIGhvcml6b250YWwuc2Nyb2xsTGVmdCAtPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbC5zY3JvbGxUb3AgKz0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uQk9UVE9NUklHSFQ6XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5zY3JvbGxMZWZ0ICs9IHNjcm9sbERlbHRhO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCArPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRHJhZ1Njcm9sbERpcmVjdGlvbi5UT1BMRUZUOlxuICAgICAgICAgICAgICAgIGhvcml6b250YWwuc2Nyb2xsTGVmdCAtPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbC5zY3JvbGxUb3AgLT0gc2Nyb2xsRGVsdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERyYWdTY3JvbGxEaXJlY3Rpb24uVE9QUklHSFQ6XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5zY3JvbGxMZWZ0ICs9IHNjcm9sbERlbHRhO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCAtPSBzY3JvbGxEZWx0YTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEZWZpbmVkKGFyZzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhcmcgIT09IHVuZGVmaW5lZCAmJiBhcmcgIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0UmFuZ2UoYXJnOiBHcmlkU2VsZWN0aW9uUmFuZ2UgfCBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2VsbFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYXJnLmZvckVhY2gocmFuZ2UgPT4gdGhpcy5zZXRTZWxlY3Rpb24ocmFuZ2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uVG9WaXNpYmxlSW5kZXgoZmllbGQ6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCkudmlzaWJsZUluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGVjdGlvbihyYW5nZTogR3JpZFNlbGVjdGlvblJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHsgcm93OiByYW5nZS5yb3dTdGFydCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtblN0YXJ0KSB9O1xuICAgICAgICBjb25zdCBlbmROb2RlID0geyByb3c6IHJhbmdlLnJvd0VuZCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtbkVuZCkgfTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlLm5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSYW5nZShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFkZFJhbmdlTWV0YShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmluaXRQb2ludGVyU3RhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZFJhbmdlcygpOiBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UucmFuZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY3VycmVudCBjZWxsIHNlbGVjdGlvbiBpbiB0aGUgZm9ybSBvZiBgW3sgY29sdW1uLmZpZWxkOiBjZWxsLnZhbHVlIH0sIC4uLl1gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgZm9ybWF0dGVyc2AgaXMgZW5hYmxlZCwgdGhlIGNlbGwgdmFsdWUgd2lsbCBiZSBmb3JtYXR0ZWQgYnkgaXRzIHJlc3BlY3RpdmUgY29sdW1uIGZvcm1hdHRlciAoaWYgYW55KS5cbiAgICAgKiBJZiBgaGVhZGVyc2AgaXMgZW5hYmxlZCwgaXQgd2lsbCB1c2UgdGhlIGNvbHVtbiBoZWFkZXIgKGlmIGFueSkgaW5zdGVhZCBvZiB0aGUgY29sdW1uIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZERhdGEoZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjdXJyZW50IHNlbGVjdGVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBzZWxlY3RlZCBjb2x1bW5zXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5zZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICByZXR1cm4gZmllbGRzLm1hcChmaWVsZCA9PiB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZCkpLmZpbHRlcihmaWVsZCA9PiBmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKiBAcGFyYW0gY2xlYXJDdXJyZW50U2VsZWN0aW9uIGlmIHRydWUgY2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgSWd4Q29sdW1uQ29tcG9uZW50W10sIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGZpZWxkVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY29sdW1uc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgSWd4Q29sdW1uQ29tcG9uZW50W10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb1NlbGVjdCA9IFsuLi5maWVsZFRvU2VsZWN0LCAuLi5jaGlsZHJlbl07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb1NlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9TZWxlY3QsIGNsZWFyQ3VycmVudFNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zIGJ5IGZpbGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0Q29sdW1ucyhbJ0lEJywnTmFtZSddKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbnMoY29sdW1uczogc3RyaW5nW10gfCBJZ3hDb2x1bW5Db21wb25lbnRbXSkge1xuICAgICAgICBsZXQgZmllbGRUb0Rlc2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgSWd4Q29sdW1uQ29tcG9uZW50W10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb0Rlc2VsZWN0ID0gWy4uLmZpZWxkVG9EZXNlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9EZXNlbGVjdCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGFsbCBjb2x1bW5zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgY29sdW1ucyBzZWxlY3Rpb24gaW4gdGhlIGZvcm0gb2YgYFt7IGNvbHVtbi5maWVsZDogY2VsbC52YWx1ZSB9LCAuLi5dYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGZvcm1hdHRlcnNgIGlzIGVuYWJsZWQsIHRoZSBjZWxsIHZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IGl0cyByZXNwZWN0aXZlIGNvbHVtbiBmb3JtYXR0ZXIgKGlmIGFueSkuXG4gICAgICogSWYgYGhlYWRlcnNgIGlzIGVuYWJsZWQsIGl0IHdpbGwgdXNlIHRoZSBjb2x1bW4gaGVhZGVyIChpZiBhbnkpIGluc3RlYWQgb2YgdGhlIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb2x1bW5zRGF0YShmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSA/IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhIDogdGhpcy5kYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21Db2x1bW5zU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbWJpbmVTZWxlY3RlZENlbGxBbmRDb2x1bW5EYXRhKGNvbHVtbkRhdGE6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycywgY29sdW1uRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmVudENvbnRhaW5lclNjcm9sbCA9IChldnQpID0+IHtcbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmFkZFNjcm9sbFRvcChldnQudGFyZ2V0LnNjcm9sbFRvcCk7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsTGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb24gKz0gZXZ0LnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvcHlIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuZ3JpZEFQSS5ncmlkLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBjb25zdCBjb2x1bW5EYXRhID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnNEYXRhKHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycywgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb3B5Jyl7XG4gICAgICAgICAgICBzZWxlY3RlZERhdGEgPSB0aGlzLmdldFNlbGVjdGVkRGF0YSh0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0tleUMnICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xhc3NOYW1lID09PSAnaWd4LWdyaWRfX3RoZWFkLXdyYXBwZXInKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgc2VsZWN0ZWREYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5jb21iaW5lU2VsZWN0ZWRDZWxsQW5kQ29sdW1uRGF0YShjb2x1bW5EYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YVswXSwgZGF0YVsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gY29sdW1uRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0lFKCkpIHtcbiAgICAgICAgICAgICAgICAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCdUZXh0JywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChyZXN1bHQpLnRoZW4oKS5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuZW5hYmxlZCB8fCB0aGlzLmNydWRTZXJ2aWNlLmNlbGxJbkVkaXRNb2RlIHx8ICghaXNJRSgpICYmIGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0lFKCkpIHtcbiAgICAgICAgICAgICAgICAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCdUZXh0JywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhLCBrZXlzPykge1xuICAgICAgICBjb25zdCBldiA9IHsgZGF0YSwgY2FuY2VsOiBmYWxzZSB9IGFzIElHcmlkQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgIHRoaXMub25HcmlkQ29weS5lbWl0KGV2KTtcblxuICAgICAgICBpZiAoZXYuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhKGV2LmRhdGEsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5zZXBhcmF0b3IpO1xuICAgICAgICBsZXQgcmVzdWx0ID0ga2V5cyA/IHRyYW5zZm9ybWVyLnByZXBhcmVEYXRhKGtleXMpIDogdHJhbnNmb3JtZXIucHJlcGFyZURhdGEoKTtcblxuICAgICAgICBpZiAoIXRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQuaW5kZXhPZignXFxuJykgKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLyogTmVjZXNzYXJ5IGZvciB0aGUgaGllYXJhY2hpY2FsIGNhc2UgYnV0IHdpbGwgcHJvYmFibHkgaGF2ZSB0b1xuICAgICAgICAgICBjaGFuZ2UgaG93IGdldFNlbGVjdGVkRGF0YSBpcyBwcm9wYWdhdGVkIGluIHRoZSBoaWVhcmFjaGljYWwgZ3JpZFxuICAgICAgICAqL1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNob3dTbmFja2JhckZvcihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIuYWN0aW9uVGV4dCA9IGluZGV4ID09PSAtMSA/ICcnIDogdGhpcy5zbmFja2JhckFjdGlvblRleHQ7XG4gICAgICAgIHRoaXMubGFzdEFkZGVkUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGVzIHRvIGEgcG9zaXRpb24gaW4gdGhlIGdyaWQgYmFzZWQgb24gcHJvdmlkZWQgYHJvd2luZGV4YCBhbmQgYHZpc2libGVDb2x1bW5JbmRleGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsc28gY2FuIGV4ZWN1dGUgYSBjdXN0b20gbG9naWMgb3ZlciB0aGUgdGFyZ2V0IGVsZW1lbnQsXG4gICAgICogdGhyb3VnaCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB7IHRhcmdldFR5cGU6IEdyaWRLZXlkb3duVGFyZ2V0VHlwZSwgdGFyZ2V0OiBPYmplY3QgfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICB0aGlzLmdyaWQubmF2aWdhdGVUbygxMCwgMywgKGFyZ3MpID0+IHsgYXJncy50YXJnZXQubmF0aXZlRWxlbWVudC5mb2N1cygpOyB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVUbyhyb3dJbmRleDogbnVtYmVyLCB2aXNpYmxlQ29sSW5kZXggPSAtMSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSAodGhpcyBhcyBhbnkpLnRvdGFsSXRlbUNvdW50ID8/IHRoaXMuZGF0YVZpZXcubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKHJvd0luZGV4IDwgMCB8fCByb3dJbmRleCA+IHRvdGFsSXRlbXMgfHwgKHZpc2libGVDb2xJbmRleCAhPT0gLTFcbiAgICAgICAgICAgICYmIHRoaXMuY29sdW1uTGlzdC5tYXAoY29sID0+IGNvbC52aXNpYmxlSW5kZXgpLmluZGV4T2YodmlzaWJsZUNvbEluZGV4KSA9PT0gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2Uocm93SW5kZXgsIHJvd0luZGV4ICsgMSkuZmluZChyZWMgPT4gcmVjLmV4cHJlc3Npb24gfHwgcmVjLmNoaWxkR3JpZHNEYXRhKSkge1xuICAgICAgICAgICAgdmlzaWJsZUNvbEluZGV4ID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCByb3cgaXMgcGlubmVkIG5vIG5lZWQgdG8gc2Nyb2xsIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbFZlcnRpY2FsbHkgPSB0aGlzLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybVZlcnRpY2FsU2Nyb2xsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBjb25zdCBzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkgPSB0aGlzLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybUhvcml6b250YWxTY3JvbGwodmlzaWJsZUNvbEluZGV4LCByb3dJbmRleCk7XG4gICAgICAgIGlmIChzaG91bGRTY3JvbGxWZXJ0aWNhbGx5KSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybVZlcnRpY2FsU2Nyb2xsVG9DZWxsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsSG9yaXpvbnRhbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtSG9yaXpvbnRhbFNjcm9sbFRvQ2VsbCh2aXNpYmxlQ29sSW5kZXgsICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtSG9yaXpvbnRhbFNjcm9sbFRvQ2VsbCh2aXNpYmxlQ29sSW5kZXgsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsVmVydGljYWxseSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybVZlcnRpY2FsU2Nyb2xsVG9DZWxsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYElDZWxsUG9zaXRpb25gIHdoaWNoIGRlZmluZXMgdGhlIG5leHQgY2VsbCxcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24sIHRoYXQgbWF0Y2ggc3BlY2lmaWMgY3JpdGVyaWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFlvdSBjYW4gcGFzcyBjYWxsYmFjayBmdW5jdGlvbiBhcyBhIHRoaXJkIHBhcmFtZXRlciBvZiBgZ2V0UHJldmlvdXNDZWxsYCBtZXRob2QuXG4gICAgICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFjY2VwdHMgSWd4Q29sdW1uQ29tcG9uZW50IGFzIGEgcGFyYW1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgY29uc3QgbmV4dEVkaXRhYmxlQ2VsbFBvc2l0aW9uID0gdGhpcy5ncmlkLmdldE5leHRDZWxsKDAsIDMsIChjb2x1bW4pID0+IGNvbHVtbi5lZGl0YWJsZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldE5leHRDZWxsKGN1cnJSb3dJbmRleDogbnVtYmVyLCBjdXJWaXNpYmxlQ29sSW5kZXg6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChJZ3hDb2x1bW5Db21wb25lbnQpID0+IGJvb2xlYW4gPSBudWxsKTogSUNlbGxQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwICYmIGNvbC52aXNpYmxlSW5kZXggPj0gMCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQb3NpdGlvbihjdXJyUm93SW5kZXgsIGN1clZpc2libGVDb2xJbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sSW5kZXhlcyA9IGNhbGxiYWNrID8gY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY2FsbGJhY2soY29sKSkubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSA6XG4gICAgICAgICAgICBjb2x1bW5zLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IG5leHRDZWxsSW5kZXggPSBjb2xJbmRleGVzLmZpbmQoaW5kZXggPT4gaW5kZXggPiBjdXJWaXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zbGljZShjdXJyUm93SW5kZXgsIGN1cnJSb3dJbmRleCArIDEpXG4gICAgICAgICAgICAuZmluZChyZWMgPT4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSkgJiYgbmV4dENlbGxJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IG5leHRDZWxsSW5kZXggfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb2xJbmRleGVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4KSA9PT0gY3VyclJvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgpLCB2aXNpYmxlQ29sdW1uSW5kZXg6IGNvbEluZGV4ZXNbMF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYElDZWxsUG9zaXRpb25gIHdoaWNoIGRlZmluZXMgdGhlIHByZXZpb3VzIGNlbGwsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGF0IG1hdGNoIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgY2FuIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYSB0aGlyZCBwYXJhbWV0ZXIgb2YgYGdldFByZXZpb3VzQ2VsbGAgbWV0aG9kLlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhY2NlcHRzIElneENvbHVtbkNvbXBvbmVudCBhcyBhIHBhcmFtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IHByZXZpb3VzRWRpdGFibGVDZWxsUG9zaXRpb24gPSB0aGlzLmdyaWQuZ2V0UHJldmlvdXNDZWxsKDAsIDMsIChjb2x1bW4pID0+IGNvbHVtbi5lZGl0YWJsZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFByZXZpb3VzQ2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cCAmJiBjb2wudmlzaWJsZUluZGV4ID49IDApO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUG9zaXRpb24oY3VyclJvd0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ZXMgPSBjYWxsYmFjayA/IGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNhbGxiYWNrKGNvbCkpLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBiIC0gYSkgOlxuICAgICAgICAgICAgY29sdW1ucy5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBjb25zdCBwcmV2Q2VsbEluZGV4ID0gY29sSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4IDwgY3VyVmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2UoY3VyclJvd0luZGV4LCBjdXJyUm93SW5kZXggKyAxKVxuICAgICAgICAgICAgLmZpbmQocmVjID0+ICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEpICYmIHByZXZDZWxsSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBwcmV2Q2VsbEluZGV4IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29sSW5kZXhlcy5sZW5ndGggPT09IDAgfHwgdGhpcy5nZXROZXh0RGF0YVJvd0luZGV4KGN1cnJSb3dJbmRleCwgdHJ1ZSkgPT09IGN1cnJSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4LCB0cnVlKSwgdmlzaWJsZUNvbHVtbkluZGV4OiBjb2xJbmRleGVzWzBdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFja0NvbHVtbkNoYW5nZXMoaW5kZXgsIGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmZpZWxkICsgY29sLl9jYWxjV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cGFuZGVkR3JvdXAoX2dyb3VwOiBJR3JvdXBCeVJlY29yZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9wZW5Sb3dPdmVybGF5KGlkKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkoaWQsIHRoaXMucm93TGlzdC5sZW5ndGggPD0gTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCk7XG5cbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5vcGVuKHRoaXMucm93RWRpdFNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5yb3dFZGl0aW5nV2hlZWxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlUm93RWRpdGluZ092ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMucm93RWRpdGluZ1doZWVsSGFuZGxlcik7XG4gICAgICAgIHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3BJbml0aWFsUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNsb3NlKCk7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShzaG93KSB7XG4gICAgICAgIGNvbnN0IHJvd1N0eWxlID0gdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnN0eWxlO1xuICAgICAgICBpZiAoc2hvdykge1xuICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwb3NpdGlvblJvd0VkaXRpbmdPdmVybGF5KHJvdzogSWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+KSB7XG4gICAgICAgIGlmIChyb3cgJiYgIXRoaXMucm93RWRpdGluZ092ZXJsYXkuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICBjb25zdCByb3dTdHlsZSA9IHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlO1xuICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KHJvdy5yb3dJRCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWNoZWRWaWV3TG9hZGVkKGFyZ3M6IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0hvcml6b250YWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgY29uc3QgdG1wbElkID0gYXJncy5jb250ZXh0LnRlbXBsYXRlSUQudHlwZTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYXJncy5jb250ZXh0LmluZGV4O1xuICAgICAgICAgICAgYXJncy52aWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdG1wbElkID09PSAnZGF0YVJvdycgPyB0aGlzLmdldFJvd0J5SW5kZXgoaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5Um93ID0gdG1wbElkID09PSAnc3VtbWFyeVJvdycgPyB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmluZCgoc3IpID0+IHNyLmRhdGFSb3dJbmRleCA9PT0gaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocm93ICYmIHJvdyBpbnN0YW5jZW9mIElneFJvd0RpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN0b3JlVmlydFN0YXRlKHJvdyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVWaXJ0U3RhdGUoc3VtbWFyeVJvdyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nKG92ZXJsYXlTZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncykge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG92ZXJsYXlTZXR0aW5ncyA/IG92ZXJsYXlTZXR0aW5ncyA6IHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzO1xuICAgICAgICBpZiAoIXRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncy50YXJnZXQgPVxuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkucm9vdEdyaWQgPyAodGhpcyBhcyBhbnkpLnJvb3RHcmlkLm5hdGl2ZUVsZW1lbnQgOiB0aGlzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmF0dGFjaChcbiAgICAgICAgICAgICAgICBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdG9yOiB0aGlzLnZpZXdSZWYuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogdGhpcy5yZXNvbHZlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcHBseUNoYW5nZXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhhcHBseUNoYW5nZXM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZ092ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nID0gYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcblxuICAgICAgICAgICAgaWYgKGFwcGx5Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nLmFwcGx5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbXB0eVJlY29yZE9iamVjdEZvcihyZWMpIHtcbiAgICAgICAgY29uc3Qgcm93ID0geyAuLi5yZWMgfTtcbiAgICAgICAgT2JqZWN0LmtleXMocm93KS5mb3JFYWNoKGtleSA9PiByb3dba2V5XSA9IHVuZGVmaW5lZCk7XG4gICAgICAgIHJvd1t0aGlzLnByaW1hcnlLZXldID0gdGhpcy5nZW5lcmF0ZVJvd0lEKCk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzSG9yaXpvbnRhbFNjcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxXaWR0aCAtIHRoaXMudW5waW5uZWRXaWR0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdW1tYXJ5Um93KHJvd0RhdGEpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJvd0RhdGEuc3VtbWFyaWVzICYmIChyb3dEYXRhLnN1bW1hcmllcyBpbnN0YW5jZW9mIE1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5kUm93VHJhbnNhY3Rpb24oY29tbWl0OiBib29sZWFuLCByb3c6IElneFJvdywgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICByb3cubmV3RGF0YSA9IHRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRWYWx1ZShyb3cuaWQsIHRydWUpO1xuICAgICAgICBsZXQgcm93RWRpdEFyZ3MgPSByb3cuY3JlYXRlRWRpdEV2ZW50QXJncyh0cnVlLCBldmVudCk7XG5cbiAgICAgICAgaWYgKCFjb21taXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLmVuZFBlbmRpbmcoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93RWRpdEFyZ3MgPSB0aGlzLmdyaWRBUEkudXBkYXRlX3Jvdyhyb3csIHJvdy5uZXdEYXRhLCBldmVudCk7XG4gICAgICAgICAgICBpZiAocm93RWRpdEFyZ3M/LmNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRSb3dFZGl0KCk7XG5cbiAgICAgICAgY29uc3Qgbm9uQ2FuY2VsYWJsZUFyZ3MgPSByb3cuY3JlYXRlRG9uZUVkaXRFdmVudEFyZ3Mocm93RWRpdEFyZ3Mub2xkVmFsdWUsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5yb3dFZGl0RXhpdC5lbWl0KG5vbkNhbmNlbGFibGVBcmdzKTtcbiAgICAgICAgdGhpcy5jbG9zZVJvd0VkaXRpbmdPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogUmVmYWN0b3JcbiAgICAvKipcbiAgICAgKiBGaW5pc2hlcyB0aGUgcm93IHRyYW5zYWN0aW9ucyBvbiB0aGUgY3VycmVudCByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBjb21taXQgPT09IHRydWVgLCBwYXNzZXMgdGhlbSBmcm9tIHRoZSBwZW5kaW5nIHN0YXRlIHRvIHRoZSBkYXRhIChvciB0cmFuc2FjdGlvbiBzZXJ2aWNlKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gaWd4QnV0dG9uIChjbGljayk9XCJncmlkLmVuZEVkaXQodHJ1ZSlcIj5Db21taXQgUm93PC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbW1pdFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmRFZGl0KGNvbW1pdCA9IHRydWUsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5jcnVkU2VydmljZS5yb3c7XG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmNydWRTZXJ2aWNlLmNlbGw7XG4gICAgICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgY3J1ZFNlcnZpY2Ugd2l0aCB3aXRoIEJhc2VBUEkgc2VydmljZVxuICAgICAgICBpZiAoIXJvdyAmJiAhY2VsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdz8uaXNBZGRSb3cpIHtcbiAgICAgICAgICAgIGNhbmNlbGVkID0gdGhpcy5lbmRBZGQoY29tbWl0LCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm4gY2FuY2VsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgICAgICBjYW5jZWxlZCA9IHRoaXMuZ3JpZEFQSS5zdWJtaXRfdmFsdWUoZXZlbnQpO1xuICAgICAgICAgICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmV4aXRDZWxsRWRpdChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYW5jZWxlZCA9IHRoaXMuY3J1ZFNlcnZpY2UuZXhpdFJvd0VkaXQoY29tbWl0LCBldmVudCk7XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2Uucm93RWRpdGluZ0Jsb2NrZWQgPSBjYW5jZWxlZDtcbiAgICAgICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGV2ZW50ICYmIGFjdGl2ZUNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gYWN0aXZlQ2VsbC5yb3c7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlQ29sSW5kZXggPSBhY3RpdmVDZWxsLmxheW91dCA/IGFjdGl2ZUNlbGwubGF5b3V0LmNvbHVtblZpc2libGVJbmRleCA6IGFjdGl2ZUNlbGwuY29sdW1uO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmRBZGQoY29tbWl0ID0gdHJ1ZSwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmNydWRTZXJ2aWNlLnJvdztcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuY3J1ZFNlcnZpY2UuY2VsbDtcbiAgICAgICAgY29uc3QgY2FjaGVkUm93RGF0YSA9IHsgLi4ucm93LmRhdGEgfTtcbiAgICAgICAgbGV0IGNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFyb3cgJiYgIWNlbGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgICAgICB0aGlzLm9uUm93QWRkZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKGFyZ3M6IElSb3dEYXRhRXZlbnRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGFyZ3MuZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWRJbmRleCA9IHRoaXMucGlubmVkUmVjb3Jkcy5maW5kSW5kZXgoeCA9PiB4W3RoaXMucHJpbWFyeUtleV0gPT09IHJvd0RhdGFbdGhpcy5wcmltYXJ5S2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gQSBjaGVjayB3aGV0aGVyIHRoZSByb3cgaXMgaW4gdGhlIGN1cnJlbnQgdmlld1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdJbmRleCA9IHBpbm5lZEluZGV4ICE9PSAtMSA/IHBpbm5lZEluZGV4IDogdGhpcy5maW5kUmVjb3JkSW5kZXhJblZpZXcocm93RGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEuZmluZEluZGV4KGRhdGEgPT4gZGF0YVt0aGlzLnByaW1hcnlLZXldID09PSByb3dEYXRhW3RoaXMucHJpbWFyeUtleV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5WaWV3ID0gdmlld0luZGV4ICE9PSAtMSAmJiAhdGhpcy5uYXZpZ2F0aW9uLnNob3VsZFBlcmZvcm1WZXJ0aWNhbFNjcm9sbCh2aWV3SW5kZXgsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dJbmRleCA9IGlzSW5WaWV3ID8gLTEgOiBkYXRhSW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U25hY2tiYXJGb3Ioc2hvd0luZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FuY2VsYWJsZSA9IHRoaXMuZ3JpZEFQSS5zdWJtaXRfYWRkX3ZhbHVlKGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSByb3cuY3JlYXRlRWRpdEV2ZW50QXJncyh0cnVlLCBldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0LmVtaXQoYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdzLmNhbmNlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLl9nZXRQYXJlbnRSZWNvcmRJZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5hZGRSb3dUb0RhdGEocm93LmRhdGEsIHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkb25lQXJncyA9IHJvdy5jcmVhdGVEb25lRWRpdEV2ZW50QXJncyhjYWNoZWRSb3dEYXRhLCBldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0RG9uZS5lbWl0KGRvbmVBcmdzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZFJvd0VkaXQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRSb3dQYXJlbnQuaXNQaW5uZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5Sb3cocm93LmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZFJvd1BhcmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEFkZE1vZGUgPSBjYW5jZWxhYmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5leGl0Q2VsbEVkaXQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxBZGRNb2RlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZFJvd0VkaXQoKTtcbiAgICAgICAgdGhpcy5jbG9zZVJvd0VkaXRpbmdPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuX3BpcGVUcmlnZ2VyKys7XG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxBZGRNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLm9uUm93QWRkZWQuZW1pdCh7IGRhdGE6IHJvdy5kYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vbkNhbmNlbGFibGVBcmdzID0gcm93LmNyZWF0ZURvbmVFZGl0RXZlbnRBcmdzKGNhY2hlZFJvd0RhdGEsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5yb3dFZGl0RXhpdC5lbWl0KG5vbkNhbmNlbGFibGVBcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsQWRkTW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZFJvd0VkaXQoY29tbWl0ID0gdHJ1ZSwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBjb25zdCBjYW5jZWxlZCA9IHRoaXMuZW5kRWRpdChjb21taXQsIGV2ZW50KTtcblxuICAgICAgICBpZiAoY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICBpZiAoYWN0aXZlQ2VsbCAmJiBhY3RpdmVDZWxsLnJvdyAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlclBpcGVzKCkge1xuICAgICAgICB0aGlzLl9waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5kQWRkUm93KCkge1xuICAgICAgICB0aGlzLmNhbmNlbEFkZE1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyaWdnZXJQaXBlcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB3cml0ZVRvRGF0YShyb3dJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIG1lcmdlT2JqZWN0cyh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKClbcm93SW5kZXhdLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ2V0UGFyZW50UmVjb3JkSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJvd1BhcmVudC5hc0NoaWxkID8gdGhpcy5hZGRSb3dQYXJlbnQucm93SUQgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbmRSZWNvcmRJbmRleEluVmlldyhyZWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVZpZXcuZmluZEluZGV4KGRhdGEgPT4gZGF0YVt0aGlzLnByaW1hcnlLZXldID09PSByZWNbdGhpcy5wcmltYXJ5S2V5XSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFVucGlubmVkSW5kZXhCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVucGlubmVkUmVjb3Jkcy5maW5kSW5kZXgoeCA9PiB4W3RoaXMucHJpbWFyeUtleV0gPT09IGlkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3RvcmVWaXJ0U3RhdGUocm93KSB7XG4gICAgICAgIC8vIGNoZWNrIHZpcnR1YWxpemF0aW9uIHN0YXRlIG9mIGRhdGEgcmVjb3JkIGFkZGVkIGZyb20gY2FjaGVcbiAgICAgICAgLy8gaW4gY2FzZSBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQgLSB1cGRhdGUgaXQuXG4gICAgICAgIGNvbnN0IHJvd0Zvck9mID0gcm93LnZpcnREaXJSb3c7XG4gICAgICAgIGNvbnN0IGdyaWRTY3JMZWZ0ID0gcm93Rm9yT2YuZ2V0U2Nyb2xsKCkuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgbGVmdCA9IC1wYXJzZUludChyb3dGb3JPZi5kYy5pbnN0YW5jZS5fdmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCwgMTApO1xuICAgICAgICBjb25zdCBhY3R1YWxTY3JvbGxMZWZ0ID0gbGVmdCArIHJvd0Zvck9mLmdldENvbHVtblNjcm9sbExlZnQocm93Rm9yT2Yuc3RhdGUuc3RhcnRJbmRleCk7XG4gICAgICAgIGlmIChncmlkU2NyTGVmdCAhPT0gYWN0dWFsU2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgcm93Rm9yT2Yub25IU2Nyb2xsKGdyaWRTY3JMZWZ0KTtcbiAgICAgICAgICAgIHJvd0Zvck9mLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEV4cG9ydEV4Y2VsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0RXhjZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFeHBvcnRDc3YoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRDc3Y7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbChyb3c6IElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPikge1xuICAgICAgICBpZiAoIXRoaXMucm93RWRpdGFibGUgfHwgIXRoaXMucm93RWRpdGluZ092ZXJsYXkgfHwgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRhdGEgYW5kL29yIGlzTG9hZGluZyBpbnB1dCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG92ZXJsYXkgY2FuIGJlXG4gICAgICogaGlkZGVuL3Nob3duIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNob3VsZE92ZXJsYXlMb2FkaW5nXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV2YWx1YXRlTG9hZGluZ1N0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRPdmVybGF5TG9hZGluZykge1xuICAgICAgICAgICAgLy8gYSBuZXcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd25cbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgIG91dGxldDogdGhpcy5sb2FkaW5nT3V0bGV0LFxuICAgICAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5KClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdPdmVybGF5Lm9wZW4ob3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ092ZXJsYXkuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGdyaWQgd2lkdGggaS5lLiB0aGlzLmNhbGNXaWR0aFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkV2lkdGgoKSB7XG4gICAgICAgIGxldCB3aWR0aDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRXaWR0aCkge1xuICAgICAgICAgICAgLyogd2lkdGggaW4gJSovXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyk7XG4gICAgICAgICAgICB3aWR0aCA9IGNvbXB1dGVkLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBwYXJzZUludChjb21wdXRlZCwgMTApIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF3aWR0aCAmJiB0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCB8fCAhd2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aFN1bSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSAmJiB0aGlzLndpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8IHdpZHRoID09PSBudWxsKSAmJiB3aWR0aCAhPT0gdGhpcy5jYWxjV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVyaXZlUG9zc2libGVXaWR0aCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGNvbHVtbnMgZGVmYXVsdFdpZHRoIHByb3BlcnR5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZXJpdmVQb3NzaWJsZVdpZHRoKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbldpZHRoID0gdGhpcy53aWR0aCAhPT0gbnVsbCA/IHRoaXMuZ2V0UG9zc2libGVDb2x1bW5XaWR0aCgpIDogTUlOSU1VTV9DT0xVTU5fV0lEVEggKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiBwYXJzZUludCh0aGlzLl9jb2x1bW5XaWR0aCwgMTApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGhDb21iaW5lZCA9IHBhcnNlSW50KHRoaXMuX2NvbHVtbldpZHRoLCAxMCkgKiAoY29sdW1uLmNvbEVuZCA/IGNvbHVtbi5jb2xFbmQgLSBjb2x1bW4uY29sU3RhcnQgOiAxKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gY29sdW1uV2lkdGhDb21iaW5lZCArICdweCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEQuSy4gTWFyY2ggMjl0aCwgMjAyMSAjOTE0NSBDb25zaWRlciBtaW4vbWF4IHdpZHRoIHdoZW4gc2V0dGluZyBkZWZhdWx0V2lkdGggcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gdGhpcy5nZXRFeHRyZW11bUJhc2VkQ29sV2lkdGgoY29sdW1uKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4ucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEV4dHJlbXVtQmFzZWRDb2xXaWR0aChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuX2NvbHVtbldpZHRoO1xuICAgICAgICBpZiAod2lkdGggJiYgdHlwZW9mIHdpZHRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcod2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gd2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IGNvbHVtbi5taW5XaWR0aFB4IDogY29sdW1uLm1pbldpZHRoUGVyY2VudDtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSB3aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gY29sdW1uLm1heFdpZHRoUHggOiBjb2x1bW4ubWF4V2lkdGhQZXJjZW50O1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbldpZHRoID4gcGFyc2VGbG9hdCh3aWR0aCkpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKGNvbHVtbi5taW5XaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4V2lkdGggPCBwYXJzZUZsb2F0KHdpZHRoKSkge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcoY29sdW1uLm1heFdpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5vIHB4IG9yICUgYXJlIGRlZmluZWQgaW4gbWF4V2lkdGgvbWluV2lkdGggY29uc2lkZXIgaXQgcHhcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgJiYgd2lkdGguaW5kZXhPZigncHgnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHdpZHRoICs9ICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNldE5vdGlmeUNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RSZXBhaW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVPdXRsZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlID8gdGhpcy5fdXNlck91dGxldERpcmVjdGl2ZSA6IHRoaXMuX291dGxldERpcmVjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbnMgaW4gdGhlIG1haW4gY29sdW1uTGlzdCBhbmQgX2NvbHVtbnMgY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tb3ZlQ29sdW1ucyhmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBsaXN0KTtcbiAgICAgICAgY29uc3QgbmV3TGlzdCA9IHRoaXMuX3Jlc2V0Q29sdW1uTGlzdChsaXN0KTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KG5ld0xpc3QpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlc2V0Q29sdW1uTGlzdChsaXN0Pykge1xuICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgIGxpc3QgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdMaXN0ID0gW107XG4gICAgICAgIGxpc3QuZmlsdGVyKGMgPT4gYy5sZXZlbCA9PT0gMCkuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIG5ld0xpc3QucHVzaChwKTtcbiAgICAgICAgICAgIGlmIChwLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ld0xpc3QuY29uY2F0KHAuYWxsQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlcnMgY29sdW1ucyBpbnNpZGUgdGhlIHBhc3NlZCBjb2x1bW4gY29sbGVjdGlvbi5cbiAgICAgKiBXaGVuIHJlb3JkZXJpbmcgY29sdW1uIGdyb3VwIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBmbGF0dGVuZWQuXG4gICAgICogSW4gYWxsIG90aGVyIGNhc2VzLCB0aGUgY29sdW1ucyBjb2xsZWN0aW9uIGlzIGZsYXR0ZW5lZCwgdGhpcyBpcyB3aHkgYWRpdHRpb25hbCBjYWxjdWxhdGlvbnMgb24gdGhlIGRyb3BJbmRleCBhcmUgZG9uZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlb3JkZXJDb2x1bW5zKGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zaXRpb246IERyb3BQb3NpdGlvbiwgY29sdW1uQ29sbGVjdGlvbjogYW55W10sXG4gICAgICAgIGluR3JvdXAgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmcm9tSW5kZXggPSBjb2x1bW5Db2xsZWN0aW9uLmluZGV4T2YoZnJvbSk7XG4gICAgICAgIGNvbnN0IGNoaWxkQ29sdW1uc0NvdW50ID0gaW5Hcm91cCA/IDEgOiBmcm9tLmFsbENoaWxkcmVuLmxlbmd0aCArIDE7XG4gICAgICAgIGNvbHVtbkNvbGxlY3Rpb24uc3BsaWNlKGZyb21JbmRleCwgY2hpbGRDb2x1bW5zQ291bnQpO1xuICAgICAgICBsZXQgZHJvcEluZGV4ID0gY29sdW1uQ29sbGVjdGlvbi5pbmRleE9mKHRvKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSB7XG4gICAgICAgICAgICBkcm9wSW5kZXgrKztcbiAgICAgICAgICAgIGlmICghaW5Hcm91cCAmJiB0by5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGRyb3BJbmRleCArPSB0by5hbGxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1uQ29sbGVjdGlvbi5zcGxpY2UoZHJvcEluZGV4LCAwLCBmcm9tKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbiBncm91cCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbW92ZUNoaWxkQ29sdW1ucyhwYXJlbnQ6IElneENvbHVtbkNvbXBvbmVudCwgZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwYXJlbnQuY2hpbGRyZW4udG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBidWZmZXIsIHRydWUpO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucmVzZXQoYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0dXBDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5hdXRvR2VuZXJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2dlbmVyYXRlQ29sdW1ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QsIChjb2w6IElneENvbHVtbkNvbXBvbmVudCkgPT4gdGhpcy5vbkNvbHVtbkluaXQuZW1pdChjb2wpKTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0RGlmZmVyLmRpZmYodGhpcy5jb2x1bW5MaXN0KTtcblxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlZChjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWxldGVSb3dGcm9tRGF0YShyb3dJRDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBhIHJvdyAoaW5kZXggIT09IDApIGRlbGV0ZSBpdFxuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgYSByb3cgaW4gQUREIG9yIFVQREFURSBzdGF0ZSBjaGFuZ2UgaXQncyBzdGF0ZSB0byBERUxFVEVcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSB7IGlkOiByb3dJRCwgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkRFTEVURSwgbmV3VmFsdWU6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5hZGQodHJhbnNhY3Rpb24sIHRoaXMuZGF0YVtpbmRleF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlOiBTdGF0ZSA9IHRoaXMudHJhbnNhY3Rpb25zLmdldFN0YXRlKHJvd0lEKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLmFkZCh7IGlkOiByb3dJRCwgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkRFTEVURSwgbmV3VmFsdWU6IG51bGwgfSwgc3RhdGUgJiYgc3RhdGUucmVjb3JkUmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0YSB8fCAodGhpcy5kYXRhLmxlbmd0aCA8IHRoaXMuX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIpID9cbiAgICAgICAgICAgIDAgOiB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMucm93TGlzdERpZmZlci5kaWZmKGNoYW5nZSk7XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQ29sdW1uc0NoYW5nZWQoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50Pikge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5jb2x1bW5MaXN0RGlmZmVyLmRpZmYoY2hhbmdlKTtcblxuICAgICAgICBpZiAodGhpcy5hdXRvR2VuZXJhdGUgJiYgdGhpcy5jb2x1bW5MaXN0Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJbiBJdnkgaWYgdGhlcmUgYXJlIG5lc3RlZCBjb25kaXRpb25hbCB0ZW1wbGF0ZXMgdGhlIGNvbnRlbnQgY2hpbGRyZW4gYXJlIHJlLWV2YWx1YXRlZFxuICAgICAgICAgICAgLy8gaGVuY2UgYXV0b2dlbmVyYXRlZCBjb2x1bW5zIGFyZSBjbGVhcmVkIGFuZCBuZWVkIHRvIGJlIHJlc2V0LlxuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZGlmZi5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneENvbHVtbkNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29sdW1uSW5pdC5lbWl0KHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5pdGVtLnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zLnB1c2gocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucy5wdXNoKHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QpO1xuXG4gICAgICAgICAgICBkaWZmLmZvckVhY2hSZW1vdmVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxJZ3hDb2x1bW5Db21wb25lbnQgfCBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NvbHVtbkdyb3VwID0gcmVjb3JkLml0ZW0gaW5zdGFuY2VvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgR3JvdXBpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX2dyb3VwYnkocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIEZpbHRlcmluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJfZmlsdGVyKHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBmaWx0ZXIgcm93XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbi5maWVsZCA9PT0gcmVjb3JkLml0ZW0uZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBTb3J0aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5jbGVhcl9zb3J0KHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgY29sdW1uIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoW3JlY29yZC5pdGVtLmZpZWxkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcblxuICAgICAgICAgICAgaWYgKGFkZGVkIHx8IHJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBvbkNvbHVtbnNDaGFuZ2VkYCBjYW4gYmUgZXhlY3V0ZWQgbWlkd2F5IGEgY3VycmVudCBkZXRlY3RDaGFuZ2UgY3ljbGUgYW5kIG1hcmtGb3JDaGVjayB3aWxsIGJlIGlnbm9yZWQgdGhlbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3YWl0IGZvciB0aGUgY3VycmVudCBjeWNsZSB0byBlbmQgc28gd2UgY2FuIHRyaWdnZXIgYSBuZXcgb25lIGFuZCBuZ0RvQ2hlY2sgdG8gZmlyZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkU2l6ZXMocmVjYWxjRmVhdHVyZVdpZHRoID0gdHJ1ZSkge1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETzogKFIuSy4pIFRoaXMgbGF5ZXJlZCBsYXNhZ25lIHNob3VsZCBiZSByZWZhY3RvcmVkXG4gICAgICAgICAgICBBU0FQLiBUaGUgcmVhc29uIEkgaGF2ZSB0byByZXNldCB0aGUgY2FjaGVzIHNvIG1hbnkgdGltZXMgaXMgYmVjYXVzZVxuICAgICAgICAgICAgYWZ0ZXIgdGVhY2ggYGRldGVjdENoYW5nZXNgIGNhbGwgdGhleSBhcmUgZmlsbGVkIHdpdGggaW52YWxpZFxuICAgICAgICAgICAgc3RhdGUuIE9mIGNvdXJzZSBhbGwgb2YgdGhpcyBoYXBwZW5zIG1pZHdheSB0aHJvdWdoIHRoZSBncmlkXG4gICAgICAgICAgICBzaXppbmcgcHJvY2VzcyB3aGljaCBvZiBjb3Vyc2UsIHVzZXMgdmFsdWVzIGZyb20gdGhlIGNhY2hlcywgdGh1cyByZXN1bHRpbmdcbiAgICAgICAgICAgIGluIGEgYnJva2VuIGxheW91dC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheSh0aGlzLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LnJlc2V0Q2hpcHNBcmVhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIC8vIGluIGNhc2Ugc2Nyb2xsYmFyIGhhcyBhcHBlYXJlZCByZWNhbGMgdG8gc2l6ZSBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChoYXNTY3JvbGwgIT09IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy56b25lLmlzU3RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVdpZHRoSG9zdEJpbmRpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY0dyaWRIZWFkUm93KCkge1xuICAgICAgICBpZiAodGhpcy5tYXhMZXZlbEhlYWRlckRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKTtcbiAgICAgICAgICAgIGxldCBtaW5TaXplID0gKHRoaXMubWF4TGV2ZWxIZWFkZXJEZXB0aCArIDEpICogdGhpcy5kZWZhdWx0Um93SGVpZ2h0IC8gdGhpcy5fYmFzZUZvbnRTaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICYmIHRoaXMuX2ZpbHRlck1vZGUgPT09IEZpbHRlck1vZGUucXVpY2tGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5TaXplICs9IChGSUxURVJfUk9XX0hFSUdIVCArIDEpIC8gdGhpcy5fYmFzZUZvbnRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbkhlaWdodCA9IGAke21pblNpemV9cmVtYDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIFRCT0RZIGhlaWdodCBpLmUuIHRoaXMuY2FsY0hlaWdodFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkSGVpZ2h0KCkge1xuICAgICAgICB0aGlzLmNhbGNHcmlkSGVhZFJvdygpO1xuICAgICAgICB0aGlzLnN1bW1hcmllc0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmhhc1N1bW1hcml6ZWRDb2x1bW5zICYmIHRoaXMucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyaWVzSGVpZ2h0ID0gdGhpcy5zdW1tYXJ5U2VydmljZS5jYWxjTWF4U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID0gdGhpcy5fY2FsY3VsYXRlR3JpZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGlubmVkUm93SGVpZ2h0ICYmIHRoaXMuY2FsY0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0IC09IHRoaXMucGlubmVkUm93SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRHcm91cEFyZWFIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRDb21wdXRlZEhlaWdodChlbGVtKSB7XG4gICAgICAgIHJldHVybiBlbGVtLm9mZnNldEhlaWdodCA/IHBhcnNlRmxvYXQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpKSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9vdGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1bW1hcmllc0hlaWdodCB8fCB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudGZvb3QubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VGhlYWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gKCF0aGlzLmFsbG93RmlsdGVyaW5nIHx8ICh0aGlzLmFsbG93RmlsdGVyaW5nICYmIHRoaXMuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcikpID9cbiAgICAgICAgICAgIGhlaWdodCAtIHRoaXMuZ2V0RmlsdGVyQ2VsbEhlaWdodCgpIDpcbiAgICAgICAgICAgIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRvb2xiYXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHRvb2xiYXJIZWlnaHQgPSAwO1xuICAgICAgICBpZiAodGhpcy50b29sYmFyLmZpcnN0KSB7XG4gICAgICAgICAgICB0b29sYmFySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRvb2xiYXIuZmlyc3QubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xiYXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYWdpbmdGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhZ2luZ0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmZvb3Rlcikge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLmZvb3Rlci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIHBhZ2luZ0hlaWdodCA9IHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgP1xuICAgICAgICAgICAgICAgIGhlaWdodCA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2luZ0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlckNlbGxIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVhZGVyR3JvdXBOYXRpdmVFbCA9ICh0aGlzLmhlYWRlckdyb3Vwc0xpc3QubGVuZ3RoICE9PSAwKSA/XG4gICAgICAgICAgICB0aGlzLmhlYWRlckdyb3Vwc0xpc3RbMF0uZWxlbWVudC5uYXRpdmVFbGVtZW50IDogbnVsbDtcbiAgICAgICAgY29uc3QgZmlsdGVyQ2VsbE5hdGl2ZUVsID0gKGhlYWRlckdyb3VwTmF0aXZlRWwpID9cbiAgICAgICAgICAgIGhlYWRlckdyb3VwTmF0aXZlRWwucXVlcnlTZWxlY3RvcignaWd4LWdyaWQtZmlsdGVyaW5nLWNlbGwnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiAoZmlsdGVyQ2VsbE5hdGl2ZUVsKSA/IGZpbHRlckNlbGxOYXRpdmVFbC5vZmZzZXRIZWlnaHQgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZUdyaWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5faGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3R1YWxUaGVhZFJvdyA9IHRoaXMuZ2V0VGhlYWRSb3dIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZm9vdGVySGVpZ2h0ID0gdGhpcy5nZXRGb290ZXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHRoaXMuZ2V0VG9vbGJhckhlaWdodCgpO1xuICAgICAgICBjb25zdCBwYWdpbmdIZWlnaHQgPSB0aGlzLmdldFBhZ2luZ0Zvb3RlckhlaWdodCgpO1xuICAgICAgICBjb25zdCBncm91cEFyZWFIZWlnaHQgPSB0aGlzLmdldEdyb3VwQXJlYUhlaWdodCgpO1xuICAgICAgICBjb25zdCBzY3JIZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMuc2NyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCByZW5kZXJlZEhlaWdodCA9IHRvb2xiYXJIZWlnaHQgKyBhY3R1YWxUaGVhZFJvdyArXG4gICAgICAgICAgICBmb290ZXJIZWlnaHQgKyBwYWdpbmdIZWlnaHQgKyBncm91cEFyZWFIZWlnaHQgK1xuICAgICAgICAgICAgc2NySGVpZ2h0O1xuXG4gICAgICAgIGxldCBncmlkSGVpZ2h0ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0Jyk7XG4gICAgICAgICAgICBjb25zdCBhdXRvU2l6ZSA9IHRoaXMuX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KTtcbiAgICAgICAgICAgIGlmIChhdXRvU2l6ZSB8fCBjb21wdXRlZC5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBib2R5SGVpZ2h0ID4gMCA/IGJvZHlIZWlnaHQgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlSW50KHRoaXMuX2hlaWdodCwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKGdyaWRIZWlnaHQgLSByZW5kZXJlZEhlaWdodCk7XG5cbiAgICAgICAgaWYgKE1hdGgucm91bmQoaGVpZ2h0KSA9PT0gMCB8fCBpc05hTihncmlkSGVpZ2h0KSkge1xuICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gYm9keUhlaWdodCA+IDAgPyBib2R5SGVpZ2h0IDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja0NvbnRhaW5lclNpemVDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IG9yaWdIZWlnaHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiBvcmlnSGVpZ2h0ICE9PSBoZWlnaHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCkge1xuICAgICAgICB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgbGV0IHJlcyA9ICF0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ID09PSAwIHx8XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPT09IHJlbmRlcmVkSGVpZ2h0O1xuICAgICAgICBpZiAoIXRoaXMucGxhdGZvcm1VdGlsLmlzQ2hyb21pdW0gJiYgIXRoaXMucGxhdGZvcm1VdGlsLmlzRmlyZWZveCkge1xuICAgICAgICAgICAgLy8gSWYgZ3JpZCBjYXVzZXMgdGhlIHBhcmVudCBjb250YWluZXIgdG8gZXh0ZW5kIChmb3IgZXhhbXBsZSB3aGVuIGNvbnRhaW5lciBpcyBmbGV4KVxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBhdXRvLXNpemUgc2luY2UgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb250YWluZXIgd2lsbCBjb250aW51b3VzbHkgY2hhbmdlIGFzIHRoZSBncmlkIHJlbmRlcnMgZWxlbWVudHMuXG4gICAgICAgICAgICByZXMgPSB0aGlzLmNoZWNrQ29udGFpbmVyU2l6ZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgdW5waW5uZWQgYXJlYVxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRVbnBpbm5lZFdpZHRoKHRha2VIaWRkZW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmlzUGVyY2VudFdpZHRoID9cbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoIDpcbiAgICAgICAgICAgIHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSB8fCBwYXJzZUludCh0aGlzLmhvc3RXaWR0aCwgMTApIHx8IHRoaXMuY2FsY1dpZHRoO1xuICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpICYmICF0aGlzLmlzUGVyY2VudFdpZHRoKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGlubmluZ1RvU3RhcnQpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdpZHRoIC0gdGhpcy5nZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJpZXMoZmllbGROYW1lOiBzdHJpbmcsIGhhc1N1bW1hcnk6IGJvb2xlYW4sIHN1bW1hcnlPcGVyYW5kPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUoZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmhhc1N1bW1hcnkgPSBoYXNTdW1tYXJ5O1xuICAgICAgICAgICAgaWYgKHN1bW1hcnlPcGVyYW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXRyaWdnZXJSb290UGlwZSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4uc3VtbWFyaWVzID0gc3VtbWFyeU9wZXJhbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tdWx0aXBsZVN1bW1hcmllcyhleHByZXNzaW9uczogSVN1bW1hcnlFeHByZXNzaW9uW10sIGhhc1N1bW1hcnk6IGJvb2xlYW4pIHtcbiAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKGVsZW1lbnQuZmllbGROYW1lLCBoYXNTdW1tYXJ5LCBlbGVtZW50LmN1c3RvbVN1bW1hcnkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZU11bHRpcGxlU3VtbWFyaWVzKGV4cHJlc3Npb25zKSB7XG4gICAgICAgIGV4cHJlc3Npb25zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNvbHVtbiAmJiBjb2x1bW4uZmllbGROYW1lID8gY29sdW1uLmZpZWxkTmFtZSA6IGNvbHVtbjtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhjb2x1bW5OYW1lLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZURhdGFUeXBlcyhyZWMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0YVR5cGUuTnVtYmVyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlLkJvb2xlYW47XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlYyA9PT0gJ29iamVjdCcgJiYgcmVjIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlLkRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERhdGFUeXBlLlN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9nZW5lcmF0ZUNvbHVtbnMoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2RhdGEoKTtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcblxuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGZhY3RvcnkuY3JlYXRlKHRoaXMudmlld1JlZi5pbmplY3Rvcik7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5kYXRhVHlwZSA9IHRoaXMucmVzb2x2ZURhdGFUeXBlcyhkYXRhWzBdW2ZpZWxkXSk7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyA9IGNvbHVtbnM7XG5cbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KGNvbHVtbnMpO1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURhdGFGaWVsZHMoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkYXRhICYmIGRhdGEubGVuZ3RoICE9PSAwID8gZGF0YVswXSA6IFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRDb2x1bW5zKGNvbGxlY3Rpb246IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+LCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gdGhpcy5jb2x1bW5MaXN0LnNvbWUoY29sID0+IGNvbC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIC8vIFNldCBvdmVyYWxsIHJvdyBsYXlvdXQgc2l6ZVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uTGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFNpemUgPSBjb2wuY2hpbGRyZW4gP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlZHVjZSgoYWNjLCB2YWwpID0+IE1hdGgubWF4KHZhbC5yb3dTdGFydCArIHZhbC5ncmlkUm93U3BhbiAtIDEsIGFjYyksIDEpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IE1hdGgubWF4KGxheW91dFNpemUsIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiB0aGlzLmhhc0NvbHVtbkdyb3Vwcykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb25maWd1cmF0aW9uIC0gbXVsdGktcm93IGFuZCBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICAvLyByZW1vdmUgY29sdW1uIGdyb3Vwc1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTGF5b3V0Q29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkxheW91dCB8fCBjb2wuY29sdW1uTGF5b3V0Q2hpbGQpO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KGNvbHVtbkxheW91dENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29sdW1uLmRlZmF1bHRXaWR0aCA9IHRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIgPyB0aGlzLl9jb2x1bW5XaWR0aCA6IGNvbHVtbi5kZWZhdWx0V2lkdGggPyBjb2x1bW4uZGVmYXVsdFdpZHRoIDogJyc7XG5cbiAgICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgICAgIGNiKGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVpbml0UGluU3RhdGVzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbHVtbi5wb3B1bGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVpbml0UGluU3RhdGVzKCkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnBpbm5lZCkuc29ydCgoYSwgYikgPT4gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGEpIC0gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGIpKTtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gdGhpcy5oYXNDb2x1bW5Hcm91cHMgPyB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpIDpcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UsIGNvbHVtbkRhdGE/OiBhbnlbXSk6IGFueVtdIHtcbiAgICAgICAgbGV0IGNvbHVtbnNBcnJheTogSWd4Q29sdW1uQ29tcG9uZW50W107XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YSA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25Db2xsZWN0aW9uID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBrZXlzQW5kRGF0YSA9IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWd4LWhpZXJhcmNoaWNhbC1ncmlkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5zaW9uUm93SW5kZXhlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5leHBhbnNpb25TdGF0ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvblJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRLZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihyb3cuSUQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4ID0gTnVtYmVyKHJvdy5JRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXggPSBOdW1iZXIocm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZEtleSA+IE51bWJlcihyb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEtleS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGVjdGlvbi5zZXQodXBkYXRlZEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVFbCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbnNpb25Sb3dJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uUm93SW5kZXhlcy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWwucm93ID4gTnVtYmVyKHJvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFbC5yb3ctLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9ICh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3QgaXNSZW1vdGUgPSB0b3RhbEl0ZW1zICYmIHRvdGFsSXRlbXMgPiB0aGlzLmRhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgbGV0IHNlbGVjdGlvbk1hcDtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZ3gtaGllcmFyY2hpY2FsLWdyaWQnICYmIHNlbGVjdGlvbkNvbGxlY3Rpb24uc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcCA9IGlzUmVtb3RlID8gQXJyYXkuZnJvbShzZWxlY3Rpb25Db2xsZWN0aW9uKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcCA9IGlzUmVtb3RlID8gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZWxsU2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5zaW5nbGUgJiYgYWN0aXZlRWwpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5wdXNoKFthY3RpdmVFbC5yb3csIG5ldyBTZXQ8bnVtYmVyPigpLmFkZChhY3RpdmVFbC5jb2x1bW4pXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZWxsU2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lICYmIGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAucHVzaChbYWN0aXZlRWwucm93LCBuZXcgU2V0PG51bWJlcj4oKS5hZGQoYWN0aXZlRWwuY29sdW1uKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbkRhdGEpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgIGZvciAobGV0IFtyb3csIHNldF0gb2Ygc2VsZWN0aW9uTWFwKSB7XG4gICAgICAgICAgICByb3cgPSB0aGlzLnBhZ2luZyAmJiBzb3VyY2UgPT09IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhID8gcm93ICsgKHRoaXMucGVyUGFnZSAqIHRoaXMucGFnZSkgOiByb3c7XG4gICAgICAgICAgICByb3cgPSBpc1JlbW90ZSA/IHJvdyAtIHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4IDogcm93O1xuICAgICAgICAgICAgaWYgKCFzb3VyY2Vbcm93XSB8fCBzb3VyY2Vbcm93XS5kZXRhaWxzRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gQXJyYXkuZnJvbShzZXQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlYWNoIG9mIHRlbXApIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJyYXkgPSB0aGlzLmdldFNlbGVjdGFibGVDb2x1bW5zQXQoZWFjaCk7XG4gICAgICAgICAgICAgICAgY29sdW1uc0FycmF5LmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBoZWFkZXJzID8gY29sLmhlYWRlciB8fCBjb2wuZmllbGQgOiBjb2wuZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dEYXRhID0gc291cmNlW3Jvd10uZ2hvc3RSZWNvcmQgPyBzb3VyY2Vbcm93XS5yZWNvcmRSZWYgOiBzb3VyY2Vbcm93XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZU5lc3RlZFBhdGgocm93RGF0YSwgY29sLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcih2YWx1ZSwgcm93RGF0YSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IHJlY29yZFtrZXldLnRvU3RyaW5nKCkuY29uY2F0KCdyZWNvcmRSb3ctJyArIHJvdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhjb2x1bW5EYXRhWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGM6IGFueSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93TnVtYmVyID0gK2Muc3BsaXQoJ3JlY29yZFJvdy0nKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjLnNwbGl0KCdyZWNvcmRSb3ctJylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRPYmogPSBPYmplY3QuYXNzaWduKHNlbGVjdGVkRGF0YVtyb3dOdW1iZXJdLCByZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW3Jvd051bWJlcl0gPSBtZXJnZWRPYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGEucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKHNlbGVjdGVkRGF0YSk7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKGtleXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXNBbmREYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRTZWxlY3RhYmxlQ29sdW1uc0F0KGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVMYXlvdXRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5jb2x1bW5MYXlvdXQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgY29sTGF5b3V0ID0gdmlzaWJsZUxheW91dENvbHVtbnNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIGNvbExheW91dCA/IGNvbExheW91dC5jaGlsZHJlbi50b0FycmF5KCkgOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXApXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFt2aXNpYmxlQ29sdW1uc1tpbmRleF1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3REYXRhRnJvbUNvbHVtbnNTZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpOiBhbnlbXSB7XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRhID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2Ygc291cmNlKSB7XG4gICAgICAgICAgICBzZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVycyA/IGNvbC5oZWFkZXIgfHwgY29sLmZpZWxkIDogY29sLmZpZWxkO1xuICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcihkYXRhW2NvbC5maWVsZF0sIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgIDogZGF0YVtjb2wuZmllbGRdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YS5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaW5pdFBpbm5pbmcoKSB7XG4gICAgICAgIGNvbnN0IHBpbm5lZENvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgdW5waW5uZWRDb2x1bW5zID0gW107XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICAvLyBXaGVuIGEgY29sdW1uIGlzIGEgZ3JvdXAgb3IgaXMgaW5zaWRlIGEgZ3JvdXAsIHBpbiBhbGwgcmVsYXRlZC5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGNvbC5wYXJlbnQucGlubmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBjb2wuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5waW5uZWQgPSB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGV4Y2VlZCB1bnBpbm5lZCBhcmVhIG1pbiB3aWR0aCBhbmQgZ2V0IHBpbm5lZCBhbmQgdW5waW5uZWQgY29sIGNvbGxlY3Rpb25zLlxuICAgICAgICAvLyBXZSB0YWtlIGludG8gYWNjb3VudCB0b3AgbGV2ZWwgY29sdW1ucyAodG9wIGxldmVsIGdyb3VwcyBhbmQgbm9uIGdyb3VwcykuXG4gICAgICAgIC8vIElmIHRvcCBsZXZlbCBpcyB1bnBpbm5lZCB0aGUgcGlubmluZyBoYW5kbGVzIGFsbCBjaGlsZHJlbiB0byBiZSB1bnBpbm5lZCBhcyB3ZWxsLlxuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIHBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucGlubmVkICYmIGNvbHVtbi5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnRvcExldmVsUGFyZW50LnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucGlubmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHVucGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1bnBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXNzaWduIHRoZSBhcHBsaWNhcGxlIGNvbGxlY3Rpb25zLlxuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gcGlubmVkQ29sdW1ucztcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gdW5waW5uZWRDb2x1bW5zO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvKHJvdzogYW55IHwgbnVtYmVyLCBjb2x1bW46IGFueSB8IG51bWJlciwgaW5Db2xsZWN0aW9uID0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEpOiB2b2lkIHtcbiAgICAgICAgbGV0IGRlbGF5U2Nyb2xsaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMucGFnaW5nICYmIHR5cGVvZiAocm93KSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gaW5Db2xsZWN0aW9uLmluZGV4T2Yocm93KTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKHJvd0luZGV4IC8gdGhpcy5wZXJQYWdlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgICAgICAgICAgIGRlbGF5U2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlbGF5U2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uRGF0YUNoYW5nZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiAocm93KSA9PT0gJ251bWJlcicgPyByb3cgOiB0aGlzLnVucGlubmVkRGF0YVZpZXcuaW5kZXhPZihyb3cpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICB0eXBlb2YgKHJvdykgPT09ICdudW1iZXInID8gcm93IDogdGhpcy51bnBpbm5lZERhdGFWaWV3LmluZGV4T2Yocm93KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjcm9sbFRvSG9yaXpvbnRhbGx5KGNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxUb0hvcml6b250YWxseShjb2x1bW46IGFueSB8IG51bWJlcikge1xuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSB0eXBlb2YgY29sdW1uID09PSAnbnVtYmVyJyA/IGNvbHVtbiA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbikudmlzaWJsZUluZGV4O1xuICAgICAgICBjb25zdCBzY3JvbGxSb3cgPSB0aGlzLnJvd0xpc3QuZmluZChyID0+IHIudmlydERpclJvdyk7XG4gICAgICAgIGNvbnN0IHZpcnREaXIgPSBzY3JvbGxSb3cgPyBzY3JvbGxSb3cudmlydERpclJvdyA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzUGlubmluZ1RvU3RhcnQgJiYgdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID49IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCAtPSB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsRGlyZWN0aXZlKGRpcmVjdGl2ZTogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4sIGdvYWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZS5zY3JvbGxUbyhnb2FsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbHVtbldpZHRoU3VtKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBjb2xTdW0gPSAwO1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpIDogdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIGNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgY29sU3VtICs9IHBhcnNlSW50KChpdGVtLmNhbGNXaWR0aCB8fCBpdGVtLmRlZmF1bHRXaWR0aCksIDEwKSB8fCBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY29sU3VtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbFN1bSArPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgcmV0dXJuIGNvbFN1bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpeSBjaGFuZ2VzLCByZXNldCBjYWNoZSBhbmQgcG9wdWxhdGVWaXNpYmxlSW5kZXhlcy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jb2x1bW5zUmVvcmRlcmVkKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LCB0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoeCA9PiB4LmNvbHVtbkxheW91dCkuZm9yRWFjaCh4ID0+IHgucG9wdWxhdGVWaXNpYmxlSW5kZXhlcygpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZnRlciByZW9yZGVyaW5nIGlzIGRvbmUgcmVzZXQgY2FjaGVkIGNvbHVtbiBjb2xsZWN0aW9ucy5cbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIGNvbHVtbi5yZXNldENhY2hlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FwcGx5V2lkdGhIb3N0QmluZGluZygpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5fd2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IHRoaXMuY2FsY1dpZHRoO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCArPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aWR0aCA9IGN1cnJlbnRXaWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faG9zdFdpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVydGljYWxTY3JvbGxIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIub25TY3JvbGwoZXZlbnQpO1xuICAgICAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9ucyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIub25DaHVua0xvYWQuZW1pdCh0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbCh0aGlzLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmhpZGVPdmVybGF5cygpO1xuICAgICAgICB0aGlzLmFjdGlvblN0cmlwPy5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvblN0cmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0cmlwLmNvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiAndmVydGljYWwnLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbjogdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQb3NpdGlvblxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uU2Nyb2xsLmVtaXQoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBob3Jpem9udGFsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLm9uSFNjcm9sbChzY3JvbGxMZWZ0KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcy5mb3JFYWNoKHZmb3IgPT4gdmZvci5vbkhTY3JvbGwoc2Nyb2xsTGVmdCkpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRWaXJ0RGlyLm9uQ2h1bmtMb2FkLmVtaXQodGhpcy5oZWFkZXJDb250YWluZXIuc3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0geyBkaXJlY3Rpb246ICdob3Jpem9udGFsJywgZXZlbnQsIHNjcm9sbFBvc2l0aW9uOiB0aGlzLmhlYWRlckNvbnRhaW5lci5zY3JvbGxQb3NpdGlvbiB9O1xuICAgICAgICB0aGlzLm9uU2Nyb2xsLmVtaXQoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCA9IC0xLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3cgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmZpbmQociA9PiByLmluZGV4ID09PSByb3dJbmRleCk7XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIub25EYXRhQ2hhbmdlZC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5maW5kKHIgPT4gci5pbmRleCA9PT0gcm93SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYkFyZ3MgPSB0aGlzLmdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjYihjYkFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlld1tyb3dJbmRleF0uZGV0YWlsc0RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uc2V0QWN0aXZlTm9kZSh7IHJvdzogcm93SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGNiKGFyZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCkge1xuICAgICAgICBsZXQgdGFyZ2V0VHlwZTogR3JpZEtleWRvd25UYXJnZXRUeXBlOyBsZXQgdGFyZ2V0O1xuICAgICAgICBzd2l0Y2ggKHJvdy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAnaWd4LWdyaWQtZ3JvdXBieS1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnZ3JvdXBSb3cnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvdztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lneC1ncmlkLXN1bW1hcnktcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ3N1bW1hcnlDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgcm93LnN1bW1hcnlDZWxscy5maW5kKGMgPT4gYy52aXNpYmxlQ29sdW1uSW5kZXggPT09IHZpc2libGVDb2xJbmRleCkgOiByb3cuc3VtbWFyeUNlbGxzLmZpcnN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaWd4LWNoaWxkLWdyaWQtcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2hpZXJhcmNoaWNhbFJvdyc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm93O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2RhdGFDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID8gcm93LmNlbGxzLmZpbmQoYyA9PiBjLnZpc2libGVDb2x1bW5JbmRleCA9PT0gdmlzaWJsZUNvbEluZGV4KSA6IHJvdy5jZWxscy5maXJzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0YXJnZXRUeXBlLCB0YXJnZXQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5leHREYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4LCBwcmV2aW91cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSb3dJbmRleCA8IDAgfHwgKGN1cnJlbnRSb3dJbmRleCA9PT0gMCAmJiBwcmV2aW91cykgfHwgKGN1cnJlbnRSb3dJbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAtIDEgJiYgIXByZXZpb3VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSb3dJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIG5leHQvcHJldiByZWNvcmQgdGhhdCBpcyBlZGl0YWJsZS5cbiAgICAgICAgY29uc3QgbmV4dFJvd0luZGV4ID0gcHJldmlvdXMgPyB0aGlzLmZpbmRQcmV2RWRpdGFibGVEYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4KSA6XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmZpbmRJbmRleCgocmVjLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICBpbmRleCA+IGN1cnJlbnRSb3dJbmRleCAmJiB0aGlzLmlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChpbmRleCkpO1xuICAgICAgICByZXR1cm4gbmV4dFJvd0luZGV4ICE9PSAtMSA/IG5leHRSb3dJbmRleCA6IGN1cnJlbnRSb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBlZGl0YWJsZSByb3cgaW5kZXggb3IgLTEgaWYgbm8gc3VjaCByb3cgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3VycmVudEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlZGl0YWJsZSByZWNvcmQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kUHJldkVkaXRhYmxlRGF0YVJvd0luZGV4KGN1cnJlbnRJbmRleCk6IG51bWJlciB7XG4gICAgICAgIGxldCBpID0gdGhpcy5kYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIGlmIChpIDwgY3VycmVudEluZGV4ICYmIHRoaXMuaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgZGF0YSB2aWV3IGluZGV4IGlzIGEgYW4gZWRpdGFibGUgZGF0YSByZWNvcmQuXG4gICAgICogSWYgcmVjb3JkIGlzIGdyb3VwIHJlYywgc3VtbWFyeSByZWMsIGNoaWxkIHJlYywgZ2hvc3QgcmVjLiBldGMuIGl0IGlzIG5vdCBlZGl0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhVmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGF0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpIHtcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5kYXRhVmlld1tkYXRhVmlld0luZGV4XTtcbiAgICAgICAgcmV0dXJuICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEgJiZcbiAgICAgICAgICAgICF0aGlzLmlzR2hvc3RSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHJlY29yZCBhdCB0aGUgc3BlY2lmaWVkIGRhdGEgdmlldyBpbmRleCBpcyBhIGdob3N0LlxuICAgICAqIElmIHJlY29yZCBpcyBwaW5uZWQgYnV0IGlzIG5vdCBpbiBwaW5uZWQgYXJlYSB0aGVuIGl0IGlzIGEgZ2hvc3QgcmVjb3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFWaWV3SW5kZXggVGhlIGluZGV4IG9mIHRoYXQgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0dob3N0UmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KSB7XG4gICAgICAgIGNvbnN0IGlzUGlubmVkID0gdGhpcy5pc1JlY29yZFBpbm5lZCh0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdKTtcbiAgICAgICAgY29uc3QgaXNJblBpbm5lZEFyZWEgPSB0aGlzLmlzUmVjb3JkUGlubmVkQnlWaWV3SW5kZXgoZGF0YVZpZXdJbmRleCk7XG4gICAgICAgIHJldHVybiBpc1Bpbm5lZCAmJiAhaXNJblBpbm5lZEFyZWE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkUG9zaXRpb24ocm93SW5kZXgsIGNvbEluZGV4KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwICYmICFjb2wuaGlkZGVuKS5sZW5ndGg7XG4gICAgICAgIGlmIChyb3dzIDwgMSB8fCBjb2xzIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3dJbmRleCA+IC0xICYmIHJvd0luZGV4IDwgdGhpcy5kYXRhVmlldy5sZW5ndGggJiZcbiAgICAgICAgICAgIGNvbEluZGV4ID4gLSAxICYmIGNvbEluZGV4IDw9IE1hdGgubWF4KC4uLnRoaXMudmlzaWJsZUNvbHVtbnMubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZCh0ZXh0OiBzdHJpbmcsIGluY3JlbWVudDogbnVtYmVyLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4sIHNjcm9sbD86IGJvb2xlYW4sIGVuZEVkaXQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRFZGl0KSB7XG4gICAgICAgICAgICB0aGlzLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCA9IGNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2hSZXNvbHZlZCA9IGV4YWN0TWF0Y2ggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGxldCByZWJ1aWxkQ2FjaGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0ICE9PSB0ZXh0IHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUgIT09IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoICE9PSBleGFjdE1hdGNoUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoVGV4dDogdGV4dCxcbiAgICAgICAgICAgICAgICBhY3RpdmVNYXRjaEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBleGFjdE1hdGNoOiBleGFjdE1hdGNoUmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZWJ1aWxkQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ICs9IGluY3JlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWJ1aWxkQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMucm93TGlzdC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmhpZ2hsaWdodFRleHQodGV4dCwgY2FzZVNlbnNpdGl2ZVJlc29sdmVkLCBleGFjdE1hdGNoUmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkTWF0Y2hDYWNoZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA+PSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5mbyA9IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGVbdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7IC4uLnRoaXMubGFzdFNlYXJjaEluZm8gfTtcblxuICAgICAgICAgICAgaWYgKHNjcm9sbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKG1hdGNoSW5mby5yb3csIG1hdGNoSW5mby5jb2x1bW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLnNldEFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBtYXRjaEluZm8uY29sdW1uLFxuICAgICAgICAgICAgICAgIHJvdzogbWF0Y2hJbmZvLnJvdyxcbiAgICAgICAgICAgICAgICBpbmRleDogbWF0Y2hJbmZvLmluZGV4LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtYXRjaEluZm8ubWV0YWRhdGEsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5jbGVhckFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYnVpbGRNYXRjaENhY2hlKCkge1xuICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlID0gW107XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHRoaXMubGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IHRoaXMubGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaDtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IGNhc2VTZW5zaXRpdmUgPyB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQgOiB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICBjb25zdCBjb2x1bW5JdGVtcyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5jb2x1bW5Hcm91cCkuc29ydCgoYzEsIGMyKSA9PiBjMS52aXNpYmxlSW5kZXggLSBjMi52aXNpYmxlSW5kZXgpO1xuICAgICAgICBkYXRhLmZvckVhY2goKGRhdGFSb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICBjb2x1bW5JdGVtcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlwZUFyZ3MgPSB0aGlzLmdldENvbHVtbkJ5TmFtZShjLmZpZWxkKS5waXBlQXJncztcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGMuZm9ybWF0dGVyID8gYy5mb3JtYXR0ZXIocmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCksIGRhdGFSb3cpIDpcbiAgICAgICAgICAgICAgICAgICAgYy5kYXRhVHlwZSA9PT0gJ251bWJlcicgPyB0aGlzLmRlY2ltYWxQaXBlLnRyYW5zZm9ybShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVBcmdzLmRpZ2l0c0luZm8sIHRoaXMubG9jYWxlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmRhdGFUeXBlID09PSAnZGF0ZScgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlQXJncy5mb3JtYXQsIHBpcGVBcmdzLnRpbWV6b25lLCB0aGlzLmxvY2FsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIGMuc2VhcmNoYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoVmFsdWUgPSBjYXNlU2Vuc2l0aXZlID8gU3RyaW5nKHZhbHVlKSA6IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFZhbHVlID09PSBzZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnNldCgncGlubmVkJywgdGhpcy5pc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IGRhdGFSb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VyZW5jZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hJbmRleCA9IHNlYXJjaFZhbHVlLmluZGV4T2Yoc2VhcmNoVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZWFyY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KCdwaW5uZWQnLCB0aGlzLmlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZGF0YVJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogb2NjdXJlbmNlSW5kZXgrKyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlLnN1YnN0cmluZyhzZWFyY2hJbmRleCArIHNlYXJjaFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmRleCA9IHNlYXJjaFZhbHVlLmluZGV4T2Yoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maWd1cmVSb3dFZGl0aW5nT3ZlcmxheShyb3dJRDogYW55LCB1c2VPdXRlciA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBzZXR0aW5ncyA9IHRoaXMucm93RWRpdFNldHRpbmdzO1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZCh0aGlzLnJvd0VkaXRpbmdPdmVybGF5Lm92ZXJsYXlJZCk7XG4gICAgICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IG92ZXJsYXkuc2V0dGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3Mub3V0bGV0ID0gdXNlT3V0ZXIgPyB0aGlzLnBhcmVudFJvd091dGxldERpcmVjdGl2ZSA6IHRoaXMucm93T3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LnNldHRpbmdzLmNvbnRhaW5lciA9IHRoaXMudGJvZHkubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgcGlubmVkID0gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpICE9PSAtMTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Um93ID0gIXBpbm5lZCA/IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2tleShyb3dJRCkgOiB0aGlzLnBpbm5lZFJvd3MuZmluZCh4ID0+IHgucm93SUQgPT09IHJvd0lEKTtcbiAgICAgICAgaWYgKCF0YXJnZXRSb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy50YXJnZXQgPSB0YXJnZXRSb3cuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnRvZ2dsZVJvd0VkaXRpbmdPdmVybGF5KHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJvd0VkaXRpbmdXaGVlbEhhbmRsZXIoZXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsTmV4dCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQcmV2KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|