@quadrel-enterprise-ui/framework 18.25.1 → 18.25.2

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.
@@ -359,21 +359,23 @@ export class QdInputComponent {
359
359
  if (this.controlContainer) {
360
360
  if (this.formControlName) {
361
361
  this.control = this.controlContainer.control.get(this.formControlName);
362
- // TODO remove logic for support of angular FormControl with angular 18 update
363
- if (!(this.control instanceof QdFormControl)) {
362
+ // TODO remove logic for support of angular FormControl with angular 20 update
363
+ if (!(this.control instanceof QdFormControl))
364
364
  console.warn('QD-UI | QdInputComponent - Please use the QdFormControl instead of the Angular FormControl');
365
- }
366
365
  }
367
366
  }
368
367
  this.writeValue(this.value || getValue(this.config));
368
+ this.normalizeInitialControlValueIfNeeded();
369
369
  this._subs.add(this.actionEmitterService.hintEventEmitter$.subscribe(() => this.clickHint.emit()));
370
370
  this._subs.add(this.actionEmitterService.readonlyEventEmitter$.subscribe(() => this.clickReadonly.emit()));
371
371
  this._subs.add(this.actionEmitterService.viewonlyEventEmitter$.subscribe(() => this.clickViewonly.emit()));
372
372
  this._subs.add(this.initOpModeSubscription());
373
373
  }
374
374
  ngOnChanges(changes) {
375
- if (changes['config'])
375
+ if (changes['config']) {
376
376
  this.updateConfig();
377
+ this.normalizeInitialControlValueIfNeeded();
378
+ }
377
379
  if (changes['value'])
378
380
  this.writeValue(this.value);
379
381
  }
@@ -382,18 +384,15 @@ export class QdInputComponent {
382
384
  }
383
385
  registerOnChange(fn) {
384
386
  const fnString = fn.toString();
385
- if (fnString.includes('_noControlError') || fnString.includes('validateControlPresenceOnChange')) {
387
+ if (fnString.includes('_noControlError') || fnString.includes('validateControlPresenceOnChange'))
386
388
  return;
387
- }
388
389
  this._onChange = fn;
389
- fn(this.hasUnits ? this._value : this._value.value);
390
390
  }
391
391
  registerOnTouched(fn) {
392
392
  this._onTouch = fn;
393
393
  }
394
394
  writeValue(value) {
395
395
  this._value = getValueWithUnit(value, this.config);
396
- this._onChange(this.hasUnits ? this._value : this._value.value);
397
396
  }
398
397
  setDisabledState(disabled) {
399
398
  this.disabled = disabled;
@@ -493,6 +492,16 @@ export class QdInputComponent {
493
492
  this.viewonly = getViewonly(this.config, topic.payload.isViewonly);
494
493
  });
495
494
  }
495
+ normalizeInitialControlValueIfNeeded() {
496
+ if (!this.control)
497
+ return;
498
+ const modelValue = this.control.value;
499
+ const normalized = getValueWithUnit(modelValue, this.config);
500
+ const target = this.hasUnits ? normalized : normalized.value;
501
+ if (!isEqual(modelValue, target))
502
+ this.control.setValue(target, { emitEvent: false });
503
+ this._value = normalized;
504
+ }
496
505
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdInputComponent, deps: [{ token: i1.QdFormsActionEmitterService }, { token: i2.QdFormOptionsResolverRegistry }, { token: i3.ControlContainer, host: true, optional: true, skipSelf: true }, { token: i4.QdEventBrokerService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
497
506
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: QdInputComponent, selector: "qd-input", inputs: { formControlName: "formControlName", value: "value", config: "config", isError: "isError", testId: ["data-test-id", "testId"] }, outputs: { valueChange: "valueChange", enterClick: "enterClick", clickClear: "clickClear", clickHint: "clickHint", clickReadonly: "clickReadonly", clickViewonly: "clickViewonly" }, host: { properties: { "class.qd-input-readonly": "this.readonly", "class.qd-input--readonly-action": "this.readonlyAction", "class.qd-input-viewonly": "this.viewonly", "class.qd-input--viewonly-action": "this.viewonlyAction", "class.qd-form-hint-action": "this.hintAction", "class.qd-input-hint-action": "this.hintAction", "class.qd-form-disabled": "this.disabled", "class.qd-input-disabled": "this.disabled", "class.qd-input-focus": "this.isInputFocused", "class.qd-form-error": "this.hasError", "class.qd-input-error": "this.hasError", "class.qd-input-error-from-outside": "this.isErrorFromOutside" } }, providers: [
498
507
  {
@@ -598,4 +607,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
598
607
  type: ViewChild,
599
608
  args: ['input']
600
609
  }] } });
