@sarasanalytics-com/design-system 0.0.136 → 0.0.138

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.
Files changed (44) hide show
  1. package/esm2022/interfaces/button-interface.mjs +1 -1
  2. package/esm2022/interfaces/chip-interface.mjs +1 -1
  3. package/esm2022/interfaces/form-layout.interface.mjs +2 -0
  4. package/esm2022/interfaces/grid-interface.mjs +1 -1
  5. package/esm2022/lib/avatar/avatar.component.mjs +3 -3
  6. package/esm2022/lib/categories-nav/categories-nav.component.mjs +27 -0
  7. package/esm2022/lib/chips/chips.component.mjs +3 -3
  8. package/esm2022/lib/data-grid/data-grid.component.mjs +135 -0
  9. package/esm2022/lib/dialog/dialog.component.mjs +43 -3
  10. package/esm2022/lib/filter/filter.component.mjs +232 -0
  11. package/esm2022/lib/form-input/form-input.component.mjs +71 -7
  12. package/esm2022/lib/form-select/form-select.component.mjs +187 -5
  13. package/esm2022/lib/grid-cell/grid-cell.component.mjs +173 -25
  14. package/esm2022/lib/menu/menu-list/menu-item.component.mjs +3 -3
  15. package/esm2022/lib/menu/menu.component.mjs +3 -3
  16. package/esm2022/lib/message-banner-v2/message-banner-v2.component.mjs +256 -7
  17. package/esm2022/lib/query-builder/query-builder-demo.component.mjs +134 -0
  18. package/esm2022/lib/query-builder/query-builder.component.mjs +275 -0
  19. package/esm2022/lib/query-builder/query-builder.service.mjs +107 -0
  20. package/esm2022/lib/query-builder-textarea/query-builder-textarea-demo.component.mjs +130 -0
  21. package/esm2022/lib/query-builder-textarea/query-builder-textarea.component.mjs +805 -0
  22. package/esm2022/lib/tool-tip/tool-tip.component.mjs +8 -3
  23. package/esm2022/public-api.mjs +10 -1
  24. package/fesm2022/sarasanalytics-com-design-system.mjs +3042 -587
  25. package/fesm2022/sarasanalytics-com-design-system.mjs.map +1 -1
  26. package/interfaces/button-interface.d.ts +1 -0
  27. package/interfaces/form-layout.interface.d.ts +59 -0
  28. package/interfaces/grid-interface.d.ts +11 -4
  29. package/lib/categories-nav/categories-nav.component.d.ts +15 -0
  30. package/lib/data-grid/data-grid.component.d.ts +33 -0
  31. package/lib/dialog/dialog.component.d.ts +13 -0
  32. package/lib/filter/filter.component.d.ts +83 -0
  33. package/lib/form-input/form-input.component.d.ts +11 -1
  34. package/lib/form-select/form-select.component.d.ts +8 -0
  35. package/lib/grid-cell/grid-cell.component.d.ts +51 -10
  36. package/lib/message-banner-v2/message-banner-v2.component.d.ts +34 -2
  37. package/lib/query-builder/query-builder-demo.component.d.ts +14 -0
  38. package/lib/query-builder/query-builder.component.d.ts +90 -0
  39. package/lib/query-builder/query-builder.service.d.ts +39 -0
  40. package/lib/query-builder-textarea/query-builder-textarea-demo.component.d.ts +9 -0
  41. package/lib/query-builder-textarea/query-builder-textarea.component.d.ts +143 -0
  42. package/lib/tool-tip/tool-tip.component.d.ts +2 -1
  43. package/package.json +1 -1
  44. package/public-api.d.ts +9 -0
@@ -5,7 +5,8 @@ import { FieldType } from '@ngx-formly/core';
5
5
  import { CommonModule } from '@angular/common';
6
6
  import { getValidationMessage, } from '../../utils/validators';
7
7
  import { IconComponent } from '../icon/icon.component';
8
- import { get as _get, set as _set } from 'lodash';
8
+ import { ChipsComponent } from '../chips/chips.component';
9
+ import { get as _get, set as _set, map } from 'lodash';
9
10
  import { MatTooltipModule } from '@angular/material/tooltip';
10
11
  import * as i0 from "@angular/core";
11
12
  import * as i1 from "@angular/common";
