@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
150 lines • 20.3 kB
JavaScript
import { Component, ContentChild, Directive, ElementRef, EventEmitter, Input, Output, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
import { IonRange } from '@ionic/angular';
import { BehaviorSubject, NEVER } from 'rxjs';
import { shareReplay, switchMap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@ionic/angular";
import * as i3 from "@iotize/app-common";
export class MonitoringRangeContentDirective {
tpl;
constructor(tpl) {
this.tpl = tpl;
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringRangeContentDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
/** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: MonitoringRangeContentDirective, selector: "[monitoringRangeContent]", ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringRangeContentDirective, decorators: [{
type: Directive,
args: [{
selector: '[monitoringRangeContent]',
}]
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
export class MonitoringRangeComponent {
focusChange = new BehaviorSubject(false);
dualKnobs = false;
_valueSub;
currentValue = undefined;
previousValue = undefined;
rangeTemplate;
get rangeTemplateContext() {
return { $implicit: this };
}
range;
onValueChanged = new EventEmitter();
set inputStream(stream) {
this._valueSub?.unsubscribe();
if (stream) {
this._valueSub = this.focusChange
.pipe(switchMap((hasFocus) => {
if (hasFocus) {
return NEVER;
}
else {
return stream;
}
}), shareReplay(1))
.subscribe((v) => {
this.currentValue = v;
});
}
else {
this.currentValue = undefined;
}
}
min = 0;
max = 100;
_step = 1;
set step(step) {
if (step == 0) {
step = 1;
}
this._step = step;
}
debounce = 0;
pin = true;
disabled = false;
snaps = true;
ticks = true;
writeValueForEveryChange = false;
leftIcon;
leftIconColor;
rightIcon;
rightIconColor;
color;
el;
constructor() { }
ngOnDestroy() {
this._valueSub?.unsubscribe();
}
_onValueChanged(event) {
this.previousValue = this.currentValue;
this.currentValue = event.detail.value;
if (this.writeValueForEveryChange) {
this.onSliderReleased(event);
}
}
onSliderReleased($event) {
let currentValue = this.currentValue;
// Issue on mobile: onSliderReleased() may be called before _onValueChanged() event
// So we directly read the value from the range HTML element if available
if (typeof this.range?.value === 'number') {
currentValue = this.range.value;
}
if (this.previousValue !== currentValue) {
this.onValueChanged.emit(currentValue);
this.previousValue = currentValue;
}
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MonitoringRangeComponent, selector: "monitoring-range", inputs: { inputStream: "inputStream", min: "min", max: "max", step: "step", debounce: "debounce", pin: "pin", disabled: "disabled", snaps: "snaps", ticks: "ticks", writeValueForEveryChange: "writeValueForEveryChange", leftIcon: "leftIcon", leftIconColor: "leftIconColor", rightIcon: "rightIcon", rightIconColor: "rightIconColor", color: "color" }, outputs: { onValueChanged: "onValueChanged" }, queries: [{ propertyName: "rangeTemplate", first: true, predicate: MonitoringRangeContentDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "range", first: true, predicate: ["range"], descendants: true, static: true }, { propertyName: "el", first: true, predicate: [".range-knob"], descendants: true }], ngImport: i0, template: "<ion-range\n #range\n [value]=\"currentValue\"\n [class.disableRange]=\"disabled\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"_step\"\n [color]=\"color\"\n [snaps]=\"snaps\"\n [debounce]=\"debounce\"\n [pin]=\"pin\"\n [ticks]=\"ticks\"\n [dualKnobs]=\"dualKnobs\"\n [disabled]=\"disabled\"\n (ionChange)=\"_onValueChanged($event)\"\n (ionKnobMoveEnd)=\"onSliderReleased($event)\"\n [ngClass]=\"disabled ? 'rangeDisabled' : ''\"\n>\n <app-common-icon\n *ngIf=\"leftIcon\"\n slot=\"start\"\n [image]=\"leftIcon\"\n [color]=\"leftIconColor\"\n ></app-common-icon>\n <ng-container\n *ngTemplateOutlet=\"\n rangeTemplate || defaultRangeTemplate;\n context: rangeTemplateContext\n \"\n ></ng-container>\n <app-common-icon\n *ngIf=\"rightIcon\"\n slot=\"end\"\n [image]=\"rightIcon\"\n [color]=\"rightIconColor\"\n ></app-common-icon>\n</ion-range>\n\n<ng-template #defaultRangeTemplate>\n <ion-label slot=\"start\">{{ min }}</ion-label>\n <ion-label slot=\"end\">{{ max }}</ion-label>\n</ng-template>\n", styles: ["ion-range{padding-left:0;padding-right:0;min-width:150px}@media (prefers-color-scheme: dark){.rangeDisabled{--knob-size: 0px}}\n"], 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: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRange, selector: "ion-range", inputs: ["activeBarStart", "color", "debounce", "disabled", "dualKnobs", "label", "labelPlacement", "max", "min", "mode", "name", "pin", "pinFormatter", "snaps", "step", "ticks", "value"] }, { kind: "directive", type: i2.NumericValueAccessor, selector: "ion-input[type=number],ion-input-otp:not([type=text]),ion-range" }, { kind: "component", type: i3.IconComponent, selector: "app-common-icon", inputs: ["imageSize", "color", "image"] }], encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonitoringRangeComponent, decorators: [{
type: Component,
args: [{ selector: 'monitoring-range', encapsulation: ViewEncapsulation.None, template: "<ion-range\n #range\n [value]=\"currentValue\"\n [class.disableRange]=\"disabled\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"_step\"\n [color]=\"color\"\n [snaps]=\"snaps\"\n [debounce]=\"debounce\"\n [pin]=\"pin\"\n [ticks]=\"ticks\"\n [dualKnobs]=\"dualKnobs\"\n [disabled]=\"disabled\"\n (ionChange)=\"_onValueChanged($event)\"\n (ionKnobMoveEnd)=\"onSliderReleased($event)\"\n [ngClass]=\"disabled ? 'rangeDisabled' : ''\"\n>\n <app-common-icon\n *ngIf=\"leftIcon\"\n slot=\"start\"\n [image]=\"leftIcon\"\n [color]=\"leftIconColor\"\n ></app-common-icon>\n <ng-container\n *ngTemplateOutlet=\"\n rangeTemplate || defaultRangeTemplate;\n context: rangeTemplateContext\n \"\n ></ng-container>\n <app-common-icon\n *ngIf=\"rightIcon\"\n slot=\"end\"\n [image]=\"rightIcon\"\n [color]=\"rightIconColor\"\n ></app-common-icon>\n</ion-range>\n\n<ng-template #defaultRangeTemplate>\n <ion-label slot=\"start\">{{ min }}</ion-label>\n <ion-label slot=\"end\">{{ max }}</ion-label>\n</ng-template>\n", styles: ["ion-range{padding-left:0;padding-right:0;min-width:150px}@media (prefers-color-scheme: dark){.rangeDisabled{--knob-size: 0px}}\n"] }]
}], ctorParameters: () => [], propDecorators: { rangeTemplate: [{
type: ContentChild,
args: [MonitoringRangeContentDirective, {
read: TemplateRef,
static: true,
}]
}], range: [{
type: ViewChild,
args: ['range', { static: true }]
}], onValueChanged: [{
type: Output
}], inputStream: [{
type: Input
}], min: [{
type: Input
}], max: [{
type: Input
}], step: [{
type: Input
}], debounce: [{
type: Input
}], pin: [{
type: Input
}], disabled: [{
type: Input
}], snaps: [{
type: Input
}], ticks: [{
type: Input
}], writeValueForEveryChange: [{
type: Input
}], leftIcon: [{
type: Input
}], leftIconColor: [{
type: Input
}], rightIcon: [{
type: Input
}], rightIconColor: [{
type: Input
}], color: [{
type: Input
}], el: [{
type: ViewChild,
args: ['.range-knob']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvbW9uaXRvcmluZy1yYW5nZS9tb25pdG9yaW5nLXJhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9tb25pdG9yaW5nLXJhbmdlL21vbml0b3JpbmctcmFuZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBUXhELE1BQU0sT0FBTywrQkFBK0I7SUFDdkI7SUFBbkIsWUFBbUIsR0FBcUI7UUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7SUFBRyxDQUFDOzJIQURqQywrQkFBK0I7K0dBQS9CLCtCQUErQjs7NEZBQS9CLCtCQUErQjtrQkFIM0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMEJBQTBCO2lCQUNyQzs7QUFVRCxNQUFNLE9BQU8sd0JBQXdCO0lBQzVCLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNsRCxTQUFT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QUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQzsySEFsR1Usd0JBQXdCOytHQUF4Qix3QkFBd0IsOGVBUXJCLCtCQUErQiwyQkFDckMsV0FBVyw2T0N6Q3JCLHNpQ0EwQ0E7OzRGRFZhLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSxrQkFBa0IsaUJBR2IsaUJBQWlCLENBQUMsSUFBSTt3REFjckMsYUFBYTtzQkFKWixZQUFZO3VCQUFDLCtCQUErQixFQUFFO3dCQUM3QyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ2I7Z0JBT3FDLEtBQUs7c0JBQTFDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFMUIsY0FBYztzQkFBdkIsTUFBTTtnQkFHSCxXQUFXO3NCQURkLEtBQUs7Z0JBdUJHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBSU8sSUFBSTtzQkFBaEIsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVvQixFQUFFO3NCQUEzQixTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW9uUmFuZ2UgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE5FVkVSLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4uLy4uL2RlYnVnJztcblxudHlwZSBDb2xvclR5cGUgPSBhbnk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttb25pdG9yaW5nUmFuZ2VDb250ZW50XScsXG59KVxuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdSYW5nZUNvbnRlbnREaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHBsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbW9uaXRvcmluZy1yYW5nZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb25pdG9yaW5nLXJhbmdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9uaXRvcmluZy1yYW5nZS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBNb25pdG9yaW5nUmFuZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwdWJsaWMgZm9jdXNDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGR1YWxLbm9icyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ZhbHVlU3ViPzogU3Vic2NyaXB0aW9uO1xuICBjdXJyZW50VmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwcmV2aW91c1ZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgQENvbnRlbnRDaGlsZChNb25pdG9yaW5nUmFuZ2VDb250ZW50RGlyZWN0aXZlLCB7XG4gICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgc3RhdGljOiB0cnVlLFxuICB9KVxuICByYW5nZVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBnZXQgcmFuZ2VUZW1wbGF0ZUNvbnRleHQoKTogb2JqZWN0IHtcbiAgICByZXR1cm4geyAkaW1wbGljaXQ6IHRoaXMgfTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3JhbmdlJywgeyBzdGF0aWM6IHRydWUgfSkgcmFuZ2U/OiBJb25SYW5nZTtcblxuICBAT3V0cHV0KCkgb25WYWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXRTdHJlYW0oc3RyZWFtOiBPYnNlcnZhYmxlPG51bWJlcj4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92YWx1ZVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAoc3RyZWFtKSB7XG4gICAgICB0aGlzLl92YWx1ZVN1YiA9IHRoaXMuZm9jdXNDaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChoYXNGb2N1cykgPT4ge1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB2O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgbWluID0gMDtcbiAgQElucHV0KCkgbWF4ID0gMTAwO1xuXG4gIF9zdGVwOiBudW1iZXIgPSAxO1xuXG4gIEBJbnB1dCgpIHNldCBzdGVwKHN0ZXA6IG51bWJlcikge1xuICAgIGlmIChzdGVwID09IDApIHtcbiAgICAgIHN0ZXAgPSAxO1xuICAgIH1cbiAgICB0aGlzLl9zdGVwID0gc3RlcDtcbiAgfVxuXG4gIEBJbnB1dCgpIGRlYm91bmNlID0gMDtcbiAgQElucHV0KCkgcGluID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgc25hcHMgPSB0cnVlO1xuICBASW5wdXQoKSB0aWNrcyA9IHRydWU7XG4gIEBJbnB1dCgpIHdyaXRlVmFsdWVGb3JFdmVyeUNoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxlZnRJY29uPzogc3RyaW5nO1xuICBASW5wdXQoKSBsZWZ0SWNvbkNvbG9yPzogc3RyaW5nO1xuICBASW5wdXQoKSByaWdodEljb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJpZ2h0SWNvbkNvbG9yPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGNvbG9yPzogQ29sb3JUeXBlO1xuXG4gIEBWaWV3Q2hpbGQoJy5yYW5nZS1rbm9iJykgZWwhOiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIF9vblZhbHVlQ2hhbmdlZChldmVudDogQ3VzdG9tRXZlbnQ8eyB2YWx1ZTogbnVtYmVyIH0+KSB7XG4gICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSBldmVudC5kZXRhaWwudmFsdWU7XG4gICAgaWYgKHRoaXMud3JpdGVWYWx1ZUZvckV2ZXJ5Q2hhbmdlKSB7XG4gICAgICB0aGlzLm9uU2xpZGVyUmVsZWFzZWQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2xpZGVyUmVsZWFzZWQoJGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGxldCBjdXJyZW50VmFsdWUgPSB0aGlzLmN1cnJlbnRWYWx1ZTtcbiAgICAvLyBJc3N1ZSBvbiBtb2JpbGU6IG9uU2xpZGVyUmVsZWFzZWQoKSBtYXkgYmUgY2FsbGVkIGJlZm9yZSBfb25WYWx1ZUNoYW5nZWQoKSBldmVudFxuICAgIC8vIFNvIHdlIGRpcmVjdGx5IHJlYWQgdGhlIHZhbHVlIGZyb20gdGhlIHJhbmdlIEhUTUwgZWxlbWVudCBpZiBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIHRoaXMucmFuZ2U/LnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5yYW5nZS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJldmlvdXNWYWx1ZSAhPT0gY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkLmVtaXQoY3VycmVudFZhbHVlKTtcbiAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbiIsIjxpb24tcmFuZ2VcbiAgI3JhbmdlXG4gIFt2YWx1ZV09XCJjdXJyZW50VmFsdWVcIlxuICBbY2xhc3MuZGlzYWJsZVJhbmdlXT1cImRpc2FibGVkXCJcbiAgW21pbl09XCJtaW5cIlxuICBbbWF4XT1cIm1heFwiXG4gIFtzdGVwXT1cIl9zdGVwXCJcbiAgW2NvbG9yXT1cImNvbG9yXCJcbiAgW3NuYXBzXT1cInNuYXBzXCJcbiAgW2RlYm91bmNlXT1cImRlYm91bmNlXCJcbiAgW3Bpbl09XCJwaW5cIlxuICBbdGlja3NdPVwidGlja3NcIlxuICBbZHVhbEtub2JzXT1cImR1YWxLbm9ic1wiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIChpb25DaGFuZ2UpPVwiX29uVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAoaW9uS25vYk1vdmVFbmQpPVwib25TbGlkZXJSZWxlYXNlZCgkZXZlbnQpXCJcbiAgW25nQ2xhc3NdPVwiZGlzYWJsZWQgPyAncmFuZ2VEaXNhYmxlZCcgOiAnJ1wiXG4+XG4gIDxhcHAtY29tbW9uLWljb25cbiAgICAqbmdJZj1cImxlZnRJY29uXCJcbiAgICBzbG90PVwic3RhcnRcIlxuICAgIFtpbWFnZV09XCJsZWZ0SWNvblwiXG4gICAgW2NvbG9yXT1cImxlZnRJY29uQ29sb3JcIlxuICA+PC9hcHAtY29tbW9uLWljb24+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgcmFuZ2VUZW1wbGF0ZSB8fCBkZWZhdWx0UmFuZ2VUZW1wbGF0ZTtcbiAgICAgIGNvbnRleHQ6IHJhbmdlVGVtcGxhdGVDb250ZXh0XG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuICA8YXBwLWNvbW1vbi1pY29uXG4gICAgKm5nSWY9XCJyaWdodEljb25cIlxuICAgIHNsb3Q9XCJlbmRcIlxuICAgIFtpbWFnZV09XCJyaWdodEljb25cIlxuICAgIFtjb2xvcl09XCJyaWdodEljb25Db2xvclwiXG4gID48L2FwcC1jb21tb24taWNvbj5cbjwvaW9uLXJhbmdlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRSYW5nZVRlbXBsYXRlPlxuICA8aW9uLWxhYmVsIHNsb3Q9XCJzdGFydFwiPnt7IG1pbiB9fTwvaW9uLWxhYmVsPlxuICA8aW9uLWxhYmVsIHNsb3Q9XCJlbmRcIj57eyBtYXggfX08L2lvbi1sYWJlbD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=