601
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9xZC11aS9zcmMvbGliL2Zvcm1zL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcWQtdWkvc3JjL2xpYi9mb3Jtcy9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLElBQUksRUFDSixXQUFXLEVBQ1gsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLGdCQUFnQixFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQVVuRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDeEUsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsZUFBZSxFQUNmLE9BQU8sRUFDUCxhQUFhLEVBQ2IsWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsY0FBYyxFQUNkLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFdBQVcsRUFDWCxpQkFBaUIsRUFD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Z0JBSVAsUUFBUTtzQkFEUCxXQUFXO3VCQUFDLHlCQUF5QjtnQkFJdEMsY0FBYztzQkFEYixXQUFXO3VCQUFDLGlDQUFpQztnQkFJOUMsUUFBUTtzQkFEUCxXQUFXO3VCQUFDLHlCQUF5QjtnQkFJdEMsY0FBYztzQkFEYixXQUFXO3VCQUFDLGlDQUFpQztnQkFLOUMsVUFBVTtzQkFGVCxXQUFXO3VCQUFDLDJCQUEyQjs7c0JBQ3ZDLFdBQVc7dUJBQUMsNEJBQTRCO2dCQUt6QyxRQUFRO3NCQUZQLFdBQVc7dUJBQUMsd0JBQXdCOztzQkFDcEMsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBSXRDLGNBQWM7c0JBRGIsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBTS9CLFFBQVE7c0JBRlgsV0FBVzt1QkFBQyxxQkFBcUI7O3NCQUNqQyxXQUFXO3VCQUFDLHNCQUFzQjtnQkFNL0Isa0JBQWtCO3NCQURyQixXQUFXO3VCQUFDLG1DQUFtQztnQkFNaEQsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtc3RyaWN0LWlnbm9yZVxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3QsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2tpcFNlbGYsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbENvbnRhaW5lciwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUWRGb2N1c2FibGUgfSBmcm9tICcuLi8uLi9jb3JlL2ZvY3VzYWJsZS9mb2N1c2FibGUnO1xuaW1wb3J0IHsgUURfRk9DVVNBQkxFX1RPS0VOIH0gZnJvbSAnLi4vLi4vY29yZS9mb2N1c2FibGUvZm9jdXNhYmxlLnRva2VuJztcbmltcG9ydCB7IFFkRXZlbnRCcm9rZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9ldmVudC1icm9rZXIuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRWYWx1ZVdpdGhVbml0IH0gZnJvbSAnLi9oZWxwZXJzL2dldC12YWx1ZS13aXRoLXVuaXQnO1xuXG5pbXBvcnQgeyBRZFBvcG92ZXJTaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9wb3BvdmVyL3BvcG92ZXItc2l6aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUWRGb3JtT3B0aW9uc1Jlc29sdmVyIH0gZnJvbSAnLi4vbW9kZWwvZm9ybS1vcHRpb25zLXJlc29sdmVyJztcbmltcG9ydCB7XG4gIFFkRm9ybUlucHV0Q29uZmlndXJhdGlvbixcbiAgUWRJbnB1dE1vZGUsXG4gIFFkSW5wdXRUeXBlLFxuICBRZElucHV0VmFsdWUsXG4gIFFkSW5wdXRWYWx1ZVdpdGhVbml0XG59IGZyb20gJy4uL21vZGVsL2Zvcm1zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBRZEZvcm1JbnB1dE9wdGlvbiB9IGZyb20gJy4uL21vZGVsL29wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFFkRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3Jtcy9jb250cm9scy9mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xlYXJhYmxlLFxuICBnZXREaXNhYmxlZCxcbiAgZ2V0SGFzQXV0b2ZvY3VzLFxuICBnZXRIaW50LFxuICBnZXRIaW50QWN0aW9uLFxuICBnZXRJbnB1dE1vZGUsXG4gIGdldElucHV0VHlwZSxcbiAgZ2V0TGFiZWwsXG4gIGdldFBsYWNlaG9sZGVyLFxuICBnZXRSZWFkb25seSxcbiAgZ2V0UmVhZG9ubHlBY3Rpb24sXG4gIGdldFZhbHVlLFxuICBnZXRWaWV3b25seSxcbiAgZ2V0Vmlld29ubHlBY3Rpb25cbn0gZnJvbSAnLi4vc2hhcmVkL2hlbHBlcnMvZm9ybXMuaGVscGVycyc7XG5pbXBvcnQgeyBRZEZvcm1zQWN0aW9uRW1pdHRlclNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvYWN0aW9uLWVtaXR0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBRZEZvcm1PcHRpb25zUmVzb2x2ZXJSZWdpc3RyeSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9vcHRpb25zLXJlc29sdmVyLnJlZ2lzdHJ5JztcblxuLyoqXG4gKiBUaGUgKipRZElucHV0KiogY29tcG9uZW50IHByb3ZpZGVzIGEgRm9ybUVsZW1lbnQgZm9yIGVudGVyaW5nIHRleHQgaW50byBhIFVJLjxiciAvPlxuICogSXQgY2FuIGJlIHVzZWQgd2l0aCBRdWFkcmVsIFJlYWN0aXZlIEZvcm1zIG9yIHdpdGggbW9kZWwgYmluZGluZy5cbiAqXG4gKiAjIyMgKipVc2FnZSB3aXRoIFJlYWN0aXZlIEZvcm1zKipcbiAqXG4gKiBgYGB0c1xuICogZm9ybSA9IG5ldyBRZEZvcm1Hcm91cCh7XG4gKiAgIGlucHV0OiBuZXcgUWRGb3JtQ29udHJvbCgpXG4gKiB9KTtcbiAqIGBgYFxuICogYGBgaHRtbFxuICogPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gKiAgIDxxZC1pbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cImlucHV0XCIgW2NvbmZpZ109XCJjb25maWdcIj48L3FkLWlucHV0PlxuICogPC9mb3JtPlxuICogYGBgXG4gKlxuICogIyMjICoqVXNhZ2Ugd2l0aCBNb2RlbCBCaW5kaW5nKipcbiAqIGBgYHRzXG4gKiB2YWx1ZTtcbiAqIGBgYFxuICogYGBgaHRtbFxuICogPHFkLWlucHV0IFsodmFsdWUpXT1cInZhbHVlXCIgW2NvbmZpZ109XCJjb25maWdcIj48L3FkLWlucHV0PlxuICogYGBgXG4gKlxuICogIyMgKipTdWdnZXN0ZWQgT3B0aW9ucyoqXG4gKlxuICogIyMjICoqU3RhdGljIG9wdGlvbnMgYnkgY29uZmlnKipcbiAqXG4gKiBTdGF0aWMgb3B0aW9ucyBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgY29uZmlnIGBvcHRpb25zYCBmaWVsZDpcbiAqXG4gKiBgYGB0c1xuICogY29uZmlnOiBRZEZvcm1JbnB1dENvbmZpZ3VyYXRpb24gPSB7XG4gKiAgIC4uLlxuICogICBvcHRpb25zOiBbXG4gKiAgICAgeyBpMThuOiAnaTE4bi5xZC5leGFtcGxlRm9ybUZpZWxkLmdvb2RzRGVjbGFyYXRpb24uaW1wb3J0JywgdmFsdWU6ICdpbXBvcnQnIH0sXG4gKiAgICAgeyBpMThuOiAnaTE4bi5xZC5leGFtcGxlRm9ybUZpZWxkLmdvb2RzRGVjbGFyYXRpb24uZXhwb3J0JywgdmFsdWU6ICdleHBvcnQnIH0sXG4gKiAgICAgeyBpMThuOiAnaTE4bi5xZC5leGFtcGxlRm9ybUZpZWxkLmdvb2RzRGVjbGFyYXRpb24udHJhbnNpdCcsIHZhbHVlOiAndHJhbnNpdCcsIGRpc2FibGVkOiB0cnVlIH1cbiAqICAgXVxuICogfVxuICogYGBgXG4gKiBgYGBodG1sXG4gKiA8cWQtaW5wdXQgW2NvbmZpZ109XCJjb25maWdcIj48L3FkLWlucHV0PlxuICogYGBgXG4gKlxuICogPFN0b3J5IGlkPVwiY29tcG9uZW50cy1ncmlkLXN5c3RlbS1jb250YWluZXItLWNvbHVtbnMtNlwiIC8+XG4gKlxuICogIyMjICoqRHluYW1pYyBvcHRpb25zIGJ5IHJlc29sdmVyKipcbiAqXG4gKiBJZiB5b3Ugd2FudCB0byBkZWZpbmUgdGhlIG9wdGlvbnMgZHluYW1pY2FsbHksIHlvdSBjYW4gaW5qZWN0IGEgYFFkRm9ybU9wdGlvbnNSZXNvbHZlcmBcbiAqIHdpdGggdGhlIGBRRF9GT1JNX09QVElPTlNfUkVTT0xWRVJgIGluamVjdGlvbiB0b2tlbi4gVGhlIHJlc29sdmVyIGp1c3QgaGFzIHRvIGltcGxlbWVudCB0aGUgYHJlc29sdmVyYFxuICogbWV0aG9kLlxuICpcbiAqIGBgYHRzXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBleHBvcnQgY2xhc3MgWW91ckZvcm1PcHRpb25zUmVzb2x2ZXIgaW1wbGVtZW50cyBRZEZvcm1PcHRpb25zUmVzb2x2ZXIge1xuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpIHt9XG4gKlxuICogICByZXNvbHZlKHZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFFkRm9ybUlucHV0W10+IHtcbiAqICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gKiAgICAgICAuZ2V0KHlvdXJCYWNrZW5kVXJsKVxuICogICAgICAgLnBpcGUoXG4gKiAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICogICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgZXJyb3IgbWVzc2FnZScpO1xuICpcbiAqICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gKiAgICAgICAgIH0pXG4gKiAgICAgICApO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIFRoZSBvcHRpb25zIHJlc29sdmVyIGNhbiBiZSBpbmplY3RlZCBpbnRvIGEgY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIGBRZElucHV0YCBvciBhbHNvIGludG8gYSBwYXJlbnRcbiAqIGNvbXBvbmVudC4gSWYgeW91IG5lZWQgZHluYW1pYyBvcHRpb25zIGZvciB0aGUgc2VhcmNoIGluIHRoZSBzZWN0aW9uIHRvb2xiYXIsIHlvdSBjYW4gaW5qZWN0XG4gKiB0aGUgcmVzb2x2ZXIgb24gYSBoaWdoZXIgbGV2ZWwsIGUuZy4gaW4gdGhlIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSBzZWN0aW9uLlxuICpcbiAqIGBgYHRzXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgLi4uXG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIC4uLlxuICogICAgIHtcbiAqICAgICAgIHByb3ZpZGU6IFFEX0ZPUk1fT1BUSU9OU19SRVNPTFZFUixcbiAqICAgICAgIHVzZUNsYXNzOiBZb3VyRm9ybU9wdGlvbnNSZXNvbHZlclxuICogICAgIH1cbiAqICAgXVxuICogfSlcbiAqIGBgYFxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoZSByZXNvbHZlciBpcyBhcHBsaWVkIHRvIGV2ZXJ5IGlucHV0IHRoYXQgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgdGhhdCBpbmplY3RzIHRoZSByZXNvbHZlci5cbiAqIFRvIGRpc2FibGUgdGhlIHJlc29sdmVyIGZvciBhbiBpbnB1dCwgeW91IGhhdmUgdG8gc2V0IHRoZSBgb3B0aW9uc1Jlc29sdmVyTmFtZWAgcHJvcGVydHkgaW4gdGhlXG4gKiBpbnB1dCBjb25maWcgdG8gYG51bGxgLiBJdCdzIGFsc28gcG9zc2libGUgdG8gZGVmaW5lIGEgYG5hbWVgIGZvciB0aGUgcmVzb2x2ZXIgYnkgc2V0dGluZyB0aGUgYG5hbWVgIHByb3BlcnR5XG4gKiBpbiB0aGUgcmVzb2x2ZXIgY2xhc3MuIFRodXMsIHlvdSBjYW4gY29ubmVjdCB0aGUgaW5wdXQgdG8gYSBzcGVjaWZpYyByZXNvbHZlci4gQmVsb3cgdGhlcmUgaXMgYWxzbyBhXG4gKiBkZXNjcmlwdGlvbiBvZiBob3cgdG8gdXNlIG11bHRpcGxlIGlucHV0cyB3aXRoIGRpZmZlcmVudCByZXNvbHZlcnMgaW4gb25lIGNvbXBvbmVudC5cbiAqIDxicj48YnI+XG4gKlxuICogIyMjIyAqKk11bHRpcGxlIGlucHV0cyB3aXRoIHN1Z2dlc3RlZCBvcHRpb25zKipcbiAqXG4gKiBGb3IgbXVsdGlwbGUgaW5wdXRzIHdpdGggdmFyaW91cyByZXNvbHZlcnMgaW4gb25lIGNvbXBvbmVudCB5b3UgY2FuIGRpc3Rpbmd1aXNoIHRoZSByZXNvbHZlcnMgYnkgc2V0dGluZyB0aGVcbiAqIGBuYW1lYCBhcyBhIHByb3BlcnR5IGluIHRoZSByZXNvbHZlciBjbGFzcy5cbiAqXG4gKiBgYGB0c1xuICogQEluamVjdGFibGUoKVxuICogZXhwb3J0IGNsYXNzIEZydWl0c0Zvcm1PcHRpb25zUmVzb2x2ZXIgaW1wbGVtZW50cyBRZEZvcm1PcHRpb25zUmVzb2x2ZXIge1xuICogICBuYW1lID0gJ2ZydWl0cyc7XG4gKiAgIC8vIC4uLlxuICogfVxuICogYGBgXG4gKlxuICogYGBgdHNcbiAqIEBJbmplY3RhYmxlKClcbiAqIGV4cG9ydCBjbGFzcyBDb3VudHJpZXNGb3JtT3B0aW9uc1Jlc29sdmVyIGltcGxlbWVudHMgUWRGb3JtT3B0aW9uc1Jlc29sdmVyIHtcbiAqICAgbmFtZSA9ICdjb3VudHJpZXMnO1xuICogICAvLyAuLi5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoZW4gdGhlIGlucHV0IGNhbiBiZSBhc3NpZ25lZCB0byBhIHJlc29sdmVyIGJ5IHNldHRpbmcgdGhlIGBvcHRpb25zUmVzb2x2ZXJOYW1lYCBwcm9wZXJ0eVxuICogaW4gdGhlIGlucHV0IGNvbmZpZy5cbiAqXG4gKiBgYGB0c1xuICogY29uZmlnOiBRZEZvcm1JbnB1dENvbmZpZ3VyYXRpb24gPSB7XG4gKiAgIC4uLlxuICogICBvcHRpb25zUmVzb2x2ZXJOYW1lOiAnZnJ1aXRzJ1xuICogfVxuICpcbiAqIGNvbmZpZzI6IFFkRm9ybUlucHV0Q29uZmlndXJhdGlvbiA9IHtcbiAqICAgLi4uXG4gKiAgIG9wdGlvbnNSZXNvbHZlck5hbWU6ICdjb3VudHJpZXMnXG4gKiB9XG4gKiBgYGBcbiAqIGBgYGh0bWxcbiAqIDxxZC1pbnB1dCBbY29uZmlnXT1cImNvbmZpZ1wiPjwvcWQtaW5wdXQ+XG4gKiA8cWQtaW5wdXQgW2NvbmZpZ109XCJjb25maWcyXCI+PC9xZC1pbnB1dD5cbiAqIGBgYFxuICogVG8gaW5qZWN0IG11bHRpcGxlIHJlc29sdmVycyBpbiBhIGNvbXBvbmVudCB5b3UgY2FuIHVzZSB0aGUgcHJvdmlkZXIgc2V0dGluZyBgbXVsdGk6IHRydWVgLlxuICpcbiAqIGBgYHRzXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgLi4uXG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIC4uLlxuICogICAgIHtcbiAqICAgICAgIHByb3ZpZGU6IFFEX0ZPUk1fT1BUSU9OU19SRVNPTFZFUixcbiAqICAgICAgIHVzZUNsYXNzOiBGcnVpdHNGb3JtT3B0aW9uc1Jlc29sdmVyLFxuICogICAgICAgbXVsdGk6IHRydWVcbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIHByb3ZpZGU6IFFEX0ZPUk1fT1BUSU9OU19SRVNPTFZFUixcbiAqICAgICAgIHVzZUNsYXNzOiBDb3VudHJpZXNGb3JtT3B0aW9uc1Jlc29sdmVyLFxuICogICAgICAgbXVsdGk6IHRydWVcbiAqICAgICB9XG4gKiAgIF1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiAjIyMjICoqQ3VzdG9tIGxvYWRpbmcgYW5kIGVycm9yIGhpbnRzKipcbiAqXG4gKiBJbiB0aGUgcmVzb2x2ZXIgeW91IGFsc28gY2FuIGRlZmluZSBjdXN0b20gbG9hZGluZyBhbmQgZXJyb3IgaGludHMgd2l0aCB0aGUgcHJvcGVydGllcyBgcmVxdWVzdExvYWRpbmdIaW50YFxuICogYW5kIGByZXF1ZXN0RXJyb3JIaW50YC5cbiAqXG4gKiBgYGB0c1xuICogQEluamVjdGFibGUoKVxuICogZXhwb3J0IGNsYXNzIFlvdXJGb3JtT3B0aW9uc1Jlc29sdmVyIGltcGxlbWVudHMgUWRGb3JtT3B0aW9uc1Jlc29sdmVyIHtcbiAqICAgcmVxdWVzdExvYWRpbmdIaW50ID0geyBpMThuOiAnaTE4bi5jdXN0b20ub3B0aW9ucy5sb2FkaW5nJyB9O1xuICogICByZXF1ZXN0RXJyb3JIaW50ID0geyBpMThuOiAnaTE4bi5jdXN0b20ub3B0aW9ucy5lcnJvcicgfTtcbiAqXG4gKiAgIC8vIC4uLlxuICpcbiAqICAgcmVzb2x2ZSh2YWx1ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxRZEZvcm1JbnB1dFtdPiB7XG4gKiAgICAgLy8gLi4uXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogWW91IGFsc28gY2FuIHVwZGF0ZSB0aGUgZXJyb3IgaGludCBkaXJlY3RseSBpbiB0aGUgcmVzb2x2ZSBtZXRob2QgdG8gZGlzcGxheSBhIG1vcmUgc3BlY2lmaWMgZXJyb3JcbiAqIG1lc3NhZ2Ugd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKlxuICogYGBgdHNcbiAqIEBJbmplY3RhYmxlKClcbiAqIGV4cG9ydCBjbGFzcyBZb3VyRm9ybU9wdGlvbnNSZXNvbHZlciBpbXBsZW1lbnRzIFFkRm9ybU9wdGlvbnNSZXNvbHZlciB7XG4gKiAgIC8vIC4uLlxuICpcbiAqICAgY29uc3RydWN0b3IoXG4gKiAgICAgQE9wdGlvbmFsKCkgQEluamVjdChCQUNLRU5EX0VSUk9SX0NPREVTKSBwcml2YXRlIHJlYWRvbmx5IGJhY2tlbmRFcnJvckNvZGVzXG4gKiAgICkge1xuICogICAgIHRoaXMuYmFja2VuZEVycm9yQ29kZXMgPSB0aGlzLmJhY2tlbmRFcnJvckNvZGVzIHx8IHt9O1xuICogICB9XG4gKlxuICogICAvLyAuLi5cbiAqXG4gKiAgIHJlc29sdmUodmFsdWU6IHN0cmluZyk6IE9ic2VydmFibGU8UWRGb3JtSW5wdXRbXT4ge1xuICogICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAqICAgICAgIC5nZXQoeW91ckJhY2tlbmRVcmwpXG4gKiAgICAgICAucGlwZShcbiAqICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gKiAgICAgICAgICAgaWYgKGVycm9yLmVycm9yPy5lcnJvckNvZGUgJiYgZXJyb3IuZXJyb3IuZXJyb3JDb2RlIGluIHRoaXMuYmFja2VuZEVycm9yQ29kZXMpXG4gKiAgICAgICAgICAgICB0aGlzLnJlcXVlc3RFcnJvckhpbnQgPSB7IGkxOG46ICdFUlJPUi4nICsgZXJyb3IuZXJyb3IuZXJyb3JDb2RlIH07XG4gKiAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICogICAgICAgICB9KVxuICogICAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3FkLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogUWRJbnB1dENvbXBvbmVudCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICBRZEZvcm1zQWN0aW9uRW1pdHRlclNlcnZpY2UsXG4gICAgUWRGb3JtT3B0aW9uc1Jlc29sdmVyUmVnaXN0cnksXG4gICAgLy8gVE9ETzogUmVtb3ZlIHdoZW4gcmVtb3ZpbmcgZGVyaXZlZCBkaXJlY3RpdmVcbiAgICBRZFBvcG92ZXJTaXppbmdTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFFEX0ZPQ1VTQUJMRV9UT0tFTixcbiAgICAgIHVzZUV4aXN0aW5nOiBRZElucHV0Q29tcG9uZW50XG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFFkSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgUWRGb2N1c2FibGUge1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBuYW1lIGNhbiBiZSBhc3NpZ25lZCBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBSZWFjdGl2ZSBGb3Jtcy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGZvcm1Db250cm9sTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBmb3JtIGl0ZW0gdmFsdWUsIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIE1vZGVsIEJpbmRpbmcuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIDxxZC1pbnB1dCBbKHZhbHVlKV09XCJ2YWx1ZVwiIFtjb25maWddPVwiY29uZmlnXCI+PC9xZC1pbnB1dD5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbHVlO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBmb3JtIGl0ZW1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICoge1xuICAgKiAgIGxhYmVsOiB7IGkxOG46ICdsYWJlbCcgfSxcbiAgICogICBwbGFjZWhvbGRlcjogeyBpMThuOiAncGxhY2Vob2xkZXInIH0sXG4gICAqICAgaGludDogeyBpMThuOiAnaGludCcgfVxuICAgKiB9O1xuICAgKi9cbiAgQElucHV0KClcbiAgY29uZmlnOiBRZEZvcm1JbnB1dENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNldCBjb21wb25lbnQgdG8gXCJlcnJvclwiIGV4dGVybmFsbHkuIE5vIHJlYWN0aXZlIGZvcm1zIHJlcXVpcmVkLiBVc2VkIGZvciBjb21wb25lbnRzIHdpdGhpbiB0aGUgUXVhZHJlbCBVSSBmcmFtZXdvcmsuIFRoaXMgaXMgZG9uZSBieSBhIENTUyBjbGFzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzRXJyb3IgPSBmYWxzZTtcblxuICAvKipcbiAgICogQSBzdGF0aWMgdGVzdCBJRCBmb3IgaW50ZWdyYXRpb24gdGVzdHMgY2FuIGJlIHNldC4gPGJyIC8+XG4gICAqIFRoZSB2YWx1ZSBmb3IgdGhlIEhUTUwgYXR0cmlidXRlIFtkYXRhLXRlc3QtaWRdLlxuICAgKi9cbiAgQElucHV0KCdkYXRhLXRlc3QtaWQnKVxuICB0ZXN0SWQgPSAndGV4dC1pbnB1dCc7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLlxuICAgKiBPcHRpb25hbGx5IGVtaXRzIHRoZSBjdXJyZW50IGlucHV0IHZhbHVlLCBpbmNsdWRpbmcgdW5pdCAoaWYgY29uZmlndXJlZCkuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFFkSW5wdXRWYWx1ZSB8IFFkSW5wdXRWYWx1ZVdpdGhVbml0IHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCB3aGVuIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC4gTm90ZTogRW1pdHMgb24ga2V5dXAgKG5vIGxvbmdlciBvbiBjbGljaywgYXMgYmVmb3JlKSFcbiAgICogT3B0aW9uYWxseSBlbWl0cyB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZSwgaW5jbHVkaW5nIHVuaXQgKGlmIGNvbmZpZ3VyZWQpLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGVudGVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFFkSW5wdXRWYWx1ZSB8IFFkSW5wdXRWYWx1ZVdpdGhVbml0IHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCB3aGVuIHRoZSBpbnB1dCBmaWVsZCB3YXMgbGFwcGVkIG9uIGNsaWNrL3RhcCBvbiB0aGUgeCBpY29uLiA8YnIgLz5cbiAgICogYFFkRm9ybUlucHV0Q29uZmlndXJhdGlvblsnY2xlYXJhYmxlJ11gIG11c3QgYmUgc2V0IHRvIHRydWUgZm9yIHRoaXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgY2xpY2tDbGVhciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgd2hlbiB0aGUgaGludCBpcyBjbGlja2VkL3RhcHBlZC4gYGhpbnRBY3Rpb25gIG11c3QgYmUgc2V0IHRvIGB0cnVlYCBmb3IgdGhpcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBjbGlja0hpbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIHJlYWRvbmx5IHZhbHVlIGlzIGNsaWNrZWQvdGFwcGVkLiBgY2xpY2tSZWFkb25seSBgIG11c3QgYmUgc2V0IHRvIGB0cnVlYCBmb3IgdGhpcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBjbGlja1JlYWRvbmx5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCB3aGVuIHRoZSB2aWV3b25seSB2YWx1ZSBpcyBjbGlja2VkL3RhcHBlZC4gYGNsaWNrVmlld29ubHkgYCBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgZm9yIHRoaXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgY2xpY2tWaWV3b25seSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWlucHV0LXJlYWRvbmx5JylcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC0tcmVhZG9ubHktYWN0aW9uJylcbiAgcmVhZG9ubHlBY3Rpb24gPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWlucHV0LXZpZXdvbmx5JylcbiAgdmlld29ubHk6IGJvb2xlYW47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC0tdmlld29ubHktYWN0aW9uJylcbiAgdmlld29ubHlBY3Rpb24gPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWZvcm0taGludC1hY3Rpb24nKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWlucHV0LWhpbnQtYWN0aW9uJylcbiAgaGludEFjdGlvbiA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MucWQtZm9ybS1kaXNhYmxlZCcpXG4gIEBIb3N0QmluZGluZygnY2xhc3MucWQtaW5wdXQtZGlzYWJsZWQnKVxuICBkaXNhYmxlZDogYm9vbGVhbjtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWlucHV0LWZvY3VzJylcbiAgaXNJbnB1dEZvY3VzZWQgPSBmYWxzZTtcbiAgYXJlVW5pdHNPcGVuZWQgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWZvcm0tZXJyb3InKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWlucHV0LWVycm9yJylcbiAgZ2V0IGhhc0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wudG91Y2hlZCAmJiB0aGlzLmNvbnRyb2wuaW52YWxpZCA6IGZhbHNlO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC1lcnJvci1mcm9tLW91dHNpZGUnKVxuICBnZXQgaXNFcnJvckZyb21PdXRzaWRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRXJyb3I7XG4gIH1cblxuICBAVmlld0NoaWxkKCdpbnB1dCcpXG4gIGlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcblxuICBpbnB1dFR5cGU6IFFkSW5wdXRUeXBlO1xuICBpbnB1dE1vZGU6IFFkSW5wdXRNb2RlO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBoaW50OiBzdHJpbmc7XG4gIGNsZWFyYWJsZTogYm9vbGVhbjtcbiAgaGFzQXV0b2ZvY3VzOiBib29sZWFuO1xuICBoYXNPcHRpb25zID0gZmFsc2U7XG4gIF92YWx1ZTogUWRJbnB1dFZhbHVlV2l0aFVuaXQgPSB7IHZhbHVlOiAnJyB9O1xuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBRZEZvcm1Db250cm9sPGFueT47XG5cbiAgcHJpdmF0ZSBfb3B0aW9uc1Jlc29sdmVyITogUWRGb3JtT3B0aW9uc1Jlc29sdmVyIHwgbnVsbDtcbiAgcHJpdmF0ZSBfc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcml2YXRlIF9vbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIHByaXZhdGUgX29uVG91Y2g6IGFueSA9ICgpID0+IHt9O1xuXG4gIGdldCBoYXNPbmx5VW5pdHNFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNFcXVhbChPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2wuZXJyb3JzKSwgWydyZXF1aXJlZCddKSAmJiB0aGlzLl92YWx1ZS52YWx1ZSAhPT0gJyc7XG4gIH1cblxuICBnZXQgaGFzVW5pdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy51bml0cz8ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBudW1iZXJPZkNoYXJhY3RlcnMoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuX3ZhbHVlLnZhbHVlKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBTdHJpbmcodGhpcy5fdmFsdWUudmFsdWUpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBoYXNNYXhMZW5ndGgoKTogYm9vbGVhbiB7XG4gICAgaWYgKCEodGhpcy5jb250cm9sIGluc3RhbmNlb2YgUWRGb3JtQ29udHJvbCkpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRyb2wuaGFzTWF4TGVuZ3RoKCk7XG4gIH1cblxuICBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgaWYgKCEodGhpcy5jb250cm9sIGluc3RhbmNlb2YgUWRGb3JtQ29udHJvbCkpIHJldHVybjtcblxuICAgIHJldHVybiB0aGlzLmNvbnRyb2wuZ2V0TWF4TGVuZ3RoT3JVbmRlZmluZWQoKTtcbiAgfVxuXG4gIGdldCB2YWx1ZUFzTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtgJHt0aGlzLl92YWx1ZS52YWx1ZX0ke3RoaXMuX3ZhbHVlLnVuaXQgPyAnICcgKyB0aGlzLl92YWx1ZS51bml0IDogJyd9YF07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbkVtaXR0ZXJTZXJ2aWNlOiBRZEZvcm1zQWN0aW9uRW1pdHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlclJlZ2lzdHJ5OiBRZEZvcm1PcHRpb25zUmVzb2x2ZXJSZWdpc3RyeSxcbiAgICBAT3B0aW9uYWwoKSBASG9zdCgpIEBTa2lwU2VsZigpIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnJva2VyU2VydmljZTogUWRFdmVudEJyb2tlclNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnNSZXNvbHZlcigpO1xuICAgIHRoaXMudXBkYXRlQ29uZmlnKCk7XG5cbiAgICBpZiAodGhpcy5jb250cm9sQ29udGFpbmVyKSB7XG4gICAgICBpZiAodGhpcy5mb3JtQ29udHJvbE5hbWUpIHtcbiAgICAgICAgdGhpcy5jb250cm9sID0gdGhpcy5jb250cm9sQ29udGFpbmVyLmNvbnRyb2wuZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKTtcblxuICAgICAgICAvLyBUT0RPIHJlbW92ZSBsb2dpYyBmb3Igc3VwcG9ydCBvZiBhbmd1bGFyIEZvcm1Db250cm9sIHdpdGggYW5ndWxhciAxOCB1cGRhdGVcbiAgICAgICAgaWYgKCEodGhpcy5jb250cm9sIGluc3RhbmNlb2YgUWRGb3JtQ29udHJvbCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1FELVVJIHwgUWRJbnB1dENvbXBvbmVudCAtIFBsZWFzZSB1c2UgdGhlIFFkRm9ybUNvbnRyb2wgaW5zdGVhZCBvZiB0aGUgQW5ndWxhciBGb3JtQ29udHJvbCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUgfHwgZ2V0VmFsdWUodGhpcy5jb25maWcpKTtcblxuICAgIHRoaXMuX3N1YnMuYWRkKHRoaXMuYWN0aW9uRW1pdHRlclNlcnZpY2UuaGludEV2ZW50RW1pdHRlciQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xpY2tIaW50LmVtaXQoKSkpO1xuICAgIHRoaXMuX3N1YnMuYWRkKHRoaXMuYWN0aW9uRW1pdHRlclNlcnZpY2UucmVhZG9ubHlFdmVudEVtaXR0ZXIkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsaWNrUmVhZG9ubHkuZW1pdCgpKSk7XG4gICAgdGhpcy5fc3Vicy5hZGQodGhpcy5hY3Rpb25FbWl0dGVyU2VydmljZS52aWV3b25seUV2ZW50RW1pdHRlciQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xpY2tWaWV3b25seS5lbWl0KCkpKTtcbiAgICB0aGlzLl9zdWJzLmFkZCh0aGlzLmluaXRPcE1vZGVTdWJzY3JpcHRpb24oKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB0aGlzLnVwZGF0ZUNvbmZpZygpO1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddKSB0aGlzLndyaXRlVmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgZm5TdHJpbmcgPSBmbi50b1N0cmluZygpO1xuXG4gICAgaWYgKGZuU3RyaW5nLmluY2x1ZGVzKCdfbm9Db250cm9sRXJyb3InKSB8fCBmblN0cmluZy5pbmNsdWRlcygndmFsaWRhdGVDb250cm9sUHJlc2VuY2VPbkNoYW5nZScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcblxuICAgIGZuKHRoaXMuaGFzVW5pdHMgPyB0aGlzLl92YWx1ZSA6IHRoaXMuX3ZhbHVlLnZhbHVlKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBRZElucHV0VmFsdWVXaXRoVW5pdCB8IFFkSW5wdXRWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gZ2V0VmFsdWVXaXRoVW5pdCh2YWx1ZSwgdGhpcy5jb25maWcpO1xuXG4gICAgdGhpcy5fb25DaGFuZ2UodGhpcy5oYXNVbml0cyA/IHRoaXMuX3ZhbHVlIDogdGhpcy5fdmFsdWUudmFsdWUpO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB0aGlzLmNsZWFyYWJsZSA9IGdldENsZWFyYWJsZSh0aGlzLmNvbmZpZykgJiYgIXRoaXMuZGlzYWJsZWQ7XG4gIH1cblxuICBoYW5kbGVJbnB1dChldmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0geyAuLi50aGlzLl92YWx1ZSwgdmFsdWUgfTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICAgIHRoaXMuX29uVG91Y2goKTtcbiAgfVxuXG4gIGhhbmRsZU9wdGlvblNlbGVjdGVkKG9wdGlvbjogUWRGb3JtSW5wdXRPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9IHsgLi4udGhpcy5fdmFsdWUsIHZhbHVlOiBvcHRpb24uaTE4biB9O1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChvcHRpb24udmFsdWUpO1xuICAgIHRoaXMuX29uQ2hhbmdlKG9wdGlvbi52YWx1ZSk7XG4gICAgdGhpcy5fb25Ub3VjaCgpO1xuICB9XG5cbiAgaGFuZGxlVW5pdENoYW5nZSh1bml0KTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB7IC4uLnRoaXMuX3ZhbHVlLCB1bml0IH07XG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgfVxuXG4gIGhhbmRsZUlucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pc0lucHV0Rm9jdXNlZCA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVJbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5pc0lucHV0Rm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJlVW5pdHNPcGVuZWQpIHRoaXMuX29uVG91Y2goKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgaGFuZGxlVW5pdHNPcGVuZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hcmVVbml0c09wZW5lZCA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVVbml0c0Nsb3NlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFyZVVuaXRzT3BlbmVkID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5fdmFsdWUudW5pdCAmJiB0aGlzLl92YWx1ZS52YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25Ub3VjaCgpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFySW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB7IC4uLnRoaXMuX3ZhbHVlLCB2YWx1ZTogJycgfTtcbiAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICAgIHRoaXMuY2xpY2tDbGVhci5lbWl0KCk7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBlbWl0RW50ZXJDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNVbml0cykge1xuICAgICAgdGhpcy5lbnRlckNsaWNrLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVudGVyQ2xpY2suZW1pdCh0aGlzLl92YWx1ZS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFR5cGUgPSBnZXRJbnB1dFR5cGUodGhpcy5jb25maWcpO1xuICAgIHRoaXMuaW5wdXRNb2RlID0gZ2V0SW5wdXRNb2RlKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gZ2V0UGxhY2Vob2xkZXIodGhpcy5jb25maWcpO1xuICAgIHRoaXMubGFiZWwgPSBnZXRMYWJlbCh0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5oaW50ID0gZ2V0SGludCh0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5yZWFkb25seSA9IGdldFJlYWRvbmx5KHRoaXMuY29uZmlnLCB0aGlzLnJlYWRvbmx5KTtcbiAgICB0aGlzLnZpZXdvbmx5ID0gZ2V0Vmlld29ubHkodGhpcy5jb25maWcsIHRoaXMudmlld29ubHkpO1xuICAgIHRoaXMuaGludEFjdGlvbiA9IGdldEhpbnRBY3Rpb24odGhpcy5jb25maWcpO1xuICAgIHRoaXMucmVhZG9ubHlBY3Rpb24gPSBnZXRSZWFkb25seUFjdGlvbih0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy52aWV3b25seUFjdGlvbiA9IGdldFZpZXdvbmx5QWN0aW9uKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmRpc2FibGVkID0gZ2V0RGlzYWJsZWQodGhpcy5jb25maWcpIHx8ICEhdGhpcy5jb250cm9sPy5kaXNhYmxlZDtcbiAgICB0aGlzLmNsZWFyYWJsZSA9ICF0aGlzLmRpc2FibGVkICYmIGdldENsZWFyYWJsZSh0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5oYXNBdXRvZm9jdXMgPSBnZXRIYXNBdXRvZm9jdXModGhpcy5jb25maWcpO1xuICAgIHRoaXMuaGFzT3B0aW9ucyA9ICh0aGlzLmNvbmZpZy5vcHRpb25zICYmIHRoaXMuY29uZmlnLm9wdGlvbnMubGVuZ3RoID4gMCkgfHwgISF0aGlzLl9vcHRpb25zUmVzb2x2ZXI7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVPcHRpb25zUmVzb2x2ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNvbHZlclJlZ2lzdHJ5LmluaXRpYWxpemUodGhpcy5jb25maWc/Lm9wdGlvbnNSZXNvbHZlck5hbWUpO1xuICAgIHRoaXMuX29wdGlvbnNSZXNvbHZlciA9IHRoaXMucmVzb2x2ZXJSZWdpc3RyeS5maW5kUmVzb2x2ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1VuaXRzKSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUudmFsdWUpO1xuICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy5fdmFsdWUudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9wTW9kZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24gfCB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZXZlbnRCcm9rZXJTZXJ2aWNlKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy5ldmVudEJyb2tlclNlcnZpY2UuY29uc3VtZTx7IGlzVmlld29ubHk6IGJvb2xlYW4gfT4oJ29wZXJhdGlvbl9tb2RlX2NoYW5nZWQnKS5zdWJzY3JpYmUodG9waWMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy52aWV3b25seSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm47XG5cbiAgICAgIHRoaXMudmlld29ubHkgPSBnZXRWaWV3b25seSh0aGlzLmNvbmZpZywgdG9waWMucGF5bG9hZC5pc1ZpZXdvbmx5KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHFkLWZvcm0tbGFiZWxcbiAgW2xhYmVsXT1cImxhYmVsXCJcbiAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgW3ZpZXdvbmx5XT1cInZpZXdvbmx5XCJcbiAgW2NvbnRyb2xdPVwiY29udHJvbFwiXG4gIFt0b29sdGlwXT1cImNvbmZpZz8udG9vbHRpcFwiXG4gIFtkYXRhLXRlc3QtaWRdPVwidGVzdElkXCJcbj48L3FkLWZvcm0tbGFiZWw+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgIXZpZXdvbmx5ICYmICFoYXNPcHRpb25zXCI+XG4gIDxkaXYgY2xhc3M9XCJxZC1pbnB1dC1pbnB1dFwiIChrZXlkb3duLmVudGVyKT1cImVtaXRFbnRlckNsaWNrKClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRCb3hcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHNwYW4gY2xhc3M9XCJxZC1pbnB1dC1jaGFyYWN0ZXItY291bnRlclwiICpuZ0lmPVwiaGFzTWF4TGVuZ3RoXCI+e3sgbnVtYmVyT2ZDaGFyYWN0ZXJzIH19IC8ge3sgbWF4TGVuZ3RoIH19PC9zcGFuPlxuXG4gIDxxZC1mb3JtLWhpbnRcbiAgICBbaGludF09XCJoaW50XCJcbiAgICBbY29udHJvbF09XCJjb250cm9sXCJcbiAgICBbaGFzRXJyb3JdPVwiaGFzRXJyb3JcIlxuICAgIFtoaW50QWN0aW9uXT1cImhpbnRBY3Rpb25cIlxuICAgIFtkYXRhLXRlc3QtaWRdPVwidGVzdElkXCJcbiAgPjwvcWQtZm9ybS1oaW50PlxuPC9uZy1jb250YWluZXI+XG5cbjxkaXYgKm5nSWY9XCIhcmVhZG9ubHkgJiYgIXZpZXdvbmx5ICYmIGhhc09wdGlvbnNcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwicWQtaW5wdXQtaW5wdXRcIlxuICAgIHFkSW5wdXRPcHRpb25zXG4gICAgW3FkUG9wb3Zlck1pbldpZHRoXT1cIjIwMFwiXG4gICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgIFt2YWx1ZV09XCJfdmFsdWUudmFsdWVcIlxuICAgIChvcHRpb25TZWxlY3RlZCk9XCJoYW5kbGVPcHRpb25TZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAoZW50ZXJDbGljayk9XCJlbWl0RW50ZXJDbGljaygpXCJcbiAgPlxuICAgIDwhLS0gaGFuZGxlIChlbnRlckNsaWNrKSBieSBvcHRpb25zIGRpcmVjdGl2ZSBoZXJlIGJlY2F1c2UgZXZlbnQgaGFzIHRvIGJlIGZpcmVkIGFmdGVyIHNlbGVjdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRCb3hcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHNwYW4gY2xhc3M9XCJxZC1pbnB1dC1jaGFyYWN0ZXItY291bnRlclwiICpuZ0lmPVwiaGFzTWF4TGVuZ3RoXCI+e3sgbnVtYmVyT2ZDaGFyYWN0ZXJzIH19IC8ge3sgbWF4TGVuZ3RoIH19PC9zcGFuPlxuXG4gIDxxZC1mb3JtLWhpbnRcbiAgICBbaGludF09XCJoaW50XCJcbiAgICBbY29udHJvbF09XCJjb250cm9sXCJcbiAgICBbaGFzRXJyb3JdPVwiaGFzRXJyb3JcIlxuICAgIFtoaW50QWN0aW9uXT1cImhpbnRBY3Rpb25cIlxuICAgIFtkYXRhLXRlc3QtaWRdPVwidGVzdElkXCJcbiAgPjwvcWQtZm9ybS1oaW50PlxuPC9kaXY+XG5cbjxxZC1mb3JtLXJlYWRvbmx5XG4gICpuZ0lmPVwicmVhZG9ubHlcIlxuICBbdmFsdWVzXT1cInZhbHVlQXNMaXN0XCJcbiAgW3JlYWRvbmx5QWN0aW9uXT1cInJlYWRvbmx5QWN0aW9uXCJcbiAgW2RhdGEtdGVzdC1pZF09XCJ0ZXN0SWRcIlxuPjwvcWQtZm9ybS1yZWFkb25seT5cblxuPHFkLWZvcm0tdmlld29ubHlcbiAgKm5nSWY9XCJ2aWV3b25seVwiXG4gIFt2YWx1ZXNdPVwidmFsdWVBc0xpc3RcIlxuICBbdmlld29ubHlBY3Rpb25dPVwidmlld29ubHlBY3Rpb25cIlxuICBbZGF0YS10ZXN0LWlkXT1cInRlc3RJZFwiXG4+PC9xZC1mb3JtLXZpZXdvbmx5PlxuXG48bmctdGVtcGxhdGUgI2lucHV0Qm94PlxuICA8aW5wdXRcbiAgICAjaW5wdXRcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgIFt2YWx1ZV09XCJoYXNPcHRpb25zID8gKF92YWx1ZS52YWx1ZS50b1N0cmluZygpIHwgdHJhbnNsYXRlKSA6IF92YWx1ZS52YWx1ZVwiXG4gICAgKGlucHV0KT1cImhhbmRsZUlucHV0KCRldmVudClcIlxuICAgIChmb2N1cyk9XCJoYW5kbGVJbnB1dEZvY3VzKClcIlxuICAgIChibHVyKT1cImhhbmRsZUlucHV0Qmx1cigpXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgIFt0eXBlXT1cImlucHV0VHlwZVwiXG4gICAgW2F0dHIuaW5wdXRtb2RlXT1cImlucHV0TW9kZVwiXG4gICAgW3FkQXV0b2ZvY3VzXT1cImhhc0F1dG9mb2N1c1wiXG4gICAgW2F0dHIuZGF0YS10ZXN0LWlkXT1cInRlc3RJZCArICctaW5wdXQnXCJcbiAgICBbc3RlcF09XCJjb25maWc/LnN0ZXBcIlxuICAgIHJlcXVpcmVkXG4gIC8+XG4gIDxkaXYgY2xhc3M9XCJxZC1pbnB1dC1zdWZmaXhcIj5cbiAgICA8cWQtaWNvbiAqbmdJZj1cImhhc0Vycm9yICYmICFoYXNPbmx5VW5pdHNFcnJvclwiIGNsYXNzPVwicWQtaW5wdXQtZXJyb3ItaWNvblwiIGljb249XCJleGNsYW1hdGlvbkNpcmNsZVNvbGlkXCI+PC9xZC1pY29uPlxuICAgIDxxZC1pY29uICpuZ0lmPVwiY2xlYXJhYmxlXCIgY2xhc3M9XCJxZC1pbnB1dC1jbGVhcmFibGUtaWNvblwiIGljb249XCJ0aW1lc0xhcmdlXCIgKGNsaWNrKT1cImNsZWFySW5wdXQoKVwiPjwvcWQtaWNvbj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcWRJY29uQnV0dG9uXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG4gIDxxZC1pbnB1dC11bml0c1xuICAgICpuZ0lmPVwiaGFzVW5pdHNcIlxuICAgIFt1bml0XT1cIl92YWx1ZS51bml0XCJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgKHVuaXRDaGFuZ2UpPVwiaGFuZGxlVW5pdENoYW5nZSgkZXZlbnQpXCJcbiAgICAob3BlbmVkKT1cImhhbmRsZVVuaXRzT3BlbmVkKClcIlxuICAgIChjbG9zZWQpPVwiaGFuZGxlVW5pdHNDbG9zZWQoKVwiXG4gID48L3FkLWlucHV0LXVuaXRzPlxuICA8ZGl2IGNsYXNzPVwicWQtaW5wdXQtc3VmZml4XCIgKm5nSWY9XCJoYXNFcnJvciAmJiBoYXNPbmx5VW5pdHNFcnJvclwiPlxuICAgIDxxZC1pY29uIGNsYXNzPVwicWQtaW5wdXQtZXJyb3ItaWNvblwiIGljb249XCJleGNsYW1hdGlvbkNpcmNsZVNvbGlkXCI+PC9xZC1pY29uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
610
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9xZC11aS9zcmMvbGliL2Zvcm1zL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcWQtdWkvc3JjL2xpYi9mb3Jtcy9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLElBQUksRUFDSixXQUFXLEVBQ1gsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLGdCQUFnQixFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQVVuRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDeEUsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsZUFBZSxFQUNmLE9BQU8sRUFDUCxhQUFhLEVBQ2IsWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsY0FBYyxFQUNkLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFdBQVcsRUFDWCxpQkFBaUIsRUFD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ZTtzQkFEZCxLQUFLO2dCQVVOLEtBQUs7c0JBREosS0FBSztnQkFjTixNQUFNO3NCQURMLEtBQUs7Z0JBU04sT0FBTztzQkFETixLQUFLO2dCQVFOLE1BQU07c0JBREwsS0FBSzt1QkFBQyxjQUFjO2dCQVFaLFdBQVc7c0JBRG5CLE1BQU07Z0JBUUUsVUFBVTtzQkFEbEIsTUFBTTtnQkFRRSxVQUFVO3NCQURsQixNQUFNO2dCQU9FLFNBQVM7c0JBRGpCLE1BQU07Z0JBT0UsYUFBYTtzQkFEckIsTUFBTTtnQkFPRSxhQUFhO3NCQURyQixNQUFNO2dCQUlQLFFBQVE7c0JBRFAsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBSXRDLGNBQWM7c0JBRGIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBSTlDLFFBQVE7c0JBRFAsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBSXRDLGNBQWM7c0JBRGIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBSzlDLFVBQVU7c0JBRlQsV0FBVzt1QkFBQywyQkFBMkI7O3NCQUN2QyxXQUFXO3VCQUFDLDRCQUE0QjtnQkFLekMsUUFBUTtzQkFGUCxXQUFXO3VCQUFDLHdCQUF3Qjs7c0JBQ3BDLFdBQVc7dUJBQUMseUJBQXlCO2dCQUl0QyxjQUFjO3NCQURiLFdBQVc7dUJBQUMsc0JBQXNCO2dCQU0vQixRQUFRO3NCQUZYLFdBQVc7dUJBQUMscUJBQXFCOztzQkFDakMsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBTS9CLGtCQUFrQjtzQkFEckIsV0FBVzt1QkFBQyxtQ0FBbUM7Z0JBTWhELFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLXN0cmljdC1pZ25vcmVcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0LFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNraXBTZWxmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xDb250YWluZXIsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFFkRm9jdXNhYmxlIH0gZnJvbSAnLi4vLi4vY29yZS9mb2N1c2FibGUvZm9jdXNhYmxlJztcbmltcG9ydCB7IFFEX0ZPQ1VTQUJMRV9UT0tFTiB9IGZyb20gJy4uLy4uL2NvcmUvZm9jdXNhYmxlL2ZvY3VzYWJsZS50b2tlbic7XG5pbXBvcnQgeyBRZEV2ZW50QnJva2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvZXZlbnQtYnJva2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0VmFsdWVXaXRoVW5pdCB9IGZyb20gJy4vaGVscGVycy9nZXQtdmFsdWUtd2l0aC11bml0JztcblxuaW1wb3J0IHsgUWRQb3BvdmVyU2l6aW5nU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvcG9wb3Zlci9wb3BvdmVyLXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IFFkRm9ybU9wdGlvbnNSZXNvbHZlciB9IGZyb20gJy4uL21vZGVsL2Zvcm0tb3B0aW9ucy1yZXNvbHZlcic7XG5pbXBvcnQge1xuICBRZEZvcm1JbnB1dENvbmZpZ3VyYXRpb24sXG4gIFFkSW5wdXRNb2RlLFxuICBRZElucHV0VHlwZSxcbiAgUWRJbnB1dFZhbHVlLFxuICBRZElucHV0VmFsdWVXaXRoVW5pdFxufSBmcm9tICcuLi9tb2RlbC9mb3Jtcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUWRGb3JtSW5wdXRPcHRpb24gfSBmcm9tICcuLi9tb2RlbC9vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBRZEZvcm1Db250cm9sIH0gZnJvbSAnLi4vcmVhY3RpdmUtZm9ybXMvY29udHJvbHMvZm9ybS1jb250cm9sJztcbmltcG9ydCB7XG4gIGdldENsZWFyYWJsZSxcbiAgZ2V0RGlzYWJsZWQsXG4gIGdldEhhc0F1dG9mb2N1cyxcbiAgZ2V0SGludCxcbiAgZ2V0SGludEFjdGlvbixcbiAgZ2V0SW5wdXRNb2RlLFxuICBnZXRJbnB1dFR5cGUsXG4gIGdldExhYmVsLFxuICBnZXRQbGFjZWhvbGRlcixcbiAgZ2V0UmVhZG9ubHksXG4gIGdldFJlYWRvbmx5QWN0aW9uLFxuICBnZXRWYWx1ZSxcbiAgZ2V0Vmlld29ubHksXG4gIGdldFZpZXdvbmx5QWN0aW9uXG59IGZyb20gJy4uL3NoYXJlZC9oZWxwZXJzL2Zvcm1zLmhlbHBlcnMnO1xuaW1wb3J0IHsgUWRGb3Jtc0FjdGlvbkVtaXR0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL3NlcnZpY2VzL2FjdGlvbi1lbWl0dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUWRGb3JtT3B0aW9uc1Jlc29sdmVyUmVnaXN0cnkgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvb3B0aW9ucy1yZXNvbHZlci5yZWdpc3RyeSc7XG5cbi8qKlxuICogVGhlICoqUWRJbnB1dCoqIGNvbXBvbmVudCBwcm92aWRlcyBhIEZvcm1FbGVtZW50IGZvciBlbnRlcmluZyB0ZXh0IGludG8gYSBVSS48YnIgLz5cbiAqIEl0IGNhbiBiZSB1c2VkIHdpdGggUXVhZHJlbCBSZWFjdGl2ZSBGb3JtcyBvciB3aXRoIG1vZGVsIGJpbmRpbmcuXG4gKlxuICogIyMjICoqVXNhZ2Ugd2l0aCBSZWFjdGl2ZSBGb3JtcyoqXG4gKlxuICogYGBgdHNcbiAqIGZvcm0gPSBuZXcgUWRGb3JtR3JvdXAoe1xuICogICBpbnB1dDogbmV3IFFkRm9ybUNvbnRyb2woKVxuICogfSk7XG4gKiBgYGBcbiAqIGBgYGh0bWxcbiAqIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICogICA8cWQtaW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJpbnB1dFwiIFtjb25maWddPVwiY29uZmlnXCI+PC9xZC1pbnB1dD5cbiAqIDwvZm9ybT5cbiAqIGBgYFxuICpcbiAqICMjIyAqKlVzYWdlIHdpdGggTW9kZWwgQmluZGluZyoqXG4gKiBgYGB0c1xuICogdmFsdWU7XG4gKiBgYGBcbiAqIGBgYGh0bWxcbiAqIDxxZC1pbnB1dCBbKHZhbHVlKV09XCJ2YWx1ZVwiIFtjb25maWddPVwiY29uZmlnXCI+PC9xZC1pbnB1dD5cbiAqIGBgYFxuICpcbiAqICMjICoqU3VnZ2VzdGVkIE9wdGlvbnMqKlxuICpcbiAqICMjIyAqKlN0YXRpYyBvcHRpb25zIGJ5IGNvbmZpZyoqXG4gKlxuICogU3RhdGljIG9wdGlvbnMgY2FuIGJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBgb3B0aW9uc2AgZmllbGQ6XG4gKlxuICogYGBgdHNcbiAqIGNvbmZpZzogUWRGb3JtSW5wdXRDb25maWd1cmF0aW9uID0ge1xuICogICAuLi5cbiAqICAgb3B0aW9uczogW1xuICogICAgIHsgaTE4bjogJ2kxOG4ucWQuZXhhbXBsZUZvcm1GaWVsZC5nb29kc0RlY2xhcmF0aW9uLmltcG9ydCcsIHZhbHVlOiAnaW1wb3J0JyB9LFxuICogICAgIHsgaTE4bjogJ2kxOG4ucWQuZXhhbXBsZUZvcm1GaWVsZC5nb29kc0RlY2xhcmF0aW9uLmV4cG9ydCcsIHZhbHVlOiAnZXhwb3J0JyB9LFxuICogICAgIHsgaTE4bjogJ2kxOG4ucWQuZXhhbXBsZUZvcm1GaWVsZC5nb29kc0RlY2xhcmF0aW9uLnRyYW5zaXQnLCB2YWx1ZTogJ3RyYW5zaXQnLCBkaXNhYmxlZDogdHJ1ZSB9XG4gKiAgIF1cbiAqIH1cbiAqIGBgYFxuICogYGBgaHRtbFxuICogPHFkLWlucHV0IFtjb25maWddPVwiY29uZmlnXCI+PC9xZC1pbnB1dD5cbiAqIGBgYFxuICpcbiAqIDxTdG9yeSBpZD1cImNvbXBvbmVudHMtZ3JpZC1zeXN0ZW0tY29udGFpbmVyLS1jb2x1bW5zLTZcIiAvPlxuICpcbiAqICMjIyAqKkR5bmFtaWMgb3B0aW9ucyBieSByZXNvbHZlcioqXG4gKlxuICogSWYgeW91IHdhbnQgdG8gZGVmaW5lIHRoZSBvcHRpb25zIGR5bmFtaWNhbGx5LCB5b3UgY2FuIGluamVjdCBhIGBRZEZvcm1PcHRpb25zUmVzb2x2ZXJgXG4gKiB3aXRoIHRoZSBgUURfRk9STV9PUFRJT05TX1JFU09MVkVSYCBpbmplY3Rpb24gdG9rZW4uIFRoZSByZXNvbHZlciBqdXN0IGhhcyB0byBpbXBsZW1lbnQgdGhlIGByZXNvbHZlcmBcbiAqIG1ldGhvZC5cbiAqXG4gKiBgYGB0c1xuICogQEluamVjdGFibGUoKVxuICogZXhwb3J0IGNsYXNzIFlvdXJGb3JtT3B0aW9uc1Jlc29sdmVyIGltcGxlbWVudHMgUWRGb3JtT3B0aW9uc1Jlc29sdmVyIHtcbiAqICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7fVxuICpcbiAqICAgcmVzb2x2ZSh2YWx1ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxRZEZvcm1JbnB1dFtdPiB7XG4gKiAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICogICAgICAgLmdldCh5b3VyQmFja2VuZFVybClcbiAqICAgICAgIC5waXBlKFxuICogICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAqICAgICAgICAgICBjb25zb2xlLmVycm9yKCd5b3VyIGVycm9yIG1lc3NhZ2UnKTtcbiAqXG4gKiAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xuICogICAgICAgICB9KVxuICogICAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBUaGUgb3B0aW9ucyByZXNvbHZlciBjYW4gYmUgaW5qZWN0ZWQgaW50byBhIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSBgUWRJbnB1dGAgb3IgYWxzbyBpbnRvIGEgcGFyZW50XG4gKiBjb21wb25lbnQuIElmIHlvdSBuZWVkIGR5bmFtaWMgb3B0aW9ucyBmb3IgdGhlIHNlYXJjaCBpbiB0aGUgc2VjdGlvbiB0b29sYmFyLCB5b3UgY2FuIGluamVjdFxuICogdGhlIHJlc29sdmVyIG9uIGEgaGlnaGVyIGxldmVsLCBlLmcuIGluIHRoZSBjb21wb25lbnQgdGhhdCBjb250YWlucyB0aGUgc2VjdGlvbi5cbiAqXG4gKiBgYGB0c1xuICogQENvbXBvbmVudCh7XG4gKiAgIC4uLlxuICogICBwcm92aWRlcnM6IFtcbiAqICAgICAuLi5cbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBRRF9GT1JNX09QVElPTlNfUkVTT0xWRVIsXG4gKiAgICAgICB1c2VDbGFzczogWW91ckZvcm1PcHRpb25zUmVzb2x2ZXJcbiAqICAgICB9XG4gKiAgIF1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGUgcmVzb2x2ZXIgaXMgYXBwbGllZCB0byBldmVyeSBpbnB1dCB0aGF0IGlzIGluc2lkZSB0aGUgY29tcG9uZW50IHRoYXQgaW5qZWN0cyB0aGUgcmVzb2x2ZXIuXG4gKiBUbyBkaXNhYmxlIHRoZSByZXNvbHZlciBmb3IgYW4gaW5wdXQsIHlvdSBoYXZlIHRvIHNldCB0aGUgYG9wdGlvbnNSZXNvbHZlck5hbWVgIHByb3BlcnR5IGluIHRoZVxuICogaW5wdXQgY29uZmlnIHRvIGBudWxsYC4gSXQncyBhbHNvIHBvc3NpYmxlIHRvIGRlZmluZSBhIGBuYW1lYCBmb3IgdGhlIHJlc29sdmVyIGJ5IHNldHRpbmcgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICogaW4gdGhlIHJlc29sdmVyIGNsYXNzLiBUaHVzLCB5b3UgY2FuIGNvbm5lY3QgdGhlIGlucHV0IHRvIGEgc3BlY2lmaWMgcmVzb2x2ZXIuIEJlbG93IHRoZXJlIGlzIGFsc28gYVxuICogZGVzY3JpcHRpb24gb2YgaG93IHRvIHVzZSBtdWx0aXBsZSBpbnB1dHMgd2l0aCBkaWZmZXJlbnQgcmVzb2x2ZXJzIGluIG9uZSBjb21wb25lbnQuXG4gKiA8YnI+PGJyPlxuICpcbiAqICMjIyMgKipNdWx0aXBsZSBpbnB1dHMgd2l0aCBzdWdnZXN0ZWQgb3B0aW9ucyoqXG4gKlxuICogRm9yIG11bHRpcGxlIGlucHV0cyB3aXRoIHZhcmlvdXMgcmVzb2x2ZXJzIGluIG9uZSBjb21wb25lbnQgeW91IGNhbiBkaXN0aW5ndWlzaCB0aGUgcmVzb2x2ZXJzIGJ5IHNldHRpbmcgdGhlXG4gKiBgbmFtZWAgYXMgYSBwcm9wZXJ0eSBpbiB0aGUgcmVzb2x2ZXIgY2xhc3MuXG4gKlxuICogYGBgdHNcbiAqIEBJbmplY3RhYmxlKClcbiAqIGV4cG9ydCBjbGFzcyBGcnVpdHNGb3JtT3B0aW9uc1Jlc29sdmVyIGltcGxlbWVudHMgUWRGb3JtT3B0aW9uc1Jlc29sdmVyIHtcbiAqICAgbmFtZSA9ICdmcnVpdHMnO1xuICogICAvLyAuLi5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIGBgYHRzXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBleHBvcnQgY2xhc3MgQ291bnRyaWVzRm9ybU9wdGlvbnNSZXNvbHZlciBpbXBsZW1lbnRzIFFkRm9ybU9wdGlvbnNSZXNvbHZlciB7XG4gKiAgIG5hbWUgPSAnY291bnRyaWVzJztcbiAqICAgLy8gLi4uXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGVuIHRoZSBpbnB1dCBjYW4gYmUgYXNzaWduZWQgdG8gYSByZXNvbHZlciBieSBzZXR0aW5nIHRoZSBgb3B0aW9uc1Jlc29sdmVyTmFtZWAgcHJvcGVydHlcbiAqIGluIHRoZSBpbnB1dCBjb25maWcuXG4gKlxuICogYGBgdHNcbiAqIGNvbmZpZzogUWRGb3JtSW5wdXRDb25maWd1cmF0aW9uID0ge1xuICogICAuLi5cbiAqICAgb3B0aW9uc1Jlc29sdmVyTmFtZTogJ2ZydWl0cydcbiAqIH1cbiAqXG4gKiBjb25maWcyOiBRZEZvcm1JbnB1dENvbmZpZ3VyYXRpb24gPSB7XG4gKiAgIC4uLlxuICogICBvcHRpb25zUmVzb2x2ZXJOYW1lOiAnY291bnRyaWVzJ1xuICogfVxuICogYGBgXG4gKiBgYGBodG1sXG4gKiA8cWQtaW5wdXQgW2NvbmZpZ109XCJjb25maWdcIj48L3FkLWlucHV0PlxuICogPHFkLWlucHV0IFtjb25maWddPVwiY29uZmlnMlwiPjwvcWQtaW5wdXQ+XG4gKiBgYGBcbiAqIFRvIGluamVjdCBtdWx0aXBsZSByZXNvbHZlcnMgaW4gYSBjb21wb25lbnQgeW91IGNhbiB1c2UgdGhlIHByb3ZpZGVyIHNldHRpbmcgYG11bHRpOiB0cnVlYC5cbiAqXG4gKiBgYGB0c1xuICogQENvbXBvbmVudCh7XG4gKiAgIC4uLlxuICogICBwcm92aWRlcnM6IFtcbiAqICAgICAuLi5cbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBRRF9GT1JNX09QVElPTlNfUkVTT0xWRVIsXG4gKiAgICAgICB1c2VDbGFzczogRnJ1aXRzRm9ybU9wdGlvbnNSZXNvbHZlcixcbiAqICAgICAgIG11bHRpOiB0cnVlXG4gKiAgICAgfSxcbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBRRF9GT1JNX09QVElPTlNfUkVTT0xWRVIsXG4gKiAgICAgICB1c2VDbGFzczogQ291bnRyaWVzRm9ybU9wdGlvbnNSZXNvbHZlcixcbiAqICAgICAgIG11bHRpOiB0cnVlXG4gKiAgICAgfVxuICogICBdXG4gKiB9KVxuICogYGBgXG4gKlxuICogIyMjIyAqKkN1c3RvbSBsb2FkaW5nIGFuZCBlcnJvciBoaW50cyoqXG4gKlxuICogSW4gdGhlIHJlc29sdmVyIHlvdSBhbHNvIGNhbiBkZWZpbmUgY3VzdG9tIGxvYWRpbmcgYW5kIGVycm9yIGhpbnRzIHdpdGggdGhlIHByb3BlcnRpZXMgYHJlcXVlc3RMb2FkaW5nSGludGBcbiAqIGFuZCBgcmVxdWVzdEVycm9ySGludGAuXG4gKlxuICogYGBgdHNcbiAqIEBJbmplY3RhYmxlKClcbiAqIGV4cG9ydCBjbGFzcyBZb3VyRm9ybU9wdGlvbnNSZXNvbHZlciBpbXBsZW1lbnRzIFFkRm9ybU9wdGlvbnNSZXNvbHZlciB7XG4gKiAgIHJlcXVlc3RMb2FkaW5nSGludCA9IHsgaTE4bjogJ2kxOG4uY3VzdG9tLm9wdGlvbnMubG9hZGluZycgfTtcbiAqICAgcmVxdWVzdEVycm9ySGludCA9IHsgaTE4bjogJ2kxOG4uY3VzdG9tLm9wdGlvbnMuZXJyb3InIH07XG4gKlxuICogICAvLyAuLi5cbiAqXG4gKiAgIHJlc29sdmUodmFsdWU6IHN0cmluZyk6IE9ic2VydmFibGU8UWRGb3JtSW5wdXRbXT4ge1xuICogICAgIC8vIC4uLlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIFlvdSBhbHNvIGNhbiB1cGRhdGUgdGhlIGVycm9yIGhpbnQgZGlyZWN0bHkgaW4gdGhlIHJlc29sdmUgbWV0aG9kIHRvIGRpc3BsYXkgYSBtb3JlIHNwZWNpZmljIGVycm9yXG4gKiBtZXNzYWdlIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICpcbiAqIGBgYHRzXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBleHBvcnQgY2xhc3MgWW91ckZvcm1PcHRpb25zUmVzb2x2ZXIgaW1wbGVtZW50cyBRZEZvcm1PcHRpb25zUmVzb2x2ZXIge1xuICogICAvLyAuLi5cbiAqXG4gKiAgIGNvbnN0cnVjdG9yKFxuICogICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQkFDS0VORF9FUlJPUl9DT0RFUykgcHJpdmF0ZSByZWFkb25seSBiYWNrZW5kRXJyb3JDb2Rlc1xuICogICApIHtcbiAqICAgICB0aGlzLmJhY2tlbmRFcnJvckNvZGVzID0gdGhpcy5iYWNrZW5kRXJyb3JDb2RlcyB8fCB7fTtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uXG4gKlxuICogICByZXNvbHZlKHZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFFkRm9ybUlucHV0W10+IHtcbiAqICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gKiAgICAgICAuZ2V0KHlvdXJCYWNrZW5kVXJsKVxuICogICAgICAgLnBpcGUoXG4gKiAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICogICAgICAgICAgIGlmIChlcnJvci5lcnJvcj8uZXJyb3JDb2RlICYmIGVycm9yLmVycm9yLmVycm9yQ29kZSBpbiB0aGlzLmJhY2tlbmRFcnJvckNvZGVzKVxuICogICAgICAgICAgICAgdGhpcy5yZXF1ZXN0RXJyb3JIaW50ID0geyBpMThuOiAnRVJST1IuJyArIGVycm9yLmVycm9yLmVycm9yQ29kZSB9O1xuICogICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAqICAgICAgICAgfSlcbiAqICAgICAgICk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdxZC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IFFkSW5wdXRDb21wb25lbnQsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAgUWRGb3Jtc0FjdGlvbkVtaXR0ZXJTZXJ2aWNlLFxuICAgIFFkRm9ybU9wdGlvbnNSZXNvbHZlclJlZ2lzdHJ5LFxuICAgIC8vIFRPRE86IFJlbW92ZSB3aGVuIHJlbW92aW5nIGRlcml2ZWQgZGlyZWN0aXZlXG4gICAgUWRQb3BvdmVyU2l6aW5nU2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBRRF9GT0NVU0FCTEVfVE9LRU4sXG4gICAgICB1c2VFeGlzdGluZzogUWRJbnB1dENvbXBvbmVudFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBRZElucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFFkRm9jdXNhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgbmFtZSBjYW4gYmUgYXNzaWduZWQgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgUmVhY3RpdmUgRm9ybXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBmb3JtQ29udHJvbE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZm9ybSBpdGVtIHZhbHVlLCBpZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBNb2RlbCBCaW5kaW5nLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiA8cWQtaW5wdXQgWyh2YWx1ZSldPVwidmFsdWVcIiBbY29uZmlnXT1cImNvbmZpZ1wiPjwvcWQtaW5wdXQ+XG4gICAqL1xuICBASW5wdXQoKVxuICB2YWx1ZTtcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgZm9ybSBpdGVtXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHtcbiAgICogICBsYWJlbDogeyBpMThuOiAnbGFiZWwnIH0sXG4gICAqICAgcGxhY2Vob2xkZXI6IHsgaTE4bjogJ3BsYWNlaG9sZGVyJyB9LFxuICAgKiAgIGhpbnQ6IHsgaTE4bjogJ2hpbnQnIH1cbiAgICogfTtcbiAgICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZzogUWRGb3JtSW5wdXRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTZXQgY29tcG9uZW50IHRvIFwiZXJyb3JcIiBleHRlcm5hbGx5LiBObyByZWFjdGl2ZSBmb3JtcyByZXF1aXJlZC4gVXNlZCBmb3IgY29tcG9uZW50cyB3aXRoaW4gdGhlIFF1YWRyZWwgVUkgZnJhbWV3b3JrLiBUaGlzIGlzIGRvbmUgYnkgYSBDU1MgY2xhc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBpc0Vycm9yID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgc3RhdGljIHRlc3QgSUQgZm9yIGludGVncmF0aW9uIHRlc3RzIGNhbiBiZSBzZXQuIDxiciAvPlxuICAgKiBUaGUgdmFsdWUgZm9yIHRoZSBIVE1MIGF0dHJpYnV0ZSBbZGF0YS10ZXN0LWlkXS5cbiAgICovXG4gIEBJbnB1dCgnZGF0YS10ZXN0LWlkJylcbiAgdGVzdElkID0gJ3RleHQtaW5wdXQnO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCB3aGVuIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC5cbiAgICogT3B0aW9uYWxseSBlbWl0cyB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZSwgaW5jbHVkaW5nIHVuaXQgKGlmIGNvbmZpZ3VyZWQpLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxRZElucHV0VmFsdWUgfCBRZElucHV0VmFsdWVXaXRoVW5pdCB8IHVuZGVmaW5lZD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgd2hlbiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuIE5vdGU6IEVtaXRzIG9uIGtleXVwIChubyBsb25nZXIgb24gY2xpY2ssIGFzIGJlZm9yZSkhXG4gICAqIE9wdGlvbmFsbHkgZW1pdHMgdGhlIGN1cnJlbnQgaW5wdXQgdmFsdWUsIGluY2x1ZGluZyB1bml0IChpZiBjb25maWd1cmVkKS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBlbnRlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxRZElucHV0VmFsdWUgfCBRZElucHV0VmFsdWVXaXRoVW5pdCB8IHVuZGVmaW5lZD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgd2hlbiB0aGUgaW5wdXQgZmllbGQgd2FzIGxhcHBlZCBvbiBjbGljay90YXAgb24gdGhlIHggaWNvbi4gPGJyIC8+XG4gICAqIGBRZEZvcm1JbnB1dENvbmZpZ3VyYXRpb25bJ2NsZWFyYWJsZSddYCBtdXN0IGJlIHNldCB0byB0cnVlIGZvciB0aGlzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGNsaWNrQ2xlYXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIGhpbnQgaXMgY2xpY2tlZC90YXBwZWQuIGBoaW50QWN0aW9uYCBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgZm9yIHRoaXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgY2xpY2tIaW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCB3aGVuIHRoZSByZWFkb25seSB2YWx1ZSBpcyBjbGlja2VkL3RhcHBlZC4gYGNsaWNrUmVhZG9ubHkgYCBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgZm9yIHRoaXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgY2xpY2tSZWFkb25seSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgd2hlbiB0aGUgdmlld29ubHkgdmFsdWUgaXMgY2xpY2tlZC90YXBwZWQuIGBjbGlja1ZpZXdvbmx5IGAgbXVzdCBiZSBzZXQgdG8gYHRydWVgIGZvciB0aGlzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGNsaWNrVmlld29ubHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC1yZWFkb25seScpXG4gIHJlYWRvbmx5OiBib29sZWFuO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MucWQtaW5wdXQtLXJlYWRvbmx5LWFjdGlvbicpXG4gIHJlYWRvbmx5QWN0aW9uID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC12aWV3b25seScpXG4gIHZpZXdvbmx5OiBib29sZWFuO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MucWQtaW5wdXQtLXZpZXdvbmx5LWFjdGlvbicpXG4gIHZpZXdvbmx5QWN0aW9uID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1mb3JtLWhpbnQtYWN0aW9uJylcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC1oaW50LWFjdGlvbicpXG4gIGhpbnRBY3Rpb24gPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWZvcm0tZGlzYWJsZWQnKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnFkLWlucHV0LWRpc2FibGVkJylcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC1mb2N1cycpXG4gIGlzSW5wdXRGb2N1c2VkID0gZmFsc2U7XG4gIGFyZVVuaXRzT3BlbmVkID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1mb3JtLWVycm9yJylcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5xZC1pbnB1dC1lcnJvcicpXG4gIGdldCBoYXNFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnRvdWNoZWQgJiYgdGhpcy5jb250cm9sLmludmFsaWQgOiBmYWxzZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MucWQtaW5wdXQtZXJyb3ItZnJvbS1vdXRzaWRlJylcbiAgZ2V0IGlzRXJyb3JGcm9tT3V0c2lkZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Vycm9yO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXQnKVxuICBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgaW5wdXRUeXBlOiBRZElucHV0VHlwZTtcbiAgaW5wdXRNb2RlOiBRZElucHV0TW9kZTtcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaGludDogc3RyaW5nO1xuICBjbGVhcmFibGU6IGJvb2xlYW47XG4gIGhhc0F1dG9mb2N1czogYm9vbGVhbjtcbiAgaGFzT3B0aW9ucyA9IGZhbHNlO1xuICBfdmFsdWU6IFFkSW5wdXRWYWx1ZVdpdGhVbml0ID0geyB2YWx1ZTogJycgfTtcbiAgY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgUWRGb3JtQ29udHJvbDxhbnk+O1xuXG4gIHByaXZhdGUgX29wdGlvbnNSZXNvbHZlciE6IFFkRm9ybU9wdGlvbnNSZXNvbHZlciB8IG51bGw7XG4gIHByaXZhdGUgX3N1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJpdmF0ZSBfb25DaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xuICBwcml2YXRlIF9vblRvdWNoOiBhbnkgPSAoKSA9PiB7fTtcblxuICBnZXQgaGFzT25seVVuaXRzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRXF1YWwoT2JqZWN0LmtleXModGhpcy5jb250cm9sLmVycm9ycyksIFsncmVxdWlyZWQnXSkgJiYgdGhpcy5fdmFsdWUudmFsdWUgIT09ICcnO1xuICB9XG5cbiAgZ2V0IGhhc1VuaXRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udW5pdHM/Lmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgbnVtYmVyT2ZDaGFyYWN0ZXJzKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLl92YWx1ZS52YWx1ZSkgcmV0dXJuIDA7XG5cbiAgICByZXR1cm4gU3RyaW5nKHRoaXMuX3ZhbHVlLnZhbHVlKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgaGFzTWF4TGVuZ3RoKCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRoaXMuY29udHJvbCBpbnN0YW5jZW9mIFFkRm9ybUNvbnRyb2wpKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5jb250cm9sLmhhc01heExlbmd0aCgpO1xuICB9XG5cbiAgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIGlmICghKHRoaXMuY29udHJvbCBpbnN0YW5jZW9mIFFkRm9ybUNvbnRyb2wpKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy5jb250cm9sLmdldE1heExlbmd0aE9yVW5kZWZpbmVkKCk7XG4gIH1cblxuICBnZXQgdmFsdWVBc0xpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbYCR7dGhpcy5fdmFsdWUudmFsdWV9JHt0aGlzLl92YWx1ZS51bml0ID8gJyAnICsgdGhpcy5fdmFsdWUudW5pdCA6ICcnfWBdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25FbWl0dGVyU2VydmljZTogUWRGb3Jtc0FjdGlvbkVtaXR0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXJSZWdpc3RyeTogUWRGb3JtT3B0aW9uc1Jlc29sdmVyUmVnaXN0cnksXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBAU2tpcFNlbGYoKSBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBldmVudEJyb2tlclNlcnZpY2U6IFFkRXZlbnRCcm9rZXJTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zUmVzb2x2ZXIoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZygpO1xuXG4gICAgaWYgKHRoaXMuY29udHJvbENvbnRhaW5lcikge1xuICAgICAgaWYgKHRoaXMuZm9ybUNvbnRyb2xOYW1lKSB7XG4gICAgICAgIHRoaXMuY29udHJvbCA9IHRoaXMuY29udHJvbENvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSk7XG5cbiAgICAgICAgLy8gVE9ETyByZW1vdmUgbG9naWMgZm9yIHN1cHBvcnQgb2YgYW5ndWxhciBGb3JtQ29udHJvbCB3aXRoIGFuZ3VsYXIgMjAgdXBkYXRlXG4gICAgICAgIGlmICghKHRoaXMuY29udHJvbCBpbnN0YW5jZW9mIFFkRm9ybUNvbnRyb2wpKVxuICAgICAgICAgIGNvbnNvbGUud2FybignUUQtVUkgfCBRZElucHV0Q29tcG9uZW50IC0gUGxlYXNlIHVzZSB0aGUgUWRGb3JtQ29udHJvbCBpbnN0ZWFkIG9mIHRoZSBBbmd1bGFyIEZvcm1Db250cm9sJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUgfHwgZ2V0VmFsdWUodGhpcy5jb25maWcpKTtcblxuICAgIHRoaXMubm9ybWFsaXplSW5pdGlhbENvbnRyb2xWYWx1ZUlmTmVlZGVkKCk7XG5cbiAgICB0aGlzLl9zdWJzLmFkZCh0aGlzLmFjdGlvbkVtaXR0ZXJTZXJ2aWNlLmhpbnRFdmVudEVtaXR0ZXIkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsaWNrSGludC5lbWl0KCkpKTtcbiAgICB0aGlzLl9zdWJzLmFkZCh0aGlzLmFjdGlvbkVtaXR0ZXJTZXJ2aWNlLnJlYWRvbmx5RXZlbnRFbWl0dGVyJC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbGlja1JlYWRvbmx5LmVtaXQoKSkpO1xuICAgIHRoaXMuX3N1YnMuYWRkKHRoaXMuYWN0aW9uRW1pdHRlclNlcnZpY2Uudmlld29ubHlFdmVudEVtaXR0ZXIkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsaWNrVmlld29ubHkuZW1pdCgpKSk7XG4gICAgdGhpcy5fc3Vicy5hZGQodGhpcy5pbml0T3BNb2RlU3Vic2NyaXB0aW9uKCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWcoKTtcbiAgICAgIHRoaXMubm9ybWFsaXplSW5pdGlhbENvbnRyb2xWYWx1ZUlmTmVlZGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10pIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBmblN0cmluZyA9IGZuLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoZm5TdHJpbmcuaW5jbHVkZXMoJ19ub0NvbnRyb2xFcnJvcicpIHx8IGZuU3RyaW5nLmluY2x1ZGVzKCd2YWxpZGF0ZUNvbnRyb2xQcmVzZW5jZU9uQ2hhbmdlJykpIHJldHVybjtcblxuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogUWRJbnB1dFZhbHVlV2l0aFVuaXQgfCBRZElucHV0VmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9IGdldFZhbHVlV2l0aFVuaXQodmFsdWUsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgdGhpcy5jbGVhcmFibGUgPSBnZXRDbGVhcmFibGUodGhpcy5jb25maWcpICYmICF0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgaGFuZGxlSW5wdXQoZXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHsgLi4udGhpcy5fdmFsdWUsIHZhbHVlIH07XG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICB0aGlzLl9vblRvdWNoKCk7XG4gIH1cblxuICBoYW5kbGVPcHRpb25TZWxlY3RlZChvcHRpb246IFFkRm9ybUlucHV0T3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB7IC4uLnRoaXMuX3ZhbHVlLCB2YWx1ZTogb3B0aW9uLmkxOG4gfTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQob3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLl9vbkNoYW5nZShvcHRpb24udmFsdWUpO1xuICAgIHRoaXMuX29uVG91Y2goKTtcbiAgfVxuXG4gIGhhbmRsZVVuaXRDaGFuZ2UodW5pdCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0geyAuLi50aGlzLl92YWx1ZSwgdW5pdCB9O1xuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBoYW5kbGVJbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaXNJbnB1dEZvY3VzZWQgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuaXNJbnB1dEZvY3VzZWQgPSBmYWxzZTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFyZVVuaXRzT3BlbmVkKSB0aGlzLl9vblRvdWNoKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGhhbmRsZVVuaXRzT3BlbmVkKCk6IHZvaWQge1xuICAgIHRoaXMuYXJlVW5pdHNPcGVuZWQgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlVW5pdHNDbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hcmVVbml0c09wZW5lZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuX3ZhbHVlLnVuaXQgJiYgdGhpcy5fdmFsdWUudmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uVG91Y2goKTtcbiAgICB9XG4gIH1cblxuICBjbGVhcklucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0geyAuLi50aGlzLl92YWx1ZSwgdmFsdWU6ICcnIH07XG4gICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuXG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICB0aGlzLmNsaWNrQ2xlYXIuZW1pdCgpO1xuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgZW1pdEVudGVyQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzVW5pdHMpIHtcbiAgICAgIHRoaXMuZW50ZXJDbGljay5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnRlckNsaWNrLmVtaXQodGhpcy5fdmFsdWUudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRUeXBlID0gZ2V0SW5wdXRUeXBlKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmlucHV0TW9kZSA9IGdldElucHV0TW9kZSh0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IGdldFBsYWNlaG9sZGVyKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmxhYmVsID0gZ2V0TGFiZWwodGhpcy5jb25maWcpO1xuICAgIHRoaXMuaGludCA9IGdldEhpbnQodGhpcy5jb25maWcpO1xuICAgIHRoaXMucmVhZG9ubHkgPSBnZXRSZWFkb25seSh0aGlzLmNvbmZpZywgdGhpcy5yZWFkb25seSk7XG4gICAgdGhpcy52aWV3b25seSA9IGdldFZpZXdvbmx5KHRoaXMuY29uZmlnLCB0aGlzLnZpZXdvbmx5KTtcbiAgICB0aGlzLmhpbnRBY3Rpb24gPSBnZXRIaW50QWN0aW9uKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLnJlYWRvbmx5QWN0aW9uID0gZ2V0UmVhZG9ubHlBY3Rpb24odGhpcy5jb25maWcpO1xuICAgIHRoaXMudmlld29ubHlBY3Rpb24gPSBnZXRWaWV3b25seUFjdGlvbih0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGdldERpc2FibGVkKHRoaXMuY29uZmlnKSB8fCAhIXRoaXMuY29udHJvbD8uZGlzYWJsZWQ7XG4gICAgdGhpcy5jbGVhcmFibGUgPSAhdGhpcy5kaXNhYmxlZCAmJiBnZXRDbGVhcmFibGUodGhpcy5jb25maWcpO1xuICAgIHRoaXMuaGFzQXV0b2ZvY3VzID0gZ2V0SGFzQXV0b2ZvY3VzKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmhhc09wdGlvbnMgPSAodGhpcy5jb25maWcub3B0aW9ucyAmJiB0aGlzLmNvbmZpZy5vcHRpb25zLmxlbmd0aCA+IDApIHx8ICEhdGhpcy5fb3B0aW9uc1Jlc29sdmVyO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplT3B0aW9uc1Jlc29sdmVyKCk6IHZvaWQge1xuICAgIHRoaXMucmVzb2x2ZXJSZWdpc3RyeS5pbml0aWFsaXplKHRoaXMuY29uZmlnPy5vcHRpb25zUmVzb2x2ZXJOYW1lKTtcbiAgICB0aGlzLl9vcHRpb25zUmVzb2x2ZXIgPSB0aGlzLnJlc29sdmVyUmVnaXN0cnkuZmluZFJlc29sdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNVbml0cykge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlLnZhbHVlKTtcbiAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuX3ZhbHVlLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRPcE1vZGVTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHwgdm9pZCB7XG4gICAgaWYgKCF0aGlzLmV2ZW50QnJva2VyU2VydmljZSkgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHRoaXMuZXZlbnRCcm9rZXJTZXJ2aWNlLmNvbnN1bWU8eyBpc1ZpZXdvbmx5OiBib29sZWFuIH0+KCdvcGVyYXRpb25fbW9kZV9jaGFuZ2VkJykuc3Vic2NyaWJlKHRvcGljID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcudmlld29ubHkgPT09ICdib29sZWFuJykgcmV0dXJuO1xuXG4gICAgICB0aGlzLnZpZXdvbmx5ID0gZ2V0Vmlld29ubHkodGhpcy5jb25maWcsIHRvcGljLnBheWxvYWQuaXNWaWV3b25seSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUluaXRpYWxDb250cm9sVmFsdWVJZk5lZWRlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kZWxWYWx1ZSA9ICh0aGlzLmNvbnRyb2wgYXMgYW55KS52YWx1ZTtcbiAgICBjb25zdCBub3JtYWxpemVkID0gZ2V0VmFsdWVXaXRoVW5pdChtb2RlbFZhbHVlLCB0aGlzLmNvbmZpZyk7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5oYXNVbml0cyA/IG5vcm1hbGl6ZWQgOiBub3JtYWxpemVkLnZhbHVlO1xuXG4gICAgaWYgKCFpc0VxdWFsKG1vZGVsVmFsdWUsIHRhcmdldCkpICh0aGlzLmNvbnRyb2wgYXMgYW55KS5zZXRWYWx1ZSh0YXJnZXQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIHRoaXMuX3ZhbHVlID0gbm9ybWFsaXplZDtcbiAgfVxufVxuIiwiPHFkLWZvcm0tbGFiZWxcbiAgW2xhYmVsXT1cImxhYmVsXCJcbiAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgW3ZpZXdvbmx5XT1cInZpZXdvbmx5XCJcbiAgW2NvbnRyb2xdPVwiY29udHJvbFwiXG4gIFt0b29sdGlwXT1cImNvbmZpZz8udG9vbHRpcFwiXG4gIFtkYXRhLXRlc3QtaWRdPVwidGVzdElkXCJcbj48L3FkLWZvcm0tbGFiZWw+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgIXZpZXdvbmx5ICYmICFoYXNPcHRpb25zXCI+XG4gIDxkaXYgY2xhc3M9XCJxZC1pbnB1dC1pbnB1dFwiIChrZXlkb3duLmVudGVyKT1cImVtaXRFbnRlckNsaWNrKClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRCb3hcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHNwYW4gY2xhc3M9XCJxZC1pbnB1dC1jaGFyYWN0ZXItY291bnRlclwiICpuZ0lmPVwiaGFzTWF4TGVuZ3RoXCI+e3sgbnVtYmVyT2ZDaGFyYWN0ZXJzIH19IC8ge3sgbWF4TGVuZ3RoIH19PC9zcGFuPlxuXG4gIDxxZC1mb3JtLWhpbnRcbiAgICBbaGludF09XCJoaW50XCJcbiAgICBbY29udHJvbF09XCJjb250cm9sXCJcbiAgICBbaGFzRXJyb3JdPVwiaGFzRXJyb3JcIlxuICAgIFtoaW50QWN0aW9uXT1cImhpbnRBY3Rpb25cIlxuICAgIFtkYXRhLXRlc3QtaWRdPVwidGVzdElkXCJcbiAgPjwvcWQtZm9ybS1oaW50PlxuPC9uZy1jb250YWluZXI+XG5cbjxkaXYgKm5nSWY9XCIhcmVhZG9ubHkgJiYgIXZpZXdvbmx5ICYmIGhhc09wdGlvbnNcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwicWQtaW5wdXQtaW5wdXRcIlxuICAgIHFkSW5wdXRPcHRpb25zXG4gICAgW3FkUG9wb3Zlck1pbldpZHRoXT1cIjIwMFwiXG4gICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgIFt2YWx1ZV09XCJfdmFsdWUudmFsdWVcIlxuICAgIChvcHRpb25TZWxlY3RlZCk9XCJoYW5kbGVPcHRpb25TZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAoZW50ZXJDbGljayk9XCJlbWl0RW50ZXJDbGljaygpXCJcbiAgPlxuICAgIDwhLS0gaGFuZGxlIChlbnRlckNsaWNrKSBieSBvcHRpb25zIGRpcmVjdGl2ZSBoZXJlIGJlY2F1c2UgZXZlbnQgaGFzIHRvIGJlIGZpcmVkIGFmdGVyIHNlbGVjdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRCb3hcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHNwYW4gY2xhc3M9XCJxZC1pbnB1dC1jaGFyYWN0ZXItY291bnRlclwiICpuZ0lmPVwiaGFzTWF4TGVuZ3RoXCI+e3sgbnVtYmVyT2ZDaGFyYWN0ZXJzIH19IC8ge3sgbWF4TGVuZ3RoIH19PC9zcGFuPlxuXG4gIDxxZC1mb3JtLWhpbnRcbiAgICBbaGludF09XCJoaW50XCJcbiAgICBbY29udHJvbF09XCJjb250cm9sXCJcbiAgICBbaGFzRXJyb3JdPVwiaGFzRXJyb3JcIlxuICAgIFtoaW50QWN0aW9uXT1cImhpbnRBY3Rpb25cIlxuICAgIFtkYXRhLXRlc3QtaWRdPVwidGVzdElkXCJcbiAgPjwvcWQtZm9ybS1oaW50PlxuPC9kaXY+XG5cbjxxZC1mb3JtLXJlYWRvbmx5XG4gICpuZ0lmPVwicmVhZG9ubHlcIlxuICBbdmFsdWVzXT1cInZhbHVlQXNMaXN0XCJcbiAgW3JlYWRvbmx5QWN0aW9uXT1cInJlYWRvbmx5QWN0aW9uXCJcbiAgW2RhdGEtdGVzdC1pZF09XCJ0ZXN0SWRcIlxuPjwvcWQtZm9ybS1yZWFkb25seT5cblxuPHFkLWZvcm0tdmlld29ubHlcbiAgKm5nSWY9XCJ2aWV3b25seVwiXG4gIFt2YWx1ZXNdPVwidmFsdWVBc0xpc3RcIlxuICBbdmlld29ubHlBY3Rpb25dPVwidmlld29ubHlBY3Rpb25cIlxuICBbZGF0YS10ZXN0LWlkXT1cInRlc3RJZFwiXG4+PC9xZC1mb3JtLXZpZXdvbmx5PlxuXG48bmctdGVtcGxhdGUgI2lucHV0Qm94PlxuICA8aW5wdXRcbiAgICAjaW5wdXRcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgIFt2YWx1ZV09XCJoYXNPcHRpb25zID8gKF92YWx1ZS52YWx1ZS50b1N0cmluZygpIHwgdHJhbnNsYXRlKSA6IF92YWx1ZS52YWx1ZVwiXG4gICAgKGlucHV0KT1cImhhbmRsZUlucHV0KCRldmVudClcIlxuICAgIChmb2N1cyk9XCJoYW5kbGVJbnB1dEZvY3VzKClcIlxuICAgIChibHVyKT1cImhhbmRsZUlucHV0Qmx1cigpXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgIFt0eXBlXT1cImlucHV0VHlwZVwiXG4gICAgW2F0dHIuaW5wdXRtb2RlXT1cImlucHV0TW9kZVwiXG4gICAgW3FkQXV0b2ZvY3VzXT1cImhhc0F1dG9mb2N1c1wiXG4gICAgW2F0dHIuZGF0YS10ZXN0LWlkXT1cInRlc3RJZCArICctaW5wdXQnXCJcbiAgICBbc3RlcF09XCJjb25maWc/LnN0ZXBcIlxuICAgIHJlcXVpcmVkXG4gIC8+XG4gIDxkaXYgY2xhc3M9XCJxZC1pbnB1dC1zdWZmaXhcIj5cbiAgICA8cWQtaWNvbiAqbmdJZj1cImhhc0Vycm9yICYmICFoYXNPbmx5VW5pdHNFcnJvclwiIGNsYXNzPVwicWQtaW5wdXQtZXJyb3ItaWNvblwiIGljb249XCJleGNsYW1hdGlvbkNpcmNsZVNvbGlkXCI+PC9xZC1pY29uPlxuICAgIDxxZC1pY29uICpuZ0lmPVwiY2xlYXJhYmxlXCIgY2xhc3M9XCJxZC1pbnB1dC1jbGVhcmFibGUtaWNvblwiIGljb249XCJ0aW1lc0xhcmdlXCIgKGNsaWNrKT1cImNsZWFySW5wdXQoKVwiPjwvcWQtaWNvbj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcWRJY29uQnV0dG9uXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG4gIDxxZC1pbnB1dC11bml0c1xuICAgICpuZ0lmPVwiaGFzVW5pdHNcIlxuICAgIFt1bml0XT1cIl92YWx1ZS51bml0XCJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgKHVuaXRDaGFuZ2UpPVwiaGFuZGxlVW5pdENoYW5nZSgkZXZlbnQpXCJcbiAgICAob3BlbmVkKT1cImhhbmRsZVVuaXRzT3BlbmVkKClcIlxuICAgIChjbG9zZWQpPVwiaGFuZGxlVW5pdHNDbG9zZWQoKVwiXG4gID48L3FkLWlucHV0LXVuaXRzPlxuICA8ZGl2IGNsYXNzPVwicWQtaW5wdXQtc3VmZml4XCIgKm5nSWY9XCJoYXNFcnJvciAmJiBoYXNPbmx5VW5pdHNFcnJvclwiPlxuICAgIDxxZC1pY29uIGNsYXNzPVwicWQtaW5wdXQtZXJyb3ItaWNvblwiIGljb249XCJleGNsYW1hdGlvbkNpcmNsZVNvbGlkXCI+PC9xZC1pY29uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -12319,21 +12319,23 @@ class QdInputComponent {
12319
12319
  if (this.controlContainer) {
12320
12320
  if (this.formControlName) {
12321
12321
  this.control = this.controlContainer.control.get(this.formControlName);
12322
- // TODO remove logic for support of angular FormControl with angular 18 update
12323
- if (!(this.control instanceof QdFormControl)) {
12322
+ // TODO remove logic for support of angular FormControl with angular 20 update
12323
+ if (!(this.control instanceof QdFormControl))
12324
12324
  console.warn('QD-UI | QdInputComponent - Please use the QdFormControl instead of the Angular FormControl');
12325
- }
12326
12325
  }
12327
12326
  }
12328
12327
  this.writeValue(this.value || getValue(this.config));
12328
+ this.normalizeInitialControlValueIfNeeded();
12329
12329
  this._subs.add(this.actionEmitterService.hintEventEmitter$.subscribe(() => this.clickHint.emit()));
12330
12330
  this._subs.add(this.actionEmitterService.readonlyEventEmitter$.subscribe(() => this.clickReadonly.emit()));
12331
12331
  this._subs.add(this.actionEmitterService.viewonlyEventEmitter$.subscribe(() => this.clickViewonly.emit()));
12332
12332
  this._subs.add(this.initOpModeSubscription());
12333
12333
  }
