@coreui/angular
Version:
CoreUI Components Library for Angular
96 lines • 15.4 kB
JavaScript
import { booleanAttribute, Component, computed, contentChildren, effect, input } from '@angular/core';
import { NgClass, NgTemplateOutlet } from '@angular/common';
import { TemplateIdDirective } from '../../shared';
import { CardBodyComponent, CardComponent, CardFooterComponent } from '../../card';
import * as i0 from "@angular/core";
export class WidgetStatFComponent extends CardComponent {
constructor() {
super(...arguments);
/**
* Sets the color context of the component to one of CoreUI’s themed colors.
* @type Colors
*/
// override readonly color = input<Colors>();
/**
* Sets the text-color context of the component to one of CoreUI’s themed colors.
* @type Colors
*/
// override readonly textColor = input<TextColors | 'white' | 'muted'>();
/**
* Footer for your widget
* @type string
*/
this.footer = input();
/**
* Icon for your widget
* @type string
*/
this.icon = input();
/**
* Set padding of your component.
* @type boolean
*/
this.padding = input(false, { transform: booleanAttribute });
/**
* Title of the widget to display
* @type string
*/
this.title = input();
/**
* Value for your widget to display
* @type string
*/
this.value = input();
this.templates = {};
this.contentTemplates = contentChildren(TemplateIdDirective, { descendants: true });
this.contentTemplatesEffect = effect(() => {
this.contentTemplates().forEach((child) => {
this.templates[child.id] = child.templateRef;
});
});
this.cardBodyClasses = computed(() => {
return {
'd-flex': true,
'align-items-center': true,
'p-0': !this.padding()
};
});
this.iconClasses = computed(() => {
const color = this.color();
const padding = this.padding();
return {
'me-3': !this.textColor(),
'text-white': true,
[`bg-${color}`]: !!color,
'p-3': padding,
'p-4': !padding,
'rounded-start-1': !padding
};
});
this.titleClasses = computed(() => {
const textColor = this.textColor();
return {
'text-body-secondary': !textColor,
small: true,
'text-uppercase': true,
'fw-semibold': true,
[`text-${textColor}`]: !!textColor
};
});
this.valueClasses = computed(() => {
const textColor = this.textColor();
return {
'fs-6': !textColor,
'fw-semibold': true,
[`text-${textColor}`]: !!textColor
};
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: WidgetStatFComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: WidgetStatFComponent, isStandalone: true, selector: "c-widget-stat-f", inputs: { footer: { classPropertyName: "footer", publicName: "footer", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" }, classAttribute: "card" }, queries: [{ propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true, isSignal: true }], exportAs: ["cWidgetStatB"], usesInheritance: true, ngImport: i0, template: "<ng-container>\n <c-card-body [ngClass]=\"cardBodyClasses()\">\n <div [ngClass]=\"iconClasses()\">\n <ng-container *ngTemplateOutlet=\"templates?.['widgetIconTemplate'] || defaultWidgetIconTemplate\" />\n </div>\n <div>\n <div [ngClass]=\"valueClasses()\">{{ value() }}</div>\n <div [ngClass]=\"titleClasses()\">{{ title() }}</div>\n </div>\n </c-card-body>\n @if (footer() || templates?.['widgetFooterTemplate']) {\n <c-card-footer>\n <ng-container *ngTemplateOutlet=\"templates?.['widgetFooterTemplate'] || defaultFooterIconTemplate\" />\n </c-card-footer>\n }\n</ng-container>\n\n<ng-template #defaultWidgetIconTemplate>\n <span>{{ icon() }}</span>\n</ng-template>\n\n<ng-template #defaultFooterIconTemplate>\n <span>{{ footer() }}</span>\n</ng-template>\n", dependencies: [{ kind: "component", type: CardBodyComponent, selector: "c-card-body, [c-card-body]" }, { kind: "component", type: CardFooterComponent, selector: "c-card-footer, [c-card-footer]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: WidgetStatFComponent, decorators: [{
type: Component,
args: [{ selector: 'c-widget-stat-f', exportAs: 'cWidgetStatB', standalone: true, imports: [CardBodyComponent, CardFooterComponent, NgClass, NgTemplateOutlet], host: { class: 'card', '[class]': 'hostClasses()' }, template: "<ng-container>\n <c-card-body [ngClass]=\"cardBodyClasses()\">\n <div [ngClass]=\"iconClasses()\">\n <ng-container *ngTemplateOutlet=\"templates?.['widgetIconTemplate'] || defaultWidgetIconTemplate\" />\n </div>\n <div>\n <div [ngClass]=\"valueClasses()\">{{ value() }}</div>\n <div [ngClass]=\"titleClasses()\">{{ title() }}</div>\n </div>\n </c-card-body>\n @if (footer() || templates?.['widgetFooterTemplate']) {\n <c-card-footer>\n <ng-container *ngTemplateOutlet=\"templates?.['widgetFooterTemplate'] || defaultFooterIconTemplate\" />\n </c-card-footer>\n }\n</ng-container>\n\n<ng-template #defaultWidgetIconTemplate>\n <span>{{ icon() }}</span>\n</ng-template>\n\n<ng-template #defaultFooterIconTemplate>\n <span>{{ footer() }}</span>\n</ng-template>\n" }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXN0YXQtZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3dpZGdldC93aWRnZXQtc3RhdC1mL3dpZGdldC1zdGF0LWYuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi93aWRnZXQvd2lkZ2V0LXN0YXQtZi93aWRnZXQtc3RhdC1mLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFVbkYsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGFBQWE7SUFSdkQ7O1FBU0U7OztXQUdHO1FBQ0gsNkNBQTZDO1FBRTdDOzs7V0FHRztRQUNILHlFQUF5RTtRQUV6RTs7O1dBR0c7UUFDTSxXQUFNLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFFbEM7OztXQUdHO1FBQ00sU0FBSSxHQUFHLEtBQUssRUFBVSxDQUFDO1FBRWhDOzs7V0FHRztRQUNNLFlBQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUVqRTs7O1dBR0c7UUFDTSxVQUFLLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFFakM7OztXQUdHO1FBQ00sVUFBSyxHQUFHLEtBQUssRUFBbUIsQ0FBQztRQUUxQyxjQUFTLEdBQXFDLEVBQUUsQ0FBQztRQUN4QyxxQkFBZ0IsR0FBRyxlQUFlLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUvRSwyQkFBc0IsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQTBCLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRU0sb0JBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3ZDLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLElBQUk7Z0JBQ2Qsb0JBQW9CLEVBQUUsSUFBSTtnQkFDMUIsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTthQUNJLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFFTSxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUUvQixPQUFPO2dCQUNMLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLFlBQVksRUFBRSxJQUFJO2dCQUNsQixDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDeEIsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsS0FBSyxFQUFFLENBQUMsT0FBTztnQkFDZixpQkFBaUIsRUFBRSxDQUFDLE9BQU87YUFDRCxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRU0saUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNMLHFCQUFxQixFQUFFLENBQUMsU0FBUztnQkFDakMsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsZ0JBQWdCLEVBQUUsSUFBSTtnQkFDdEIsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLENBQUMsUUFBUSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTO2FBQ1IsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVNLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkMsT0FBTztnQkFDTCxNQUFNLEVBQUUsQ0FBQyxTQUFTO2dCQUNsQixhQUFhLEVBQUUsSUFBSTtnQkFDbkIsQ0FBQyxRQUFRLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVM7YUFDUixDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0tBQ0o7K0dBN0ZZLG9CQUFvQjttR0FBcEIsb0JBQW9CLGt5QkE0Q2EsbUJBQW1CLG1IQzNEakUscXlCQXdCQSw0Q0RaWSxpQkFBaUIsdUVBQUUsbUJBQW1CLDJFQUFFLE9BQU8sb0ZBQUUsZ0JBQWdCOzs0RkFHaEUsb0JBQW9CO2tCQVJoQyxTQUFTOytCQUNFLGlCQUFpQixZQUVqQixjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLFFBQ3RFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYm9vbGVhbkF0dHJpYnV0ZSwgQ29tcG9uZW50LCBjb21wdXRlZCwgY29udGVudENoaWxkcmVuLCBlZmZlY3QsIGlucHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IENvbG9ycyB9IGZyb20gJy4uLy4uL2NvcmV1aS50eXBlcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZUlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IENhcmRCb2R5Q29tcG9uZW50LCBDYXJkQ29tcG9uZW50LCBDYXJkRm9vdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2FyZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Mtd2lkZ2V0LXN0YXQtZicsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtc3RhdC1mLmNvbXBvbmVudC5odG1sJyxcbiAgZXhwb3J0QXM6ICdjV2lkZ2V0U3RhdEInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ2FyZEJvZHlDb21wb25lbnQsIENhcmRGb290ZXJDb21wb25lbnQsIE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXRdLFxuICBob3N0OiB7IGNsYXNzOiAnY2FyZCcsICdbY2xhc3NdJzogJ2hvc3RDbGFzc2VzKCknIH1cbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0U3RhdEZDb21wb25lbnQgZXh0ZW5kcyBDYXJkQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbG9yIGNvbnRleHQgb2YgdGhlIGNvbXBvbmVudCB0byBvbmUgb2YgQ29yZVVJ4oCZcyB0aGVtZWQgY29sb3JzLlxuICAgKiBAdHlwZSBDb2xvcnNcbiAgICovXG4gIC8vIG92ZXJyaWRlIHJlYWRvbmx5IGNvbG9yID0gaW5wdXQ8Q29sb3JzPigpO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXh0LWNvbG9yIGNvbnRleHQgb2YgdGhlIGNvbXBvbmVudCB0byBvbmUgb2YgQ29yZVVJ4oCZcyB0aGVtZWQgY29sb3JzLlxuICAgKiBAdHlwZSBDb2xvcnNcbiAgICovXG4gIC8vIG92ZXJyaWRlIHJlYWRvbmx5IHRleHRDb2xvciA9IGlucHV0PFRleHRDb2xvcnMgfCAnd2hpdGUnIHwgJ211dGVkJz4oKTtcblxuICAvKipcbiAgICogRm9vdGVyIGZvciB5b3VyIHdpZGdldFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICovXG4gIHJlYWRvbmx5IGZvb3RlciA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogSWNvbiBmb3IgeW91ciB3aWRnZXRcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqL1xuICByZWFkb25seSBpY29uID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBTZXQgcGFkZGluZyBvZiB5b3VyIGNvbXBvbmVudC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKi9cbiAgcmVhZG9ubHkgcGFkZGluZyA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogVGl0bGUgb2YgdGhlIHdpZGdldCB0byBkaXNwbGF5XG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFZhbHVlIGZvciB5b3VyIHdpZGdldCB0byBkaXNwbGF5XG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWUgPSBpbnB1dDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgdGVtcGxhdGVzOiBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+PiA9IHt9O1xuICByZWFkb25seSBjb250ZW50VGVtcGxhdGVzID0gY29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSk7XG5cbiAgcmVhZG9ubHkgY29udGVudFRlbXBsYXRlc0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgdGhpcy5jb250ZW50VGVtcGxhdGVzKCkuZm9yRWFjaCgoY2hpbGQ6IFRlbXBsYXRlSWREaXJlY3RpdmUpID0+IHtcbiAgICAgIHRoaXMudGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgIH0pO1xuICB9KTtcblxuICByZWFkb25seSBjYXJkQm9keUNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkLWZsZXgnOiB0cnVlLFxuICAgICAgJ2FsaWduLWl0ZW1zLWNlbnRlcic6IHRydWUsXG4gICAgICAncC0wJzogIXRoaXMucGFkZGluZygpXG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaWNvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yKCk7XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMucGFkZGluZygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICdtZS0zJzogIXRoaXMudGV4dENvbG9yKCksXG4gICAgICAndGV4dC13aGl0ZSc6IHRydWUsXG4gICAgICBbYGJnLSR7Y29sb3J9YF06ICEhY29sb3IsXG4gICAgICAncC0zJzogcGFkZGluZyxcbiAgICAgICdwLTQnOiAhcGFkZGluZyxcbiAgICAgICdyb3VuZGVkLXN0YXJ0LTEnOiAhcGFkZGluZ1xuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRpdGxlQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB0ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcigpO1xuICAgIHJldHVybiB7XG4gICAgICAndGV4dC1ib2R5LXNlY29uZGFyeSc6ICF0ZXh0Q29sb3IsXG4gICAgICBzbWFsbDogdHJ1ZSxcbiAgICAgICd0ZXh0LXVwcGVyY2FzZSc6IHRydWUsXG4gICAgICAnZnctc2VtaWJvbGQnOiB0cnVlLFxuICAgICAgW2B0ZXh0LSR7dGV4dENvbG9yfWBdOiAhIXRleHRDb2xvclxuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHZhbHVlQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB0ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcigpO1xuICAgIHJldHVybiB7XG4gICAgICAnZnMtNic6ICF0ZXh0Q29sb3IsXG4gICAgICAnZnctc2VtaWJvbGQnOiB0cnVlLFxuICAgICAgW2B0ZXh0LSR7dGV4dENvbG9yfWBdOiAhIXRleHRDb2xvclxuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gIH0pO1xufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGMtY2FyZC1ib2R5IFtuZ0NsYXNzXT1cImNhcmRCb2R5Q2xhc3NlcygpXCI+XG4gICAgPGRpdiBbbmdDbGFzc109XCJpY29uQ2xhc3NlcygpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzPy5bJ3dpZGdldEljb25UZW1wbGF0ZSddIHx8IGRlZmF1bHRXaWRnZXRJY29uVGVtcGxhdGVcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cInZhbHVlQ2xhc3NlcygpXCI+e3sgdmFsdWUoKSB9fTwvZGl2PlxuICAgICAgPGRpdiBbbmdDbGFzc109XCJ0aXRsZUNsYXNzZXMoKVwiPnt7IHRpdGxlKCkgfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9jLWNhcmQtYm9keT5cbiAgQGlmIChmb290ZXIoKSB8fCB0ZW1wbGF0ZXM/Llsnd2lkZ2V0Rm9vdGVyVGVtcGxhdGUnXSkge1xuICAgIDxjLWNhcmQtZm9vdGVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlcz8uWyd3aWRnZXRGb290ZXJUZW1wbGF0ZSddIHx8IGRlZmF1bHRGb290ZXJJY29uVGVtcGxhdGVcIiAvPlxuICAgIDwvYy1jYXJkLWZvb3Rlcj5cbiAgfVxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFdpZGdldEljb25UZW1wbGF0ZT5cbiAgPHNwYW4+e3sgaWNvbigpIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Rm9vdGVySWNvblRlbXBsYXRlPlxuICA8c3Bhbj57eyBmb290ZXIoKSB9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=