@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
186 lines • 19.1 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Hacks } from '@tangential/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/material/form-field";
import * as i4 from "@angular/material/input";
/**
* Provider Expression that allows this widget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_TEXT_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TextWidgetComponent),
multi: true
};
export class TextWidgetChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class TextWidgetComponent {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
// turn this into a class
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = '';
this.valueChange = new EventEmitter(false);
this.labelPosition = 'before';
this.disabled = false;
this.hideLabel = false;
this.onlyLabel = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultValue = '';
this.maxLength = 100;
this.minLength = 0;
/* end Configuration Fields */
this.change = new EventEmitter(false);
this.onTouched = () => { };
this.controlValueAccessorChangeFn = (value) => {
};
}
ngOnInit() {
Hacks.materialDesignPlaceholderText(this.changeDetectorRef);
}
ngOnChanges(changes) {
}
handleValueChange(value) {
if (!this.disabled) {
this.value = value;
this.valueChange.emit(this.value);
this.emitChangeEvent();
}
}
/**
* Boilerplate / required for Angular
*
*/
emitChangeEvent() {
this.controlValueAccessorChangeFn(this.value);
this.change.emit(new TextWidgetChange(this, this.value));
}
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.controlValueAccessorChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Sets the input's disabled state. Implemented as a part of ControlValueAccessor.
* @param isDisabled Whether the input should be disabled.
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
}
TextWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: TextWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
TextWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: TextWidgetComponent, selector: "tanj-text-widget", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", hideLabel: "hideLabel", onlyLabel: "onlyLabel", label: "label", defaultValue: "defaultValue", maxLength: "maxLength", minLength: "minLength" }, outputs: { valueChange: "valueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_TEXT_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- -->
<div flex class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="start center">
<span *ngIf="!hideLabel && labelPosition == 'before'" class="tanj-label tanj-before">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="center start">
<div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start">
<mat-form-field flex
class="tanj-text-input-field tanj-widget-input"
dividerColor="accent"
layout="row"
layout-align="start">
<input flex
matInput
class="tanj-input"
type="text"
minlength="{{minLength}}"
maxlength="{{maxLength}}"
[disabled]="disabled"
(change)="valueChange.emit(value)"
[(ngModel)]="value"/>
</mat-form-field>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: TextWidgetComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-text-widget',
template: `<!-- -->
<div flex class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="start center">
<span *ngIf="!hideLabel && labelPosition == 'before'" class="tanj-label tanj-before">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="center start">
<div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start">
<mat-form-field flex
class="tanj-text-input-field tanj-widget-input"
dividerColor="accent"
layout="row"
layout-align="start">
<input flex
matInput
class="tanj-input"
type="text"
minlength="{{minLength}}"
maxlength="{{maxLength}}"
[disabled]="disabled"
(change)="valueChange.emit(value)"
[(ngModel)]="value"/>
</mat-form-field>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span>
</div>
`,
providers: [TANJ_TEXT_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{
type: HostBinding,
args: ['attr.flex']
}], flexLayout: [{
type: HostBinding,
args: ['attr.layout']
}], flexLayoutAlign: [{
type: HostBinding,
args: ['attr.layout-align']
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], labelPosition: [{
type: Input
}], disabled: [{
type: Input
}], hideLabel: [{
type: Input
}], onlyLabel: [{
type: Input
}], label: [{
type: Input
}], defaultValue: [{
type: Input
}], maxLength: [{
type: Input
}], minLength: [{
type: Input
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC13aWRnZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9pbnB1dC13aWRnZXRzL3NyYy9saWIvdGV4dC13aWRnZXQvdGV4dC13aWRnZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFFTCxpQkFBaUIsRUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN2QixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sa0JBQWtCLENBQUE7Ozs7OztBQUd0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNENBQTRDLEdBQVE7SUFDL0QsT0FBTyxFQUFNLGlCQUFpQjtJQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xELEtBQUssRUFBUSxJQUFJO0NBQ2xCLENBQUM7QUFFRixNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQW1CLE1BQTJCLEVBQVMsS0FBYTtRQUFqRCxXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDcEUsQ0FBQztDQUNGO0FBcUNELE1BQU0sT0FBTyxtQkFBbUI7SUErQjlCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBN0J4RCx5QkFBeUI7UUFDQyxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUduRCxVQUFLLEdBQVcsRUFBRSxDQUFBO1FBQ2pCLGdCQUFXLEdBQXlCLElBQUksWUFBWSxD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QUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxVRV9BQ0NFU1NPUlxufSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7SGFja3N9IGZyb20gJ0B0YW5nZW50aWFsL2NvcmUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIHRoaXMgd2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9URVhUX1dJREdFVF9WSUVXX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUZXh0V2lkZ2V0Q29tcG9uZW50KSxcbiAgbXVsdGk6ICAgICAgIHRydWVcbn07XG5cbmV4cG9ydCBjbGFzcyBUZXh0V2lkZ2V0Q2hhbmdlIHtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBUZXh0V2lkZ2V0Q29tcG9uZW50LCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICAgICd0YW5qLXRleHQtd2lkZ2V0JyxcbiAgdGVtcGxhdGU6ICAgICAgYDwhLS0gLS0+XG4gIDxkaXYgZmxleCBjbGFzcz1cInRhbmotaW5wdXQtdGVtcGxhdGUgdGFuai1tb2RlLWVkaXRcIlxuICAgICAgIFtuZ0NsYXNzXT1cInsndGFuai1kaXNhYmxlZCc6IGRpc2FibGVkfVwiXG4gICAgICAgbGF5b3V0PVwicm93XCJcbiAgICAgICBsYXlvdXQtYWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICA8c3BhbiAqbmdJZj1cIiFoaWRlTGFiZWwgJiYgbGFiZWxQb3NpdGlvbiA9PSAnYmVmb3JlJ1wiIGNsYXNzPVwidGFuai1sYWJlbCB0YW5qLWJlZm9yZVwiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgICA8ZGl2IGZsZXggY2xhc3M9XCJ0YW5qLXdpZGdldC1pbnB1dFwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiPlxuICAgICAgPGRpdiBmbGV4ICpuZ0lmPVwiIW9ubHlMYWJlbFwiIGNsYXNzPVwidGFuai13aWRnZXQtaW5wdXRcIiBsYXlvdXQ9XCJyb3dcIiBsYXlvdXQtYWxpZ249XCJzdGFydFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFuai10ZXh0LWlucHV0LWZpZWxkIHRhbmotd2lkZ2V0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgICA8aW5wdXQgZmxleFxuICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgIG1pbmxlbmd0aD1cInt7bWluTGVuZ3RofX1cIlxuICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCJ7e21heExlbmd0aH19XCJcbiAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ2YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKVwiXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIi8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdiZWxvdydcIiBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1iZWxvd1wiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiAqbmdJZj1cIiFoaWRlTGFiZWwgJiYgbGFiZWxQb3NpdGlvbiA9PSAnYWZ0ZXInXCIgY2xhc3M9XCJ0YW5qLWxhYmVsIHRhbmotYWZ0ZXJcIj57e2xhYmVsfX08L3NwYW4+XG4gIDwvZGl2PlxuICAgICAgICAgICAgICAgICBgLFxuICBwcm92aWRlcnM6ICAgICBbVEFOSl9URVhUX1dJREdFVF9WSUVXX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFRleHRXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkluaXQge1xuXG4gIC8vIHR1cm4gdGhpcyBpbnRvIGEgY2xhc3NcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZsZXgnKSBmbGV4ID0gJyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQnKSBmbGV4TGF5b3V0ID0gJ2NvbHVtbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQtYWxpZ24nKSBmbGV4TGF5b3V0QWxpZ24gPSAnc3RhcnQnO1xuXG5cbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyA9ICcnXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdiZWxvdycgPSAnYmVmb3JlJ1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGhpZGVMYWJlbDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIG9ubHlMYWJlbDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gRmllbGRzXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJydcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSAnJ1xuICBASW5wdXQoKSBtYXhMZW5ndGg6IG51bWJlciA9IDEwMFxuICBASW5wdXQoKSBtaW5MZW5ndGg6IG51bWJlciA9IDBcbiAgLyogZW5kIENvbmZpZ3VyYXRpb24gRmllbGRzICovXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBjb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICh2YWx1ZSkgPT4ge1xuICB9O1xuXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgSGFja3MubWF0ZXJpYWxEZXNpZ25QbGFjZWhvbGRlclRleHQodGhpcy5jaGFuZ2VEZXRlY3RvclJlZilcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgfVxuXG4gIGhhbmRsZVZhbHVlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpXG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJvaWxlcnBsYXRlIC8gcmVxdWlyZWQgZm9yIEFuZ3VsYXJcbiAgICpcbiAgICovXG4gIHByaXZhdGUgZW1pdENoYW5nZUV2ZW50KCkge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBUZXh0V2lkZ2V0Q2hhbmdlKHRoaXMsIHRoaXMudmFsdWUpKVxuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGUuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiJdfQ==