@sinequa/assistant 3.9.8 → 3.9.11

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.
@@ -24,13 +24,13 @@ export class ChatSettingsV3Component {
24
24
  this.appService = inject(AppService);
25
25
  }
26
26
  ngOnInit() {
27
- this.subscription.add(of(isAuthenticated()).pipe(tap(_ => this.instantiateChatService()), switchMap(() => this.chatService.initConfig$), filter(initConfig => !!initConfig)).subscribe(_ => {
27
+ this.subscription.add(of(isAuthenticated()).pipe(tap(_ => this.instantiateChatService()), switchMap(() => this.chatService.initProcess$.pipe(filter(Boolean)))).subscribe(_ => {
28
28
  this.isAdmin = this.principalService.principal.isAdministrator;
29
29
  // Init config with a copy of the original chat config, so that it won't be modified by the user until he clicks on save
30
30
  this.config = JSON.parse(JSON.stringify(this.chatService.assistantConfig$.value));
31
31
  // Show debug toggle whether the user is an admin or a delegated admin with the debug mode enabled in the uiSettings
32
- this.showDebugToggle = (this.isAdmin || !!this.chatService.userOverride$.value || (this.principalService.principal.isDelegatedAdmin && this.config.uiSettings.debug)) ?? false;
33
- this.selectedModel = this.chatService.getModel(this.config.defaultValues.service_id, this.config.defaultValues.model_id);
32
+ this.showDebugToggle = (this.isAdmin || !!this.chatService.userOverride$.value || (this.principalService.principal.isDelegatedAdmin && this.config?.uiSettings.debug)) ?? false;
33
+ this.selectedModel = this.chatService.getModel(this.config?.defaultValues.service_id, this.config?.defaultValues.model_id);
34
34
  this.initFunctionsList();
35
35
  }));
36
36
  }
@@ -39,23 +39,23 @@ export class ChatSettingsV3Component {
39
39
  }
40
40
  get hasPrompts() {
41
41
  return this.isAdmin
42
- || !!this.config.uiSettings.displaySystemPrompt
43
- || !!this.config.uiSettings.displayUserPrompt;
42
+ || !!this.config?.uiSettings.displaySystemPrompt
43
+ || !!this.config?.uiSettings.displayUserPrompt;
44
44
  }
45
45
  get hasAdvancedParameters() {
46
46
  return this.isAdmin
47
- || !!this.config.uiSettings.temperature
48
- || !!this.config.uiSettings.top_p
49
- || !!this.config.uiSettings.max_tokens;
47
+ || !!this.config?.uiSettings.temperature
48
+ || !!this.config?.uiSettings.top_p
49
+ || !!this.config?.uiSettings.max_tokens;
50
50
  }
51
51
  get hasModel() {
52
52
  return this.isAdmin
53
- || !!this.config.uiSettings.servicesModels
54
- || !!this.config.uiSettings.functions
55
- || !!this.config.uiSettings.debug
56
- || !!this.config.uiSettings.temperature
57
- || !!this.config.uiSettings.top_p
58
- || !!this.config.uiSettings.max_tokens;
53
+ || !!this.config?.uiSettings.servicesModels
54
+ || !!this.config?.uiSettings.functions
55
+ || !!this.config?.uiSettings.debug
56
+ || !!this.config?.uiSettings.temperature
57
+ || !!this.config?.uiSettings.top_p
58
+ || !!this.config?.uiSettings.max_tokens;
59
59
  }
60
60
  instantiateChatService() {
61
61
  this.chatService = this.instanceManagerService.getInstance(this.instanceId);
@@ -70,11 +70,11 @@ export class ChatSettingsV3Component {
70
70
  }
71
71
  toggleFunctionsSelection(name) {
72
72
  // Update the enabled property of the function
73
- const index = this.config.defaultValues.functions.findIndex(func => func.name === name);
73
+ const index = this.config?.defaultValues.functions.findIndex(func => func.name === name);
74
74
  this.config.defaultValues.functions[index].enabled = this.functions[index].enabled;
75
75
  }
76
76
  initFunctionsList() {
77
- this.functions = this.config.defaultValues.functions.filter(func => !!this.chatService.functions?.find(fn => fn.functionName === func.name));
77
+ this.functions = this.config?.defaultValues.functions.filter(func => !!this.chatService.functions?.find(fn => fn.functionName === func.name));
78
78
  }
79
79
  /**
80
80
  * Save the new chat config in the chat service and the user preferences
@@ -101,11 +101,11 @@ export class ChatSettingsV3Component {
101
101
  this._cancel.emit(this.chatService.assistantConfig$.value);
102
102
  }
103
103
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChatSettingsV3Component, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
104
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChatSettingsV3Component, isStandalone: true, selector: "sq-chat-settings-v3", inputs: { instanceId: "instanceId" }, outputs: { _update: "update", _cancel: "cancel" }, providers: [provideTranslocoScope('chat-settings')], ngImport: i0, template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\n <div class=\"settings-panel p-2 small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">{{ 'chatSettings.model' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">{{ 'chatSettings.model' | transloco }}</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">{{ 'chatSettings.functions' | transloco }}</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">{{ 'chatSettings.debug' | transloco }}</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>{{ 'chatSettings.advancedParameters' | transloco }}</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">{{ 'chatSettings.temperature' | transloco }}: {{config.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">{{ 'chatSettings.topP' | transloco }}: {{config.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">{{ 'chatSettings.MaxGeneratedTokens' | transloco }}:\n {{config.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">{{ 'chatSettings.Prompts' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">{{ 'chatSettings.systemPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">{{ 'chatSettings.initialUserPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">{{ 'chatSettings.cancel' | transloco }}</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">{{ 'chatSettings.save' | transloco }}</button>\n </div>\n\n</div>\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;max-height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}.d-flex{display:flex}.justify-content-end{justify-content:flex-end}.small{font-size:.875em}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-label{margin-bottom:.5rem}.form-select{--bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-switch{padding-left:2.5em}.form-check-input{--bs-form-check-bg: var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: ;--bs-btn-font-size: 1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #fff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
104
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChatSettingsV3Component, isStandalone: true, selector: "sq-chat-settings-v3", inputs: { instanceId: "instanceId" }, outputs: { _update: "update", _cancel: "cancel" }, providers: [provideTranslocoScope('chat-settings')], ngImport: i0, template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config?.uiSettings.display\">\n <div class=\"settings-panel p-2 small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">{{ 'chatSettings.model' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">{{ 'chatSettings.model' | transloco }}</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config?.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">{{ 'chatSettings.functions' | transloco }}</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">{{ 'chatSettings.debug' | transloco }}</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>{{ 'chatSettings.advancedParameters' | transloco }}</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">{{ 'chatSettings.temperature' | transloco }}: {{config?.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">{{ 'chatSettings.topP' | transloco }}: {{config?.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">{{ 'chatSettings.MaxGeneratedTokens' | transloco }}:\n {{config?.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">{{ 'chatSettings.Prompts' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">{{ 'chatSettings.systemPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">{{ 'chatSettings.initialUserPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">{{ 'chatSettings.cancel' | transloco }}</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">{{ 'chatSettings.save' | transloco }}</button>\n </div>\n\n</div>\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;max-height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}.d-flex{display:flex}.justify-content-end{justify-content:flex-end}.small{font-size:.875em}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-label{margin-bottom:.5rem}.form-select{--bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-switch{padding-left:2.5em}.form-check-input{--bs-form-check-bg: var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: ;--bs-btn-font-size: 1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #fff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
105
105
  }
106
106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChatSettingsV3Component, decorators: [{
107
107
  type: Component,
108
- args: [{ selector: 'sq-chat-settings-v3', standalone: true, imports: [CommonModule, FormsModule, TranslocoPipe], providers: [provideTranslocoScope('chat-settings')], template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\n <div class=\"settings-panel p-2 small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">{{ 'chatSettings.model' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">{{ 'chatSettings.model' | transloco }}</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">{{ 'chatSettings.functions' | transloco }}</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">{{ 'chatSettings.debug' | transloco }}</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>{{ 'chatSettings.advancedParameters' | transloco }}</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">{{ 'chatSettings.temperature' | transloco }}: {{config.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">{{ 'chatSettings.topP' | transloco }}: {{config.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">{{ 'chatSettings.MaxGeneratedTokens' | transloco }}:\n {{config.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">{{ 'chatSettings.Prompts' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">{{ 'chatSettings.systemPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">{{ 'chatSettings.initialUserPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">{{ 'chatSettings.cancel' | transloco }}</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">{{ 'chatSettings.save' | transloco }}</button>\n </div>\n\n</div>\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;max-height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}.d-flex{display:flex}.justify-content-end{justify-content:flex-end}.small{font-size:.875em}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-label{margin-bottom:.5rem}.form-select{--bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-switch{padding-left:2.5em}.form-check-input{--bs-form-check-bg: var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: ;--bs-btn-font-size: 1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #fff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}\n"] }]
108
+ args: [{ selector: 'sq-chat-settings-v3', standalone: true, imports: [CommonModule, FormsModule, TranslocoPipe], providers: [provideTranslocoScope('chat-settings')], template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config?.uiSettings.display\">\n <div class=\"settings-panel p-2 small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">{{ 'chatSettings.model' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">{{ 'chatSettings.model' | transloco }}</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config?.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">{{ 'chatSettings.functions' | transloco }}</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">{{ 'chatSettings.debug' | transloco }}</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>{{ 'chatSettings.advancedParameters' | transloco }}</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">{{ 'chatSettings.temperature' | transloco }}: {{config?.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">{{ 'chatSettings.topP' | transloco }}: {{config?.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">{{ 'chatSettings.MaxGeneratedTokens' | transloco }}:\n {{config?.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">{{ 'chatSettings.Prompts' | transloco }}</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">{{ 'chatSettings.systemPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config?.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">{{ 'chatSettings.initialUserPrompt' | transloco }}</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">{{ 'chatSettings.cancel' | transloco }}</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">{{ 'chatSettings.save' | transloco }}</button>\n </div>\n\n</div>\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;max-height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}.d-flex{display:flex}.justify-content-end{justify-content:flex-end}.small{font-size:.875em}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-label{margin-bottom:.5rem}.form-select{--bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-switch{padding-left:2.5em}.form-check-input{--bs-form-check-bg: var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: ;--bs-btn-font-size: 1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #fff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}\n"] }]
109
109
  }], propDecorators: { instanceId: [{
110
110
  type: Input
111
111
  }], _update: [{
@@ -115,4 +115,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
115
115
  type: Output,
116
116
  args: ["cancel"]
117
117
  }] } });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1zZXR0aW5ncy12My9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7OztBQVVwRSxNQUFNLE9BQU8sdUJBQXVCO0lBUnBDO1FBWW9CLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3pDLFlBQU8sR0FBRyxJ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QWtCLENBQUMseUJBQXlCLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDOytHQWpIVSx1QkFBdUI7bUdBQXZCLHVCQUF1QiwySkFGdkIsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQywwQkN0QnJELCtnSUFpRUEsb3NKRDVDWSxZQUFZLCtQQUFFLFdBQVcsbzFDQUFFLGFBQWE7OzRGQUd2Qyx1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBR25CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLGFBQ3hDLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7OEJBSTFDLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRVksT0FBTztzQkFBeEIsTUFBTTt1QkFBQyxRQUFRO2dCQUNFLE9BQU87c0JBQXhCLE1BQU07dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZpbHRlciwgb2YsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHByb3ZpZGVUcmFuc2xvY29TY29wZSwgVHJhbnNsb2NvUGlwZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5cbmltcG9ydCB7IGlzQXV0aGVudGljYXRlZCwgc2hhNTEyIH0gZnJvbSBcIkBzaW5lcXVhL2F0b21pY1wiO1xuXG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuLi9jaGF0LnNlcnZpY2VcIjtcbmltcG9ydCB7IEluc3RhbmNlTWFuYWdlclNlcnZpY2UgfSBmcm9tIFwiLi4vaW5zdGFuY2UtbWFuYWdlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDaGF0Q29uZmlnLCBHbGxtTW9kZWxEZXNjcmlwdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2FwcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBnZXRBc3Npc3RhbnRKc29uRnJvbUNDQXBwIH0gZnJvbSBcIi4uL3V0aWxzL2Fzc2lzdGFudC1qc29uXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NxLWNoYXQtc2V0dGluZ3MtdjMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1wiLi9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5zY3NzXCJdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgVHJhbnNsb2NvUGlwZV0sXG4gIHByb3ZpZGVyczogW3Byb3ZpZGVUcmFuc2xvY29TY29wZSgnY2hhdC1zZXR0aW5ncycpXVxufSlcbmV4cG9ydCBjbGFzcyBDaGF0U2V0dGluZ3NWM0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIERlZmluZSB0aGUga2V5IGJhc2VkIG9uIGl0LCB0aGUgYXBwcm9wcmlhdGUgY2hhdFNlcnZpY2UgaW5zdGFuY2Ugd2lsbCBiZSByZXR1cm5lZCBmcm9tIGluc3RhbmNlTWFuYWdlclNlcnZpY2UgKi9cbiAgQElucHV0KCkgaW5zdGFuY2VJZDogc3RyaW5nO1xuXG4gIEBPdXRwdXQoXCJ1cGRhdGVcIikgX3VwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdENvbmZpZz4oKTtcbiAgQE91dHB1dChcImNhbmNlbFwiKSBfY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29uZmlnPigpO1xuXG4gIGNoYXRTZXJ2aWNlOiBDaGF0U2VydmljZTtcbiAgY29uZmlnOiBDaGF0Q29uZmlnO1xuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHNlbGVjdGVkTW9kZWw6IEdsbG1Nb2RlbERlc2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBmdW5jdGlvbnM6IHtuYW1lOiBzdHJpbmcsIGVuYWJsZWQ6IGJvb2xlYW59W10gPSBbXTtcbiAgaXNBZG1pbiA9IGZhbHNlO1xuICBzaG93RGVidWdUb2dnbGUgPSBmYWxzZTtcblxuICBwdWJsaWMgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSA9IGluamVjdChJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlKTtcbiAgcHVibGljIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsU2VydmljZSk7XG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIG9mKGlzQXV0aGVudGljYXRlZCgpKS5waXBlKFxuICAgICAgICB0YXAoXyA9PiB0aGlzLmluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRDb25maWckKSxcbiAgICAgICAgZmlsdGVyKGluaXRDb25maWcgPT4gISFpbml0Q29uZmlnKVxuICAgICAgKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwhLmlzQWRtaW5pc3RyYXRvcjtcbiAgICAgICAgLy8gSW5pdCBjb25maWcgd2l0aCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGNoYXQgY29uZmlnLCBzbyB0aGF0IGl0IHdvbid0IGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyIHVudGlsIGhlIGNsaWNrcyBvbiBzYXZlXG4gICAgICAgIHRoaXMuY29uZmlnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUpKTtcbiAgICAgICAgLy8gU2hvdyBkZWJ1ZyB0b2dnbGUgd2hldGhlciB0aGUgdXNlciBpcyBhbiBhZG1pbiBvciBhIGRlbGVnYXRlZCBhZG1pbiB3aXRoIHRoZSBkZWJ1ZyBtb2RlIGVuYWJsZWQgaW4gdGhlIHVpU2V0dGluZ3NcbiAgICAgICAgdGhpcy5zaG93RGVidWdUb2dnbGUgPSAoXG4gICAgICAgICAgdGhpcy5pc0FkbWluIHx8ICEhdGhpcy5jaGF0U2VydmljZS51c2VyT3ZlcnJpZGUkLnZhbHVlIHx8ICh0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsIS5pc0RlbGVnYXRlZEFkbWluICYmIHRoaXMuY29uZmlnLnVpU2V0dGluZ3MuZGVidWcpXG4gICAgICAgICkgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0TW9kZWwodGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLCB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkKTtcbiAgICAgICAgdGhpcy5pbml0RnVuY3Rpb25zTGlzdCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBoYXNQcm9tcHRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWRtaW5cbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kaXNwbGF5U3lzdGVtUHJvbXB0XG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVVzZXJQcm9tcHQ7XG4gIH1cblxuICBnZXQgaGFzQWR2YW5jZWRQYXJhbWV0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWRtaW5cbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy50ZW1wZXJhdHVyZVxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRvcF9wXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MubWF4X3Rva2VucztcbiAgfVxuXG4gIGdldCBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FkbWluXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3Muc2VydmljZXNNb2RlbHNcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5mdW5jdGlvbnNcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kZWJ1Z1xuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MudG9wX3BcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5tYXhfdG9rZW5zO1xuICB9XG5cbiAgaW5zdGFudGlhdGVDaGF0U2VydmljZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlID0gdGhpcy5pbnN0YW5jZU1hbmFnZXJTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMuaW5zdGFuY2VJZCk7XG4gIH1cblxuICBvbkNoYXRNb2RlbENoYW5nZShzZWxlY3RlZE1vZGVsOiBHbGxtTW9kZWxEZXNjcmlwdGlvbikge1xuICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBtb2RlbFxuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCA9IHNlbGVjdGVkTW9kZWwuc2VydmljZUlkO1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQgPSBzZWxlY3RlZE1vZGVsLm1vZGVsSWQ7XG4gIH1cblxuICBnZXRGdW5jdGlvbkRlc2NyaXB0aW9uKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhdFNlcnZpY2UuZnVuY3Rpb25zPy5maW5kKGZuID0+IGZuLmZ1bmN0aW9uTmFtZSA9PT0gbmFtZSk/LmRlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICB0b2dnbGVGdW5jdGlvbnNTZWxlY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBlbmFibGVkIHByb3BlcnR5IG9mIHRoZSBmdW5jdGlvblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnMuZmluZEluZGV4KGZ1bmMgPT4gZnVuYy5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9uc1tpbmRleF0uZW5hYmxlZCA9IHRoaXMuZnVuY3Rpb25zW2luZGV4XS5lbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RnVuY3Rpb25zTGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZ1bmN0aW9ucyA9IHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zLmZpbHRlcihmdW5jID0+ICEhdGhpcy5jaGF0U2VydmljZS5mdW5jdGlvbnM/LmZpbmQoZm4gPT4gZm4uZnVuY3Rpb25OYW1lID09PSBmdW5jLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBuZXcgY2hhdCBjb25maWcgaW4gdGhlIGNoYXQgc2VydmljZSBhbmQgdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICogSWYgdGhlIHVzZXIgaGFzIG5ldmVyIG1vZGlmaWVkIHRoZSBkZWZhdWx0IHZhbHVlcywgd2UgbmVlZCB0byBzYXZlIHRoZSBoYXNoIG9mIHRoZSBzdGFuZGFyZCBkZWZhdWx0IHZhbHVlcywgYXMgZGVmaW5lZCBieSB0aGUgYWRtaW4sIGluIG9yZGVyIHRvIHByb3Blcmx5IHRyYWNrIGNoYW5nZXMgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgY29uc3QgdXNlclNldHRpbmdzQ29uZmlnID0gdGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRzW3RoaXMuaW5zdGFuY2VJZF0gfHwge307XG4gICAgaWYgKCF1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlcykgeyAvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHRoZSB1c2VyIG1ha2VzIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgICBjb25zdCBzdGFuZGFyZENoYXRDb25maWcgPSBnZXRBc3Npc3RhbnRKc29uRnJvbUNDQXBwKHRoaXMuYXBwU2VydmljZS5hcHAhLCB0aGlzLmluc3RhbmNlSWQpO1xuICAgICAgY29uc3QgY3VycmVudERlZmF1bHRWYWx1ZXNIYXNoID0gYXdhaXQgc2hhNTEyKEpTT04uc3RyaW5naWZ5KHN0YW5kYXJkQ2hhdENvbmZpZy5kZWZhdWx0VmFsdWVzKSk7XG4gICAgICBjb25zdCBoYXNoZXMgPSB7IC4uLnVzZXJTZXR0aW5nc0NvbmZpZy5oYXNoZXMsIFwiYXBwbGllZC1kZWZhdWx0VmFsdWVzLWhhc2hcIjogY3VycmVudERlZmF1bHRWYWx1ZXNIYXNoIH07XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnVwZGF0ZUNoYXRDb25maWcodGhpcy5jb25maWcsIGhhc2hlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UudXBkYXRlQ2hhdENvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KFwiYXN0LWNvbmZpZ3VyYXRpb24uY2xpY2tcIiwgeyAnY29uZmlndXJhdGlvbic6IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKSB9KTtcbiAgICB0aGlzLl91cGRhdGUuZW1pdCh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHRoZSBjdXJyZW50IGNoYW5nZXNcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLl9jYW5jZWwuZW1pdCh0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic3EtY2hhdC1zZXR0aW5nc1wiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5kaXNwbGF5XCI+XG4gIDxkaXYgY2xhc3M9XCJzZXR0aW5ncy1wYW5lbCBwLTIgc21hbGxcIiAqbmdJZj1cImNvbmZpZ1wiPlxuXG4gICAgPGg1ICpuZ0lmPVwiaGFzTW9kZWxcIj57eyAnY2hhdFNldHRpbmdzLm1vZGVsJyB8IHRyYW5zbG9jbyB9fTwvaDU+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3Muc2VydmljZXNNb2RlbHNcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJnbGxtTW9kZWxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnY2hhdFNldHRpbmdzLm1vZGVsJyB8IHRyYW5zbG9jbyB9fTwvbGFiZWw+XG4gICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cImdsbG1Nb2RlbFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRNb2RlbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhdE1vZGVsQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbW9kZWwgb2YgY2hhdFNlcnZpY2UubW9kZWxzXCIgW25nVmFsdWVdPVwibW9kZWxcIj57e21vZGVsLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItNFwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5mdW5jdGlvbnNcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJnbGxtRnVuY3Rpb25zXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ2NoYXRTZXR0aW5ncy5mdW5jdGlvbnMnIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgIDxkaXYgaWQ9XCJnbGxtRnVuY3Rpb25zXCIgKm5nRm9yPVwibGV0IGZ1bmMgb2YgZnVuY3Rpb25zXCIgY2xhc3M9XCJtdWx0aS1vcHRpb24gZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgcm9sZT1cInN3aXRjaFwiIFtpZF09XCJmdW5jLm5hbWVcIiBbKG5nTW9kZWwpXT1cImZ1bmMuZW5hYmxlZFwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlRnVuY3Rpb25zU2VsZWN0aW9uKGZ1bmMubmFtZSlcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIFtmb3JdPVwiZnVuYy5uYW1lXCIgW3RpdGxlXT1cImdldEZ1bmN0aW9uRGVzY3JpcHRpb24oZnVuYy5uYW1lKVwiPnt7IGZ1bmMubmFtZSB9fTwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1iLTJcIiAqbmdJZj1cInNob3dEZWJ1Z1RvZ2dsZVwiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIiBpZD1cImRlYnVnXCIgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy5kZWJ1Z1wiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImRlYnVnXCI+e3sgJ2NoYXRTZXR0aW5ncy5kZWJ1ZycgfCB0cmFuc2xvY28gfX08L2xhYmVsPlxuICAgIDwvZGl2PlxuXG4gICAgPGRldGFpbHMgKm5nSWY9XCJoYXNBZHZhbmNlZFBhcmFtZXRlcnNcIj5cbiAgICAgIDxzdW1tYXJ5Pnt7ICdjaGF0U2V0dGluZ3MuYWR2YW5jZWRQYXJhbWV0ZXJzJyB8IHRyYW5zbG9jbyB9fTwvc3VtbWFyeT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ0ZW1wZXJhdHVyZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdjaGF0U2V0dGluZ3MudGVtcGVyYXR1cmUnIHwgdHJhbnNsb2NvIH19OiB7e2NvbmZpZy5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmb3JtLXJhbmdlIGZvcm0tcmFuZ2Utc21cIiBtaW49XCIwXCIgbWF4PVwiMlwiIHN0ZXA9XCIwLjFcIiBpZD1cInRlbXBlcmF0dXJlXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnRvcF9wXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ0b3AtcFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdjaGF0U2V0dGluZ3MudG9wUCcgfCB0cmFuc2xvY28gfX06IHt7Y29uZmlnLmRlZmF1bHRWYWx1ZXMudG9wX3B9fTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cImZvcm0tcmFuZ2UgZm9ybS1yYW5nZS1zbVwiIG1pbj1cIjBcIiBtYXg9XCIxXCIgc3RlcD1cIjAuMDVcIiBpZD1cInRvcC1wXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnRvcF9wXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLm1heF90b2tlbnNcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cIm1heC10b2tlbnNcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnY2hhdFNldHRpbmdzLk1heEdlbmVyYXRlZFRva2VucycgfCB0cmFuc2xvY28gfX06XG4gICAgICAgICAge3tjb25maWcuZGVmYXVsdFZhbHVlcy5tYXhfdG9rZW5zfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmb3JtLXJhbmdlIGZvcm0tcmFuZ2Utc21cIiBtaW49XCIxXCIgbWF4PVwiMjA0OFwiIHN0ZXA9XCIxXCIgaWQ9XCJtYXgtdG9rZW5zXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnNcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGV0YWlscz5cblxuICAgIDxocj5cblxuICAgIDxoNSAqbmdJZj1cImhhc1Byb21wdHNcIj57eyAnY2hhdFNldHRpbmdzLlByb21wdHMnIHwgdHJhbnNsb2NvIH19PC9oNT5cbiAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5kaXNwbGF5U3lzdGVtUHJvbXB0XCI+XG4gICAgICA8bGFiZWwgZm9yPVwiaW5pdGlhbFN5c3RlbVByb21wdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdjaGF0U2V0dGluZ3Muc3lzdGVtUHJvbXB0JyB8IHRyYW5zbG9jbyB9fTwvbGFiZWw+XG4gICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImluaXRpYWxTeXN0ZW1Qcm9tcHRcIiBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnN5c3RlbVByb21wdFwiPjwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVVzZXJQcm9tcHRcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJpbml0aWFsVXNlclByb21wdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdjaGF0U2V0dGluZ3MuaW5pdGlhbFVzZXJQcm9tcHQnIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiaW5pdGlhbFVzZXJQcm9tcHRcIiBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnVzZXJQcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJidXR0b25zLXBhbmVsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMVwiIChjbGljayk9XCJjYW5jZWwoKVwiPnt7ICdjaGF0U2V0dGluZ3MuY2FuY2VsJyB8IHRyYW5zbG9jbyB9fTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAqbmdJZj1cImNvbmZpZ1wiIChjbGljayk9XCJzYXZlKClcIj57eyAnY2hhdFNldHRpbmdzLnNhdmUnIHwgdHJhbnNsb2NvIH19PC9idXR0b24+XG4gIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1zZXR0aW5ncy12My9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7OztBQVVwRSxNQUFNLE9BQU8sdUJBQXVCO0lBUnBDO1FBWW9CLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3pDLFlBQU8sR0FBRyxJ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RUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7K0dBaEhVLHVCQUF1QjttR0FBdkIsdUJBQXVCLDJKQUZ2QixDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDLDBCQ3RCckQsMGhJQWlFQSxvc0pENUNZLFlBQVksK1BBQUUsV0FBVyxvMUNBQUUsYUFBYTs7NEZBR3ZDLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FHbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsYUFDeEMsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQzs4QkFJMUMsVUFBVTtzQkFBbEIsS0FBSztnQkFFWSxPQUFPO3NCQUF4QixNQUFNO3VCQUFDLFFBQVE7Z0JBQ0UsT0FBTztzQkFBeEIsTUFBTTt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZmlsdGVyLCBvZiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcHJvdmlkZVRyYW5zbG9jb1Njb3BlLCBUcmFuc2xvY29QaXBlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcblxuaW1wb3J0IHsgaXNBdXRoZW50aWNhdGVkLCBzaGE1MTIgfSBmcm9tIFwiQHNpbmVxdWEvYXRvbWljXCI7XG5cbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5zdGFuY2VNYW5hZ2VyU2VydmljZSB9IGZyb20gXCIuLi9pbnN0YW5jZS1tYW5hZ2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IENoYXRDb25maWcsIEdsbG1Nb2RlbERlc2NyaXB0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvYXBwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IGdldEFzc2lzdGFudEpzb25Gcm9tQ0NBcHAgfSBmcm9tIFwiLi4vdXRpbHMvYXNzaXN0YW50LWpzb25cIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3EtY2hhdC1zZXR0aW5ncy12MycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXCIuL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnNjc3NcIl0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBUcmFuc2xvY29QaXBlXSxcbiAgcHJvdmlkZXJzOiBbcHJvdmlkZVRyYW5zbG9jb1Njb3BlKCdjaGF0LXNldHRpbmdzJyldXG59KVxuZXhwb3J0IGNsYXNzIENoYXRTZXR0aW5nc1YzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogRGVmaW5lIHRoZSBrZXkgYmFzZWQgb24gaXQsIHRoZSBhcHByb3ByaWF0ZSBjaGF0U2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGZyb20gaW5zdGFuY2VNYW5hZ2VyU2VydmljZSAqL1xuICBASW5wdXQoKSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgQE91dHB1dChcInVwZGF0ZVwiKSBfdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29uZmlnPigpO1xuICBAT3V0cHV0KFwiY2FuY2VsXCIpIF9jYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRDb25maWc+KCk7XG5cbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBjb25maWc6IENoYXRDb25maWc7XG4gIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgc2VsZWN0ZWRNb2RlbDogR2xsbU1vZGVsRGVzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIGZ1bmN0aW9uczoge25hbWU6IHN0cmluZywgZW5hYmxlZDogYm9vbGVhbn1bXSA9IFtdO1xuICBpc0FkbWluID0gZmFsc2U7XG4gIHNob3dEZWJ1Z1RvZ2dsZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEluc3RhbmNlTWFuYWdlclNlcnZpY2UpO1xuICBwdWJsaWMgcHJpbmNpcGFsU2VydmljZSA9IGluamVjdChQcmluY2lwYWxTZXJ2aWNlKTtcbiAgcHVibGljIGFwcFNlcnZpY2UgPSBpbmplY3QoQXBwU2VydmljZSk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgb2YoaXNBdXRoZW50aWNhdGVkKCkpLnBpcGUoXG4gICAgICAgIHRhcChfID0+IHRoaXMuaW5zdGFudGlhdGVDaGF0U2VydmljZSgpKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY2hhdFNlcnZpY2UuaW5pdFByb2Nlc3MkLnBpcGUoZmlsdGVyKEJvb2xlYW4pKSksXG4gICAgICApLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgdGhpcy5pc0FkbWluID0gdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbCEuaXNBZG1pbmlzdHJhdG9yO1xuICAgICAgICAvLyBJbml0IGNvbmZpZyB3aXRoIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgY2hhdCBjb25maWcsIHNvIHRoYXQgaXQgd29uJ3QgYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIgdW50aWwgaGUgY2xpY2tzIG9uIHNhdmVcbiAgICAgICAgdGhpcy5jb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSkpO1xuICAgICAgICAvLyBTaG93IGRlYnVnIHRvZ2dsZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGFuIGFkbWluIG9yIGEgZGVsZWdhdGVkIGFkbWluIHdpdGggdGhlIGRlYnVnIG1vZGUgZW5hYmxlZCBpbiB0aGUgdWlTZXR0aW5nc1xuICAgICAgICB0aGlzLnNob3dEZWJ1Z1RvZ2dsZSA9IChcbiAgICAgICAgICB0aGlzLmlzQWRtaW4gfHwgISF0aGlzLmNoYXRTZXJ2aWNlLnVzZXJPdmVycmlkZSQudmFsdWUgfHwgKHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwhLmlzRGVsZWdhdGVkQWRtaW4gJiYgdGhpcy5jb25maWc/LnVpU2V0dGluZ3MuZGVidWcpXG4gICAgICAgICkgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0TW9kZWwodGhpcy5jb25maWc/LmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCwgdGhpcy5jb25maWc/LmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQpO1xuICAgICAgICB0aGlzLmluaXRGdW5jdGlvbnNMaXN0KCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0IGhhc1Byb21wdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBZG1pblxuICAgICAgfHwgISF0aGlzLmNvbmZpZz8udWlTZXR0aW5ncy5kaXNwbGF5U3lzdGVtUHJvbXB0XG4gICAgICB8fCAhIXRoaXMuY29uZmlnPy51aVNldHRpbmdzLmRpc3BsYXlVc2VyUHJvbXB0O1xuICB9XG5cbiAgZ2V0IGhhc0FkdmFuY2VkUGFyYW1ldGVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FkbWluXG4gICAgICB8fCAhIXRoaXMuY29uZmlnPy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXG4gICAgICB8fCAhIXRoaXMuY29uZmlnPy51aVNldHRpbmdzLnRvcF9wXG4gICAgICB8fCAhIXRoaXMuY29uZmlnPy51aVNldHRpbmdzLm1heF90b2tlbnM7XG4gIH1cblxuICBnZXQgaGFzTW9kZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBZG1pblxuICAgICAgfHwgISF0aGlzLmNvbmZpZz8udWlTZXR0aW5ncy5zZXJ2aWNlc01vZGVsc1xuICAgICAgfHwgISF0aGlzLmNvbmZpZz8udWlTZXR0aW5ncy5mdW5jdGlvbnNcbiAgICAgIHx8ICEhdGhpcy5jb25maWc/LnVpU2V0dGluZ3MuZGVidWdcbiAgICAgIHx8ICEhdGhpcy5jb25maWc/LnVpU2V0dGluZ3MudGVtcGVyYXR1cmVcbiAgICAgIHx8ICEhdGhpcy5jb25maWc/LnVpU2V0dGluZ3MudG9wX3BcbiAgICAgIHx8ICEhdGhpcy5jb25maWc/LnVpU2V0dGluZ3MubWF4X3Rva2VucztcbiAgfVxuXG4gIGluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5jaGF0U2VydmljZSA9IHRoaXMuaW5zdGFuY2VNYW5hZ2VyU2VydmljZS5nZXRJbnN0YW5jZSh0aGlzLmluc3RhbmNlSWQpO1xuICB9XG5cbiAgb25DaGF0TW9kZWxDaGFuZ2Uoc2VsZWN0ZWRNb2RlbDogR2xsbU1vZGVsRGVzY3JpcHRpb24pIHtcbiAgICAvLyBVcGRhdGUgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgbW9kZWxcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLnNlcnZpY2VfaWQgPSBzZWxlY3RlZE1vZGVsLnNlcnZpY2VJZDtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkID0gc2VsZWN0ZWRNb2RlbC5tb2RlbElkO1xuICB9XG5cbiAgZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNoYXRTZXJ2aWNlLmZ1bmN0aW9ucz8uZmluZChmbiA9PiBmbi5mdW5jdGlvbk5hbWUgPT09IG5hbWUpPy5kZXNjcmlwdGlvbiB8fCBcIlwiO1xuICB9XG5cbiAgdG9nZ2xlRnVuY3Rpb25zU2VsZWN0aW9uKG5hbWU6IHN0cmluZykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZW5hYmxlZCBwcm9wZXJ0eSBvZiB0aGUgZnVuY3Rpb25cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY29uZmlnPy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucy5maW5kSW5kZXgoZnVuYyA9PiBmdW5jLm5hbWUgPT09IG5hbWUpO1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zW2luZGV4XS5lbmFibGVkID0gdGhpcy5mdW5jdGlvbnNbaW5kZXhdLmVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGluaXRGdW5jdGlvbnNMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuZnVuY3Rpb25zID0gdGhpcy5jb25maWc/LmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zLmZpbHRlcihmdW5jID0+ICEhdGhpcy5jaGF0U2VydmljZS5mdW5jdGlvbnM/LmZpbmQoZm4gPT4gZm4uZnVuY3Rpb25OYW1lID09PSBmdW5jLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBuZXcgY2hhdCBjb25maWcgaW4gdGhlIGNoYXQgc2VydmljZSBhbmQgdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICogSWYgdGhlIHVzZXIgaGFzIG5ldmVyIG1vZGlmaWVkIHRoZSBkZWZhdWx0IHZhbHVlcywgd2UgbmVlZCB0byBzYXZlIHRoZSBoYXNoIG9mIHRoZSBzdGFuZGFyZCBkZWZhdWx0IHZhbHVlcywgYXMgZGVmaW5lZCBieSB0aGUgYWRtaW4sIGluIG9yZGVyIHRvIHByb3Blcmx5IHRyYWNrIGNoYW5nZXMgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgY29uc3QgdXNlclNldHRpbmdzQ29uZmlnID0gdGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRzW3RoaXMuaW5zdGFuY2VJZF0gfHwge307XG4gICAgaWYgKCF1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlcykgeyAvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHRoZSB1c2VyIG1ha2VzIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgICBjb25zdCBzdGFuZGFyZENoYXRDb25maWcgPSBnZXRBc3Npc3RhbnRKc29uRnJvbUNDQXBwKHRoaXMuYXBwU2VydmljZS5hcHAhLCB0aGlzLmluc3RhbmNlSWQpO1xuICAgICAgY29uc3QgY3VycmVudERlZmF1bHRWYWx1ZXNIYXNoID0gYXdhaXQgc2hhNTEyKEpTT04uc3RyaW5naWZ5KHN0YW5kYXJkQ2hhdENvbmZpZy5kZWZhdWx0VmFsdWVzKSk7XG4gICAgICBjb25zdCBoYXNoZXMgPSB7IC4uLnVzZXJTZXR0aW5nc0NvbmZpZy5oYXNoZXMsIFwiYXBwbGllZC1kZWZhdWx0VmFsdWVzLWhhc2hcIjogY3VycmVudERlZmF1bHRWYWx1ZXNIYXNoIH07XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnVwZGF0ZUNoYXRDb25maWcodGhpcy5jb25maWcsIGhhc2hlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UudXBkYXRlQ2hhdENvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KFwiYXN0LWNvbmZpZ3VyYXRpb24uY2xpY2tcIiwgeyAnY29uZmlndXJhdGlvbic6IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKSB9KTtcbiAgICB0aGlzLl91cGRhdGUuZW1pdCh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHRoZSBjdXJyZW50IGNoYW5nZXNcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLl9jYW5jZWwuZW1pdCh0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic3EtY2hhdC1zZXR0aW5nc1wiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWc/LnVpU2V0dGluZ3MuZGlzcGxheVwiPlxuICA8ZGl2IGNsYXNzPVwic2V0dGluZ3MtcGFuZWwgcC0yIHNtYWxsXCIgKm5nSWY9XCJjb25maWdcIj5cblxuICAgIDxoNSAqbmdJZj1cImhhc01vZGVsXCI+e3sgJ2NoYXRTZXR0aW5ncy5tb2RlbCcgfCB0cmFuc2xvY28gfX08L2g1PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZz8udWlTZXR0aW5ncy5zZXJ2aWNlc01vZGVsc1wiPlxuICAgICAgPGxhYmVsIGZvcj1cImdsbG1Nb2RlbFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdjaGF0U2V0dGluZ3MubW9kZWwnIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwiZ2xsbU1vZGVsXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZE1vZGVsXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGF0TW9kZWxDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBjaGF0U2VydmljZS5tb2RlbHNcIiBbbmdWYWx1ZV09XCJtb2RlbFwiPnt7bW9kZWwubmFtZX19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZz8udWlTZXR0aW5ncy5mdW5jdGlvbnNcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJnbGxtRnVuY3Rpb25zXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ2NoYXRTZXR0aW5ncy5mdW5jdGlvbnMnIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgIDxkaXYgaWQ9XCJnbGxtRnVuY3Rpb25zXCIgKm5nRm9yPVwibGV0IGZ1bmMgb2YgZnVuY3Rpb25zXCIgY2xhc3M9XCJtdWx0aS1vcHRpb24gZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgcm9sZT1cInN3aXRjaFwiIFtpZF09XCJmdW5jLm5hbWVcIiBbKG5nTW9kZWwpXT1cImZ1bmMuZW5hYmxlZFwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlRnVuY3Rpb25zU2VsZWN0aW9uKGZ1bmMubmFtZSlcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIFtmb3JdPVwiZnVuYy5uYW1lXCIgW3RpdGxlXT1cImdldEZ1bmN0aW9uRGVzY3JpcHRpb24oZnVuYy5uYW1lKVwiPnt7IGZ1bmMubmFtZSB9fTwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1iLTJcIiAqbmdJZj1cInNob3dEZWJ1Z1RvZ2dsZVwiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIiBpZD1cImRlYnVnXCIgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy5kZWJ1Z1wiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImRlYnVnXCI+e3sgJ2NoYXRTZXR0aW5ncy5kZWJ1ZycgfCB0cmFuc2xvY28gfX08L2xhYmVsPlxuICAgIDwvZGl2PlxuXG4gICAgPGRldGFpbHMgKm5nSWY9XCJoYXNBZHZhbmNlZFBhcmFtZXRlcnNcIj5cbiAgICAgIDxzdW1tYXJ5Pnt7ICdjaGF0U2V0dGluZ3MuYWR2YW5jZWRQYXJhbWV0ZXJzJyB8IHRyYW5zbG9jbyB9fTwvc3VtbWFyeT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZz8udWlTZXR0aW5ncy50ZW1wZXJhdHVyZVwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwidGVtcGVyYXR1cmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnY2hhdFNldHRpbmdzLnRlbXBlcmF0dXJlJyB8IHRyYW5zbG9jbyB9fToge3tjb25maWc/LmRlZmF1bHRWYWx1ZXMudGVtcGVyYXR1cmV9fTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cImZvcm0tcmFuZ2UgZm9ybS1yYW5nZS1zbVwiIG1pbj1cIjBcIiBtYXg9XCIyXCIgc3RlcD1cIjAuMVwiIGlkPVwidGVtcGVyYXR1cmVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMudGVtcGVyYXR1cmVcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnPy51aVNldHRpbmdzLnRvcF9wXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ0b3AtcFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdjaGF0U2V0dGluZ3MudG9wUCcgfCB0cmFuc2xvY28gfX06IHt7Y29uZmlnPy5kZWZhdWx0VmFsdWVzLnRvcF9wfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmb3JtLXJhbmdlIGZvcm0tcmFuZ2Utc21cIiBtaW49XCIwXCIgbWF4PVwiMVwiIHN0ZXA9XCIwLjA1XCIgaWQ9XCJ0b3AtcFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy50b3BfcFwiPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWc/LnVpU2V0dGluZ3MubWF4X3Rva2Vuc1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWF4LXRva2Vuc1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdjaGF0U2V0dGluZ3MuTWF4R2VuZXJhdGVkVG9rZW5zJyB8IHRyYW5zbG9jbyB9fTpcbiAgICAgICAgICB7e2NvbmZpZz8uZGVmYXVsdFZhbHVlcy5tYXhfdG9rZW5zfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmb3JtLXJhbmdlIGZvcm0tcmFuZ2Utc21cIiBtaW49XCIxXCIgbWF4PVwiMjA0OFwiIHN0ZXA9XCIxXCIgaWQ9XCJtYXgtdG9rZW5zXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnNcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGV0YWlscz5cblxuICAgIDxocj5cblxuICAgIDxoNSAqbmdJZj1cImhhc1Byb21wdHNcIj57eyAnY2hhdFNldHRpbmdzLlByb21wdHMnIHwgdHJhbnNsb2NvIH19PC9oNT5cbiAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWc/LnVpU2V0dGluZ3MuZGlzcGxheVN5c3RlbVByb21wdFwiPlxuICAgICAgPGxhYmVsIGZvcj1cImluaXRpYWxTeXN0ZW1Qcm9tcHRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnY2hhdFNldHRpbmdzLnN5c3RlbVByb21wdCcgfCB0cmFuc2xvY28gfX08L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJpbml0aWFsU3lzdGVtUHJvbXB0XCIgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy5zeXN0ZW1Qcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZz8udWlTZXR0aW5ncy5kaXNwbGF5VXNlclByb21wdFwiPlxuICAgICAgPGxhYmVsIGZvcj1cImluaXRpYWxVc2VyUHJvbXB0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ2NoYXRTZXR0aW5ncy5pbml0aWFsVXNlclByb21wdCcgfCB0cmFuc2xvY28gfX08L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJpbml0aWFsVXNlclByb21wdFwiIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMudXNlclByb21wdFwiPjwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtcGFuZWwgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBtZS0xXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+e3sgJ2NoYXRTZXR0aW5ncy5jYW5jZWwnIHwgdHJhbnNsb2NvIH19PC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiICpuZ0lmPVwiY29uZmlnXCIgKGNsaWNrKT1cInNhdmUoKVwiPnt7ICdjaGF0U2V0dGluZ3Muc2F2ZScgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuIl19
@@ -101,7 +101,6 @@ export class ChatService {
101
101
  // Map the results of parallel requests to a boolean indicating success
102
102
  map(([models, functions]) => {
103
103
  const result = (models !== undefined && functions !== undefined && !!models && !!functions);
104
- this.models = models;
105
104
  this.initProcess$.next(result);
106
105
  return result;
107
106
  }),
@@ -600,4 +599,4 @@ export class ChatService {
600
599
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChatService, decorators: [{
601
600
  type: Injectable
602
601
  }] });
603
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sUUFBUSxFQUNSLElBQUksRUFDSixHQUFHLEVBRUgsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEVBQ0gsVUFBVSxFQUNYLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUNMLEtBQUssRUFFTCxJQUFJLEVBQ0osWUFBWSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBcUIxRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUE2QixNQUFNLG1DQUFtQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSx3QkFBd0IsRUFBb0MsTUFBTSx1Q0FBdUMsQ0FBQztBQUNuSCxPQUFPLEVBQUUsNkJBQTZCLEVBQTBDLE1BQU0sNENBQTRDLENBQUM7QUFDbkksT0FBTyxFQUFFLHdCQUF3QixFQUFxQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ3BILE9BQU8sRUFBRSw4QkFBOEIsRUFBMkMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2SSxP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QUMsYUFBYSxDQUFDLFVBQVU7WUFDbkUsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLFFBQVE7U0FDaEUsQ0FBQztRQUVGLElBQUksSUFBSSxLQUFLLHFCQUFxQixFQUFFLENBQUM7WUFDbkMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2QyxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUc7WUFDWixJQUFJO1lBQ0osTUFBTSxFQUFFO2dCQUNOLEdBQUcsV0FBVztnQkFDZCxHQUFHLE9BQU87YUFDWDtTQUNGLENBQUE7UUFDRCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQzsrR0Fwb0JVLFdBQVc7bUhBQVgsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSBcIkBqc3ZlcnNlL3RyYW5zbG9jb1wiO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBkZWZlcixcbiAgZmlsdGVyLFxuICBmb3JrSm9pbixcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbiAgdGhyb3dFcnJvclxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSHViQ29ubmVjdGlvbiB9IGZyb20gXCJAbWljcm9zb2Z0L3NpZ25hbHJcIjtcbmltcG9ydCB7XG4gIEF1ZGl0LFxuICBRdWVyeSxcbiAgZ3VpZCxcbiAgZ2xvYmFsQ29uZmlnXG59IGZyb20gXCJAc2luZXF1YS9hdG9taWNcIjtcblxuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2FwcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IFVzZXJTZXR0aW5nc1dlYlNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy91c2VyLXNldHRpbmdzLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gIENoYXRDb25maWcsXG4gIENoYXRNZXNzYWdlLFxuICBDaGF0UmVzcG9uc2UsXG4gIENoYXRVc2FnZU1ldHJpY3MsXG4gIERlYnVnTWVzc2FnZSxcbiAgRGVsZXRlU2F2ZWRDaGF0UmVzcG9uc2UsXG4gIEdsbG1GdW5jdGlvbixcbiAgR2xsbU1vZGVsRGVzY3JpcHRpb24sXG4gIEt2T2JqZWN0LFxuICBMaXN0T2JqZWN0LFxuICBNZXNzYWdlSGFuZGxlcixcbiAgUXVvdGEsXG4gIFNhdmVkQ2hhdCxcbiAgU2F2ZWRDaGF0SGlzdG9yeSxcbiAgU2F2ZWRDaGF0UmVzcG9uc2UsXG4gIFRva2VuQ29uc3VtcHRpb24sXG4gIFVzZXJUb2tlbkNvbnN1bXB0aW9uXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZpY2VzL3NpZ25hbFIud2ViLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudFV0aWxzIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMuc2VydmljZVwiO1xuaW1wb3J0IHsgU2F2ZWRDaGF0c1NlcnZpY2UsIFNhdmVkQ2hhdHNPcGVyYXRpb25Db25maWcgfSBmcm9tIFwiLi9zYXZlZC1jaGF0cy9zYXZlZC1jaGF0cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTaWduYWxSQ29ubmVjdGlvblNlcnZpY2UsIFNpZ25hbFJDb25uZWN0aW9uT3BlcmF0aW9uQ29uZmlnIH0gZnJvbSBcIi4vc2VydmljZXMvc2lnbmFsUi1jb25uZWN0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlLCBBc3Npc3RhbnRDb25maWd1cmF0aW9uT3BlcmF0aW9uQ29udGV4dCB9IGZyb20gXCIuL3NlcnZpY2VzL2Fzc2lzdGFudC1jb25maWd1cmF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudE1ldGFkYXRhU2VydmljZSwgQXNzaXN0YW50TWV0YWRhdGFPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vc2VydmljZXMvYXNzaXN0YW50LW1ldGFkYXRhLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudFRva2Vuc1RyYWNraW5nU2VydmljZSwgQXNzaXN0YW50VG9rZW5zVHJhY2tpbmdPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vc2VydmljZXMvYXNzaXN0YW50LXRva2Vucy10cmFja2luZy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UsIEFzc2lzdGFudFdzRnJhbWVzQ29udGV4dCB9IGZyb20gXCIuL3NlcnZpY2VzL2Fzc2lzdGFudC13cy1mcmFtZXMuc2VydmljZVwiOyAvLyBBZGRlZFxuaW1wb3J0IHsgRGVidWdNZXNzYWdlT3BlcmF0aW9uQ29uZmlnLCBEZWJ1Z01lc3NhZ2VTZXJ2aWNlIH0gZnJvbSBcIi4vZGVidWctbWVzc2FnZS9kZWJ1Zy1tZXNzYWdlLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENoYXRTZXJ2aWNlIHtcblxuICAvKiogTmFtZSBvZiB0aGUgYXNzaXN0YW50IHdlYnNvY2tldCBlbmRwb2ludC4gKi9cbiAgV1NfUkVRVUVTVF9VUkw6IHN0cmluZztcbiAgLyoqIE5hbWUgb2YgdGhlIGFzc2lzdGFudCBSRVNUIGVuZHBvaW50LiAqL1xuICBSRVNUX1JFUVVFU1RfVVJMOiBzdHJpbmc7XG4gIC8qKiBTaWduYWxSIGNvbm5lY3Rpb24gaW5zdGFuY2UgKi9cbiAgcHVibGljIGNvbm5lY3Rpb246IEh1YkNvbm5lY3Rpb24gfCB1bmRlZmluZWQ7XG4gIC8qKiBFbWl0IHRydWUgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGFzc2lzdGFudCBwcm9jZXNzIGlzIGRvbmUuICovXG4gIGluaXRQcm9jZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogRW1pdCB0cnVlIG9uY2UgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBhc3Npc3RhbnQgY29uZmlnIGlzIGRvbmUuICovXG4gIGluaXRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBFbWl0IHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgYXNzaXN0YW50LiAqL1xuICBhc3Npc3RhbnRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGF0Q29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0cnVlIGlmIHRoZSB1c2VyIGhhcyBiZWVuIG92ZXJyaWRkZW4sIGZhbHNlIG90aGVyd2lzZS4gKi9cbiAgdXNlck92ZXJyaWRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqXG4gICAqIEVtaXQgdHJ1ZSBpZiB0aGUgZmV0Y2ggb2YgYW4gYXNzaXN0YW50J3MgcmVzcG9uc2UgaXMgb25nb2luZyAoaXQgaW5jbHVkZXMgU3RyZWFtaW5nIHN0YXR1cyBvZiB0aGUgYXNzaXN0YW50IGVuZHBvaW50IEFORCBzYXZpbmcgdGhlIGRpc2N1c3Npb24gaWYgc2F2ZSBDaGF0IGlzIGVuYWJsZWQpLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gcHJldmVudCBtdWx0aXBsZSBmZXRjaGVzIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqIFR5cGljYWxseSwgdGhlcmUgaXMgbm8gcHJvYmxlbSBjaGFpbmluZyBmZXRjaGVzLCBidXQgd2hlbiBmb3JjaW5nIGEgcmVsb2FkIGFmdGVyIHF1ZXJ5IGNoYW5nZXMgY2FzZXMsIGl0IGNhbid0IGJlIGFsbG93ZWQgYmVjYXVzZSBpdCBicmVha3MgdGhlIHdob2xlIGJ1c2luZXNzIGxvZ2ljLlxuICAqL1xuICBzdHJlYW1pbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBTdG9yZSB0aGUgbWVzc2FnZXMgaGlzdG9yeSBvZiB0aGUgY3VycmVudCBjaGF0LiAqL1xuICBjaGF0SGlzdG9yeTogQ2hhdE1lc3NhZ2VbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIExpc3Qgb2YgbW9kZWxzIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyLiAqL1xuICBtb2RlbHM6IEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBMaXN0IG9mIGZ1bmN0aW9ucyBhdmFpbGFibGUgb24gdGhlIHNlcnZlci4gKi9cbiAgZnVuY3Rpb25zOiBHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZDtcbiAgLyoqIExpc3Qgb2Ygc2F2ZWQgY2hhdHMuICovXG4gIHNhdmVkQ2hhdHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYXZlZENoYXRbXT4oW10pO1xuICAvKiogV2hldGhlciB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHNhdmVkIGNoYXRzLiAqL1xuICBzYXZlZENoYXRzRXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBFbWl0IHRoZSBzYXZlZCBjaGF0IHRvIGxvYWQuICovXG4gIGxvYWRTYXZlZENoYXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYXZlZENoYXQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8qKiBFbWl0IHRoZSBxdW90YSBlYWNoIHRpbWUgdGhlIGNoYXQgaXMgaW52b2tlZC4gKi9cbiAgcXVvdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdW90YSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIEVtaXQgdGhlIGNhbGN1bGF0ZWQgdXNlcidzIHRva2VuIGNvbnN1bXB0aW9uIGJhc2VkIG9uIHRoZSBxdW90YS4gKi9cbiAgdXNlclRva2VuQ29uc3VtcHRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyVG9rZW5Db25zdW1wdGlvbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIEVtaXQgdGhlIGNoYXQgdXNhZ2UgbWV0cmljcyBlYWNoIHRpbWUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGFzc2lzdGFudCByZXNwb25zZSBpcyBjb21wbGV0ZWQuICovXG4gIGNoYXRVc2FnZU1ldHJpY3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGF0VXNhZ2VNZXRyaWNzIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0aGUgY2FsY3VsYXRlZCBjaGF0J3MgdG9rZW4gY29uc3VtcHRpb24gYmFzZWQgb24gdGhlIGNoYXQgdXNhZ2UgbWV0cmljcy4gKi9cbiAgY2hhdFRva2VuQ29uc3VtcHRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUb2tlbkNvbnN1bXB0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0cnVlIGlmIFwiQ2FuY2VsVGFza3NcIiBpcyBvbmdvaW5nLiAqL1xuICBzdG9wcGluZ0dlbmVyYXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBJbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlIGRlZmluaW5nIHRoZSBhc3Npc3RhbnQgaW5zdGFuY2UuICovXG4gIHByaXZhdGUgX2NoYXRJbnN0YW5jZUlkOiBzdHJpbmc7XG4gIC8qKiBHZW5lcmF0ZWQgR1VJRCBmb3IgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uIHVzZWQgdG8gc2F2ZS9nZXQvZGVsZXRlIGl0IGFuZCBpZGVudGlmeSBhdWRpdCBldmVudHMuICovXG4gIHByaXZhdGUgX2NoYXRJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyB1c2VyU2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXR0aW5nc1dlYlNlcnZpY2UpO1xuICBwdWJsaWMgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICBwdWJsaWMgYXBwU2VydmljZSA9IGluamVjdChBcHBTZXJ2aWNlKTtcbiAgcHVibGljIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsU2VydmljZSk7XG4gIHB1YmxpYyBhc3Npc3RhbnRVdGlscyA9IGluamVjdChBc3Npc3RhbnRVdGlscyk7XG4gIHByaXZhdGUgc2F2ZWRDaGF0c1NlcnZpY2UgPSBpbmplY3QoU2F2ZWRDaGF0c1NlcnZpY2UpO1xuICBwcml2YXRlIHNpZ25hbFJDb25uZWN0aW9uU2VydmljZSA9IGluamVjdChTaWduYWxSQ29ubmVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlID0gaW5qZWN0KEFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2UgPSBpbmplY3QoQXNzaXN0YW50TWV0YWRhdGFTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhc3Npc3RhbnRUb2tlbnNUcmFja2luZ1NlcnZpY2UgPSBpbmplY3QoQXNzaXN0YW50VG9rZW5zVHJhY2tpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkZWJ1Z01lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KERlYnVnTWVzc2FnZVNlcnZpY2UpO1xuICAvLyBJbmplY3QgdGhlIEFzc2lzdGFudFdzRnJhbWVzU2VydmljZSB1c2luZyAnbmV3JyB0byBlbnN1cmUgYSBzZXBhcmF0ZSBsb2NhbCBpbnN0YW5jZSBmb3IgZWFjaCBDaGF0U2VydmljZSBpbnN0YW5jZVxuICBwcml2YXRlIGFzc2lzdGFudFdzRnJhbWVzU2VydmljZSA9IG5ldyhBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNsb2NvID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBhc3Npc3RhbnQgcHJvY2Vzcy5cbiAgICogSXQgaW5jbHVkZXMgYnVpbGRpbmcgYW5kIHN0YXJ0aW5nIGEgY29ubmVjdGlvbiwgZXhlY3V0aW5nIHBhcmFsbGVsIHJlcXVlc3RzIGZvciBtb2RlbHMgYW5kIGZ1bmN0aW9ucywgYW5kIGhhbmRsaW5nIGVycm9ycyBkdXJpbmcgdGhlIHByb2Nlc3MuXG4gICAqIOKaoO+4jyBUaGlzIG1ldGhvZCBNVVNUIGJlIGNhbGxlZCBPTkxZIGlmIHRoZSB1c2VyIGlzIGxvZ2dlZEluIGFuZCBvbmNlIHdoZW4gdGhlIGFzc2lzdGFudCBpcyBpbml0aWFsaXplZC5cbiAgICpcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZTxib29sZWFuPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAvLyBFbnN1cmUgYWxsIGxvZ2ljIGlzIGV4ZWN1dGVkIHdoZW4gc3Vic2NyaWJlZCB0byB0aGUgb2JzZXJ2YWJsZVxuICAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0QXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UoKTtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMuaW5pdENoYXRDb25maWcoKSk7XG4gICAgfSkucGlwZShcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIGluaXRpYWxpemVkXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5pbml0Q29uZmlnJC5waXBlKGZpbHRlcihCb29sZWFuKSwgdGFrZSgxKSkpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRXU1JlcXVlc3RzVXJsKCk7XG4gICAgICAgIHRoaXMuZ2V0UkVTVFJlcXVlc3RzVXJsKCk7XG4gICAgICAgIHRoaXMuX2luaXRBc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5faW5pdEFzc2lzdGFudFRva2Vuc1RyYWNraW5nU2VydmljZSgpO1xuICAgICAgICB0aGlzLl9pbml0U2F2ZWRDaGF0c1NlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5faW5pdERlYnVnTWVzc2FnZVNlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5faW5pdFNpZ25hbFJDb25uZWN0aW9uU2VydmljZSgpO1xuICAgICAgfSksXG4gICAgICAvLyBCdWlsZCBhbmQgc3RhcnQgdGhlIFNpZ25hbFIgY29ubmVjdGlvblxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYnVpbGRDb25uZWN0aW9uKCkpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UgaGVyZSwgbm93IHRoYXQgJ3RoaXMuY29ubmVjdGlvbicgaXMgc2V0XG4gICAgICAgIHRoaXMuX2luaXRBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5pbml0TWVzc2FnZUhhbmRsZXJzKCk7XG4gICAgICB9KSxcbiAgICAgIC8vIFN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zdGFydENvbm5lY3Rpb24oKSksXG4gICAgICAvLyBGZXRjaCBtZXRhZGF0YSBpbiBwYXJhbGxlbFxuICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgIGZvcmtKb2luKFtcbiAgICAgICAgICB0aGlzLmxpc3RNb2RlbHMoKSxcbiAgICAgICAgICB0aGlzLmxpc3RGdW5jdGlvbnMoKVxuICAgICAgICBdKVxuICAgICAgKSxcbiAgICAgIC8vIE1hcCB0aGUgcmVzdWx0cyBvZiBwYXJhbGxlbCByZXF1ZXN0cyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzXG4gICAgICBtYXAoKFttb2RlbHMsIGZ1bmN0aW9uc10pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKG1vZGVscyAhPT0gdW5kZWZpbmVkICYmIGZ1bmN0aW9ucyAhPT0gdW5kZWZpbmVkICYmICEhbW9kZWxzICYmICEhZnVuY3Rpb25zKTtcbiAgICAgICAgdGhpcy5tb2RlbHMgPSBtb2RlbHM7XG4gICAgICAgIHRoaXMuaW5pdFByb2Nlc3MkLm5leHQocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLFxuICAgICAgLy8gQW55IGVycm9ycyBkdXJpbmcgdGhlIHByb2Nlc3MgYXJlIGNhdWdodCwgbG9nZ2VkLCBhbmQgcmUtdGhyb3duIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgZnVydGhlclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQ6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KSxcbiAgICAgIHRha2UoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgZW5kcG9pbnQgdG8gdXNlIGZvciB0aGUgd2Vic29ja2V0IHJlcXVlc3RzXG4gICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHAgY29uZmlnXG4gICAqL1xuICBnZXRXU1JlcXVlc3RzVXJsKCkge1xuICAgIHRoaXMuYXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0V1NSZXF1ZXN0c1VybCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgZW5kcG9pbnQgdG8gdXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0c1xuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwIGNvbmZpZ1xuICAgKi9cbiAgZ2V0UkVTVFJlcXVlc3RzVXJsKCkge1xuICAgIHRoaXMuYXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0UkVTVFJlcXVlc3RzVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIFNhdmVkQ2hhdHNTZXJ2aWNlIHdpdGggdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRoZSBgU2F2ZWRDaGF0c1NlcnZpY2VgIGJ5IHByb3ZpZGluZyBpdCB3aXRoIGEgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICogKGBTYXZlZENoYXRzT3BlcmF0aW9uQ29uZmlnYCkgdGhhdCBpbmNsdWRlcyB2YXJpb3VzIGNhbGxiYWNrcyBhbmQgcHJvcGVydGllcyByZXF1aXJlZFxuICAgKiBmb3IgaXRzIG9wZXJhdGlvbi4gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgb25seSBwcm9jZWVkIGlmIGJvdGggYGFzc2lzdGFudENvbmZpZyRgIGFuZFxuICAgKiBgUkVTVF9SRVFVRVNUX1VSTGAgYXJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGluY2x1ZGVzOlxuICAgKiAtIEFwcGxpY2F0aW9uIG5hbWUgcmV0cmlldmFsLlxuICAgKiAtIEluc3RhbmNlIElEIHJldHJpZXZhbC5cbiAgICogLSBSRVNUIEFQSSBVUkwgcmV0cmlldmFsLlxuICAgKiAtIERlYnVnIGZsYWcgcmV0cmlldmFsLlxuICAgKiAtIENoYXQgSUQgZm9yIG5ldyBzYXZlcy5cbiAgICogLSBTYXZlZCBjaGF0cyBlbmFibGVtZW50IGNoZWNrLlxuICAgKiAtIE1ldGhvZHMgZm9yIHNldHRpbmcgYSBzYXZlZCBjaGF0IElELCB1cGRhdGluZyB0aGUgc2F2ZWQgY2hhdHMgbGlzdCwgYW5kIGdlbmVyYXRpbmcgYXVkaXQgZXZlbnRzLlxuICAgKlxuICAgKiBJZiB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGFyZSBub3QgcmVhZHksIGFuIGVycm9yIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2luaXRTYXZlZENoYXRzU2VydmljZSgpIHtcbiAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlICYmIHRoaXMuUkVTVF9SRVFVRVNUX1VSTCkge1xuICAgICAgY29uc3Qgc2F2ZWRDaGF0c09wQ29uZmlnOiBTYXZlZENoYXRzT3BlcmF0aW9uQ29uZmlnID0ge1xuICAgICAgICBnZXRBcHBOYW1lOiAoKSA9PiB0aGlzLmFwcFNlcnZpY2UuYXBwTmFtZSxcbiAgICAgICAgZ2V0SW5zdGFuY2VJZDogKCkgPT4gdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgICAgZ2V0UmVzdFVybDogKCkgPT4gdGhpcy5SRVNUX1JFUVVFU1RfVVJMLFxuICAgICAgICBnZXREZWJ1Z0ZsYWc6ICgpID0+IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1ZyxcbiAgICAgICAgaXNTYXZlZENoYXRzRW5hYmxlZDogKCkgPT4gISF0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWU/LnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQsXG4gICAgICAgIHNldFNhdmVkQ2hhdHNFcnJvclN0YXR1czogKGhhc0Vycm9yKSA9PiB0aGlzLnNhdmVkQ2hhdHNFcnJvciQubmV4dChoYXNFcnJvciksXG4gICAgICAgIHVwZGF0ZVNhdmVkQ2hhdHNMaXN0OiAoY2hhdHMpID0+IHRoaXMuc2F2ZWRDaGF0cyQubmV4dChjaGF0cyksXG4gICAgICAgIGdlbmVyYXRlQXVkaXRFdmVudDogKHR5cGUsIGRldGFpbHMsIGlkKSA9PiB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudCh0eXBlLCBkZXRhaWxzLCBpZCksXG4gICAgICB9O1xuICAgICAgdGhpcy5zYXZlZENoYXRzU2VydmljZS5pbml0KHNhdmVkQ2hhdHNPcENvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgY2FzZSBzaG91bGQgaWRlYWxseSBub3QgaGFwcGVuIGlmIGluaXQgb3JkZXIgaXMgY29ycmVjdFxuICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIFNhdmVkQ2hhdHNTZXJ2aWNlOiBhc3Npc3RhbnRDb25maWcgb3IgUkVTVF9SRVFVRVNUX1VSTCBub3QgcmVhZHkuXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgU2lnbmFsUiBjb25uZWN0aW9uIHNlcnZpY2Ugd2l0aCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgU2lnbmFsUiBjb25uZWN0aW9uIHNlcnZpY2UgaXMgcHJvcGVybHkgc2V0IHVwXG4gICAqIGJ5IHByb3ZpZGluZyBpdCB3aXRoIHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIHZhbHVlcywgc3VjaCBhcyB0aGUgV2ViU29ja2V0XG4gICAqIHJlcXVlc3QgVVJMIGFuZCBhc3Npc3RhbnQgY29uZmlndXJhdGlvbi4gSXQgYWxzbyBtYW5hZ2VzIHRoZSBTaWduYWxSIGh1YiBjb25uZWN0aW9uXG4gICAqIGluc3RhbmNlLlxuICAgKlxuICAgKiBQcmVjb25kaXRpb25zOlxuICAgKiAtIGBhc3Npc3RhbnRDb25maWckLnZhbHVlYCBtdXN0IGJlIGF2YWlsYWJsZS5cbiAgICogLSBgV1NfUkVRVUVTVF9VUkxgIG11c3QgYmUgZGVmaW5lZC5cbiAgICpcbiAgICogSWYgdGhlc2UgcHJlY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNpZ25hbFJDb25uZWN0aW9uU2VydmljZSgpIHtcbiAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlICYmIHRoaXMuV1NfUkVRVUVTVF9VUkwpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsUk9wQ29uZmlnOiBTaWduYWxSQ29ubmVjdGlvbk9wZXJhdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICAgIGdldFdzUmVxdWVzdFVybDogKCkgPT4gdGhpcy5XU19SRVFVRVNUX1VSTCxcbiAgICAgICAgICAgIGdldEFzc2lzdGFudENvbmZpZ1ZhbHVlOiAoKSA9PiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUsXG4gICAgICAgICAgICBnZXRIdWJDb25uZWN0aW9uOiAoKSA9PiB0aGlzLmNvbm5lY3Rpb24sIC8vIFVzaW5nIGdldEh1YkNvbm5lY3Rpb24gYXMgcGVyIHVzZXIncyBmaWxlXG4gICAgICAgICAgICBzZXRIdWJDb25uZWN0aW9uOiAoY29ubikgPT4geyB0aGlzLmNvbm5lY3Rpb24gPSBjb25uOyB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2lnbmFsUkNvbm5lY3Rpb25TZXJ2aWNlLmluaXQoc2lnbmFsUk9wQ29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBjYXNlIHNob3VsZCBpZGVhbGx5IG5vdCBoYXBwZW4gaWYgaW5pdCBvcmRlciBpcyBjb3JyZWN0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSBTaWduYWxSQ29ubmVjdGlvblNlcnZpY2U6IGFzc2lzdGFudENvbmZpZyBvciBXU19SRVFVRVNUX1VSTCBub3QgcmVhZHkuXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgQXNzaXN0YW50IENvbmZpZ3VyYXRpb24gU2VydmljZSB3aXRoIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCBieSBwcm92aWRpbmcgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9uc1xuICAgKiBhbmQgc3RhdGUgbWFuYWdlbWVudCBtZWNoYW5pc21zIHJlcXVpcmVkIGZvciB0aGUgYXNzaXN0YW50J3MgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBUaGUgb3BlcmF0aW9uIGNvbnRleHQgaW5jbHVkZXM6XG4gICAqIC0gTWV0aG9kcyB0byByZXRyaWV2ZSBjaGF0IGluc3RhbmNlIGFuZCBjaGF0IElEcy5cbiAgICogLSBNZXRob2RzIHRvIGdldCBhbmQgc2V0IGFzc2lzdGFudCBjb25maWd1cmF0aW9uIHZhbHVlcy5cbiAgICogLSBNZXRob2RzIHRvIHNldCBXZWJTb2NrZXQgYW5kIFJFU1QgcmVxdWVzdCBVUkxzLlxuICAgKiAtIE1ldGhvZHMgdG8gdXBkYXRlIHRoZSBpbml0aWFsaXphdGlvbiBjb25maWd1cmF0aW9uIHN0YXR1cy5cbiAgICogLSBBIG1ldGhvZCB0byBnZW5lcmF0ZSBhdWRpdCBldmVudHMgZm9yIHRyYWNraW5nIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pbml0QXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UoKSB7XG4gICAgY29uc3QgY29uZmlnT3BDb250ZXh0OiBBc3Npc3RhbnRDb25maWd1cmF0aW9uT3BlcmF0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgZ2V0Q2hhdEluc3RhbmNlSWQ6ICgpID0+IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICAgIGdldENoYXRJZDogKCkgPT4gdGhpcy5jaGF0SWQsXG4gICAgICAgIGdldEFzc2lzdGFudENvbmZpZ1ZhbHVlOiAoKSA9PiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUsXG4gICAgICAgIHNldFdTUmVxdWVzdHNVcmw6ICh1cmwpID0+IHRoaXMuV1NfUkVRVUVTVF9VUkwgPSB1cmwsXG4gICAgICAgIHNldFJFU1RSZXF1ZXN0c1VybDogKHVybCkgPT4gdGhpcy5SRVNUX1JFUVVFU1RfVVJMID0gdXJsLFxuICAgICAgICBzZXRBc3Npc3RhbnRDb25maWc6IChjb25maWcpID0+IHRoaXMuYXNzaXN0YW50Q29uZmlnJC5uZXh0KGNvbmZpZyksXG4gICAgICAgIHNldEluaXRDb25maWdTdGF0dXM6IChzdGF0dXMpID0+IHRoaXMuaW5pdENvbmZpZyQubmV4dChzdGF0dXMpLFxuICAgICAgICBnZW5lcmF0ZUF1ZGl0RXZlbnQ6ICh0eXBlLCBkZXRhaWxzLCBpZCkgPT4gdGhpcy5nZW5lcmF0ZUF1ZGl0RXZlbnQodHlwZSwgZGV0YWlscywgaWQpXG4gICAgfTtcbiAgICB0aGlzLmFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmluaXQoY29uZmlnT3BDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgQXNzaXN0YW50TWV0YWRhdGFTZXJ2aWNlIHdpdGggdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb24gY29udGV4dC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBgYXNzaXN0YW50Q29uZmlnJGAgdmFsdWUgYW5kIGBSRVNUX1JFUVVFU1RfVVJMYCBhcmUgYXZhaWxhYmxlLlxuICAgKiBJZiBib3RoIGFyZSByZWFkeSwgaXQgY3JlYXRlcyBhbiBgQXNzaXN0YW50TWV0YWRhdGFPcGVyYXRpb25Db250ZXh0YCBvYmplY3QgYW5kXG4gICAqIGluaXRpYWxpemVzIHRoZSBgYXNzaXN0YW50TWV0YWRhdGFTZXJ2aWNlYCB3aXRoIGl0LiBUaGUgb3BlcmF0aW9uIGNvbnRleHQgcHJvdmlkZXNcbiAgICogbWV0aG9kcyB0byByZXRyaWV2ZSB0aGUgUkVTVCBVUkwsIGFzc2lzdGFudCBjb25maWd1cmF0aW9uLCBhbmQgdG8gc2V0IG1vZGVscyBhbmQgZnVuY3Rpb25zLlxuICAgKlxuICAgKiBJZiB0aGUgcmVxdWlyZWQgdmFsdWVzIGFyZSBub3QgcmVhZHksIGFuIGVycm9yIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2luaXRBc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2UoKSB7XG4gICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSAmJiB0aGlzLlJFU1RfUkVRVUVTVF9VUkwpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhT3BDb250ZXh0OiBBc3Npc3RhbnRNZXRhZGF0YU9wZXJhdGlvbkNvbnRleHQgPSB7XG4gICAgICAgIGdldFJlc3RVcmw6ICgpID0+IHRoaXMuUkVTVF9SRVFVRVNUX1VSTCxcbiAgICAgICAgZ2V0QXNzaXN0YW50Q29uZmlnVmFsdWU6ICgpID0+IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSxcbiAgICAgICAgc2V0TW9kZWxzOiAobW9kZWxzKSA9PiB7IHRoaXMubW9kZWxzID0gbW9kZWxzOyB9LFxuICAgICAgICBzZXRGdW5jdGlvbnM6IChmdW5jdGlvbnMpID0+IHsgdGhpcy5mdW5jdGlvbnMgPSBmdW5jdGlvbnM7IH1cbiAgICAgIH07XG4gICAgICB0aGlzLmFzc2lzdGFudE1ldGFkYXRhU2VydmljZS5pbml0KG1ldGFkYXRhT3BDb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIEFzc2lzdGFudE1ldGFkYXRhU2VydmljZTogYXNzaXN0YW50Q29uZmlnIG9yIFJFU1RfUkVRVUVTVF9VUkwgbm90IHJlYWR5LlwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIEFzc2lzdGFudCBUb2tlbnMgVHJhY2tpbmcgU2VydmljZSB3aXRoIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIHNlcnZpY2UgYnkgcHJvdmlkaW5nIGl0IHdpdGggZnVuY3Rpb25zIHRvIG1hbmFnZSBxdW90YXMsXG4gICAqIHRva2VuIGNvbnN1bXB0aW9uLCB1c2FnZSBtZXRyaWNzLCBhbmQgYXVkaXQgZXZlbnRzLCBhcyB3ZWxsIGFzIGFjY2VzcyB0byBhc3Npc3RhbnQgY29uZmlndXJhdGlvblxuICAgKiBhbmQgbW9kZWwgcmV0cmlldmFsLlxuICAgKlxuICAgKiBUaGUgaW5pdGlhbGl6YXRpb24gd2lsbCBvbmx5IHByb2NlZWQgaWYgdGhlIGFzc2lzdGFudCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICogSWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHJlYWR5LCBhbiBlcnJvciBtZXNzYWdlIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2luaXRBc3Npc3RhbnRUb2tlbnNUcmFja2luZ1NlcnZpY2UoKSB7XG4gICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSkge1xuICAgICAgY29uc3QgdG9rZW5zT3BDb250ZXh0OiBBc3Npc3RhbnRUb2tlbnNUcmFja2luZ09wZXJhdGlvbkNvbnRleHQgPSB7XG4gICAgICAgIGdldEFzc2lzdGFudENvbmZpZ1ZhbHVlOiAoKSA9PiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUsXG4gICAgICAgIHNldFF1b3RhOiAocXVvdGEpID0+IHRoaXMucXVvdGEkLm5leHQocXVvdGEpLFxuICAgICAgICBzZXRVc2VyVG9rZW5Db25zdW1wdGlvbjogKGNvbnN1bXB0aW9uKSA9PiB0aGlzLnVzZXJUb2tlbkNvbnN1bXB0aW9uJC5uZXh0KGNvbnN1bXB0aW9uKSxcbiAgICAgICAgc2V0Q2hhdFVzYWdlTWV0cmljczogKG1ldHJpY3MpID0+IHRoaXMuY2hhdFVzYWdlTWV0cmljcyQubmV4dChtZXRyaWNzKSxcbiAgICAgICAgc2V0Q2hhdFRva2VuQ29uc3VtcHRpb246IChjb25zdW1wdGlvbikgPT4gdGhpcy5jaGF0VG9rZW5Db25zdW1wdGlvbiQubmV4dChjb25zdW1wdGlvbiksXG4gICAgICAgIGdlbmVyYXRlQXVkaXRFdmVudDogKHR5cGUsIGRldGFpbHMsIGlkKSA9PiB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudCh0eXBlLCBkZXRhaWxzLCBpZCksXG4gICAgICAgIGdldE1vZGVsOiAoc2VydmljZUlkLCBtb2RlbElkKSA9PiB0aGlzLmdldE1vZGVsKHNlcnZpY2VJZCwgbW9kZWxJZClcbiAgICAgIH07XG4gICAgICB0aGlzLmFzc2lzdGFudFRva2Vuc1RyYWNraW5nU2VydmljZS5pbml0KHRva2Vuc09wQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSBBc3Npc3RhbnRUb2tlbnNUcmFja2luZ1NlcnZpY2U6IGFzc2lzdGFudENvbmZpZyBub3QgcmVhZHkuXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgQXNzaXN0YW50IFdlYlNvY2tldCBGcmFtZXMgU2VydmljZSB3aXRoIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhbmQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlcnZpY2UgdG8gZnVuY3Rpb24gcHJvcGVybHkuXG4gICAqIEl0IGVuc3VyZXMgdGhhdCB0aGUgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb24gYW5kIGNvbm5lY3Rpb24gYXJlIGF2YWlsYWJsZSBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBUaGUgb3BlcmF0aW9uIGNvbnRleHQgcHJvdmlkZXMgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBhbmQgc3RhdGUgbWFuYWdlbWVudCBtZXRob2RzLCBpbmNsdWRpbmc6XG4gICAqIC0gQWNjZXNzaW5nIHRoZSBhc3Npc3RhbnQgY29uZmlndXJhdGlvbiwgY2hhdCBpbnN0YW5jZSBJRCwgc2F2ZWQgY2hhdCBJRCwgYW5kIGNoYXQgaGlzdG9yeS5cbiAgICogLSBNYW5hZ2luZyBzdHJlYW1pbmcgYW5kIHN0b3BwaW5nIGdlbmVyYXRpb24gc3RhdHVzZXMuXG4gICAqIC0gVXBkYXRpbmcgcXVvdGEgYW5kIGNoYXQgdXNhZ2UgbWV0cmljcy5cbiAgICogLSBHZW5lcmF0aW5nIGF1ZGl0IGV2ZW50cy5cbiAgICogLSBNYW5hZ2luZyBzYXZlZCBjaGF0cyAoYWRkaW5nLCB1cGRhdGluZywgYW5kIGxpc3RpbmcpLlxuICAgKlxuICAgKiBJZiB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIChgYXNzaXN0YW50Q29uZmlnJGAgYW5kIGBjb25uZWN0aW9uYCkgYXJlIG5vdCByZWFkeSwgYW4gZXJyb3IgaXMgbG9nZ2VkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdEFzc2lzdGFudFdzRnJhbWVzU2VydmljZSgpIHtcbiAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlICYmIHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgY29uc3Qgd3NGcmFtZXNPcENvbnRleHQ6IEFzc2lzdGFudFdzRnJhbWVzQ29udGV4dCA9IHtcbiAgICAgICAgZ2V0QXNzaXN0YW50Q29uZmlnOiAoKSA9PiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUsXG4gICAgICAgIGdldENoYXRJbnN0YW5jZUlkOiAoKSA9PiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgICBnZXRDaGF0SWQ6ICgpID0+IHRoaXMuY2hhdElkLFxuICAgICAgICBnZXRIdWJDb25uZWN0aW9uOiAoKSA9PiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgIGdldENoYXRIaXN0b3J5OiAoKSA9PiB0aGlzLmNoYXRIaXN0b3J5LFxuICAgICAgICBzZXRTdHJlYW1pbmdTdGF0dXM6IChpc1N0cmVhbWluZykgPT4gdGhpcy5zdHJlYW1pbmckLm5leHQoaXNTdHJlYW1pbmcpLFxuICAgICAgICBzZXRDaGF0SGlzdG9yeTogKGhpc3RvcnkpID0+IHsgdGhpcy5jaGF0SGlzdG9yeSA9IGhpc3Rvcnk7IH0sXG4gICAgICAgIHNldFN0b3BwaW5nR2VuZXJhdGlvblN0YXR1czogKGlzU3RvcHBpbmcpID0+IHRoaXMuc3RvcHBpbmdHZW5lcmF0aW9uJC5uZXh0KGlzU3RvcHBpbmcpLFxuICAgICAgICBzZXRTYXZlZENoYXRzRXJyb3JTdGF0dXM6IChoYXNFcnJvcikgPT4gdGhpcy5zYXZlZENoYXRzRXJyb3IkLm5leHQoaGFzRXJyb3IpLFxuICAgICAgICB1cGRhdGVRdW90YTogKHF1b3RhLCBwcm9wYWdhdGVFcnJvcikgPT4gdGhpcy51cGRhdGVRdW90YShxdW90YSwgcHJvcGFnYXRlRXJyb3IpLFxuICAgICAgICB1cGRhdGVDaGF0VXNhZ2VNZXRyaWNzOiAobWV0cmljcykgPT4gdGhpcy51cGRhdGVDaGF0VXNhZ2VNZXRyaWNzKG1ldHJpY3MpLFxuICAgICAgICBnZW5lcmF0ZUF1ZGl0RXZlbnQ6ICh0eXBlLCBkZXRhaWxzLCBpZCkgPT4gdGhpcy5nZW5lcmF0ZUF1ZGl0RXZlbnQodHlwZSwgZGV0YWlscywgaWQpLFxuICAgICAgICBhZGRTYXZlZENoYXQ6IChpZCwgbWVzc2FnZXMpID0+IHRoaXMuYWRkU2F2ZWRDaGF0KGlkLCBtZXNzYWdlcyksXG4gICAgICAgIHVwZGF0ZVNhdmVkQ2hhdDogKGlkLCBuYW1lLCBtZXNzYWdlcykgPT4gdGhpcy51cGRhdGVTYXZlZENoYXQoaWQsIG5hbWUsIG1lc3NhZ2VzKSxcbiAgICAgICAgbGlzdFNhdmVkQ2hhdDogKCkgPT4gdGhpcy5saXN0U2F2ZWRDaGF0KCksXG4gICAgICAgIGlzRXhpc3RpbmdTYXZlZENoYXQ6IChpZCkgPT4gdGhpcy5pc0V4aXN0aW5nU2F2ZWRDaGF0KGlkKVxuICAgICAgfTtcbiAgICAgIHRoaXMuYXNzaXN0YW50V3NGcmFtZXNTZXJ2aWNlLmluaXQod3NGcmFtZXNPcENvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSBBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2U6IGNvcmUgZGVwZW5kZW5jaWVzIG5vdCByZWFkeS5cIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdERlYnVnTWVzc2FnZVNlcnZpY2UoKSB7XG4gICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSAmJiB0aGlzLlJFU1RfUkVRVUVTVF9VUkwpIHtcbiAgICAgIGNvbnN0IGRlYnVnTWVzc2FnZU9wQ29udGV4dDogRGVidWdNZXNzYWdlT3BlcmF0aW9uQ29uZmlnID0ge1xuICAgICAgICBnZXRSZXN0VXJsOiAoKSA9PiB0aGlzLlJFU1RfUkVRVUVTVF9VUkxcbiAgICAgIH07XG4gICAgICB0aGlzLmRlYnVnTWVzc2FnZVNlcnZpY2UuaW5pdChkZWJ1Z01lc3NhZ2VPcENvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgRGVidWdNZXNzYWdlU2VydmljZTogYXNzaXN0YW50Q29uZmlnIG9yIFJFU1RfUkVRVUVTVF9VUkwgbm90IHJlYWR5LlwiKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYXNzaXN0YW50cygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFzc2lzdGFudHNTZXR0aW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAqL1xuICBnZXQgY2hhdEluc3RhbmNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhdEluc3RhbmNlSWQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdCB0aGUgaW5zdGFuY2UgSUQgb2YgdGhlIGNoYXQgc2VydmljZVxuICAgKiBAcGFyYW0gaW5zdGFuY2VJZCBUaGUgaW5zdGFuY2UgSUQgb2YgdGhlIGNoYXQgc2VydmljZVxuICAgKi9cbiAgc2V0Q2hhdEluc3RhbmNlSWQoaW5zdGFuY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2hhdEluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uIHdoaWNoIGlzIHVzZWQgdG8gc2F2ZS9nZXQvZGVsZXRlIHRoZSBkaXNjdXNzaW9uIGFuZCBpZGVudGlmeSBhdWRpdCBldmVudHNcbiAgICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvblxuICAgKi9cbiAgZ2V0IGNoYXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGF0SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gR1VJRCBmb3IgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uIHdoaWNoIGlzIHVzZWQgdG8gc2F2ZS9nZXQvZGVsZXRlIGl0IGFuZCBpZGVudGlmeSBhdWRpdCBldmVudHNcbiAgICogQHBhcmFtIGNoYXRJZCBpZiBwcm92aWRlZCwgaXQgd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBJRCBvZiB0aGUgY3VycmVudCBjaGF0IGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBhdWRpdCBldmVudHNcbiAgICovXG4gIGdlbmVyYXRlQ2hhdElkKGNoYXRJZD86IHN0cmluZykge1xuICAgIHRoaXMuX2NoYXRJZCA9IGNoYXRJZCB8fCBndWlkKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgY2hhdCBjb25maWcgYnkgbWFuYWdpbmcgT05MWSBzdWItb2JqZWN0ICoqZGVmYXVsdFZhbHVlcyoqIGNvbmZpZ3Mgb2YgdGhlIHN0YW5kYXJkIGFwcCBjb25maWcgKGRlZmluZWQgaW4gdGhlIGN1c3RvbWl6YXRpb24ganNvbiB0YWIgKSBhbmQgdGhlIHVzZXIgcHJlZmVyZW5jZXMuXG4gICAqIFRvIGRvIHNvLCBhIHRyYWNraW5nIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCB0byBub3RpZnkgdGhlIHVzZXIgYWJvdXQgdGhlIGF2YWlsYWJsZSB1cGRhdGVzIGluIHRoZSBkZWZhdWx0VmFsdWVzIG9iamVjdCBvZiB0aGUgc3RhbmRhcmQgYXBwIGNvbmZpZy5cbiAgICogVGhlIHJlc3Qgb2YgdGhlIGNvbmZpZyBvYmplY3QgY29taW5nIGZyb20gXCJzdGFuZGFyZCBhcHAgY29uZmlnXCIgaXMgdXNlZCBhcyBpdCBpcyB3aXRob3V0IGFueSBvdmVycmlkZS5cbiAgICogVGh1cywgdGhlIHVzZXIgcHJlZmVyZW5jZXMgYXJlIHVzZWQgb25seSBmb3IgdGhlIGRlZmF1bHRWYWx1ZXMgb2JqZWN0LlxuICAgKiBUaGlzIHByb3ZpZGUgYSBjZW50cmFsaXplZCB3YXkgdG8gbWFuYWdlIHRoZSByZXN0IG9mIHRoZSBjb25maWcgb2JqZWN0IGJ5IGFkbWlucyBhbmQgZW5zdXJlIGEgdW5pcXVlIGNvbW1vbiBiZWhhdmlvciBmb3IgYWxsIHVzZXJzLlxuICAgKi9cbiAgYXN5bmMgaW5pdENoYXRDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3Npc3RhbnRDb25maWd1cmF0aW9uU2VydmljZS5pbml0Q2hhdENvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY2hhdCBjb25maWcgYW5kIHN0b3JlIGl0cyBkZWZhdWx0VmFsdWVzIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzXG4gICAqIEBwYXJhbSBjb25maWcgIFRoZSB1cGRhdGVkIGNoYXQgY29uZmlnXG4gICAqIEBwYXJhbSBoYXNoZXMgIFRoZSB1cGRhdGVkIGhhc2hlcyB0byBzdG9yZSBpbiB0aGUgdXNlciBwcmVmZXJlbmNlc1xuICAgKiBAcGFyYW0gbm90aWZ5ICBXaGV0aGVyIHRvIG5vdGlmeSB0aGUgdXNlciBhYm91dCB0aGUgdXBkYXRlXG4gICAqIEBwYXJhbSBzdWNjZXNzQ2FsbGJhY2sgIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIGlmIHRoZSB1cGRhdGUgaXMgc3VjY2Vzc2Z1bFxuICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayAgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgaWYgdGhlIHVwZGF0ZSBmYWlsc1xuICAgKi9cbiAgdXBkYXRlQ2hhdENvbmZpZyhcbiAgICBjb25maWc6IENoYXRDb25maWcsXG4gICAgaGFzaGVzPzogeyBcImFwcGxpZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI/OiBzdHJpbmc7IFwic2tpcHBlZC1kZWZhdWx0VmFsdWVzLWhhc2hcIj86IHN0cmluZyB9LFxuICAgIG5vdGlmeSA9IHRydWUsXG4gICAgc3VjY2Vzc0NhbGxiYWNrPzogKCkgPT4gYW55LFxuICAgIGVycm9yQ2FsbGJhY2s/OiAoKSA9PiBhbnlcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5hc3Npc3RhbnRDb25maWd1cmF0aW9uU2VydmljZS51cGRhdGVDaGF0Q29uZmlnKGNvbmZpZywgaGFzaGVzLCBub3RpZnksIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dnZWQgaW4gdXNlclxuICAgKi9cbiAgb3ZlcnJpZGVVc2VyKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgdXNlck92ZXJyaWRlQWN0aXZlLCB1c2VyT3ZlcnJpZGUgfSA9IGdsb2JhbENvbmZpZztcbiAgICBpZiAoISh1c2VyT3ZlcnJpZGVBY3RpdmUgJiYgdXNlck92ZXJyaWRlKSkge1xuICAgICAgdGhpcy51c2VyT3ZlcnJpZGUkLm5leHQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgdGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgT3ZlcnJpZGVVc2VyIG1ldGhvZFxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgdXNlcjogdXNlck92ZXJyaWRlLnVzZXJuYW1lLFxuICAgICAgZG9tYWluOiB1c2VyT3ZlcnJpZGUuZG9tYWluXG4gICAgfVxuXG4gICAgLy8gSW52b2tlIHRoZSBPdmVycmlkZVVzZXIgbWV0aG9kIGFuZCBoYW5kbGUgZXJyb3JzXG4gICAgdGhpcy5jb25uZWN0aW9uIS5pbnZva2UoJ092ZXJyaWRlVXNlcicsIGRhdGEpXG4gICAgICAudGhlbigocmVzKSA9PiB0aGlzLnVzZXJPdmVycmlkZSQubmV4dCghIXJlcykpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBPdmVycmlkZVVzZXI6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2hlbiBubyBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nIGV4aXN0cyBkb3duc3RyZWFtXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyB0aGUgRmV0Y2ggQVBJIHRvIHJldHJpZXZlIGEgbmV3IG1lc3NhZ2UgZ2l2ZW4gYWxsIHByZXZpb3VzIG1lc3NhZ2VzXG4gICAqL1xuICBmZXRjaChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSwgcXVlcnk6IFF1ZXJ5KTogT2JzZXJ2YWJsZTxDaGF0UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5hc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UuZmV0Y2gobWVzc2FnZXMsIHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgbW9kZWxzIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyXG4gICAqL1xuICBsaXN0TW9kZWxzKCk6IE9ic2VydmFibGU8R2xsbU1vZGVsRGVzY3JpcHRpb25bXSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmFzc2lzdGFudE1ldGFkYXRhU2VydmljZS5saXN0TW9kZWxzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBhdmFpbGFibGUgb24gdGhlIHNlcnZlciBBTkQgbWF0Y2hpbmcgZW5hYmxlZCBmdW5jdGlvbnMgaW4gdGhlIGNoYXQgY29uZmlnXG4gICAqL1xuICBsaXN0RnVuY3Rpb25zKCk6IE9ic2VydmFibGU8R2xsbUZ1bmN0aW9uW10gfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2UubGlzdEZ1bmN0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBhc3Npc3RhbnQgYW5zd2VyIGdlbmVyYXRpb24gYW5kIGNhbmNlbHMgYWxsIHRoZSBvbmdvaW5nIGFuZCBwZW5kaW5nIHJlbGF0ZWQgdGFza3NcbiAgICovXG4gIHN0b3BHZW5lcmF0aW9uKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmFzc2lzdGFudFdzRnJhbWVzU2VydmljZS5zdG9wR2VuZXJhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGFuZGxlciBmb3IgcXVvdGEgdXBkYXRlcyBlYWNoIHRpbWUgdGhlIGNoYXQgaXMgaW52b2tlZC5cbiAgICogSXQgZW1pdHMgdGhlIHVwZGF0ZWQgcXVvdGEgdG8gdGhlIHF1b3RhJCBzdWJqZWN0LCBlbWl0cyBhY2NvcmRpbmdseSB0aGUgdXBkYXRlZCB1c2VyJ3MgdG9rZW5zIGNvbnN1bXB0aW9uIGFuZCBub3RpZmllcyB0aGUgdXNlciBpZiB0aGUgbWF4IHF1b3RhIGlzIHJlYWNoZWQuXG4gICAqIEBwYXJhbSBxdW90YSBUaGUgdXBkYXRlZCBxdW90YVxuICAgKiBAcGFyYW0gcHJvcGFnYXRlRXJyb3IgV2hldGhlciB0byBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBjYWxsZXJcbiAgICovXG4gIHVwZGF0ZVF1b3RhKHF1b3RhOiBRdW90YSwgcHJvcGFnYXRlRXJyb3IgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuYXNzaXN0YW50VG9rZW5zVHJhY2tpbmdTZXJ2aWNlLnVwZGF0ZVF1b3RhKHF1b3RhLCBwcm9wYWdhdGVFcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogQSBoYW5kbGVyIGZvciBjaGF0IHVzYWdlIG1ldHJpY3MgZWFjaCB0aW1lIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBhc3Npc3RhbnQgcmVzcG9uc2UgaXMgY29tcGxldGVkLlxuICAgKiBJdCBlbWl0cyB0aGUgY2hhdCB1c2FnZSBtZXRyaWNzIHRvIHRoZSBjaGF0VXNhZ2VNZXRyaWNzJCBzdWJqZWN0LCBlbWl0cyBhY2NvcmRpbmdseSB0aGUgdXBkYXRlZCBjaGF0J3MgdG9rZW5zIGNvbnN1bXB0aW9uXG4gICAqIEBwYXJhbSBjaGF0VXNhZ2VNZXRyaWNzIFRoZSBjaGF0IHVzYWdlIG1ldHJpY3NcbiAgICovXG4gIHVwZGF0ZUNoYXRVc2FnZU1ldHJpY3MoY2hhdFVzYWdlTWV0cmljczogQ2hhdFVzYWdlTWV0cmljcyk6IHZvaWQge1xuICAgIHRoaXMuYXNzaXN0YW50VG9rZW5zVHJhY2tpbmdTZXJ2aWNlLnVwZGF0ZUNoYXRVc2FnZU1ldHJpY3MoY2hhdFVzYWdlTWV0cmljcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb2RlbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGdpdmVuIChzZXJ2aWNlSWQgKyBtb2RlbElkKVxuICAgKiBJZiBhIG1vZGVsIGlzIG5vdCBmb3VuZCwgYW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZFxuICAgKiBAcGFyYW0gc2VydmljZUlkIFRoZSBzZXJ2aWNlSWQgb2YgdGhlIG1vZGVsXG4gICAqIEBwYXJhbSBtb2RlbElkIFRoZSBtb2RlbElkIG9mIHRoZSBtb2RlbFxuICAgKiBAcmV0dXJucyBUaGUgbW9kZWwgZGVzY3JpcHRpb25cbiAgICovXG4gIGdldE1vZGVsKHNlcnZpY2VJZDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcpOiBHbGxtTW9kZWxEZXNjcmlwdGlvbiB8IHVuZGVmaW5lZHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzPy5maW5kKG0gPT4gbS5zZXJ2aWNlSWQgPT09IHNlcnZpY2VJZCAmJiBtLm1vZGVsSWQgPT09IG1vZGVsSWQpO1xuICAgIC8vIEhhbmRsZSBvYnNvbGV0ZSBjb25maWdcbiAgICBpZighbW9kZWwpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoYEZBVEFMIEVSUk9SIDogVGhlIG1vZGVsIChzZXJ2aWNlSWQgPSAnJHtzZXJ2aWNlSWR9JywgbW9kZWxJZCA9ICcke21vZGVsSWR9JykgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gUGxlYXNlIGNvbnRhY3QgYW4gYWRtaW4gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZBVEFMIEVSUk9SIDogVGhlIG1vZGVsIChzZXJ2aWNlSWQgPSAnJHtzZXJ2aWNlSWR9JywgbW9kZWxJZCA9ICcke21vZGVsSWR9JykgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZWApO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGxpc3Qgc2F2ZWQgY2hhdHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgdGhlIGFzc2lzdGFudFxuICAgKi9cbiAgbGlzdFNhdmVkQ2hhdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVkQ2hhdHNTZXJ2aWNlLmxpc3RDaGF0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2F2ZWQgY2hhdCB3aXRoIHRoZSBnaXZlbiBpZCwgaWYgZXhpc3RzLiBPdGhlcndpc2UsIHJldHVybiB1bmRlZmluZWRcbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2F2ZWQgY2hhdFxuICAgKi9cbiAgZ2V0U2F2ZWRDaGF0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdEhpc3RvcnkgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zYXZlZENoYXRzU2VydmljZS5nZXRDaGF0QnlJZChpZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzYXZlZCBjaGF0IHdpdGggdGhlIGdpdmVuIGlkIGFscmVhZHkgZXhpc3RzXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHNhdmVkIGNoYXRcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc2F2ZWQgY2hhdCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaXNFeGlzdGluZ1NhdmVkQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZWRDaGF0c1NlcnZpY2UuaXNFeGlzdGluZ0NoYXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYSBjaGF0IHdpdGggdGhlIGdpdmVuIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gYWRkIHRvIHRoZSBzYXZlZCBjaGF0IGluZGV4XG4gICAqIEByZXR1cm5zIFRoZSBzYXZlZCBjaGF0XG4gICAqL1xuICBhZGRTYXZlZENoYXQoaWQ6IHN0cmluZywgbWVzc2FnZXM6IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZWRDaGF0c1NlcnZpY2UuYWRkQ2hhdChpZCwgbWVzc2FnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHNhdmVkIGNoYXQgd2l0aCB0aGUgZ2l2ZW4gaWQuXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHNhdmVkIGNoYXRcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lIG9mIHRoZSBzYXZlZCBjaGF0LCBpZiBwcm92aWRlZFxuICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2VzIHRvIHVwZGF0ZSB0aGUgc2F2ZWQgY2hhdCBoaXN0b3J5LCBpZiBwcm92aWRlZFxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzYXZlZCBjaGF0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1cGRhdGVkXG4gICAqL1xuICB1cGRhdGVTYXZlZENoYXQoaWQ6IHN0cmluZywgbmFtZT86IHN0cmluZywgbWVzc2FnZXM/OiBDaGF0TWVzc2FnZVtdKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNhdmVkQ2hhdHNTZXJ2aWNlLnVwZGF0ZUNoYXQoaWQsIG5hbWUsIG1lc3NhZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWxrIGRlbGV0ZSBvZiBzYXZlZCBjaGF0cyBtYXRjaGluZyB0aGUgZ2l2ZW4gaWRzXG4gICAqIEBwYXJhbSBpZHMgTGlzdCBvZiBpZHMgb2YgdGhlIHNhdmVkIGNoYXRzIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGRlbGV0ZWQgY2hhdHNcbiAgICovXG4gIGRlbGV0ZVNhdmVkQ2hhdChpZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxEZWxldGVTYXZlZENoYXRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNhdmVkQ2hhdHNTZXJ2aWNlLmRlbGV0ZUNoYXQoaWRzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWJ1Z01lc3NhZ2UobWVzc2FnZTogRGVidWdNZXNzYWdlKTogT2JzZXJ2YWJsZTxLdk9iamVjdCB8IExpc3RPYmplY3QgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kZWJ1Z01lc3NhZ2VTZXJ2aWNlLmdldERlYnVnTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIG91dC1vZi10aGUtYm94IGhhbmRsZXJzXG4gICAqIEl0IGlzIGEgcGxhY2Vob2xkZXIgZm9yIG5vbi1zdHJlYW1pbmcgc2NlbmFyaW9zLCB3aGVyZSB5b3UgaW52b2tlIGEgc3BlY2lmaWMgaHViIG1ldGhvZCwgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgd2l0aCBmcmFtZSBtZXNzYWdlKHMpXG4gICAqL1xuICBpbml0TWVzc2FnZUhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuYXNzaXN0YW50V3NGcmFtZXNTZXJ2aWNlLmluaXRNZXNzYWdlSGFuZGxlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBhbmQgcmVnaXN0ZXIgdGhlIGVudGlyZSBfbWVzc2FnZUhhbmRsZXJzIG1hcCBieSBtZXJnaW5nIHRoZSBwcm92aWRlZCBtYXAgd2l0aCB0aGUgZGVmYXVsdCBvbmVcbiAgICogQHBhcmFtIF9tZXNzYWdlSGFuZGxlcnNcbiAgICovXG4gIG92ZXJyaWRlTWVzc2FnZUhhbmRsZXJzPFQ+KF9tZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPFQ+Pik6IHZvaWQge1xuICAgIHRoaXMuYXNzaXN0YW50V3NGcmFtZXNTZXJ2aWNlLm92ZXJyaWRlTWVzc2FnZUhhbmRsZXJzKF9tZXNzYWdlSGFuZGxlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGV2ZW50LlxuICAgKiBJZiBhIGxpc3RlbmVyIGZvciB0aGlzIHNhbWUgZXZlbnQgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgb3ZlcnJpZGRlbi5cbiAgICogSWYgdGhlIGxpc3RlbmVyIGhhcyBcImlzR2xvYmFsSGFuZGxlclwiIHNldCB0byB0cnVlLCBpdCB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIGh1YiBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gICAqL1xuICBhZGRNZXNzYWdlSGFuZGxlcjxUPihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuYXNzaXN0YW50V3NGcmFtZXNTZXJ2aWNlLmFkZE1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBfbWVzc2FnZUhhbmRsZXJzIG1hcCBhbmQgdW5zdWJzY3JpYmUgZnJvbSByZWNlaXZpbmcgbWVzc2FnZXMgZm9yIHRoaXMgZXZlbnQgZnJvbSB0aGUgU2lnbmFsUiBodWIuXG4gICAqIEBwYXJhbSBldmVudE5hbWUgTmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmb3JcbiAgICovXG4gIHJlbW92ZU1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UucmVtb3ZlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbm5lY3Rpb24gdG8gdGhlIHNpZ25hbFIgd2Vic29ja2V0IGFuZCByZWdpc3RlciBkZWZhdWx0IGxpc3RlbmVycyB0byB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXJ2ZXIgaHViIGNsYXNzXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgY29ubmVjdGlvbi4gSXQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAgICogQHBhcmFtIGxvZ0xldmVsIERlZmluZSB0aGUgbG9nIGxldmVsIGRpc3BsYXllZCBpbiB0aGUgY29uc29sZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBidWlsdFxuICAgKi9cbiAgYnVpbGRDb25uZWN0aW9uKG9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJDb25uZWN0aW9uU2VydmljZS5idWlsZENvbm5lY3Rpb24ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RhcnRlZFxuICAgKi9cbiAgc3RhcnRDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJDb25uZWN0aW9uU2VydmljZS5zdGFydENvbm5lY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHN0b3BwZWRcbiAgICovXG4gIHN0b3BDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJDb25uZWN0aW9uU2VydmljZS5zdG9wQ29ubmVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIGF1ZGl0IGV2ZW50IHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGRldGFpbHMuIFRoZSBnZW5lcmF0ZWQgYXVkaXQgZXZlbnQgaXMgc2VudCBhZnRlcndhcmRzIHZpYSB0aGUgQXVkaXRXZWJTZXJ2aWNlXG4gICAqIEBwYXJhbSB0eXBlIEF1ZGl0IGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIGRldGFpbHMgQXVkaXQgZXZlbnQgZGV0YWlsc1xuICAgKiBAcGFyYW0gaWQgQWN0aW9ucyAoc2F2ZWRDaGF0IGRlbGV0ZS9yZW5hbWUvLi4uKSBtYXkgb2NjdXIgb24gYSBzcGVjaWZpYyBjaGF0IGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IG9uZSBzdG9yZWQgaW4gdGhpcyBzZXJ2aWNlLCBzbyB0aGUgY2hhdCBpZCBjYW4gYmUgcHJvdmlkZWRcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQXVkaXRFdmVudCh0eXBlOiBzdHJpbmcsIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZURldGFpbHMgPSB7XG4gICAgICBcInVybFwiOiBkZWNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYpLFxuICAgICAgXCJhcHBcIjogdGhpcy5hcHBTZXJ2aWNlLmFwcE5hbWUsXG4gICAgICBcInVzZXItaWRcIjogdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbD8udXNlcklkLFxuICAgICAgXCJpbnN0YW5jZS1pZFwiOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgXCJjaGF0LWlkXCI6IGlkIHx8IHRoaXMuY2hhdElkLFxuICAgICAgXCJzZXJ2aWNlLWlkXCI6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLFxuICAgICAgXCJtb2RlbC1pZFwiOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWRcbiAgICB9O1xuXG4gICAgaWYgKHR5cGUgPT09IFwiYXN0LW1lc3NhZ2UubWVzc2FnZVwiKSB7XG4gICAgICBiYXNlRGV0YWlsc1tcImlzLXVzZXItaW5wdXRcIl0gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBhdWRpdCA9IHtcbiAgICAgIHR5cGUsXG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgLi4uYmFzZURldGFpbHMsXG4gICAgICAgIC4uLmRldGFpbHNcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgQXVkaXQubm90aWZ5KGF1ZGl0KTtcbiAgfVxuXG59XG4iXX0=
602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sUUFBUSxFQUNSLElBQUksRUFDSixHQUFHLEVBRUgsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEVBQ0gsVUFBVSxFQUNYLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUNMLEtBQUssRUFFTCxJQUFJLEVBQ0osWUFBWSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBcUIxRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUE2QixNQUFNLG1DQUFtQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSx3QkFBd0IsRUFBb0MsTUFBTSx1Q0FBdUMsQ0FBQztBQUNuSCxPQUFPLEVBQUUsNkJBQTZCLEVBQTBDLE1BQU0sNENBQTRDLENBQUM7QUFDbkksT0FBTyxFQUFFLHdCQUF3QixFQUFxQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ3BILE9BQU8sRUFBRSw4QkFBOEIsRUFBMkMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2SSxP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QUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLFFBQVE7U0FDaEUsQ0FBQztRQUVGLElBQUksSUFBSSxLQUFLLHFCQUFxQixFQUFFLENBQUM7WUFDbkMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2QyxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUc7WUFDWixJQUFJO1lBQ0osTUFBTSxFQUFFO2dCQUNOLEdBQUcsV0FBVztnQkFDZCxHQUFHLE9BQU87YUFDWDtTQUNGLENBQUE7UUFDRCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQzsrR0Fub0JVLFdBQVc7bUhBQVgsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSBcIkBqc3ZlcnNlL3RyYW5zbG9jb1wiO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBkZWZlcixcbiAgZmlsdGVyLFxuICBmb3JrSm9pbixcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbiAgdGhyb3dFcnJvclxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSHViQ29ubmVjdGlvbiB9IGZyb20gXCJAbWljcm9zb2Z0L3NpZ25hbHJcIjtcbmltcG9ydCB7XG4gIEF1ZGl0LFxuICBRdWVyeSxcbiAgZ3VpZCxcbiAgZ2xvYmFsQ29uZmlnXG59IGZyb20gXCJAc2luZXF1YS9hdG9taWNcIjtcblxuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2FwcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IFVzZXJTZXR0aW5nc1dlYlNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy91c2VyLXNldHRpbmdzLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gIENoYXRDb25maWcsXG4gIENoYXRNZXNzYWdlLFxuICBDaGF0UmVzcG9uc2UsXG4gIENoYXRVc2FnZU1ldHJpY3MsXG4gIERlYnVnTWVzc2FnZSxcbiAgRGVsZXRlU2F2ZWRDaGF0UmVzcG9uc2UsXG4gIEdsbG1GdW5jdGlvbixcbiAgR2xsbU1vZGVsRGVzY3JpcHRpb24sXG4gIEt2T2JqZWN0LFxuICBMaXN0T2JqZWN0LFxuICBNZXNzYWdlSGFuZGxlcixcbiAgUXVvdGEsXG4gIFNhdmVkQ2hhdCxcbiAgU2F2ZWRDaGF0SGlzdG9yeSxcbiAgU2F2ZWRDaGF0UmVzcG9uc2UsXG4gIFRva2VuQ29uc3VtcHRpb24sXG4gIFVzZXJUb2tlbkNvbnN1bXB0aW9uXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZpY2VzL3NpZ25hbFIud2ViLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudFV0aWxzIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMuc2VydmljZVwiO1xuaW1wb3J0IHsgU2F2ZWRDaGF0c1NlcnZpY2UsIFNhdmVkQ2hhdHNPcGVyYXRpb25Db25maWcgfSBmcm9tIFwiLi9zYXZlZC1jaGF0cy9zYXZlZC1jaGF0cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTaWduYWxSQ29ubmVjdGlvblNlcnZpY2UsIFNpZ25hbFJDb25uZWN0aW9uT3BlcmF0aW9uQ29uZmlnIH0gZnJvbSBcIi4vc2VydmljZXMvc2lnbmFsUi1jb25uZWN0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlLCBBc3Npc3RhbnRDb25maWd1cmF0aW9uT3BlcmF0aW9uQ29udGV4dCB9IGZyb20gXCIuL3NlcnZpY2VzL2Fzc2lzdGFudC1jb25maWd1cmF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudE1ldGFkYXRhU2VydmljZSwgQXNzaXN0YW50TWV0YWRhdGFPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vc2VydmljZXMvYXNzaXN0YW50LW1ldGFkYXRhLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFzc2lzdGFudFRva2Vuc1RyYWNraW5nU2VydmljZSwgQXNzaXN0YW50VG9rZW5zVHJhY2tpbmdPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vc2VydmljZXMvYXNzaXN0YW50LXRva2Vucy10cmFja2luZy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UsIEFzc2lzdGFudFdzRnJhbWVzQ29udGV4dCB9IGZyb20gXCIuL3NlcnZpY2VzL2Fzc2lzdGFudC13cy1mcmFtZXMuc2VydmljZVwiOyAvLyBBZGRlZFxuaW1wb3J0IHsgRGVidWdNZXNzYWdlT3BlcmF0aW9uQ29uZmlnLCBEZWJ1Z01lc3NhZ2VTZXJ2aWNlIH0gZnJvbSBcIi4vZGVidWctbWVzc2FnZS9kZWJ1Zy1tZXNzYWdlLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENoYXRTZXJ2aWNlIHtcblxuICAvKiogTmFtZSBvZiB0aGUgYXNzaXN0YW50IHdlYnNvY2tldCBlbmRwb2ludC4gKi9cbiAgV1NfUkVRVUVTVF9VUkw6IHN0cmluZztcbiAgLyoqIE5hbWUgb2YgdGhlIGFzc2lzdGFudCBSRVNUIGVuZHBvaW50LiAqL1xuICBSRVNUX1JFUVVFU1RfVVJMOiBzdHJpbmc7XG4gIC8qKiBTaWduYWxSIGNvbm5lY3Rpb24gaW5zdGFuY2UgKi9cbiAgcHVibGljIGNvbm5lY3Rpb246IEh1YkNvbm5lY3Rpb24gfCB1bmRlZmluZWQ7XG4gIC8qKiBFbWl0IHRydWUgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGFzc2lzdGFudCBwcm9jZXNzIGlzIGRvbmUuICovXG4gIGluaXRQcm9jZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogRW1pdCB0cnVlIG9uY2UgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBhc3Npc3RhbnQgY29uZmlnIGlzIGRvbmUuICovXG4gIGluaXRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBFbWl0IHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgYXNzaXN0YW50LiAqL1xuICBhc3Npc3RhbnRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGF0Q29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0cnVlIGlmIHRoZSB1c2VyIGhhcyBiZWVuIG92ZXJyaWRkZW4sIGZhbHNlIG90aGVyd2lzZS4gKi9cbiAgdXNlck92ZXJyaWRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqXG4gICAqIEVtaXQgdHJ1ZSBpZiB0aGUgZmV0Y2ggb2YgYW4gYXNzaXN0YW50J3MgcmVzcG9uc2UgaXMgb25nb2luZyAoaXQgaW5jbHVkZXMgU3RyZWFtaW5nIHN0YXR1cyBvZiB0aGUgYXNzaXN0YW50IGVuZHBvaW50IEFORCBzYXZpbmcgdGhlIGRpc2N1c3Npb24gaWYgc2F2ZSBDaGF0IGlzIGVuYWJsZWQpLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gcHJldmVudCBtdWx0aXBsZSBmZXRjaGVzIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqIFR5cGljYWxseSwgdGhlcmUgaXMgbm8gcHJvYmxlbSBjaGFpbmluZyBmZXRjaGVzLCBidXQgd2hlbiBmb3JjaW5nIGEgcmVsb2FkIGFmdGVyIHF1ZXJ5IGNoYW5nZXMgY2FzZXMsIGl0IGNhbid0IGJlIGFsbG93ZWQgYmVjYXVzZSBpdCBicmVha3MgdGhlIHdob2xlIGJ1c2luZXNzIGxvZ2ljLlxuICAqL1xuICBzdHJlYW1pbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBTdG9yZSB0aGUgbWVzc2FnZXMgaGlzdG9yeSBvZiB0aGUgY3VycmVudCBjaGF0LiAqL1xuICBjaGF0SGlzdG9yeTogQ2hhdE1lc3NhZ2VbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIExpc3Qgb2YgbW9kZWxzIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyLiAqL1xuICBtb2RlbHM6IEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBMaXN0IG9mIGZ1bmN0aW9ucyBhdmFpbGFibGUgb24gdGhlIHNlcnZlci4gKi9cbiAgZnVuY3Rpb25zOiBHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZDtcbiAgLyoqIExpc3Qgb2Ygc2F2ZWQgY2hhdHMuICovXG4gIHNhdmVkQ2hhdHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYXZlZENoYXRbXT4oW10pO1xuICAvKiogV2hldGhlciB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHNhdmVkIGNoYXRzLiAqL1xuICBzYXZlZENoYXRzRXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBFbWl0IHRoZSBzYXZlZCBjaGF0IHRvIGxvYWQuICovXG4gIGxvYWRTYXZlZENoYXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYXZlZENoYXQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8qKiBFbWl0IHRoZSBxdW90YSBlYWNoIHRpbWUgdGhlIGNoYXQgaXMgaW52b2tlZC4gKi9cbiAgcXVvdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdW90YSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIEVtaXQgdGhlIGNhbGN1bGF0ZWQgdXNlcidzIHRva2VuIGNvbnN1bXB0aW9uIGJhc2VkIG9uIHRoZSBxdW90YS4gKi9cbiAgdXNlclRva2VuQ29uc3VtcHRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyVG9rZW5Db25zdW1wdGlvbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIEVtaXQgdGhlIGNoYXQgdXNhZ2UgbWV0cmljcyBlYWNoIHRpbWUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGFzc2lzdGFudCByZXNwb25zZSBpcyBjb21wbGV0ZWQuICovXG4gIGNoYXRVc2FnZU1ldHJpY3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGF0VXNhZ2VNZXRyaWNzIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0aGUgY2FsY3VsYXRlZCBjaGF0J3MgdG9rZW4gY29uc3VtcHRpb24gYmFzZWQgb24gdGhlIGNoYXQgdXNhZ2UgbWV0cmljcy4gKi9cbiAgY2hhdFRva2VuQ29uc3VtcHRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUb2tlbkNvbnN1bXB0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0cnVlIGlmIFwiQ2FuY2VsVGFza3NcIiBpcyBvbmdvaW5nLiAqL1xuICBzdG9wcGluZ0dlbmVyYXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBJbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlIGRlZmluaW5nIHRoZSBhc3Npc3RhbnQgaW5zdGFuY2UuICovXG4gIHByaXZhdGUgX2NoYXRJbnN0YW5jZUlkOiBzdHJpbmc7XG4gIC8qKiBHZW5lcmF0ZWQgR1VJRCBmb3IgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uIHVzZWQgdG8gc2F2ZS9nZXQvZGVsZXRlIGl0IGFuZCBpZGVudGlmeSBhdWRpdCBldmVudHMuICovXG4gIHByaXZhdGUgX2NoYXRJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyB1c2VyU2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXR0aW5nc1dlYlNlcnZpY2UpO1xuICBwdWJsaWMgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICBwdWJsaWMgYXBwU2VydmljZSA9IGluamVjdChBcHBTZXJ2aWNlKTtcbiAgcHVibGljIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsU2VydmljZSk7XG4gIHB1YmxpYyBhc3Npc3RhbnRVdGlscyA9IGluamVjdChBc3Npc3RhbnRVdGlscyk7XG4gIHByaXZhdGUgc2F2ZWRDaGF0c1NlcnZpY2UgPSBpbmplY3QoU2F2ZWRDaGF0c1NlcnZpY2UpO1xuICBwcml2YXRlIHNpZ25hbFJDb25uZWN0aW9uU2VydmljZSA9IGluamVjdChTaWduYWxSQ29ubmVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlID0gaW5qZWN0KEFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2UgPSBpbmplY3QoQXNzaXN0YW50TWV0YWRhdGFTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhc3Npc3RhbnRUb2tlbnNUcmFja2luZ1NlcnZpY2UgPSBpbmplY3QoQXNzaXN0YW50VG9rZW5zVHJhY2tpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkZWJ1Z01lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KERlYnVnTWVzc2FnZVNlcnZpY2UpO1xuICAvLyBJbmplY3QgdGhlIEFzc2lzdGFudFdzRnJhbWVzU2VydmljZSB1c2luZyAnbmV3JyB0byBlbnN1cmUgYSBzZXBhcmF0ZSBsb2NhbCBpbnN0YW5jZSBmb3IgZWFjaCBDaGF0U2VydmljZSBpbnN0YW5jZVxuICBwcml2YXRlIGFzc2lzdGFudFdzRnJhbWVzU2VydmljZSA9IG5ldyhBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNsb2NvID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBhc3Npc3RhbnQgcHJvY2Vzcy5cbiAgICogSXQgaW5jbHVkZXMgYnVpbGRpbmcgYW5kIHN0YXJ0aW5nIGEgY29ubmVjdGlvbiwgZXhlY3V0aW5nIHBhcmFsbGVsIHJlcXVlc3RzIGZvciBtb2RlbHMgYW5kIGZ1bmN0aW9ucywgYW5kIGhhbmRsaW5nIGVycm9ycyBkdXJpbmcgdGhlIHByb2Nlc3MuXG4gICAqIOKaoO+4jyBUaGlzIG1ldGhvZCBNVVNUIGJlIGNhbGxlZCBPTkxZIGlmIHRoZSB1c2VyIGlzIGxvZ2dlZEluIGFuZCBvbmNlIHdoZW4gdGhlIGFzc2lzdGFudCBpcyBpbml0aWFsaXplZC5cbiAgICpcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZTxib29sZWFuPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAvLyBFbnN1cmUgYWxsIGxvZ2ljIGlzIGV4ZWN1dGVkIHdoZW4gc3Vic2NyaWJlZCB0byB0aGUgb2JzZXJ2YWJsZVxuICAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0QXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UoKTtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMuaW5pdENoYXRDb25maWcoKSk7XG4gICAgfSkucGlwZShcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIGluaXRpYWxpemVkXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5pbml0Q29uZmlnJC5waXBlKGZpbHRlcihCb29sZWFuKSwgdGFrZSgxKSkpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRXU1JlcXVlc3RzVXJsKCk7XG4gICAgICAgIHRoaXMuZ2V0UkVTVFJlcXVlc3RzVXJsKCk7XG4gICAgICAgIHRoaXMuX2luaXRBc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5faW5pdEFzc2lzdGFudFRva2Vuc1RyYWNraW5nU2VydmljZSgpO1xuICAgICAgICB0aGlzLl9pbml0U2F2ZWRDaGF0c1NlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5faW5pdERlYnVnTWVzc2FnZVNlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5faW5pdFNpZ25hbFJDb25uZWN0aW9uU2VydmljZSgpO1xuICAgICAgfSksXG4gICAgICAvLyBCdWlsZCBhbmQgc3RhcnQgdGhlIFNpZ25hbFIgY29ubmVjdGlvblxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYnVpbGRDb25uZWN0aW9uKCkpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UgaGVyZSwgbm93IHRoYXQgJ3RoaXMuY29ubmVjdGlvbicgaXMgc2V0XG4gICAgICAgIHRoaXMuX2luaXRBc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5pbml0TWVzc2FnZUhhbmRsZXJzKCk7XG4gICAgICB9KSxcbiAgICAgIC8vIFN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zdGFydENvbm5lY3Rpb24oKSksXG4gICAgICAvLyBGZXRjaCBtZXRhZGF0YSBpbiBwYXJhbGxlbFxuICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgIGZvcmtKb2luKFtcbiAgICAgICAgICB0aGlzLmxpc3RNb2RlbHMoKSxcbiAgICAgICAgICB0aGlzLmxpc3RGdW5jdGlvbnMoKVxuICAgICAgICBdKVxuICAgICAgKSxcbiAgICAgIC8vIE1hcCB0aGUgcmVzdWx0cyBvZiBwYXJhbGxlbCByZXF1ZXN0cyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzXG4gICAgICBtYXAoKFttb2RlbHMsIGZ1bmN0aW9uc10pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKG1vZGVscyAhPT0gdW5kZWZpbmVkICYmIGZ1bmN0aW9ucyAhPT0gdW5kZWZpbmVkICYmICEhbW9kZWxzICYmICEhZnVuY3Rpb25zKTtcbiAgICAgICAgdGhpcy5pbml0UHJvY2VzcyQubmV4dChyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICAvLyBBbnkgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0LCBsb2dnZWQsIGFuZCByZS10aHJvd24gdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBmdXJ0aGVyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZSgxKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIHRoZSBlbmRwb2ludCB0byB1c2UgZm9yIHRoZSB3ZWJzb2NrZXQgcmVxdWVzdHNcbiAgICogSXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcCBjb25maWdcbiAgICovXG4gIGdldFdTUmVxdWVzdHNVcmwoKSB7XG4gICAgdGhpcy5hc3Npc3RhbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRXU1JlcXVlc3RzVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIHRoZSBlbmRwb2ludCB0byB1c2UgZm9yIHRoZSBodHRwIHJlcXVlc3RzXG4gICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHAgY29uZmlnXG4gICAqL1xuICBnZXRSRVNUUmVxdWVzdHNVcmwoKSB7XG4gICAgdGhpcy5hc3Npc3RhbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRSRVNUUmVxdWVzdHNVcmwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgU2F2ZWRDaGF0c1NlcnZpY2Ugd2l0aCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIGBTYXZlZENoYXRzU2VydmljZWAgYnkgcHJvdmlkaW5nIGl0IHdpdGggYSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKiAoYFNhdmVkQ2hhdHNPcGVyYXRpb25Db25maWdgKSB0aGF0IGluY2x1ZGVzIHZhcmlvdXMgY2FsbGJhY2tzIGFuZCBwcm9wZXJ0aWVzIHJlcXVpcmVkXG4gICAqIGZvciBpdHMgb3BlcmF0aW9uLiBUaGUgaW5pdGlhbGl6YXRpb24gd2lsbCBvbmx5IHByb2NlZWQgaWYgYm90aCBgYXNzaXN0YW50Q29uZmlnJGAgYW5kXG4gICAqIGBSRVNUX1JFUVVFU1RfVVJMYCBhcmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgaW5jbHVkZXM6XG4gICAqIC0gQXBwbGljYXRpb24gbmFtZSByZXRyaWV2YWwuXG4gICAqIC0gSW5zdGFuY2UgSUQgcmV0cmlldmFsLlxuICAgKiAtIFJFU1QgQVBJIFVSTCByZXRyaWV2YWwuXG4gICAqIC0gRGVidWcgZmxhZyByZXRyaWV2YWwuXG4gICAqIC0gQ2hhdCBJRCBmb3IgbmV3IHNhdmVzLlxuICAgKiAtIFNhdmVkIGNoYXRzIGVuYWJsZW1lbnQgY2hlY2suXG4gICAqIC0gTWV0aG9kcyBmb3Igc2V0dGluZyBhIHNhdmVkIGNoYXQgSUQsIHVwZGF0aW5nIHRoZSBzYXZlZCBjaGF0cyBsaXN0LCBhbmQgZ2VuZXJhdGluZyBhdWRpdCBldmVudHMuXG4gICAqXG4gICAqIElmIHRoZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMgYXJlIG5vdCByZWFkeSwgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNhdmVkQ2hhdHNTZXJ2aWNlKCkge1xuICAgIGlmICh0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUgJiYgdGhpcy5SRVNUX1JFUVVFU1RfVVJMKSB7XG4gICAgICBjb25zdCBzYXZlZENoYXRzT3BDb25maWc6IFNhdmVkQ2hhdHNPcGVyYXRpb25Db25maWcgPSB7XG4gICAgICAgIGdldEFwcE5hbWU6ICgpID0+IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgICBnZXRJbnN0YW5jZUlkOiAoKSA9PiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgICBnZXRSZXN0VXJsOiAoKSA9PiB0aGlzLlJFU1RfUkVRVUVTVF9VUkwsXG4gICAgICAgIGdldERlYnVnRmxhZzogKCkgPT4gdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnLFxuICAgICAgICBpc1NhdmVkQ2hhdHNFbmFibGVkOiAoKSA9PiAhIXRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZT8uc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCxcbiAgICAgICAgc2V0U2F2ZWRDaGF0c0Vycm9yU3RhdHVzOiAoaGFzRXJyb3IpID0+IHRoaXMuc2F2ZWRDaGF0c0Vycm9yJC5uZXh0KGhhc0Vycm9yKSxcbiAgICAgICAgdXBkYXRlU2F2ZWRDaGF0c0xpc3Q6IChjaGF0cykgPT4gdGhpcy5zYXZlZENoYXRzJC5uZXh0KGNoYXRzKSxcbiAgICAgICAgZ2VuZXJhdGVBdWRpdEV2ZW50OiAodHlwZSwgZGV0YWlscywgaWQpID0+IHRoaXMuZ2VuZXJhdGVBdWRpdEV2ZW50KHR5cGUsIGRldGFpbHMsIGlkKSxcbiAgICAgIH07XG4gICAgICB0aGlzLnNhdmVkQ2hhdHNTZXJ2aWNlLmluaXQoc2F2ZWRDaGF0c09wQ29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBjYXNlIHNob3VsZCBpZGVhbGx5IG5vdCBoYXBwZW4gaWYgaW5pdCBvcmRlciBpcyBjb3JyZWN0XG4gICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgU2F2ZWRDaGF0c1NlcnZpY2U6IGFzc2lzdGFudENvbmZpZyBvciBSRVNUX1JFUVVFU1RfVVJMIG5vdCByZWFkeS5cIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBTaWduYWxSIGNvbm5lY3Rpb24gc2VydmljZSB3aXRoIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBTaWduYWxSIGNvbm5lY3Rpb24gc2VydmljZSBpcyBwcm9wZXJseSBzZXQgdXBcbiAgICogYnkgcHJvdmlkaW5nIGl0IHdpdGggdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gdmFsdWVzLCBzdWNoIGFzIHRoZSBXZWJTb2NrZXRcbiAgICogcmVxdWVzdCBVUkwgYW5kIGFzc2lzdGFudCBjb25maWd1cmF0aW9uLiBJdCBhbHNvIG1hbmFnZXMgdGhlIFNpZ25hbFIgaHViIGNvbm5lY3Rpb25cbiAgICogaW5zdGFuY2UuXG4gICAqXG4gICAqIFByZWNvbmRpdGlvbnM6XG4gICAqIC0gYGFzc2lzdGFudENvbmZpZyQudmFsdWVgIG11c3QgYmUgYXZhaWxhYmxlLlxuICAgKiAtIGBXU19SRVFVRVNUX1VSTGAgbXVzdCBiZSBkZWZpbmVkLlxuICAgKlxuICAgKiBJZiB0aGVzZSBwcmVjb25kaXRpb25zIGFyZSBub3QgbWV0LCBhbiBlcnJvciBpcyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pbml0U2lnbmFsUkNvbm5lY3Rpb25TZXJ2aWNlKCkge1xuICAgIGlmICh0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUgJiYgdGhpcy5XU19SRVFVRVNUX1VSTCkge1xuICAgICAgICBjb25zdCBzaWduYWxST3BDb25maWc6IFNpZ25hbFJDb25uZWN0aW9uT3BlcmF0aW9uQ29uZmlnID0ge1xuICAgICAgICAgICAgZ2V0V3NSZXF1ZXN0VXJsOiAoKSA9PiB0aGlzLldTX1JFUVVFU1RfVVJMLFxuICAgICAgICAgICAgZ2V0QXNzaXN0YW50Q29uZmlnVmFsdWU6ICgpID0+IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSxcbiAgICAgICAgICAgIGdldEh1YkNvbm5lY3Rpb246ICgpID0+IHRoaXMuY29ubmVjdGlvbiwgLy8gVXNpbmcgZ2V0SHViQ29ubmVjdGlvbiBhcyBwZXIgdXNlcidzIGZpbGVcbiAgICAgICAgICAgIHNldEh1YkNvbm5lY3Rpb246IChjb25uKSA9PiB7IHRoaXMuY29ubmVjdGlvbiA9IGNvbm47IH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zaWduYWxSQ29ubmVjdGlvblNlcnZpY2UuaW5pdChzaWduYWxST3BDb25maWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNhc2Ugc2hvdWxkIGlkZWFsbHkgbm90IGhhcHBlbiBpZiBpbml0IG9yZGVyIGlzIGNvcnJlY3RcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIFNpZ25hbFJDb25uZWN0aW9uU2VydmljZTogYXNzaXN0YW50Q29uZmlnIG9yIFdTX1JFUVVFU1RfVVJMIG5vdCByZWFkeS5cIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBBc3Npc3RhbnQgQ29uZmlndXJhdGlvbiBTZXJ2aWNlIHdpdGggdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb24gY29udGV4dC5cbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IGJ5IHByb3ZpZGluZyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zXG4gICAqIGFuZCBzdGF0ZSBtYW5hZ2VtZW50IG1lY2hhbmlzbXMgcmVxdWlyZWQgZm9yIHRoZSBhc3Npc3RhbnQncyBjb25maWd1cmF0aW9uIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIFRoZSBvcGVyYXRpb24gY29udGV4dCBpbmNsdWRlczpcbiAgICogLSBNZXRob2RzIHRvIHJldHJpZXZlIGNoYXQgaW5zdGFuY2UgYW5kIGNoYXQgSURzLlxuICAgKiAtIE1ldGhvZHMgdG8gZ2V0IGFuZCBzZXQgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxuICAgKiAtIE1ldGhvZHMgdG8gc2V0IFdlYlNvY2tldCBhbmQgUkVTVCByZXF1ZXN0IFVSTHMuXG4gICAqIC0gTWV0aG9kcyB0byB1cGRhdGUgdGhlIGluaXRpYWxpemF0aW9uIGNvbmZpZ3VyYXRpb24gc3RhdHVzLlxuICAgKiAtIEEgbWV0aG9kIHRvIGdlbmVyYXRlIGF1ZGl0IGV2ZW50cyBmb3IgdHJhY2tpbmcgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2luaXRBc3Npc3RhbnRDb25maWd1cmF0aW9uU2VydmljZSgpIHtcbiAgICBjb25zdCBjb25maWdPcENvbnRleHQ6IEFzc2lzdGFudENvbmZpZ3VyYXRpb25PcGVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgICBnZXRDaGF0SW5zdGFuY2VJZDogKCkgPT4gdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgICAgZ2V0Q2hhdElkOiAoKSA9PiB0aGlzLmNoYXRJZCxcbiAgICAgICAgZ2V0QXNzaXN0YW50Q29uZmlnVmFsdWU6ICgpID0+IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSxcbiAgICAgICAgc2V0V1NSZXF1ZXN0c1VybDogKHVybCkgPT4gdGhpcy5XU19SRVFVRVNUX1VSTCA9IHVybCxcbiAgICAgICAgc2V0UkVTVFJlcXVlc3RzVXJsOiAodXJsKSA9PiB0aGlzLlJFU1RfUkVRVUVTVF9VUkwgPSB1cmwsXG4gICAgICAgIHNldEFzc2lzdGFudENvbmZpZzogKGNvbmZpZykgPT4gdGhpcy5hc3Npc3RhbnRDb25maWckLm5leHQoY29uZmlnKSxcbiAgICAgICAgc2V0SW5pdENvbmZpZ1N0YXR1czogKHN0YXR1cykgPT4gdGhpcy5pbml0Q29uZmlnJC5uZXh0KHN0YXR1cyksXG4gICAgICAgIGdlbmVyYXRlQXVkaXRFdmVudDogKHR5cGUsIGRldGFpbHMsIGlkKSA9PiB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudCh0eXBlLCBkZXRhaWxzLCBpZClcbiAgICB9O1xuICAgIHRoaXMuYXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UuaW5pdChjb25maWdPcENvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBBc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2Ugd2l0aCB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbiBjb250ZXh0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIGBhc3Npc3RhbnRDb25maWckYCB2YWx1ZSBhbmQgYFJFU1RfUkVRVUVTVF9VUkxgIGFyZSBhdmFpbGFibGUuXG4gICAqIElmIGJvdGggYXJlIHJlYWR5LCBpdCBjcmVhdGVzIGFuIGBBc3Npc3RhbnRNZXRhZGF0YU9wZXJhdGlvbkNvbnRleHRgIG9iamVjdCBhbmRcbiAgICogaW5pdGlhbGl6ZXMgdGhlIGBhc3Npc3RhbnRNZXRhZGF0YVNlcnZpY2VgIHdpdGggaXQuIFRoZSBvcGVyYXRpb24gY29udGV4dCBwcm92aWRlc1xuICAgKiBtZXRob2RzIHRvIHJldHJpZXZlIHRoZSBSRVNUIFVSTCwgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb24sIGFuZCB0byBzZXQgbW9kZWxzIGFuZCBmdW5jdGlvbnMuXG4gICAqXG4gICAqIElmIHRoZSByZXF1aXJlZCB2YWx1ZXMgYXJlIG5vdCByZWFkeSwgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdEFzc2lzdGFudE1ldGFkYXRhU2VydmljZSgpIHtcbiAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlICYmIHRoaXMuUkVTVF9SRVFVRVNUX1VSTCkge1xuICAgICAgY29uc3QgbWV0YWRhdGFPcENvbnRleHQ6IEFzc2lzdGFudE1ldGFkYXRhT3BlcmF0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgZ2V0UmVzdFVybDogKCkgPT4gdGhpcy5SRVNUX1JFUVVFU1RfVVJMLFxuICAgICAgICBnZXRBc3Npc3RhbnRDb25maWdWYWx1ZTogKCkgPT4gdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlLFxuICAgICAgICBzZXRNb2RlbHM6IChtb2RlbHMpID0+IHsgdGhpcy5tb2RlbHMgPSBtb2RlbHM7IH0sXG4gICAgICAgIHNldEZ1bmN0aW9uczogKGZ1bmN0aW9ucykgPT4geyB0aGlzLmZ1bmN0aW9ucyA9IGZ1bmN0aW9uczsgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuYXNzaXN0YW50TWV0YWRhdGFTZXJ2aWNlLmluaXQobWV0YWRhdGFPcENvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgQXNzaXN0YW50TWV0YWRhdGFTZXJ2aWNlOiBhc3Npc3RhbnRDb25maWcgb3IgUkVTVF9SRVFVRVNUX1VSTCBub3QgcmVhZHkuXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgQXNzaXN0YW50IFRva2VucyBUcmFja2luZyBTZXJ2aWNlIHdpdGggdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb24gY29udGV4dC5cbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgc2VydmljZSBieSBwcm92aWRpbmcgaXQgd2l0aCBmdW5jdGlvbnMgdG8gbWFuYWdlIHF1b3RhcyxcbiAgICogdG9rZW4gY29uc3VtcHRpb24sIHVzYWdlIG1ldHJpY3MsIGFuZCBhdWRpdCBldmVudHMsIGFzIHdlbGwgYXMgYWNjZXNzIHRvIGFzc2lzdGFudCBjb25maWd1cmF0aW9uXG4gICAqIGFuZCBtb2RlbCByZXRyaWV2YWwuXG4gICAqXG4gICAqIFRoZSBpbml0aWFsaXphdGlvbiB3aWxsIG9ubHkgcHJvY2VlZCBpZiB0aGUgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKiBJZiB0aGUgY29uZmlndXJhdGlvbiBpcyBub3QgcmVhZHksIGFuIGVycm9yIG1lc3NhZ2UgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdEFzc2lzdGFudFRva2Vuc1RyYWNraW5nU2VydmljZSgpIHtcbiAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlKSB7XG4gICAgICBjb25zdCB0b2tlbnNPcENvbnRleHQ6IEFzc2lzdGFudFRva2Vuc1RyYWNraW5nT3BlcmF0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgZ2V0QXNzaXN0YW50Q29uZmlnVmFsdWU6ICgpID0+IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSxcbiAgICAgICAgc2V0UXVvdGE6IChxdW90YSkgPT4gdGhpcy5xdW90YSQubmV4dChxdW90YSksXG4gICAgICAgIHNldFVzZXJUb2tlbkNvbnN1bXB0aW9uOiAoY29uc3VtcHRpb24pID0+IHRoaXMudXNlclRva2VuQ29uc3VtcHRpb24kLm5leHQoY29uc3VtcHRpb24pLFxuICAgICAgICBzZXRDaGF0VXNhZ2VNZXRyaWNzOiAobWV0cmljcykgPT4gdGhpcy5jaGF0VXNhZ2VNZXRyaWNzJC5uZXh0KG1ldHJpY3MpLFxuICAgICAgICBzZXRDaGF0VG9rZW5Db25zdW1wdGlvbjogKGNvbnN1bXB0aW9uKSA9PiB0aGlzLmNoYXRUb2tlbkNvbnN1bXB0aW9uJC5uZXh0KGNvbnN1bXB0aW9uKSxcbiAgICAgICAgZ2VuZXJhdGVBdWRpdEV2ZW50OiAodHlwZSwgZGV0YWlscywgaWQpID0+IHRoaXMuZ2VuZXJhdGVBdWRpdEV2ZW50KHR5cGUsIGRldGFpbHMsIGlkKSxcbiAgICAgICAgZ2V0TW9kZWw6IChzZXJ2aWNlSWQsIG1vZGVsSWQpID0+IHRoaXMuZ2V0TW9kZWwoc2VydmljZUlkLCBtb2RlbElkKVxuICAgICAgfTtcbiAgICAgIHRoaXMuYXNzaXN0YW50VG9rZW5zVHJhY2tpbmdTZXJ2aWNlLmluaXQodG9rZW5zT3BDb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIEFzc2lzdGFudFRva2Vuc1RyYWNraW5nU2VydmljZTogYXNzaXN0YW50Q29uZmlnIG5vdCByZWFkeS5cIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBBc3Npc3RhbnQgV2ViU29ja2V0IEZyYW1lcyBTZXJ2aWNlIHdpdGggdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb24gY29udGV4dC5cbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VydmljZSB0byBmdW5jdGlvbiBwcm9wZXJseS5cbiAgICogSXQgZW5zdXJlcyB0aGF0IHRoZSBhc3Npc3RhbnQgY29uZmlndXJhdGlvbiBhbmQgY29ubmVjdGlvbiBhcmUgYXZhaWxhYmxlIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIFRoZSBvcGVyYXRpb24gY29udGV4dCBwcm92aWRlcyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBzdGF0ZSBtYW5hZ2VtZW50IG1ldGhvZHMsIGluY2x1ZGluZzpcbiAgICogLSBBY2Nlc3NpbmcgdGhlIGFzc2lzdGFudCBjb25maWd1cmF0aW9uLCBjaGF0IGluc3RhbmNlIElELCBzYXZlZCBjaGF0IElELCBhbmQgY2hhdCBoaXN0b3J5LlxuICAgKiAtIE1hbmFnaW5nIHN0cmVhbWluZyBhbmQgc3RvcHBpbmcgZ2VuZXJhdGlvbiBzdGF0dXNlcy5cbiAgICogLSBVcGRhdGluZyBxdW90YSBhbmQgY2hhdCB1c2FnZSBtZXRyaWNzLlxuICAgKiAtIEdlbmVyYXRpbmcgYXVkaXQgZXZlbnRzLlxuICAgKiAtIE1hbmFnaW5nIHNhdmVkIGNoYXRzIChhZGRpbmcsIHVwZGF0aW5nLCBhbmQgbGlzdGluZykuXG4gICAqXG4gICAqIElmIHRoZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMgKGBhc3Npc3RhbnRDb25maWckYCBhbmQgYGNvbm5lY3Rpb25gKSBhcmUgbm90IHJlYWR5LCBhbiBlcnJvciBpcyBsb2dnZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pbml0QXNzaXN0YW50V3NGcmFtZXNTZXJ2aWNlKCkge1xuICAgIGlmICh0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUgJiYgdGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICBjb25zdCB3c0ZyYW1lc09wQ29udGV4dDogQXNzaXN0YW50V3NGcmFtZXNDb250ZXh0ID0ge1xuICAgICAgICBnZXRBc3Npc3RhbnRDb25maWc6ICgpID0+IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSxcbiAgICAgICAgZ2V0Q2hhdEluc3RhbmNlSWQ6ICgpID0+IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICAgIGdldENoYXRJZDogKCkgPT4gdGhpcy5jaGF0SWQsXG4gICAgICAgIGdldEh1YkNvbm5lY3Rpb246ICgpID0+IHRoaXMuY29ubmVjdGlvbixcbiAgICAgICAgZ2V0Q2hhdEhpc3Rvcnk6ICgpID0+IHRoaXMuY2hhdEhpc3RvcnksXG4gICAgICAgIHNldFN0cmVhbWluZ1N0YXR1czogKGlzU3RyZWFtaW5nKSA9PiB0aGlzLnN0cmVhbWluZyQubmV4dChpc1N0cmVhbWluZyksXG4gICAgICAgIHNldENoYXRIaXN0b3J5OiAoaGlzdG9yeSkgPT4geyB0aGlzLmNoYXRIaXN0b3J5ID0gaGlzdG9yeTsgfSxcbiAgICAgICAgc2V0U3RvcHBpbmdHZW5lcmF0aW9uU3RhdHVzOiAoaXNTdG9wcGluZykgPT4gdGhpcy5zdG9wcGluZ0dlbmVyYXRpb24kLm5leHQoaXNTdG9wcGluZyksXG4gICAgICAgIHNldFNhdmVkQ2hhdHNFcnJvclN0YXR1czogKGhhc0Vycm9yKSA9PiB0aGlzLnNhdmVkQ2hhdHNFcnJvciQubmV4dChoYXNFcnJvciksXG4gICAgICAgIHVwZGF0ZVF1b3RhOiAocXVvdGEsIHByb3BhZ2F0ZUVycm9yKSA9PiB0aGlzLnVwZGF0ZVF1b3RhKHF1b3RhLCBwcm9wYWdhdGVFcnJvciksXG4gICAgICAgIHVwZGF0ZUNoYXRVc2FnZU1ldHJpY3M6IChtZXRyaWNzKSA9PiB0aGlzLnVwZGF0ZUNoYXRVc2FnZU1ldHJpY3MobWV0cmljcyksXG4gICAgICAgIGdlbmVyYXRlQXVkaXRFdmVudDogKHR5cGUsIGRldGFpbHMsIGlkKSA9PiB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudCh0eXBlLCBkZXRhaWxzLCBpZCksXG4gICAgICAgIGFkZFNhdmVkQ2hhdDogKGlkLCBtZXNzYWdlcykgPT4gdGhpcy5hZGRTYXZlZENoYXQoaWQsIG1lc3NhZ2VzKSxcbiAgICAgICAgdXBkYXRlU2F2ZWRDaGF0OiAoaWQsIG5hbWUsIG1lc3NhZ2VzKSA9PiB0aGlzLnVwZGF0ZVNhdmVkQ2hhdChpZCwgbmFtZSwgbWVzc2FnZXMpLFxuICAgICAgICBsaXN0U2F2ZWRDaGF0OiAoKSA9PiB0aGlzLmxpc3RTYXZlZENoYXQoKSxcbiAgICAgICAgaXNFeGlzdGluZ1NhdmVkQ2hhdDogKGlkKSA9PiB0aGlzLmlzRXhpc3RpbmdTYXZlZENoYXQoaWQpXG4gICAgICB9O1xuICAgICAgdGhpcy5hc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UuaW5pdCh3c0ZyYW1lc09wQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIEFzc2lzdGFudFdzRnJhbWVzU2VydmljZTogY29yZSBkZXBlbmRlbmNpZXMgbm90IHJlYWR5LlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbml0RGVidWdNZXNzYWdlU2VydmljZSgpIHtcbiAgICBpZiAodGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlICYmIHRoaXMuUkVTVF9SRVFVRVNUX1VSTCkge1xuICAgICAgY29uc3QgZGVidWdNZXNzYWdlT3BDb250ZXh0OiBEZWJ1Z01lc3NhZ2VPcGVyYXRpb25Db25maWcgPSB7XG4gICAgICAgIGdldFJlc3RVcmw6ICgpID0+IHRoaXMuUkVTVF9SRVFVRVNUX1VSTFxuICAgICAgfTtcbiAgICAgIHRoaXMuZGVidWdNZXNzYWdlU2VydmljZS5pbml0KGRlYnVnTWVzc2FnZU9wQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSBEZWJ1Z01lc3NhZ2VTZXJ2aWNlOiBhc3Npc3RhbnRDb25maWcgb3IgUkVTVF9SRVFVRVNUX1VSTCBub3QgcmVhZHkuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhc3Npc3RhbnRzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0QXNzaXN0YW50c1NldHRpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIElEIG9mIHRoZSBjaGF0IHNlcnZpY2VcbiAgICogQHJldHVybnMgVGhlIGluc3RhbmNlIElEIG9mIHRoZSBjaGF0IHNlcnZpY2VcbiAgICovXG4gIGdldCBjaGF0SW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGF0SW5zdGFuY2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IHRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAqIEBwYXJhbSBpbnN0YW5jZUlkIFRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAqL1xuICBzZXRDaGF0SW5zdGFuY2VJZChpbnN0YW5jZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jaGF0SW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBJRCBvZiB0aGUgY3VycmVudCBjaGF0IGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byBzYXZlL2dldC9kZWxldGUgdGhlIGRpc2N1c3Npb24gYW5kIGlkZW50aWZ5IGF1ZGl0IGV2ZW50c1xuICAgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uXG4gICAqL1xuICBnZXQgY2hhdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhbiBHVUlEIGZvciB0aGUgY3VycmVudCBjaGF0IGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byBzYXZlL2dldC9kZWxldGUgaXQgYW5kIGlkZW50aWZ5IGF1ZGl0IGV2ZW50c1xuICAgKiBAcGFyYW0gY2hhdElkIGlmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgdGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvbiB3aGljaCBpcyB1c2VkIHRvIGlkZW50aWZ5IGF1ZGl0IGV2ZW50c1xuICAgKi9cbiAgZ2VuZXJhdGVDaGF0SWQoY2hhdElkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2hhdElkID0gY2hhdElkIHx8IGd1aWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IGNvbmZpZyBieSBtYW5hZ2luZyBPTkxZIHN1Yi1vYmplY3QgKipkZWZhdWx0VmFsdWVzKiogY29uZmlncyBvZiB0aGUgc3RhbmRhcmQgYXBwIGNvbmZpZyAoZGVmaW5lZCBpbiB0aGUgY3VzdG9taXphdGlvbiBqc29uIHRhYiApIGFuZCB0aGUgdXNlciBwcmVmZXJlbmNlcy5cbiAgICogVG8gZG8gc28sIGEgdHJhY2tpbmcgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIHRvIG5vdGlmeSB0aGUgdXNlciBhYm91dCB0aGUgYXZhaWxhYmxlIHVwZGF0ZXMgaW4gdGhlIGRlZmF1bHRWYWx1ZXMgb2JqZWN0IG9mIHRoZSBzdGFuZGFyZCBhcHAgY29uZmlnLlxuICAgKiBUaGUgcmVzdCBvZiB0aGUgY29uZmlnIG9iamVjdCBjb21pbmcgZnJvbSBcInN0YW5kYXJkIGFwcCBjb25maWdcIiBpcyB1c2VkIGFzIGl0IGlzIHdpdGhvdXQgYW55IG92ZXJyaWRlLlxuICAgKiBUaHVzLCB0aGUgdXNlciBwcmVmZXJlbmNlcyBhcmUgdXNlZCBvbmx5IGZvciB0aGUgZGVmYXVsdFZhbHVlcyBvYmplY3QuXG4gICAqIFRoaXMgcHJvdmlkZSBhIGNlbnRyYWxpemVkIHdheSB0byBtYW5hZ2UgdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZyBvYmplY3QgYnkgYWRtaW5zIGFuZCBlbnN1cmUgYSB1bmlxdWUgY29tbW9uIGJlaGF2aW9yIGZvciBhbGwgdXNlcnMuXG4gICAqL1xuICBhc3luYyBpbml0Q2hhdENvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmluaXRDaGF0Q29uZmlnKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBjaGF0IGNvbmZpZyBhbmQgc3RvcmUgaXRzIGRlZmF1bHRWYWx1ZXMgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICogQHBhcmFtIGNvbmZpZyAgVGhlIHVwZGF0ZWQgY2hhdCBjb25maWdcbiAgICogQHBhcmFtIGhhc2hlcyAgVGhlIHVwZGF0ZWQgaGFzaGVzIHRvIHN0b3JlIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzXG4gICAqIEBwYXJhbSBub3RpZnkgIFdoZXRoZXIgdG8gbm90aWZ5IHRoZSB1c2VyIGFib3V0IHRoZSB1cGRhdGVcbiAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjayAgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgaWYgdGhlIHVwZGF0ZSBpcyBzdWNjZXNzZnVsXG4gICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrICBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBpZiB0aGUgdXBkYXRlIGZhaWxzXG4gICAqL1xuICB1cGRhdGVDaGF0Q29uZmlnKFxuICAgIGNvbmZpZzogQ2hhdENvbmZpZyxcbiAgICBoYXNoZXM/OiB7IFwiYXBwbGllZC1kZWZhdWx0VmFsdWVzLWhhc2hcIj86IHN0cmluZzsgXCJza2lwcGVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiPzogc3RyaW5nIH0sXG4gICAgbm90aWZ5ID0gdHJ1ZSxcbiAgICBzdWNjZXNzQ2FsbGJhY2s/OiAoKSA9PiBhbnksXG4gICAgZXJyb3JDYWxsYmFjaz86ICgpID0+IGFueVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlLnVwZGF0ZUNoYXRDb25maWcoY29uZmlnLCBoYXNoZXMsIG5vdGlmeSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGxvZ2dlZCBpbiB1c2VyXG4gICAqL1xuICBvdmVycmlkZVVzZXIoKTogdm9pZCB7XG4gICAgY29uc3QgeyB1c2VyT3ZlcnJpZGVBY3RpdmUsIHVzZXJPdmVycmlkZSB9ID0gZ2xvYmFsQ29uZmlnO1xuICAgIGlmICghKHVzZXJPdmVycmlkZUFjdGl2ZSAmJiB1c2VyT3ZlcnJpZGUpKSB7XG4gICAgICB0aGlzLnVzZXJPdmVycmlkZSQubmV4dChmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSB0aGUgcGF5bG9hZCB0byBzZW5kIHRvIHRoZSBPdmVycmlkZVVzZXIgbWV0aG9kXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICB1c2VyOiB1c2VyT3ZlcnJpZGUudXNlcm5hbWUsXG4gICAgICBkb21haW46IHVzZXJPdmVycmlkZS5kb21haW5cbiAgICB9XG5cbiAgICAvLyBJbnZva2UgdGhlIE92ZXJyaWRlVXNlciBtZXRob2QgYW5kIGhhbmRsZSBlcnJvcnNcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnT3ZlcnJpZGVVc2VyJywgZGF0YSlcbiAgICAgIC50aGVuKChyZXMpID0+IHRoaXMudXNlck92ZXJyaWRlJC5uZXh0KCEhcmVzKSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIE92ZXJyaWRlVXNlcjonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiB3aGVuIG5vIGZ1cnRoZXIgZXJyb3IgaGFuZGxpbmcgZXhpc3RzIGRvd25zdHJlYW1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBGZXRjaCBBUEkgdG8gcmV0cmlldmUgYSBuZXcgbWVzc2FnZSBnaXZlbiBhbGwgcHJldmlvdXMgbWVzc2FnZXNcbiAgICovXG4gIGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBxdWVyeTogUXVlcnkpOiBPYnNlcnZhYmxlPENoYXRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmFzc2lzdGFudFdzRnJhbWVzU2VydmljZS5mZXRjaChtZXNzYWdlcywgcXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGlzdCBvZiBtb2RlbHMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXJcbiAgICovXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuYXNzaXN0YW50TWV0YWRhdGFTZXJ2aWNlLmxpc3RNb2RlbHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyIEFORCBtYXRjaGluZyBlbmFibGVkIGZ1bmN0aW9ucyBpbiB0aGUgY2hhdCBjb25maWdcbiAgICovXG4gIGxpc3RGdW5jdGlvbnMoKTogT2JzZXJ2YWJsZTxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmFzc2lzdGFudE1ldGFkYXRhU2VydmljZS5saXN0RnVuY3Rpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIGFzc2lzdGFudCBhbnN3ZXIgZ2VuZXJhdGlvbiBhbmQgY2FuY2VscyBhbGwgdGhlIG9uZ29pbmcgYW5kIHBlbmRpbmcgcmVsYXRlZCB0YXNrc1xuICAgKi9cbiAgc3RvcEdlbmVyYXRpb24oKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYXNzaXN0YW50V3NGcmFtZXNTZXJ2aWNlLnN0b3BHZW5lcmF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQSBoYW5kbGVyIGZvciBxdW90YSB1cGRhdGVzIGVhY2ggdGltZSB0aGUgY2hhdCBpcyBpbnZva2VkLlxuICAgKiBJdCBlbWl0cyB0aGUgdXBkYXRlZCBxdW90YSB0byB0aGUgcXVvdGEkIHN1YmplY3QsIGVtaXRzIGFjY29yZGluZ2x5IHRoZSB1cGRhdGVkIHVzZXIncyB0b2tlbnMgY29uc3VtcHRpb24gYW5kIG5vdGlmaWVzIHRoZSB1c2VyIGlmIHRoZSBtYXggcXVvdGEgaXMgcmVhY2hlZC5cbiAgICogQHBhcmFtIHF1b3RhIFRoZSB1cGRhdGVkIHF1b3RhXG4gICAqIEBwYXJhbSBwcm9wYWdhdGVFcnJvciBXaGV0aGVyIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIGNhbGxlclxuICAgKi9cbiAgdXBkYXRlUXVvdGEocXVvdGE6IFF1b3RhLCBwcm9wYWdhdGVFcnJvciA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3Npc3RhbnRUb2tlbnNUcmFja2luZ1NlcnZpY2UudXBkYXRlUXVvdGEocXVvdGEsIHByb3BhZ2F0ZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhhbmRsZXIgZm9yIGNoYXQgdXNhZ2UgbWV0cmljcyBlYWNoIHRpbWUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGFzc2lzdGFudCByZXNwb25zZSBpcyBjb21wbGV0ZWQuXG4gICAqIEl0IGVtaXRzIHRoZSBjaGF0IHVzYWdlIG1ldHJpY3MgdG8gdGhlIGNoYXRVc2FnZU1ldHJpY3MkIHN1YmplY3QsIGVtaXRzIGFjY29yZGluZ2x5IHRoZSB1cGRhdGVkIGNoYXQncyB0b2tlbnMgY29uc3VtcHRpb25cbiAgICogQHBhcmFtIGNoYXRVc2FnZU1ldHJpY3MgVGhlIGNoYXQgdXNhZ2UgbWV0cmljc1xuICAgKi9cbiAgdXBkYXRlQ2hhdFVzYWdlTWV0cmljcyhjaGF0VXNhZ2VNZXRyaWNzOiBDaGF0VXNhZ2VNZXRyaWNzKTogdm9pZCB7XG4gICAgdGhpcy5hc3Npc3RhbnRUb2tlbnNUcmFja2luZ1NlcnZpY2UudXBkYXRlQ2hhdFVzYWdlTWV0cmljcyhjaGF0VXNhZ2VNZXRyaWNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vZGVsIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2l2ZW4gKHNlcnZpY2VJZCArIG1vZGVsSWQpXG4gICAqIElmIGEgbW9kZWwgaXMgbm90IGZvdW5kLCBhbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkXG4gICAqIEBwYXJhbSBzZXJ2aWNlSWQgVGhlIHNlcnZpY2VJZCBvZiB0aGUgbW9kZWxcbiAgICogQHBhcmFtIG1vZGVsSWQgVGhlIG1vZGVsSWQgb2YgdGhlIG1vZGVsXG4gICAqIEByZXR1cm5zIFRoZSBtb2RlbCBkZXNjcmlwdGlvblxuICAgKi9cbiAgZ2V0TW9kZWwoc2VydmljZUlkOiBzdHJpbmcsIG1vZGVsSWQ6IHN0cmluZyk6IEdsbG1Nb2RlbERlc2NyaXB0aW9uIHwgdW5kZWZpbmVke1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHM/LmZpbmQobSA9PiBtLnNlcnZpY2VJZCA9PT0gc2VydmljZUlkICYmIG0ubW9kZWxJZCA9PT0gbW9kZWxJZCk7XG4gICAgLy8gSGFuZGxlIG9ic29sZXRlIGNvbmZpZ1xuICAgIGlmKCFtb2RlbCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihgRkFUQUwgRVJST1IgOiBUaGUgbW9kZWwgKHNlcnZpY2VJZCA9ICcke3NlcnZpY2VJZH0nLCBtb2RlbElkID0gJyR7bW9kZWxJZH0nKSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLiBQbGVhc2UgY29udGFjdCBhbiBhZG1pbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRkFUQUwgRVJST1IgOiBUaGUgbW9kZWwgKHNlcnZpY2VJZCA9ICcke3NlcnZpY2VJZH0nLCBtb2RlbElkID0gJyR7bW9kZWxJZH0nKSBpcyBubyBsb25nZXIgYXZhaWxhYmxlYCk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgbGlzdCBzYXZlZCBjaGF0cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgYXNzaXN0YW50XG4gICAqL1xuICBsaXN0U2F2ZWRDaGF0KCk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZWRDaGF0c1NlcnZpY2UubGlzdENoYXRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzYXZlZCBjaGF0IHdpdGggdGhlIGdpdmVuIGlkLCBpZiBleGlzdHMuIE90aGVyd2lzZSwgcmV0dXJuIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBzYXZlZCBjaGF0XG4gICAqL1xuICBnZXRTYXZlZENoYXQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2F2ZWRDaGF0SGlzdG9yeSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLnNhdmVkQ2hhdHNTZXJ2aWNlLmdldENoYXRCeUlkKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHNhdmVkIGNoYXQgd2l0aCB0aGUgZ2l2ZW4gaWQgYWxyZWFkeSBleGlzdHNcbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2F2ZWQgY2hhdFxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzYXZlZCBjaGF0IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBpc0V4aXN0aW5nU2F2ZWRDaGF0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zYXZlZENoYXRzU2VydmljZS5pc0V4aXN0aW5nQ2hhdChpZCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIGNoYXQgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZXNcbiAgICogQHBhcmFtIG1lc3NhZ2VzIFRoZSBtZXNzYWdlcyB0byBhZGQgdG8gdGhlIHNhdmVkIGNoYXQgaW5kZXhcbiAgICogQHJldHVybnMgVGhlIHNhdmVkIGNoYXRcbiAgICovXG4gIGFkZFNhdmVkQ2hhdChpZDogc3RyaW5nLCBtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zYXZlZENoYXRzU2VydmljZS5hZGRDaGF0KGlkLCBtZXNzYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgc2F2ZWQgY2hhdCB3aXRoIHRoZSBnaXZlbiBpZC5cbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2F2ZWQgY2hhdFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUgb2YgdGhlIHNhdmVkIGNoYXQsIGlmIHByb3ZpZGVkXG4gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gdXBkYXRlIHRoZSBzYXZlZCBjaGF0IGhpc3RvcnksIGlmIHByb3ZpZGVkXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHNhdmVkIGNoYXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcbiAgICovXG4gIHVwZGF0ZVNhdmVkQ2hhdChpZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBtZXNzYWdlcz86IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZWRDaGF0c1NlcnZpY2UudXBkYXRlQ2hhdChpZCwgbmFtZSwgbWVzc2FnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGsgZGVsZXRlIG9mIHNhdmVkIGNoYXRzIG1hdGNoaW5nIHRoZSBnaXZlbiBpZHNcbiAgICogQHBhcmFtIGlkcyBMaXN0IG9mIGlkcyBvZiB0aGUgc2F2ZWQgY2hhdHMgdG8gZGVsZXRlXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZGVsZXRlZCBjaGF0c1xuICAgKi9cbiAgZGVsZXRlU2F2ZWRDaGF0KGlkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPERlbGV0ZVNhdmVkQ2hhdFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZWRDaGF0c1NlcnZpY2UuZGVsZXRlQ2hhdChpZHMpO1xuICB9XG5cbiAgcHVibGljIGdldERlYnVnTWVzc2FnZShtZXNzYWdlOiBEZWJ1Z01lc3NhZ2UpOiBPYnNlcnZhYmxlPEt2T2JqZWN0IHwgTGlzdE9iamVjdCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmRlYnVnTWVzc2FnZVNlcnZpY2UuZ2V0RGVidWdNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgb3V0LW9mLXRoZS1ib3ggaGFuZGxlcnNcbiAgICogSXQgaXMgYSBwbGFjZWhvbGRlciBmb3Igbm9uLXN0cmVhbWluZyBzY2VuYXJpb3MsIHdoZXJlIHlvdSBpbnZva2UgYSBzcGVjaWZpYyBodWIgbWV0aG9kLCBhbmQgdGhlIHNlcnZlciByZXNwb25kcyB3aXRoIGZyYW1lIG1lc3NhZ2UocylcbiAgICovXG4gIGluaXRNZXNzYWdlSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5hc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UuaW5pdE1lc3NhZ2VIYW5kbGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGFuZCByZWdpc3RlciB0aGUgZW50aXJlIF9tZXNzYWdlSGFuZGxlcnMgbWFwIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIG1hcCB3aXRoIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBAcGFyYW0gX21lc3NhZ2VIYW5kbGVyc1xuICAgKi9cbiAgb3ZlcnJpZGVNZXNzYWdlSGFuZGxlcnM8VD4oX21lc3NhZ2VIYW5kbGVyczogTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXI8VD4+KTogdm9pZCB7XG4gICAgdGhpcy5hc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2Uub3ZlcnJpZGVNZXNzYWdlSGFuZGxlcnMoX21lc3NhZ2VIYW5kbGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG4gICAqIElmIGEgbGlzdGVuZXIgZm9yIHRoaXMgc2FtZSBldmVudCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBvdmVycmlkZGVuLlxuICAgKiBJZiB0aGUgbGlzdGVuZXIgaGFzIFwiaXNHbG9iYWxIYW5kbGVyXCIgc2V0IHRvIHRydWUsIGl0IHdpbGwgYmUgcmVnaXN0ZXJlZCB0byB0aGUgaHViIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSBldmVudE5hbWUgTmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIGV2ZW50SGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWRcbiAgICovXG4gIGFkZE1lc3NhZ2VIYW5kbGVyPFQ+KGV2ZW50TmFtZTogc3RyaW5nLCBldmVudEhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5hc3Npc3RhbnRXc0ZyYW1lc1NlcnZpY2UuYWRkTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGV2ZW50IGZyb20gdGhlIF9tZXNzYWdlSGFuZGxlcnMgbWFwIGFuZCB1bnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgdGhpcyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZvclxuICAgKi9cbiAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lzdGFudFdzRnJhbWVzU2VydmljZS5yZW1vdmVNZXNzYWdlSGFuZGxlcihldmVudE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29ubmVjdGlvbiB0byB0aGUgc2lnbmFsUiB3ZWJzb2NrZXQgYW5kIHJlZ2lzdGVyIGRlZmF1bHQgbGlzdGVuZXJzIHRvIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlcnZlciBodWIgY2xhc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLiBJdCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICAgKiBAcGFyYW0gbG9nTGV2ZWwgRGVmaW5lIHRoZSBsb2cgbGV2ZWwgZGlzcGxheWVkIGluIHRoZSBjb25zb2xlXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGJ1aWx0XG4gICAqL1xuICBidWlsZENvbm5lY3Rpb24ob3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUkNvbm5lY3Rpb25TZXJ2aWNlLmJ1aWxkQ29ubmVjdGlvbihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgY29ubmVjdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBzdGFydGVkXG4gICAqL1xuICBzdGFydENvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUkNvbm5lY3Rpb25TZXJ2aWNlLnN0YXJ0Q29ubmVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RvcHBlZFxuICAgKi9cbiAgc3RvcENvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUkNvbm5lY3Rpb25TZXJ2aWNlLnN0b3BDb25uZWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gYXVkaXQgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgZGV0YWlscy4gVGhlIGdlbmVyYXRlZCBhdWRpdCBldmVudCBpcyBzZW50IGFmdGVyd2FyZHMgdmlhIHRoZSBBdWRpdFdlYlNlcnZpY2VcbiAgICogQHBhcmFtIHR5cGUgQXVkaXQgZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0gZGV0YWlscyBBdWRpdCBldmVudCBkZXRhaWxzXG4gICAqIEBwYXJhbSBpZCBBY3Rpb25zIChzYXZlZENoYXQgZGVsZXRlL3JlbmFtZS8uLi4pIG1heSBvY2N1ciBvbiBhIHNwZWNpZmljIGNoYXQgZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgb25lIHN0b3JlZCBpbiB0aGlzIHNlcnZpY2UsIHNvIHRoZSBjaGF0IGlkIGNhbiBiZSBwcm92aWRlZFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVBdWRpdEV2ZW50KHR5cGU6IHN0cmluZywgZGV0YWlsczogUmVjb3JkPHN0cmluZywgYW55PiwgaWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlRGV0YWlscyA9IHtcbiAgICAgIFwidXJsXCI6IGRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZiksXG4gICAgICBcImFwcFwiOiB0aGlzLmFwcFNlcnZpY2UuYXBwTmFtZSxcbiAgICAgIFwidXNlci1pZFwiOiB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsPy51c2VySWQsXG4gICAgICBcImluc3RhbmNlLWlkXCI6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBcImNoYXQtaWRcIjogaWQgfHwgdGhpcy5jaGF0SWQsXG4gICAgICBcInNlcnZpY2UtaWRcIjogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLnNlcnZpY2VfaWQsXG4gICAgICBcIm1vZGVsLWlkXCI6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZFxuICAgIH07XG5cbiAgICBpZiAodHlwZSA9PT0gXCJhc3QtbWVzc2FnZS5tZXNzYWdlXCIpIHtcbiAgICAgIGJhc2VEZXRhaWxzW1wiaXMtdXNlci1pbnB1dFwiXSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGF1ZGl0ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIGRldGFpbDoge1xuICAgICAgICAuLi5iYXNlRGV0YWlscyxcbiAgICAgICAgLi4uZGV0YWlsc1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBBdWRpdC5ub3RpZnkoYXVkaXQpO1xuICB9XG5cbn1cbiJdfQ==