12334
12334
  ngOnChanges(changes) {
12335
- if (changes['config'])
12335
+ if (changes['config']) {
12336
12336
  this.updateConfig();
12337
+ this.normalizeInitialControlValueIfNeeded();
12338
+ }
12337
12339
  if (changes['value'])
12338
12340
  this.writeValue(this.value);
12339
12341
  }
@@ -12342,18 +12344,15 @@ class QdInputComponent {
12342
12344
  }
12343
12345
  registerOnChange(fn) {
12344
12346
  const fnString = fn.toString();
12345
- if (fnString.includes('_noControlError') || fnString.includes('validateControlPresenceOnChange')) {
12347
+ if (fnString.includes('_noControlError') || fnString.includes('validateControlPresenceOnChange'))
12346
12348
  return;
12347
- }
12348
12349
  this._onChange = fn;
12349
- fn(this.hasUnits ? this._value : this._value.value);
12350
12350
  }
12351
12351
  registerOnTouched(fn) {
12352
12352
  this._onTouch = fn;
12353
12353
  }
12354
12354
  writeValue(value) {
12355
12355
  this._value = getValueWithUnit(value, this.config);
12356
- this._onChange(this.hasUnits ? this._value : this._value.value);
12357
12356
  }
12358
12357
  setDisabledState(disabled) {
12359
12358
  this.disabled = disabled;
@@ -12453,6 +12452,16 @@ class QdInputComponent {
12453
12452
  this.viewonly = getViewonly(this.config, topic.payload.isViewonly);
12454
12453
  });
