@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
68 lines • 18.2 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output } from '@angular/core';
import { ControlContainer, ReactiveFormsModule } from '@angular/forms';
import { CoreModule, gettext } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
export class DateRangePickerComponent {
constructor() {
/**
* If set to true, the component will be reactive and will emit the updatedDate on every change.
* Otherwise, the component will use a non emitting variant of a template.
*/
this.isEmittingDateChange = false;
/**
* Determines the display of from and to date picker labels.
*/
this.showLabel = true;
this.updatedDate = new EventEmitter();
this.DATE_FROM = 'dateFrom';
this.DATE_TO = 'dateTo';
this.FROM_DATE = gettext('From`date`');
this.HAS_ERROR = 'has-error';
this.INVALID_DATE_TIME = 'invalidDateTime';
this.THIS_DATE_IS_INVALID = gettext('This date is invalid.');
this.THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE = gettext('This date is after the latest allowed date.');
this.THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE = gettext('This date is before the earliest allowed date.');
this.TO_DATE = gettext('To`date`');
this.parentContainer = inject(ControlContainer);
}
onDateFromChange(dateFrom) {
this.updatedDate.emit({
dateFrom
});
}
onDateToChange(dateTo) {
this.updatedDate.emit({
dateTo
});
}
get parentFormGroup() {
return this.parentContainer.control;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangePickerComponent, isStandalone: true, selector: "c8y-date-range-picker", inputs: { isEmittingDateChange: "isEmittingDateChange", showLabel: "showLabel" }, outputs: { updatedDate: "updatedDate" }, ngImport: i0, template: "<div class=\"d-flex gap-8 a-i-center flex-wrap\">\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"FROM_DATE | translate\"\n [for]=\"DATE_FROM\"\n >\n {{ FROM_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_FROM\"\n [maxDate]=\"parentFormGroup?.value.dateTo\"\n [placeholder]=\"FROM_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateFrom\"\n [ngClass]=\"parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateFromChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages\n class=\"text-nowrap\"\n [show]=\"parentFormGroup?.controls.dateFrom.errors\"\n >\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"TO_DATE | translate\"\n [for]=\"DATE_TO\"\n >\n {{ TO_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_TO\"\n [minDate]=\"parentFormGroup?.value.dateFrom\"\n [placeholder]=\"TO_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateTo\"\n [ngClass]=\"parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateToChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"parentFormGroup?.controls.dateTo.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i1.DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }], viewProviders: [
{
provide: ControlContainer,
useFactory: () => inject(ControlContainer, { skipSelf: true })
}
], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-date-range-picker', standalone: true, imports: [CoreModule, CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [
{
provide: ControlContainer,
useFactory: () => inject(ControlContainer, { skipSelf: true })
}
], template: "<div class=\"d-flex gap-8 a-i-center flex-wrap\">\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"FROM_DATE | translate\"\n [for]=\"DATE_FROM\"\n >\n {{ FROM_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_FROM\"\n [maxDate]=\"parentFormGroup?.value.dateTo\"\n [placeholder]=\"FROM_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateFrom\"\n [ngClass]=\"parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateFromChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages\n class=\"text-nowrap\"\n [show]=\"parentFormGroup?.controls.dateFrom.errors\"\n >\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"TO_DATE | translate\"\n [for]=\"DATE_TO\"\n >\n {{ TO_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_TO\"\n [minDate]=\"parentFormGroup?.value.dateFrom\"\n [placeholder]=\"TO_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateTo\"\n [ngClass]=\"parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateToChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"parentFormGroup?.controls.dateTo.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n</div>\n" }]
}], propDecorators: { isEmittingDateChange: [{
type: Input
}], showLabel: [{
type: Input
}], updatedDate: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFhLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFlMUQsTUFBTSxPQUFPLHdCQUF3QjtJQWJyQztRQWNFOzs7V0FHRztRQUNNLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUN0Qzs7V0FFRztRQUNNLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDaEIsZ0JBQVcsR0FHaEIsSUFBSSxZQUFZLEVBR2pCLENBQUM7UUFFSSxjQUFTLEdBQUcsVUFBVSxDQUFDO1FBQ3ZCLFlBQU8sR0FBRyxRQUFRLENBQUM7UUFDbkIsY0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsQyxjQUFTLEdBQUcsV0FBVyxDQUFDO1FBQ3hCLHNCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQ3RDLHlCQUFvQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hELDZDQUF3QyxHQUFHLE9BQU8sQ0FDekQsNkNBQTZDLENBQzlDLENBQUM7UUFDTyxrREFBNkMsR0FBRyxPQUFPLENBQzlELGdEQUFnRCxDQUNqRCxDQUFDO1FBQ08sWUFBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBaUJwRDtJQWZDLGdCQUFnQixDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3BCLFFBQVE7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQW9CLENBQUM7SUFDbkQsQ0FBQzsrR0EvQ1Usd0JBQXdCO21HQUF4Qix3QkFBd0IsNE1DekJyQyxxM0VBdUVBLDJDRHZEWSxVQUFVLGtxQ0FBRSxZQUFZLDhCQUFFLG1CQUFtQixvQkFFeEM7WUFDYjtnQkFDRSxPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQy9EO1NBQ0Y7OzRGQUVVLHdCQUF3QjtrQkFicEMsU0FBUzsrQkFDRSx1QkFBdUIsY0FFckIsSUFBSSxXQUNQLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxtQkFDdkMsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEM7d0JBQ2I7NEJBQ0UsT0FBTyxFQUFFLGdCQUFnQjs0QkFDekIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzt5QkFDL0Q7cUJBQ0Y7OEJBT1Esb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvcmVNb2R1bGUsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGUtcmFuZ2UtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvcmVNb2R1bGUsIENvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB2aWV3UHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IGluamVjdChDb250cm9sQ29udGFpbmVyLCB7IHNraXBTZWxmOiB0cnVlIH0pXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHJlYWN0aXZlIGFuZCB3aWxsIGVtaXQgdGhlIHVwZGF0ZWREYXRlIG9uIGV2ZXJ5IGNoYW5nZS5cbiAgICogT3RoZXJ3aXNlLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGEgbm9uIGVtaXR0aW5nIHZhcmlhbnQgb2YgYSB0ZW1wbGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpIGlzRW1pdHRpbmdEYXRlQ2hhbmdlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBkaXNwbGF5IG9mIGZyb20gYW5kIHRvIGRhdGUgcGlja2VyIGxhYmVscy5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dMYWJlbCA9IHRydWU7XG4gIEBPdXRwdXQoKSB1cGRhdGVkRGF0ZTogRXZlbnRFbWl0dGVyPHtcbiAgICBkYXRlRnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgZGF0ZVRvPzogc3RyaW5nIHwgbnVsbDtcbiAgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBkYXRlRnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgZGF0ZVRvPzogc3RyaW5nIHwgbnVsbDtcbiAgfT4oKTtcblxuICByZWFkb25seSBEQVRFX0ZST00gPSAnZGF0ZUZyb20nO1xuICByZWFkb25seSBEQVRFX1RPID0gJ2RhdGVUbyc7XG4gIHJlYWRvbmx5IEZST01fREFURSA9IGdldHRleHQoJ0Zyb21gZGF0ZWAnKTtcbiAgcmVhZG9ubHkgSEFTX0VSUk9SID0gJ2hhcy1lcnJvcic7XG4gIHJlYWRvbmx5IElOVkFMSURfREFURV9USU1FID0gJ2ludmFsaWREYXRlVGltZSc7XG4gIHJlYWRvbmx5IFRISVNfREFURV9JU19JTlZBTElEID0gZ2V0dGV4dCgnVGhpcyBkYXRlIGlzIGludmFsaWQuJyk7XG4gIHJlYWRvbmx5IFRISVNfREFURV9JU19BRlRFUl9USEVfTEFTVF9BTExPV0VEX0RBVEUgPSBnZXR0ZXh0KFxuICAgICdUaGlzIGRhdGUgaXMgYWZ0ZXIgdGhlIGxhdGVzdCBhbGxvd2VkIGRhdGUuJ1xuICApO1xuICByZWFkb25seSBUSElTX0RBVEVfSVNfQkVGT1JFX1RIRV9FQVJMSUVTVF9BTExPV0VEX0RBVEUgPSBnZXR0ZXh0KFxuICAgICdUaGlzIGRhdGUgaXMgYmVmb3JlIHRoZSBlYXJsaWVzdCBhbGxvd2VkIGRhdGUuJ1xuICApO1xuICByZWFkb25seSBUT19EQVRFID0gZ2V0dGV4dCgnVG9gZGF0ZWAnKTtcbiAgcHJpdmF0ZSBwYXJlbnRDb250YWluZXIgPSBpbmplY3QoQ29udHJvbENvbnRhaW5lcik7XG5cbiAgb25EYXRlRnJvbUNoYW5nZShkYXRlRnJvbTogc3RyaW5nKSB7XG4gICAgdGhpcy51cGRhdGVkRGF0ZS5lbWl0KHtcbiAgICAgIGRhdGVGcm9tXG4gICAgfSk7XG4gIH1cblxuICBvbkRhdGVUb0NoYW5nZShkYXRlVG86IHN0cmluZykge1xuICAgIHRoaXMudXBkYXRlZERhdGUuZW1pdCh7XG4gICAgICBkYXRlVG9cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBwYXJlbnRGb3JtR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q29udGFpbmVyLmNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC04IGEtaS1jZW50ZXIgZmxleC13cmFwXCI+XG4gIDxjOHktZm9ybS1ncm91cFxuICAgIFtuZ0NsYXNzXT1cIltcbiAgICAgIHBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZUZyb20uZXJyb3JzID8gSEFTX0VSUk9SIDogJycsXG4gICAgICBpc0VtaXR0aW5nRGF0ZUNoYW5nZSA/ICdkLWZsZXggYS1pLWNlbnRlciBnYXAtNCBtLWItMCcgOiAnJ1xuICAgIF1cIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dMYWJlbFwiPlxuICAgICAgPGxhYmVsXG4gICAgICAgIFt0aXRsZV09XCJGUk9NX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZm9yXT1cIkRBVEVfRlJPTVwiXG4gICAgICA+XG4gICAgICAgIHt7IEZST01fREFURSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9sYWJlbD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8Yzh5LWRhdGUtdGltZS1waWNrZXJcbiAgICAgIGlkPVwiREFURV9GUk9NXCJcbiAgICAgIFttYXhEYXRlXT1cInBhcmVudEZvcm1Hcm91cD8udmFsdWUuZGF0ZVRvXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJGUk9NX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cInBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZUZyb21cIlxuICAgICAgW25nQ2xhc3NdPVwicGFyZW50Rm9ybUdyb3VwPy5jb250cm9scy5kYXRlRnJvbS5lcnJvcnMgPyBIQVNfRVJST1IgOiAnJ1wiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkRhdGVGcm9tQ2hhbmdlKCRldmVudClcIlxuICAgID48L2M4eS1kYXRlLXRpbWUtcGlja2VyPlxuICAgIDxjOHktbWVzc2FnZXNcbiAgICAgIGNsYXNzPVwidGV4dC1ub3dyYXBcIlxuICAgICAgW3Nob3ddPVwicGFyZW50Rm9ybUdyb3VwPy5jb250cm9scy5kYXRlRnJvbS5lcnJvcnNcIlxuICAgID5cbiAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICBuYW1lPVwiZGF0ZUFmdGVyUmFuZ2VNYXhcIlxuICAgICAgICBbdGV4dF09XCJUSElTX0RBVEVfSVNfQUZURVJfVEhFX0xBU1RfQUxMT1dFRF9EQVRFIHwgdHJhbnNsYXRlXCJcbiAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgIG5hbWU9XCJJTlZBTElEX0RBVEVfVElNRVwiXG4gICAgICAgIFt0ZXh0XT1cIlRISVNfREFURV9JU19JTlZBTElEIHwgdHJhbnNsYXRlXCJcbiAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgIDwvYzh5LW1lc3NhZ2VzPlxuICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICBbbmdDbGFzc109XCJbXG4gICAgICBwYXJlbnRGb3JtR3JvdXA/LmNvbnRyb2xzLmRhdGVUby5lcnJvcnMgPyBIQVNfRVJST1IgOiAnJyxcbiAgICAgIGlzRW1pdHRpbmdEYXRlQ2hhbmdlID8gJ2QtZmxleCBhLWktY2VudGVyIGdhcC00IG0tYi0wJyA6ICcnXG4gICAgXVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0xhYmVsXCI+XG4gICAgICA8bGFiZWxcbiAgICAgICAgW3RpdGxlXT1cIlRPX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZm9yXT1cIkRBVEVfVE9cIlxuICAgICAgPlxuICAgICAgICB7eyBUT19EQVRFIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2xhYmVsPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxjOHktZGF0ZS10aW1lLXBpY2tlclxuICAgICAgaWQ9XCJEQVRFX1RPXCJcbiAgICAgIFttaW5EYXRlXT1cInBhcmVudEZvcm1Hcm91cD8udmFsdWUuZGF0ZUZyb21cIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIlRPX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cInBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZVRvXCJcbiAgICAgIFtuZ0NsYXNzXT1cInBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZVRvLmVycm9ycyA/IEhBU19FUlJPUiA6ICcnXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGF0ZVRvQ2hhbmdlKCRldmVudClcIlxuICAgID48L2M4eS1kYXRlLXRpbWUtcGlja2VyPlxuICAgIDxjOHktbWVzc2FnZXMgW3Nob3ddPVwicGFyZW50Rm9ybUdyb3VwPy5jb250cm9scy5kYXRlVG8uZXJyb3JzXCI+XG4gICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgbmFtZT1cImRhdGVCZWZvcmVSYW5nZU1pblwiXG4gICAgICAgIFt0ZXh0XT1cIlRISVNfREFURV9JU19CRUZPUkVfVEhFX0VBUkxJRVNUX0FMTE9XRURfREFURSB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICBuYW1lPVwiSU5WQUxJRF9EQVRFX1RJTUVcIlxuICAgICAgICBbdGV4dF09XCJUSElTX0RBVEVfSVNfSU5WQUxJRCB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICA8L2M4eS1tZXNzYWdlcz5cbiAgPC9jOHktZm9ybS1ncm91cD5cbjwvZGl2PlxuIl19