mmhglobal-dynamicform 2.12.4 → 2.13.0

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.
@@ -5,8 +5,6 @@ import { NavigationStart, NavigationEnd, NavigationError } from '@angular/router
5
5
  /********** Plugin **********/
6
6
  import { BehaviorSubject, of, forkJoin } from 'rxjs';
7
7
  import { tap, switchMap, map } from 'rxjs/operators';
8
- import { ZmodalComponent } from '../zmodal/zmodal.component';
9
- import { ZmodalMobileComponent } from '../zmodal/zmodal-mobile.component';
10
8
  import { MESSAGETYPE, ZComponentHelper, ZGroup, DefaultMessage, DefaultDialogTitle, ActionType } from 'mmhglobal-zcore';
11
9
  import * as i0 from "@angular/core";
12
10
  import * as i1 from "@angular/router";
@@ -15,10 +13,6 @@ import * as i3 from "mmhglobal-zcore";
15
13
  import * as i4 from "mmhglobal-zmodal";
16
14
  import * as i5 from "./zcomponent.debug.service";
17
15
  import * as i6 from "@progress/kendo-angular-dialog";
18
- // import { ModalService } from '../zmodal/modal.service';
19
- // import { ZmodalPage } from '../zmodal/zmodal.page';
20
- // import { ZComponentHelper, ZComponentOutputEvent, ModalPageParams, ZGrid } from '../dynamicform/zcomponent.model';
21
- // import { ZGroup, ZField } from '../model/zgroup.model';
22
16
  export class MainService {
23
17
  constructor(router, activatedRoute, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandlerService, webApiService, zcoreService, modalService, storageService, debugService, translationService, signalrService, dialogService, oauth2Service, toastService, authService) {
24
18
  this.router = router;
@@ -290,7 +284,14 @@ export class MainService {
290
284
  // modalGroupParam.colFields$ = event.columnFields$;
291
285
  // modalGroupParam.parentGroup = me.group;
292
286
  // this.openModalForm(modalGroupParam);
293
- this.modalService.show(event.columnFields$ || cName, group, "", {}, event.data.Id);
287
+ this.showzModal({
288
+ fieldElementName: cName,
289
+ fieldElementObservable$: event.columnFields$,
290
+ parentGroup: group,
291
+ zModel: {},
292
+ formHeader: '',
293
+ referId: event.data.Id
294
+ }).subscribe();
294
295
  }
295
296
  }
296
297
  else if (typeof callFunc === "object") {
@@ -300,15 +301,15 @@ export class MainService {
300
301
  this.router.navigate([url]);
301
302
  return;
302
303
  }
303
- const modalGroupParam = {};
304
- modalGroupParam.controllerName = callFunc.ctrlName;
305
- modalGroupParam.referId = event.data.Id;
306
- modalGroupParam.colFields$ = event.columnFields$;
307
- modalGroupParam.parentGroup = me.group;
308
- modalGroupParam.formHeader = callFunc.formHeader;
309
304
  if (callFunc.formHeader) {
310
- // this.openModalForm(modalGroupParam);
311
- this.modalService.show(event.columnFields$ || callFunc.ctrlName, group, callFunc.formHeader, {}, event.data.Id);
305
+ this.showzModal({
306
+ fieldElementName: callFunc.ctrlName,
307
+ fieldElementObservable$: event.columnFields$,
308
+ parentGroup: me.group,
309
+ zModel: {},
310
+ formHeader: callFunc.formHeader,
311
+ referId: event.data.Id
312
+ }).subscribe();
312
313
  return;
313
314
  }
314
315
  console.warn("Invalid callFunc type: ", callFunc, " event.Target: ", event.target);
@@ -999,15 +1000,12 @@ export class MainService {
999
1000
  // fc.setValue(value);
1000
1001
  // fc.markAsDirty();
1001
1002
  // }
1002
- async showzModal(colFields$, parentGroup, formHeader, zModel, referId, componentSize, skipIsDirtyCheck, validateIsRequired) {
1003
- const modalcomponent = ZmodalComponent;
1004
- const modalmobilecomponent = ZmodalMobileComponent;
1005
- if (parentGroup) {
1003
+ showzModal(modalPageParams) {
1004
+ if (modalPageParams.parentGroup) {
1006
1005
  // disable isTriggered before display the popup.
1007
- parentGroup.isTriggered = false;
1006
+ modalPageParams.parentGroup.isTriggered = false;
1008
1007
  }
1009
- return await this.modalService.show(colFields$, parentGroup, formHeader, modalcomponent, modalmobilecomponent, zModel, referId, componentSize, skipIsDirtyCheck, validateIsRequired);
1010
- //const modal = await this.modalService.show();
1008
+ return this.modalService.show(modalPageParams);
1011
1009
  }
1012
1010
  cookieStorePost(name, value) {
1013
1011
  // for Post to CookieStore
@@ -1218,4 +1216,4 @@ export function refreshGrid(group) {
1218
1216
  }
1219
1217
  group.isTriggered = false;
1220
1218
  }
1221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFtRCxNQUFNLGlCQUFpQixDQUFDO0FBS25JLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsZUFBZSxFQUFnQixFQUFFLEVBQVEsUUFBUSxFQUE2QixNQUFNLE1BQU0sQ0FBQztBQUNoSCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBUSxHQUFHLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUt2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHMUUsT0FBTyxFQUNRLFdBQVcsRUFBaUMsZ0JBQWdCLEVBRVosTUFBTSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBbUIsVUFBVSxFQUNySSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7OztBQUN6QiwwREFBMEQ7QUFDMUQsc0RBQXNEO0FBRXRELHFIQUFxSDtBQUNySCwwREFBMEQ7QUFNMUQsTUFBTSxPQUFPLFdBQVc7SUFpQnRCLFlBQ1UsTUFBYyxFQUNkLGNBQThCLEVBQzlCLFNBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0Qyw0QkFBMEQsRUFDMUQsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsY0FBcUMs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LEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUM5SSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRDtJQUNILENBQUM7SUFDRCxZQUFZO0lBRUosbUJBQW1CLENBQUMsS0FBYTtRQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxJQUFJLEtBQUssQ0FBQztRQUNoRSxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQzs7d0dBcDdDVSxXQUFXOzRHQUFYLFdBQVcsY0FIVixNQUFNOzJGQUdQLFdBQVc7a0JBSnZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COztBQXk3Q0QsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQVUsQ0FBQztJQUNuRCxJQUFJLFlBQVksRUFBRTtRQUNoQixZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDeEI7SUFDRCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZWYsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uU3RhcnQsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgUm91dGVyLCBFdmVudCwgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FeHRyYXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBOYXZDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiwgZnJvbSwgZm9ya0pvaW4sIFJlcGxheVN1YmplY3QsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAsIHRha2UsIG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGlhbG9nUmVmLCBEaWFsb2dTZXJ2aWNlLCBEaWFsb2dTZXR0aW5ncyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRpYWxvZyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UgfSBmcm9tICcuL3pjb21wb25lbnQuZGVidWcuc2VydmljZSc7XHJcbmltcG9ydCB7IFptb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL3ptb2RhbC96bW9kYWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgWm1vZGFsTW9iaWxlQ29tcG9uZW50IH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC1tb2JpbGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgWkdyaWQgfSBmcm9tICcuLi96Z3JpZC96Z3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UsIE1vZGFsUmVzcG9uc2UgfSBmcm9tICdtbWhnbG9iYWwtem1vZGFsJztcclxuaW1wb3J0IHtcclxuICBBbGVydEJ1dHRvbiwgTUVTU0FHRVRZUEUsIE1vZGFsUGFnZVBhcmFtcywgQWxlcnRTZXJ2aWNlLCBaQ29tcG9uZW50SGVscGVyLFxyXG4gIENhY2hlU2VydmljZSwgRmllbGRTZXJ2aWNlLCBSZXNvdXJjZUFwaVNlcnZpY2UsIFRyYW5zbGF0aW9uU2VydmljZSwgV2ViQXBpU2VydmljZSwgU3RvcmFnZVNlc3Npb25TZXJ2aWNlLCBPQXV0aDJTZXJ2aWNlLCBTaWduYWxyU2VydmljZSwgQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb21wb25lbnRTaXplLCBaQ29yZVNlcnZpY2UsIFpGaWVsZCwgWkdyb3VwLCBEZWZhdWx0TWVzc2FnZSwgRGVmYXVsdERpYWxvZ1RpdGxlLCBQdXNoQ2hhbmdlRXZlbnQsIEFjdGlvblR5cGUsIFRvYXN0U2VydmljZSwgQXV0aFNlcnZpY2VcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG4vLyBpbXBvcnQgeyBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi96bW9kYWwvbW9kYWwuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IFptb2RhbFBhZ2UgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLnBhZ2UnO1xyXG5cclxuLy8gaW1wb3J0IHsgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBNb2RhbFBhZ2VQYXJhbXMsIFpHcmlkIH0gZnJvbSAnLi4vZHluYW1pY2Zvcm0vemNvbXBvbmVudC5tb2RlbCc7XHJcbi8vIGltcG9ydCB7IFpHcm91cCwgWkZpZWxkIH0gZnJvbSAnLi4vbW9kZWwvemdyb3VwLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTWFpblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgZ3JvdXA6IFpHcm91cDtcclxuICBwcml2YXRlIG9hdXRoRW52aXJvbm1lbnRVcmw6IHN0cmluZztcclxuICBwcml2YXRlIGVudmlyb25tZW50O1xyXG4gIHByaXZhdGUgYmFja05hdmlnYXRpb25QYXRoOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgcm91dGVQYXJhbTogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIHByZXZpb3VzUm91dGVQYXJhbTogc3RyaW5nO1xyXG4gIHB1YmxpYyBjdXJyZW50VXJsOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHJpdmF0ZSBOQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSA9ICdyb3V0ZVBhcmFtJztcclxuICBwcml2YXRlIFBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkgPSAncHJldmlvdXNQYWdlUm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBCQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSA9ICdiYWNrTmF2aWdhdGlvblBhdGgnO1xyXG4gIHByaXZhdGUgTkFWSUdBVEVEX1JFTE9BRF9HUklEX1NUT1JBR0VfS0VZID0gJ25hdmlnYXRlZFJlbG9hZEdyaWQnO1xyXG4gIHByaXZhdGUgQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSA9ICdjbG9uZU5ld01vZGVsJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRLZXkgPSAnbXktc2VjcmV0LWtleSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2U6IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpjb3JlU2VydmljZTogWkNvcmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGVidWdTZXJ2aWNlOiBaQ29tcG9uZW50RGVidWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgc2lnbmFsclNlcnZpY2U6IFNpZ25hbHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBvYXV0aDJTZXJ2aWNlOiBPQXV0aDJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTWFpblNlcnZpY2UgY29uc3RydWN0b3InKTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRFbnZpcm9ubWVudCgpO1xyXG4gICAgdGhpcy5vYXV0aEVudmlyb25tZW50VXJsID0gdGhpcy5lbnZpcm9ubWVudC5lMU9hdXRoVXJsICsgJy8nO1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIC8vIFNob3cgcHJvZ3Jlc3Mgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXJcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2U/LmRpc21pc3MoKTtcclxuICAgICAgICAvLyBSZXNldCB0aGUgcm91dGVQYXJhbSxiYWNrTmF2aWdhdGlvblBhdGggYW5kIHJlbGF0ZWQgc2Vzc2lvblN0b3JhZ2UgY3VycmVudCBwYWdlIGlzIHN0YXJ0dXAgcGFnZVxyXG4gICAgICAgIGlmICh0aGlzLmdldFN0YXJ0dXBQYWdlKCkgPT09IGV2ZW50LnVybCkge1xyXG4gICAgICAgICAgdGhpcy5yZXNldFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRVcmwgPSBldmVudC51cmxBZnRlclJlZGlyZWN0cztcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgLy8gUHJlc2VudCBlcnJvciB0byB1c2VyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGZvciBzaWduYWxSIGFsZXJ0XHJcbiAgcHVibGljIGdldExpc3RGaWVsZE5hbWUgPSAoZmllbGROYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJuYW1lXCIsIGZpZWxkTmFtZSk7XHJcbiAgICByZXR1cm4gdGhpcy5vYXV0aDJTZXJ2aWNlLmh0dHBHZXQkKHRoaXMuZmllbGRTZXJ2aWNlLmRvd25sb2FkTGlzdEZpZWxkVXJsLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLkZpZWxkRWxlbWVudE1hc3RlcklkKSxcclxuICAgICAgc3dpdGNoTWFwKGlkID0+IHRoaXMub2F1dGgyU2VydmljZS5odHRwR2V0JCh0aGlzLmZpZWxkU2VydmljZS5kb3dubG9hZEZvcm1GaWVsZFVybCwgeyBpZCB9KSksXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLk5hbWUgYXMgc3RyaW5nKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckZvcm1MaXN0RmllbGRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZGF0YUZvcm1GaWVsZHMgPSB7fTtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLmRhdGFMaXN0RmllbGRzID0ge307XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5kYXRhTGlzdEZpZWxkSXRlbXMgPSB7fTtcclxuICB9XHJcblxyXG4gIGRpYWxvZ09wZW4ob3B0aW9uczogRGlhbG9nU2V0dGluZ3MpOiBEaWFsb2dSZWYge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKG9wdGlvbnMpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgc3RhcnRVcCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdBdCBtYWluLnNlcnZpY2UgKFN0YXJ0VXApIC4uLicpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JvdXAoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXNvdXJjZVNlcnZlckRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwRmllbGRzKFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIGZvcm1UeXBlOiBcIkxpc3RGaWVsZFwiIHwgXCJGb3JtRmllbGRcIixcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICBmb3JtVHlwZSxcclxuICAgICAgZ3JvdXAsXHJcbiAgICAgIHByb3BlcnR5TmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVHcm91cChcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgcGFnZU5hbWU6IHN0cmluZyxcclxuICAgIG1lOiBhbnlcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGdyb3VwLnJlc291cmNlVVJMTmFtZSB8fCBjdHJsTmFtZTtcclxuICAgIGdyb3VwLnJlc291cmNlVVJMTmFtZSA9IHJlc291cmNlTmFtZTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLCB7XHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwocmVzb3VyY2VOYW1lKSxcclxuICAgICAgZ3JpZENvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICBjdHJsTmFtZSxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgbnVsbFxyXG4gICAgICApLFxyXG4gICAgICBjdHJsU2NvcGU6IG1lLFxyXG4gICAgICBwYWdlTmFtZSxcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIC8vIGNyZWF0ZU1vZGVsVVJMOiBcIi9jcmVhdGVcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGVkaXRNb2RlbFVSTDogY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gbGlzdE1vZGVsVVJMOiBcIi9saXN0XCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBmb3JtSGVhZGVyOiBcIi4uLlwiLFxyXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXHJcbiAgICAgIGZpZWxkczogW10sXHJcbiAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgIHpDb21wb25lbnRzOiB7fSxcclxuICAgICAgekRhdGE6IHt9LFxyXG4gICAgICBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PFpDb21wb25lbnRPdXRwdXRFdmVudD4obnVsbCksXHJcbiAgICAgIC8vIGZvcm06IG51bGwgYXMgRm9ybUdyb3VwLCAvLyByZW1vdmVkIGZvciBidWcgZml4LlxyXG4gICAgICBjYW5jZWxCdXR0b25OYW1lOiBcIkNsb3NlXCIsXHJcbiAgICAgIHpCdXR0b25zQ291bnQ6IDAsXHJcbiAgICAgIC8vIHRvcFJpZ2h0QWN0aW9uQnV0dG9uOiBbXSxcclxuICAgICAgLy8gb25BY3Rpb246IHRoaXMub25BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgICAgYmFja05hdmlnYXRpb246IHRoaXMuYmFja05hdmlnYXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgaGlzdG9yeUJhY2s6IHRoaXMuaGlzdG9yeUJhY2suYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaFBhZ2U6IHRoaXMucmVmcmVzaFBhZ2UuYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaEdyaWQ6IHRoaXMucmVmcmVzaEdyaWQuYmluZCh0aGlzKSxcclxuICAgICAgdXBkYXRlTW9kZWw6IHRoaXMudXBkYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY3JlYXRlTW9kZWw6IHRoaXMuY3JlYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY2xvbmVOZXdNb2RlbDogdGhpcy5jbG9uZU5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGRlbGV0ZU1vZGVsOiB0aGlzLmRlbGV0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIG5ld01vZGVsOiB0aGlzLm5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIHVwZGF0ZUVkaXRNb2RlOiB0aGlzLnVwZGF0ZUVkaXRNb2RlLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIF9pc0RlYnVnZ2luZzogZW52aXJvbm1lbnQuZGVidWdTZXNzaW9uIHx8IGZhbHNlLFxyXG4gICAgICAvLyBfZGVidWc6IHtcclxuICAgICAgLy8gICB6RGF0YTogIHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGFmdGVyR2V0TW9kZWxTdWNjZXNzOiBudWxsLFxyXG4gICAgICAvLyBiZWZvcmVVcGRhdGVNb2RlbDogbnVsbCxcclxuICAgICAgLy8gaXNFZGl0OiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWUuc3Vic2NyaXB0aW9uID0gZ3JvdXAuc3ViamVjdC5zdWJzY3JpYmUoKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpID0+XHJcbiAgICAgIHRoaXMuc3ViamVjdEV2ZW50KGV2ZW50LCBncm91cCwgbWUpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBtZS5zdWJzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbCQoZ3JvdXA6IFpHcm91cCwgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZWNJZCA9IGlkIHx8IGdyb3VwLnJlZmVyZW5jZUlkO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAuaHR0cEdldCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIHJlY0lkLCBudWxsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuek1vZGVsID0gem1vZGVsO1xyXG4gICAgICAgICAgLy9pZiAoXHJcbiAgICAgICAgICAvLyAgZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQgJiZcclxuICAgICAgICAgIC8vICBPYmplY3Qua2V5cyh6bW9kZWwpLmluZGV4T2YoZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQpICE9PSAtMSAmJlxyXG4gICAgICAgICAgLy8gICFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UuZW5kc1dpdGgoXCIuZWRpdFwiKVxyXG4gICAgICAgICAgLy8pIHtcclxuICAgICAgICAgIC8vICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgPVxyXG4gICAgICAgICAgLy8gICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlICtcclxuICAgICAgICAgIC8vICAgIFwiL1wiICtcclxuICAgICAgICAgIC8vICAgIHptb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0udG9TdHJpbmcoKSArXHJcbiAgICAgICAgICAvLyAgICBcIi9lZGl0XCI7XHJcbiAgICAgICAgICAvL31cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIC8vIGNvbnN0IHJlcGx5U3ViID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIC8vIHRoaXMuYWxlcnRDdHJsXHJcbiAgICAvLyAgIC5jcmVhdGUoe1xyXG4gICAgLy8gICAgIGhlYWRlcjogXCJEYXRhIG5vdCBzYXZlIHlldFwiLFxyXG4gICAgLy8gICAgIC8vIHN1YkhlYWRlcjogJ1N1YkhlYWRlciBzdGF0ZW1lbnQgaGVyZScsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLFxyXG4gICAgLy8gICAgIGJ1dHRvbnM6IFtcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJDYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgcm9sZTogXCJjYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwid2FybmluZ1wiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIF1cclxuICAgIC8vICAgfSlcclxuICAgIC8vICAgLnRoZW4oYWxlcnRFbGVtZW50ID0+IHtcclxuICAgIC8vICAgICBhbGVydEVsZW1lbnQucHJlc2VudCgpO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHJldHVybiByZXBseVN1Yi5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgb3Blbk1vZGFsRm9ybShtb2RhbFBhcmFtczogTW9kYWxQYWdlUGFyYW1zKSB7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZyhcIm9wZW5Nb2RhbEZvcm1cIik7XHJcbiAgLy8gICBjb25zb2xlLmVycm9yKFxyXG4gIC8vICAgICBcIlBsZWFzZSB1c2UgTW9kYWxTZXJ2aWNlLnNob3cgaW5zdGVhZCBvZiBNYWluU2VydmljZS5vcGVuTW9kYWxGb3JtIVwiXHJcbiAgLy8gICApO1xyXG4gIC8vICAgLy8gY29uc3QgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFyYW1zLmNvbEZpZWxkcyQgfHwgbW9kYWxQYXJhbXMuY29udHJvbGxlck5hbWUsIG1vZGFsUGFyYW1zLnBhcmVudEdyb3VwLFxyXG4gIC8vICAgLy8gICBtb2RhbFBhcmFtcy5mb3JtSGVhZGVyLCBtb2RhbFBhcmFtcy56TW9kZWwsIG1vZGFsUGFyYW1zLnJlZmVySWQpO1xyXG4gIC8vICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xyXG4gIC8vICAgICBjb21wb25lbnQ6IFptb2RhbFBhZ2UsXHJcbiAgLy8gICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcclxuICAvLyAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAvLyAgICAgICBtb2RhbFBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWwucHJlc2VudCgpO1xyXG4gIC8vICAgcmV0dXJuIG1vZGFsO1xyXG4gIC8vICAgLy8gLm9uV2lsbERpc21pc3MoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgLy8gICAvLyAgIHRoaXMuXHJcbiAgLy8gICAvLyB9KTtcclxuICAvLyB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuc3ViamVjdCkge1xyXG4gICAgICBncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiTW9kYWxTZXJ2aWNlLmNsb3NlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiBcIm1vZGFsR3JvdXAubW9kYWxDYW5jZWwoKVwiXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCI+PiBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIGdyb3VwLmN0cmxTY29wZSxcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgZ3JvdXBcclxuICAgICAgKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGV2ZW50LlRhcmdldCwgZ3JvdXApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgZXJyb3JcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxsRnVuYyhldmVudCk7XHJcbiAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICBuZXdGdW5jKGV2ZW50LCBncm91cCwgbWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUuZW5kc1dpdGgoXCJvbk5hdmlnYXRlVG9cIikpIHtcclxuICAgICAgICBjb25zdCBuVXJsID0gZXZlbnQudGFyZ2V0LnJlcGxhY2UoXCIvOmlkXCIsIFwiL1wiICsgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgLy8gKGNhbGxGdW5jLnN0YXJ0c1dpdGgoJ2VkaXQnKSkgeyAgemdyaWQtY2VsbENsaWNrXHJcbiAgICAgICAgY29uc3QgY05hbWUgPSBjYWxsRnVuYy5zbGljZSg0KTtcclxuICAgICAgICAvLyAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAvLyBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNOYW1lO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcblxyXG4gICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNOYW1lLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBcIlwiLFxyXG4gICAgICAgICAge30sXHJcbiAgICAgICAgICBldmVudC5kYXRhLklkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICBpZiAoY2FsbEZ1bmMubmF2aWdhdGVVcmwpIHtcclxuICAgICAgICAgIGNvbnN0IHVybCA9IGNhbGxGdW5jLm5hdmlnYXRlVXJsLnJlcGxhY2UoXCI6aWRcIiwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNhbGxGdW5jLmN0cmxOYW1lO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmZvcm1IZWFkZXIgPSBjYWxsRnVuYy5mb3JtSGVhZGVyO1xyXG5cclxuICAgICAgICBpZiAoY2FsbEZ1bmMuZm9ybUhlYWRlcikge1xyXG4gICAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFxyXG4gICAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNhbGxGdW5jLmN0cmxOYW1lLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgY2FsbEZ1bmMuZm9ybUhlYWRlcixcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzICYmIHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0NyZWF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc1VwZGF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0RlbGV0ZU1zZykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBzZXNzaW9uc3RvcmFnZSB0byB0cmlnZ2VyIHVwZGF0ZSB1cG9uIGNyZWF0ZWRcclxuXHJcbiAgICAgIC8vIEFsZXJ0IHVzZXIgdXBkYXRlL3NhdmUgc3VjY2Vzc1xyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2Vzcywgc3VjY2Vzc01zZywgbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlVcGRhdGVHcm91cFRyaWdnZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3V0ZU5hdmlnYXRlKHBhZ2VOYW1lOiBzdHJpbmcsIHBhZ2VQYXJhbXM6IHN0cmluZ1tdLCByb3V0ZVJlbGF0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKHBhZ2VQYXJhbXMpO1xyXG4gICAgY29uc3Qgc25hcHNob3RVcmwgPSB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgIGNvbnN0IHBhZ2VVcmwgPSByb3V0ZVJlbGF0aXZlID8gc25hcHNob3RVcmwgKyAnLycgKyBwYWdlTmFtZSA6IHBhZ2VOYW1lO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYWdlVXJsXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5hdmlnYXRpb25QYXJhbXModXJsUGFyYW1zOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gSWYgaXQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUluTGFzdEVsZW1lbnQodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgsIHRoaXMucm91dGVyLnVybCkpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucHVzaCh0aGlzLnJvdXRlci51cmwpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbSh1cmxQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJvdXRlUGFyYW0ocm91dGVQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdGVyIG91dCBhbnkgZW1wdHkgc3RyaW5nIHJvdXRlIHBhcmFtcyBhbmQgam9pbiB0aGVtIGludG8gYSBzaW5nbGUgc3RyaW5nXHJcbiAgICBjb25zdCBuZXdSb3V0ZVBhcmFtID0gJy8nICsgT2JqZWN0LnZhbHVlcyhyb3V0ZVBhcmFtcykuZmlsdGVyKGVsID0+IGVsICE9PSAnJykuam9pbignLycpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLnJvdXRlUGFyYW0sIG5ld1JvdXRlUGFyYW0pKSB7XHJcbiAgICAgIGlmIChyb3V0ZVBhcmFtcykge1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHByZXZpb3VzIHBhZ2UncyByb3V0ZSBwYXJhbSB0byBiZSB1c2VkIGZvciBiYWNrbmF2aWdhdGlvbiBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtW3RoaXMucm91dGVQYXJhbS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGV4aXN0cywgY2hlY2sgaWYgdGhlIGxhc3Qgc2VnbWVudCBpcyAnbmV3JyBvciAndXBkYXRlJ1xyXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1TZWdtZW50ID0gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IHBhcmFtU2VnbWVudFtwYXJhbVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnLCBzdG9yZSB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gaW4gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gJ25ldycgfHwgYWN0aW9uU2VnbWVudCA9PT0gJ2VkaXQnIHx8IGFjdGlvblNlZ21lbnQgPT09ICd1cGRhdGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJvdXRlIHBhcmFtIHRvIHRoZSByb3V0ZVBhcmFtIGFycmF5IGFuZCBzdG9yZSBpdCBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaChuZXdSb3V0ZVBhcmFtKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbHVlSW5MYXN0RWxlbWVudChhcnJheTogYW55W10sIHRhcmdldFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChhcnJheVthcnJheS5sZW5ndGggLSAxXSA9PT0gdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmF2aWdhdGVGcm9tTWVudShwYWdlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7IHN0YXJ0VXBQYWdlIH0gPSB0aGlzLmVudmlyb25tZW50O1xyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtKFtgJHtzdGFydFVwUGFnZX1gXSk7XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wdXNoKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShbdGhpcy5nZXRTdGFydHVwUGFnZSgpXSkpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhZ2VOYW1lXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0Um91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvblBhcmFtcygpOiBhbnlbXSB7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0gPSB0aGlzLnJvdXRlUGFyYW0gfHwgW107XHJcblxyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbS5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgc3RvcmVkUGFyYW1zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZKTtcclxuICAgICAgaWYgKHN0b3JlZFBhcmFtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHN0b3JlZFBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3RvcmVkIHJvdXRlUGFyYW06JywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdObyBzdG9yZWQgbmF2aWdhdGlvbiBwYXJhbXMgZm91bmQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucm91dGVQYXJhbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYXZpZ2F0aW9uUGFyZW50UGFyYW0oKTogYW55IHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25QYXJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvblBhcmVudFBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0aW9uUGFyZW50UGFyYW1zW25hdmlnYXRpb25QYXJlbnRQYXJhbXMubGVuZ3RoIC0gMl07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIHBhcmVudCBwYXJhbXMgbm90IGZvdW5kLicpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpOiBhbnkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXNbbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIGN1cnJlbnQgcGFyYW1zIG5vdCBmb3VuZC4nKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBSZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSBpZiBpdCBleGlzdHNcclxuICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbVN0ciA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICAgIGlmIChwcmV2aW91c1JvdXRlUGFyYW1TdHIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHByZXZpb3VzUm91dGVQYXJhbVN0cik7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gPSBwcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYFVuYWJsZSB0byBwYXJzZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBmcm9tIHNlc3Npb24gc3RvcmFnZTogJHtlcnJvcn1gKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdObyBwcmV2aW91cyBwYWdlIHJvdXRlIHBhcmFtIGZvdW5kIGluIHNlc3Npb24gc3RvcmFnZS4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUodGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0TmF2aWdhdGVSZWNvcmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wb3AoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIk5vIGJhY2sgbmF2aWdhdGlvbiBwYXRoIGZvdW5kIGluIHNlc3Npb24uXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtLnBvcCgpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInJvdXRlUGFyYW0gc2Vzc2lvbiBpcyBudWxsLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBiYWNrTmF2aWdhdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UoZ3JvdXApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwOiBaR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBjb25zdCBiYWNrTmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpKTtcclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uVVJMID0gZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlIHx8IGJhY2tOYXZpZ2F0aW9uUGF0aFtiYWNrTmF2aWdhdGlvblBhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgaWYgKCFiYWNrTmF2aWdhdGlvblVSTCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6IGJhY2tOYXZpZ2F0aW9uVVJMIGlzIG5vdCBzZXQuXCIpO1xyXG4gICAgICAvL3Rocm93IG5ldyBFcnJvcihcIkJhY2tOYXZpZ2F0aW9uUGF0aCBub3Qgc2V0LlwiKTtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSB0aGlzLmdldFByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgY29uc3QgcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSA9IHRoaXMuZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpO1xyXG4gICAgICBpZiAodGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnJvdXRlTmF2aWdhdGUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJldmlvdXNSb3V0ZVBhcmFtICYmIHByZXZpb3VzUm91dGVQYXJhbSA9PT0gcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSkge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTdGFydHVwUGFnZSgpIHtcclxuICAgIGNvbnN0IHsgc3RhcnRVcFBhZ2UgfSA9IHRoaXMuZW52aXJvbm1lbnQ7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXJ0dXAgcGFnZSBzdGFydHMgd2l0aCBhIHVuZGVyc2NvcmUuXHJcbiAgICBpZiAoc3RhcnRVcFBhZ2Uuc3RhcnRzV2l0aCgnXycpKSB7XHJcbiAgICAgIHJldHVybiBgLyR7c3RhcnRVcFBhZ2Uuc2xpY2UoMSl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBub3QsIHByZXBlbmQgYSBmb3J3YXJkIHNsYXNoIGFuZCByZXR1cm4uXHJcbiAgICByZXR1cm4gYC8ke3N0YXJ0VXBQYWdlfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlCYWNrKCkge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KHRoaXMuZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uYXZDb250cm9sbGVyLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKFxyXG4gICAgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBtZTogYW55LFxyXG4gICAgZ3JpZE9wdGlvbk5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbk5hbWUgfHwgXCJncmlkT3B0aW9uc1wiO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCkge1xyXG4gICAgICBjb25zdCBncmlkT3B0aW9uID0gZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKFwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKVwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiZ3JvdXAucmVmcmVzaEdyaWRcIiwgXCJcIik7XHJcbiAgICAgIGlmIChncmlkT3B0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtncmlkT3B0aW9uTmFtZV0gYXMgWkdyaWQ7XHJcbiAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoUGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUgPSAoKSA9PiBmYWxzZTtcclxuICAgIC8vIHRoaXMucm91dGVyLm9uU2FtZVVybE5hdmlnYXRpb24gPSAncmVsb2FkJztcclxuICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoOiAnLCB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY3JtL2N1c3RvbWVyJ10pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvbmVOZXdDYWNoZVpNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICBpZiAoY2FjaGVaTW9kZWwpIHtcclxuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXJDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgICBncm91cC56TW9kZWwgPSBjYWNoZVpNb2RlbDtcclxuICAgICAgZ3JvdXAuek1vZGVsLklkID0gMDtcclxuICAgIH1cclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIG9mKFtdKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIG5ldywgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjdXJyZW50IHVybDogXCIsIHRoaXMucm91dGVyLnVybCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZ3JvdXAucGFyZW50UmVmZXJlbmNlSWQgfHwgXCIwXCI7XHJcbiAgICAgICAgLy9jb25zdCBwYXRoU2VnbWVudCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgLy9jb25zdCBsYXN0U2VnbWVudCA9IHBhdGhTZWdtZW50W3BhdGhTZWdtZW50Lmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uU2VnbWVudHMgPSBjdXJyZW50TmF2aWdhdGlvblBhcmFtID8gY3VycmVudE5hdmlnYXRpb25QYXJhbS5zcGxpdCgnLycpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gZ3JvdXAuaXNDbG9uZU5ldyA/ICduZXcnIDogJ2VkaXQnO1xyXG4gICAgICAgIGNvbnN0IGFjdGlvblNlZ21lbnQgPSBncm91cC5pc0Nsb25lTmV3ID8gKG5hdmlnYXRpb25TZWdtZW50cyA/IG5hdmlnYXRpb25TZWdtZW50c1tuYXZpZ2F0aW9uU2VnbWVudHMubGVuZ3RoIC0gMV0gOiAnbmV3JykgOiBkZWZhdWx0QWN0aW9uO1xyXG5cclxuICAgICAgICBpZiAoZ3JvdXAuaXNMaXN0Rm9ybSkge1xyXG4gICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMXSwge1xyXG4gICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyAxOiBGcm9tIExpc3QgTmV3KGFjdGlvbjogbmV3KSA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gMjogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDM6IEZyb20gRm9ybSBOZXcoYWN0aW9uOiBuZXcpLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDQ6IEZyb20gRm9ybSBOZXcoYWN0aW9uOiBuZXcpLCBpc0Nsb25lTmV3LCBTYXZlLCBDbGljayBOZXcgPT0+IENsZWFyIGZvcm0gKFdoZW4gQ3JlYXRlTW9kZWwsIG5lZWQgY2hhbmdlIGlzQ2xvbmVOZXcgPSBmYWxzZSlcclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDU6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDY6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBpc0Nsb25lTmV3LCBTYXZlLCBDbGljayBOZXcgPT0+IENsZWFyIGZvcm0gKFdoZW4gVXBkYXRlTW9kZWwsIG5lZWQgY2hhbmdlIGlzQ2xvbmVOZXcgPSBmYWxzZSlcclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDc6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBDbGljayBOZXcgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDg6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBDbGljayBOZXcsIFNhdmUsIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG5cclxuICAgICAgICAgIGlmIChhY3Rpb25TZWdtZW50ID09PSBcImVkaXRcIiB8fCBhY3Rpb25TZWdtZW50ID09PSBcIm5ld1wiKSB7XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICAgICAgICAgIGdyb3VwLmZvcm0ucmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwLCBldmVudC5kYXRhLnpCdXR0b25OYW1lKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IFwiZWRpdFwiKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2xlYXIgY2xvbmVOZXdNb2RlbCBjYWNoZShpZiBoYXZlKVxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvL3RoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0Um91dGVQYXJhbShbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcblxyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0gPSByZWZlcmVuY2VJZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBncm91cC5pc0VkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgJ25ldyddKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NDcmVhdGVkTWVzc2FnZSB8fCBcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIjtcclxuICAgIGxldCBjcmVhdGVNb2RlbHJlcyA9IG51bGw7XHJcblxyXG4gICAgaWYgKCFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2Uuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoZ3JvdXAuek1vZGVsKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGNyZWF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZUNyZWF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwLnNraXBDcmVhdGVVc2luZ0Zvcm1WYWx1ZSkge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld01vZGVsID0gT2JqZWN0LmFzc2lnbih7fSwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICBaQ29tcG9uZW50SGVscGVyLnJlbW92ZU51bGxGaWVsZHMobmV3TW9kZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChncm91cC5yZXNvdXJjZVVSTCwgbmV3TW9kZWwpLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgY3JlYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgY3JlYXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkek1vZGVsKGZnLCB6bW9kZWwsIGdyb3VwKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZnRlckNyZWF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgaWYgKGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gbnVsbCB8fCBjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgIGlmIChyZXNwICYmIGdyb3VwLnpNb2RlbC5JZCAhPT0gMCkge1xyXG4gICAgICAgICAgICBncm91cC5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICBncm91cC5pc0Nsb25lTmV3ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmNhbmNlbEJ1dHRvbk5hbWUgPSBcIkNsb3NlXCI7XHJcbiAgICAgICAgICAgIC8vIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICAgICAgLy8gZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcblxyXG4gICAgICAgICAgaWYgKChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlckNyZWF0ZWQpICYmICFncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgIC8vIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXCJSZWNvcmQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLnVwZGF0ZU1vZGVsT2JzZXJ2YWJsZShldmVudCwgZ3JvdXApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZU1vZGVsT2JzZXJ2YWJsZShldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBmb3JtOiBGb3JtR3JvdXAgPSBudWxsLCB1cGRhdGVBUElPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGFueT4gPSBudWxsLCBpc1NraXBEaXJ0eSA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGZnID0gZm9ybSB8fCBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzVXBkYXRlZE1lc3NhZ2UgfHwgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCI7XHJcbiAgICBsZXQgdXBkYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0Zvcm1EaXJ0eUFuZFZhbGlkKGZnLCBncm91cCwgaXNTa2lwRGlydHksIGV2ZW50KSkge1xyXG4gICAgICBpZiAoaXNTa2lwRGlydHkpIHtcclxuICAgICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVBUElPYnNlcnZhYmxlID0gdXBkYXRlQVBJT2JzZXJ2YWJsZSB8fCB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFB1dCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIGdyb3VwLnpNb2RlbC5JZCwgZ3JvdXAuek1vZGVsLCBmYWxzZSkucGlwZShcclxuICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICkpO1xyXG5cclxuICAgIHJldHVybiBvZihncm91cC56TW9kZWwpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgdXBkYXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBpZiAoIWdyb3VwLnNraXBVcGRhdGVVc2luZ0Zvcm1WYWx1ZSkge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB1cGRhdGVBUElPYnNlcnZhYmxlO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKChyZXNwOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIHVwZGF0ZWQsIHJlc3BvbnNlOlwiLCByZXNwKTtcclxuICAgICAgICB1cGRhdGVNb2RlbHJlcyA9IHJlc3A7XHJcbiAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkek1vZGVsKGZnLCByZXNwLCBncm91cCk7XHJcbiAgICAgICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCByZXNwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgIGlmICh1cGRhdGVNb2RlbHJlcyAmJiB1cGRhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNDbG9zZUFmdGVyU3VjY2VzcyB8fCBncm91cC5pc0Nsb3NlQWZ0ZXJVcGRhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9uZXMgYSBuZXcgbW9kZWwgZm9yIGEgWkdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBaQ29tcG9uZW50T3V0cHV0RXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pDb21wb25lbnRPdXRwdXRFdmVudH0gZXZlbnQgLSBUaGUgWkNvbXBvbmVudE91dHB1dEV2ZW50IHRyaWdnZXJpbmcgdGhlIGNsb25lLlxyXG4gICAqIEBwYXJhbSB7Wkdyb3VwfSBncm91cCAtIFRoZSBaR3JvdXAgdG8gY2xvbmUgdGhlIG5ldyBtb2RlbCBmb3IuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbG9uZU5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIC8vIFNldCBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgaXMgYmVpbmcgY2xvbmVkXHJcbiAgICBncm91cC5pc0Nsb25lTmV3ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHRoZSBmdW5jdGlvbiB2YWx1ZSBmcm9tIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XHJcbiAgICBjb25zdCBmdW5jdGlvblZhbHVlID0gdGFyZ2V0Py5tYXRjaCgvXFwoKFteKV0rKVxcKS8pPy5bMV07XHJcblxyXG4gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIHZhbHVlIGlzICd0cnVlJywgcmVzZXQgdGhlIGZvcm0gYW5kIG1vZGVsXHJcbiAgICBpZiAoZnVuY3Rpb25WYWx1ZSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICBncm91cC5mb3JtLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmaW5lIHRoZSB2YWx1ZXMgZm9yIHRoZSBXRlMgbW9kZWxcclxuICAgIGNvbnN0IG5ld01vZGVsVmFsdWVzID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgV0ZTX0RvY3VtZW50SWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNDb2RlOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzSWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNOYW1lOiBudWxsLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBc3NpZ24gdGhlIFdGUyBtb2RlbCB2YWx1ZXMgdG8gdGhlIGZvcm0gdmFsdWUgYW5kIFpNb2RlbFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC5mb3JtLnZhbHVlLCBuZXdNb2RlbFZhbHVlcyk7XHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZ3JvdXAuZm9ybS52YWx1ZSk7XHJcblxyXG4gICAgLy8gUGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgWk1vZGVsLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgY2FjaGUgdGhlIFpNb2RlbFxyXG4gICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGZnLnBhdGNoVmFsdWUoZ3JvdXAuek1vZGVsKTtcclxuICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVksIGdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgLy8gQ2FsbCB0aGUgbmV3TW9kZWwgZnVuY3Rpb24gZm9yIHRoZSBncm91cFxyXG4gICAgdGhpcy5uZXdNb2RlbChudWxsLCBncm91cCk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgIGlmICh0aGlzLmlzVHlwZUNvZGVGdW5jdGlvbihldmVudCkpIHtcclxuICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YS56QnV0dG9uTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHRyaWdnZXIgZmxhZ1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NEZWxldGVkTWVzc2FnZSB8fCBcIlJlY29yZCBpcyBkZWxldGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRlbXBSZXNwb25zZSA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgZGVsZXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmhpc3RvcnlCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFJlc3BvbnNlWydQcm9jZXNzaW5nU3RhdHVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZnLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZ3JvdXAuek1vZGVsLkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaFVwZGF0ZWR6TW9kZWwoZmc6IEZvcm1Hcm91cCwgcmVzcDogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAocmVzcCkge1xyXG4gICAgICBpZiAocmVzcC5EYXRhKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3AuRGF0YSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0RGF0YSA9IFpDb21wb25lbnRIZWxwZXIucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhyZXNwLkRhdGEsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJlc3BbXCJJZFwiXSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gWkNvbXBvbmVudEhlbHBlci5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRmFpbGVkIHRvIHBhdGNoVXBkYXRlZHpNb2RlbCB0byB0aGUgZm9ybWdyb3VwXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXAucmVmZXJlbmNlSWQgPSBncm91cC56TW9kZWwuSWQ7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVHlwZUNvZGVGdW5jdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICByZXR1cm4gZXZlbnQ/LmRhdGE/LlR5cGVDb2RlID09PSAnRlVOQ1RJT04nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cDogWkdyb3VwLCB6QnV0dG9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudChncm91cCwgYHp3b3JrZmxvd2J1dHRvbnNfJHt6QnV0dG9uTmFtZX1gKTtcclxuICAgIHdvcmtmbG93QnV0dG9ucz8uWydsb2FkQnV0dG9uJ10/LigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRm9ybURpcnR5QW5kVmFsaWQoZmc6IEZvcm1Hcm91cCwgZ3JvdXA6IFpHcm91cCwgaXNTa2lwRGlydHkgPSBmYWxzZSwgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFpc1NraXBEaXJ0eSAmJiAhZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdID8gZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdIDogRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlO1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93T2theShEZWZhdWx0RGlhbG9nVGl0bGUubm90aGluZ1RvVXBkYXRlLCBtZXNzYWdlLCBbXCJjb2wtNVwiXSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZS5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKGdyb3VwLCBmZyk7XHJcbiAgICAgIGZnLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEZWxldGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVOZXdNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZU5ld29kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVDcmVhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuek1vZGVsLklkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInpNb2RlbC5JZCBpcyBub3QgZGVmaW5lZFwiLCBncm91cC56TW9kZWwpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckdldE1vZGVsU3VjY2VzcyBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgfVxyXG5cclxuICBhZnRlck5ld01vZGVsKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlck5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJVcGRhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckRlbGV0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNsb25lTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNsb25lTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBvbkFjdGlvbihncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICB0aGlzLmFjdGlvblNoZWV0Q3RybFxyXG4gIC8vICAgICAuY3JlYXRlKHtcclxuICAvLyAgICAgICBoZWFkZXI6IFwiQ2hvb3NlIGFuIEFjdGlvblwiLFxyXG4gIC8vICAgICAgIGJ1dHRvbnM6IGdyb3VwLnRvcFJpZ2h0QWN0aW9uQnV0dG9uXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC50aGVuKGFjdGlvblNoZWV0RWwgPT4ge1xyXG4gIC8vICAgICAgIGFjdGlvblNoZWV0RWwucHJlc2VudCgpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldE1vZGVsVmFsdWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIGdyb3VwLnpNb2RlbFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgLy8gICBpZiAoZ3JvdXAuaXNMb2FkaW5nKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgLy8gICBpZiAoIWZnKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICwgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmYyA9IGZnLmNvbnRyb2xzW3Byb3BlcnR5TmFtZV07XHJcbiAgLy8gICBpZiAoIWZjKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZmMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIC8vICAgZmMubWFya0FzRGlydHkoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzaG93ek1vZGFsKFxyXG4gICAgY29sRmllbGRzJDogc3RyaW5nIHwgT2JzZXJ2YWJsZTxBcnJheTxaRmllbGQ+PixcclxuICAgIHBhcmVudEdyb3VwOiBaR3JvdXAsXHJcbiAgICBmb3JtSGVhZGVyOiBzdHJpbmcsXHJcbiAgICB6TW9kZWw/OiBhbnksXHJcbiAgICByZWZlcklkPzogc3RyaW5nLFxyXG4gICAgY29tcG9uZW50U2l6ZT86IFpDb21wb25lbnRTaXplLFxyXG4gICAgc2tpcElzRGlydHlDaGVjaz86IGJvb2xlYW4sXHJcbiAgICB2YWxpZGF0ZUlzUmVxdWlyZWQ/OiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICBjb25zdCBtb2RhbGNvbXBvbmVudCA9IFptb2RhbENvbXBvbmVudDtcclxuICAgIGNvbnN0IG1vZGFsbW9iaWxlY29tcG9uZW50ID0gWm1vZGFsTW9iaWxlQ29tcG9uZW50O1xyXG5cclxuICAgIGlmIChwYXJlbnRHcm91cCkge1xyXG4gICAgICAvLyBkaXNhYmxlIGlzVHJpZ2dlcmVkIGJlZm9yZSBkaXNwbGF5IHRoZSBwb3B1cC5cclxuICAgICAgcGFyZW50R3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KGNvbEZpZWxkcyQsIHBhcmVudEdyb3VwLCBmb3JtSGVhZGVyLCBtb2RhbGNvbXBvbmVudCwgbW9kYWxtb2JpbGVjb21wb25lbnQsIHpNb2RlbCwgcmVmZXJJZCwgY29tcG9uZW50U2l6ZSwgc2tpcElzRGlydHlDaGVjaywgdmFsaWRhdGVJc1JlcXVpcmVkKTtcclxuICAgIC8vY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlUG9zdChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzXCI7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVZhbHVlID0ge1xyXG4gICAgICAnTmFtZSc6IG5hbWUsXHJcbiAgICAgICdWYWx1ZSc6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ3JpZCBjb25maWcgc2F2ZWQoXCIgKyByZXMuc3RhdHVzICsgXCIpOiBcIiwgcmVzKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVHZXQobmFtZTogc3RyaW5nLCBhY2Nlc3NUb2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzLz9uYW1lPVwiICsgbmFtZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKGNvb2tpZVN0b3JlVVJMLCB7IGhlYWRlcnM6IGFjY2Vzc1Rva2VuIH0pLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVEZWxldGVNdWx0aXBsZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJBZG1pbi9EZWxldGVNdWx0aXBsZUNvb2tpZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdjb250YWluTmFtZSc6IG5hbWVcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoY29va2llU3RvcmVVUkwsIGNvb2tpZVN0b3JlVmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbGVtZW50QnlJZChpZDogc3RyaW5nLCBiZWhhdmlvcjogJ3Ntb290aCcgfCAnYXV0bycgPSAnc21vb3RoJykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcbiAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYW5zbGF0aW9uUGFnZUVsZW1lbnQoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBvYnNMaXN0ID0gbmV3IEFycmF5PE9ic2VydmFibGU8YW55Pj4oKTtcclxuICAgIGlmIChncm91cC5mb3JtSGVhZGVyKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlU2luZ2xlSXRlbShncm91cCwgXCJmb3JtSGVhZGVyXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JvdXAubmF2SXRlbXMgJiYgZ3JvdXAubmF2SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBvYnNMaXN0LnB1c2godGhpcy50cmFuc2xhdGlvblNlcnZpY2UuJHRyYW5zbGF0ZUl0ZW1MaXN0KGdyb3VwLm5hdkl0ZW1zLCBcInRleHRcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvYnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihvYnNMaXN0KTtcclxuICB9XHJcblxyXG5cclxuICAvLyNyZWdpb24gc2lnbmFsUiBzZXJ2aWNlXHJcbiAgcHVibGljIGpvaW5Qcm9qZWN0U2lnbmFsUihwcm9qZWN0Q29kZT86IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuc2lnbmFsclNlcnZpY2Uuc2lnbmFsUkVuYWJsZWQoKSkge1xyXG4gICAgICBpZiAocHJvamVjdENvZGUpIHtcclxuICAgICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLmpvaW5Hcm91cChwcm9qZWN0Q29kZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gV2UgZGVmYXVsdCBmaXJzdCBwcm9qZWN0IGNvZGUgaW4gZW52aXJvbm1lbnQgYXMgZ3JvdXBcclxuICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCk7XHJcbiAgICAgICAgY29uc3QgZmlyc3RQcm9qZWN0Q29kZSA9IGVudmlyb25tZW50LnByb2plY3RDb2Rlc1swXTtcclxuICAgICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLmpvaW5Hcm91cChmaXJzdFByb2plY3RDb2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2Fybignc2lnbmFsUiBub3QgZW5hYmxlZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVTaWduYWxSTW9kaWZpY2F0aW9uQWxlcnQoZm9ybUlkOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNpZ25hbHJTZXJ2aWNlLnNpZ25hbFJFbmFibGVkKCkpIHtcclxuICAgICAgY29uc3QgZXZlbnROYW1lID0gYCR7d2luZG93LmxvY2F0aW9uLmhyZWZ9YC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csIFwiJDFcIik7XHJcbiAgICAgIGlmICghdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyWydhbGVydEZvcm1Nb2RpZmllZCddID0gdGhpcy5hbGVydEZvcm1Nb2RpZmllZC5iaW5kKHRoaXMsIGZvcm1JZCk7XHJcblxyXG4gICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLnN1YnNjcmliZVRvRXZlbnQodGhpcy5ncm91cCwgYCR7ZXZlbnROYW1lfWAsIGBncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyLmFsZXJ0Rm9ybU1vZGlmaWVkYCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdzaWduYWxSIG5vdCBlbmFibGVkLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhbGVydEZvcm1Nb2RpZmllZChmb3JtSWQ6IHN0cmluZywgZ3JvdXA6IFpHcm91cCwgcmVzcDogYW55LCBldmVudE5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKCFyZXNwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwUmVzdWx0ID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICBpZiAoIXJlc3BSZXN1bHQuVXNlck5hbWUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtSWQgPT09IHJlc3BSZXN1bHQuSWQ/LnRvU3RyaW5nKCkgJiYgZXZlbnROYW1lID09PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xyXG4gICAgICBpZiAocmVzcFJlc3VsdC5Vc2VyTmFtZSA9PT0gdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLm15UHJvZmlsZS5Vc2VyTmFtZSkge1xyXG4gICAgICAgIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAgICAgICAgIHRoaXMucmVsb2FkRGF0YUFuZFdvcmtmbG93QnV0dG9uKHJlc3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAocmVzcFJlc3VsdC5BY3Rpb24gPT09IEFjdGlvblR5cGUuRGVsZXRlKSB7XHJcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiUmVjb3JkIERlbGV0ZWQgYnkgQW5vdGhlciBVc2VyXCIsIFwiVGhlIGN1cnJlbnQgcmVjb3JkIGhhcyBiZWVuIGRlbGV0ZWQgYnkgYW5vdGhlciB1c2VyLlwiLCBbXHJcbiAgICAgICAgICAgIHsgdGV4dDogXCJPS1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgXSwgW1wiY29sLTZcIl0sIHVuZGVmaW5lZCwgdHJ1ZSkucGlwZShzd2l0Y2hNYXAoKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJPS1wiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzcFJlc3VsdC5BY3Rpb24gPT09IEFjdGlvblR5cGUuVXBkYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoYCR7dGhpcy5ncm91cC5yZXNvdXJjZVVSTH0vJHtmb3JtSWR9YCwgbnVsbCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcCAmJiByZXNwLlJvd1ZlcnNpb24pIHtcclxuICAgICAgICAgICAgICBpZiAocmVzcC5Sb3dWZXJzaW9uICE9PSB0aGlzLmdyb3VwLnpNb2RlbD8uUm93VmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc2hvdyhcIlRoZSBjdXJyZW50IHBhZ2UgaGFzIGJlZW4gbW9kaWZpZWQgYnkgb3RoZXIgdXNlcnMuXCIsIFwiV291bGQgeW91IGxpa2UgdG8gcmVmcmVzaCB0aGUgcGFnZSBkYXRhP1wiLCBbXHJcbiAgICAgICAgICAgICAgICAgIHsgdGV4dDogXCJOb1wiLCBjc3NDbGFzczogXCJzZWNvbmRhcnlcIiB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgICAgICAgICAgICAgICB7IHRleHQ6IFwiWWVzXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICAgICAgICBdLCBbXCJjb2wtNlwiXSwgdW5kZWZpbmVkLCB0cnVlKS5waXBlKHN3aXRjaE1hcCgocmVwbHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJlcGx5ID09PSBcIlllc1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhQW5kV29ya2Zsb3dCdXR0b24ocmVzcCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvd1Blcm1hbmVudGx5KCdUaGUgZGF0YSBvbiB0aGUgY3VycmVudCBwYWdlIGlzIG5vdCB1cCB0byBkYXRlLCBhcyBpdCBoYXMgYmVlbiBzYXZlZCBhbmQgb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciB1c2VyLiBQbGVhc2UgcmVmcmVzaCB0aGUgcGFnZS4nLCAndG9wJywgJ3dhcm5pbmcnKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBbGVydCByZWNlaXZlZCByZWdhcmRpbmcgZm9ybSBtb2RpZmljYXRpb24sIFJvd1ZlcnNpb24gcmVtYWlucyB1bmFsdGVyZWQuIE5vIGZ1cnRoZXIgYWN0aW9uIGhhcyBiZWVuIHRha2VuLmApXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVsb2FkRGF0YUFuZFdvcmtmbG93QnV0dG9uKHpNb2RlbDogYW55KSB7XHJcbiAgICB0aGlzLmdyb3VwLnpNb2RlbCA9IHpNb2RlbDtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSB0aGlzLmdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgZmcucGF0Y2hWYWx1ZSh0aGlzLmdyb3VwLnpNb2RlbCk7XHJcbiAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgIC8vIENhcHR1cmUgYWxsIHdvcmtmbG93IGJ1dHRvbnNcclxuICAgIGNvbnN0IHdvcmtmbG93QnV0dG9ucyA9IE9iamVjdC5rZXlzKHRoaXMuZ3JvdXAuekNvbXBvbmVudHMpXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKFwiendvcmtmbG93YnV0dG9uc19cIikpXHJcbiAgICAgIC5tYXAoa2V5ID0+IHRoaXMuZ3JvdXAuekNvbXBvbmVudHNba2V5XSk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHdvcmtmbG93IGJ1dHRvbnNcclxuICAgIHdvcmtmbG93QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XHJcbiAgICAgIGJ1dHRvbi5sb2FkQnV0dG9uKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgIFxyXG4gIC8vICNyZWdpb24gREVDXHJcbiAgcHVibGljIGFzeW5jIGxvYWRDb250YWluZXJWaWV3KGVsZW1lbnRDb250YWluZXI6IGFueSwgY29udGFpbmVyUGFnZTogYW55LCBkYXRhOiBaRmllbGQsIGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWVsZW1lbnRDb250YWluZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50Q29udGFpbmVyIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb250YWluZXJQYWdlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29udGFpbmVyUGFnZSBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSBlbGVtZW50Q29udGFpbmVyLnZpZXdDb250YWluZXJSZWY7XHJcbiAgICB2aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcblxyXG4gICAgY29uc3QgZW1iZWRkZWRncm91cCA9IG5ldyBaR3JvdXAoKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihlbWJlZGRlZGdyb3VwKTtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb250YWluZXJQYWdlKTtcclxuXHJcbiAgICBlbWJlZGRlZGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7IC8vIGVuYWJsZSBiYWNrIHRoZSBidXR0b24gZm9yIHRyaWdnZXJpbmcuXHJcblxyXG4gICAgLy8gT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgZ3JvdXApO1xyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgZW1iZWRkZWRncm91cCk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgeyBwYXJlbnRHcm91cDogZ3JvdXAsIGlzRW1iZWRkZWRQYWdlOiB0cnVlLCBlbGVtZW50Q29udGFpbmVyOiBlbGVtZW50Q29udGFpbmVyLCBDb250YWluZXJGb3JtQXV0b1Njcm9sbDogZGF0YS5Db250YWluZXJGb3JtQXV0b1Njcm9sbCB9KTtcclxuXHJcbiAgICAvLyB0b2RvOiBhZGQgaW4gcHJvcFxyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5Db250YWluZXJGb3JtQXV0b1Njcm9sbCkge1xyXG4gICAgICB0aGlzLnNjcm9sbFRvRW1iYmVkQ29tcG9uZW50UGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvRW1iYmVkQ29tcG9uZW50UGFnZShtaWxsaVNlY29uZHM6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGVuZE9mR3JpZERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZW5kLW9mLWdyaWRcIik7XHJcbiAgICBjb25zdCBlbmRPZkdyaWRQb3NpdGlvbkluZm8gPSBlbmRPZkdyaWREaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB5Q29vciA9IChlbmRPZkdyaWRQb3NpdGlvbkluZm8/LnkgfHwgNjMwKSAtIDEwO1xyXG5cclxuICAgIGNvbnN0IG1haW5Jb25Db250ZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlvbi1jb250ZW50LW1haW4tcGFnZVwiKTtcclxuICAgIHJldHVybiBtYWluSW9uQ29udGVudC5zY3JvbGxCeVBvaW50KDAsIHlDb29yLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvVG9wT2ZQYWdlKG1pbGxpU2Vjb25kczogbnVtYmVyID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWFpbklvbkNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW9uLWNvbnRlbnQtbWFpbi1wYWdlXCIpO1xyXG4gICAgcmV0dXJuIG1haW5Jb25Db250ZW50LnNjcm9sbFRvUG9pbnQoMCwgMCwgbWlsbGlTZWNvbmRzKSBhcyBQcm9taXNlPHZvaWQ+O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNsb3NlQ29udGFpbmVyVmlldyhncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXBbYHBhcmVudEdyb3VwYF0gJiYgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0gJiYgdHlwZW9mIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBzZXRHcm91cEZvckRlYnVnZ2VyKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGlzRGVidWdnaW5nID0gdGhpcy56Y29yZVNlcnZpY2UuaXNEZWJ1Z1Nlc3Npb24oKSB8fCBmYWxzZTtcclxuICAgIGlmIChpc0RlYnVnZ2luZykge1xyXG4gICAgICB0aGlzLmRlYnVnU2VydmljZS5vbkluaXREZWJ1Z2dlcihncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaEdyaWQoZ3JvdXA6IFpHcm91cCkge1xyXG4gIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW1wiZ3JpZE9wdGlvbnNcIl0gYXMgWkdyaWQ7XHJcbiAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICB9XHJcbiAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxufVxyXG4iXX0=
1219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFpQyxNQUFNLGlCQUFpQixDQUFDO0FBS2pILDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsZUFBZSxFQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFRLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBTy9ELE9BQU8sRUFDUSxXQUFXLEVBQWdCLGdCQUFnQixFQUVYLE1BQU0sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUNwRyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7OztBQU16QixNQUFNLE9BQU8sV0FBVztJQWlCdEIsWUFDVSxNQUFjLEVBQ2QsY0FBOEIsRUFDOUIsU0FBMEIsRUFDMUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQ3RDLDRCQUEwRCxFQUMxRCxhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxZQUFvQyxFQUNwQyxrQkFBc0MsRUFDdEMsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsV0FBd0I7UUFuQnhCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFD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WSxFQUFFO1FBQ2hCLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUN4QjtJQUNELEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudFJlZiwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBSb3V0ZXIsIEV2ZW50LCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mLCBmb3JrSm9pbiwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCwgbWFwLCBtZXJnZUFsbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGlhbG9nUmVmLCBEaWFsb2dTZXJ2aWNlLCBEaWFsb2dTZXR0aW5ncyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRpYWxvZyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UgfSBmcm9tICcuL3pjb21wb25lbnQuZGVidWcuc2VydmljZSc7XHJcbmltcG9ydCB7IFpHcmlkIH0gZnJvbSAnLi4vemdyaWQvemdyaWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlLCBNb2RhbFJlc3BvbnNlIH0gZnJvbSAnbW1oZ2xvYmFsLXptb2RhbCc7XHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sIE1FU1NBR0VUWVBFLCBBbGVydFNlcnZpY2UsIFpDb21wb25lbnRIZWxwZXIsIE1vZGFsUGFnZVBhcmFtcyxcclxuICBDYWNoZVNlcnZpY2UsIEZpZWxkU2VydmljZSwgUmVzb3VyY2VBcGlTZXJ2aWNlLCBUcmFuc2xhdGlvblNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIFN0b3JhZ2VTZXNzaW9uU2VydmljZSwgT0F1dGgyU2VydmljZSwgU2lnbmFsclNlcnZpY2UsIENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBaQ29yZVNlcnZpY2UsIFpGaWVsZCwgWkdyb3VwLCBEZWZhdWx0TWVzc2FnZSwgRGVmYXVsdERpYWxvZ1RpdGxlLCBBY3Rpb25UeXBlLCBUb2FzdFNlcnZpY2UsIEF1dGhTZXJ2aWNlXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTWFpblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgZ3JvdXA6IFpHcm91cDtcclxuICBwcml2YXRlIG9hdXRoRW52aXJvbm1lbnRVcmw6IHN0cmluZztcclxuICBwcml2YXRlIGVudmlyb25tZW50O1xyXG4gIHByaXZhdGUgYmFja05hdmlnYXRpb25QYXRoOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgcm91dGVQYXJhbTogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIHByZXZpb3VzUm91dGVQYXJhbTogc3RyaW5nO1xyXG4gIHB1YmxpYyBjdXJyZW50VXJsOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHJpdmF0ZSBOQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSA9ICdyb3V0ZVBhcmFtJztcclxuICBwcml2YXRlIFBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkgPSAncHJldmlvdXNQYWdlUm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBCQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSA9ICdiYWNrTmF2aWdhdGlvblBhdGgnO1xyXG4gIHByaXZhdGUgTkFWSUdBVEVEX1JFTE9BRF9HUklEX1NUT1JBR0VfS0VZID0gJ25hdmlnYXRlZFJlbG9hZEdyaWQnO1xyXG4gIHByaXZhdGUgQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSA9ICdjbG9uZU5ld01vZGVsJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRLZXkgPSAnbXktc2VjcmV0LWtleSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2U6IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpjb3JlU2VydmljZTogWkNvcmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGVidWdTZXJ2aWNlOiBaQ29tcG9uZW50RGVidWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgc2lnbmFsclNlcnZpY2U6IFNpZ25hbHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBvYXV0aDJTZXJ2aWNlOiBPQXV0aDJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTWFpblNlcnZpY2UgY29uc3RydWN0b3InKTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRFbnZpcm9ubWVudCgpO1xyXG4gICAgdGhpcy5vYXV0aEVudmlyb25tZW50VXJsID0gdGhpcy5lbnZpcm9ubWVudC5lMU9hdXRoVXJsICsgJy8nO1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIC8vIFNob3cgcHJvZ3Jlc3Mgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXJcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2U/LmRpc21pc3MoKTtcclxuICAgICAgICAvLyBSZXNldCB0aGUgcm91dGVQYXJhbSxiYWNrTmF2aWdhdGlvblBhdGggYW5kIHJlbGF0ZWQgc2Vzc2lvblN0b3JhZ2UgY3VycmVudCBwYWdlIGlzIHN0YXJ0dXAgcGFnZVxyXG4gICAgICAgIGlmICh0aGlzLmdldFN0YXJ0dXBQYWdlKCkgPT09IGV2ZW50LnVybCkge1xyXG4gICAgICAgICAgdGhpcy5yZXNldFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRVcmwgPSBldmVudC51cmxBZnRlclJlZGlyZWN0cztcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgLy8gUHJlc2VudCBlcnJvciB0byB1c2VyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGZvciBzaWduYWxSIGFsZXJ0XHJcbiAgcHVibGljIGdldExpc3RGaWVsZE5hbWUgPSAoZmllbGROYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJuYW1lXCIsIGZpZWxkTmFtZSk7XHJcbiAgICByZXR1cm4gdGhpcy5vYXV0aDJTZXJ2aWNlLmh0dHBHZXQkKHRoaXMuZmllbGRTZXJ2aWNlLmRvd25sb2FkTGlzdEZpZWxkVXJsLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLkZpZWxkRWxlbWVudE1hc3RlcklkKSxcclxuICAgICAgc3dpdGNoTWFwKGlkID0+IHRoaXMub2F1dGgyU2VydmljZS5odHRwR2V0JCh0aGlzLmZpZWxkU2VydmljZS5kb3dubG9hZEZvcm1GaWVsZFVybCwgeyBpZCB9KSksXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLk5hbWUgYXMgc3RyaW5nKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckZvcm1MaXN0RmllbGRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZGF0YUZvcm1GaWVsZHMgPSB7fTtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLmRhdGFMaXN0RmllbGRzID0ge307XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5kYXRhTGlzdEZpZWxkSXRlbXMgPSB7fTtcclxuICB9XHJcblxyXG4gIGRpYWxvZ09wZW4ob3B0aW9uczogRGlhbG9nU2V0dGluZ3MpOiBEaWFsb2dSZWYge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKG9wdGlvbnMpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgc3RhcnRVcCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdBdCBtYWluLnNlcnZpY2UgKFN0YXJ0VXApIC4uLicpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JvdXAoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXNvdXJjZVNlcnZlckRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwRmllbGRzKFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIGZvcm1UeXBlOiBcIkxpc3RGaWVsZFwiIHwgXCJGb3JtRmllbGRcIixcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICBmb3JtVHlwZSxcclxuICAgICAgZ3JvdXAsXHJcbiAgICAgIHByb3BlcnR5TmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVHcm91cChcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgcGFnZU5hbWU6IHN0cmluZyxcclxuICAgIG1lOiBhbnlcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGdyb3VwLnJlc291cmNlVVJMTmFtZSB8fCBjdHJsTmFtZTtcclxuICAgIGdyb3VwLnJlc291cmNlVVJMTmFtZSA9IHJlc291cmNlTmFtZTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLCB7XHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwocmVzb3VyY2VOYW1lKSxcclxuICAgICAgZ3JpZENvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICBjdHJsTmFtZSxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgbnVsbFxyXG4gICAgICApLFxyXG4gICAgICBjdHJsU2NvcGU6IG1lLFxyXG4gICAgICBwYWdlTmFtZSxcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIC8vIGNyZWF0ZU1vZGVsVVJMOiBcIi9jcmVhdGVcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGVkaXRNb2RlbFVSTDogY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gbGlzdE1vZGVsVVJMOiBcIi9saXN0XCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBmb3JtSGVhZGVyOiBcIi4uLlwiLFxyXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXHJcbiAgICAgIGZpZWxkczogW10sXHJcbiAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgIHpDb21wb25lbnRzOiB7fSxcclxuICAgICAgekRhdGE6IHt9LFxyXG4gICAgICBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PFpDb21wb25lbnRPdXRwdXRFdmVudD4obnVsbCksXHJcbiAgICAgIC8vIGZvcm06IG51bGwgYXMgRm9ybUdyb3VwLCAvLyByZW1vdmVkIGZvciBidWcgZml4LlxyXG4gICAgICBjYW5jZWxCdXR0b25OYW1lOiBcIkNsb3NlXCIsXHJcbiAgICAgIHpCdXR0b25zQ291bnQ6IDAsXHJcbiAgICAgIC8vIHRvcFJpZ2h0QWN0aW9uQnV0dG9uOiBbXSxcclxuICAgICAgLy8gb25BY3Rpb246IHRoaXMub25BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgICAgYmFja05hdmlnYXRpb246IHRoaXMuYmFja05hdmlnYXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgaGlzdG9yeUJhY2s6IHRoaXMuaGlzdG9yeUJhY2suYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaFBhZ2U6IHRoaXMucmVmcmVzaFBhZ2UuYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaEdyaWQ6IHRoaXMucmVmcmVzaEdyaWQuYmluZCh0aGlzKSxcclxuICAgICAgdXBkYXRlTW9kZWw6IHRoaXMudXBkYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY3JlYXRlTW9kZWw6IHRoaXMuY3JlYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY2xvbmVOZXdNb2RlbDogdGhpcy5jbG9uZU5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGRlbGV0ZU1vZGVsOiB0aGlzLmRlbGV0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIG5ld01vZGVsOiB0aGlzLm5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIHVwZGF0ZUVkaXRNb2RlOiB0aGlzLnVwZGF0ZUVkaXRNb2RlLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIF9pc0RlYnVnZ2luZzogZW52aXJvbm1lbnQuZGVidWdTZXNzaW9uIHx8IGZhbHNlLFxyXG4gICAgICAvLyBfZGVidWc6IHtcclxuICAgICAgLy8gICB6RGF0YTogIHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGFmdGVyR2V0TW9kZWxTdWNjZXNzOiBudWxsLFxyXG4gICAgICAvLyBiZWZvcmVVcGRhdGVNb2RlbDogbnVsbCxcclxuICAgICAgLy8gaXNFZGl0OiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWUuc3Vic2NyaXB0aW9uID0gZ3JvdXAuc3ViamVjdC5zdWJzY3JpYmUoKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpID0+XHJcbiAgICAgIHRoaXMuc3ViamVjdEV2ZW50KGV2ZW50LCBncm91cCwgbWUpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBtZS5zdWJzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbCQoZ3JvdXA6IFpHcm91cCwgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZWNJZCA9IGlkIHx8IGdyb3VwLnJlZmVyZW5jZUlkO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAuaHR0cEdldCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIHJlY0lkLCBudWxsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuek1vZGVsID0gem1vZGVsO1xyXG4gICAgICAgICAgLy9pZiAoXHJcbiAgICAgICAgICAvLyAgZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQgJiZcclxuICAgICAgICAgIC8vICBPYmplY3Qua2V5cyh6bW9kZWwpLmluZGV4T2YoZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQpICE9PSAtMSAmJlxyXG4gICAgICAgICAgLy8gICFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UuZW5kc1dpdGgoXCIuZWRpdFwiKVxyXG4gICAgICAgICAgLy8pIHtcclxuICAgICAgICAgIC8vICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgPVxyXG4gICAgICAgICAgLy8gICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlICtcclxuICAgICAgICAgIC8vICAgIFwiL1wiICtcclxuICAgICAgICAgIC8vICAgIHptb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0udG9TdHJpbmcoKSArXHJcbiAgICAgICAgICAvLyAgICBcIi9lZGl0XCI7XHJcbiAgICAgICAgICAvL31cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIC8vIGNvbnN0IHJlcGx5U3ViID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIC8vIHRoaXMuYWxlcnRDdHJsXHJcbiAgICAvLyAgIC5jcmVhdGUoe1xyXG4gICAgLy8gICAgIGhlYWRlcjogXCJEYXRhIG5vdCBzYXZlIHlldFwiLFxyXG4gICAgLy8gICAgIC8vIHN1YkhlYWRlcjogJ1N1YkhlYWRlciBzdGF0ZW1lbnQgaGVyZScsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLFxyXG4gICAgLy8gICAgIGJ1dHRvbnM6IFtcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJDYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgcm9sZTogXCJjYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwid2FybmluZ1wiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIF1cclxuICAgIC8vICAgfSlcclxuICAgIC8vICAgLnRoZW4oYWxlcnRFbGVtZW50ID0+IHtcclxuICAgIC8vICAgICBhbGVydEVsZW1lbnQucHJlc2VudCgpO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHJldHVybiByZXBseVN1Yi5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgb3Blbk1vZGFsRm9ybShtb2RhbFBhcmFtczogTW9kYWxQYWdlUGFyYW1zKSB7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZyhcIm9wZW5Nb2RhbEZvcm1cIik7XHJcbiAgLy8gICBjb25zb2xlLmVycm9yKFxyXG4gIC8vICAgICBcIlBsZWFzZSB1c2UgTW9kYWxTZXJ2aWNlLnNob3cgaW5zdGVhZCBvZiBNYWluU2VydmljZS5vcGVuTW9kYWxGb3JtIVwiXHJcbiAgLy8gICApO1xyXG4gIC8vICAgLy8gY29uc3QgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFyYW1zLmNvbEZpZWxkcyQgfHwgbW9kYWxQYXJhbXMuY29udHJvbGxlck5hbWUsIG1vZGFsUGFyYW1zLnBhcmVudEdyb3VwLFxyXG4gIC8vICAgLy8gICBtb2RhbFBhcmFtcy5mb3JtSGVhZGVyLCBtb2RhbFBhcmFtcy56TW9kZWwsIG1vZGFsUGFyYW1zLnJlZmVySWQpO1xyXG4gIC8vICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xyXG4gIC8vICAgICBjb21wb25lbnQ6IFptb2RhbFBhZ2UsXHJcbiAgLy8gICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcclxuICAvLyAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAvLyAgICAgICBtb2RhbFBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWwucHJlc2VudCgpO1xyXG4gIC8vICAgcmV0dXJuIG1vZGFsO1xyXG4gIC8vICAgLy8gLm9uV2lsbERpc21pc3MoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgLy8gICAvLyAgIHRoaXMuXHJcbiAgLy8gICAvLyB9KTtcclxuICAvLyB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuc3ViamVjdCkge1xyXG4gICAgICBncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiTW9kYWxTZXJ2aWNlLmNsb3NlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiBcIm1vZGFsR3JvdXAubW9kYWxDYW5jZWwoKVwiXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCI+PiBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIGdyb3VwLmN0cmxTY29wZSxcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgZ3JvdXBcclxuICAgICAgKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGV2ZW50LlRhcmdldCwgZ3JvdXApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgZXJyb3JcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxsRnVuYyhldmVudCk7XHJcbiAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICBuZXdGdW5jKGV2ZW50LCBncm91cCwgbWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUuZW5kc1dpdGgoXCJvbk5hdmlnYXRlVG9cIikpIHtcclxuICAgICAgICBjb25zdCBuVXJsID0gZXZlbnQudGFyZ2V0LnJlcGxhY2UoXCIvOmlkXCIsIFwiL1wiICsgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgLy8gKGNhbGxGdW5jLnN0YXJ0c1dpdGgoJ2VkaXQnKSkgeyAgemdyaWQtY2VsbENsaWNrXHJcbiAgICAgICAgY29uc3QgY05hbWUgPSBjYWxsRnVuYy5zbGljZSg0KTtcclxuICAgICAgICAvLyAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAvLyBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNOYW1lO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcblxyXG4gICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgIHRoaXMuc2hvd3pNb2RhbChcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGRFbGVtZW50TmFtZTogY05hbWUsXHJcbiAgICAgICAgICAgIGZpZWxkRWxlbWVudE9ic2VydmFibGUkOiBldmVudC5jb2x1bW5GaWVsZHMkLFxyXG4gICAgICAgICAgICBwYXJlbnRHcm91cDogZ3JvdXAsXHJcbiAgICAgICAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgICAgICAgIGZvcm1IZWFkZXI6ICcnLFxyXG4gICAgICAgICAgICByZWZlcklkOiBldmVudC5kYXRhLklkXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICBpZiAoY2FsbEZ1bmMubmF2aWdhdGVVcmwpIHtcclxuICAgICAgICAgIGNvbnN0IHVybCA9IGNhbGxGdW5jLm5hdmlnYXRlVXJsLnJlcGxhY2UoXCI6aWRcIiwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FsbEZ1bmMuZm9ybUhlYWRlcikge1xyXG4gICAgICAgICAgdGhpcy5zaG93ek1vZGFsKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmllbGRFbGVtZW50TmFtZTogY2FsbEZ1bmMuY3RybE5hbWUsXHJcbiAgICAgICAgICAgICAgZmllbGRFbGVtZW50T2JzZXJ2YWJsZSQ6IGV2ZW50LmNvbHVtbkZpZWxkcyQsXHJcbiAgICAgICAgICAgICAgcGFyZW50R3JvdXA6IG1lLmdyb3VwLFxyXG4gICAgICAgICAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgICAgICAgICAgZm9ybUhlYWRlcjogY2FsbEZ1bmMuZm9ybUhlYWRlcixcclxuICAgICAgICAgICAgICByZWZlcklkOiBldmVudC5kYXRhLklkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzICYmIHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0NyZWF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc1VwZGF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0RlbGV0ZU1zZykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBzZXNzaW9uc3RvcmFnZSB0byB0cmlnZ2VyIHVwZGF0ZSB1cG9uIGNyZWF0ZWRcclxuXHJcbiAgICAgIC8vIEFsZXJ0IHVzZXIgdXBkYXRlL3NhdmUgc3VjY2Vzc1xyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2Vzcywgc3VjY2Vzc01zZywgbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlVcGRhdGVHcm91cFRyaWdnZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3V0ZU5hdmlnYXRlKHBhZ2VOYW1lOiBzdHJpbmcsIHBhZ2VQYXJhbXM6IHN0cmluZ1tdLCByb3V0ZVJlbGF0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKHBhZ2VQYXJhbXMpO1xyXG4gICAgY29uc3Qgc25hcHNob3RVcmwgPSB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgIGNvbnN0IHBhZ2VVcmwgPSByb3V0ZVJlbGF0aXZlID8gc25hcHNob3RVcmwgKyAnLycgKyBwYWdlTmFtZSA6IHBhZ2VOYW1lO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYWdlVXJsXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5hdmlnYXRpb25QYXJhbXModXJsUGFyYW1zOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gSWYgaXQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUluTGFzdEVsZW1lbnQodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgsIHRoaXMucm91dGVyLnVybCkpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucHVzaCh0aGlzLnJvdXRlci51cmwpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbSh1cmxQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJvdXRlUGFyYW0ocm91dGVQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdGVyIG91dCBhbnkgZW1wdHkgc3RyaW5nIHJvdXRlIHBhcmFtcyBhbmQgam9pbiB0aGVtIGludG8gYSBzaW5nbGUgc3RyaW5nXHJcbiAgICBjb25zdCBuZXdSb3V0ZVBhcmFtID0gJy8nICsgT2JqZWN0LnZhbHVlcyhyb3V0ZVBhcmFtcykuZmlsdGVyKGVsID0+IGVsICE9PSAnJykuam9pbignLycpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLnJvdXRlUGFyYW0sIG5ld1JvdXRlUGFyYW0pKSB7XHJcbiAgICAgIGlmIChyb3V0ZVBhcmFtcykge1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHByZXZpb3VzIHBhZ2UncyByb3V0ZSBwYXJhbSB0byBiZSB1c2VkIGZvciBiYWNrbmF2aWdhdGlvbiBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtW3RoaXMucm91dGVQYXJhbS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGV4aXN0cywgY2hlY2sgaWYgdGhlIGxhc3Qgc2VnbWVudCBpcyAnbmV3JyBvciAndXBkYXRlJ1xyXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1TZWdtZW50ID0gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IHBhcmFtU2VnbWVudFtwYXJhbVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnLCBzdG9yZSB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gaW4gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gJ25ldycgfHwgYWN0aW9uU2VnbWVudCA9PT0gJ2VkaXQnIHx8IGFjdGlvblNlZ21lbnQgPT09ICd1cGRhdGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJvdXRlIHBhcmFtIHRvIHRoZSByb3V0ZVBhcmFtIGFycmF5IGFuZCBzdG9yZSBpdCBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaChuZXdSb3V0ZVBhcmFtKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbHVlSW5MYXN0RWxlbWVudChhcnJheTogYW55W10sIHRhcmdldFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChhcnJheVthcnJheS5sZW5ndGggLSAxXSA9PT0gdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmF2aWdhdGVGcm9tTWVudShwYWdlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7IHN0YXJ0VXBQYWdlIH0gPSB0aGlzLmVudmlyb25tZW50O1xyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtKFtgJHtzdGFydFVwUGFnZX1gXSk7XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wdXNoKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShbdGhpcy5nZXRTdGFydHVwUGFnZSgpXSkpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhZ2VOYW1lXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0Um91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvblBhcmFtcygpOiBhbnlbXSB7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0gPSB0aGlzLnJvdXRlUGFyYW0gfHwgW107XHJcblxyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbS5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgc3RvcmVkUGFyYW1zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZKTtcclxuICAgICAgaWYgKHN0b3JlZFBhcmFtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHN0b3JlZFBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3RvcmVkIHJvdXRlUGFyYW06JywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdObyBzdG9yZWQgbmF2aWdhdGlvbiBwYXJhbXMgZm91bmQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucm91dGVQYXJhbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYXZpZ2F0aW9uUGFyZW50UGFyYW0oKTogYW55IHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25QYXJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvblBhcmVudFBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0aW9uUGFyZW50UGFyYW1zW25hdmlnYXRpb25QYXJlbnRQYXJhbXMubGVuZ3RoIC0gMl07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIHBhcmVudCBwYXJhbXMgbm90IGZvdW5kLicpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpOiBhbnkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXNbbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIGN1cnJlbnQgcGFyYW1zIG5vdCBmb3VuZC4nKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBSZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSBpZiBpdCBleGlzdHNcclxuICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbVN0ciA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICAgIGlmIChwcmV2aW91c1JvdXRlUGFyYW1TdHIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHByZXZpb3VzUm91dGVQYXJhbVN0cik7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gPSBwcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYFVuYWJsZSB0byBwYXJzZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBmcm9tIHNlc3Npb24gc3RvcmFnZTogJHtlcnJvcn1gKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdObyBwcmV2aW91cyBwYWdlIHJvdXRlIHBhcmFtIGZvdW5kIGluIHNlc3Npb24gc3RvcmFnZS4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUodGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0TmF2aWdhdGVSZWNvcmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wb3AoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIk5vIGJhY2sgbmF2aWdhdGlvbiBwYXRoIGZvdW5kIGluIHNlc3Npb24uXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtLnBvcCgpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInJvdXRlUGFyYW0gc2Vzc2lvbiBpcyBudWxsLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBiYWNrTmF2aWdhdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UoZ3JvdXApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwOiBaR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBjb25zdCBiYWNrTmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpKTtcclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uVVJMID0gZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlIHx8IGJhY2tOYXZpZ2F0aW9uUGF0aFtiYWNrTmF2aWdhdGlvblBhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgaWYgKCFiYWNrTmF2aWdhdGlvblVSTCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6IGJhY2tOYXZpZ2F0aW9uVVJMIGlzIG5vdCBzZXQuXCIpO1xyXG4gICAgICAvL3Rocm93IG5ldyBFcnJvcihcIkJhY2tOYXZpZ2F0aW9uUGF0aCBub3Qgc2V0LlwiKTtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSB0aGlzLmdldFByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgY29uc3QgcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSA9IHRoaXMuZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpO1xyXG4gICAgICBpZiAodGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnJvdXRlTmF2aWdhdGUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJldmlvdXNSb3V0ZVBhcmFtICYmIHByZXZpb3VzUm91dGVQYXJhbSA9PT0gcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSkge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTdGFydHVwUGFnZSgpIHtcclxuICAgIGNvbnN0IHsgc3RhcnRVcFBhZ2UgfSA9IHRoaXMuZW52aXJvbm1lbnQ7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXJ0dXAgcGFnZSBzdGFydHMgd2l0aCBhIHVuZGVyc2NvcmUuXHJcbiAgICBpZiAoc3RhcnRVcFBhZ2Uuc3RhcnRzV2l0aCgnXycpKSB7XHJcbiAgICAgIHJldHVybiBgLyR7c3RhcnRVcFBhZ2Uuc2xpY2UoMSl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBub3QsIHByZXBlbmQgYSBmb3J3YXJkIHNsYXNoIGFuZCByZXR1cm4uXHJcbiAgICByZXR1cm4gYC8ke3N0YXJ0VXBQYWdlfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlCYWNrKCkge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KHRoaXMuZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uYXZDb250cm9sbGVyLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKFxyXG4gICAgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBtZTogYW55LFxyXG4gICAgZ3JpZE9wdGlvbk5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbk5hbWUgfHwgXCJncmlkT3B0aW9uc1wiO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCkge1xyXG4gICAgICBjb25zdCBncmlkT3B0aW9uID0gZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKFwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKVwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiZ3JvdXAucmVmcmVzaEdyaWRcIiwgXCJcIik7XHJcbiAgICAgIGlmIChncmlkT3B0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtncmlkT3B0aW9uTmFtZV0gYXMgWkdyaWQ7XHJcbiAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoUGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUgPSAoKSA9PiBmYWxzZTtcclxuICAgIC8vIHRoaXMucm91dGVyLm9uU2FtZVVybE5hdmlnYXRpb24gPSAncmVsb2FkJztcclxuICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoOiAnLCB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY3JtL2N1c3RvbWVyJ10pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvbmVOZXdDYWNoZVpNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICBpZiAoY2FjaGVaTW9kZWwpIHtcclxuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXJDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgICBncm91cC56TW9kZWwgPSBjYWNoZVpNb2RlbDtcclxuICAgICAgZ3JvdXAuek1vZGVsLklkID0gMDtcclxuICAgIH1cclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIG9mKFtdKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIG5ldywgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjdXJyZW50IHVybDogXCIsIHRoaXMucm91dGVyLnVybCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZ3JvdXAucGFyZW50UmVmZXJlbmNlSWQgfHwgXCIwXCI7XHJcbiAgICAgICAgLy9jb25zdCBwYXRoU2VnbWVudCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgLy9jb25zdCBsYXN0U2VnbWVudCA9IHBhdGhTZWdtZW50W3BhdGhTZWdtZW50Lmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uU2VnbWVudHMgPSBjdXJyZW50TmF2aWdhdGlvblBhcmFtID8gY3VycmVudE5hdmlnYXRpb25QYXJhbS5zcGxpdCgnLycpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gZ3JvdXAuaXNDbG9uZU5ldyA/ICduZXcnIDogJ2VkaXQnO1xyXG4gICAgICAgIGNvbnN0IGFjdGlvblNlZ21lbnQgPSBncm91cC5pc0Nsb25lTmV3ID8gKG5hdmlnYXRpb25TZWdtZW50cyA/IG5hdmlnYXRpb25TZWdtZW50c1tuYXZpZ2F0aW9uU2VnbWVudHMubGVuZ3RoIC0gMV0gOiAnbmV3JykgOiBkZWZhdWx0QWN0aW9uO1xyXG5cclxuICAgICAgICBpZiAoZ3JvdXAuaXNMaXN0Rm9ybSkge1xyXG4gICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMXSwge1xyXG4gICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyAxOiBGcm9tIExpc3QgTmV3KGFjdGlvbjogbmV3KSA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gMjogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDM6IEZyb20gRm9ybSBOZXcoYWN0aW9uOiBuZXcpLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDQ6IEZyb20gRm9ybSBOZXcoYWN0aW9uOiBuZXcpLCBpc0Nsb25lTmV3LCBTYXZlLCBDbGljayBOZXcgPT0+IENsZWFyIGZvcm0gKFdoZW4gQ3JlYXRlTW9kZWwsIG5lZWQgY2hhbmdlIGlzQ2xvbmVOZXcgPSBmYWxzZSlcclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDU6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDY6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBpc0Nsb25lTmV3LCBTYXZlLCBDbGljayBOZXcgPT0+IENsZWFyIGZvcm0gKFdoZW4gVXBkYXRlTW9kZWwsIG5lZWQgY2hhbmdlIGlzQ2xvbmVOZXcgPSBmYWxzZSlcclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDc6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBDbGljayBOZXcgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDg6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBDbGljayBOZXcsIFNhdmUsIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG5cclxuICAgICAgICAgIGlmIChhY3Rpb25TZWdtZW50ID09PSBcImVkaXRcIiB8fCBhY3Rpb25TZWdtZW50ID09PSBcIm5ld1wiKSB7XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICAgICAgICAgIGdyb3VwLmZvcm0ucmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwLCBldmVudC5kYXRhLnpCdXR0b25OYW1lKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IFwiZWRpdFwiKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2xlYXIgY2xvbmVOZXdNb2RlbCBjYWNoZShpZiBoYXZlKVxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvL3RoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0Um91dGVQYXJhbShbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcblxyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0gPSByZWZlcmVuY2VJZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBncm91cC5pc0VkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgJ25ldyddKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NDcmVhdGVkTWVzc2FnZSB8fCBcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIjtcclxuICAgIGxldCBjcmVhdGVNb2RlbHJlcyA9IG51bGw7XHJcblxyXG4gICAgaWYgKCFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2Uuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoZ3JvdXAuek1vZGVsKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGNyZWF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZUNyZWF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwLnNraXBDcmVhdGVVc2luZ0Zvcm1WYWx1ZSkge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld01vZGVsID0gT2JqZWN0LmFzc2lnbih7fSwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICBaQ29tcG9uZW50SGVscGVyLnJlbW92ZU51bGxGaWVsZHMobmV3TW9kZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChncm91cC5yZXNvdXJjZVVSTCwgbmV3TW9kZWwpLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgY3JlYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgY3JlYXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkek1vZGVsKGZnLCB6bW9kZWwsIGdyb3VwKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZnRlckNyZWF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgaWYgKGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gbnVsbCB8fCBjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgIGlmIChyZXNwICYmIGdyb3VwLnpNb2RlbC5JZCAhPT0gMCkge1xyXG4gICAgICAgICAgICBncm91cC5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICBncm91cC5pc0Nsb25lTmV3ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmNhbmNlbEJ1dHRvbk5hbWUgPSBcIkNsb3NlXCI7XHJcbiAgICAgICAgICAgIC8vIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICAgICAgLy8gZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcblxyXG4gICAgICAgICAgaWYgKChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlckNyZWF0ZWQpICYmICFncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgIC8vIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXCJSZWNvcmQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLnVwZGF0ZU1vZGVsT2JzZXJ2YWJsZShldmVudCwgZ3JvdXApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZU1vZGVsT2JzZXJ2YWJsZShldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBmb3JtOiBGb3JtR3JvdXAgPSBudWxsLCB1cGRhdGVBUElPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGFueT4gPSBudWxsLCBpc1NraXBEaXJ0eSA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGZnID0gZm9ybSB8fCBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzVXBkYXRlZE1lc3NhZ2UgfHwgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCI7XHJcbiAgICBsZXQgdXBkYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0Zvcm1EaXJ0eUFuZFZhbGlkKGZnLCBncm91cCwgaXNTa2lwRGlydHksIGV2ZW50KSkge1xyXG4gICAgICBpZiAoaXNTa2lwRGlydHkpIHtcclxuICAgICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVBUElPYnNlcnZhYmxlID0gdXBkYXRlQVBJT2JzZXJ2YWJsZSB8fCB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFB1dCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIGdyb3VwLnpNb2RlbC5JZCwgZ3JvdXAuek1vZGVsLCBmYWxzZSkucGlwZShcclxuICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICkpO1xyXG5cclxuICAgIHJldHVybiBvZihncm91cC56TW9kZWwpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgdXBkYXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBpZiAoIWdyb3VwLnNraXBVcGRhdGVVc2luZ0Zvcm1WYWx1ZSkge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB1cGRhdGVBUElPYnNlcnZhYmxlO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKChyZXNwOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIHVwZGF0ZWQsIHJlc3BvbnNlOlwiLCByZXNwKTtcclxuICAgICAgICB1cGRhdGVNb2RlbHJlcyA9IHJlc3A7XHJcbiAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkek1vZGVsKGZnLCByZXNwLCBncm91cCk7XHJcbiAgICAgICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCByZXNwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgIGlmICh1cGRhdGVNb2RlbHJlcyAmJiB1cGRhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNDbG9zZUFmdGVyU3VjY2VzcyB8fCBncm91cC5pc0Nsb3NlQWZ0ZXJVcGRhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9uZXMgYSBuZXcgbW9kZWwgZm9yIGEgWkdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBaQ29tcG9uZW50T3V0cHV0RXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pDb21wb25lbnRPdXRwdXRFdmVudH0gZXZlbnQgLSBUaGUgWkNvbXBvbmVudE91dHB1dEV2ZW50IHRyaWdnZXJpbmcgdGhlIGNsb25lLlxyXG4gICAqIEBwYXJhbSB7Wkdyb3VwfSBncm91cCAtIFRoZSBaR3JvdXAgdG8gY2xvbmUgdGhlIG5ldyBtb2RlbCBmb3IuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbG9uZU5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIC8vIFNldCBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgaXMgYmVpbmcgY2xvbmVkXHJcbiAgICBncm91cC5pc0Nsb25lTmV3ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHRoZSBmdW5jdGlvbiB2YWx1ZSBmcm9tIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XHJcbiAgICBjb25zdCBmdW5jdGlvblZhbHVlID0gdGFyZ2V0Py5tYXRjaCgvXFwoKFteKV0rKVxcKS8pPy5bMV07XHJcblxyXG4gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIHZhbHVlIGlzICd0cnVlJywgcmVzZXQgdGhlIGZvcm0gYW5kIG1vZGVsXHJcbiAgICBpZiAoZnVuY3Rpb25WYWx1ZSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICBncm91cC5mb3JtLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmaW5lIHRoZSB2YWx1ZXMgZm9yIHRoZSBXRlMgbW9kZWxcclxuICAgIGNvbnN0IG5ld01vZGVsVmFsdWVzID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgV0ZTX0RvY3VtZW50SWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNDb2RlOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzSWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNOYW1lOiBudWxsLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBc3NpZ24gdGhlIFdGUyBtb2RlbCB2YWx1ZXMgdG8gdGhlIGZvcm0gdmFsdWUgYW5kIFpNb2RlbFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC5mb3JtLnZhbHVlLCBuZXdNb2RlbFZhbHVlcyk7XHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZ3JvdXAuZm9ybS52YWx1ZSk7XHJcblxyXG4gICAgLy8gUGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgWk1vZGVsLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgY2FjaGUgdGhlIFpNb2RlbFxyXG4gICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGZnLnBhdGNoVmFsdWUoZ3JvdXAuek1vZGVsKTtcclxuICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVksIGdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgLy8gQ2FsbCB0aGUgbmV3TW9kZWwgZnVuY3Rpb24gZm9yIHRoZSBncm91cFxyXG4gICAgdGhpcy5uZXdNb2RlbChudWxsLCBncm91cCk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgIGlmICh0aGlzLmlzVHlwZUNvZGVGdW5jdGlvbihldmVudCkpIHtcclxuICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YS56QnV0dG9uTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHRyaWdnZXIgZmxhZ1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NEZWxldGVkTWVzc2FnZSB8fCBcIlJlY29yZCBpcyBkZWxldGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRlbXBSZXNwb25zZSA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgZGVsZXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmhpc3RvcnlCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFJlc3BvbnNlWydQcm9jZXNzaW5nU3RhdHVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZnLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZ3JvdXAuek1vZGVsLkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaFVwZGF0ZWR6TW9kZWwoZmc6IEZvcm1Hcm91cCwgcmVzcDogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAocmVzcCkge1xyXG4gICAgICBpZiAocmVzcC5EYXRhKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3AuRGF0YSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0RGF0YSA9IFpDb21wb25lbnRIZWxwZXIucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhyZXNwLkRhdGEsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJlc3BbXCJJZFwiXSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gWkNvbXBvbmVudEhlbHBlci5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRmFpbGVkIHRvIHBhdGNoVXBkYXRlZHpNb2RlbCB0byB0aGUgZm9ybWdyb3VwXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXAucmVmZXJlbmNlSWQgPSBncm91cC56TW9kZWwuSWQ7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVHlwZUNvZGVGdW5jdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICByZXR1cm4gZXZlbnQ/LmRhdGE/LlR5cGVDb2RlID09PSAnRlVOQ1RJT04nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cDogWkdyb3VwLCB6QnV0dG9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudChncm91cCwgYHp3b3JrZmxvd2J1dHRvbnNfJHt6QnV0dG9uTmFtZX1gKTtcclxuICAgIHdvcmtmbG93QnV0dG9ucz8uWydsb2FkQnV0dG9uJ10/LigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRm9ybURpcnR5QW5kVmFsaWQoZmc6IEZvcm1Hcm91cCwgZ3JvdXA6IFpHcm91cCwgaXNTa2lwRGlydHkgPSBmYWxzZSwgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFpc1NraXBEaXJ0eSAmJiAhZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdID8gZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdIDogRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlO1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93T2theShEZWZhdWx0RGlhbG9nVGl0bGUubm90aGluZ1RvVXBkYXRlLCBtZXNzYWdlLCBbXCJjb2wtNVwiXSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZS5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKGdyb3VwLCBmZyk7XHJcbiAgICAgIGZnLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEZWxldGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVOZXdNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZU5ld29kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVDcmVhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuek1vZGVsLklkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInpNb2RlbC5JZCBpcyBub3QgZGVmaW5lZFwiLCBncm91cC56TW9kZWwpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckdldE1vZGVsU3VjY2VzcyBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgfVxyXG5cclxuICBhZnRlck5ld01vZGVsKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlck5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJVcGRhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckRlbGV0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNsb25lTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNsb25lTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBvbkFjdGlvbihncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICB0aGlzLmFjdGlvblNoZWV0Q3RybFxyXG4gIC8vICAgICAuY3JlYXRlKHtcclxuICAvLyAgICAgICBoZWFkZXI6IFwiQ2hvb3NlIGFuIEFjdGlvblwiLFxyXG4gIC8vICAgICAgIGJ1dHRvbnM6IGdyb3VwLnRvcFJpZ2h0QWN0aW9uQnV0dG9uXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC50aGVuKGFjdGlvblNoZWV0RWwgPT4ge1xyXG4gIC8vICAgICAgIGFjdGlvblNoZWV0RWwucHJlc2VudCgpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldE1vZGVsVmFsdWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIGdyb3VwLnpNb2RlbFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgLy8gICBpZiAoZ3JvdXAuaXNMb2FkaW5nKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgLy8gICBpZiAoIWZnKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICwgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmYyA9IGZnLmNvbnRyb2xzW3Byb3BlcnR5TmFtZV07XHJcbiAgLy8gICBpZiAoIWZjKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZmMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIC8vICAgZmMubWFya0FzRGlydHkoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBzaG93ek1vZGFsKG1vZGFsUGFnZVBhcmFtczogTW9kYWxQYWdlUGFyYW1zKTogT2JzZXJ2YWJsZTxNb2RhbFJlc3BvbnNlPiB7XHJcbiAgICBpZiAobW9kYWxQYWdlUGFyYW1zLnBhcmVudEdyb3VwKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgaXNUcmlnZ2VyZWQgYmVmb3JlIGRpc3BsYXkgdGhlIHBvcHVwLlxyXG4gICAgICBtb2RhbFBhZ2VQYXJhbXMucGFyZW50R3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFnZVBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVQb3N0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdOYW1lJzogbmFtZSxcclxuICAgICAgJ1ZhbHVlJzogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJncmlkIGNvbmZpZyBzYXZlZChcIiArIHJlcy5zdGF0dXMgKyBcIik6IFwiLCByZXMpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZUdldChuYW1lOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXMvP25hbWU9XCIgKyBuYW1lO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoY29va2llU3RvcmVVUkwsIHsgaGVhZGVyczogYWNjZXNzVG9rZW4gfSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcIkFkbWluL0RlbGV0ZU11bHRpcGxlQ29va2llc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ2NvbnRhaW5OYW1lJzogbmFtZVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VsZW1lbnRCeUlkKGlkOiBzdHJpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB8ICdhdXRvJyA9ICdzbW9vdGgnKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3IgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhbnNsYXRpb25QYWdlRWxlbWVudChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IG9ic0xpc3QgPSBuZXcgQXJyYXk8T2JzZXJ2YWJsZTxhbnk+PigpO1xyXG4gICAgaWYgKGdyb3VwLmZvcm1IZWFkZXIpIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVTaW5nbGVJdGVtKGdyb3VwLCBcImZvcm1IZWFkZXJcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5uYXZJdGVtcyAmJiBncm91cC5uYXZJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlSXRlbUxpc3QoZ3JvdXAubmF2SXRlbXMsIFwidGV4dFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9ic0xpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKG9ic0xpc3QpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vI3JlZ2lvbiBzaWduYWxSIHNlcnZpY2VcclxuICBwdWJsaWMgam9pblByb2plY3RTaWduYWxSKHByb2plY3RDb2RlPzogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zaWduYWxyU2VydmljZS5zaWduYWxSRW5hYmxlZCgpKSB7XHJcbiAgICAgIGlmIChwcm9qZWN0Q29kZSkge1xyXG4gICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuam9pbkdyb3VwKHByb2plY3RDb2RlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBXZSBkZWZhdWx0IGZpcnN0IHByb2plY3QgY29kZSBpbiBlbnZpcm9ubWVudCBhcyBncm91cFxyXG4gICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKTtcclxuICAgICAgICBjb25zdCBmaXJzdFByb2plY3RDb2RlID0gZW52aXJvbm1lbnQucHJvamVjdENvZGVzWzBdO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuam9pbkdyb3VwKGZpcnN0UHJvamVjdENvZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdzaWduYWxSIG5vdCBlbmFibGVkLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVNpZ25hbFJNb2RpZmljYXRpb25BbGVydChmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuc2lnbmFsclNlcnZpY2Uuc2lnbmFsUkVuYWJsZWQoKSkge1xyXG4gICAgICBjb25zdCBldmVudE5hbWUgPSBgJHt3aW5kb3cubG9jYXRpb24uaHJlZn1gLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgXCIkMVwiKTtcclxuICAgICAgaWYgKCF0aGlzLmdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIpIHtcclxuICAgICAgICB0aGlzLmdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIgPSB7fTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXJbJ2FsZXJ0Rm9ybU1vZGlmaWVkJ10gPSB0aGlzLmFsZXJ0Rm9ybU1vZGlmaWVkLmJpbmQodGhpcywgZm9ybUlkKTtcclxuXHJcbiAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudCh0aGlzLmdyb3VwLCBgJHtldmVudE5hbWV9YCwgYGdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIuYWxlcnRGb3JtTW9kaWZpZWRgKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3NpZ25hbFIgbm90IGVuYWJsZWQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFsZXJ0Rm9ybU1vZGlmaWVkKGZvcm1JZDogc3RyaW5nLCBncm91cDogWkdyb3VwLCByZXNwOiBhbnksIGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXJlc3ApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BSZXN1bHQgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG5cclxuICAgIGlmICghcmVzcFJlc3VsdC5Vc2VyTmFtZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvcm1JZCA9PT0gcmVzcFJlc3VsdC5JZD8udG9TdHJpbmcoKSAmJiBldmVudE5hbWUgPT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmKSB7XHJcbiAgICAgIGlmIChyZXNwUmVzdWx0LlVzZXJOYW1lID09PSB0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4ubXlQcm9maWxlLlVzZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKHJlc3BSZXN1bHQuQWN0aW9uID09PSBBY3Rpb25UeXBlLlVwZGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy5yZWxvYWREYXRhQW5kV29ya2Zsb3dCdXR0b24ocmVzcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5EZWxldGUpIHtcclxuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJSZWNvcmQgRGVsZXRlZCBieSBBbm90aGVyIFVzZXJcIiwgXCJUaGUgY3VycmVudCByZWNvcmQgaGFzIGJlZW4gZGVsZXRlZCBieSBhbm90aGVyIHVzZXIuXCIsIFtcclxuICAgICAgICAgICAgeyB0ZXh0OiBcIk9LXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICBdLCBbXCJjb2wtNlwiXSwgdW5kZWZpbmVkLCB0cnVlKS5waXBlKHN3aXRjaE1hcCgocmVwbHkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGx5ID09PSBcIk9LXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAgICAgICAgIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JChgJHt0aGlzLmdyb3VwLnJlc291cmNlVVJMfS8ke2Zvcm1JZH1gLCBudWxsKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwICYmIHJlc3AuUm93VmVyc2lvbikge1xyXG4gICAgICAgICAgICAgIGlmIChyZXNwLlJvd1ZlcnNpb24gIT09IHRoaXMuZ3JvdXAuek1vZGVsPy5Sb3dWZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiVGhlIGN1cnJlbnQgcGFnZSBoYXMgYmVlbiBtb2RpZmllZCBieSBvdGhlciB1c2Vycy5cIiwgXCJXb3VsZCB5b3UgbGlrZSB0byByZWZyZXNoIHRoZSBwYWdlIGRhdGE/XCIsIFtcclxuICAgICAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgICAgIHsgdGV4dDogXCJZZXNcIiwgY3NzQ2xhc3M6IFwicHJpbWFyeVwiIH0gYXMgQWxlcnRCdXR0b25cclxuICAgICAgICAgICAgICAgIF0sIFtcImNvbC02XCJdLCB1bmRlZmluZWQsIHRydWUpLnBpcGUoc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocmVwbHkgPT09IFwiWWVzXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZERhdGFBbmRXb3JrZmxvd0J1dHRvbihyZXNwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93UGVybWFuZW50bHkoJ1RoZSBkYXRhIG9uIHRoZSBjdXJyZW50IHBhZ2UgaXMgbm90IHVwIHRvIGRhdGUsIGFzIGl0IGhhcyBiZWVuIHNhdmVkIGFuZCBvdmVyd3JpdHRlbiBieSBhbm90aGVyIHVzZXIuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlLicsICd0b3AnLCAnd2FybmluZycpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEFsZXJ0IHJlY2VpdmVkIHJlZ2FyZGluZyBmb3JtIG1vZGlmaWNhdGlvbiwgUm93VmVyc2lvbiByZW1haW5zIHVuYWx0ZXJlZC4gTm8gZnVydGhlciBhY3Rpb24gaGFzIGJlZW4gdGFrZW4uYClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWREYXRhQW5kV29ya2Zsb3dCdXR0b24oek1vZGVsOiBhbnkpIHtcclxuICAgIHRoaXMuZ3JvdXAuek1vZGVsID0gek1vZGVsO1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IHRoaXMuZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmZy5wYXRjaFZhbHVlKHRoaXMuZ3JvdXAuek1vZGVsKTtcclxuICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcblxyXG4gICAgLy8gQ2FwdHVyZSBhbGwgd29ya2Zsb3cgYnV0dG9uc1xyXG4gICAgY29uc3Qgd29ya2Zsb3dCdXR0b25zID0gT2JqZWN0LmtleXModGhpcy5ncm91cC56Q29tcG9uZW50cylcclxuICAgICAgLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoXCJ6d29ya2Zsb3didXR0b25zX1wiKSlcclxuICAgICAgLm1hcChrZXkgPT4gdGhpcy5ncm91cC56Q29tcG9uZW50c1trZXldKTtcclxuXHJcbiAgICAvLyBSZWxvYWQgd29ya2Zsb3cgYnV0dG9uc1xyXG4gICAgd29ya2Zsb3dCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcclxuICAgICAgYnV0dG9uLmxvYWRCdXR0b24oKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuICAgXHJcbiAgLy8gI3JlZ2lvbiBERUNcclxuICBwdWJsaWMgYXN5bmMgbG9hZENvbnRhaW5lclZpZXcoZWxlbWVudENvbnRhaW5lcjogYW55LCBjb250YWluZXJQYWdlOiBhbnksIGRhdGE6IFpGaWVsZCwgZ3JvdXA/OiBaR3JvdXApIHtcclxuICAgIGlmICghZWxlbWVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVsZW1lbnRDb250YWluZXIgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbnRhaW5lclBhZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJDb250YWluZXJQYWdlIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IGVsZW1lbnRDb250YWluZXIudmlld0NvbnRhaW5lclJlZjtcclxuICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuXHJcbiAgICBjb25zdCBlbWJlZGRlZGdyb3VwID0gbmV3IFpHcm91cCgpO1xyXG4gICAgdGhpcy5zZXRHcm91cEZvckRlYnVnZ2VyKGVtYmVkZGVkZ3JvdXApO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbnRhaW5lclBhZ2UpO1xyXG5cclxuICAgIGVtYmVkZGVkZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gZW5hYmxlIGJhY2sgdGhlIGJ1dHRvbiBmb3IgdHJpZ2dlcmluZy5cclxuXHJcbiAgICAvLyBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBncm91cCk7XHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBlbWJlZGRlZGdyb3VwKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCB7IHBhcmVudEdyb3VwOiBncm91cCwgaXNFbWJlZGRlZFBhZ2U6IHRydWUsIGVsZW1lbnRDb250YWluZXI6IGVsZW1lbnRDb250YWluZXIsIENvbnRhaW5lckZvcm1BdXRvU2Nyb2xsOiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsIH0pO1xyXG5cclxuICAgIC8vIHRvZG86IGFkZCBpbiBwcm9wXHJcbiAgICBpZiAoZGF0YSAmJiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKG1pbGxpU2Vjb25kczogbnVtYmVyID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZW5kT2ZHcmlkRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbmQtb2YtZ3JpZFwiKTtcclxuICAgIGNvbnN0IGVuZE9mR3JpZFBvc2l0aW9uSW5mbyA9IGVuZE9mR3JpZERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHlDb29yID0gKGVuZE9mR3JpZFBvc2l0aW9uSW5mbz8ueSB8fCA2MzApIC0gMTA7XHJcblxyXG4gICAgY29uc3QgbWFpbklvbkNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW9uLWNvbnRlbnQtbWFpbi1wYWdlXCIpO1xyXG4gICAgcmV0dXJuIG1haW5Jb25Db250ZW50LnNjcm9sbEJ5UG9pbnQoMCwgeUNvb3IsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9Ub3BPZlBhZ2UobWlsbGlTZWNvbmRzOiBudW1iZXIgPSAxNTAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtYWluSW9uQ29udGVudDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpb24tY29udGVudC1tYWluLXBhZ2VcIik7XHJcbiAgICByZXR1cm4gbWFpbklvbkNvbnRlbnQuc2Nyb2xsVG9Qb2ludCgwLCAwLCBtaWxsaVNlY29uZHMpIGFzIFByb21pc2U8dm9pZD47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2xvc2VDb250YWluZXJWaWV3KGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cFtgcGFyZW50R3JvdXBgXSAmJiBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXSAmJiB0eXBlb2YgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0gPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIHNldEdyb3VwRm9yRGVidWdnZXIoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgaXNEZWJ1Z2dpbmcgPSB0aGlzLnpjb3JlU2VydmljZS5pc0RlYnVnU2Vzc2lvbigpIHx8IGZhbHNlO1xyXG4gICAgaWYgKGlzRGVidWdnaW5nKSB7XHJcbiAgICAgIHRoaXMuZGVidWdTZXJ2aWNlLm9uSW5pdERlYnVnZ2VyKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoR3JpZChncm91cDogWkdyb3VwKSB7XHJcbiAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbXCJncmlkT3B0aW9uc1wiXSBhcyBaR3JpZDtcclxuICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gIH1cclxuICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG59XHJcbiJdfQ==