UNPKG

ngx-custom-numeric-range-form-field

Version:
194 lines 27.2 kB
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output, Self, SkipSelf } from '@angular/core'; import { ErrorStateMatcher } from '@angular/material/core'; import { MatFormFieldControl } from '@angular/material/form-field'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { NumericRangeStateMatcher } from '../form/numeric-range-state-matcher'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "../form/numeric-range-form.service"; import * as i3 from "@angular/material/input"; export class NumericRangeFormFieldControlComponent { constructor(ngControl, formService) { this.ngControl = ngControl; this.formService = formService; this.readonly = false; this.minReadonly = false; this.maxReadonly = false; this.minimumControlName = 'minimum'; this.maximumControlName = 'maximum'; this.updateOn = 'change'; this.blurred = new EventEmitter(); this.enterPressed = new EventEmitter(); this.numericRangeChanged = new EventEmitter(); this.userAriaDescribedBy = ''; this.id = `numeric-range-form-control-id-${NumericRangeFormFieldControlComponent.nextId++}`; this.formGroup = this.formService.formGroup; this.stateChanges = new Subject(); this.focused = false; this.controlType = 'numeric-range-form-control'; this.numericRangeErrorMatcher = new NumericRangeStateMatcher(); this.unsubscribe$ = new Subject(); this.onTouched = () => { }; this.ngControl.valueAccessor = this; } get value() { return this.formGroup.value; } set value(value) { this.formGroup.patchValue(value); this.stateChanges.next(); } get placeholder() { return this._placeholder; } set placeholder(value) { this._placeholder = value; this.stateChanges.next(); } get shouldLabelFloat() { return true; } get empty() { return !this.value[this.minimumControlName] && !this.value[this.maximumControlName]; } get errorState() { return this.numericRangeErrorMatcher.isErrorState(this.ngControl.control, this.formGroup, this.minimumControlName, this.maximumControlName); } get minimumControl() { return this.formService.minimumControl; } get maximumControl() { return this.formService.maximumControl; } ngOnInit() { this.formService.init(this.minimumControlName, this.maximumControlName, this.updateOn); this.formService.setSyncValidators(this.ngControl.control.validator); this.formService.setAsyncValidators(this.ngControl.control.asyncValidator); this.ngControl.control.setValidators([this.validate.bind(this)]); this.ngControl.control.updateValueAndValidity({ emitEvent: false }); } ngDoCheck() { this.formGroup.markAllAsTouched(); } ngOnDestroy() { this.stateChanges.complete(); this.unsubscribe$.next(); this.unsubscribe$.complete(); } writeValue(value) { value === null ? this.formGroup.reset() : this.formGroup.setValue(value, { emitEvent: false }); } registerOnChange(fn) { this.formGroup.valueChanges .pipe(takeUntil(this.unsubscribe$)) .subscribe(fn); } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; isDisabled ? this.formGroup.disable() : this.formGroup.enable(); this.stateChanges.next(); } setDescribedByIds(ids) { this.userAriaDescribedBy = ids.join(' '); } onContainerClick(event) { } validate(control) { return control.errors; } onEnterPressed() { if (!this.formGroup.errors && !this.minimumControl.errors && !this.maximumControl.errors) { this.enterPressed.emit(); } } onBlur() { this.onTouched(); this.blurred.emit(); } onRangeValuesChanged() { this.formGroup.errors || this.minimumControl.errors || this.maximumControl.errors ? this.numericRangeChanged.emit(null) : this.numericRangeChanged.emit(this.formGroup.value); } } NumericRangeFormFieldControlComponent.nextId = 0; NumericRangeFormFieldControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.5", ngImport: i0, type: NumericRangeFormFieldControlComponent, deps: [{ token: i1.NgControl, self: true }, { token: i2.NumericRangeFormService, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); NumericRangeFormFieldControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.5", type: NumericRangeFormFieldControlComponent, selector: "ngx-numeric-range-form-field-control", inputs: { value: "value", placeholder: "placeholder", minPlaceholder: "minPlaceholder", maxPlaceholder: "maxPlaceholder", readonly: "readonly", minReadonly: "minReadonly", maxReadonly: "maxReadonly", required: "required", disabled: "disabled", errorStateMatcher: "errorStateMatcher", autofilled: "autofilled", minimumControlName: "minimumControlName", maximumControlName: "maximumControlName", updateOn: "updateOn" }, outputs: { blurred: "blurred", enterPressed: "enterPressed", numericRangeChanged: "numericRangeChanged" }, host: { properties: { "class.floated": "this.shouldLabelFloat", "attr.aria-describedby": "this.userAriaDescribedBy", "id": "this.id" } }, providers: [ { provide: MatFormFieldControl, useExisting: NumericRangeFormFieldControlComponent }, { provide: ErrorStateMatcher, useClass: NumericRangeStateMatcher } ], ngImport: i0, template: "<input\r\n\t(blur)=\"onBlur()\"\r\n\t(input)=\"onRangeValuesChanged()\"\r\n\t(keyup.enter)=\"onEnterPressed()\"\r\n\t[readonly]=\"readonly || minReadonly\"\r\n\t[formControl]=\"minimumControl\"\r\n\tmatInput\r\n\t[placeholder]=\"minPlaceholder\"\r\n\ttype=\"number\"\r\n/>\r\n<span class=\"spacer\">&ndash;</span>\r\n<input\r\n\t(blur)=\"onBlur()\"\r\n\t(input)=\"onRangeValuesChanged()\"\r\n\t(keyup.enter)=\"onEnterPressed()\"\r\n\t[formControl]=\"maximumControl\"\r\n\t[readonly]=\"readonly || maxReadonly\"\r\n\tmatInput\r\n\t[placeholder]=\"maxPlaceholder\"\r\n\ttype=\"number\"\r\n/>\r\n", styles: [":host{display:flex;align-items:center}:host .spacer{padding:0 10px 0 0;cursor:context-menu}:host input::-webkit-outer-spin-button,:host input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}:host input:read-only{color:#00000080;cursor:initial}\n"], directives: [{ type: i3.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"] }, { type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.5", ngImport: i0, type: NumericRangeFormFieldControlComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-numeric-range-form-field-control', providers: [ { provide: MatFormFieldControl, useExisting: NumericRangeFormFieldControlComponent }, { provide: ErrorStateMatcher, useClass: NumericRangeStateMatcher } ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<input\r\n\t(blur)=\"onBlur()\"\r\n\t(input)=\"onRangeValuesChanged()\"\r\n\t(keyup.enter)=\"onEnterPressed()\"\r\n\t[readonly]=\"readonly || minReadonly\"\r\n\t[formControl]=\"minimumControl\"\r\n\tmatInput\r\n\t[placeholder]=\"minPlaceholder\"\r\n\ttype=\"number\"\r\n/>\r\n<span class=\"spacer\">&ndash;</span>\r\n<input\r\n\t(blur)=\"onBlur()\"\r\n\t(input)=\"onRangeValuesChanged()\"\r\n\t(keyup.enter)=\"onEnterPressed()\"\r\n\t[formControl]=\"maximumControl\"\r\n\t[readonly]=\"readonly || maxReadonly\"\r\n\tmatInput\r\n\t[placeholder]=\"maxPlaceholder\"\r\n\ttype=\"number\"\r\n/>\r\n", styles: [":host{display:flex;align-items:center}:host .spacer{padding:0 10px 0 0;cursor:context-menu}:host input::-webkit-outer-spin-button,:host input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}:host input:read-only{color:#00000080;cursor:initial}\n"] }] }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{ type: Self }] }, { type: i2.NumericRangeFormService, decorators: [{ type: SkipSelf }] }]; }, propDecorators: { value: [{ type: Input }], placeholder: [{ type: Input }], minPlaceholder: [{ type: Input }], maxPlaceholder: [{ type: Input }], readonly: [{ type: Input }], minReadonly: [{ type: Input }], maxReadonly: [{ type: Input }], required: [{ type: Input }], disabled: [{ type: Input }], errorStateMatcher: [{ type: Input }], autofilled: [{ type: Input }], minimumControlName: [{ type: Input }], maximumControlName: [{ type: Input }], updateOn: [{ type: Input }], blurred: [{ type: Output }], enterPressed: [{ type: Output }], numericRangeChanged: [{ type: Output }], shouldLabelFloat: [{ type: HostBinding, args: ['class.floated'] }], userAriaDescribedBy: [{ type: HostBinding, args: ['attr.aria-describedby'] }], id: [{ type: HostBinding }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW51bWVyaWMtcmFuZ2UtZm9ybS1maWVsZC9zcmMvbGliL2NvbnRyb2wvbnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW51bWVyaWMtcmFuZ2UtZm9ybS1maWVsZC9zcmMvbGliL2NvbnRyb2wvbnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBR0wsTUFBTSxFQUNOLElBQUksRUFDSixRQUFRLEVBQ1IsTUFBTSxlQUFlLENBQUM7QUFTdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7O0FBa0IvRSxNQUFNLE9BQU8scUNBQXFDO0lBNkZqRCxZQUNnQixTQUFvQixFQUNmLFdBQW9DO1FBRHpDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDZixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFqRWhELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFLcEIsdUJBQWtCLEdBQUcsU0FB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RSxpQkFBaUI7WUFDMUIsUUFBUSxFQUFFLHdCQUF3QjtTQUNsQztLQUNELDBCQ3pDRixtbEJBcUJBOzJGRHVCYSxxQ0FBcUM7a0JBaEJqRCxTQUFTOytCQUNDLHNDQUFzQyxhQUdyQzt3QkFDVjs0QkFDQyxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLHVDQUF1Qzt5QkFDbEQ7d0JBQ0Q7NEJBQ0MsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsUUFBUSxFQUFFLHdCQUF3Qjt5QkFDbEM7cUJBQ0QsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OzBCQWdHN0MsSUFBSTs7MEJBQ0osUUFBUTs0Q0FqRk4sS0FBSztzQkFEUixLQUFLO2dCQVVPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBS0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHSCxnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsZUFBZTtnQkFNNUIsbUJBQW1CO3NCQURsQixXQUFXO3VCQUFDLHVCQUF1QjtnQkFJcEMsRUFBRTtzQkFERCxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuXHRDb21wb25lbnQsXHJcblx0RG9DaGVjayxcclxuXHRFdmVudEVtaXR0ZXIsXHJcblx0SG9zdEJpbmRpbmcsXHJcblx0SW5wdXQsXHJcblx0T25EZXN0cm95LFxyXG5cdE9uSW5pdCxcclxuXHRPdXRwdXQsXHJcblx0U2VsZixcclxuXHRTa2lwU2VsZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG5cdEFic3RyYWN0Q29udHJvbCxcclxuXHRDb250cm9sVmFsdWVBY2Nlc3NvcixcclxuXHRGb3JtQ29udHJvbCxcclxuXHRGb3JtR3JvdXAsXHJcblx0TmdDb250cm9sLFxyXG5cdFZhbGlkYXRvclxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTnVtZXJpY1JhbmdlRm9ybVNlcnZpY2UgfSBmcm9tICcuLi9mb3JtL251bWVyaWMtcmFuZ2UtZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTnVtZXJpY1JhbmdlU3RhdGVNYXRjaGVyIH0gZnJvbSAnLi4vZm9ybS9udW1lcmljLXJhbmdlLXN0YXRlLW1hdGNoZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICduZ3gtbnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wnLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9udW1lcmljLXJhbmdlLWZvcm0tZmllbGQtY29udHJvbC5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vbnVtZXJpYy1yYW5nZS1mb3JtLWZpZWxkLWNvbnRyb2wuY29tcG9uZW50LnNjc3MnXSxcclxuXHRwcm92aWRlcnM6IFtcclxuXHRcdHtcclxuXHRcdFx0cHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCxcclxuXHRcdFx0dXNlRXhpc3Rpbmc6IE51bWVyaWNSYW5nZUZvcm1GaWVsZENvbnRyb2xDb21wb25lbnRcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHByb3ZpZGU6IEVycm9yU3RhdGVNYXRjaGVyLFxyXG5cdFx0XHR1c2VDbGFzczogTnVtZXJpY1JhbmdlU3RhdGVNYXRjaGVyXHJcblx0XHR9XHJcblx0XSxcclxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTnVtZXJpY1JhbmdlRm9ybUZpZWxkQ29udHJvbENvbXBvbmVudFxyXG5cdGltcGxlbWVudHNcclxuXHRcdE9uSW5pdCxcclxuXHRcdERvQ2hlY2ssXHJcblx0XHRPbkRlc3Ryb3ksXHJcblx0XHRNYXRGb3JtRmllbGRDb250cm9sPGFueT4sXHJcblx0XHRDb250cm9sVmFsdWVBY2Nlc3NvcixcclxuXHRcdFZhbGlkYXRvciB7XHJcblx0c3RhdGljIG5leHRJZCA9IDA7XHJcblxyXG5cdGdldCB2YWx1ZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcclxuXHR9XHJcblx0QElucHV0KClcclxuXHRzZXQgdmFsdWUodmFsdWU6IGFueSkge1xyXG5cdFx0dGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh2YWx1ZSk7XHJcblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0fVxyXG5cclxuXHRnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcclxuXHR9XHJcblxyXG5cdEBJbnB1dCgpIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xyXG5cdFx0dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG5cdH1cclxuXHJcblx0QElucHV0KCkgbWluUGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHRASW5wdXQoKSBtYXhQbGFjZWhvbGRlcjogc3RyaW5nO1xyXG5cdEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcblx0QElucHV0KCkgbWluUmVhZG9ubHkgPSBmYWxzZTtcclxuXHRASW5wdXQoKSBtYXhSZWFkb25seSA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuO1xyXG5cdEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG5cdEBJbnB1dCgpIGVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcjtcclxuXHRASW5wdXQoKSBhdXRvZmlsbGVkPzogYm9vbGVhbjtcclxuXHRASW5wdXQoKSBtaW5pbXVtQ29udHJvbE5hbWUgPSAnbWluaW11bSc7XHJcblx0QElucHV0KCkgbWF4aW11bUNvbnRyb2xOYW1lID0gJ21heGltdW0nO1xyXG5cdEBJbnB1dCgpIHVwZGF0ZU9uOiAnY2hhbmdlJyB8ICdibHVyJyB8ICdzdWJtaXQnID0gJ2NoYW5nZSc7XHJcblxyXG5cdEBPdXRwdXQoKSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cdEBPdXRwdXQoKSBlbnRlclByZXNzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblx0QE91dHB1dCgpIG51bWVyaWNSYW5nZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5mbG9hdGVkJylcclxuXHRnZXQgc2hvdWxkTGFiZWxGbG9hdCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcblx0QEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKVxyXG5cdHVzZXJBcmlhRGVzY3JpYmVkQnkgPSAnJztcclxuXHJcblx0QEhvc3RCaW5kaW5nKClcclxuXHRpZCA9IGBudW1lcmljLXJhbmdlLWZvcm0tY29udHJvbC1pZC0ke051bWVyaWNSYW5nZUZvcm1GaWVsZENvbnRyb2xDb21wb25lbnQubmV4dElkKyt9YDtcclxuXHJcblx0Z2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuICF0aGlzLnZhbHVlW3RoaXMubWluaW11bUNvbnRyb2xOYW1lXSAmJiAhdGhpcy52YWx1ZVt0aGlzLm1heGltdW1Db250cm9sTmFtZV07XHJcblx0fVxyXG5cclxuXHRnZXQgZXJyb3JTdGF0ZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLm51bWVyaWNSYW5nZUVycm9yTWF0Y2hlci5pc0Vycm9yU3RhdGUoXHJcblx0XHRcdHRoaXMubmdDb250cm9sLmNvbnRyb2wgYXMgRm9ybUNvbnRyb2wsXHJcblx0XHRcdHRoaXMuZm9ybUdyb3VwLFxyXG5cdFx0XHR0aGlzLm1pbmltdW1Db250cm9sTmFtZSxcclxuXHRcdFx0dGhpcy5tYXhpbXVtQ29udHJvbE5hbWVcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRnZXQgbWluaW11bUNvbnRyb2woKTogRm9ybUNvbnRyb2wge1xyXG5cdFx0cmV0dXJuIHRoaXMuZm9ybVNlcnZpY2UubWluaW11bUNvbnRyb2w7XHJcblx0fVxyXG5cclxuXHRnZXQgbWF4aW11bUNvbnRyb2woKTogRm9ybUNvbnRyb2wge1xyXG5cdFx0cmV0dXJuIHRoaXMuZm9ybVNlcnZpY2UubWF4aW11bUNvbnRyb2w7XHJcblx0fVxyXG5cclxuXHRmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IHRoaXMuZm9ybVNlcnZpY2UuZm9ybUdyb3VwO1xyXG5cclxuXHRzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuXHRmb2N1c2VkID0gZmFsc2U7XHJcblxyXG5cdGNvbnRyb2xUeXBlID0gJ251bWVyaWMtcmFuZ2UtZm9ybS1jb250cm9sJztcclxuXHJcblx0bnVtZXJpY1JhbmdlRXJyb3JNYXRjaGVyID0gbmV3IE51bWVyaWNSYW5nZVN0YXRlTWF0Y2hlcigpO1xyXG5cclxuXHRwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG5cdHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG5cdG9uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG5cdFx0QFNraXBTZWxmKCkgcHJpdmF0ZSBmb3JtU2VydmljZTogTnVtZXJpY1JhbmdlRm9ybVNlcnZpY2VcclxuXHQpIHtcclxuXHRcdHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmZvcm1TZXJ2aWNlLmluaXQoXHJcblx0XHRcdHRoaXMubWluaW11bUNvbnRyb2xOYW1lLFxyXG5cdFx0XHR0aGlzLm1heGltdW1Db250cm9sTmFtZSxcclxuXHRcdFx0dGhpcy51cGRhdGVPblxyXG5cdFx0KTtcclxuXHRcdHRoaXMuZm9ybVNlcnZpY2Uuc2V0U3luY1ZhbGlkYXRvcnModGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IpO1xyXG5cdFx0dGhpcy5mb3JtU2VydmljZS5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5uZ0NvbnRyb2wuY29udHJvbC5hc3luY1ZhbGlkYXRvcik7XHJcblxyXG5cdFx0dGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKFt0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyldKTtcclxuXHRcdHRoaXMubmdDb250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblx0fVxyXG5cclxuXHRuZ0RvQ2hlY2soKTogdm9pZCB7XHJcblx0XHR0aGlzLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XHJcblx0XHR0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XHJcblx0XHR0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xyXG5cdH1cclxuXHJcblx0d3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcblx0XHR2YWx1ZSA9PT0gbnVsbFxyXG5cdFx0XHQ/IHRoaXMuZm9ybUdyb3VwLnJlc2V0KClcclxuXHRcdFx0OiB0aGlzLmZvcm1Hcm91cC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cdH1cclxuXHJcblx0cmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcblx0XHR0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXNcclxuXHRcdFx0LnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcclxuXHRcdFx0LnN1YnNjcmliZShmbik7XHJcblx0fVxyXG5cclxuXHRyZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcblx0XHR0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG5cdH1cclxuXHJcblx0c2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG5cdFx0dGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcblx0XHRpc0Rpc2FibGVkID8gdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpIDogdGhpcy5mb3JtR3JvdXAuZW5hYmxlKCk7XHJcblxyXG5cdFx0dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG5cdH1cclxuXHJcblx0c2V0RGVzY3JpYmVkQnlJZHMoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG5cdFx0dGhpcy51c2VyQXJpYURlc2NyaWJlZEJ5ID0gaWRzLmpvaW4oJyAnKTtcclxuXHR9XHJcblxyXG5cdG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHt9XHJcblxyXG5cdHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkge1xyXG5cdFx0cmV0dXJuIGNvbnRyb2wuZXJyb3JzO1xyXG5cdH1cclxuXHJcblx0b25FbnRlclByZXNzZWQoKTogdm9pZCB7XHJcblx0XHRpZiAoXHJcblx0XHRcdCF0aGlzLmZvcm1Hcm91cC5lcnJvcnMgJiZcclxuXHRcdFx0IXRoaXMubWluaW11bUNvbnRyb2wuZXJyb3JzICYmXHJcblx0XHRcdCF0aGlzLm1heGltdW1Db250cm9sLmVycm9yc1xyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMuZW50ZXJQcmVzc2VkLmVtaXQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uQmx1cigpOiB2b2lkIHtcclxuXHRcdHRoaXMub25Ub3VjaGVkKCk7XHJcblx0XHR0aGlzLmJsdXJyZWQuZW1pdCgpO1xyXG5cdH1cclxuXHJcblx0b25SYW5nZVZhbHVlc0NoYW5nZWQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmZvcm1Hcm91cC5lcnJvcnMgfHxcclxuXHRcdHRoaXMubWluaW11bUNvbnRyb2wuZXJyb3JzIHx8XHJcblx0XHR0aGlzLm1heGltdW1Db250cm9sLmVycm9yc1xyXG5cdFx0XHQ/IHRoaXMubnVtZXJpY1JhbmdlQ2hhbmdlZC5lbWl0KG51bGwpXHJcblx0XHRcdDogdGhpcy5udW1lcmljUmFuZ2VDaGFuZ2VkLmVtaXQodGhpcy5mb3JtR3JvdXAudmFsdWUpO1xyXG5cdH1cclxufVxyXG4iLCI8aW5wdXRcclxuXHQoYmx1cik9XCJvbkJsdXIoKVwiXHJcblx0KGlucHV0KT1cIm9uUmFuZ2VWYWx1ZXNDaGFuZ2VkKClcIlxyXG5cdChrZXl1cC5lbnRlcik9XCJvbkVudGVyUHJlc3NlZCgpXCJcclxuXHRbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgbWluUmVhZG9ubHlcIlxyXG5cdFtmb3JtQ29udHJvbF09XCJtaW5pbXVtQ29udHJvbFwiXHJcblx0bWF0SW5wdXRcclxuXHRbcGxhY2Vob2xkZXJdPVwibWluUGxhY2Vob2xkZXJcIlxyXG5cdHR5cGU9XCJudW1iZXJcIlxyXG4vPlxyXG48c3BhbiBjbGFzcz1cInNwYWNlclwiPiZuZGFzaDs8L3NwYW4+XHJcbjxpbnB1dFxyXG5cdChibHVyKT1cIm9uQmx1cigpXCJcclxuXHQoaW5wdXQpPVwib25SYW5nZVZhbHVlc0NoYW5nZWQoKVwiXHJcblx0KGtleXVwLmVudGVyKT1cIm9uRW50ZXJQcmVzc2VkKClcIlxyXG5cdFtmb3JtQ29udHJvbF09XCJtYXhpbXVtQ29udHJvbFwiXHJcblx0W3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IG1heFJlYWRvbmx5XCJcclxuXHRtYXRJbnB1dFxyXG5cdFtwbGFjZWhvbGRlcl09XCJtYXhQbGFjZWhvbGRlclwiXHJcblx0dHlwZT1cIm51bWJlclwiXHJcbi8+XHJcbiJdfQ==