12455
12454
  }
12455
+ normalizeInitialControlValueIfNeeded() {
12456
+ if (!this.control)
12457
+ return;
12458
+ const modelValue = this.control.value;
12459
+ const normalized = getValueWithUnit(modelValue, this.config);
12460
+ const target = this.hasUnits ? normalized : normalized.value;
12461
+ if (!isEqual(modelValue, target))
12462
+ this.control.setValue(target, { emitEvent: false });
12463
+ this._value = normalized;
12464
+ }
12456
12465
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdInputComponent, deps: [{ token: QdFormsActionEmitterService }, { token: QdFormOptionsResolverRegistry }, { token: i1$4.ControlContainer, host: true, optional: true, skipSelf: true }, { token: QdEventBrokerService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
12457
12466
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: QdInputComponent, selector: "qd-input", inputs: { formControlName: "formControlName", value: "value", config: "config", isError: "isError", testId: ["data-test-id", "testId"] }, outputs: { valueChange: "valueChange", enterClick: "enterClick", clickClear: "clickClear", clickHint: "clickHint", clickReadonly: "clickReadonly", clickViewonly: "clickViewonly" }, host: { properties: { "class.qd-input-readonly": "this.readonly", "class.qd-input--readonly-action": "this.readonlyAction", "class.qd-input-viewonly": "this.viewonly", "class.qd-input--viewonly-action": "this.viewonlyAction", "class.qd-form-hint-action": "this.hintAction", "class.qd-input-hint-action": "this.hintAction", "class.qd-form-disabled": "this.disabled", "class.qd-input-disabled": "this.disabled", "class.qd-input-focus": "this.isInputFocused", "class.qd-form-error": "this.hasError", "class.qd-input-error": "this.hasError", "class.qd-input-error-from-outside": "this.isErrorFromOutside" } }, providers: [
12458
12467
  {