UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

139 lines 22.5 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, inject, Input, Output, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { FocusIndicatorDirective } from '../../directives/accessibility'; import { FocusableItemToken } from '../menu'; import * as i0 from "@angular/core"; import * as i1 from "../../directives/accessibility/focus-indicator/focus-indicator.directive"; export const CHECKBOX_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CheckboxComponent), multi: true }; let uniqueCheckboxId = 0; export class CheckboxComponent { constructor() { this._changeDetector = inject(ChangeDetectorRef); /** Provide a default unique id value for the checkbox */ this._checkboxId = `ux-checkbox-${++uniqueCheckboxId}`; /** Determines if the checkbox should be checked, unchecked or indeterminate. */ this.id = this._checkboxId; /** Determines if the checkbox should be checked, unchecked or indeterminate. */ this.value = false; /** Specifies the tabindex of the input. */ this.tabindex = 0; /** If set to `true` the checkbox will not toggle state when clicked. */ this.clickable = true; /** If set to `true` the checkbox will be displayed without a border and background. */ this.simplified = false; /** * If `value` is set to the indeterminate value specified using this attribute, it will neither * display the checkbox as checked or unchecked, and will instead show the indeterminate variation. */ this.indeterminateValue = -1; /** Specify if the checkbox should be disabled. */ this.disabled = false; /** Provide an aria label for the checkbox. */ this.ariaLabel = ''; /** Provide an aria-labelled by property for the checkbox. */ this.ariaLabelledby = null; /** Emits when `value` has been changed. */ this.valueChange = new EventEmitter(); /** Determine if the underlying input component has been focused with the keyboard */ this._focused = false; /** Used to inform Angular forms that the component has been touched */ // eslint-disable-next-line @typescript-eslint/no-empty-function this.onTouchedCallback = () => { }; /** Used to inform Angular forms that the component value has changed */ // eslint-disable-next-line @typescript-eslint/no-empty-function this.onChangeCallback = () => { }; } /** Toggle the current state of the checkbox */ toggle() { if (this.disabled || !this.clickable) { return; } if (this.value === this.indeterminateValue) { this.value = true; } else { // toggle the checked state this.value = !this.value; } // emit the value this.valueChange.emit(this.value); // update the value if used within a form control this.onChangeCallback(this.value); // mark the component as touched this.onTouchedCallback(); } // Functions required to update ngModel writeValue(value) { if (value !== this.value) { this.value = value; this._changeDetector.markForCheck(); } } /** Allow Angular forms for provide us with a callback for when the input value changes */ registerOnChange(fn) { this.onChangeCallback = fn; } /** Allow Angular forms for provide us with a callback for when the touched state changes */ registerOnTouched(fn) { this.onTouchedCallback = fn; } /** Allow Angular forms to disable the component */ setDisabledState(isDisabled) { this.disabled = isDisabled; this._changeDetector.markForCheck(); } /** Focus the input element */ focus(origin) { this._focusIndicator.focus(origin); } setInputTabIndex(tabindex) { this.tabindex = tabindex; this._changeDetector.markForCheck(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: CheckboxComponent, selector: "ux-checkbox", inputs: { id: "id", name: "name", value: "value", required: "required", tabindex: "tabindex", clickable: "clickable", simplified: "simplified", indeterminateValue: "indeterminateValue", disabled: "disabled", ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"] }, outputs: { valueChange: "valueChange" }, providers: [CHECKBOX_VALUE_ACCESSOR, { provide: FocusableItemToken, useExisting: CheckboxComponent }], viewQueries: [{ propertyName: "_focusIndicator", first: true, predicate: FocusIndicatorDirective, descendants: true }], ngImport: i0, template: "<label [attr.for]=\"(id || _checkboxId) + '-input'\"\n class=\"ux-checkbox\"\n [class.ux-checkbox-checked]=\"value === true\"\n [class.ux-checkbox-indeterminate]=\"value === indeterminateValue\"\n [class.ux-checkbox-simplified]=\"simplified\"\n [class.ux-checkbox-disabled]=\"disabled\"\n [class.ux-checkbox-focused]=\"_focused\">\n\n <div class=\"ux-checkbox-container\">\n\n <input #input\n type=\"checkbox\"\n uxFocusIndicator\n class=\"ux-checkbox-input\"\n [id]=\"(id || _checkboxId) + '-input'\"\n [required]=\"required\"\n [checked]=\"value\"\n [attr.value]=\"value\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n [tabindex]=\"tabindex\"\n [indeterminate]=\"value === indeterminateValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-checked]=\"value === indeterminateValue ? 'mixed' : value\"\n (indicator)=\"_focused = $event\"\n (change)=\"$event.stopPropagation()\"\n (click)=\"toggle()\">\n </div>\n\n <span class=\"ux-checkbox-label\">\n <ng-content></ng-content>\n </span>\n</label>\n", dependencies: [{ kind: "directive", type: i1.FocusIndicatorDirective, selector: "[uxFocusIndicator]", inputs: ["checkChildren", "mouseFocusIndicator", "touchFocusIndicator", "keyboardFocusIndicator", "programmaticFocusIndicator"], outputs: ["indicator"], exportAs: ["ux-focus-indicator"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CheckboxComponent, decorators: [{ type: Component, args: [{ selector: 'ux-checkbox', providers: [CHECKBOX_VALUE_ACCESSOR, { provide: FocusableItemToken, useExisting: CheckboxComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<label [attr.for]=\"(id || _checkboxId) + '-input'\"\n class=\"ux-checkbox\"\n [class.ux-checkbox-checked]=\"value === true\"\n [class.ux-checkbox-indeterminate]=\"value === indeterminateValue\"\n [class.ux-checkbox-simplified]=\"simplified\"\n [class.ux-checkbox-disabled]=\"disabled\"\n [class.ux-checkbox-focused]=\"_focused\">\n\n <div class=\"ux-checkbox-container\">\n\n <input #input\n type=\"checkbox\"\n uxFocusIndicator\n class=\"ux-checkbox-input\"\n [id]=\"(id || _checkboxId) + '-input'\"\n [required]=\"required\"\n [checked]=\"value\"\n [attr.value]=\"value\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n [tabindex]=\"tabindex\"\n [indeterminate]=\"value === indeterminateValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-checked]=\"value === indeterminateValue ? 'mixed' : value\"\n (indicator)=\"_focused = $event\"\n (change)=\"$event.stopPropagation()\"\n (click)=\"toggle()\">\n </div>\n\n <span class=\"ux-checkbox-label\">\n <ng-content></ng-content>\n </span>\n</label>\n" }] }], propDecorators: { id: [{ type: Input }], name: [{ type: Input }], value: [{ type: Input }], required: [{ type: Input }], tabindex: [{ type: Input }], clickable: [{ type: Input }], simplified: [{ type: Input }], indeterminateValue: [{ type: Input }], disabled: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label'] }], ariaLabelledby: [{ type: Input, args: ['aria-labelledby'] }], valueChange: [{ type: Output }], _focusIndicator: [{ type: ViewChild, args: [FocusIndicatorDirective] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQW9CLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEssT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7O0FBRzdDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFxQjtJQUNyRCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBRUYsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFXekIsTUFBTSxPQUFPLGlCQUFpQjtJQVQ5QjtRQVdxQixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTdELHlEQUF5RDtRQUN6RCxnQkFBVyxHQUFXLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBRTFELGdGQUFnRjtRQUN2RSxPQUFFLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUt2QyxnRkFBZ0Y7UUFDdkUsVUFBSyxHQUFnQixLQUFLLENBQUM7UUFLcEMsMkNBQTJDO1FBQ2xDLGFBQVEs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RkRWYSxpQkFBaUI7a0JBVDdCLFNBQVM7K0JBQ0ksYUFBYSxhQUVaLENBQUMsdUJBQXVCLEVBQUU7NEJBQ2pDLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsbUJBQW1CO3lCQUNqQyxDQUFDLG1CQUNlLHVCQUF1QixDQUFDLE1BQU07OEJBVXRDLEVBQUU7c0JBQVYsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR2UsU0FBUztzQkFBN0IsS0FBSzt1QkFBQyxZQUFZO2dCQUdPLGNBQWM7c0JBQXZDLEtBQUs7dUJBQUMsaUJBQWlCO2dCQUdkLFdBQVc7c0JBQXBCLE1BQU07Z0JBZVAsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzT3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgRXhpc3RpbmdQcm92aWRlciwgZm9yd2FyZFJlZiwgaW5qZWN0LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvY3VzSW5kaWNhdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5JztcbmltcG9ydCB7IEZvY3VzYWJsZUl0ZW1Ub2tlbiB9IGZyb20gJy4uL21lbnUnO1xuaW1wb3J0IHsgRm9jdXNhYmxlQ29udHJvbCB9IGZyb20gJy4uL21lbnUvaW50ZXJmYWNlcy9mb2N1c2FibGUtY29udHJvbC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tCT1hfVkFMVUVfQUNDRVNTT1I6IEV4aXN0aW5nUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2hlY2tib3hDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5sZXQgdW5pcXVlQ2hlY2tib3hJZCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXgtY2hlY2tib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbQ0hFQ0tCT1hfVkFMVUVfQUNDRVNTT1IsIHtcbiAgICAgICAgcHJvdmlkZTogRm9jdXNhYmxlSXRlbVRva2VuLFxuICAgICAgICB1c2VFeGlzdGluZzogQ2hlY2tib3hDb21wb25lbnRcbiAgICB9XSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDaGVja2JveENvbXBvbmVudDxUID0gbnVtYmVyPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb2N1c2FibGVDb250cm9sIHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgIC8qKiBQcm92aWRlIGEgZGVmYXVsdCB1bmlxdWUgaWQgdmFsdWUgZm9yIHRoZSBjaGVja2JveCAqL1xuICAgIF9jaGVja2JveElkOiBzdHJpbmcgPSBgdXgtY2hlY2tib3gtJHsrK3VuaXF1ZUNoZWNrYm94SWR9YDtcblxuICAgIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBjaGVja2JveCBzaG91bGQgYmUgY2hlY2tlZCwgdW5jaGVja2VkIG9yIGluZGV0ZXJtaW5hdGUuICovXG4gICAgQElucHV0KCkgaWQ6IHN0cmluZyA9IHRoaXMuX2NoZWNrYm94SWQ7XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBmb3JtIG5hbWUgb2YgdGhlIGVsZW1lbnQuICovXG4gICAgQElucHV0KCkgbmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAgIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBjaGVja2JveCBzaG91bGQgYmUgY2hlY2tlZCwgdW5jaGVja2VkIG9yIGluZGV0ZXJtaW5hdGUuICovXG4gICAgQElucHV0KCkgdmFsdWU6IGJvb2xlYW4gfCBUID0gZmFsc2U7XG5cbiAgICAvKiogU3BlY2lmaWVkIGlmIHRoaXMgaXMgYSByZXF1aXJlZCBpbnB1dC4gKi9cbiAgICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIHRhYmluZGV4IG9mIHRoZSBpbnB1dC4gKi9cbiAgICBASW5wdXQoKSB0YWJpbmRleDogbnVtYmVyID0gMDtcblxuICAgIC8qKiBJZiBzZXQgdG8gYHRydWVgIHRoZSBjaGVja2JveCB3aWxsIG5vdCB0b2dnbGUgc3RhdGUgd2hlbiBjbGlja2VkLiAqL1xuICAgIEBJbnB1dCgpIGNsaWNrYWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogSWYgc2V0IHRvIGB0cnVlYCB0aGUgY2hlY2tib3ggd2lsbCBiZSBkaXNwbGF5ZWQgd2l0aG91dCBhIGJvcmRlciBhbmQgYmFja2dyb3VuZC4gKi9cbiAgICBASW5wdXQoKSBzaW1wbGlmaWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBJZiBgdmFsdWVgIGlzIHNldCB0byB0aGUgaW5kZXRlcm1pbmF0ZSB2YWx1ZSBzcGVjaWZpZWQgdXNpbmcgdGhpcyBhdHRyaWJ1dGUsIGl0IHdpbGwgbmVpdGhlclxuICAgICAqIGRpc3BsYXkgdGhlIGNoZWNrYm94IGFzIGNoZWNrZWQgb3IgdW5jaGVja2VkLCBhbmQgd2lsbCBpbnN0ZWFkIHNob3cgdGhlIGluZGV0ZXJtaW5hdGUgdmFyaWF0aW9uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGluZGV0ZXJtaW5hdGVWYWx1ZTogVCB8IG51bWJlciA9IC0xO1xuXG4gICAgLyoqIFNwZWNpZnkgaWYgdGhlIGNoZWNrYm94IHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFByb3ZpZGUgYW4gYXJpYSBsYWJlbCBmb3IgdGhlIGNoZWNrYm94LiAqL1xuICAgIEBJbnB1dCgnYXJpYS1sYWJlbCcpIGFyaWFMYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgICAvKiogUHJvdmlkZSBhbiBhcmlhLWxhYmVsbGVkIGJ5IHByb3BlcnR5IGZvciB0aGUgY2hlY2tib3guICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsbGVkYnknKSBhcmlhTGFiZWxsZWRieTogc3RyaW5nID0gbnVsbDtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGB2YWx1ZWAgaGFzIGJlZW4gY2hhbmdlZC4gKi9cbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4gfCBUPigpO1xuXG4gICAgLyoqIERldGVybWluZSBpZiB0aGUgdW5kZXJseWluZyBpbnB1dCBjb21wb25lbnQgaGFzIGJlZW4gZm9jdXNlZCB3aXRoIHRoZSBrZXlib2FyZCAqL1xuICAgIF9mb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVXNlZCB0byBpbmZvcm0gQW5ndWxhciBmb3JtcyB0aGF0IHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZCAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICAgIC8qKiBVc2VkIHRvIGluZm9ybSBBbmd1bGFyIGZvcm1zIHRoYXQgdGhlIGNvbXBvbmVudCB2YWx1ZSBoYXMgY2hhbmdlZCAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYm9vbGVhbiB8IFQpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgICAvKiogR2V0IHRoZSBmb2N1cyBpbmRpY2F0b3IgdG8gc2V0IGZvY3VzICovXG4gICAgQFZpZXdDaGlsZChGb2N1c0luZGljYXRvckRpcmVjdGl2ZSlcbiAgICBfZm9jdXNJbmRpY2F0b3I/OiBGb2N1c0luZGljYXRvckRpcmVjdGl2ZTtcblxuICAgIC8qKiBUb2dnbGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNoZWNrYm94ICovXG4gICAgdG9nZ2xlKCk6IHZvaWQge1xuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmNsaWNrYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IHRoaXMuaW5kZXRlcm1pbmF0ZVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRvZ2dsZSB0aGUgY2hlY2tlZCBzdGF0ZVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICF0aGlzLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW1pdCB0aGUgdmFsdWVcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgdmFsdWUgaWYgdXNlZCB3aXRoaW4gYSBmb3JtIGNvbnRyb2xcbiAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMudmFsdWUpO1xuXG4gICAgICAgIC8vIG1hcmsgdGhlIGNvbXBvbmVudCBhcyB0b3VjaGVkXG4gICAgICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvLyBGdW5jdGlvbnMgcmVxdWlyZWQgdG8gdXBkYXRlIG5nTW9kZWxcbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBib29sZWFuIHwgVCk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEFsbG93IEFuZ3VsYXIgZm9ybXMgZm9yIHByb3ZpZGUgdXMgd2l0aCBhIGNhbGxiYWNrIGZvciB3aGVuIHRoZSBpbnB1dCB2YWx1ZSBjaGFuZ2VzICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGJvb2xlYW4gfCBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBBbGxvdyBBbmd1bGFyIGZvcm1zIGZvciBwcm92aWRlIHVzIHdpdGggYSBjYWxsYmFjayBmb3Igd2hlbiB0aGUgdG91Y2hlZCBzdGF0ZSBjaGFuZ2VzICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBBbGxvdyBBbmd1bGFyIGZvcm1zIHRvIGRpc2FibGUgdGhlIGNvbXBvbmVudCAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEZvY3VzIHRoZSBpbnB1dCBlbGVtZW50ICovXG4gICAgZm9jdXMob3JpZ2luOiBGb2N1c09yaWdpbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c0luZGljYXRvci5mb2N1cyhvcmlnaW4pO1xuICAgIH1cblxuICAgIHNldElucHV0VGFiSW5kZXgodGFiaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnRhYmluZGV4ID0gdGFiaW5kZXg7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbn1cbiIsIjxsYWJlbCBbYXR0ci5mb3JdPVwiKGlkIHx8IF9jaGVja2JveElkKSArICctaW5wdXQnXCJcbiAgICAgICBjbGFzcz1cInV4LWNoZWNrYm94XCJcbiAgICAgICBbY2xhc3MudXgtY2hlY2tib3gtY2hlY2tlZF09XCJ2YWx1ZSA9PT0gdHJ1ZVwiXG4gICAgICAgW2NsYXNzLnV4LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVdPVwidmFsdWUgPT09IGluZGV0ZXJtaW5hdGVWYWx1ZVwiXG4gICAgICAgW2NsYXNzLnV4LWNoZWNrYm94LXNpbXBsaWZpZWRdPVwic2ltcGxpZmllZFwiXG4gICAgICAgW2NsYXNzLnV4LWNoZWNrYm94LWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICBbY2xhc3MudXgtY2hlY2tib3gtZm9jdXNlZF09XCJfZm9jdXNlZFwiPlxuXG4gICAgPGRpdiBjbGFzcz1cInV4LWNoZWNrYm94LWNvbnRhaW5lclwiPlxuXG4gICAgICAgIDxpbnB1dCAjaW5wdXRcbiAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICB1eEZvY3VzSW5kaWNhdG9yXG4gICAgICAgICAgICAgICBjbGFzcz1cInV4LWNoZWNrYm94LWlucHV0XCJcbiAgICAgICAgICAgICAgIFtpZF09XCIoaWQgfHwgX2NoZWNrYm94SWQpICsgJy1pbnB1dCdcIlxuICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgIFthdHRyLnZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInZhbHVlID09PSBpbmRldGVybWluYXRlVmFsdWVcIlxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5XCJcbiAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJ2YWx1ZSA9PT0gaW5kZXRlcm1pbmF0ZVZhbHVlID8gJ21peGVkJyA6IHZhbHVlXCJcbiAgICAgICAgICAgICAgIChpbmRpY2F0b3IpPVwiX2ZvY3VzZWQgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCI+XG4gICAgPC9kaXY+XG5cbiAgICA8c3BhbiBjbGFzcz1cInV4LWNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L3NwYW4+XG48L2xhYmVsPlxuIl19