@@ -23,6 +24,9 @@ export class FormInputComponent extends FieldType {
23
24
  this.inputErrorText = 'invalid input';
24
25
  this.showEmailIcon = false;
25
26
  this.disabled = false;
27
+ this.chipValues = [];
28
+ this.isMultiValue = false;
29
+ this.currentInputValue = '';
26
30
  this.suppressOnBlur = false;
27
31
  this.predefinedValidators = {
28
32
  email: [Validators.email, Validators.required],
@@ -35,9 +39,22 @@ export class FormInputComponent extends FieldType {
35
39
  this.field.props['value'] || this.model[this.key] || '';
36
40
  this.disabled = this.field.props.disabled || false;
37
41
  this.formControl?.setValue(this.inputVal);
38
- this.params = this.field.props['params'];
39
- this.icon = this.field.props['icon'] || {};
42
+ this.params = this.params || this.field.props['params'];
43
+ this.icon = this.icon || this.field.props['icon'] || {};
40
44
  this.type = this.params?.type || '';
45
+ this.formControl.valueChanges.subscribe((val) => {
46
+ _set(this.formInput, 'nativeElement.value', val);
47
+ // Handle multi-value chip updates
48
+ if (this.isMultiValue && Array.isArray(val)) {
49
+ this.chipValues = val;
50
+ }
51
+ });
52
+ // Initialize multi-value mode if specified
53
+ if (this.params?.type === 'multi-value' || this.params?.multiValue) {
54
+ this.isMultiValue = true;
55
+ this.chipValues = this.model[this.key] || this.params?.chipValues || [];
56
+ this.currentInputValue = '';
57
+ }
41
58
  // this.dynamicIcon = this.field.props['dynamicIcon'];
42
59
  this.setValidators();
43
60
  this.setDependents();
@@ -193,6 +210,50 @@ export class FormInputComponent extends FieldType {
193
210
  this.onInputFieldClick();
194
211
  }
195
212
  }
213
+ addChip(value) {
214
+ if (!this.isMultiValue || !value.trim())
215
+ return;
216
+ const chipValue = {
217
+ label: value.trim(),
218
+ value: value.trim(),
219
+ removable: true
220
+ };
221
+ this.chipValues.push(chipValue);
222
+ const actualValues = map(this.chipValues, (chip) => chip.value || chip.label || chip);
223
+ this.formControl?.setValue(actualValues);
224
+ this.currentInputValue = '';
225
+ this.model[this.key] = actualValues;
226
+ }
227
+ removeChip(index) {
228
+ if (!this.isMultiValue)
229
+ return;
230
+ this.chipValues.splice(index, 1);
231
+ const actualValues = map(this.chipValues, (chip) => chip.value || chip.label || chip);
232
+ this.model[this.key] = actualValues;
233
+ }
234
+ onChipKeyDown(event) {
235
+ if (!this.isMultiValue)
236
+ return;
237
+ if (event.key === 'Enter' || event.key === ',') {
238
+ event.preventDefault();
239
+ this.addChip(this.currentInputValue);
240
+ }
241
+ else if (event.key === 'Backspace' && !this.currentInputValue && this.chipValues.length > 0) {
242
+ this.removeChip(this.chipValues.length - 1);
243
+ }
244
+ }
245
+ onChipInputChange(event) {
246
+ if (!this.isMultiValue)
247
+ return;
248
+ this.currentInputValue = event.target.value;
249
+ }
250
+ onChipBlur() {
251
+ if (!this.isMultiValue)
252
+ return;
253
+ if (this.currentInputValue.trim()) {
254
+ this.addChip(this.currentInputValue);
255
+ }
256
+ }
196
257
  /*onFieldCallback(param: IInputParam) {
197
258
  this.icon = param.icon || this.icon;
198
259
  this.checkValidity();
@@ -221,7 +282,7 @@ export class FormInputComponent extends FieldType {
221
282
  }
222
283
  }
223
284
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: FormInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
224
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: FormInputComponent, isStandalone: true, selector: "sa-input", inputs: { icon: "icon" }, viewQueries: [{ propertyName: "formInput", first: true, predicate: ["formInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"sa-input-container {{props?.['inputContainerClass']}}\" [ngStyle]=\"{'gap': getLabelFieldGap()}\">\r\n @if (!!props?.['bigLabel'] || !!props?.['bigDescription']) {\r\n <div class=\"sa-input-big-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <h2 class=\"sa-input-big-label\">\r\n {{props?.['bigLabel']}}\r\n </h2>\r\n <p class=\"sa-input-big-description\">\r\n {{props?.['bigDescription']}}\r\n </p>\r\n </div>\r\n }\r\n @if(!!props?.['label']){\r\n <div class=\"sa-input-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <div class=\"sa-input-label-tooltip-container\">\r\n <span class=\"sa-input-label\">\r\n {{props?.['label']}}\r\n </span>\r\n @if(!!props?.['tooltip']){\r\n <span class=\"tooltip-container\">\r\n <sa-icon [icon]=\"props?.['tooltipIcon'] || 'infoCircleOutlined'\" customClass=\"info-icon\"\r\n [matTooltip]=\"props?.['tooltip']\" matTooltipClass=\"custom-tooltip\" class=\"tooltip-icon d-flex\"\r\n [size]=\"props?.['tooltipIconSize'] || '20'\"></sa-icon>\r\n </span>\r\n }\r\n </div>\r\n @if(!!props?.['description']) {\r\n <p class=\"sa-input-description\">\r\n {{props?.['description']}}\r\n </p>\r\n }\r\n </div>\r\n }\r\n <div class=\"sa-input\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n @if((pretext || (!!inputVal?.length && (!!params?.placeholder || !!props?.placeholder))) && props?.['showTag']\r\n !== false){\r\n <span class=\"sa-input-tag\">{{params?.placeholder || props?.placeholder}}</span>\r\n }\r\n <div class=\"sa-input-field\" [ngClass]=\"formControl.invalid && formControl.touched ? 'invalid' : 'idle' \"\r\n (click)=\"onInputFieldClick($event)\">\r\n @if(pretext){\r\n <div class=\"sa-input-pretext\">\r\n {{pretext}}\r\n </div>\r\n }\r\n\r\n <input\r\n [ngClass]=\"(!!inputVal && (params?.type === 'password' || props?.type === 'password') && icon.name !== 'eyeOff') ? 'masked' : ''\"\r\n matInput [type]=\"type\" value=\"\" [pattern]=\"type==='tel' ? '[0-9]' : '' \"\r\n [disabled]=\"field.props.disabled || false\"\r\n [placeholder]=\"!pretext && props?.placeholder || params?.placeholder || ''\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (input)=\"onInput($event)\" [(ngModel)]=\"inputVal\" #formInput />\r\n\r\n @if(params?.type === 'password'){\r\n <sa-icon class=\"flex\" icon=\"eyeOutlined\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"!icon.name || icon.name === 'eyeOutlined' ? '' : 'hide'\"></sa-icon>\r\n <sa-icon class=\"flex\" icon=\"eyeOff\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"icon.name === 'eyeOff' ? '' : 'hide'\"></sa-icon>\r\n }@else if(params?.type === 'email' && icon.show){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name || 'checkCircleOutlined'\" [size]=\"icon.size || '24'\"\r\n (click)=\"inputIconClick()\" [ngClass]=\"showEmailIcon ? '' : 'hide'\"></sa-icon>\r\n }\r\n @else if(icon?.name){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name\" [size]=\"icon?.size || '24'\" [color]=\"icon?.color || ''\"\r\n [ngClass]=\"icon?.show ? '' : 'hide'\"></sa-icon>\r\n }\r\n </div>\r\n @if((!formControl.valid) || (params?.supportText)){\r\n <div class=\"support-label {{formControl.invalid && formControl.touched ? params?.className : ''}}\" [ngClass]=\"[\r\n formControl.invalid && formControl.touched ? 'invalid' : 'idle'\r\n ]\">\r\n <!-- {{!formControl.valid ? inputErrorText : params.supportText}} -->\r\n {{getFormSupportText()}}\r\n </div>\r\n }\r\n </div>\r\n</div>", styles: ["*{--error-red: #e25c61 }.idle{--border: 1px solid var(--grey-50)}.focus{--border: 1px solid var(--primary-300)}.masked{font-size:28px;font-weight:500;padding-top:4px}.disabled .sa-input-field,[disabled]{background-color:#fafafa;cursor:not-allowed}.disabled .sa-input-field input{color:#989da3}.sa-input-field>input,.sa-input-field>input:focus-visible{--border: 1px solid var(--primary-300);border:none;outline:none}.sa-input-field:hover{--border: 1px solid var(--primary-300);--font-color: var(--text-highemphasis)}.sa-input-field sa-icon{color:var(--icon-grey1)}.sa-input-field>input:focus-visible~sa-icon,.sa-input-field:hover sa-icon{color:var(--primary-300)}.sa-input-field.invalid>input,.sa-input-field.invalid sa-icon,.sa-input-field.invalid .sa-input-pretext{color:#e25c61}.sa-input-field.invalid{--border: 1px solid #e25c61}.sa-input-field.invalid sa-icon{--form-email-icon-color: #e25c61}.sa-input-field.idle sa-icon{--form-email-icon-color: #33961F}.sa-input{position:relative;padding:8px 0}.sa-input-pretext{margin-right:2px}.sa-input-field{width:100%;box-sizing:border-box;position:relative;display:inline-flex;padding:0px var(--small-12px);height:40px;justify-content:center;align-items:center;border:var(--border);border-radius:var(--small-4px);font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;--font-color: var(--text-lowemphasis)}.sa-input-field input{width:inherit}.sa-input-tag{position:absolute;background:#fff;padding:2px 6px;top:-1px;left:12px;z-index:2;font-size:11px;font-weight:500;line-height:16px;letter-spacing:.5px;text-align:left;color:var(--text-lowemphasis)}.support-label{font-family:var(--font);font-size:11px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.5px;color:var(--text-lowemphasis);padding:var(--small-4px) var(--small-16px) 0px var(--small-16px)}.support-label.invalid{color:var(--error-red)}.hide{display:none}.sa-input-big-label-container,.sa-input-label-container{display:flex;flex-direction:column;gap:var(--small-8px, 8px)}.sa-input-big-label{color:var(--text-highemphasis, #1C1B20);font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px, 22px);font-style:normal;font-weight:500;line-height:var(--medium-28px, 28px);margin:0}.sa-input-big-description,.sa-input-description{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-roboto, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.sa-input-container{display:flex;flex-direction:column;gap:var(--medium-20px, 20px)}.sa-input-label{color:var(--text-highemphasis, #1B1D20);font-family:var(--font);font-size:var(--small-14px);font-style:normal;font-weight:500;line-height:var(--medium-20px);letter-spacing:.1px}.sa-input-label-tooltip-container{display:flex;gap:var(--small-4px);align-items:center}.d-flex{display:flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: IconComponent, selector: "sa-icon", inputs: ["img", "icon", "size", "color", "iconPath", "iconUrl", "customClass", "href", "hrefTarget"], outputs: ["onClickEvent"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
285
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: FormInputComponent, isStandalone: true, selector: "sa-input", inputs: { icon: "icon", params: "params" }, viewQueries: [{ propertyName: "formInput", first: true, predicate: ["formInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"sa-input-container {{props?.['inputContainerClass']}}\" [ngStyle]=\"{'gap': getLabelFieldGap()}\">\r\n @if (!!props?.['bigLabel'] || !!props?.['bigDescription']) {\r\n <div class=\"sa-input-big-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <h2 class=\"sa-input-big-label\">\r\n {{props?.['bigLabel']}}\r\n </h2>\r\n <p class=\"sa-input-big-description\">\r\n {{props?.['bigDescription']}}\r\n </p>\r\n </div>\r\n }\r\n @if(!!props?.['label']){\r\n <div class=\"sa-input-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <div class=\"sa-input-label-tooltip-container\">\r\n <span class=\"sa-input-label\">\r\n {{props?.['label']}}\r\n </span>\r\n @if(!!props?.['tooltip']){\r\n <span class=\"tooltip-container\">\r\n <sa-icon [icon]=\"props?.['tooltipIcon'] || 'infoCircleOutlined'\" customClass=\"info-icon\"\r\n [matTooltip]=\"props?.['tooltip']\" matTooltipClass=\"custom-tooltip\" class=\"tooltip-icon d-flex\"\r\n [size]=\"props?.['tooltipIconSize'] || '20'\"></sa-icon>\r\n </span>\r\n }\r\n </div>\r\n @if(!!props?.['description']) {\r\n <p class=\"sa-input-description\">\r\n {{props?.['description']}}\r\n </p>\r\n }\r\n </div>\r\n }\r\n <div class=\"sa-input\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n @if((pretext || (!!inputVal?.length && (!!params?.placeholder || !!props?.placeholder))) && props?.['showTag']\r\n !== false){\r\n <span class=\"sa-input-tag\">{{params?.placeholder || props?.placeholder}}</span>\r\n }\r\n <div class=\"sa-input-field\" [ngClass]=\"formControl.invalid && formControl.touched ? 'invalid' : 'idle' \"\r\n (click)=\"onInputFieldClick($event)\">\r\n @if(pretext){\r\n <div class=\"sa-input-pretext\">\r\n {{pretext}}\r\n </div>\r\n }\r\n\r\n <!-- Multi-value chip display -->\r\n @if(isMultiValue) {\r\n <div class=\"chip-container\">\r\n <sa-chip \r\n *ngFor=\"let chip of chipValues; let i = index\"\r\n [text]=\"chip.value || chip.label || chip\"\r\n [type]=\"'regular'\"\r\n [state]=\"'primary'\"\r\n [filling]=\"'filled'\"\r\n [iconPosition]=\"'right'\"\r\n [iconPath]=\"'../assets/closeBlueOutlined.svg'\"\r\n (onClickEvent)=\"removeChip(i)\">\r\n </sa-chip>\r\n <input\r\n [ngClass]=\"'chip-input'\"\r\n matInput [type]=\"type\"\r\n [disabled]=\"field.props.disabled || false\"\r\n [placeholder]=\"chipValues.length === 0 ? (props?.placeholder || params?.placeholder || '') : ''\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onChipBlur()\"\r\n (input)=\"onChipInputChange($event)\"\r\n (keydown)=\"onChipKeyDown($event)\"\r\n [(ngModel)]=\"currentInputValue\"\r\n #formInput />\r\n </div>\r\n } @else {\r\n <!-- Standard single-value input (backward compatibility) -->\r\n <input\r\n [ngClass]=\"(!!inputVal && (params?.type === 'password' || props?.type === 'password') && icon.name !== 'eyeOff') ? 'masked' : ''\"\r\n matInput [type]=\"type\" value=\"\" [pattern]=\"type==='tel' ? '[0-9]' : '' \"\r\n [disabled]=\"field.props.disabled || false\"\r\n [placeholder]=\"!pretext && props?.placeholder || params?.placeholder || ''\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (input)=\"onInput($event)\" [(ngModel)]=\"inputVal\" #formInput />\r\n }\r\n\r\n @if(params?.type === 'password'){\r\n <sa-icon class=\"flex\" icon=\"eyeOutlined\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"!icon.name || icon.name === 'eyeOutlined' ? '' : 'hide'\"></sa-icon>\r\n <sa-icon class=\"flex\" icon=\"eyeOff\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"icon.name === 'eyeOff' ? '' : 'hide'\"></sa-icon>\r\n }@else if(params?.type === 'email' && icon.show){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name || 'checkCircleOutlined'\" [size]=\"icon.size || '24'\"\r\n (click)=\"inputIconClick()\" [ngClass]=\"showEmailIcon ? '' : 'hide'\"></sa-icon>\r\n }\r\n @else if(icon?.name){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name\" [size]=\"icon?.size || '24'\" [color]=\"icon?.color || ''\"\r\n [ngClass]=\"icon?.show ? '' : 'hide'\"></sa-icon>\r\n }\r\n </div>\r\n @if((!formControl.valid) || (params?.supportText)){\r\n <div class=\"support-label {{formControl.invalid && formControl.touched ? params?.className : ''}}\" [ngClass]=\"[\r\n formControl.invalid && formControl.touched ? 'invalid' : 'idle'\r\n ]\">\r\n <!-- {{!formControl.valid ? inputErrorText : params.supportText}} -->\r\n {{getFormSupportText()}}\r\n </div>\r\n }\r\n </div>\r\n</div>", styles: ["*{--error-red: #e25c61 }.idle{--border: 1px solid var(--grey-50)}.focus{--border: 1px solid var(--primary-300)}.masked{font-size:28px;font-weight:500;padding-top:4px}.disabled .sa-input-field,[disabled]{background-color:#fafafa;cursor:not-allowed}.disabled .sa-input-field input{color:#989da3}.sa-input-field>input,.sa-input-field>input:focus-visible{--border: 1px solid var(--primary-300);border:none;outline:none}.sa-input-field:hover{--border: 1px solid var(--primary-300);--font-color: var(--text-highemphasis)}.sa-input-field sa-icon{color:var(--icon-grey1)}.sa-input-field>input:focus-visible~sa-icon,.sa-input-field:hover sa-icon{color:var(--primary-300)}.sa-input-field.invalid>input,.sa-input-field.invalid sa-icon,.sa-input-field.invalid .sa-input-pretext{color:#e25c61}.sa-input-field.invalid{--border: 1px solid #e25c61}.sa-input-field.invalid sa-icon{--form-email-icon-color: #e25c61}.sa-input-field.idle sa-icon{--form-email-icon-color: #33961F}.sa-input{position:relative;padding:8px 0}.sa-input-pretext{margin-right:2px}.sa-input-field{width:100%;box-sizing:border-box;position:relative;display:inline-flex;padding:0px var(--small-12px);height:40px;justify-content:center;align-items:center;border:1px solid var(--grey-100, #EAECF0);border-radius:var(--small-4px);font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;--font-color: var(--text-lowemphasis)}.sa-input-field input{width:inherit}.sa-input-tag{position:absolute;background:#fff;padding:2px 6px;top:-1px;left:12px;z-index:2;font-size:11px;font-weight:500;line-height:16px;letter-spacing:.5px;text-align:left;color:var(--text-lowemphasis)}.support-label{font-family:var(--font);font-size:11px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.5px;color:var(--text-lowemphasis);padding:var(--small-4px) var(--small-16px) 0px var(--small-16px)}.support-label.invalid{color:var(--error-red)}.hide{display:none}.sa-input-big-label-container,.sa-input-label-container{display:flex;flex-direction:column;gap:var(--small-8px, 8px)}.sa-input-big-label{color:var(--text-highemphasis, #1C1B20);font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px, 22px);font-style:normal;font-weight:500;line-height:var(--medium-28px, 28px);margin:0}.sa-input-big-description,.sa-input-description{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-roboto, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.sa-input-container{display:flex;flex-direction:column;gap:var(--medium-20px, 20px)}.sa-input-label{color:var(--text-highemphasis, #1B1D20);font-family:var(--font);font-size:var(--small-14px);font-style:normal;font-weight:500;line-height:var(--medium-20px);letter-spacing:.1px}.sa-input-label-tooltip-container{display:flex;gap:var(--small-4px);align-items:center}.d-flex{display:flex}.chip-container{display:flex;flex-wrap:wrap;align-items:center;gap:4px;width:100%;min-height:20px}.chip-input{border:none;outline:none;background:transparent;flex:1;min-width:60px;font-size:14px;font-family:inherit;color:inherit}.chip-input::placeholder{color:var(--text-medium-emphasis, #6D6979)}.chip-container sa-chip{margin:2px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: IconComponent, selector: "sa-icon", inputs: ["img", "icon", "size", "color", "iconPath", "iconUrl", "customClass", "href", "hrefTarget"], outputs: ["onClickEvent"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ChipsComponent, selector: "sa-chip", inputs: ["id", "iconPath", "text", "type", "state", "filling", "iconPosition", "largeStateIcon", "largeStateText", "tooltip", "className"], outputs: ["onClickEvent"] }] }); }
225
286
  }
226
287
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: FormInputComponent, decorators: [{
227
288
  type: Component,
@@ -231,14 +292,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
231
292
  ReactiveFormsModule,
232
293
  FormlyModule,
233
294
  IconComponent,
234
- MatTooltipModule
235
- ], template: "<div class=\"sa-input-container {{props?.['inputContainerClass']}}\" [ngStyle]=\"{'gap': getLabelFieldGap()}\">\r\n @if (!!props?.['bigLabel'] || !!props?.['bigDescription']) {\r\n <div class=\"sa-input-big-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <h2 class=\"sa-input-big-label\">\r\n {{props?.['bigLabel']}}\r\n </h2>\r\n <p class=\"sa-input-big-description\">\r\n {{props?.['bigDescription']}}\r\n </p>\r\n </div>\r\n }\r\n @if(!!props?.['label']){\r\n <div class=\"sa-input-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <div class=\"sa-input-label-tooltip-container\">\r\n <span class=\"sa-input-label\">\r\n {{props?.['label']}}\r\n </span>\r\n @if(!!props?.['tooltip']){\r\n <span class=\"tooltip-container\">\r\n <sa-icon [icon]=\"props?.['tooltipIcon'] || 'infoCircleOutlined'\" customClass=\"info-icon\"\r\n [matTooltip]=\"props?.['tooltip']\" matTooltipClass=\"custom-tooltip\" class=\"tooltip-icon d-flex\"\r\n [size]=\"props?.['tooltipIconSize'] || '20'\"></sa-icon>\r\n </span>\r\n }\r\n </div>\r\n @if(!!props?.['description']) {\r\n <p class=\"sa-input-description\">\r\n {{props?.['description']}}\r\n </p>\r\n }\r\n </div>\r\n }\r\n <div class=\"sa-input\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n @if((pretext || (!!inputVal?.length && (!!params?.placeholder || !!props?.placeholder))) && props?.['showTag']\r\n !== false){\r\n <span class=\"sa-input-tag\">{{params?.placeholder || props?.placeholder}}</span>\r\n }\r\n <div class=\"sa-input-field\" [ngClass]=\"formControl.invalid && formControl.touched ? 'invalid' : 'idle' \"\r\n (click)=\"onInputFieldClick($event)\">\r\n @if(pretext){\r\n <div class=\"sa-input-pretext\">\r\n {{pretext}}\r\n </div>\r\n }\r\n\r\n <input\r\n [ngClass]=\"(!!inputVal && (params?.type === 'password' || props?.type === 'password') && icon.name !== 'eyeOff') ? 'masked' : ''\"\r\n matInput [type]=\"type\" value=\"\" [pattern]=\"type==='tel' ? '[0-9]' : '' \"\r\n [disabled]=\"field.props.disabled || false\"\r\n [placeholder]=\"!pretext && props?.placeholder || params?.placeholder || ''\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (input)=\"onInput($event)\" [(ngModel)]=\"inputVal\" #formInput />\r\n\r\n @if(params?.type === 'password'){\r\n <sa-icon class=\"flex\" icon=\"eyeOutlined\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"!icon.name || icon.name === 'eyeOutlined' ? '' : 'hide'\"></sa-icon>\r\n <sa-icon class=\"flex\" icon=\"eyeOff\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"icon.name === 'eyeOff' ? '' : 'hide'\"></sa-icon>\r\n }@else if(params?.type === 'email' && icon.show){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name || 'checkCircleOutlined'\" [size]=\"icon.size || '24'\"\r\n (click)=\"inputIconClick()\" [ngClass]=\"showEmailIcon ? '' : 'hide'\"></sa-icon>\r\n }\r\n @else if(icon?.name){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name\" [size]=\"icon?.size || '24'\" [color]=\"icon?.color || ''\"\r\n [ngClass]=\"icon?.show ? '' : 'hide'\"></sa-icon>\r\n }\r\n </div>\r\n @if((!formControl.valid) || (params?.supportText)){\r\n <div class=\"support-label {{formControl.invalid && formControl.touched ? params?.className : ''}}\" [ngClass]=\"[\r\n formControl.invalid && formControl.touched ? 'invalid' : 'idle'\r\n ]\">\r\n <!-- {{!formControl.valid ? inputErrorText : params.supportText}} -->\r\n {{getFormSupportText()}}\r\n </div>\r\n }\r\n </div>\r\n</div>", styles: ["*{--error-red: #e25c61 }.idle{--border: 1px solid var(--grey-50)}.focus{--border: 1px solid var(--primary-300)}.masked{font-size:28px;font-weight:500;padding-top:4px}.disabled .sa-input-field,[disabled]{background-color:#fafafa;cursor:not-allowed}.disabled .sa-input-field input{color:#989da3}.sa-input-field>input,.sa-input-field>input:focus-visible{--border: 1px solid var(--primary-300);border:none;outline:none}.sa-input-field:hover{--border: 1px solid var(--primary-300);--font-color: var(--text-highemphasis)}.sa-input-field sa-icon{color:var(--icon-grey1)}.sa-input-field>input:focus-visible~sa-icon,.sa-input-field:hover sa-icon{color:var(--primary-300)}.sa-input-field.invalid>input,.sa-input-field.invalid sa-icon,.sa-input-field.invalid .sa-input-pretext{color:#e25c61}.sa-input-field.invalid{--border: 1px solid #e25c61}.sa-input-field.invalid sa-icon{--form-email-icon-color: #e25c61}.sa-input-field.idle sa-icon{--form-email-icon-color: #33961F}.sa-input{position:relative;padding:8px 0}.sa-input-pretext{margin-right:2px}.sa-input-field{width:100%;box-sizing:border-box;position:relative;display:inline-flex;padding:0px var(--small-12px);height:40px;justify-content:center;align-items:center;border:var(--border);border-radius:var(--small-4px);font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;--font-color: var(--text-lowemphasis)}.sa-input-field input{width:inherit}.sa-input-tag{position:absolute;background:#fff;padding:2px 6px;top:-1px;left:12px;z-index:2;font-size:11px;font-weight:500;line-height:16px;letter-spacing:.5px;text-align:left;color:var(--text-lowemphasis)}.support-label{font-family:var(--font);font-size:11px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.5px;color:var(--text-lowemphasis);padding:var(--small-4px) var(--small-16px) 0px var(--small-16px)}.support-label.invalid{color:var(--error-red)}.hide{display:none}.sa-input-big-label-container,.sa-input-label-container{display:flex;flex-direction:column;gap:var(--small-8px, 8px)}.sa-input-big-label{color:var(--text-highemphasis, #1C1B20);font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px, 22px);font-style:normal;font-weight:500;line-height:var(--medium-28px, 28px);margin:0}.sa-input-big-description,.sa-input-description{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-roboto, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.sa-input-container{display:flex;flex-direction:column;gap:var(--medium-20px, 20px)}.sa-input-label{color:var(--text-highemphasis, #1B1D20);font-family:var(--font);font-size:var(--small-14px);font-style:normal;font-weight:500;line-height:var(--medium-20px);letter-spacing:.1px}.sa-input-label-tooltip-container{display:flex;gap:var(--small-4px);align-items:center}.d-flex{display:flex}\n"] }]
295
+ MatTooltipModule,
296
+ ChipsComponent
297
+ ], template: "<div class=\"sa-input-container {{props?.['inputContainerClass']}}\" [ngStyle]=\"{'gap': getLabelFieldGap()}\">\r\n @if (!!props?.['bigLabel'] || !!props?.['bigDescription']) {\r\n <div class=\"sa-input-big-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <h2 class=\"sa-input-big-label\">\r\n {{props?.['bigLabel']}}\r\n </h2>\r\n <p class=\"sa-input-big-description\">\r\n {{props?.['bigDescription']}}\r\n </p>\r\n </div>\r\n }\r\n @if(!!props?.['label']){\r\n <div class=\"sa-input-label-container\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n <div class=\"sa-input-label-tooltip-container\">\r\n <span class=\"sa-input-label\">\r\n {{props?.['label']}}\r\n </span>\r\n @if(!!props?.['tooltip']){\r\n <span class=\"tooltip-container\">\r\n <sa-icon [icon]=\"props?.['tooltipIcon'] || 'infoCircleOutlined'\" customClass=\"info-icon\"\r\n [matTooltip]=\"props?.['tooltip']\" matTooltipClass=\"custom-tooltip\" class=\"tooltip-icon d-flex\"\r\n [size]=\"props?.['tooltipIconSize'] || '20'\"></sa-icon>\r\n </span>\r\n }\r\n </div>\r\n @if(!!props?.['description']) {\r\n <p class=\"sa-input-description\">\r\n {{props?.['description']}}\r\n </p>\r\n }\r\n </div>\r\n }\r\n <div class=\"sa-input\" [ngClass]=\"disabled ? 'disabled' : '' \">\r\n @if((pretext || (!!inputVal?.length && (!!params?.placeholder || !!props?.placeholder))) && props?.['showTag']\r\n !== false){\r\n <span class=\"sa-input-tag\">{{params?.placeholder || props?.placeholder}}</span>\r\n }\r\n <div class=\"sa-input-field\" [ngClass]=\"formControl.invalid && formControl.touched ? 'invalid' : 'idle' \"\r\n (click)=\"onInputFieldClick($event)\">\r\n @if(pretext){\r\n <div class=\"sa-input-pretext\">\r\n {{pretext}}\r\n </div>\r\n }\r\n\r\n <!-- Multi-value chip display -->\r\n @if(isMultiValue) {\r\n <div class=\"chip-container\">\r\n <sa-chip \r\n *ngFor=\"let chip of chipValues; let i = index\"\r\n [text]=\"chip.value || chip.label || chip\"\r\n [type]=\"'regular'\"\r\n [state]=\"'primary'\"\r\n [filling]=\"'filled'\"\r\n [iconPosition]=\"'right'\"\r\n [iconPath]=\"'../assets/closeBlueOutlined.svg'\"\r\n (onClickEvent)=\"removeChip(i)\">\r\n </sa-chip>\r\n <input\r\n [ngClass]=\"'chip-input'\"\r\n matInput [type]=\"type\"\r\n [disabled]=\"field.props.disabled || false\"\r\n [placeholder]=\"chipValues.length === 0 ? (props?.placeholder || params?.placeholder || '') : ''\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onChipBlur()\"\r\n (input)=\"onChipInputChange($event)\"\r\n (keydown)=\"onChipKeyDown($event)\"\r\n [(ngModel)]=\"currentInputValue\"\r\n #formInput />\r\n </div>\r\n } @else {\r\n <!-- Standard single-value input (backward compatibility) -->\r\n <input\r\n [ngClass]=\"(!!inputVal && (params?.type === 'password' || props?.type === 'password') && icon.name !== 'eyeOff') ? 'masked' : ''\"\r\n matInput [type]=\"type\" value=\"\" [pattern]=\"type==='tel' ? '[0-9]' : '' \"\r\n [disabled]=\"field.props.disabled || false\"\r\n [placeholder]=\"!pretext && props?.placeholder || params?.placeholder || ''\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (input)=\"onInput($event)\" [(ngModel)]=\"inputVal\" #formInput />\r\n }\r\n\r\n @if(params?.type === 'password'){\r\n <sa-icon class=\"flex\" icon=\"eyeOutlined\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"!icon.name || icon.name === 'eyeOutlined' ? '' : 'hide'\"></sa-icon>\r\n <sa-icon class=\"flex\" icon=\"eyeOff\" [size]=\"icon.size || '24'\" (click)=\"inputIconClick()\"\r\n [ngClass]=\"icon.name === 'eyeOff' ? '' : 'hide'\"></sa-icon>\r\n }@else if(params?.type === 'email' && icon.show){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name || 'checkCircleOutlined'\" [size]=\"icon.size || '24'\"\r\n (click)=\"inputIconClick()\" [ngClass]=\"showEmailIcon ? '' : 'hide'\"></sa-icon>\r\n }\r\n @else if(icon?.name){\r\n <sa-icon class=\"flex\" [icon]=\"icon.name\" [size]=\"icon?.size || '24'\" [color]=\"icon?.color || ''\"\r\n [ngClass]=\"icon?.show ? '' : 'hide'\"></sa-icon>\r\n }\r\n </div>\r\n @if((!formControl.valid) || (params?.supportText)){\r\n <div class=\"support-label {{formControl.invalid && formControl.touched ? params?.className : ''}}\" [ngClass]=\"[\r\n formControl.invalid && formControl.touched ? 'invalid' : 'idle'\r\n ]\">\r\n <!-- {{!formControl.valid ? inputErrorText : params.supportText}} -->\r\n {{getFormSupportText()}}\r\n </div>\r\n }\r\n </div>\r\n</div>", styles: ["*{--error-red: #e25c61 }.idle{--border: 1px solid var(--grey-50)}.focus{--border: 1px solid var(--primary-300)}.masked{font-size:28px;font-weight:500;padding-top:4px}.disabled .sa-input-field,[disabled]{background-color:#fafafa;cursor:not-allowed}.disabled .sa-input-field input{color:#989da3}.sa-input-field>input,.sa-input-field>input:focus-visible{--border: 1px solid var(--primary-300);border:none;outline:none}.sa-input-field:hover{--border: 1px solid var(--primary-300);--font-color: var(--text-highemphasis)}.sa-input-field sa-icon{color:var(--icon-grey1)}.sa-input-field>input:focus-visible~sa-icon,.sa-input-field:hover sa-icon{color:var(--primary-300)}.sa-input-field.invalid>input,.sa-input-field.invalid sa-icon,.sa-input-field.invalid .sa-input-pretext{color:#e25c61}.sa-input-field.invalid{--border: 1px solid #e25c61}.sa-input-field.invalid sa-icon{--form-email-icon-color: #e25c61}.sa-input-field.idle sa-icon{--form-email-icon-color: #33961F}.sa-input{position:relative;padding:8px 0}.sa-input-pretext{margin-right:2px}.sa-input-field{width:100%;box-sizing:border-box;position:relative;display:inline-flex;padding:0px var(--small-12px);height:40px;justify-content:center;align-items:center;border:1px solid var(--grey-100, #EAECF0);border-radius:var(--small-4px);font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;--font-color: var(--text-lowemphasis)}.sa-input-field input{width:inherit}.sa-input-tag{position:absolute;background:#fff;padding:2px 6px;top:-1px;left:12px;z-index:2;font-size:11px;font-weight:500;line-height:16px;letter-spacing:.5px;text-align:left;color:var(--text-lowemphasis)}.support-label{font-family:var(--font);font-size:11px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.5px;color:var(--text-lowemphasis);padding:var(--small-4px) var(--small-16px) 0px var(--small-16px)}.support-label.invalid{color:var(--error-red)}.hide{display:none}.sa-input-big-label-container,.sa-input-label-container{display:flex;flex-direction:column;gap:var(--small-8px, 8px)}.sa-input-big-label{color:var(--text-highemphasis, #1C1B20);font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px, 22px);font-style:normal;font-weight:500;line-height:var(--medium-28px, 28px);margin:0}.sa-input-big-description,.sa-input-description{color:var(--text-mediumemphasis, #6D6979);font-family:var(--font-roboto, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.sa-input-container{display:flex;flex-direction:column;gap:var(--medium-20px, 20px)}.sa-input-label{color:var(--text-highemphasis, #1B1D20);font-family:var(--font);font-size:var(--small-14px);font-style:normal;font-weight:500;line-height:var(--medium-20px);letter-spacing:.1px}.sa-input-label-tooltip-container{display:flex;gap:var(--small-4px);align-items:center}.d-flex{display:flex}.chip-container{display:flex;flex-wrap:wrap;align-items:center;gap:4px;width:100%;min-height:20px}.chip-input{border:none;outline:none;background:transparent;flex:1;min-width:60px;font-size:14px;font-family:inherit;color:inherit}.chip-input::placeholder{color:var(--text-medium-emphasis, #6D6979)}.chip-container sa-chip{margin:2px 0}\n"] }]
236
298
  }], ctorParameters: () => [], propDecorators: { formInput: [{
237
299
  type: ViewChild,
238
300
  args: ['formInput']
239
301
  }], icon: [{
240
302
  type: Input,
241
303
  args: ['icon']
304
+ }], params: [{
305
+ type: Input
242
306
  }] } });
243
307
  export var IInputEventType;
244
308
  (function (IInputEventType) {
@@ -246,4 +310,4 @@ export var IInputEventType;
246
310
  IInputEventType["STATE_CHANGE"] = "STATE_CHANGE";
247
311
  IInputEventType["ICON_CLICK"] = "ICON_CLICK";
248
312
  })(IInputEventType || (IInputEventType = {}));
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL2Zvcm0taW5wdXQvZm9ybS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL2Zvcm0taW5wdXQvZm9ybS1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUdMLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7QUFlN0QsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFNBQTBCO0lBMEJoRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBcEJWLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFDcEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUdkLGlCQUFZLEdBQVEsSUFBSSxDQUFDO1FBQ3pCLG1DQUFtQztRQUNuQywyQkFB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QWdCOzsyRkFLUCxrQkFBa0I7a0JBZDlCLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsZ0JBQWdCO3FCQUNqQjt3REFLdUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUVQLElBQUk7c0JBQWxCLEtBQUs7dUJBQUMsTUFBTTs7QUE4UWYsTUFBTSxDQUFOLElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6QixnREFBNkIsQ0FBQTtJQUM3QixnREFBNkIsQ0FBQTtJQUM3Qiw0Q0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBSlcsZUFBZSxLQUFmLGVBQWUsUUFJMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRm9ybWx5TW9kdWxlIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XHJcbmltcG9ydCB7IEZpZWxkVHlwZSwgRmllbGRUeXBlQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XHJcbmltcG9ydCB7IE5nU2VsZWN0TW9kdWxlIH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIGdldFZhbGlkYXRpb25NZXNzYWdlLFxyXG4gIHBob25lTnVtYmVyVmFsaWRhdG9yLFxyXG59IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvcnMnO1xyXG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGdldCBhcyBfZ2V0LCBzZXQgYXMgX3NldCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzYS1pbnB1dCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBGb3JtbHlNb2R1bGUsXHJcbiAgICBJY29uQ29tcG9uZW50LFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0taW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9mb3JtLWlucHV0LmNvbXBvbmVudC5jc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUlucHV0Q29tcG9uZW50IGV4dGVuZHMgRmllbGRUeXBlPEZpZWxkVHlwZUNvbmZpZz4ge1xyXG4gIEBWaWV3Q2hpbGQoJ2Zvcm1JbnB1dCcpIGZvcm1JbnB1dCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgnaWNvbicpIGljb246IElJbnB1dEljb247XHJcblxyXG4gIHByZXRleHQ6IHN0cmluZztcclxuXHJcbiAgaW5wdXRTdGF0ZSA9ICdpZGxlJztcclxuICBpbnB1dFZhbCA9ICcnO1xyXG4gIHBhcmFtczogSUlucHV0UGFyYW0gfCBudWxsO1xyXG4gIGRlcGVuZGVudDogQWJzdHJhY3RDb250cm9sPGFueSwgYW55PiB8IG51bGw7XHJcbiAgZGVwZW5kZW50VmFsOiBhbnkgPSBudWxsO1xyXG4gIC8vIGR5bmFtaWNJY29uOiBEeW5hbWljSWNvbiB8IG51bGw7XHJcbiAgLy8gaWNvbjogSUlucHV0SWNvbiB8IG51bGw7XHJcblxyXG4gIHR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIHZhbGlkYXRvcnM6IGFueVtdO1xyXG4gIGFzeW5jVmFsaWRhdG9yczogYW55W107XHJcblxyXG4gIGlucHV0RXJyb3JUZXh0OiBzdHJpbmcgPSAnaW52YWxpZCBpbnB1dCc7XHJcblxyXG4gIHNob3dFbWFpbEljb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHN1cHByZXNzT25CbHVyID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbnB1dFZhbCA9XHJcbiAgICAgIHRoaXMuZmllbGQucHJvcHNbJ3ZhbHVlJ10gfHwgdGhpcy5tb2RlbFt0aGlzLmtleSBhcyBzdHJpbmddIHx8ICcnO1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuZmllbGQucHJvcHMuZGlzYWJsZWQgfHwgZmFsc2U7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sPy5zZXRWYWx1ZSh0aGlzLmlucHV0VmFsKTtcclxuXHJcbiAgICB0aGlzLnBhcmFtcyA9IHRoaXMuZmllbGQucHJvcHNbJ3BhcmFtcyddO1xyXG4gICAgdGhpcy5pY29uID0gdGhpcy5maWVsZC5wcm9wc1snaWNvbiddIHx8IHt9O1xyXG4gICAgdGhpcy50eXBlID0gdGhpcy5wYXJhbXM/LnR5cGUgfHwgJyc7XHJcblxyXG4gICAgLy8gdGhpcy5keW5hbWljSWNvbiA9IHRoaXMuZmllbGQucHJvcHNbJ2R5bmFtaWNJY29uJ107XHJcbiAgICB0aGlzLnNldFZhbGlkYXRvcnMoKTtcclxuICAgIHRoaXMuc2V0RGVwZW5kZW50cygpO1xyXG5cclxuICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdlbWFpbCcpIHtcclxuICAgICAgICBpZiAoISF0aGlzLmlucHV0VmFsICYmICF0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQpIHtcclxuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dFbWFpbEljb24gPVxyXG4gICAgICAgICAgc3RhdGUgPT09ICdWQUxJRCcgfHxcclxuICAgICAgICAgIChzdGF0ZSA9PT0gJ0lOVkFMSUQnICYmXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ2ludmFsaWQnKSAmJlxyXG4gICAgICAgICAgICAhIXRoaXMuZm9ybUNvbnRyb2wudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgIF9zZXQodGhpcy5mb3JtSW5wdXQsICduYXRpdmVFbGVtZW50LnZhbHVlJywgdmFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsaWRhdG9ycygpIHtcclxuICAgIHRoaXMudmFsaWRhdG9ycyA9IHRoaXMucGFyYW1zPy52YWxpZGF0b3JzIHx8IHRoaXMucHJlZGVmaW5lZFZhbGlkYXRvcnNbdGhpcy50eXBlXSB8fCBbXTtcclxuICAgIHRoaXMuYXN5bmNWYWxpZGF0b3JzID0gdGhpcy5wYXJhbXM/LmFzeW5jVmFsaWRhdG9ycyB8fCBbXTtcclxuICAgIGlmKCFfZ2V0KHRoaXMuZmllbGQsICd2YWxpZGF0b3JzLnZhbGlkYXRpb24nLCBudWxsKSkge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sPy5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAuLi4odGhpcy50eXBlID8gdGhpcy5wcmVkZWZpbmVkVmFsaWRhdG9yc1t0aGlzLnR5cGVdIHx8IFtdIDogW10pLFxyXG4gICAgICAgIC4uLih0aGlzLnZhbGlkYXRvcnMpLFxyXG4gICAgICBdKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFzeW5jVmFsaWRhdG9ycykge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sPy5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5hc3luY1ZhbGlkYXRvcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIEFzc3VtaW5nIGRlcGVuZGVudCBmaWVsZCBpcyBhIHNpbmdsZSBzZWxlY3QgZHJvcGRvd25cclxuICAqL1xyXG4gIHNldERlcGVuZGVudHMoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXM/LmRlcGVuZGVudCkge1xyXG4gICAgICB0aGlzLmRlcGVuZGVudCA9IHRoaXMuZm9ybS5nZXQoW3RoaXMucGFyYW1zPy5kZXBlbmRlbnRdKTtcclxuXHJcbiAgICAgIHRoaXMuZGVwZW5kZW50VmFsID0gdGhpcy5nZXREZXBlbmRlbnRWYWwoX2dldCh0aGlzLmRlcGVuZGVudCwgJ3ZhbHVlJykpO1xyXG4gICAgICBpZiAodGhpcy50eXBlID09PSAndGVsJykge1xyXG4gICAgICAgIHRoaXMucHJldGV4dCA9IHRoaXMuZGVwZW5kZW50VmFsPy5kaWFsX2NvZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGVwZW5kZW50Py52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWwpID0+IHtcclxuICAgICAgICB0aGlzLmRlcGVuZGVudFZhbCA9IHRoaXMuZ2V0RGVwZW5kZW50VmFsKHZhbCk7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5pbnB1dFZhbCk7XHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3RlbCcpIHtcclxuICAgICAgICAgIHRoaXMucHJldGV4dCA9IHRoaXMuZGVwZW5kZW50VmFsPy5kaWFsX2NvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0RGVwZW5kZW50VmFsKHZhbHVlOiBhbnkpIHtcclxuICAgIGxldCBkZXBlbmRlbnRWYWx1ZTogYW55O1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIGRlcGVuZGVudFZhbHVlID0gdmFsdWUubGVuZ3RoID8gdmFsdWVbMF0gOiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVwZW5kZW50VmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZXBlbmRlbnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGNoZWNrVmFsaWRpdHkoZGVmYXVsdElucHV0U3RhdGUgPSAnZm9jdXMnKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgJiZcclxuICAgICAgIXRoaXMuZm9ybUNvbnRyb2wudmFsaWQgJiZcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC50b3VjaGVkICYmXHJcbiAgICAgICF0aGlzLmZvcm1Db250cm9sLnBlbmRpbmdcclxuICAgICkge1xyXG4gICAgICB0aGlzLmlucHV0U3RhdGUgPSAnaW52YWxpZCc7XHJcbiAgICAgIHRoaXMuaW5wdXRFcnJvclRleHQgPVxyXG4gICAgICAgIGdldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzLCB0aGlzLnBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgdGhpcy5maWVsZC5wcm9wcz8ubGFiZWwgfHwgJ0lucHV0Jywge1xyXG4gICAgICAgICAgZmllbGQ6IHRoaXMuZmllbGQsXHJcbiAgICAgICAgICBuYXRpdmVWYWxpZGF0aW9uT2JqZWN0OiB0aGlzLmZpZWxkLnZhbGlkYXRpb24sXHJcbiAgICAgICAgfSkgfHwgYGludmFsaWQgJHt0aGlzLnBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgdGhpcy5maWVsZC5wcm9wcz8ubGFiZWwgfHwgJ2lucHV0J31gXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlucHV0U3RhdGUgPSBkZWZhdWx0SW5wdXRTdGF0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWxpZCkgdGhpcy5pbnB1dFN0YXRlID0gJ2ZvY3VzJztcclxuICB9XHJcbiAgb25CbHVyKCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5zdXBwcmVzc09uQmx1cikge1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZGl0eSgnaWRsZScpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3VwcHJlc3NPbkJsdXIgPSBmYWxzZTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBvbklucHV0KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcz8udHlwZSA9PT0gJ3RlbCcpIHtcclxuICAgICAgdGhpcy5pbnB1dFZhbCA9IHRoaXMuaW5wdXRWYWwucmVwbGFjZSgvW14wLTkoKStcXC0gXS9nLCAnJyk7XHJcbiAgICAgIHRoaXMuaW5wdXRWYWwgPSB0aGlzLmh5cGhlbmF0ZVBob25lTnVtYmVyKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wYXJhbXM/LnR5cGUgPT09ICdwZXJjZW50YWdlJykge1xyXG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLmlucHV0VmFsLnJlcGxhY2UoL1teMC05Ll0vZywgJycpO1xyXG4gICAgICB0aGlzLmlucHV0VmFsID0gdmFsdWUgPyBgJHt2YWx1ZX0lYCA6ICcnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtQ29udHJvbD8uc2V0VmFsdWUodGhpcy5pbnB1dFZhbCk7XHJcbiAgICB0aGlzLmNoZWNrVmFsaWRpdHkoKTtcclxuICAgIC8qaWYgKHRoaXMucGFyYW1zPy5ldmVudExpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zPy5ldmVudExpc3RlbmVyKHtcclxuICAgICAgICB0eXBlOiBJSW5wdXRFdmVudFR5cGUuSU5QVVRfQ0hBTkdFLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmlucHV0VmFsLFxyXG4gICAgICAgIGZvcm1Db250cm9sOiB0aGlzLmZvcm1Db250cm9sXHJcbiAgICAgIH0gYXMgSUlucHV0RXZlbnQpLnRoZW4odGhpcy5vbkZpZWxkQ2FsbGJhY2suYmluZCh0aGlzKSk7XHJcbiAgICB9Ki9cclxuICB9XHJcblxyXG4gIGh5cGhlbmF0ZVBob25lTnVtYmVyKCkge1xyXG4gICAgbGV0IG5ld1N0ciA9ICcnO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGh5cGhlbmF0ZWRDb3VudCA9IDE7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5wdXRWYWwucmVwbGFjZUFsbCgnLScsICcnKTtcclxuICAgIGZvciAoOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbmV3U3RyID0gbmV3U3RyICsgdmFsdWUuY2hhckF0KGkpO1xyXG4gICAgICBpZiAoIShoeXBoZW5hdGVkQ291bnQgJSAzKSkge1xyXG4gICAgICAgIGlmICghKChpICsgMSkgJSAxMCkgJiYgaSArIDEgPCB2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIG5ld1N0ciA9IG5ld1N0ciArICctJztcclxuICAgICAgICAgIGh5cGhlbmF0ZWRDb3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAhKChpICsgMSAtIE1hdGguZmxvb3IoaHlwaGVuYXRlZENvdW50IC8gMykpICUgMykgJiZcclxuICAgICAgICBpICsgMSA8IHZhbHVlLmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICBuZXdTdHIgPSBuZXdTdHIgKyAnLSc7XHJcbiAgICAgICAgaHlwaGVuYXRlZENvdW50Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3U3RyO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dEZpZWxkQ2xpY2soZXZlbnQ6IGFueSA9ICdpbnB1dCcpIHtcclxuICAgIGlmIChcclxuICAgICAgZXZlbnQgPT09ICdpbnB1dCcgfHxcclxuICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2EtaW5wdXQtZmllbGQnKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuZm9ybUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgaWYgKHRoaXMucGFyYW1zPy50eXBlICE9PSAnZW1haWwnKVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5mb3JtSW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFZhbC5sZW5ndGgsXHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWwubGVuZ3RoLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LCAxMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnB1dEljb25DbGljaygpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcz8udHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICB0aGlzLnN1cHByZXNzT25CbHVyID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICAgIHRoaXMudHlwZSA9ICd0ZXh0JztcclxuICAgICAgICB0aGlzLmljb24ubmFtZSA9ICdleWVPZmYnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHlwZSA9ICdwYXNzd29yZCc7XHJcbiAgICAgICAgdGhpcy5pY29uLm5hbWUgPSAnZXllT3V0bGluZWQnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub25JbnB1dEZpZWxkQ2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qb25GaWVsZENhbGxiYWNrKHBhcmFtOiBJSW5wdXRQYXJhbSkge1xyXG4gICAgdGhpcy5pY29uID0gcGFyYW0uaWNvbiB8fCB0aGlzLmljb247XHJcbiAgICB0aGlzLmNoZWNrVmFsaWRpdHkoKTtcclxuICB9Ki9cclxuXHJcbiAgZ2V0Rm9ybVN1cHBvcnRUZXh0KCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wuaW52YWxpZCAmJiB0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBnZXRWYWxpZGF0aW9uTWVzc2FnZSh0aGlzLmZvcm1Db250cm9sLmVycm9ycywgdGhpcy5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8IHRoaXMuZmllbGQucHJvcHM/LmxhYmVsIHx8ICdJbnB1dCcse1xyXG4gICAgICAgICAgZmllbGQ6IHRoaXMuZmllbGQsXHJcbiAgICAgICAgICBuYXRpdmVWYWxpZGF0aW9uT2JqZWN0OiBfZ2V0KHRoaXMuZmllbGQsICd2YWxpZGF0aW9uJyksXHJcbiAgICAgICAgfSkgfHxcclxuICAgICAgICBgaW52YWxpZCAke3RoaXMucGFyYW1zPy5wbGFjZWhvbGRlciB8fCB0aGlzLmZpZWxkLnByb3BzPy5sYWJlbCB8fCAnaW5wdXQnfWBcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtcz8uc3VwcG9ydFRleHQgfHwgJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmVkZWZpbmVkVmFsaWRhdG9yczogYW55ID0ge1xyXG4gICAgZW1haWw6IFtWYWxpZGF0b3JzLmVtYWlsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIHBhc3N3b3JkOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICB0ZWw6IFtWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05ICtcXFxcLSgpXSokJyldLFxyXG4gIH07XHJcblxyXG4gIGdldExhYmVsRmllbGRHYXAoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnByb3BzPy5bJ2JpZ0xhYmVsJ10pIHtcclxuICAgICAgcmV0dXJuICd2YXIoLS1tZWRpdW0tMjBweCknO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzPy5bJ2xhYmVsJ10pIHtcclxuICAgICAgcmV0dXJuICd2YXIoLS1zbWFsbC00cHgpJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnMHB4JzsgLy8gTm8gZ2FwXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJbnB1dEljb24ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBzaG93PzogYm9vbGVhbjtcclxuICBjb2xvcj86IHN0cmluZztcclxuICBzaXplPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJbnB1dFBhcmFtIHtcclxuICB2YWxpZGF0b3JzPzogYW55W107XHJcbiAgYXN5bmNWYWxpZGF0b3JzPzogYW55W107XHJcbiAgc3VwcG9ydFRleHQ/OiBzdHJpbmc7XHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgdHlwZT86IHN0cmluZztcclxuICBkZXBlbmRlbnQ/OiBzdHJpbmc7XHJcbiAgZXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xyXG4gIGljb24/OiBJSW5wdXRJY29uO1xyXG4gIGVycm9ycz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XHJcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUlucHV0RXZlbnQge1xyXG4gIHR5cGU6IElJbnB1dEV2ZW50VHlwZTtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIGNhbGxCYWNrOiBhbnk7XHJcbiAgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG59XHJcbmV4cG9ydCBlbnVtIElJbnB1dEV2ZW50VHlwZSB7XHJcbiAgSU5QVVRfQ0hBTkdFID0gJ0lOUFVUX0NIQU5HRScsXHJcbiAgU1RBVEVfQ0hBTkdFID0gJ1NUQVRFX0NIQU5HRScsXHJcbiAgSUNPTl9DTElDSyA9ICdJQ09OX0NMSUNLJyxcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwic2EtaW5wdXQtY29udGFpbmVyIHt7cHJvcHM/LlsnaW5wdXRDb250YWluZXJDbGFzcyddfX1cIiBbbmdTdHlsZV09XCJ7J2dhcCc6IGdldExhYmVsRmllbGRHYXAoKX1cIj5cclxuICAgIEBpZiAoISFwcm9wcz8uWydiaWdMYWJlbCddIHx8ICEhcHJvcHM/LlsnYmlnRGVzY3JpcHRpb24nXSkge1xyXG4gICAgPGRpdiBjbGFzcz1cInNhLWlucHV0LWJpZy1sYWJlbC1jb250YWluZXJcIiBbbmdDbGFzc109XCJkaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiAnJyBcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJzYS1pbnB1dC1iaWctbGFiZWxcIj5cclxuICAgICAgICAgICAge3twcm9wcz8uWydiaWdMYWJlbCddfX1cclxuICAgICAgICA8L2gyPlxyXG4gICAgICAgIDxwIGNsYXNzPVwic2EtaW5wdXQtYmlnLWRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgIHt7cHJvcHM/LlsnYmlnRGVzY3JpcHRpb24nXX19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICBAaWYoISFwcm9wcz8uWydsYWJlbCddKXtcclxuICAgIDxkaXYgY2xhc3M9XCJzYS1pbnB1dC1sYWJlbC1jb250YWluZXJcIiBbbmdDbGFzc109XCJkaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiAnJyBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2EtaW5wdXQtbGFiZWwtdG9vbHRpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYS1pbnB1dC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAge3twcm9wcz8uWydsYWJlbCddfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICBAaWYoISFwcm9wcz8uWyd0b29sdGlwJ10pe1xyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvb2x0aXAtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c2EtaWNvbiBbaWNvbl09XCJwcm9wcz8uWyd0b29sdGlwSWNvbiddIHx8ICdpbmZvQ2lyY2xlT3V0bGluZWQnXCIgY3VzdG9tQ2xhc3M9XCJpbmZvLWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInByb3BzPy5bJ3Rvb2x0aXAnXVwiIG1hdFRvb2x0aXBDbGFzcz1cImN1c3RvbS10b29sdGlwXCIgY2xhc3M9XCJ0b29sdGlwLWljb24gZC1mbGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJwcm9wcz8uWyd0b29sdGlwSWNvblNpemUnXSB8fCAnMjAnXCI+PC9zYS1pY29uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYoISFwcm9wcz8uWydkZXNjcmlwdGlvbiddKSB7XHJcbiAgICAgICAgPHAgY2xhc3M9XCJzYS1pbnB1dC1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICB7e3Byb3BzPy5bJ2Rlc2NyaXB0aW9uJ119fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIDxkaXYgY2xhc3M9XCJzYS1pbnB1dFwiIFtuZ0NsYXNzXT1cImRpc2FibGVkID8gJ2Rpc2FibGVkJyA6ICcnIFwiPlxyXG4gICAgICAgIEBpZigocHJldGV4dCB8fCAoISFpbnB1dFZhbD8ubGVuZ3RoICYmICghIXBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgISFwcm9wcz8ucGxhY2Vob2xkZXIpKSkgJiYgcHJvcHM/Llsnc2hvd1RhZyddXHJcbiAgICAgICAgIT09IGZhbHNlKXtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNhLWlucHV0LXRhZ1wiPnt7cGFyYW1zPy5wbGFjZWhvbGRlciB8fCBwcm9wcz8ucGxhY2Vob2xkZXJ9fTwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNhLWlucHV0LWZpZWxkXCIgW25nQ2xhc3NdPVwiZm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmb3JtQ29udHJvbC50b3VjaGVkID8gJ2ludmFsaWQnIDogJ2lkbGUnIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbklucHV0RmllbGRDbGljaygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIEBpZihwcmV0ZXh0KXtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhLWlucHV0LXByZXRleHRcIj5cclxuICAgICAgICAgICAgICAgIHt7cHJldGV4dH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIighIWlucHV0VmFsICYmIChwYXJhbXM/LnR5cGUgPT09ICdwYXNzd29yZCcgfHwgcHJvcHM/LnR5cGUgPT09ICdwYXNzd29yZCcpICYmIGljb24ubmFtZSAhPT0gJ2V5ZU9mZicpID8gJ21hc2tlZCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dCBbdHlwZV09XCJ0eXBlXCIgdmFsdWU9XCJcIiBbcGF0dGVybl09XCJ0eXBlPT09J3RlbCcgPyAnWzAtOV0nIDogJycgXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5wcm9wcy5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiIXByZXRleHQgJiYgcHJvcHM/LnBsYWNlaG9sZGVyIHx8IHBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgJydcIiAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCIgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwiaW5wdXRWYWxcIiAjZm9ybUlucHV0IC8+XHJcblxyXG4gICAgICAgICAgICBAaWYocGFyYW1zPy50eXBlID09PSAncGFzc3dvcmQnKXtcclxuICAgICAgICAgICAgPHNhLWljb24gY2xhc3M9XCJmbGV4XCIgaWNvbj1cImV5ZU91dGxpbmVkXCIgW3NpemVdPVwiaWNvbi5zaXplIHx8ICcyNCdcIiAoY2xpY2spPVwiaW5wdXRJY29uQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIhaWNvbi5uYW1lIHx8IGljb24ubmFtZSA9PT0gJ2V5ZU91dGxpbmVkJyA/ICcnIDogJ2hpZGUnXCI+PC9zYS1pY29uPlxyXG4gICAgICAgICAgICA8c2EtaWNvbiBjbGFzcz1cImZsZXhcIiBpY29uPVwiZXllT2ZmXCIgW3NpemVdPVwiaWNvbi5zaXplIHx8ICcyNCdcIiAoY2xpY2spPVwiaW5wdXRJY29uQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpY29uLm5hbWUgPT09ICdleWVPZmYnID8gJycgOiAnaGlkZSdcIj48L3NhLWljb24+XHJcbiAgICAgICAgICAgIH1AZWxzZSBpZihwYXJhbXM/LnR5cGUgPT09ICdlbWFpbCcgJiYgaWNvbi5zaG93KXtcclxuICAgICAgICAgICAgPHNhLWljb24gY2xhc3M9XCJmbGV4XCIgW2ljb25dPVwiaWNvbi5uYW1lIHx8ICdjaGVja0NpcmNsZU91dGxpbmVkJ1wiIFtzaXplXT1cImljb24uc2l6ZSB8fCAnMjQnXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnB1dEljb25DbGljaygpXCIgW25nQ2xhc3NdPVwic2hvd0VtYWlsSWNvbiA/ICcnIDogJ2hpZGUnXCI+PC9zYS1pY29uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBlbHNlIGlmKGljb24/Lm5hbWUpe1xyXG4gICAgICAgICAgICA8c2EtaWNvbiBjbGFzcz1cImZsZXhcIiBbaWNvbl09XCJpY29uLm5hbWVcIiBbc2l6ZV09XCJpY29uPy5zaXplIHx8ICcyNCdcIiBbY29sb3JdPVwiaWNvbj8uY29sb3IgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaWNvbj8uc2hvdyA/ICcnIDogJ2hpZGUnXCI+PC9zYS1pY29uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgQGlmKCghZm9ybUNvbnRyb2wudmFsaWQpIHx8IChwYXJhbXM/LnN1cHBvcnRUZXh0KSl7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXBwb3J0LWxhYmVsIHt7Zm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmb3JtQ29udHJvbC50b3VjaGVkID8gcGFyYW1zPy5jbGFzc05hbWUgOiAnJ319XCIgW25nQ2xhc3NdPVwiW1xyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmb3JtQ29udHJvbC50b3VjaGVkID8gJ2ludmFsaWQnIDogJ2lkbGUnXHJcbiAgICAgICAgICAgICAgXVwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSB7eyFmb3JtQ29udHJvbC52YWxpZCA/IGlucHV0RXJyb3JUZXh0IDogcGFyYW1zLnN1cHBvcnRUZXh0fX0gLS0+XHJcbiAgICAgICAgICAgICAgICB7e2dldEZvcm1TdXBwb3J0VGV4dCgpfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL2Zvcm0taW5wdXQvZm9ybS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL2Zvcm0taW5wdXQvZm9ybS1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUdMLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQWdCN0QsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFNBQTBCO0lBNkJoRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBdkJWLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFDcEIsYUFBUSxHQUFHLEVBQUUs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QUFBO0lBQzdCLDRDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFKVyxlQUFlLEtBQWYsZUFBZSxRQUkxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3Jtc01vZHVsZSxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcclxuaW1wb3J0IHsgRmllbGRUeXBlLCBGaWVsZFR5cGVDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcclxuaW1wb3J0IHsgTmdTZWxlY3RNb2R1bGUgfSBmcm9tICdAbmctc2VsZWN0L25nLXNlbGVjdCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgZ2V0VmFsaWRhdGlvbk1lc3NhZ2UsXHJcbiAgcGhvbmVOdW1iZXJWYWxpZGF0b3IsXHJcbn0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9ycyc7XHJcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2hpcHNDb21wb25lbnQgfSBmcm9tICcuLi9jaGlwcy9jaGlwcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBnZXQgYXMgX2dldCwgc2V0IGFzIF9zZXQsIG1hcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzYS1pbnB1dCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBGb3JtbHlNb2R1bGUsXHJcbiAgICBJY29uQ29tcG9uZW50LFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIENoaXBzQ29tcG9uZW50XHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0taW5wdXQuY29tcG9uZW50LmNzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPiB7XHJcbiAgQFZpZXdDaGlsZCgnZm9ybUlucHV0JykgZm9ybUlucHV0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCdpY29uJykgaWNvbjogSUlucHV0SWNvbjtcclxuXHJcbiAgcHJldGV4dDogc3RyaW5nO1xyXG5cclxuICBpbnB1dFN0YXRlID0gJ2lkbGUnO1xyXG4gIGlucHV0VmFsID0gJyc7XHJcbiAgQElucHV0KCkgcGFyYW1zOiBJSW5wdXRQYXJhbSB8IG51bGw7XHJcbiAgZGVwZW5kZW50OiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+IHwgbnVsbDtcclxuICBkZXBlbmRlbnRWYWw6IGFueSA9IG51bGw7XHJcbiAgLy8gZHluYW1pY0ljb246IER5bmFtaWNJY29uIHwgbnVsbDtcclxuICAvLyBpY29uOiBJSW5wdXRJY29uIHwgbnVsbDtcclxuXHJcbiAgdHlwZTogc3RyaW5nID0gJyc7XHJcbiAgdmFsaWRhdG9yczogYW55W107XHJcbiAgYXN5bmNWYWxpZGF0b3JzOiBhbnlbXTtcclxuXHJcbiAgaW5wdXRFcnJvclRleHQ6IHN0cmluZyA9ICdpbnZhbGlkIGlucHV0JztcclxuXHJcbiAgc2hvd0VtYWlsSWNvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2hpcFZhbHVlczogYW55W10gPSBbXTtcclxuICBpc011bHRpVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjdXJyZW50SW5wdXRWYWx1ZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgc3VwcHJlc3NPbkJsdXIgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlucHV0VmFsID1cclxuICAgICAgdGhpcy5maWVsZC5wcm9wc1sndmFsdWUnXSB8fCB0aGlzLm1vZGVsW3RoaXMua2V5IGFzIHN0cmluZ10gfHwgJyc7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5maWVsZC5wcm9wcy5kaXNhYmxlZCB8fCBmYWxzZTtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2w/LnNldFZhbHVlKHRoaXMuaW5wdXRWYWwpO1xyXG5cclxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5wYXJhbXMgfHwgdGhpcy5maWVsZC5wcm9wc1sncGFyYW1zJ107XHJcbiAgICB0aGlzLmljb24gPSB0aGlzLmljb24gfHwgdGhpcy5maWVsZC5wcm9wc1snaWNvbiddIHx8IHt9O1xyXG4gICAgdGhpcy50eXBlID0gdGhpcy5wYXJhbXM/LnR5cGUgfHwgJyc7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbCkgPT4ge1xyXG4gICAgICBfc2V0KHRoaXMuZm9ybUlucHV0LCAnbmF0aXZlRWxlbWVudC52YWx1ZScsIHZhbCk7XHJcbiAgICAgIC8vIEhhbmRsZSBtdWx0aS12YWx1ZSBjaGlwIHVwZGF0ZXNcclxuICAgICAgaWYgKHRoaXMuaXNNdWx0aVZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xyXG4gICAgICAgIHRoaXMuY2hpcFZhbHVlcyA9IHZhbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBtdWx0aS12YWx1ZSBtb2RlIGlmIHNwZWNpZmllZFxyXG4gICAgaWYgKHRoaXMucGFyYW1zPy50eXBlID09PSAnbXVsdGktdmFsdWUnIHx8IHRoaXMucGFyYW1zPy5tdWx0aVZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaXNNdWx0aVZhbHVlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jaGlwVmFsdWVzID0gdGhpcy5tb2RlbFt0aGlzLmtleSBhcyBzdHJpbmddIHx8IHRoaXMucGFyYW1zPy5jaGlwVmFsdWVzIHx8IFtdO1xyXG4gICAgICB0aGlzLmN1cnJlbnRJbnB1dFZhbHVlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5keW5hbWljSWNvbiA9IHRoaXMuZmllbGQucHJvcHNbJ2R5bmFtaWNJY29uJ107XHJcbiAgICB0aGlzLnNldFZhbGlkYXRvcnMoKTtcclxuICAgIHRoaXMuc2V0RGVwZW5kZW50cygpO1xyXG5cclxuICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdlbWFpbCcpIHtcclxuICAgICAgICBpZiAoISF0aGlzLmlucHV0VmFsICYmICF0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQpIHtcclxuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dFbWFpbEljb24gPVxyXG4gICAgICAgICAgc3RhdGUgPT09ICdWQUxJRCcgfHxcclxuICAgICAgICAgIChzdGF0ZSA9PT0gJ0lOVkFMSUQnICYmXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ2ludmFsaWQnKSAmJlxyXG4gICAgICAgICAgICAhIXRoaXMuZm9ybUNvbnRyb2wudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgIF9zZXQodGhpcy5mb3JtSW5wdXQsICduYXRpdmVFbGVtZW50LnZhbHVlJywgdmFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsaWRhdG9ycygpIHtcclxuICAgIHRoaXMudmFsaWRhdG9ycyA9IHRoaXMucGFyYW1zPy52YWxpZGF0b3JzIHx8IHRoaXMucHJlZGVmaW5lZFZhbGlkYXRvcnNbdGhpcy50eXBlXSB8fCBbXTtcclxuICAgIHRoaXMuYXN5bmNWYWxpZGF0b3JzID0gdGhpcy5wYXJhbXM/LmFzeW5jVmFsaWRhdG9ycyB8fCBbXTtcclxuICAgIGlmKCFfZ2V0KHRoaXMuZmllbGQsICd2YWxpZGF0b3JzLnZhbGlkYXRpb24nLCBudWxsKSkge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sPy5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAuLi4odGhpcy50eXBlID8gdGhpcy5wcmVkZWZpbmVkVmFsaWRhdG9yc1t0aGlzLnR5cGVdIHx8IFtdIDogW10pLFxyXG4gICAgICAgIC4uLih0aGlzLnZhbGlkYXRvcnMpLFxyXG4gICAgICBdKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFzeW5jVmFsaWRhdG9ycykge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sPy5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5hc3luY1ZhbGlkYXRvcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIEFzc3VtaW5nIGRlcGVuZGVudCBmaWVsZCBpcyBhIHNpbmdsZSBzZWxlY3QgZHJvcGRvd25cclxuICAqL1xyXG4gIHNldERlcGVuZGVudHMoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXM/LmRlcGVuZGVudCkge1xyXG4gICAgICB0aGlzLmRlcGVuZGVudCA9IHRoaXMuZm9ybS5nZXQoW3RoaXMucGFyYW1zPy5kZXBlbmRlbnRdKTtcclxuXHJcbiAgICAgIHRoaXMuZGVwZW5kZW50VmFsID0gdGhpcy5nZXREZXBlbmRlbnRWYWwoX2dldCh0aGlzLmRlcGVuZGVudCwgJ3ZhbHVlJykpO1xyXG4gICAgICBpZiAodGhpcy50eXBlID09PSAndGVsJykge1xyXG4gICAgICAgIHRoaXMucHJldGV4dCA9IHRoaXMuZGVwZW5kZW50VmFsPy5kaWFsX2NvZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGVwZW5kZW50Py52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWwpID0+IHtcclxuICAgICAgICB0aGlzLmRlcGVuZGVudFZhbCA9IHRoaXMuZ2V0RGVwZW5kZW50VmFsKHZhbCk7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5pbnB1dFZhbCk7XHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3RlbCcpIHtcclxuICAgICAgICAgIHRoaXMucHJldGV4dCA9IHRoaXMuZGVwZW5kZW50VmFsPy5kaWFsX2NvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0RGVwZW5kZW50VmFsKHZhbHVlOiBhbnkpIHtcclxuICAgIGxldCBkZXBlbmRlbnRWYWx1ZTogYW55O1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIGRlcGVuZGVudFZhbHVlID0gdmFsdWUubGVuZ3RoID8gdmFsdWVbMF0gOiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVwZW5kZW50VmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZXBlbmRlbnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGNoZWNrVmFsaWRpdHkoZGVmYXVsdElucHV0U3RhdGUgPSAnZm9jdXMnKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgJiZcclxuICAgICAgIXRoaXMuZm9ybUNvbnRyb2wudmFsaWQgJiZcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC50b3VjaGVkICYmXHJcbiAgICAgICF0aGlzLmZvcm1Db250cm9sLnBlbmRpbmdcclxuICAgICkge1xyXG4gICAgICB0aGlzLmlucHV0U3RhdGUgPSAnaW52YWxpZCc7XHJcbiAgICAgIHRoaXMuaW5wdXRFcnJvclRleHQgPVxyXG4gICAgICAgIGdldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzLCB0aGlzLnBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgdGhpcy5maWVsZC5wcm9wcz8ubGFiZWwgfHwgJ0lucHV0Jywge1xyXG4gICAgICAgICAgZmllbGQ6IHRoaXMuZmllbGQsXHJcbiAgICAgICAgICBuYXRpdmVWYWxpZGF0aW9uT2JqZWN0OiB0aGlzLmZpZWxkLnZhbGlkYXRpb24sXHJcbiAgICAgICAgfSkgfHwgYGludmFsaWQgJHt0aGlzLnBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgdGhpcy5maWVsZC5wcm9wcz8ubGFiZWwgfHwgJ2lucHV0J31gXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlucHV0U3RhdGUgPSBkZWZhdWx0SW5wdXRTdGF0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWxpZCkgdGhpcy5pbnB1dFN0YXRlID0gJ2ZvY3VzJztcclxuICB9XHJcbiAgb25CbHVyKCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5zdXBwcmVzc09uQmx1cikge1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZGl0eSgnaWRsZScpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3VwcHJlc3NPbkJsdXIgPSBmYWxzZTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBvbklucHV0KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcz8udHlwZSA9PT0gJ3RlbCcpIHtcclxuICAgICAgdGhpcy5pbnB1dFZhbCA9IHRoaXMuaW5wdXRWYWwucmVwbGFjZSgvW14wLTkoKStcXC0gXS9nLCAnJyk7XHJcbiAgICAgIHRoaXMuaW5wdXRWYWwgPSB0aGlzLmh5cGhlbmF0ZVBob25lTnVtYmVyKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wYXJhbXM/LnR5cGUgPT09ICdwZXJjZW50YWdlJykge1xyXG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLmlucHV0VmFsLnJlcGxhY2UoL1teMC05Ll0vZywgJycpO1xyXG4gICAgICB0aGlzLmlucHV0VmFsID0gdmFsdWUgPyBgJHt2YWx1ZX0lYCA6ICcnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtQ29udHJvbD8uc2V0VmFsdWUodGhpcy5pbnB1dFZhbCk7XHJcbiAgICB0aGlzLmNoZWNrVmFsaWRpdHkoKTtcclxuICAgIC8qaWYgKHRoaXMucGFyYW1zPy5ldmVudExpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zPy5ldmVudExpc3RlbmVyKHtcclxuICAgICAgICB0eXBlOiBJSW5wdXRFdmVudFR5cGUuSU5QVVRfQ0hBTkdFLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmlucHV0VmFsLFxyXG4gICAgICAgIGZvcm1Db250cm9sOiB0aGlzLmZvcm1Db250cm9sXHJcbiAgICAgIH0gYXMgSUlucHV0RXZlbnQpLnRoZW4odGhpcy5vbkZpZWxkQ2FsbGJhY2suYmluZCh0aGlzKSk7XHJcbiAgICB9Ki9cclxuICB9XHJcblxyXG4gIGh5cGhlbmF0ZVBob25lTnVtYmVyKCkge1xyXG4gICAgbGV0IG5ld1N0ciA9ICcnO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGh5cGhlbmF0ZWRDb3VudCA9IDE7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5wdXRWYWwucmVwbGFjZUFsbCgnLScsICcnKTtcclxuICAgIGZvciAoOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbmV3U3RyID0gbmV3U3RyICsgdmFsdWUuY2hhckF0KGkpO1xyXG4gICAgICBpZiAoIShoeXBoZW5hdGVkQ291bnQgJSAzKSkge1xyXG4gICAgICAgIGlmICghKChpICsgMSkgJSAxMCkgJiYgaSArIDEgPCB2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIG5ld1N0ciA9IG5ld1N0ciArICctJztcclxuICAgICAgICAgIGh5cGhlbmF0ZWRDb3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAhKChpICsgMSAtIE1hdGguZmxvb3IoaHlwaGVuYXRlZENvdW50IC8gMykpICUgMykgJiZcclxuICAgICAgICBpICsgMSA8IHZhbHVlLmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICBuZXdTdHIgPSBuZXdTdHIgKyAnLSc7XHJcbiAgICAgICAgaHlwaGVuYXRlZENvdW50Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3U3RyO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dEZpZWxkQ2xpY2soZXZlbnQ6IGFueSA9ICdpbnB1dCcpIHtcclxuICAgIGlmIChcclxuICAgICAgZXZlbnQgPT09ICdpbnB1dCcgfHxcclxuICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2EtaW5wdXQtZmllbGQnKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuZm9ybUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgaWYgKHRoaXMucGFyYW1zPy50eXBlICE9PSAnZW1haWwnKVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5mb3JtSW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFZhbC5sZW5ndGgsXHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWwubGVuZ3RoLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LCAxMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnB1dEljb25DbGljaygpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcz8udHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICB0aGlzLnN1cHByZXNzT25CbHVyID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICAgIHRoaXMudHlwZSA9ICd0ZXh0JztcclxuICAgICAgICB0aGlzLmljb24ubmFtZSA9ICdleWVPZmYnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHlwZSA9ICdwYXNzd29yZCc7XHJcbiAgICAgICAgdGhpcy5pY29uLm5hbWUgPSAnZXllT3V0bGluZWQnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub25JbnB1dEZpZWxkQ2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZENoaXAodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmlzTXVsdGlWYWx1ZSB8fCAhdmFsdWUudHJpbSgpKSByZXR1cm47ICBcclxuICAgIGNvbnN0IGNoaXBWYWx1ZSA9IHtcclxuICAgICAgbGFiZWw6IHZhbHVlLnRyaW0oKSxcclxuICAgICAgdmFsdWU6IHZhbHVlLnRyaW0oKSxcclxuICAgICAgcmVtb3ZhYmxlOiB0cnVlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5jaGlwVmFsdWVzLnB1c2goY2hpcFZhbHVlKTsgICAgXHJcbiAgICBjb25zdCBhY3R1YWxWYWx1ZXMgPSBtYXAodGhpcy5jaGlwVmFsdWVzLCAoY2hpcDogYW55KSA9PiBjaGlwLnZhbHVlIHx8IGNoaXAubGFiZWwgfHwgY2hpcCk7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sPy5zZXRWYWx1ZShhY3R1YWxWYWx1ZXMpO1xyXG4gICAgdGhpcy5jdXJyZW50SW5wdXRWYWx1ZSA9ICcnO1xyXG4gICAgdGhpcy5tb2RlbFt0aGlzLmtleSBhcyBzdHJpbmddID0gYWN0dWFsVmFsdWVzO1xyXG4gIH1cclxuICBcclxuICByZW1vdmVDaGlwKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5pc011bHRpVmFsdWUpIHJldHVybjsgIFxyXG4gICAgdGhpcy5jaGlwVmFsdWVzLnNwbGljZShpbmRleCwgMSk7ICBcclxuICAgIGNvbnN0IGFjdHVhbFZhbHVlcyA9IG1hcCh0aGlzLmNoaXBWYWx1ZXMsIChjaGlwOiBhbnkpID0+IGNoaXAudmFsdWUgfHwgY2hpcC5sYWJlbCB8fCBjaGlwKTtcclxuICAgIHRoaXMubW9kZWxbdGhpcy5rZXkgYXMgc3RyaW5nXSA9IGFjdHVhbFZhbHVlcztcclxuICB9XHJcblxyXG4gIG9uQ2hpcEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5pc011bHRpVmFsdWUpIHJldHVybjtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnLCcpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5hZGRDaGlwKHRoaXMuY3VycmVudElucHV0VmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnICYmICF0aGlzLmN1cnJlbnRJbnB1dFZhbHVlICYmIHRoaXMuY2hpcFZhbHVlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ2hpcCh0aGlzLmNoaXBWYWx1ZXMubGVuZ3RoIC0gMSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIG9uQ2hpcElucHV0Q2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5pc011bHRpVmFsdWUpIHJldHVybjtcclxuICAgIHRoaXMuY3VycmVudElucHV0VmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgfVxyXG5cclxuICBvbkNoaXBCbHVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzTXVsdGlWYWx1ZSkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudElucHV0VmFsdWUudHJpbSgpKSB7XHJcbiAgICAgIHRoaXMuYWRkQ2hpcCh0aGlzLmN1cnJlbnRJbnB1dFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbiAgLypvbkZpZWxkQ2FsbGJhY2socGFyYW06IElJbnB1dFBhcmFtKSB7XHJcbiAgICB0aGlzLmljb24gPSBwYXJhbS5pY29uIHx8IHRoaXMuaWNvbjtcclxuICAgIHRoaXMuY2hlY2tWYWxpZGl0eSgpO1xyXG4gIH0qL1xyXG5cclxuICBnZXRGb3JtU3VwcG9ydFRleHQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC5pbnZhbGlkICYmIHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGdldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzLCB0aGlzLnBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgdGhpcy5maWVsZC5wcm9wcz8ubGFiZWwgfHwgJ0lucHV0Jyx7XHJcbiAgICAgICAgICBmaWVsZDogdGhpcy5maWVsZCxcclxuICAgICAgICAgIG5hdGl2ZVZhbGlkYXRpb25PYmplY3Q6IF9nZXQodGhpcy5maWVsZCwgJ3ZhbGlkYXRpb24nKSxcclxuICAgICAgICB9KSB8fFxyXG4gICAgICAgIGBpbnZhbGlkICR7dGhpcy5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8IHRoaXMuZmllbGQucHJvcHM/LmxhYmVsIHx8ICdpbnB1dCd9YFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGFyYW1zPy5zdXBwb3J0VGV4dCB8fCAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByZWRlZmluZWRWYWxpZGF0b3JzOiBhbnkgPSB7XHJcbiAgICBlbWFpbDogW1ZhbGlkYXRvcnMuZW1haWwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgcGFzc3dvcmQ6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIHRlbDogW1ZhbGlkYXRvcnMucGF0dGVybignXlswLTkgK1xcXFwtKCldKiQnKV0sXHJcbiAgfTtcclxuXHJcbiAgZ2V0TGFiZWxGaWVsZEdhcCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucHJvcHM/LlsnYmlnTGFiZWwnXSkge1xyXG4gICAgICByZXR1cm4gJ3ZhcigtLW1lZGl1bS0yMHB4KSc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHM/LlsnbGFiZWwnXSkge1xyXG4gICAgICByZXR1cm4gJ3ZhcigtLXNtYWxsLTRweCknO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcwcHgnOyAvLyBObyBnYXBcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUlucHV0SWNvbiB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHNob3c/OiBib29sZWFuO1xyXG4gIGNvbG9yPzogc3RyaW5nO1xyXG4gIHNpemU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUlucHV0UGFyYW0ge1xyXG4gIHZhbGlkYXRvcnM/OiBhbnlbXTtcclxuICBhc3luY1ZhbGlkYXRvcnM/OiBhbnlbXTtcclxuICBzdXBwb3J0VGV4dD86IHN0cmluZztcclxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuICB0eXBlPzogc3RyaW5nO1xyXG4gIGRlcGVuZGVudD86IHN0cmluZztcclxuICBldmVudExpc3RlbmVyPzogRnVuY3Rpb247XHJcbiAgaWNvbj86IElJbnB1dEljb247XHJcbiAgZXJyb3JzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcclxuICBjbGFzc05hbWU/OiBzdHJpbmc7XHJcbiAgbXVsdGlWYWx1ZT86IGJvb2xlYW47IC8vIGZvciBtdWx0aS12YWx1ZSBjaGlwIHN1cHBvcnRcclxuICBjaGlwVmFsdWVzPzogYW55W107IC8vIGZvciBtdWx0aS12YWx1ZSBjaGlwIHN1cHBvcnRcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJSW5wdXRFdmVudCB7XHJcbiAgdHlwZTogSUlucHV0RXZlbnRUeXBlO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgY2FsbEJhY2s6IGFueTtcclxuICBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2w7XHJcbn1cclxuZXhwb3J0IGVudW0gSUlucHV0RXZlbnRUeXBlIHtcclxuICBJTlBVVF9DSEFOR0UgPSAnSU5QVVRfQ0hBTkdFJyxcclxuICBTVEFURV9DSEFOR0UgPSAnU1RBVEVfQ0hBTkdFJyxcclxuICBJQ09OX0NMSUNLID0gJ0lDT05fQ0xJQ0snLFxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzYS1pbnB1dC1jb250YWluZXIge3twcm9wcz8uWydpbnB1dENvbnRhaW5lckNsYXNzJ119fVwiIFtuZ1N0eWxlXT1cInsnZ2FwJzogZ2V0TGFiZWxGaWVsZEdhcCgpfVwiPlxyXG4gICAgQGlmICghIXByb3BzPy5bJ2JpZ0xhYmVsJ10gfHwgISFwcm9wcz8uWydiaWdEZXNjcmlwdGlvbiddKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwic2EtaW5wdXQtYmlnLWxhYmVsLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImRpc2FibGVkID8gJ2Rpc2FibGVkJyA6ICcnIFwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cInNhLWlucHV0LWJpZy1sYWJlbFwiPlxyXG4gICAgICAgICAgICB7e3Byb3BzPy5bJ2JpZ0xhYmVsJ119fVxyXG4gICAgICAgIDwvaDI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJzYS1pbnB1dC1iaWctZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAge3twcm9wcz8uWydiaWdEZXNjcmlwdGlvbiddfX1cclxuICAgICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIEBpZighIXByb3BzPy5bJ2xhYmVsJ10pe1xyXG4gICAgPGRpdiBjbGFzcz1cInNhLWlucHV0LWxhYmVsLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImRpc2FibGVkID8gJ2Rpc2FibGVkJyA6ICcnIFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYS1pbnB1dC1sYWJlbC10b29sdGlwLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNhLWlucHV0LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Byb3BzPy5bJ2xhYmVsJ119fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIEBpZighIXByb3BzPy5bJ3Rvb2x0aXAnXSl7XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzYS1pY29uIFtpY29uXT1cInByb3BzPy5bJ3Rvb2x0aXBJY29uJ10gfHwgJ2luZm9DaXJjbGVPdXRsaW5lZCdcIiBjdXN0b21DbGFzcz1cImluZm8taWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwicHJvcHM/LlsndG9vbHRpcCddXCIgbWF0VG9vbHRpcENsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIiBjbGFzcz1cInRvb2x0aXAtaWNvbiBkLWZsZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaXplXT1cInByb3BzPy5bJ3Rvb2x0aXBJY29uU2l6ZSddIHx8ICcyMCdcIj48L3NhLWljb24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIEBpZighIXByb3BzPy5bJ2Rlc2NyaXB0aW9uJ10pIHtcclxuICAgICAgICA8cCBjbGFzcz1cInNhLWlucHV0LWRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgIHt7cHJvcHM/LlsnZGVzY3JpcHRpb24nXX19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cInNhLWlucHV0XCIgW25nQ2xhc3NdPVwiZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogJycgXCI+XHJcbiAgICAgICAgQGlmKChwcmV0ZXh0IHx8ICghIWlucHV0VmFsPy5sZW5ndGggJiYgKCEhcGFyYW1zPy5wbGFjZWhvbGRlciB8fCAhIXByb3BzPy5wbGFjZWhvbGRlcikpKSAmJiBwcm9wcz8uWydzaG93VGFnJ11cclxuICAgICAgICAhPT0gZmFsc2Upe1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2EtaW5wdXQtdGFnXCI+e3twYXJhbXM/LnBsYWNlaG9sZGVyIHx8IHByb3BzPy5wbGFjZWhvbGRlcn19PC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2EtaW5wdXQtZmllbGRcIiBbbmdDbGFzc109XCJmb3JtQ29udHJvbC5pbnZhbGlkICYmIGZvcm1Db250cm9sLnRvdWNoZWQgPyAnaW52YWxpZCcgOiAnaWRsZScgXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW5wdXRGaWVsZENsaWNrKCRldmVudClcIj5cclxuICAgICAgICAgICAgQGlmKHByZXRleHQpe1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2EtaW5wdXQtcHJldGV4dFwiPlxyXG4gICAgICAgICAgICAgICAge3twcmV0ZXh0fX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDwhLS0gTXVsdGktdmFsdWUgY2hpcCBkaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICBAaWYoaXNNdWx0aVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2EtY2hpcCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaXAgb2YgY2hpcFZhbHVlczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNoaXAudmFsdWUgfHwgY2hpcC5sYWJlbCB8fCBjaGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3JlZ3VsYXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXRlXT1cIidwcmltYXJ5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxsaW5nXT1cIidmaWxsZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25Qb3NpdGlvbl09XCIncmlnaHQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25QYXRoXT1cIicuLi9hc3NldHMvY2xvc2VCbHVlT3V0bGluZWQuc3ZnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrRXZlbnQpPVwicmVtb3ZlQ2hpcChpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2EtY2hpcD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2NoaXAtaW5wdXQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgW3R5cGVdPVwidHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5wcm9wcy5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjaGlwVmFsdWVzLmxlbmd0aCA9PT0gMCA/IChwcm9wcz8ucGxhY2Vob2xkZXIgfHwgcGFyYW1zPy5wbGFjZWhvbGRlciB8fCAnJykgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkNoaXBCbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25DaGlwSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uQ2hpcEtleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudElucHV0VmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjZm9ybUlucHV0IC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICA8IS0tIFN0YW5kYXJkIHNpbmdsZS12YWx1ZSBpbnB1dCAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgLS0+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoISFpbnB1dFZhbCAmJiAocGFyYW1zPy50eXBlID09PSAncGFzc3dvcmQnIHx8IHByb3BzPy50eXBlID09PSAncGFzc3dvcmQnKSAmJiBpY29uLm5hbWUgIT09ICdleWVPZmYnKSA/ICdtYXNrZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0IFt0eXBlXT1cInR5cGVcIiB2YWx1ZT1cIlwiIFtwYXR0ZXJuXT1cInR5cGU9PT0ndGVsJyA/ICdbMC05XScgOiAnJyBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5wcm9wcy5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIiFwcmV0ZXh0ICYmIHByb3BzPy5wbGFjZWhvbGRlciB8fCBwYXJhbXM/LnBsYWNlaG9sZGVyIHx8ICcnXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIiAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJpbnB1dFZhbFwiICNmb3JtSW5wdXQgLz5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgQGlmKHBhcmFtcz8udHlwZSA9PT0gJ3Bhc3N3b3JkJyl7XHJcbiAgICAgICAgICAgIDxzYS1pY29uIGNsYXNzPVwiZmxleFwiIGljb249XCJleWVPdXRsaW5lZFwiIFtzaXplXT1cImljb24uc2l6ZSB8fCAnMjQnXCIgKGNsaWNrKT1cImlucHV0SWNvbkNsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiIWljb24ubmFtZSB8fCBpY29uLm5hbWUgPT09ICdleWVPdXRsaW5lZCcgPyAnJyA6ICdoaWRlJ1wiPjwvc2EtaWNvbj5cclxuICAgICAgICAgICAgPHNhLWljb24gY2xhc3M9XCJmbGV4XCIgaWNvbj1cImV5ZU9mZlwiIFtzaXplXT1cImljb24uc2l6ZSB8fCAnMjQnXCIgKGNsaWNrKT1cImlucHV0SWNvbkNsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaWNvbi5uYW1lID09PSAnZXllT2ZmJyA/ICcnIDogJ2hpZGUnXCI+PC9zYS1pY29uPlxyXG4gICAgICAgICAgICB9QGVsc2UgaWYocGFyYW1zPy50eXBlID09PSAnZW1haWwnICYmIGljb24uc2hvdyl7XHJcbiAgICAgICAgICAgIDxzYS1pY29uIGNsYXNzPVwiZmxleFwiIFtpY29uXT1cImljb24ubmFtZSB8fCAnY2hlY2tDaXJjbGVPdXRsaW5lZCdcIiBbc2l6ZV09XCJpY29uLnNpemUgfHwgJzI0J1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5wdXRJY29uQ2xpY2soKVwiIFtuZ0NsYXNzXT1cInNob3dFbWFpbEljb24gPyAnJyA6ICdoaWRlJ1wiPjwvc2EtaWNvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAZWxzZSBpZihpY29uPy5uYW1lKXtcclxuICAgICAgICAgICAgPHNhLWljb24gY2xhc3M9XCJmbGV4XCIgW2ljb25dPVwiaWNvbi5uYW1lXCIgW3NpemVdPVwiaWNvbj8uc2l6ZSB8fCAnMjQnXCIgW2NvbG9yXT1cImljb24/LmNvbG9yIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImljb24/LnNob3cgPyAnJyA6ICdoaWRlJ1wiPjwvc2EtaWNvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIEBpZigoIWZvcm1Db250cm9sLnZhbGlkKSB8fCAocGFyYW1zPy5zdXBwb3J0VGV4dCkpe1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VwcG9ydC1sYWJlbCB7e2Zvcm1Db250cm9sLmludmFsaWQgJiYgZm9ybUNvbnRyb2wudG91Y2hlZCA/IHBhcmFtcz8uY2xhc3NOYW1lIDogJyd9fVwiIFtuZ0NsYXNzXT1cIltcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sLmludmFsaWQgJiYgZm9ybUNvbnRyb2wudG91Y2hlZCA/ICdpbnZhbGlkJyA6ICdpZGxlJ1xyXG4gICAgICAgICAgICAgIF1cIj5cclxuICAgICAgICAgICAgICAgIDwhLS0ge3shZm9ybUNvbnRyb2wudmFsaWQgPyBpbnB1dEVycm9yVGV4dCA6IHBhcmFtcy5zdXBwb3J0VGV4dH19IC0tPlxyXG4gICAgICAgICAgICAgICAge3tnZXRGb3JtU3VwcG9ydFRleHQoKX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19