UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

66 lines 17.4 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import { DASHBOARD_THEME_CLASSES, WIDGET_HEADER_CLASSES } from '../context-dashboard.model'; import { ContextDashboardService } from '../context-dashboard.service'; import * as i0 from "@angular/core"; import * as i1 from "../context-dashboard.service"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/forms"; import * as i4 from "../appearance-settings.component"; export class DashboardAppearanceSettingsComponent { constructor(contextDashboardService) { this.contextDashboardService = contextDashboardService; this.styling = { themeClass: 'dashboard-theme-light', headerClass: 'panel-title-regular' }; this.previewChanged = new EventEmitter(); this.DEFAULT_DASHBOARD_MARGIN = 12; } ngOnInit() { if (this.dashboard) { this.setDashboardStyle(); } } ngOnChanges(changes) { if (changes.dashboard) { this.dashboard = changes.dashboard.currentValue; this.ngOnInit(); } } changeThemeClass(themeClass) { this.styling.themeClass = themeClass; this.appearanceSettingsForm.patchValue({ classes: { [this.styling.themeClass]: true } }); this.previewChanged.emit({ classes: { [this.styling.themeClass]: true } }); this.appearanceSettingsForm.markAsDirty(); } changeHeaderClass(headerClass) { this.styling.headerClass = headerClass; this.appearanceSettingsForm.patchValue({ widgetClasses: { [this.styling.headerClass]: true } }); this.previewChanged.emit({ widgetClasses: { [this.styling.headerClass]: true } }); this.appearanceSettingsForm.markAsDirty(); } setDashboardStyle() { const allClasses = { ...this.dashboard.classes, ...this.dashboard.widgetClasses }; const styles = Object.keys(allClasses).map(c => c.split('-').pop()); styles.forEach(styleName => { this.styling.themeClass = this.contextDashboardService.getStyling(DASHBOARD_THEME_CLASSES, styleName, this.styling.themeClass); this.styling.headerClass = this.contextDashboardService.getStyling(WIDGET_HEADER_CLASSES, styleName, this.styling.headerClass); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardAppearanceSettingsComponent, deps: [{ token: i1.ContextDashboardService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DashboardAppearanceSettingsComponent, selector: "c8y-dashboard-appearance-settings", inputs: { dashboard: "dashboard", appearanceSettingsForm: "appearanceSettingsForm" }, outputs: { previewChanged: "previewChanged" }, usesOnChanges: true, ngImport: i0, template: "<div [formGroup]=\"appearanceSettingsForm\">\n <c8y-appearance-settings\n [themeClass]=\"styling.themeClass\"\n [headerClass]=\"styling.headerClass\"\n (themeClassChange)=\"changeThemeClass($event)\"\n (headerClassChange)=\"changeHeaderClass($event)\"\n [dashboardSettings]=\"true\"\n [columns]=\"3\"\n >\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend translate>Misc</legend>\n <c8y-form-group>\n <label for=\"margin\">{{ 'Widget margin' | translate }}</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n id=\"margin\"\n placeholder=\"{{ DEFAULT_DASHBOARD_MARGIN }}\"\n name=\"margin\"\n type=\"number\"\n formControlName=\"widgetMargin\"\n />\n <span class=\"input-group-addon\">px</span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Widget titles</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Translate if possible' | translate }}\"\n >\n <input\n name=\"translateWidgetTitle\"\n type=\"checkbox\"\n formControlName=\"translateWidgetTitle\"\n />\n <span></span>\n <span>{{ 'Translate if possible' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </div>\n </c8y-appearance-settings>\n</div>\n", dependencies: [{ kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.AppearanceSettingsComponent, selector: "c8y-appearance-settings", inputs: ["themeClass", "headerClass", "defaultThemeClass", "defaultHeaderClass", "dashboardSettings", "possibleStylingTheme", "possibleStylingHeader", "columns"], outputs: ["themeClassChange", "headerClassChange"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardAppearanceSettingsComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-dashboard-appearance-settings', template: "<div [formGroup]=\"appearanceSettingsForm\">\n <c8y-appearance-settings\n [themeClass]=\"styling.themeClass\"\n [headerClass]=\"styling.headerClass\"\n (themeClassChange)=\"changeThemeClass($event)\"\n (headerClassChange)=\"changeHeaderClass($event)\"\n [dashboardSettings]=\"true\"\n [columns]=\"3\"\n >\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend translate>Misc</legend>\n <c8y-form-group>\n <label for=\"margin\">{{ 'Widget margin' | translate }}</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n id=\"margin\"\n placeholder=\"{{ DEFAULT_DASHBOARD_MARGIN }}\"\n name=\"margin\"\n type=\"number\"\n formControlName=\"widgetMargin\"\n />\n <span class=\"input-group-addon\">px</span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Widget titles</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Translate if possible' | translate }}\"\n >\n <input\n name=\"translateWidgetTitle\"\n type=\"checkbox\"\n formControlName=\"translateWidgetTitle\"\n />\n <span></span>\n <span>{{ 'Translate if possible' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </div>\n </c8y-appearance-settings>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.ContextDashboardService }], propDecorators: { dashboard: [{ type: Input }], appearanceSettingsForm: [{ type: Input }], previewChanged: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLWFwcGVhcmFuY2Utc2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29udGV4dC1kYXNoYm9hcmQvZGFzaGJvYXJkLXNldHRpbmdzL2Rhc2hib2FyZC1hcHBlYXJhbmNlLXNldHRpbmdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL2Rhc2hib2FyZC1zZXR0aW5ncy9kYXNoYm9hcmQtYXBwZWFyYW5jZS1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNEIsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7QUFPdkUsTUFBTSxPQUFPLG9DQUFvQztJQWEvQyxZQUFvQix1QkFBZ0Q7UUFBaEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQVZwRSxZQUFPLEdBQUc7WUFDUixVQUFVLEVBQUUsdUJBQXVCO1lBQ25DLFdBQVcsRUFBRSxxQkFBcUI7U0FDbkMsQ0FBQztRQUNRLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBRXhDLENBQUM7UUFFSyw2QkFBd0IsR0FBRyxFQUFFLENBQUM7SUFFZ0MsQ0FBQztJQUV4RSxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztZQUNoRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsV0FBbUI7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLFVBQVUsR0FBRztZQUNqQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUN6QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYTtTQUNoQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUMvRCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUN4QixDQUFDO1lBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FDaEUscUJBQXFCLEVBQ3JCLFNBQVMsRUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FDekIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0E3RFUsb0NBQW9DO21HQUFwQyxvQ0FBb0MsbU9DYmpELDZoREE4Q0E7OzRGRGpDYSxvQ0FBb0M7a0JBSmhELFNBQVM7K0JBQ0UsbUNBQW1DOzRGQUlwQyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFLSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udGV4dERhc2hib2FyZCxcbiAgREFTSEJPQVJEX1RIRU1FX0NMQVNTRVMsXG4gIFdJREdFVF9IRUFERVJfQ0xBU1NFU1xufSBmcm9tICcuLi9jb250ZXh0LWRhc2hib2FyZC5tb2RlbCc7XG5pbXBvcnQgeyBDb250ZXh0RGFzaGJvYXJkU2VydmljZSB9IGZyb20gJy4uL2NvbnRleHQtZGFzaGJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGFzaGJvYXJkRGV0YWlsU2VydmljZSB9IGZyb20gJy4uL2Rhc2hib2FyZC1kZXRhaWwuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXNoYm9hcmQtYXBwZWFyYW5jZS1zZXR0aW5ncycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXNoYm9hcmQtYXBwZWFyYW5jZS1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQXBwZWFyYW5jZVNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGFzaGJvYXJkOiBDb250ZXh0RGFzaGJvYXJkO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlU2V0dGluZ3NGb3JtOiBSZXR1cm5UeXBlPERhc2hib2FyZERldGFpbFNlcnZpY2VbJ2luaXRBcHBlYXJhbmNlU2V0dGluZ3NGb3JtJ10+O1xuICBzdHlsaW5nID0ge1xuICAgIHRoZW1lQ2xhc3M6ICdkYXNoYm9hcmQtdGhlbWUtbGlnaHQnLFxuICAgIGhlYWRlckNsYXNzOiAncGFuZWwtdGl0bGUtcmVndWxhcidcbiAgfTtcbiAgQE91dHB1dCgpIHByZXZpZXdDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxcbiAgICBQaWNrPENvbnRleHREYXNoYm9hcmQsICdjbGFzc2VzJyB8ICd3aWRnZXRDbGFzc2VzJz5cbiAgPigpO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfREFTSEJPQVJEX01BUkdJTiA9IDEyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29udGV4dERhc2hib2FyZFNlcnZpY2U6IENvbnRleHREYXNoYm9hcmRTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmRhc2hib2FyZCkge1xuICAgICAgdGhpcy5zZXREYXNoYm9hcmRTdHlsZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5kYXNoYm9hcmQpIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkID0gY2hhbmdlcy5kYXNoYm9hcmQuY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVRoZW1lQ2xhc3ModGhlbWVDbGFzczogc3RyaW5nKSB7XG4gICAgdGhpcy5zdHlsaW5nLnRoZW1lQ2xhc3MgPSB0aGVtZUNsYXNzO1xuICAgIHRoaXMuYXBwZWFyYW5jZVNldHRpbmdzRm9ybS5wYXRjaFZhbHVlKHsgY2xhc3NlczogeyBbdGhpcy5zdHlsaW5nLnRoZW1lQ2xhc3NdOiB0cnVlIH0gfSk7XG4gICAgdGhpcy5wcmV2aWV3Q2hhbmdlZC5lbWl0KHsgY2xhc3NlczogeyBbdGhpcy5zdHlsaW5nLnRoZW1lQ2xhc3NdOiB0cnVlIH0gfSk7XG4gICAgdGhpcy5hcHBlYXJhbmNlU2V0dGluZ3NGb3JtLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBjaGFuZ2VIZWFkZXJDbGFzcyhoZWFkZXJDbGFzczogc3RyaW5nKSB7XG4gICAgdGhpcy5zdHlsaW5nLmhlYWRlckNsYXNzID0gaGVhZGVyQ2xhc3M7XG4gICAgdGhpcy5hcHBlYXJhbmNlU2V0dGluZ3NGb3JtLnBhdGNoVmFsdWUoeyB3aWRnZXRDbGFzc2VzOiB7IFt0aGlzLnN0eWxpbmcuaGVhZGVyQ2xhc3NdOiB0cnVlIH0gfSk7XG4gICAgdGhpcy5wcmV2aWV3Q2hhbmdlZC5lbWl0KHsgd2lkZ2V0Q2xhc3NlczogeyBbdGhpcy5zdHlsaW5nLmhlYWRlckNsYXNzXTogdHJ1ZSB9IH0pO1xuICAgIHRoaXMuYXBwZWFyYW5jZVNldHRpbmdzRm9ybS5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXNoYm9hcmRTdHlsZSgpIHtcbiAgICBjb25zdCBhbGxDbGFzc2VzID0ge1xuICAgICAgLi4udGhpcy5kYXNoYm9hcmQuY2xhc3NlcyxcbiAgICAgIC4uLnRoaXMuZGFzaGJvYXJkLndpZGdldENsYXNzZXNcbiAgICB9O1xuXG4gICAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmtleXMoYWxsQ2xhc3NlcykubWFwKGMgPT4gYy5zcGxpdCgnLScpLnBvcCgpKTtcbiAgICBzdHlsZXMuZm9yRWFjaChzdHlsZU5hbWUgPT4ge1xuICAgICAgdGhpcy5zdHlsaW5nLnRoZW1lQ2xhc3MgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmdldFN0eWxpbmcoXG4gICAgICAgIERBU0hCT0FSRF9USEVNRV9DTEFTU0VTLFxuICAgICAgICBzdHlsZU5hbWUsXG4gICAgICAgIHRoaXMuc3R5bGluZy50aGVtZUNsYXNzXG4gICAgICApO1xuICAgICAgdGhpcy5zdHlsaW5nLmhlYWRlckNsYXNzID0gdGhpcy5jb250ZXh0RGFzaGJvYXJkU2VydmljZS5nZXRTdHlsaW5nKFxuICAgICAgICBXSURHRVRfSEVBREVSX0NMQVNTRVMsXG4gICAgICAgIHN0eWxlTmFtZSxcbiAgICAgICAgdGhpcy5zdHlsaW5nLmhlYWRlckNsYXNzXG4gICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiYXBwZWFyYW5jZVNldHRpbmdzRm9ybVwiPlxuICA8Yzh5LWFwcGVhcmFuY2Utc2V0dGluZ3NcbiAgICBbdGhlbWVDbGFzc109XCJzdHlsaW5nLnRoZW1lQ2xhc3NcIlxuICAgIFtoZWFkZXJDbGFzc109XCJzdHlsaW5nLmhlYWRlckNsYXNzXCJcbiAgICAodGhlbWVDbGFzc0NoYW5nZSk9XCJjaGFuZ2VUaGVtZUNsYXNzKCRldmVudClcIlxuICAgIChoZWFkZXJDbGFzc0NoYW5nZSk9XCJjaGFuZ2VIZWFkZXJDbGFzcygkZXZlbnQpXCJcbiAgICBbZGFzaGJvYXJkU2V0dGluZ3NdPVwidHJ1ZVwiXG4gICAgW2NvbHVtbnNdPVwiM1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBjOHktZmllbGRzZXQtLWxnXCI+XG4gICAgICAgIDxsZWdlbmQgdHJhbnNsYXRlPk1pc2M8L2xlZ2VuZD5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXJnaW5cIj57eyAnV2lkZ2V0IG1hcmdpbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgaWQ9XCJtYXJnaW5cIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IERFRkFVTFRfREFTSEJPQVJEX01BUkdJTiB9fVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJtYXJnaW5cIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwid2lkZ2V0TWFyZ2luXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+cHg8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+V2lkZ2V0IHRpdGxlczwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdUcmFuc2xhdGUgaWYgcG9zc2libGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbmFtZT1cInRyYW5zbGF0ZVdpZGdldFRpdGxlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHJhbnNsYXRlV2lkZ2V0VGl0bGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdUcmFuc2xhdGUgaWYgcG9zc2libGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgIDwvZGl2PlxuICA8L2M4eS1hcHBlYXJhbmNlLXNldHRpbmdzPlxuPC9kaXY+XG4iXX0=