UNPKG

@ux-aspects/ux-aspects

Version:

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

114 lines 19.1 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"; const TOGGLESWITCH_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ToggleSwitchComponent), multi: true }; let uniqueToggleSwitchId = 0; export class ToggleSwitchComponent { constructor() { this._changeDetector = inject(ChangeDetectorRef); /** Provide a default unique id value for the toggle switch */ this._toggleSwitchId = `ux-toggleswitch-${++uniqueToggleSwitchId}`; /** Specify a unique id for the element. */ this.id = this._toggleSwitchId; /** Binding for the state of the switch; `true` for "on" and `false` for "off." */ this.value = false; /** Specify a tabindex. */ this.tabindex = 0; /** If set to `false` the switch will not be updated when clicking on it, can be used if something else is updating the state of the switch. */ this.clickable = true; /** If this value is set to `true` then the toggle switch will be disabled. */ this.disabled = false; /** Specify an aria label for the input element */ this.ariaLabel = ''; /** Specify an aria labelledby property for the input element */ 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() { if (!this.disabled && this.clickable) { 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(); } } writeValue(value) { this.value = !!value; this._changeDetector.markForCheck(); } registerOnChange(fn) { this.onChangeCallback = fn; } registerOnTouched(fn) { this.onTouchedCallback = fn; } 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: ToggleSwitchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ToggleSwitchComponent, selector: "ux-toggleswitch", inputs: { id: "id", name: "name", value: "value", tabindex: "tabindex", clickable: "clickable", disabled: "disabled", ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"], required: "required" }, outputs: { valueChange: "valueChange" }, providers: [TOGGLESWITCH_VALUE_ACCESSOR, { provide: FocusableItemToken, useExisting: ToggleSwitchComponent }], viewQueries: [{ propertyName: "_focusIndicator", first: true, predicate: FocusIndicatorDirective, descendants: true }], ngImport: i0, template: "<label [attr.for]=\"(id || _toggleSwitchId) + '-input'\"\n class=\"ux-toggleswitch\"\n [class.ux-toggleswitch-checked]=\"value\"\n [class.ux-toggleswitch-disabled]=\"disabled\"\n [class.ux-toggleswitch-focused]=\"_focused\">\n\n <input #input\n class=\"ux-toggleswitch-input\"\n uxFocusIndicator\n type=\"checkbox\"\n [id]=\"(id || _toggleSwitchId) + '-input'\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [attr.name]=\"name\"\n [tabindex]=\"tabindex\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-checked]=\"value\"\n (indicator)=\"_focused = $event\"\n (change)=\"toggle()\"\n (click)=\"$event.stopPropagation()\">\n\n <div class=\"ux-toggleswitch-container\">\n <div class=\"ux-toggleswitch-bg\"></div>\n <div class=\"ux-toggleswitch-nub\"></div>\n </div>\n\n <span class=\"ux-toggleswitch-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: ToggleSwitchComponent, decorators: [{ type: Component, args: [{ selector: 'ux-toggleswitch', providers: [TOGGLESWITCH_VALUE_ACCESSOR, { provide: FocusableItemToken, useExisting: ToggleSwitchComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<label [attr.for]=\"(id || _toggleSwitchId) + '-input'\"\n class=\"ux-toggleswitch\"\n [class.ux-toggleswitch-checked]=\"value\"\n [class.ux-toggleswitch-disabled]=\"disabled\"\n [class.ux-toggleswitch-focused]=\"_focused\">\n\n <input #input\n class=\"ux-toggleswitch-input\"\n uxFocusIndicator\n type=\"checkbox\"\n [id]=\"(id || _toggleSwitchId) + '-input'\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [attr.name]=\"name\"\n [tabindex]=\"tabindex\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-checked]=\"value\"\n (indicator)=\"_focused = $event\"\n (change)=\"toggle()\"\n (click)=\"$event.stopPropagation()\">\n\n <div class=\"ux-toggleswitch-container\">\n <div class=\"ux-toggleswitch-bg\"></div>\n <div class=\"ux-toggleswitch-nub\"></div>\n </div>\n\n <span class=\"ux-toggleswitch-label\">\n <ng-content></ng-content>\n </span>\n</label>\n" }] }], propDecorators: { id: [{ type: Input }], name: [{ type: Input }], value: [{ type: Input }], tabindex: [{ type: Input }], clickable: [{ type: Input }], disabled: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label'] }], ariaLabelledby: [{ type: Input, args: ['aria-labelledby'] }], required: [{ type: Input }], valueChange: [{ type: Output }], _focusIndicator: [{ type: ViewChild, args: [FocusIndicatorDirective] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlc3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RvZ2dsZXN3aXRjaC90b2dnbGVzd2l0Y2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdG9nZ2xlc3dpdGNoL3RvZ2dsZXN3aXRjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xKLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxTQUFTLENBQUM7OztBQUc3QyxNQUFNLDJCQUEyQixHQUFHO0lBQ2hDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztJQUNwRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRixJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQVc3QixNQUFNLE9BQU8scUJBQXFCO0lBVGxDO1FBVXFCLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFN0QsOERBQThEO1FBQzlELG9CQUFlLEdBQVcsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztRQUV0RSwyQ0FBMkM7UUFDbEMsT0FBRSxHQUFXLElBQUksQ0FBQyxlQUFlLENBQUM7UUFLM0Msa0ZBQWtGO1FBQ3pFLFVBQUssR0FBWSxLQUFLLENBQUM7UUFFaEMsMEJBQTBCO1FB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QUFDLGlCQUFpQjtnQkFHZixRQUFRO3NCQUFoQixLQUFLO2dCQUdJLFdBQVc7c0JBQXBCLE1BQU07Z0JBSVAsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzT3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgaW5qZWN0LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvY3VzSW5kaWNhdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5JztcbmltcG9ydCB7IEZvY3VzYWJsZUl0ZW1Ub2tlbiB9IGZyb20gJy4uL21lbnUnO1xuaW1wb3J0IHsgRm9jdXNhYmxlQ29udHJvbCB9IGZyb20gJy4uL21lbnUvaW50ZXJmYWNlcy9mb2N1c2FibGUtY29udHJvbC5pbnRlcmZhY2UnO1xuXG5jb25zdCBUT0dHTEVTV0lUQ0hfVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVG9nZ2xlU3dpdGNoQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxubGV0IHVuaXF1ZVRvZ2dsZVN3aXRjaElkID0gMDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1eC10b2dnbGVzd2l0Y2gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90b2dnbGVzd2l0Y2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1RPR0dMRVNXSVRDSF9WQUxVRV9BQ0NFU1NPUiwge1xuICAgICAgICBwcm92aWRlOiBGb2N1c2FibGVJdGVtVG9rZW4sXG4gICAgICAgIHVzZUV4aXN0aW5nOiBUb2dnbGVTd2l0Y2hDb21wb25lbnRcbiAgICB9XSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUb2dnbGVTd2l0Y2hDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9jdXNhYmxlQ29udHJvbCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gICAgLyoqIFByb3ZpZGUgYSBkZWZhdWx0IHVuaXF1ZSBpZCB2YWx1ZSBmb3IgdGhlIHRvZ2dsZSBzd2l0Y2ggKi9cbiAgICBfdG9nZ2xlU3dpdGNoSWQ6IHN0cmluZyA9IGB1eC10b2dnbGVzd2l0Y2gtJHsrK3VuaXF1ZVRvZ2dsZVN3aXRjaElkfWA7XG5cbiAgICAvKiogU3BlY2lmeSBhIHVuaXF1ZSBpZCBmb3IgdGhlIGVsZW1lbnQuICovXG4gICAgQElucHV0KCkgaWQ6IHN0cmluZyA9IHRoaXMuX3RvZ2dsZVN3aXRjaElkO1xuXG4gICAgLyoqIFNwZWNpZnkgYSBmb3JtIG5hbWUgZm9yIHRoZSBpbnB1dCBlbGVtZW50LiAqL1xuICAgIEBJbnB1dCgpIG5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgICAvKiogQmluZGluZyBmb3IgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2g7IGB0cnVlYCBmb3IgXCJvblwiIGFuZCBgZmFsc2VgIGZvciBcIm9mZi5cIiAqL1xuICAgIEBJbnB1dCgpIHZhbHVlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogU3BlY2lmeSBhIHRhYmluZGV4LiAqL1xuICAgIEBJbnB1dCgpIHRhYmluZGV4OiBudW1iZXIgPSAwO1xuXG4gICAgLyoqIElmIHNldCB0byBgZmFsc2VgIHRoZSBzd2l0Y2ggd2lsbCBub3QgYmUgdXBkYXRlZCB3aGVuIGNsaWNraW5nIG9uIGl0LCBjYW4gYmUgdXNlZCBpZiBzb21ldGhpbmcgZWxzZSBpcyB1cGRhdGluZyB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gKi9cbiAgICBASW5wdXQoKSBjbGlja2FibGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIElmIHRoaXMgdmFsdWUgaXMgc2V0IHRvIGB0cnVlYCB0aGVuIHRoZSB0b2dnbGUgc3dpdGNoIHdpbGwgYmUgZGlzYWJsZWQuICovXG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBTcGVjaWZ5IGFuIGFyaWEgbGFiZWwgZm9yIHRoZSBpbnB1dCBlbGVtZW50ICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBTcGVjaWZ5IGFuIGFyaWEgbGFiZWxsZWRieSBwcm9wZXJ0eSBmb3IgdGhlIGlucHV0IGVsZW1lbnQgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLyoqIFNwZWNpZmllZCBpZiB0aGlzIGlzIGEgcmVxdWlyZWQgaW5wdXQuICovXG4gICAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogRW1pdHMgd2hlbiBgdmFsdWVgIGhhcyBiZWVuIGNoYW5nZWQuICovXG4gICAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogR2V0IHRoZSBmb2N1cyBpbmRpY2F0b3IgdG8gc2V0IGZvY3VzICovXG4gICAgQFZpZXdDaGlsZChGb2N1c0luZGljYXRvckRpcmVjdGl2ZSlcbiAgICBfZm9jdXNJbmRpY2F0b3I/OiBGb2N1c0luZGljYXRvckRpcmVjdGl2ZTtcblxuICAgIC8qKiBEZXRlcm1pbmUgaWYgdGhlIHVuZGVybHlpbmcgaW5wdXQgY29tcG9uZW50IGhhcyBiZWVuIGZvY3VzZWQgd2l0aCB0aGUga2V5Ym9hcmQgKi9cbiAgICBfZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mb3JtIEFuZ3VsYXIgZm9ybXMgdGhhdCB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHRvdWNoZWQgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgICAvKiogVXNlZCB0byBpbmZvcm0gQW5ndWxhciBmb3JtcyB0aGF0IHRoZSBjb21wb25lbnQgdmFsdWUgaGFzIGNoYW5nZWQgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgb25DaGFuZ2VDYWxsYmFjazogKF86IHVua25vd24pID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgICB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmNsaWNrYWJsZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICF0aGlzLnZhbHVlO1xuXG4gICAgICAgICAgICAvLyBlbWl0IHRoZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHZhbHVlIGlmIHVzZWQgd2l0aGluIGEgZm9ybSBjb250cm9sXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodGhpcy52YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIG1hcmsgdGhlIGNvbXBvbmVudCBhcyB0b3VjaGVkXG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSAhIXZhbHVlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAgXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAgXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEZvY3VzIHRoZSBpbnB1dCBlbGVtZW50ICovXG4gICAgZm9jdXMob3JpZ2luOiBGb2N1c09yaWdpbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c0luZGljYXRvci5mb2N1cyhvcmlnaW4pO1xuICAgIH1cblxuICAgIHNldElucHV0VGFiSW5kZXgodGFiaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnRhYmluZGV4ID0gdGFiaW5kZXg7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbn1cbiIsIjxsYWJlbCBbYXR0ci5mb3JdPVwiKGlkIHx8IF90b2dnbGVTd2l0Y2hJZCkgKyAnLWlucHV0J1wiXG4gICAgICAgY2xhc3M9XCJ1eC10b2dnbGVzd2l0Y2hcIlxuICAgICAgIFtjbGFzcy51eC10b2dnbGVzd2l0Y2gtY2hlY2tlZF09XCJ2YWx1ZVwiXG4gICAgICAgW2NsYXNzLnV4LXRvZ2dsZXN3aXRjaC1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgW2NsYXNzLnV4LXRvZ2dsZXN3aXRjaC1mb2N1c2VkXT1cIl9mb2N1c2VkXCI+XG5cbiAgICA8aW5wdXQgI2lucHV0XG4gICAgICAgICAgIGNsYXNzPVwidXgtdG9nZ2xlc3dpdGNoLWlucHV0XCJcbiAgICAgICAgICAgdXhGb2N1c0luZGljYXRvclxuICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICBbaWRdPVwiKGlkIHx8IF90b2dnbGVTd2l0Y2hJZCkgKyAnLWlucHV0J1wiXG4gICAgICAgICAgIFtjaGVja2VkXT1cInZhbHVlXCJcbiAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgW2F0dHIubmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkYnlcIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwidmFsdWVcIlxuICAgICAgICAgICAoaW5kaWNhdG9yKT1cIl9mb2N1c2VkID0gJGV2ZW50XCJcbiAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGUoKVwiXG4gICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJ1eC10b2dnbGVzd2l0Y2gtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1eC10b2dnbGVzd2l0Y2gtYmdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInV4LXRvZ2dsZXN3aXRjaC1udWJcIj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxzcGFuIGNsYXNzPVwidXgtdG9nZ2xlc3dpdGNoLWxhYmVsXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L3NwYW4+XG48L2xhYmVsPlxuIl19