ngx-histaff-alpha 2.3.8 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Component, Input, ViewChild, isDevMode, forwardRef } from '@angular/core';
1
+ import { Component, Input, ViewChild, isDevMode } from '@angular/core';
2
2
  import { CoreFormControlBaseComponent } from '../../core-form-control-base/core-form-control-base.component';
3
3
  import { FormsModule, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';
4
4
  import { alertOptions, noneAutoClosedAlertOptions } from '../../../constants/alertOptions';
@@ -16,13 +16,14 @@ import * as i1 from "../../alert/alert.service";
16
16
  import * as i2 from "../../../services/multi-language.service";
17
17
  import * as i3 from "../../../services/app-config.service";
18
18
  import * as i4 from "../../../services/uploaded-file.service";
19
- import * as i5 from "@angular/common";
20
- import * as i6 from "@angular/forms";
19
+ import * as i5 from "../../services/dom.service";
20
+ import * as i6 from "@angular/common";
21
+ import * as i7 from "@angular/forms";
21
22
  export class CoreAttachmentComponent extends CoreFormControlBaseComponent {
22
23
  writeValue(obj) {
23
- this.valueToShow = obj?.serverFileName;
24
+ this.valueToShow = obj?.serverFileName || '';
24
25
  }
25
- constructor(injector, alertService, mls, appConfigService, uploadedFileService, renderer) {
26
+ constructor(injector, alertService, mls, appConfigService, uploadedFileService, renderer, domService) {
26
27
  super();
27
28
  this.injector = injector;
28
29
  this.alertService = alertService;
@@ -30,8 +31,10 @@ export class CoreAttachmentComponent extends CoreFormControlBaseComponent {
30
31
  this.appConfigService = appConfigService;
31
32
  this.uploadedFileService = uploadedFileService;
32
33
  this.renderer = renderer;
34
+ this.domService = domService;
33
35
  this.dropdownHeight = 0;
34
36
  this.dropdownPadding = 0;
37
+ this.dropdownZIndex = 1;
35
38
  }
36
39
  ngOnChanges(changes) {
37
40
  if (changes['valueToShow']) {
@@ -40,7 +43,7 @@ export class CoreAttachmentComponent extends CoreFormControlBaseComponent {
40
43
  }
41
44
  }
42
45
  ngOnInit() {
43
- setTimeout(() => this.ngControl = this.injector.get(NgControl), 200);
46
+ this.ngControl = this.injector.get(NgControl);
44
47
  if (!!!this.assignTo && !!!this.readonly && isDevMode()) {
45
48
  this.alertService.error(`
46
49
  CoreAttachmentComponent required input 'assignTo'
@@ -55,6 +58,7 @@ export class CoreAttachmentComponent extends CoreFormControlBaseComponent {
55
58
  this.dropdownPadding = 0;
56
59
  }
57
60
  });
61
+ this.dropdownZIndex = this.domService.getMaxZIndex() + 1;
58
62
  });
59
63
  }
60
64
  onClickUpload() {
@@ -137,14 +141,28 @@ export class CoreAttachmentComponent extends CoreFormControlBaseComponent {
137
141
  }
138
142
  }
139
143
  }
140
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreAttachmentComponent, deps: [{ token: i0.Injector }, { token: i1.AlertService }, { token: i2.MultiLanguageService }, { token: i3.AppConfigService }, { token: i4.UploadedFileService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
144
+ clear() {
145
+ this.value = null;
146
+ this.valueToShow = '';
147
+ this.onChange(null);
148
+ const sibling = this.ngControl.control?.parent?.get(this.assignTo);
149
+ if (!sibling) {
150
+ if (isDevMode()) {
151
+ this.alertService.error(`Chưa khai báo field '${this.assignTo}'`, noneAutoClosedAlertOptions);
152
+ }
153
+ }
154
+ else {
155
+ sibling.patchValue(null);
156
+ }
157
+ }
158
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreAttachmentComponent, deps: [{ token: i0.Injector }, { token: i1.AlertService }, { token: i2.MultiLanguageService }, { token: i3.AppConfigService }, { token: i4.UploadedFileService }, { token: i0.Renderer2 }, { token: i5.DomService }], target: i0.ɵɵFactoryTarget.Component }); }
141
159
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.3", type: CoreAttachmentComponent, isStandalone: true, selector: "core-attachment", inputs: { assignTo: "assignTo", readonly: "readonly", valueToShow: "valueToShow" }, providers: [
142
160
  {
143
161
  provide: NG_VALUE_ACCESSOR,
144
162
  multi: true,
145
- useExisting: forwardRef(() => CoreAttachmentComponent),
163
+ useExisting: CoreAttachmentComponent,
146
164
  }
147
- ], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "rawInput", first: true, predicate: ["rawInput"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #container class=\"core-attachment-container\">\r\n <input id=\"rawInput\" #rawInput type=\"file\" (change)=\"handleInputChange($event)\">\r\n <div class=\"form-control\" type=\"text\" [(ngModel)]=\"valueToShow\" readonly [class.form-control-disabled]=\"disabled\">\r\n <div class=\"text-to-show\" [appTooltip]=\"valueToShow | uploadedFilenameCutoff\">{{ valueToShow |\r\n uploadedFilenameCutoff}}</div>\r\n </div>\r\n <div class=\"upload-icon-wrapper\" (click)=\"onClickUpload()\" [class.opacity0]=\"readonly\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-upload\"></i>\r\n </div>\r\n </div>\r\n @if (!!valueToShow && !!!touched) {\r\n <div class=\"download-icon-wrapper\" (click)=\"onClickDownload()\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-download\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"dropdown\" [ngStyle]=\"{ height: dropdownHeight + 'px', padding: dropdownPadding + 'px' }\">\r\n @if (previewable) {\r\n <img [src]=\"valueToShow | mapAttachmentToServer\" imageErrorResolver />\r\n }\r\n </div>\r\n\r\n</div>", styles: [".core-attachment-container{--height: 35px;display:block;position:relative;background-color:#fff;width:100%}.core-attachment-container .dropdown{box-sizing:border-box;display:block;position:absolute;width:100%;overflow:hidden;background-color:#fff;font-size:15px;box-shadow:0 1rem 3rem #0000002e;transition:height .25s linear;z-index:calc(var(--max-z-index) + 1)}.core-attachment-container .dropdown img{transform:none;max-width:100%;max-height:170px}.core-attachment-container .dropdown img:hover{transform:none}.core-attachment-container #rawInput{display:none}.core-attachment-container .text-to-show{width:calc(100% - 60px);height:calc(var(--height) - 12px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transform:translate(30px)}.core-attachment-container>.upload-icon-wrapper{right:3px;top:3px}.core-attachment-container>.download-icon-wrapper{left:3px;top:3px}.core-attachment-container>.upload-icon-wrapper,.core-attachment-container>.download-icon-wrapper{display:block;position:absolute;background-color:#e9e9e9;width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);border-radius:.275rem;cursor:pointer}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper,.core-attachment-container>.download-icon-wrapper>.flex-wrapper{width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);display:flex;align-items:center;justify-content:center}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper>i,.core-attachment-container>.download-icon-wrapper>.flex-wrapper>i{color:#848484;font-size:20px}.core-attachment-container .source-container{display:block;background-color:var(--color-bg-main);padding:var(--size-layout-block-cell-spacing);max-width:1200px;max-height:800px;overflow:hidden;border-radius:10px}.core-attachment-container .source-container i{font-size:20px;cursor:pointer;float:right}.core-attachment-container .source-container.d-none{display:none}.core-attachment-container .source-container>caption{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "position"] }, { kind: "pipe", type: UploadedFilenameCutoffPipe, name: "uploadedFilenameCutoff" }, { kind: "pipe", type: MapAttachmentToServerPipe, name: "mapAttachmentToServer" }] }); }
165
+ ], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "rawInput", first: true, predicate: ["rawInput"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #container class=\"core-attachment-container\">\r\n <input id=\"rawInput\" #rawInput type=\"file\" (change)=\"handleInputChange($event)\">\r\n <div class=\"form-control\" type=\"text\" ngDefaultControl [(ngModel)]=\"valueToShow\" readonly\r\n [class.form-control-disabled]=\"disabled\">\r\n <div class=\"text-to-show\" [appTooltip]=\"valueToShow | uploadedFilenameCutoff\" [ngStyle]=\"{\r\n transform: (!!valueToShow && !!!touched) ? 'translate(30px)' : 'translate(0px)'\r\n }\">\r\n {{ valueToShow | uploadedFilenameCutoff }}\r\n </div>\r\n @if (!!valueToShow) {\r\n <i class=\"feather-x\" (click)=\"clear()\"></i>\r\n }\r\n </div>\r\n <div class=\"upload-icon-wrapper\" (click)=\"onClickUpload()\" [class.opacity0]=\"readonly\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-upload\"></i>\r\n </div>\r\n </div>\r\n @if (!!valueToShow && !!!touched) {\r\n <div class=\"download-icon-wrapper\" (click)=\"onClickDownload()\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-download\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"dropdown\" [ngStyle]=\"{ height: dropdownHeight + 'px', padding: dropdownPadding + 'px', zIndex: dropdownZIndex }\">\r\n @if (previewable) {\r\n <img [src]=\"valueToShow | mapAttachmentToServer\" imageErrorResolver />\r\n }\r\n </div>\r\n\r\n</div>", styles: [".core-attachment-container{--height: 35px;display:block;position:relative;background-color:#fff;width:100%}.core-attachment-container .dropdown{box-sizing:border-box;display:block;position:absolute;width:100%;overflow:hidden;background-color:#fff;font-size:15px;box-shadow:0 1rem 3rem #0000002e;transition:height .25s linear;z-index:calc(var(--max-z-index) + 1)}.core-attachment-container .dropdown img{transform:none;max-width:100%;max-height:170px}.core-attachment-container .dropdown img:hover{transform:none}.core-attachment-container #rawInput{display:none}.core-attachment-container .text-to-show{width:calc(100% - 70px);height:calc(var(--height) - 12px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.core-attachment-container i.feather-x{display:block;position:absolute;right:35px;top:5px;z-index:1;font-size:24px;color:#d3d3d3;cursor:pointer}.core-attachment-container>.upload-icon-wrapper{right:3px;top:3px}.core-attachment-container>.download-icon-wrapper{left:3px;top:3px}.core-attachment-container>.upload-icon-wrapper,.core-attachment-container>.download-icon-wrapper{display:block;position:absolute;background-color:#e9e9e9;width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);border-radius:.275rem;cursor:pointer}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper,.core-attachment-container>.download-icon-wrapper>.flex-wrapper{width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);display:flex;align-items:center;justify-content:center}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper>i,.core-attachment-container>.download-icon-wrapper>.flex-wrapper>i{color:#848484;font-size:20px}.core-attachment-container .source-container{display:block;background-color:var(--color-bg-main);padding:var(--size-layout-block-cell-spacing);max-width:1200px;max-height:800px;overflow:hidden;border-radius:10px}.core-attachment-container .source-container i{font-size:20px;cursor:pointer;float:right}.core-attachment-container .source-container.d-none{display:none}.core-attachment-container .source-container>caption{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "position"] }, { kind: "pipe", type: UploadedFilenameCutoffPipe, name: "uploadedFilenameCutoff" }, { kind: "pipe", type: MapAttachmentToServerPipe, name: "mapAttachmentToServer" }] }); }
148
166
  }
149
167
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreAttachmentComponent, decorators: [{
150
168
  type: Component,
@@ -159,10 +177,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
159
177
  {
160
178
  provide: NG_VALUE_ACCESSOR,
161
179
  multi: true,
162
- useExisting: forwardRef(() => CoreAttachmentComponent),
180
+ useExisting: CoreAttachmentComponent,
163
181
  }
164
- ], template: "<div #container class=\"core-attachment-container\">\r\n <input id=\"rawInput\" #rawInput type=\"file\" (change)=\"handleInputChange($event)\">\r\n <div class=\"form-control\" type=\"text\" [(ngModel)]=\"valueToShow\" readonly [class.form-control-disabled]=\"disabled\">\r\n <div class=\"text-to-show\" [appTooltip]=\"valueToShow | uploadedFilenameCutoff\">{{ valueToShow |\r\n uploadedFilenameCutoff}}</div>\r\n </div>\r\n <div class=\"upload-icon-wrapper\" (click)=\"onClickUpload()\" [class.opacity0]=\"readonly\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-upload\"></i>\r\n </div>\r\n </div>\r\n @if (!!valueToShow && !!!touched) {\r\n <div class=\"download-icon-wrapper\" (click)=\"onClickDownload()\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-download\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"dropdown\" [ngStyle]=\"{ height: dropdownHeight + 'px', padding: dropdownPadding + 'px' }\">\r\n @if (previewable) {\r\n <img [src]=\"valueToShow | mapAttachmentToServer\" imageErrorResolver />\r\n }\r\n </div>\r\n\r\n</div>", styles: [".core-attachment-container{--height: 35px;display:block;position:relative;background-color:#fff;width:100%}.core-attachment-container .dropdown{box-sizing:border-box;display:block;position:absolute;width:100%;overflow:hidden;background-color:#fff;font-size:15px;box-shadow:0 1rem 3rem #0000002e;transition:height .25s linear;z-index:calc(var(--max-z-index) + 1)}.core-attachment-container .dropdown img{transform:none;max-width:100%;max-height:170px}.core-attachment-container .dropdown img:hover{transform:none}.core-attachment-container #rawInput{display:none}.core-attachment-container .text-to-show{width:calc(100% - 60px);height:calc(var(--height) - 12px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transform:translate(30px)}.core-attachment-container>.upload-icon-wrapper{right:3px;top:3px}.core-attachment-container>.download-icon-wrapper{left:3px;top:3px}.core-attachment-container>.upload-icon-wrapper,.core-attachment-container>.download-icon-wrapper{display:block;position:absolute;background-color:#e9e9e9;width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);border-radius:.275rem;cursor:pointer}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper,.core-attachment-container>.download-icon-wrapper>.flex-wrapper{width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);display:flex;align-items:center;justify-content:center}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper>i,.core-attachment-container>.download-icon-wrapper>.flex-wrapper>i{color:#848484;font-size:20px}.core-attachment-container .source-container{display:block;background-color:var(--color-bg-main);padding:var(--size-layout-block-cell-spacing);max-width:1200px;max-height:800px;overflow:hidden;border-radius:10px}.core-attachment-container .source-container i{font-size:20px;cursor:pointer;float:right}.core-attachment-container .source-container.d-none{display:none}.core-attachment-container .source-container>caption{display:block;width:100%}\n"] }]
165
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.AlertService }, { type: i2.MultiLanguageService }, { type: i3.AppConfigService }, { type: i4.UploadedFileService }, { type: i0.Renderer2 }], propDecorators: { assignTo: [{
182
+ ], template: "<div #container class=\"core-attachment-container\">\r\n <input id=\"rawInput\" #rawInput type=\"file\" (change)=\"handleInputChange($event)\">\r\n <div class=\"form-control\" type=\"text\" ngDefaultControl [(ngModel)]=\"valueToShow\" readonly\r\n [class.form-control-disabled]=\"disabled\">\r\n <div class=\"text-to-show\" [appTooltip]=\"valueToShow | uploadedFilenameCutoff\" [ngStyle]=\"{\r\n transform: (!!valueToShow && !!!touched) ? 'translate(30px)' : 'translate(0px)'\r\n }\">\r\n {{ valueToShow | uploadedFilenameCutoff }}\r\n </div>\r\n @if (!!valueToShow) {\r\n <i class=\"feather-x\" (click)=\"clear()\"></i>\r\n }\r\n </div>\r\n <div class=\"upload-icon-wrapper\" (click)=\"onClickUpload()\" [class.opacity0]=\"readonly\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-upload\"></i>\r\n </div>\r\n </div>\r\n @if (!!valueToShow && !!!touched) {\r\n <div class=\"download-icon-wrapper\" (click)=\"onClickDownload()\">\r\n <div class=\"flex-wrapper\">\r\n <i class=\"feather-download\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"dropdown\" [ngStyle]=\"{ height: dropdownHeight + 'px', padding: dropdownPadding + 'px', zIndex: dropdownZIndex }\">\r\n @if (previewable) {\r\n <img [src]=\"valueToShow | mapAttachmentToServer\" imageErrorResolver />\r\n }\r\n </div>\r\n\r\n</div>", styles: [".core-attachment-container{--height: 35px;display:block;position:relative;background-color:#fff;width:100%}.core-attachment-container .dropdown{box-sizing:border-box;display:block;position:absolute;width:100%;overflow:hidden;background-color:#fff;font-size:15px;box-shadow:0 1rem 3rem #0000002e;transition:height .25s linear;z-index:calc(var(--max-z-index) + 1)}.core-attachment-container .dropdown img{transform:none;max-width:100%;max-height:170px}.core-attachment-container .dropdown img:hover{transform:none}.core-attachment-container #rawInput{display:none}.core-attachment-container .text-to-show{width:calc(100% - 70px);height:calc(var(--height) - 12px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.core-attachment-container i.feather-x{display:block;position:absolute;right:35px;top:5px;z-index:1;font-size:24px;color:#d3d3d3;cursor:pointer}.core-attachment-container>.upload-icon-wrapper{right:3px;top:3px}.core-attachment-container>.download-icon-wrapper{left:3px;top:3px}.core-attachment-container>.upload-icon-wrapper,.core-attachment-container>.download-icon-wrapper{display:block;position:absolute;background-color:#e9e9e9;width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);border-radius:.275rem;cursor:pointer}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper,.core-attachment-container>.download-icon-wrapper>.flex-wrapper{width:calc(var(--height) - 6px);height:calc(var(--height) - 6px);display:flex;align-items:center;justify-content:center}.core-attachment-container>.upload-icon-wrapper>.flex-wrapper>i,.core-attachment-container>.download-icon-wrapper>.flex-wrapper>i{color:#848484;font-size:20px}.core-attachment-container .source-container{display:block;background-color:var(--color-bg-main);padding:var(--size-layout-block-cell-spacing);max-width:1200px;max-height:800px;overflow:hidden;border-radius:10px}.core-attachment-container .source-container i{font-size:20px;cursor:pointer;float:right}.core-attachment-container .source-container.d-none{display:none}.core-attachment-container .source-container>caption{display:block;width:100%}\n"] }]
183
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.AlertService }, { type: i2.MultiLanguageService }, { type: i3.AppConfigService }, { type: i4.UploadedFileService }, { type: i0.Renderer2 }, { type: i5.DomService }], propDecorators: { assignTo: [{
166
184
  type: Input
167
185
  }], readonly: [{
168
186
  type: Input
@@ -175,4 +193,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
175
193
  type: ViewChild,
176
194
  args: ['rawInput']
177
195
  }] } });
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS1hdHRhY2htZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLWF0dGFjaG1lbnQvY29yZS1hdHRhY2htZW50L2NvcmUtYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaGlzdGFmZi1hbHBoYS9zcmMvbGliL2FwcC9saWJyYXJpZXMvY29yZS1hdHRhY2htZW50L2NvcmUtYXR0YWNobWVudC9jb3JlLWF0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQW1DLEtBQUssRUFBb0MsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckssT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDN0csT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUkzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVwRSxPQUFP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QUM7YUFDdkQ7U0FDRixxUUMvQ0gsdXFDQXlCTSwyL0RET0YsWUFBWSxtSEFDWixXQUFXLCtWQUNYLGdCQUFnQixzR0FDaEIsMEJBQTBCLDBEQUMxQix5QkFBeUI7OzJGQWFoQix1QkFBdUI7a0JBckJuQyxTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQiwwQkFBMEI7d0JBQzFCLHlCQUF5Qjt3QkFDekIsMkJBQTJCO3FCQUM1QixhQUdVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFDO3lCQUN2RDtxQkFDRjtvT0FHUSxRQUFRO3NCQUFoQixLQUFLO2dCQUNZLFFBQVE7c0JBQXpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFa0IsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQWVDLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGlzRGV2TW9kZSwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb3JlRm9ybUNvbnRyb2xCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS1mb3JtLWNvbnRyb2wtYmFzZS9jb3JlLWZvcm0tY29udHJvbC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTXVsdGlMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tdWx0aS1sYW5ndWFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FwcC1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IGFsZXJ0T3B0aW9ucywgbm9uZUF1dG9DbG9zZWRBbGVydE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYWxlcnRPcHRpb25zJztcclxuaW1wb3J0IHsgYXR0YWNobWVudE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYXR0YWNobWVudE9wdGlvbnMnO1xyXG5pbXBvcnQgeyBFbnVtVHJhbnNsYXRlS2V5IH0gZnJvbSBcImFscGhhLWdsb2JhbC1jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgYmxvYl90b19iYXNlNjRfc2NyaXB0IH0gZnJvbSAnLi4vLi4vLi4vLi4vYXNzZXRzL2pzL2Jsb2IyYmFzZTY0X3drJztcclxuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3Rvb2x0aXAvdG9vbHRpcC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHsgY29yZUZpbGVVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uL2Fzc2V0cy9qcy9jb3JlRmlsZVV0aWxzJztcclxuXHJcbmltcG9ydCB7IFVwbG9hZGVkRmlsZW5hbWVDdXRvZmZQaXBlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLXBpcGVzL3VwbG9hZGVkLWZpbGVuYW1lLWN1dG9mZi5waXBlJztcclxuaW1wb3J0IHsgVXBsb2FkZWRGaWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3VwbG9hZGVkLWZpbGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hcEF0dGFjaG1lbnRUb1NlcnZlclBpcGUgfSBmcm9tICcuLi8uLi8uLi9hcHAtcGlwZXMvbWFwLWF0dGFjaG1lbnQtdG8tc2VydmVyLnBpcGUnO1xyXG5pbXBvcnQgeyBJbWFnZUVycm9yUmVzb2x2ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL2ltYWdlLWVycm9yLXJlc29sdmVyLmRpcmVjdGl2ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb3JlQXR0YWNobWVudCB7XHJcbiAgYXNzaWduVG86IHN0cmluZztcclxuICBzZXJ2ZXJGaWxlTmFtZT86IHN0cmluZztcclxuICBjbGllbnRGaWxlTmFtZTogc3RyaW5nO1xyXG4gIGNsaWVudEZpbGVUeXBlOiBzdHJpbmc7XHJcbiAgY2xpZW50RmlsZURhdGE6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjb3JlLWF0dGFjaG1lbnQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBUb29sdGlwRGlyZWN0aXZlLFxyXG4gICAgVXBsb2FkZWRGaWxlbmFtZUN1dG9mZlBpcGUsXHJcbiAgICBNYXBBdHRhY2htZW50VG9TZXJ2ZXJQaXBlLFxyXG4gICAgSW1hZ2VFcnJvclJlc29sdmVyRGlyZWN0aXZlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29yZS1hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb3JlLWF0dGFjaG1lbnQuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb3JlQXR0YWNobWVudENvbXBvbmVudCksXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29yZUF0dGFjaG1lbnRDb21wb25lbnQgZXh0ZW5kcyBDb3JlRm9ybUNvbnRyb2xCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIGFzc2lnblRvITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHJlYWRvbmx5ITogYm9vbGVhbjtcclxuICBASW5wdXQoKSB2YWx1ZVRvU2hvdyE6IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyITogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJldmlld2FibGUhOiBib29sZWFuO1xyXG5cclxuICBvdmVycmlkZSB2YWx1ZSE6IElDb3JlQXR0YWNobWVudCB8IG51bGw7XHJcbiAgb3ZlcnJpZGUgb25DaGFuZ2UhOiAoXzogSUNvcmVBdHRhY2htZW50IHwgbnVsbCkgPT4gdm9pZDtcclxuXHJcbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZShvYmo6IElDb3JlQXR0YWNobWVudCB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWVUb1Nob3cgPSBvYmo/LnNlcnZlckZpbGVOYW1lIVxyXG4gIH1cclxuXHJcbiAgbmdDb250cm9sITogTmdDb250cm9sO1xyXG5cclxuICB3b3JrZXIhOiBXb3JrZXI7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3Jhd0lucHV0JykgcmF3SW5wdXQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBsaXN0ZW5lckZuITogKCkgPT4gdm9pZDtcclxuXHJcbiAgZHJvcGRvd25IZWlnaHQ6IG51bWJlciA9IDA7XHJcbiAgZHJvcGRvd25QYWRkaW5nOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgbWxzOiBNdWx0aUxhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBwQ29uZmlnU2VydmljZTogQXBwQ29uZmlnU2VydmljZSxcclxuICAgIHByaXZhdGUgdXBsb2FkZWRGaWxlU2VydmljZTogVXBsb2FkZWRGaWxlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICApIHtcclxuICAgIHN1cGVyKClcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZVRvU2hvdyddKSB7XHJcbiAgICAgIHRoaXMudmFsdWVUb1Nob3cgPSBjaGFuZ2VzWyd2YWx1ZVRvU2hvdyddPy5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMucHJldmlld2FibGUgPSB0aGlzLnVwbG9hZGVkRmlsZVNlcnZpY2UuY2FuUHJldmlld0FzSW1hZ2UodGhpcy52YWx1ZVRvU2hvdyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpLCAyMDApO1xyXG5cclxuICAgIGlmICghISF0aGlzLmFzc2lnblRvICYmICEhIXRoaXMucmVhZG9ubHkgJiYgaXNEZXZNb2RlKCkpIHtcclxuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoYFxyXG4gICAgICBDb3JlQXR0YWNobWVudENvbXBvbmVudCByZXF1aXJlZCBpbnB1dCAnYXNzaWduVG8nXHJcbiAgICAgIGAsIG5vbmVBdXRvQ2xvc2VkQWxlcnRPcHRpb25zKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGVuZXJGbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAnY2xpY2snLCAoZTogRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgJiYgISEhdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkpIHtcclxuICAgICAgICAgIHRoaXMuZHJvcGRvd25IZWlnaHQgPSAwO1xyXG4gICAgICAgICAgdGhpcy5kcm9wZG93blBhZGRpbmcgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb25DbGlja1VwbG9hZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcclxuICAgIHRoaXMuZHJvcGRvd25IZWlnaHQgPSAwO1xyXG4gICAgdGhpcy5kcm9wZG93blBhZGRpbmcgPSAwO1xyXG4gICAgdGhpcy5yYXdJbnB1dC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0Rvd25sb2FkKCk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZVNlcnZpY2UuY2FuUHJldmlld0FzSW1hZ2UodGhpcy52YWx1ZVRvU2hvdykpIHtcclxuXHJcbiAgICAgIHRoaXMuZHJvcGRvd25IZWlnaHQgPSB0aGlzLmRyb3Bkb3duSGVpZ2h0ID09PSAwID8gMjAwIDogMDtcclxuICAgICAgdGhpcy5kcm9wZG93blBhZGRpbmcgPSB0aGlzLmRyb3Bkb3duUGFkZGluZyA9PT0gMCA/IDE1IDogMDtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgdXJpID0gdGhpcy5hcHBDb25maWdTZXJ2aWNlLkJBU0VfVVJMICsgJy8nICsgdGhpcy5hcHBDb25maWdTZXJ2aWNlLlNUQVRJQ19GT0xERVIgKyAnL2F0dGFjaG1lbnRzLycgKyB0aGlzLnZhbHVlVG9TaG93XHJcbiAgICAgIGZldGNoKHVyaSlcclxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpXHJcbiAgICAgICAgLnRoZW4oYmxvYiA9PiB7XHJcbiAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgICAgbGluay5kb3dubG9hZCA9IHRoaXMudmFsdWVUb1Nob3cuc3Vic3RyaW5nKDUyKTtcclxuICAgICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChjb25zb2xlLmVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBpc1ByZXZpZXdhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucHJldmlld2FibGVcclxuICB9XHJcblxyXG4gIGhhbmRsZUlucHV0Q2hhbmdlKGU6IGFueSkge1xyXG5cclxuICAgIGlmICghIWUudGFyZ2V0LmZpbGVzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XHJcblxyXG4gICAgICBpZiAoZmlsZS5zaXplID4gYXR0YWNobWVudE9wdGlvbnMubWF4RmlsZVNpemUpIHtcclxuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihgJHt0aGlzLm1scy50cmFucyhFbnVtVHJhbnNsYXRlS2V5LlVJX0NPUkVfQVRUQUNITUVOVF9NQVhJTVVNX0FUVEFDSE1FTlRfRklMRV9TSVpFX0VSUk9SKX0gKCR7YXR0YWNobWVudE9wdGlvbnMubWF4RmlsZVNpemV9IGJ5dGVzKWAsIGFsZXJ0T3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhcImZpbGVcIiwgZmlsZSlcclxuICAgICAgY29uc3QgY2xpZW50RmlsZU5hbWUgPSBmaWxlLm5hbWVcclxuICAgICAgY29uc3QgY2xpZW50RmlsZVR5cGUgPSBmaWxlLnR5cGVcclxuICAgICAgbGV0IGNsaWVudEZpbGVEYXRhID0gXCJcIlxyXG5cclxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlXSk7XHJcbiAgICAgIGlmICh0eXBlb2YgV29ya2VyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihibG9iX3RvX2Jhc2U2NF9zY3JpcHQpXHJcbiAgICAgICAgdGhpcy53b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZSA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJ3b3JrZXIgbWVzc2FnZVwiLCBlKVxyXG4gICAgICAgICAgY2xpZW50RmlsZURhdGEgPSBlLmRhdGFcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gKGNsaWVudEZpbGVEYXRhIGFzIHN0cmluZykuaW5kZXhPZignYmFzZTY0LCcpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgY2xpZW50RmlsZURhdGEgPSAoY2xpZW50RmlsZURhdGEgYXMgc3RyaW5nKS5zdWJzdHJpbmcoaW5kZXggKyA3KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub25DaGFuZ2Uoe1xyXG4gICAgICAgICAgICBhc3NpZ25UbzogdGhpcy5hc3NpZ25UbyxcclxuICAgICAgICAgICAgc2VydmVyRmlsZU5hbWU6IHRoaXMudmFsdWU/LnNlcnZlckZpbGVOYW1lLFxyXG4gICAgICAgICAgICBjbGllbnRGaWxlTmFtZSxcclxuICAgICAgICAgICAgY2xpZW50RmlsZVR5cGUsXHJcbiAgICAgICAgICAgIGNsaWVudEZpbGVEYXRhLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlVG9TaG93ID0gY2xpZW50RmlsZU5hbWU7XHJcbiAgICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKGJsb2IpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvcmVGaWxlVXRpbHMucHJvdG90eXBlLmJsb2JUb0Jhc2U2NChibG9iKS50aGVuKChjbGllbnRGaWxlRGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IChjbGllbnRGaWxlRGF0YSBhcyBzdHJpbmcpLmluZGV4T2YoJ2Jhc2U2NCwnKTtcclxuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNsaWVudEZpbGVEYXRhID0gKGNsaWVudEZpbGVEYXRhIGFzIHN0cmluZykuc3Vic3RyaW5nKGluZGV4ICsgNyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHtcclxuICAgICAgICAgICAgYXNzaWduVG86IHRoaXMuYXNzaWduVG8sXHJcbiAgICAgICAgICAgIHNlcnZlckZpbGVOYW1lOiB0aGlzLnZhbHVlPy5zZXJ2ZXJGaWxlTmFtZSxcclxuICAgICAgICAgICAgY2xpZW50RmlsZU5hbWUsXHJcbiAgICAgICAgICAgIGNsaWVudEZpbGVUeXBlLFxyXG4gICAgICAgICAgICBjbGllbnRGaWxlRGF0YSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy52YWx1ZVRvU2hvdyA9IGNsaWVudEZpbGVOYW1lO1xyXG4gICAgICAgICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG4iLCI8ZGl2ICNjb250YWluZXIgY2xhc3M9XCJjb3JlLWF0dGFjaG1lbnQtY29udGFpbmVyXCI+XHJcbiAgICA8aW5wdXQgaWQ9XCJyYXdJbnB1dFwiICNyYXdJbnB1dCB0eXBlPVwiZmlsZVwiIChjaGFuZ2UpPVwiaGFuZGxlSW5wdXRDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVRvU2hvd1wiIHJlYWRvbmx5IFtjbGFzcy5mb3JtLWNvbnRyb2wtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10by1zaG93XCIgW2FwcFRvb2x0aXBdPVwidmFsdWVUb1Nob3cgfCB1cGxvYWRlZEZpbGVuYW1lQ3V0b2ZmXCI+e3sgdmFsdWVUb1Nob3cgfFxyXG4gICAgICAgICAgICB1cGxvYWRlZEZpbGVuYW1lQ3V0b2ZmfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInVwbG9hZC1pY29uLXdyYXBwZXJcIiAoY2xpY2spPVwib25DbGlja1VwbG9hZCgpXCIgW2NsYXNzLm9wYWNpdHkwXT1cInJlYWRvbmx5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZlYXRoZXItdXBsb2FkXCI+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBAaWYgKCEhdmFsdWVUb1Nob3cgJiYgISEhdG91Y2hlZCkge1xyXG4gICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLWljb24td3JhcHBlclwiIChjbGljayk9XCJvbkNsaWNrRG93bmxvYWQoKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmZWF0aGVyLWRvd25sb2FkXCI+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGRyb3Bkb3duSGVpZ2h0ICsgJ3B4JywgcGFkZGluZzogZHJvcGRvd25QYWRkaW5nICsgJ3B4JyB9XCI+XHJcbiAgICAgICAgQGlmIChwcmV2aWV3YWJsZSkge1xyXG4gICAgICAgIDxpbWcgW3NyY109XCJ2YWx1ZVRvU2hvdyB8IG1hcEF0dGFjaG1lbnRUb1NlcnZlclwiIGltYWdlRXJyb3JSZXNvbHZlciAvPlxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+Il19
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS1hdHRhY2htZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLWF0dGFjaG1lbnQvY29yZS1hdHRhY2htZW50L2NvcmUtYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaGlzdGFmZi1hbHBoYS9zcmMvbGliL2FwcC9saWJyYXJpZXMvY29yZS1hdHRhY2htZW50L2NvcmUtYXR0YWNobWVudC9jb3JlLWF0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQW1DLEtBQUssRUFBb0MsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUloRyxPQUFPLEVBQUUsWUFBWSxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsMEJB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aEMsU0FBUzt1QkFBQyxXQUFXO2dCQWFDLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb3JlRm9ybUNvbnRyb2xCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS1mb3JtLWNvbnRyb2wtYmFzZS9jb3JlLWZvcm0tY29udHJvbC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdDb250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTXVsdGlMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tdWx0aS1sYW5ndWFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FwcC1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IGFsZXJ0T3B0aW9ucywgbm9uZUF1dG9DbG9zZWRBbGVydE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYWxlcnRPcHRpb25zJztcclxuaW1wb3J0IHsgYXR0YWNobWVudE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYXR0YWNobWVudE9wdGlvbnMnO1xyXG5pbXBvcnQgeyBFbnVtVHJhbnNsYXRlS2V5IH0gZnJvbSBcImFscGhhLWdsb2JhbC1jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgYmxvYl90b19iYXNlNjRfc2NyaXB0IH0gZnJvbSAnLi4vLi4vLi4vLi4vYXNzZXRzL2pzL2Jsb2IyYmFzZTY0X3drJztcclxuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3Rvb2x0aXAvdG9vbHRpcC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHsgY29yZUZpbGVVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uL2Fzc2V0cy9qcy9jb3JlRmlsZVV0aWxzJztcclxuXHJcbmltcG9ydCB7IFVwbG9hZGVkRmlsZW5hbWVDdXRvZmZQaXBlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLXBpcGVzL3VwbG9hZGVkLWZpbGVuYW1lLWN1dG9mZi5waXBlJztcclxuaW1wb3J0IHsgVXBsb2FkZWRGaWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3VwbG9hZGVkLWZpbGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hcEF0dGFjaG1lbnRUb1NlcnZlclBpcGUgfSBmcm9tICcuLi8uLi8uLi9hcHAtcGlwZXMvbWFwLWF0dGFjaG1lbnQtdG8tc2VydmVyLnBpcGUnO1xyXG5pbXBvcnQgeyBJbWFnZUVycm9yUmVzb2x2ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL2ltYWdlLWVycm9yLXJlc29sdmVyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IERvbVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kb20uc2VydmljZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb3JlQXR0YWNobWVudCB7XHJcbiAgYXNzaWduVG86IHN0cmluZztcclxuICBzZXJ2ZXJGaWxlTmFtZT86IHN0cmluZztcclxuICBjbGllbnRGaWxlTmFtZTogc3RyaW5nO1xyXG4gIGNsaWVudEZpbGVUeXBlOiBzdHJpbmc7XHJcbiAgY2xpZW50RmlsZURhdGE6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjb3JlLWF0dGFjaG1lbnQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBUb29sdGlwRGlyZWN0aXZlLFxyXG4gICAgVXBsb2FkZWRGaWxlbmFtZUN1dG9mZlBpcGUsXHJcbiAgICBNYXBBdHRhY2htZW50VG9TZXJ2ZXJQaXBlLFxyXG4gICAgSW1hZ2VFcnJvclJlc29sdmVyRGlyZWN0aXZlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29yZS1hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb3JlLWF0dGFjaG1lbnQuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICB1c2VFeGlzdGluZzogQ29yZUF0dGFjaG1lbnRDb21wb25lbnQsXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29yZUF0dGFjaG1lbnRDb21wb25lbnQgZXh0ZW5kcyBDb3JlRm9ybUNvbnRyb2xCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIG5nQ29udHJvbCE6IE5nQ29udHJvbDtcclxuXHJcbiAgQElucHV0KCkgYXNzaWduVG8hOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgb3ZlcnJpZGUgcmVhZG9ubHkhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHZhbHVlVG9TaG93ITogc3RyaW5nO1xyXG5cclxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXIhOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcmV2aWV3YWJsZSE6IGJvb2xlYW47XHJcblxyXG4gIG92ZXJyaWRlIHZhbHVlITogSUNvcmVBdHRhY2htZW50IHwgbnVsbDtcclxuICBvdmVycmlkZSBvbkNoYW5nZSE6IChfOiBJQ29yZUF0dGFjaG1lbnQgfCBudWxsKSA9PiB2b2lkO1xyXG5cclxuICBvdmVycmlkZSB3cml0ZVZhbHVlKG9iajogSUNvcmVBdHRhY2htZW50IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZVRvU2hvdyA9IG9iaj8uc2VydmVyRmlsZU5hbWUgfHwgJydcclxuICB9XHJcblxyXG4gIHdvcmtlciE6IFdvcmtlcjtcclxuXHJcbiAgQFZpZXdDaGlsZCgncmF3SW5wdXQnKSByYXdJbnB1dCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIGxpc3RlbmVyRm4hOiAoKSA9PiB2b2lkO1xyXG5cclxuICBkcm9wZG93bkhlaWdodDogbnVtYmVyID0gMDtcclxuICBkcm9wZG93blBhZGRpbmc6IG51bWJlciA9IDA7XHJcbiAgZHJvcGRvd25aSW5kZXg6IG51bWJlciA9IDE7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtbHM6IE11bHRpTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcHBDb25maWdTZXJ2aWNlOiBBcHBDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1cGxvYWRlZEZpbGVTZXJ2aWNlOiBVcGxvYWRlZEZpbGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBkb21TZXJ2aWNlOiBEb21TZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgc3VwZXIoKVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlVG9TaG93J10pIHtcclxuICAgICAgdGhpcy52YWx1ZVRvU2hvdyA9IGNoYW5nZXNbJ3ZhbHVlVG9TaG93J10/LmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy5wcmV2aWV3YWJsZSA9IHRoaXMudXBsb2FkZWRGaWxlU2VydmljZS5jYW5QcmV2aWV3QXNJbWFnZSh0aGlzLnZhbHVlVG9TaG93KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMubmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sKTtcclxuXHJcbiAgICBpZiAoISEhdGhpcy5hc3NpZ25UbyAmJiAhISF0aGlzLnJlYWRvbmx5ICYmIGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKGBcclxuICAgICAgQ29yZUF0dGFjaG1lbnRDb21wb25lbnQgcmVxdWlyZWQgaW5wdXQgJ2Fzc2lnblRvJ1xyXG4gICAgICBgLCBub25lQXV0b0Nsb3NlZEFsZXJ0T3B0aW9ucylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RlbmVyRm4gPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyICYmICEhIXRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpKSB7XHJcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duSGVpZ2h0ID0gMDtcclxuICAgICAgICAgIHRoaXMuZHJvcGRvd25QYWRkaW5nID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duWkluZGV4ID0gdGhpcy5kb21TZXJ2aWNlLmdldE1heFpJbmRleCgpICsgMTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvbkNsaWNrVXBsb2FkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xyXG4gICAgdGhpcy5kcm9wZG93bkhlaWdodCA9IDA7XHJcbiAgICB0aGlzLmRyb3Bkb3duUGFkZGluZyA9IDA7XHJcbiAgICB0aGlzLnJhd0lucHV0Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRG93bmxvYWQoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlU2VydmljZS5jYW5QcmV2aWV3QXNJbWFnZSh0aGlzLnZhbHVlVG9TaG93KSkge1xyXG5cclxuICAgICAgdGhpcy5kcm9wZG93bkhlaWdodCA9IHRoaXMuZHJvcGRvd25IZWlnaHQgPT09IDAgPyAyMDAgOiAwO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duUGFkZGluZyA9IHRoaXMuZHJvcGRvd25QYWRkaW5nID09PSAwID8gMTUgOiAwO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhciB1cmkgPSB0aGlzLmFwcENvbmZpZ1NlcnZpY2UuQkFTRV9VUkwgKyAnLycgKyB0aGlzLmFwcENvbmZpZ1NlcnZpY2UuU1RBVElDX0ZPTERFUiArICcvYXR0YWNobWVudHMvJyArIHRoaXMudmFsdWVUb1Nob3dcclxuICAgICAgZmV0Y2godXJpKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmJsb2IoKSlcclxuICAgICAgICAudGhlbihibG9iID0+IHtcclxuICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgICBsaW5rLmRvd25sb2FkID0gdGhpcy52YWx1ZVRvU2hvdy5zdWJzdHJpbmcoNTIpO1xyXG4gICAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGlzUHJldmlld2FibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmV2aWV3YWJsZVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlSW5wdXRDaGFuZ2UoZTogYW55KSB7XHJcblxyXG4gICAgaWYgKCEhZS50YXJnZXQuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcclxuXHJcbiAgICAgIGlmIChmaWxlLnNpemUgPiBhdHRhY2htZW50T3B0aW9ucy5tYXhGaWxlU2l6ZSkge1xyXG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKGAke3RoaXMubWxzLnRyYW5zKEVudW1UcmFuc2xhdGVLZXkuVUlfQ09SRV9BVFRBQ0hNRU5UX01BWElNVU1fQVRUQUNITUVOVF9GSUxFX1NJWkVfRVJST1IpfSAoJHthdHRhY2htZW50T3B0aW9ucy5tYXhGaWxlU2l6ZX0gYnl0ZXMpYCwgYWxlcnRPcHRpb25zKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZmlsZVwiLCBmaWxlKVxyXG4gICAgICBjb25zdCBjbGllbnRGaWxlTmFtZSA9IGZpbGUubmFtZVxyXG4gICAgICBjb25zdCBjbGllbnRGaWxlVHlwZSA9IGZpbGUudHlwZVxyXG4gICAgICBsZXQgY2xpZW50RmlsZURhdGEgPSBcIlwiXHJcblxyXG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2ZpbGVdKTtcclxuICAgICAgaWYgKHR5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy53b3JrZXIgPSBuZXcgV29ya2VyKGJsb2JfdG9fYmFzZTY0X3NjcmlwdClcclxuICAgICAgICB0aGlzLndvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlID0+IHtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndvcmtlciBtZXNzYWdlXCIsIGUpXHJcbiAgICAgICAgICBjbGllbnRGaWxlRGF0YSA9IGUuZGF0YVxyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSAoY2xpZW50RmlsZURhdGEgYXMgc3RyaW5nKS5pbmRleE9mKCdiYXNlNjQsJyk7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBjbGllbnRGaWxlRGF0YSA9IChjbGllbnRGaWxlRGF0YSBhcyBzdHJpbmcpLnN1YnN0cmluZyhpbmRleCArIDcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSh7XHJcbiAgICAgICAgICAgIGFzc2lnblRvOiB0aGlzLmFzc2lnblRvLFxyXG4gICAgICAgICAgICBzZXJ2ZXJGaWxlTmFtZTogdGhpcy52YWx1ZT8uc2VydmVyRmlsZU5hbWUsXHJcbiAgICAgICAgICAgIGNsaWVudEZpbGVOYW1lLFxyXG4gICAgICAgICAgICBjbGllbnRGaWxlVHlwZSxcclxuICAgICAgICAgICAgY2xpZW50RmlsZURhdGEsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMudmFsdWVUb1Nob3cgPSBjbGllbnRGaWxlTmFtZTtcclxuICAgICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UoYmxvYik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29yZUZpbGVVdGlscy5wcm90b3R5cGUuYmxvYlRvQmFzZTY0KGJsb2IpLnRoZW4oKGNsaWVudEZpbGVEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gKGNsaWVudEZpbGVEYXRhIGFzIHN0cmluZykuaW5kZXhPZignYmFzZTY0LCcpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgY2xpZW50RmlsZURhdGEgPSAoY2xpZW50RmlsZURhdGEgYXMgc3RyaW5nKS5zdWJzdHJpbmcoaW5kZXggKyA3KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub25DaGFuZ2Uoe1xyXG4gICAgICAgICAgICBhc3NpZ25UbzogdGhpcy5hc3NpZ25UbyxcclxuICAgICAgICAgICAgc2VydmVyRmlsZU5hbWU6IHRoaXMudmFsdWU/LnNlcnZlckZpbGVOYW1lLFxyXG4gICAgICAgICAgICBjbGllbnRGaWxlTmFtZSxcclxuICAgICAgICAgICAgY2xpZW50RmlsZVR5cGUsXHJcbiAgICAgICAgICAgIGNsaWVudEZpbGVEYXRhLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlVG9TaG93ID0gY2xpZW50RmlsZU5hbWU7XHJcbiAgICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXIoKTp2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSBudWxsO1xyXG4gICAgdGhpcy52YWx1ZVRvU2hvdyA9ICcnO1xyXG4gICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICAgIGNvbnN0IHNpYmxpbmcgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sPy5wYXJlbnQ/LmdldCh0aGlzLmFzc2lnblRvKTtcclxuICAgIGlmICghc2libGluZykge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihgQ2jGsGEga2hhaSBiw6FvIGZpZWxkICcke3RoaXMuYXNzaWduVG99J2AsIG5vbmVBdXRvQ2xvc2VkQWxlcnRPcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2libGluZy5wYXRjaFZhbHVlKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iLCI8ZGl2ICNjb250YWluZXIgY2xhc3M9XCJjb3JlLWF0dGFjaG1lbnQtY29udGFpbmVyXCI+XHJcbiAgICA8aW5wdXQgaWQ9XCJyYXdJbnB1dFwiICNyYXdJbnB1dCB0eXBlPVwiZmlsZVwiIChjaGFuZ2UpPVwiaGFuZGxlSW5wdXRDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmdEZWZhdWx0Q29udHJvbCBbKG5nTW9kZWwpXT1cInZhbHVlVG9TaG93XCIgcmVhZG9ubHlcclxuICAgICAgICBbY2xhc3MuZm9ybS1jb250cm9sLWRpc2FibGVkXT1cImRpc2FibGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtdG8tc2hvd1wiIFthcHBUb29sdGlwXT1cInZhbHVlVG9TaG93IHwgdXBsb2FkZWRGaWxlbmFtZUN1dG9mZlwiIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCEhdmFsdWVUb1Nob3cgJiYgISEhdG91Y2hlZCkgPyAndHJhbnNsYXRlKDMwcHgpJyA6ICd0cmFuc2xhdGUoMHB4KSdcclxuICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICB7eyB2YWx1ZVRvU2hvdyB8IHVwbG9hZGVkRmlsZW5hbWVDdXRvZmYgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYgKCEhdmFsdWVUb1Nob3cpIHtcclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmZWF0aGVyLXhcIiAoY2xpY2spPVwiY2xlYXIoKVwiPjwvaT5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtaWNvbi13cmFwcGVyXCIgKGNsaWNrKT1cIm9uQ2xpY2tVcGxvYWQoKVwiIFtjbGFzcy5vcGFjaXR5MF09XCJyZWFkb25seVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmZWF0aGVyLXVwbG9hZFwiPjwvaT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgQGlmICghIXZhbHVlVG9TaG93ICYmICEhIXRvdWNoZWQpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1pY29uLXdyYXBwZXJcIiAoY2xpY2spPVwib25DbGlja0Rvd25sb2FkKClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmVhdGhlci1kb3dubG9hZFwiPjwvaT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiIFtuZ1N0eWxlXT1cInsgaGVpZ2h0OiBkcm9wZG93bkhlaWdodCArICdweCcsIHBhZGRpbmc6IGRyb3Bkb3duUGFkZGluZyArICdweCcsIHpJbmRleDogZHJvcGRvd25aSW5kZXggfVwiPlxyXG4gICAgICAgIEBpZiAocHJldmlld2FibGUpIHtcclxuICAgICAgICA8aW1nIFtzcmNdPVwidmFsdWVUb1Nob3cgfCBtYXBBdHRhY2htZW50VG9TZXJ2ZXJcIiBpbWFnZUVycm9yUmVzb2x2ZXIgLz5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvZGl2PiJdfQ==