@seniorsistemas/components-ai 2.3.0 → 2.4.0-master-bdd92d4e

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.
@@ -14,50 +14,153 @@ import * as i3 from "primeng/inputmask";
14
14
  import * as i4 from "primeng/calendar";
15
15
  import * as i5 from "primeng/button";
16
16
  import * as i6 from "primeng/tooltip";
17
+ /**
18
+ * DynamicFieldTimeComponent
19
+ *
20
+ * O FormControl.value SEMPRE armazena o horário no formato ISO: "HH:mm:ss" (ex: "14:30:00").
21
+ * A variável `displayValue` mantém o valor formatado "HH:mm" para exibição no input.
22
+ * Isso garante que qualquer componente que acesse form.value receba o valor pronto para o backend.
23
+ */
17
24
  export class DynamicFieldTimeComponent extends DynamicFieldBaseComponent {
18
25
  timePicker;
19
26
  timeValue = null;
27
+ /** Valor de exibição no formato "HH:mm" */
28
+ displayValue = null;
20
29
  valueSub;
30
+ updatingFromControl = false;
21
31
  constructor(translationService) {
22
32
  super(translationService);
23
33
  }
24
34
  ngOnInit() {
25
35
  const control = this.form.get(this.field.field);
26
36
  if (control) {
27
- if (control.value instanceof Date) {
28
- control.setValue(this.dateToTimeString(control.value), { emitEvent: false });
29
- }
37
+ // Inicializar displayValue a partir do valor ISO do control
38
+ this.syncDisplayFromControl(control.value);
39
+ // Observar mudanças externas no control (patchValue, setValue)
30
40
  this.valueSub = control.valueChanges.subscribe(value => {
31
- if (value instanceof Date) {
32
- control.setValue(this.dateToTimeString(value), { emitEvent: false });
41
+ if (this.updatingFromControl) {
42
+ return;
33
43
  }
44
+ this.syncDisplayFromControl(value);
34
45
  });
35
46
  }
36
47
  }
37
48
  ngOnDestroy() {
38
49
  this.valueSub?.unsubscribe();
39
50
  }
40
- dateToTimeString(date) {
41
- return `${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`;
51
+ /**
52
+ * Sincroniza o displayValue a partir do valor ISO do FormControl.
53
+ * Aceita: "HH:mm:ss", "HH:mm", Date, ou null.
54
+ */
55
+ syncDisplayFromControl(value) {
56
+ if (!value) {
57
+ this.displayValue = null;
58
+ return;
59
+ }
60
+ if (value instanceof Date) {
61
+ const iso = this.dateToIso(value);
62
+ this.setControlValue(iso);
63
+ this.displayValue = iso.substring(0, 5);
64
+ return;
65
+ }
66
+ const s = String(value);
67
+ // Formato ISO "HH:mm:ss"
68
+ if (s.match(/^\d{2}:\d{2}:\d{2}$/)) {
69
+ this.displayValue = s.substring(0, 5);
70
+ return;
71
+ }
72
+ // Formato curto "HH:mm"
73
+ if (s.match(/^\d{2}:\d{2}$/)) {
74
+ // Normalizar para ISO no control
75
+ this.setControlValue(`${s}:00`);
76
+ this.displayValue = s;
77
+ return;
78
+ }
79
+ // ISO datetime string com T
80
+ if (s.includes('T')) {
81
+ const d = new Date(s);
82
+ if (!isNaN(d.getTime())) {
83
+ const iso = this.dateToIso(d);
84
+ this.setControlValue(iso);
85
+ this.displayValue = iso.substring(0, 5);
86
+ }
87
+ return;
88
+ }
89
+ // Valor incompleto
90
+ this.displayValue = s.includes('_') ? null : null;
91
+ }
92
+ /** Chamado quando o usuário completa a digitação da máscara */
93
+ onDisplayValueComplete() {
94
+ this.syncControlFromDisplay();
95
+ }
96
+ /** Chamado quando o input perde foco */
97
+ onDisplayValueBlur() {
98
+ this.syncControlFromDisplay();
99
+ }
100
+ /**
101
+ * Converte o displayValue ("HH:mm") para ISO ("HH:mm:ss") e seta no FormControl.
102
+ */
103
+ syncControlFromDisplay() {
104
+ const control = this.form.get(this.field.field);
105
+ if (!control) {
106
+ return;
107
+ }
108
+ if (!this.displayValue || this.displayValue.includes('_')) {
109
+ this.setControlValue(null);
110
+ control.markAsDirty();
111
+ return;
112
+ }
113
+ // Validar formato HH:mm
114
+ if (this.displayValue.match(/^\d{2}:\d{2}$/)) {
115
+ const [h, m] = this.displayValue.split(':').map(p => parseInt(p, 10));
116
+ if (h >= 0 && h <= 23 && m >= 0 && m <= 59) {
117
+ this.setControlValue(`${this.displayValue}:00`);
118
+ control.markAsDirty();
119
+ }
120
+ }
42
121
  }
43
- stringToDate(value) {
44
- if (!value || value.includes('_'))
122
+ /** Seta o valor no control sem disparar o subscriber interno */
123
+ setControlValue(value) {
124
+ const control = this.form.get(this.field.field);
125
+ if (!control) {
126
+ return;
127
+ }
128
+ this.updatingFromControl = true;
129
+ control.setValue(value, { emitEvent: true });
130
+ this.updatingFromControl = false;
131
+ }
132
+ // ==================== CONVERSÕES ====================
133
+ /** Converte Date para ISO "HH:mm:ss" */
134
+ dateToIso(date) {
135
+ return `${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:00`;
136
+ }
137
+ /** Converte display "HH:mm" para Date */
138
+ displayToDate(value) {
139
+ if (!value || value.includes('_')) {
45
140
  return null;
141
+ }
46
142
  const parts = value.split(':');
47
- if (parts.length !== 2)
143
+ if (parts.length !== 2) {
48
144
  return null;
145
+ }
49
146
  const hours = parseInt(parts[0], 10);
50
147
  const minutes = parseInt(parts[1], 10);
51
- if (isNaN(hours) || isNaN(minutes) || hours < 0 || hours > 23 || minutes < 0 || minutes > 59)
148
+ if (isNaN(hours) || isNaN(minutes) || hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {
52
149
  return null;
150
+ }
53
151
  const d = new Date();
54
152
  d.setHours(hours, minutes, 0, 0);
55
153
  return d;
56
154
  }
155
+ // ==================== TIME PICKER ====================
57
156
  toggleTimePicker(event) {
58
157
  event.stopPropagation();
59
- const control = this.form.get(this.field.field);
60
- this.timeValue = control?.value ? this.stringToDate(control.value) : new Date();
158
+ if (this.displayValue && !this.displayValue.includes('_')) {
159
+ this.timeValue = this.displayToDate(this.displayValue);
160
+ }
161
+ else {
162
+ this.timeValue = new Date();
163
+ }
61
164
  setTimeout(() => {
62
165
  if (this.timePicker) {
63
166
  this.timePicker.showOverlay();
@@ -65,12 +168,20 @@ export class DynamicFieldTimeComponent extends DynamicFieldBaseComponent {
65
168
  });
66
169
  }
67
170
  onTimeSelect(date) {
68
- const control = this.form.get(this.field.field);
69
- if (control && date) {
70
- control.setValue(this.dateToTimeString(date));
71
- control.markAsDirty();
171
+ if (date) {
172
+ const iso = this.dateToIso(date);
173
+ this.displayValue = iso.substring(0, 5);
174
+ this.setControlValue(iso);
175
+ const control = this.form.get(this.field.field);
176
+ if (control) {
177
+ control.markAsDirty();
178
+ }
72
179
  }
73
180
  }
181
+ isControlDisabled() {
182
+ const control = this.form.get(this.field.field);
183
+ return control ? control.disabled : false;
184
+ }
74
185
  getPlaceholder() {
75
186
  return this.field.placeholder || 'HH:mm';
76
187
  }
@@ -81,14 +192,18 @@ export class DynamicFieldTimeComponent extends DynamicFieldBaseComponent {
81
192
  <div class="time-input-group">
82
193
  <p-inputmask
83
194
  [inputId]="field.field"
84
- [formControlName]="field.field"
195
+ [(ngModel)]="displayValue"
196
+ [ngModelOptions]="{standalone: true}"
85
197
  mask="99:99"
86
198
  [placeholder]="getPlaceholder()"
87
199
  slotChar="_"
88
200
  [autoClear]="false"
89
201
  styleClass="time-input"
90
202
  [class.ng-invalid]="isFieldInvalid()"
91
- [class.ng-dirty]="isFieldDirty()">
203
+ [class.ng-dirty]="isFieldDirty()"
204
+ [disabled]="isControlDisabled()"
205
+ (onComplete)="onDisplayValueComplete()"
206
+ (onBlur)="onDisplayValueBlur()">
92
207
  </p-inputmask>
93
208
  <div class="time-buttons">
94
209
  <p-button
@@ -106,6 +221,7 @@ export class DynamicFieldTimeComponent extends DynamicFieldBaseComponent {
106
221
  <p-calendar
107
222
  #timePicker
108
223
  [(ngModel)]="timeValue"
224
+ [ngModelOptions]="{standalone: true}"
109
225
  [timeOnly]="true"
110
226
  [showSeconds]="false"
111
227
  [hourFormat]="'24'"
@@ -117,7 +233,7 @@ export class DynamicFieldTimeComponent extends DynamicFieldBaseComponent {
117
233
  </p-calendar>
118
234
  </div>
119
235
  </sia-dynamic-field-wrapper>
120
- `, isInline: true, styles: [".time-field{width:100%;position:relative}.time-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.time-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}::ng-deep .hidden-calendar-input{position:absolute;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;input{width:0;height:0;padding:0;border:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputMaskModule }, { kind: "component", type: i3.InputMask, selector: "p-inputmask, p-inputMask, p-input-mask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
236
+ `, isInline: true, styles: [".time-field{width:100%;position:relative}.time-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.time-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}::ng-deep .hidden-calendar-input{position:absolute;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;input{width:0;height:0;padding:0;border:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputMaskModule }, { kind: "component", type: i3.InputMask, selector: "p-inputmask, p-inputMask, p-input-mask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
121
237
  }
122
238
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldTimeComponent, decorators: [{
123
239
  type: Component,
@@ -136,14 +252,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
136
252
  <div class="time-input-group">
137
253
  <p-inputmask
138
254
  [inputId]="field.field"
139
- [formControlName]="field.field"
255
+ [(ngModel)]="displayValue"
256
+ [ngModelOptions]="{standalone: true}"
140
257
  mask="99:99"
141
258
  [placeholder]="getPlaceholder()"
142
259
  slotChar="_"
143
260
  [autoClear]="false"
144
261
  styleClass="time-input"
145
262
  [class.ng-invalid]="isFieldInvalid()"
146
- [class.ng-dirty]="isFieldDirty()">
263
+ [class.ng-dirty]="isFieldDirty()"
264
+ [disabled]="isControlDisabled()"
265
+ (onComplete)="onDisplayValueComplete()"
266
+ (onBlur)="onDisplayValueBlur()">
147
267
  </p-inputmask>
148
268
  <div class="time-buttons">
149
269
  <p-button
@@ -161,6 +281,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
161
281
  <p-calendar
162
282
  #timePicker
163
283
  [(ngModel)]="timeValue"
284
+ [ngModelOptions]="{standalone: true}"
164
285
  [timeOnly]="true"
165
286
  [showSeconds]="false"
166
287
  [hourFormat]="'24'"
@@ -177,4 +298,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
177
298
  type: ViewChild,
178
299
  args: ['timePicker']
179
300
  }] } });
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC10aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9maWVsZHMvZHluYW1pYy1maWVsZC10aW1lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHaEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7O0FBZ0kzRSxNQUFNLE9BQU8seUJBQTBCLFNBQVEseUJBQXlCO0lBQzdDLFVBQVUsQ0FBWTtJQUUvQyxTQUFTLEdBQWdCLElBQUksQ0FBQztJQUN0QixRQUFRLENBQWdCO0lBRWhDLFlBQVksa0JBQXNDO1FBQ2hELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJ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QU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRVEsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQztJQUMzQyxDQUFDO3dHQWxFVSx5QkFBeUI7NEZBQXpCLHlCQUF5QixtTkFqSDFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ1QsMjNCQW5EQyxZQUFZLDhCQUNaLG1CQUFtQixtbEJBQ25CLFdBQVcsc1BBQ1gsZUFBZSxxaUJBQ2YsY0FBYyxpekNBQ2QsWUFBWSxpYkFDWixhQUFhLHNYQUNiLDRCQUE0Qjs7NEZBbUhuQix5QkFBeUI7a0JBOUhyQyxTQUFTOytCQUNFLHdCQUF3QixjQUN0QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osYUFBYTt3QkFDYiw0QkFBNEI7cUJBQzdCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVDt1RkF3RXdCLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRNYXNrTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG1hc2snO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUsIENhbGVuZGFyIH0gZnJvbSAncHJpbWVuZy9jYWxlbmRhcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRXcmFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi9keW5hbWljLWZpZWxkLXdyYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZEJhc2VDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQtYmFzZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaWEtZHluYW1pYy1maWVsZC10aW1lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIElucHV0TWFza01vZHVsZSxcbiAgICBDYWxlbmRhck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBEeW5hbWljRmllbGRXcmFwcGVyQ29tcG9uZW50XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNpYS1keW5hbWljLWZpZWxkLXdyYXBwZXIgW2ZpZWxkXT1cImZpZWxkXCIgW2Zvcm1dPVwiZm9ybVwiIFttb2RlXT1cIm1vZGVcIj5cbiAgICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgPHAtaW5wdXRtYXNrXG4gICAgICAgICAgICBbaW5wdXRJZF09XCJmaWVsZC5maWVsZFwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmZpZWxkXCJcbiAgICAgICAgICAgIG1hc2s9XCI5OTo5OVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0UGxhY2Vob2xkZXIoKVwiXG4gICAgICAgICAgICBzbG90Q2hhcj1cIl9cIlxuICAgICAgICAgICAgW2F1dG9DbGVhcl09XCJmYWxzZVwiXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCJpc0ZpZWxkSW52YWxpZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCJpc0ZpZWxkRGlydHkoKVwiPlxuICAgICAgICAgIDwvcC1pbnB1dG1hc2s+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtYnV0dG9uc1wiPlxuICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgIGljb249XCJwaSBwaS1jbG9ja1wiXG4gICAgICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJ0b2dnbGVUaW1lUGlja2VyKCRldmVudClcIlxuICAgICAgICAgICAgICBwVG9vbHRpcD1cIkFicmlyIHNlbGV0b3IgZGUgaG9yYVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiPlxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgI3RpbWVQaWNrZXJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInRpbWVWYWx1ZVwiXG4gICAgICAgICAgW3RpbWVPbmx5XT1cInRydWVcIlxuICAgICAgICAgIFtzaG93U2Vjb25kc109XCJmYWxzZVwiXG4gICAgICAgICAgW2hvdXJGb3JtYXRdPVwiJzI0J1wiXG4gICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgW2lubGluZV09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAob25TZWxlY3QpPVwib25UaW1lU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJoaWRkZW4tY2FsZW5kYXItaW5wdXRcIj5cbiAgICAgICAgPC9wLWNhbGVuZGFyPlxuICAgICAgPC9kaXY+XG4gICAgPC9zaWEtZHluYW1pYy1maWVsZC13cmFwcGVyPlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnRpbWUtZmllbGQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuXG4gICAgLnRpbWUtaW5wdXQtZ3JvdXAge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgd2lkdGg6IDEwMCU7XG5cbiAgICAgIDo6bmctZGVlcCBwLWlucHV0bWFzayB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcblxuICAgICAgICBpbnB1dCB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMi41cmVtO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC50aW1lLWJ1dHRvbnMge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiA0cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMnB4O1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIH1cblxuICAgICAgOjpuZy1kZWVwIC5wLWJ1dHRvbiB7XG4gICAgICAgIHdpZHRoOiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIGhlaWdodDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBtaW4td2lkdGg6IDJyZW0gIWltcG9ydGFudDtcbiAgICAgICAgbWluLWhlaWdodDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuXG4gICAgICAgIC5wLWJ1dHRvbi1pY29uIHtcbiAgICAgICAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXNpemU6IDAuODc1cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucC1idXR0b24tbGFiZWwge1xuICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIDo6bmctZGVlcCAuaGlkZGVuLWNhbGVuZGFyLWlucHV0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcblxuICAgICAgaW5wdXQge1xuICAgICAgICB3aWR0aDogMDtcbiAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICB9XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRmllbGRUaW1lQ29tcG9uZW50IGV4dGVuZHMgRHluYW1pY0ZpZWxkQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgndGltZVBpY2tlcicpIHRpbWVQaWNrZXIhOiBDYWxlbmRhcjtcbiAgXG4gIHRpbWVWYWx1ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZhbHVlU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlKSB7XG4gICAgc3VwZXIodHJhbnNsYXRpb25TZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuZmllbGQpO1xuICAgIGlmIChjb250cm9sKSB7XG4gICAgICBpZiAoY29udHJvbC52YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh0aGlzLmRhdGVUb1RpbWVTdHJpbmcoY29udHJvbC52YWx1ZSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsdWVTdWIgPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh0aGlzLmRhdGVUb1RpbWVTdHJpbmcodmFsdWUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGRhdGVUb1RpbWVTdHJpbmcoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1N0cmluZyhkYXRlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyl9OiR7U3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ1RvRGF0ZSh2YWx1ZTogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIGlmICghdmFsdWUgfHwgdmFsdWUuaW5jbHVkZXMoJ18nKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCgnOicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDIpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICBjb25zdCBtaW51dGVzID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcbiAgICBpZiAoaXNOYU4oaG91cnMpIHx8IGlzTmFOKG1pbnV0ZXMpIHx8IGhvdXJzIDwgMCB8fCBob3VycyA+IDIzIHx8IG1pbnV0ZXMgPCAwIHx8IG1pbnV0ZXMgPiA1OSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgZC5zZXRIb3Vycyhob3VycywgbWludXRlcywgMCwgMCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICB0b2dnbGVUaW1lUGlja2VyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuZmllbGQpO1xuICAgIHRoaXMudGltZVZhbHVlID0gY29udHJvbD8udmFsdWUgPyB0aGlzLnN0cmluZ1RvRGF0ZShjb250cm9sLnZhbHVlKSA6IG5ldyBEYXRlKCk7XG4gICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgIHRoaXMudGltZVBpY2tlci5zaG93T3ZlcmxheSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25UaW1lU2VsZWN0KGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoY29udHJvbCAmJiBkYXRlKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKHRoaXMuZGF0ZVRvVGltZVN0cmluZyhkYXRlKSk7XG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wbGFjZWhvbGRlciB8fCAnSEg6bW0nO1xuICB9XG59XG4iXX0=
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC10aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9maWVsZHMvZHluYW1pYy1maWVsZC10aW1lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHaEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7O0FBRTNFOzs7Ozs7R0FNRztBQW9JSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEseUJBQXlCO0lBQzdDLFVBQVUsQ0FBWTtJQUUvQyxTQUFTLEdBQWdCLElBQUksQ0FBQztJQUU5QiwyQ0FBMkM7SUFDM0MsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFFM0IsUUFBUSxDQUFnQjtJQUN4QixtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFFcEMsWUFBWSxrQkFBc0M7UUFDaEQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLE9B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dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRNYXNrTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG1hc2snO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUsIENhbGVuZGFyIH0gZnJvbSAncHJpbWVuZy9jYWxlbmRhcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRXcmFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi9keW5hbWljLWZpZWxkLXdyYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGaWVsZEJhc2VDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQtYmFzZS5jb21wb25lbnQnO1xuXG4vKipcbiAqIER5bmFtaWNGaWVsZFRpbWVDb21wb25lbnRcbiAqXG4gKiBPIEZvcm1Db250cm9sLnZhbHVlIFNFTVBSRSBhcm1hemVuYSBvIGhvcsOhcmlvIG5vIGZvcm1hdG8gSVNPOiBcIkhIOm1tOnNzXCIgKGV4OiBcIjE0OjMwOjAwXCIpLlxuICogQSB2YXJpw6F2ZWwgYGRpc3BsYXlWYWx1ZWAgbWFudMOpbSBvIHZhbG9yIGZvcm1hdGFkbyBcIkhIOm1tXCIgcGFyYSBleGliacOnw6NvIG5vIGlucHV0LlxuICogSXNzbyBnYXJhbnRlIHF1ZSBxdWFscXVlciBjb21wb25lbnRlIHF1ZSBhY2Vzc2UgZm9ybS52YWx1ZSByZWNlYmEgbyB2YWxvciBwcm9udG8gcGFyYSBvIGJhY2tlbmQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpYS1keW5hbWljLWZpZWxkLXRpbWUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSW5wdXRNYXNrTW9kdWxlLFxuICAgIENhbGVuZGFyTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIER5bmFtaWNGaWVsZFdyYXBwZXJDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c2lhLWR5bmFtaWMtZmllbGQtd3JhcHBlciBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW21vZGVdPVwibW9kZVwiPlxuICAgICAgPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cInRpbWUtZmllbGRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8cC1pbnB1dG1hc2tcbiAgICAgICAgICAgIFtpbnB1dElkXT1cImZpZWxkLmZpZWxkXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgbWFzaz1cIjk5Ojk5XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgIHNsb3RDaGFyPVwiX1wiXG4gICAgICAgICAgICBbYXV0b0NsZWFyXT1cImZhbHNlXCJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cImlzRmllbGRJbnZhbGlkKClcIlxuICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cImlzRmllbGREaXJ0eSgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NvbnRyb2xEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIChvbkNvbXBsZXRlKT1cIm9uRGlzcGxheVZhbHVlQ29tcGxldGUoKVwiXG4gICAgICAgICAgICAob25CbHVyKT1cIm9uRGlzcGxheVZhbHVlQmx1cigpXCI+XG4gICAgICAgICAgPC9wLWlucHV0bWFzaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1idXR0b25zXCI+XG4gICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNsb2NrXCJcbiAgICAgICAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZVRpbWVQaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBUb29sdGlwPVwiQWJyaXIgc2VsZXRvciBkZSBob3JhXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAjdGltZVBpY2tlclxuICAgICAgICAgIFsobmdNb2RlbCldPVwidGltZVZhbHVlXCJcbiAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICBbdGltZU9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcbiAgICAgICAgICBbaG91ckZvcm1hdF09XCInMjQnXCJcbiAgICAgICAgICBbYXBwZW5kVG9dPVwiJ2JvZHknXCJcbiAgICAgICAgICBbaW5saW5lXT1cImZhbHNlXCJcbiAgICAgICAgICBbc2hvd0ljb25dPVwiZmFsc2VcIlxuICAgICAgICAgIChvblNlbGVjdCk9XCJvblRpbWVTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgc3R5bGVDbGFzcz1cImhpZGRlbi1jYWxlbmRhci1pbnB1dFwiPlxuICAgICAgICA8L3AtY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NpYS1keW5hbWljLWZpZWxkLXdyYXBwZXI+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAudGltZS1maWVsZCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG5cbiAgICAudGltZS1pbnB1dC1ncm91cCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgOjpuZy1kZWVwIHAtaW5wdXRtYXNrIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgICAgIGlucHV0IHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyLjVyZW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLnRpbWUtYnV0dG9ucyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDRweDtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgfVxuXG4gICAgICA6Om5nLWRlZXAgLnAtYnV0dG9uIHtcbiAgICAgICAgd2lkdGg6IDJyZW0gIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1pbi13aWR0aDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBtaW4taGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICAgICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG5cbiAgICAgICAgLnAtYnV0dG9uLWljb24ge1xuICAgICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW0gIWltcG9ydGFudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wLWJ1dHRvbi1sYWJlbCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgOjpuZy1kZWVwIC5oaWRkZW4tY2FsZW5kYXItaW5wdXQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6IDA7XG4gICAgICBoZWlnaHQ6IDA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgICBpbnB1dCB7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIH1cbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGaWVsZFRpbWVDb21wb25lbnQgZXh0ZW5kcyBEeW5hbWljRmllbGRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCd0aW1lUGlja2VyJykgdGltZVBpY2tlciE6IENhbGVuZGFyO1xuXG4gIHRpbWVWYWx1ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBWYWxvciBkZSBleGliacOnw6NvIG5vIGZvcm1hdG8gXCJISDptbVwiICovXG4gIGRpc3BsYXlWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB2YWx1ZVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSB1cGRhdGluZ0Zyb21Db250cm9sID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IodHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UpIHtcbiAgICBzdXBlcih0cmFuc2xhdGlvblNlcnZpY2UpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgIC8vIEluaWNpYWxpemFyIGRpc3BsYXlWYWx1ZSBhIHBhcnRpciBkbyB2YWxvciBJU08gZG8gY29udHJvbFxuICAgICAgdGhpcy5zeW5jRGlzcGxheUZyb21Db250cm9sKGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICAvLyBPYnNlcnZhciBtdWRhbsOnYXMgZXh0ZXJuYXMgbm8gY29udHJvbCAocGF0Y2hWYWx1ZSwgc2V0VmFsdWUpXG4gICAgICB0aGlzLnZhbHVlU3ViID0gY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRpbmdGcm9tQ29udHJvbCkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5zeW5jRGlzcGxheUZyb21Db250cm9sKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2luY3Jvbml6YSBvIGRpc3BsYXlWYWx1ZSBhIHBhcnRpciBkbyB2YWxvciBJU08gZG8gRm9ybUNvbnRyb2wuXG4gICAqIEFjZWl0YTogXCJISDptbTpzc1wiLCBcIkhIOm1tXCIsIERhdGUsIG91IG51bGwuXG4gICAqL1xuICBwcml2YXRlIHN5bmNEaXNwbGF5RnJvbUNvbnRyb2wodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgY29uc3QgaXNvID0gdGhpcy5kYXRlVG9Jc28odmFsdWUpO1xuICAgICAgdGhpcy5zZXRDb250cm9sVmFsdWUoaXNvKTtcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gaXNvLnN1YnN0cmluZygwLCA1KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzID0gU3RyaW5nKHZhbHVlKTtcblxuICAgIC8vIEZvcm1hdG8gSVNPIFwiSEg6bW06c3NcIlxuICAgIGlmIChzLm1hdGNoKC9eXFxkezJ9OlxcZHsyfTpcXGR7Mn0kLykpIHtcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gcy5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0byBjdXJ0byBcIkhIOm1tXCJcbiAgICBpZiAocy5tYXRjaCgvXlxcZHsyfTpcXGR7Mn0kLykpIHtcbiAgICAgIC8vIE5vcm1hbGl6YXIgcGFyYSBJU08gbm8gY29udHJvbFxuICAgICAgdGhpcy5zZXRDb250cm9sVmFsdWUoYCR7c306MDBgKTtcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gcztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJU08gZGF0ZXRpbWUgc3RyaW5nIGNvbSBUXG4gICAgaWYgKHMuaW5jbHVkZXMoJ1QnKSkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHMpO1xuICAgICAgaWYgKCFpc05hTihkLmdldFRpbWUoKSkpIHtcbiAgICAgICAgY29uc3QgaXNvID0gdGhpcy5kYXRlVG9Jc28oZCk7XG4gICAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKGlzbyk7XG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gaXNvLnN1YnN0cmluZygwLCA1KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxvciBpbmNvbXBsZXRvXG4gICAgdGhpcy5kaXNwbGF5VmFsdWUgPSBzLmluY2x1ZGVzKCdfJykgPyBudWxsIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBDaGFtYWRvIHF1YW5kbyBvIHVzdcOhcmlvIGNvbXBsZXRhIGEgZGlnaXRhw6fDo28gZGEgbcOhc2NhcmEgKi9cbiAgb25EaXNwbGF5VmFsdWVDb21wbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNDb250cm9sRnJvbURpc3BsYXkoKTtcbiAgfVxuXG4gIC8qKiBDaGFtYWRvIHF1YW5kbyBvIGlucHV0IHBlcmRlIGZvY28gKi9cbiAgb25EaXNwbGF5VmFsdWVCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuc3luY0NvbnRyb2xGcm9tRGlzcGxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRlIG8gZGlzcGxheVZhbHVlIChcIkhIOm1tXCIpIHBhcmEgSVNPIChcIkhIOm1tOnNzXCIpIGUgc2V0YSBubyBGb3JtQ29udHJvbC5cbiAgICovXG4gIHByaXZhdGUgc3luY0NvbnRyb2xGcm9tRGlzcGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoIWNvbnRyb2wpIHsgcmV0dXJuOyB9XG5cbiAgICBpZiAoIXRoaXMuZGlzcGxheVZhbHVlIHx8IHRoaXMuZGlzcGxheVZhbHVlLmluY2x1ZGVzKCdfJykpIHtcbiAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKG51bGwpO1xuICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXIgZm9ybWF0byBISDptbVxuICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZS5tYXRjaCgvXlxcZHsyfTpcXGR7Mn0kLykpIHtcbiAgICAgIGNvbnN0IFtoLCBtXSA9IHRoaXMuZGlzcGxheVZhbHVlLnNwbGl0KCc6JykubWFwKHAgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICAgIGlmIChoID49IDAgJiYgaCA8PSAyMyAmJiBtID49IDAgJiYgbSA8PSA1OSkge1xuICAgICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShgJHt0aGlzLmRpc3BsYXlWYWx1ZX06MDBgKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRhIG8gdmFsb3Igbm8gY29udHJvbCBzZW0gZGlzcGFyYXIgbyBzdWJzY3JpYmVyIGludGVybm8gKi9cbiAgcHJpdmF0ZSBzZXRDb250cm9sVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoIWNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy51cGRhdGluZ0Zyb21Db250cm9sID0gdHJ1ZTtcbiAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB0aGlzLnVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENPTlZFUlPDlUVTID09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvbnZlcnRlIERhdGUgcGFyYSBJU08gXCJISDptbTpzc1wiICovXG4gIHByaXZhdGUgZGF0ZVRvSXNvKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTdHJpbmcoZGF0ZS5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpfToke1N0cmluZyhkYXRlLmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgJzAnKX06MDBgO1xuICB9XG5cbiAgLyoqIENvbnZlcnRlIGRpc3BsYXkgXCJISDptbVwiIHBhcmEgRGF0ZSAqL1xuICBwcml2YXRlIGRpc3BsYXlUb0RhdGUodmFsdWU6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmluY2x1ZGVzKCdfJykpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCc6Jyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICBjb25zdCBtaW51dGVzID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcbiAgICBpZiAoaXNOYU4oaG91cnMpIHx8IGlzTmFOKG1pbnV0ZXMpIHx8IGhvdXJzIDwgMCB8fCBob3VycyA+IDIzIHx8IG1pbnV0ZXMgPCAwIHx8IG1pbnV0ZXMgPiA1OSkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgpO1xuICAgIGQuc2V0SG91cnMoaG91cnMsIG1pbnV0ZXMsIDAsIDApO1xuICAgIHJldHVybiBkO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gVElNRSBQSUNLRVIgPT09PT09PT09PT09PT09PT09PT1cblxuICB0b2dnbGVUaW1lUGlja2VyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZSAmJiAhdGhpcy5kaXNwbGF5VmFsdWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgdGhpcy50aW1lVmFsdWUgPSB0aGlzLmRpc3BsYXlUb0RhdGUodGhpcy5kaXNwbGF5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVWYWx1ZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgIHRoaXMudGltZVBpY2tlci5zaG93T3ZlcmxheSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25UaW1lU2VsZWN0KGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBpZiAoZGF0ZSkge1xuICAgICAgY29uc3QgaXNvID0gdGhpcy5kYXRlVG9Jc28oZGF0ZSk7XG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IGlzby5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgICBpZiAoY29udHJvbCkgeyBjb250cm9sLm1hcmtBc0RpcnR5KCk7IH1cbiAgICB9XG4gIH1cblxuICBpc0NvbnRyb2xEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICByZXR1cm4gY29udHJvbCA/IGNvbnRyb2wuZGlzYWJsZWQgOiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucGxhY2Vob2xkZXIgfHwgJ0hIOm1tJztcbiAgfVxufVxuIl19