UNPKG

ng-prime-tools

Version:

An advanced PrimeNG table for Angular

174 lines 31.3 kB
import { Component, Input } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class PTMetricCardComponent { static { this.DEFAULT_ICON_COLOR = '#5a67d8'; } static { this.DEFAULT_ICON_SIZE = '24px'; } static { this.DEFAULT_TITLE_COLOR = '#5a67d8'; } static { this.DEFAULT_TITLE_SIZE = '16px'; } static { this.DEFAULT_VALUE_COLOR = '#2d3748'; } static { this.DEFAULT_VALUE_SIZE = '32px'; } static { this.DEFAULT_LABEL_COLOR = '#718096'; } static { this.DEFAULT_LABEL_SIZE = '14px'; } static { this.DEFAULT_ADDITIONAL_INFO_COLOR = 'gray'; } static { this.DEFAULT_ADDITIONAL_INFO_SIZE = '14px'; } static { this.DEFAULT_BACKGROUND_COLOR = '#fff'; } isIconObject() { return typeof this.cardData.icon === 'object'; } isTitleObject() { return typeof this.cardData.title === 'object'; } isValueObject() { return typeof this.cardData.value === 'object'; } isLabelObject(label) { return typeof label === 'object'; } isAdditionalInfoObject() { return typeof this.cardData.additionalInfo === 'object'; } getIconText() { return this.isIconObject() ? this.cardData.icon.code : this.cardData.icon; } getTitleText() { return this.isTitleObject() ? this.cardData.title.text : this.cardData.title; } getValueText() { return this.isValueObject() ? this.cardData.value.text : this.cardData.value; } getLabelText() { const label = this.cardData.value?.label; return this.isLabelObject(label) ? label.text : label; } getAdditionalInfoText() { return this.isAdditionalInfoObject() ? this.cardData.additionalInfo.text : this.cardData.additionalInfo; } getIconStyles() { if (this.isIconObject()) { const icon = this.cardData.icon; const shape = icon.shape || 'circular'; // Default to 'circular' if not specified // Determine border radius based on shape const borderRadius = shape === 'circular' ? '50%' : '8px'; return { color: icon.color || PTMetricCardComponent.DEFAULT_ICON_COLOR, fontSize: icon.fontSize || PTMetricCardComponent.DEFAULT_ICON_SIZE, 'background-color': icon.backgroundColor || 'transparent', 'border-radius': borderRadius, padding: '6px', display: 'inline-block', }; } return {}; } getTitleStyles() { if (this.isTitleObject()) { const title = this.cardData.title; return { color: title.color || PTMetricCardComponent.DEFAULT_TITLE_COLOR, fontSize: title.fontSize || PTMetricCardComponent.DEFAULT_TITLE_SIZE, fontWeight: title.fontWeight || 'normal', }; } return {}; } getValueStyles() { if (this.isValueObject()) { const value = this.cardData.value; return { color: value.color || PTMetricCardComponent.DEFAULT_VALUE_COLOR, fontSize: value.fontSize || PTMetricCardComponent.DEFAULT_VALUE_SIZE, fontWeight: value.fontWeight || 'bold', }; } else { return { color: PTMetricCardComponent.DEFAULT_VALUE_COLOR, fontSize: PTMetricCardComponent.DEFAULT_VALUE_SIZE, fontWeight: 'bold', }; } } getLabelStyles(position) { const label = this.cardData.value?.label; if (this.isLabelObject(label) && label.position === position) { return { color: label.color || PTMetricCardComponent.DEFAULT_LABEL_COLOR, fontSize: label.fontSize || PTMetricCardComponent.DEFAULT_LABEL_SIZE, fontWeight: label.fontWeight || 'normal', }; } else { return { color: PTMetricCardComponent.DEFAULT_LABEL_COLOR, fontSize: PTMetricCardComponent.DEFAULT_LABEL_SIZE, fontWeight: 'normal', }; } } getAdditionalInfoStyles() { if (this.isAdditionalInfoObject()) { const additionalInfo = this.cardData.additionalInfo; return { color: additionalInfo.color || PTMetricCardComponent.DEFAULT_ADDITIONAL_INFO_COLOR, fontSize: additionalInfo.fontSize || PTMetricCardComponent.DEFAULT_ADDITIONAL_INFO_SIZE, fontWeight: additionalInfo.fontWeight || 'normal', }; } else { return { color: PTMetricCardComponent.DEFAULT_ADDITIONAL_INFO_COLOR, fontSize: PTMetricCardComponent.DEFAULT_ADDITIONAL_INFO_SIZE, fontWeight: 'normal', }; } } isLabelOnLeft() { const label = this.cardData.value?.label; return (this.isLabelObject(label) && label.position === 'left'); } isLabelOnRight() { const label = this.cardData.value?.label; return (this.isLabelObject(label) && label.position === 'right'); } getMetricCardContainerStyle() { return { 'min-width': this.cardData.size?.minWidth || '100%', 'max-width': this.cardData.size?.maxWidth || 'calc(25% - 16px)', width: this.cardData.size?.fixedWidth || 'auto', }; } getMetricCardStyle() { return { 'background-color': this.cardData.appearance?.backgroundColor || PTMetricCardComponent.DEFAULT_BACKGROUND_COLOR, 'min-width': this.cardData.size?.minWidth || '100%', 'max-width': this.cardData.size?.maxWidth || 'calc(25% - 16px)', width: this.cardData.size?.fixedWidth || 'auto', }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTMetricCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTMetricCardComponent, selector: "pt-metric-card", inputs: { cardData: "cardData" }, ngImport: i0, template: "<div class=\"metric-card-container\" [ngStyle]=\"getMetricCardContainerStyle()\">\n <div\n *ngIf=\"cardData.verticalLine?.show\"\n class=\"vertical-line\"\n [ngStyle]=\"{\n 'background-color': cardData.verticalLine?.color || '#5a67d8'\n }\"\n ></div>\n\n <div class=\"metric-card\" [ngStyle]=\"getMetricCardStyle()\">\n <div class=\"metric-card-header\">\n <i\n *ngIf=\"isIconObject()\"\n [ngClass]=\"getIconText()\"\n [ngStyle]=\"getIconStyles()\"\n ></i>\n <i *ngIf=\"!isIconObject()\" [ngClass]=\"cardData.icon\"></i>\n\n <span\n *ngIf=\"isTitleObject()\"\n class=\"metric-card-header-text\"\n [ngStyle]=\"getTitleStyles()\"\n >\n {{ getTitleText() }}\n </span>\n <span *ngIf=\"!isTitleObject()\" class=\"metric-card-header-text\">\n {{ cardData.title }}\n </span>\n </div>\n\n <div class=\"metric-card-content\">\n <div class=\"metric-value\" [ngStyle]=\"getValueStyles()\">\n <span\n *ngIf=\"isLabelOnLeft()\"\n class=\"value-label\"\n [ngStyle]=\"getLabelStyles('left')\"\n >\n {{ getLabelText() }}\n </span>\n\n <span [ngStyle]=\"getValueStyles()\">{{ getValueText() }}</span>\n\n <span\n *ngIf=\"isLabelOnRight()\"\n class=\"value-label\"\n [ngStyle]=\"getLabelStyles('right')\"\n >\n {{ getLabelText() }}\n </span>\n </div>\n\n <div\n *ngIf=\"cardData.divider?.show\"\n class=\"metric-divider\"\n [ngStyle]=\"{ backgroundColor: cardData.divider?.color || '#e2e8f0' }\"\n ></div>\n\n <div\n *ngIf=\"isAdditionalInfoObject()\"\n class=\"metric-additional-info\"\n [ngStyle]=\"getAdditionalInfoStyles()\"\n >\n {{ getAdditionalInfoText() }}\n </div>\n <div\n *ngIf=\"!isAdditionalInfoObject()\"\n class=\"metric-additional-info\"\n [ngStyle]=\"getAdditionalInfoStyles()\"\n >\n {{ cardData.additionalInfo }}\n </div>\n </div>\n </div>\n</div>\n", styles: [".metric-card-container{display:flex;align-items:stretch;box-sizing:border-box}.vertical-line{width:4px;border-radius:8px 0 0 8px;margin-right:-4px;z-index:2}.metric-card{background-color:#fff;border-radius:5px;box-shadow:0 1px 3px #0000001a;padding:16px;display:flex;flex-direction:column;box-sizing:border-box;margin-left:0}.metric-card-header{display:flex;align-items:center;margin-bottom:16px}.metric-card-header i.icon-text{margin-right:8px}.metric-card-content{display:flex;flex-direction:column;justify-content:space-between}.metric-number{font-weight:700}.metric-label{margin-left:8px}.metric-divider{width:100%;height:1px;margin:16px 0}.metric-additional-info{margin-top:8px}.metric-card-header-text{margin-left:6px}\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.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTMetricCardComponent, decorators: [{ type: Component, args: [{ selector: 'pt-metric-card', template: "<div class=\"metric-card-container\" [ngStyle]=\"getMetricCardContainerStyle()\">\n <div\n *ngIf=\"cardData.verticalLine?.show\"\n class=\"vertical-line\"\n [ngStyle]=\"{\n 'background-color': cardData.verticalLine?.color || '#5a67d8'\n }\"\n ></div>\n\n <div class=\"metric-card\" [ngStyle]=\"getMetricCardStyle()\">\n <div class=\"metric-card-header\">\n <i\n *ngIf=\"isIconObject()\"\n [ngClass]=\"getIconText()\"\n [ngStyle]=\"getIconStyles()\"\n ></i>\n <i *ngIf=\"!isIconObject()\" [ngClass]=\"cardData.icon\"></i>\n\n <span\n *ngIf=\"isTitleObject()\"\n class=\"metric-card-header-text\"\n [ngStyle]=\"getTitleStyles()\"\n >\n {{ getTitleText() }}\n </span>\n <span *ngIf=\"!isTitleObject()\" class=\"metric-card-header-text\">\n {{ cardData.title }}\n </span>\n </div>\n\n <div class=\"metric-card-content\">\n <div class=\"metric-value\" [ngStyle]=\"getValueStyles()\">\n <span\n *ngIf=\"isLabelOnLeft()\"\n class=\"value-label\"\n [ngStyle]=\"getLabelStyles('left')\"\n >\n {{ getLabelText() }}\n </span>\n\n <span [ngStyle]=\"getValueStyles()\">{{ getValueText() }}</span>\n\n <span\n *ngIf=\"isLabelOnRight()\"\n class=\"value-label\"\n [ngStyle]=\"getLabelStyles('right')\"\n >\n {{ getLabelText() }}\n </span>\n </div>\n\n <div\n *ngIf=\"cardData.divider?.show\"\n class=\"metric-divider\"\n [ngStyle]=\"{ backgroundColor: cardData.divider?.color || '#e2e8f0' }\"\n ></div>\n\n <div\n *ngIf=\"isAdditionalInfoObject()\"\n class=\"metric-additional-info\"\n [ngStyle]=\"getAdditionalInfoStyles()\"\n >\n {{ getAdditionalInfoText() }}\n </div>\n <div\n *ngIf=\"!isAdditionalInfoObject()\"\n class=\"metric-additional-info\"\n [ngStyle]=\"getAdditionalInfoStyles()\"\n >\n {{ cardData.additionalInfo }}\n </div>\n </div>\n </div>\n</div>\n", styles: [".metric-card-container{display:flex;align-items:stretch;box-sizing:border-box}.vertical-line{width:4px;border-radius:8px 0 0 8px;margin-right:-4px;z-index:2}.metric-card{background-color:#fff;border-radius:5px;box-shadow:0 1px 3px #0000001a;padding:16px;display:flex;flex-direction:column;box-sizing:border-box;margin-left:0}.metric-card-header{display:flex;align-items:center;margin-bottom:16px}.metric-card-header i.icon-text{margin-right:8px}.metric-card-content{display:flex;flex-direction:column;justify-content:space-between}.metric-number{font-weight:700}.metric-label{margin-left:8px}.metric-divider{width:100%;height:1px;margin:16px 0}.metric-additional-info{margin-top:8px}.metric-card-header-text{margin-left:6px}\n"] }] }], propDecorators: { cardData: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtbWV0cmljLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcHJpbWUtdG9vbHMvc3JjL2xpYi9wdC1tZXRyaWMtY2FyZC9wdC1tZXRyaWMtY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LW1ldHJpYy1jYXJkL3B0LW1ldHJpYy1jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFjakQsTUFBTSxPQUFPLHFCQUFxQjthQUNSLHVCQUFrQixHQUFHLFNBQVMsQUFBWixDQUFhO2FBQy9CLHNCQUFpQixHQUFHLE1BQU0sQUFBVCxDQUFVO2FBQzNCLHdCQUFtQixHQUFHLFNBQVMsQUFBWixDQUFhO2FBQ2hDLHVCQUFrQixHQUFHLE1BQU0sQUFBVCxDQUFVO2FBQzVCLHdCQUFtQixHQUFHLFNBQVMsQUFBWixDQUFhO2FBQ2hDLHVCQUFrQixHQUFHLE1BQU0sQUFBVCxDQUFVO2FBQzVCLHdCQUFtQixHQUFHLFNBQVMsQUFBWixDQUFhO2FBQ2hDLHVCQUFrQixHQUFHLE1BQU0sQUFBVCxDQUFVO2FBQzVCLGtDQUE2QixHQUFHLE1BQU0sQUFBVCxDQUFVO2FBQ3ZDLGlDQUE0QixHQUFHLE1BQU0sQUFBVCxDQUFVO2FBQ3RDLDZCQUF3QixHQUFHLE1BQU0sQUFBVCxDQUFVO0lBSTFELFlBQVk7UUFDVixPQUFPLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQ2hELENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQztJQUNqRCxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sT0FB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QUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLElBQUksTUFBTTtZQUNuRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxJQUFJLGtCQUFrQjtZQUMvRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLE1BQU07U0FDaEQsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTztZQUNMLGtCQUFrQixFQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxlQUFlO2dCQUN6QyxxQkFBcUIsQ0FBQyx3QkFBd0I7WUFDaEQsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxNQUFNO1lBQ25ELFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLElBQUksa0JBQWtCO1lBQy9ELEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLElBQUksTUFBTTtTQUNoRCxDQUFDO0lBQ0osQ0FBQzsrR0EvTFUscUJBQXFCO21HQUFyQixxQkFBcUIsd0ZDZGxDLGlsRUEwRUE7OzRGRDVEYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsZ0JBQWdCOzhCQWlCakIsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIExhYmVsU2V0dGluZyxcbiAgTWV0cmljQ2FyZERhdGEsXG4gIFZhbHVlU2V0dGluZyxcbiAgSWNvblN0eWxlLFxuICBUZXh0U3R5bGUsXG59IGZyb20gJy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LW1ldHJpYy1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B0LW1ldHJpYy1jYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHQtbWV0cmljLWNhcmQuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQVE1ldHJpY0NhcmRDb21wb25lbnQge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0lDT05fQ09MT1IgPSAnIzVhNjdkOCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSUNPTl9TSVpFID0gJzI0cHgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1RJVExFX0NPTE9SID0gJyM1YTY3ZDgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1RJVExFX1NJWkUgPSAnMTZweCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfVkFMVUVfQ09MT1IgPSAnIzJkMzc0OCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfVkFMVUVfU0laRSA9ICczMnB4JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MQUJFTF9DT0xPUiA9ICcjNzE4MDk2JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MQUJFTF9TSVpFID0gJzE0cHgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0FERElUSU9OQUxfSU5GT19DT0xPUiA9ICdncmF5JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BRERJVElPTkFMX0lORk9fU0laRSA9ICcxNHB4JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SID0gJyNmZmYnO1xuXG4gIEBJbnB1dCgpIGNhcmREYXRhITogTWV0cmljQ2FyZERhdGE7XG5cbiAgaXNJY29uT2JqZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5jYXJkRGF0YS5pY29uID09PSAnb2JqZWN0JztcbiAgfVxuXG4gIGlzVGl0bGVPYmplY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmNhcmREYXRhLnRpdGxlID09PSAnb2JqZWN0JztcbiAgfVxuXG4gIGlzVmFsdWVPYmplY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmNhcmREYXRhLnZhbHVlID09PSAnb2JqZWN0JztcbiAgfVxuXG4gIGlzTGFiZWxPYmplY3QobGFiZWw6IExhYmVsU2V0dGluZyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgbGFiZWwgPT09ICdvYmplY3QnO1xuICB9XG5cbiAgaXNBZGRpdGlvbmFsSW5mb09iamVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuY2FyZERhdGEuYWRkaXRpb25hbEluZm8gPT09ICdvYmplY3QnO1xuICB9XG5cbiAgZ2V0SWNvblRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0ljb25PYmplY3QoKVxuICAgICAgPyAodGhpcy5jYXJkRGF0YS5pY29uIGFzIEljb25TdHlsZSkuY29kZVxuICAgICAgOiAodGhpcy5jYXJkRGF0YS5pY29uIGFzIHN0cmluZyk7XG4gIH1cblxuICBnZXRUaXRsZVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc1RpdGxlT2JqZWN0KClcbiAgICAgID8gKHRoaXMuY2FyZERhdGEudGl0bGUgYXMgVGV4dFN0eWxlKS50ZXh0XG4gICAgICA6ICh0aGlzLmNhcmREYXRhLnRpdGxlIGFzIHN0cmluZyk7XG4gIH1cblxuICBnZXRWYWx1ZVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbHVlT2JqZWN0KClcbiAgICAgID8gKHRoaXMuY2FyZERhdGEudmFsdWUgYXMgVmFsdWVTZXR0aW5nKS50ZXh0XG4gICAgICA6ICh0aGlzLmNhcmREYXRhLnZhbHVlIGFzIHN0cmluZyk7XG4gIH1cblxuICBnZXRMYWJlbFRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbCA9ICh0aGlzLmNhcmREYXRhLnZhbHVlIGFzIFZhbHVlU2V0dGluZyk/LmxhYmVsO1xuICAgIHJldHVybiB0aGlzLmlzTGFiZWxPYmplY3QobGFiZWwpXG4gICAgICA/IChsYWJlbCBhcyBMYWJlbFNldHRpbmcpLnRleHRcbiAgICAgIDogKGxhYmVsIGFzIHN0cmluZyk7XG4gIH1cblxuICBnZXRBZGRpdGlvbmFsSW5mb1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0FkZGl0aW9uYWxJbmZvT2JqZWN0KClcbiAgICAgID8gKHRoaXMuY2FyZERhdGEuYWRkaXRpb25hbEluZm8gYXMgVGV4dFN0eWxlKS50ZXh0XG4gICAgICA6ICh0aGlzLmNhcmREYXRhLmFkZGl0aW9uYWxJbmZvIGFzIHN0cmluZyk7XG4gIH1cblxuICBnZXRJY29uU3R5bGVzKCkge1xuICAgIGlmICh0aGlzLmlzSWNvbk9iamVjdCgpKSB7XG4gICAgICBjb25zdCBpY29uID0gdGhpcy5jYXJkRGF0YS5pY29uIGFzIEljb25TdHlsZTtcbiAgICAgIGNvbnN0IHNoYXBlID0gaWNvbi5zaGFwZSB8fCAnY2lyY3VsYXInOyAvLyBEZWZhdWx0IHRvICdjaXJjdWxhcicgaWYgbm90IHNwZWNpZmllZFxuXG4gICAgICAvLyBEZXRlcm1pbmUgYm9yZGVyIHJhZGl1cyBiYXNlZCBvbiBzaGFwZVxuICAgICAgY29uc3QgYm9yZGVyUmFkaXVzID0gc2hhcGUgPT09ICdjaXJjdWxhcicgPyAnNTAlJyA6ICc4cHgnO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogaWNvbi5jb2xvciB8fCBQVE1ldHJpY0NhcmRDb21wb25lbnQuREVGQVVMVF9JQ09OX0NPTE9SLFxuICAgICAgICBmb250U2l6ZTogaWNvbi5mb250U2l6ZSB8fCBQVE1ldHJpY0NhcmRDb21wb25lbnQuREVGQVVMVF9JQ09OX1NJWkUsXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogaWNvbi5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiBib3JkZXJSYWRpdXMsXG4gICAgICAgIHBhZGRpbmc6ICc2cHgnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGdldFRpdGxlU3R5bGVzKCkge1xuICAgIGlmICh0aGlzLmlzVGl0bGVPYmplY3QoKSkge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmNhcmREYXRhLnRpdGxlIGFzIFRleHRTdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiB0aXRsZS5jb2xvciB8fCBQVE1ldHJpY0NhcmRDb21wb25lbnQuREVGQVVMVF9USVRMRV9DT0xPUixcbiAgICAgICAgZm9udFNpemU6IHRpdGxlLmZvbnRTaXplIHx8IFBUTWV0cmljQ2FyZENvbXBvbmVudC5ERUZBVUxUX1RJVExFX1NJWkUsXG4gICAgICAgIGZvbnRXZWlnaHQ6IHRpdGxlLmZvbnRXZWlnaHQgfHwgJ25vcm1hbCcsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBnZXRWYWx1ZVN0eWxlcygpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlT2JqZWN0KCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jYXJkRGF0YS52YWx1ZSBhcyBWYWx1ZVNldHRpbmc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogdmFsdWUuY29sb3IgfHwgUFRNZXRyaWNDYXJkQ29tcG9uZW50LkRFRkFVTFRfVkFMVUVfQ09MT1IsXG4gICAgICAgIGZvbnRTaXplOiB2YWx1ZS5mb250U2l6ZSB8fCBQVE1ldHJpY0NhcmRDb21wb25lbnQuREVGQVVMVF9WQUxVRV9TSVpFLFxuICAgICAgICBmb250V2VpZ2h0OiB2YWx1ZS5mb250V2VpZ2h0IHx8ICdib2xkJyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiBQVE1ldHJpY0NhcmRDb21wb25lbnQuREVGQVVMVF9WQUxVRV9DT0xPUixcbiAgICAgICAgZm9udFNpemU6IFBUTWV0cmljQ2FyZENvbXBvbmVudC5ERUZBVUxUX1ZBTFVFX1NJWkUsXG4gICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZ2V0TGFiZWxTdHlsZXMocG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICBjb25zdCBsYWJlbCA9ICh0aGlzLmNhcmREYXRhLnZhbHVlIGFzIFZhbHVlU2V0dGluZyk/LmxhYmVsO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMYWJlbE9iamVjdChsYWJlbCkgJiZcbiAgICAgIChsYWJlbCBhcyBMYWJlbFNldHRpbmcpLnBvc2l0aW9uID09PSBwb3NpdGlvblxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sb3I6XG4gICAgICAgICAgKGxhYmVsIGFzIExhYmVsU2V0dGluZykuY29sb3IgfHxcbiAgICAgICAgICBQVE1ldHJpY0NhcmRDb21wb25lbnQuREVGQVVMVF9MQUJFTF9DT0xPUixcbiAgICAgICAgZm9udFNpemU6XG4gICAgICAgICAgKGxhYmVsIGFzIExhYmVsU2V0dGluZykuZm9udFNpemUgfHxcbiAgICAgICAgICBQVE1ldHJpY0NhcmRDb21wb25lbnQuREVGQVVMVF9MQUJFTF9TSVpFLFxuICAgICAgICBmb250V2VpZ2h0OiAobGFiZWwgYXMgTGFiZWxTZXR0aW5nKS5mb250V2VpZ2h0IHx8ICdub3JtYWwnLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sb3I6IFBUTWV0cmljQ2FyZENvbXBvbmVudC5ERUZBVUxUX0xBQkVMX0NPTE9SLFxuICAgICAgICBmb250U2l6ZTogUFRNZXRyaWNDYXJkQ29tcG9uZW50LkRFRkFVTFRfTEFCRUxfU0laRSxcbiAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGdldEFkZGl0aW9uYWxJbmZvU3R5bGVzKCkge1xuICAgIGlmICh0aGlzLmlzQWRkaXRpb25hbEluZm9PYmplY3QoKSkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbEluZm8gPSB0aGlzLmNhcmREYXRhLmFkZGl0aW9uYWxJbmZvIGFzIFRleHRTdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOlxuICAgICAgICAgIGFkZGl0aW9uYWxJbmZvLmNvbG9yIHx8XG4gICAgICAgICAgUFRNZXRyaWNDYXJkQ29tcG9uZW50LkRFRkFVTFRfQURESVRJT05BTF9JTkZPX0NPTE9SLFxuICAgICAgICBmb250U2l6ZTpcbiAgICAgICAgICBhZGRpdGlvbmFsSW5mby5mb250U2l6ZSB8fFxuICAgICAgICAgIFBUTWV0cmljQ2FyZENvbXBvbmVudC5ERUZBVUxUX0FERElUSU9OQUxfSU5GT19TSVpFLFxuICAgICAgICBmb250V2VpZ2h0OiBhZGRpdGlvbmFsSW5mby5mb250V2VpZ2h0IHx8ICdub3JtYWwnLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sb3I6IFBUTWV0cmljQ2FyZENvbXBvbmVudC5ERUZBVUxUX0FERElUSU9OQUxfSU5GT19DT0xPUixcbiAgICAgICAgZm9udFNpemU6IFBUTWV0cmljQ2FyZENvbXBvbmVudC5ERUZBVUxUX0FERElUSU9OQUxfSU5GT19TSVpFLFxuICAgICAgICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaXNMYWJlbE9uTGVmdCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBsYWJlbCA9ICh0aGlzLmNhcmREYXRhLnZhbHVlIGFzIFZhbHVlU2V0dGluZyk/LmxhYmVsO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzTGFiZWxPYmplY3QobGFiZWwpICYmIChsYWJlbCBhcyBMYWJlbFNldHRpbmcpLnBvc2l0aW9uID09PSAnbGVmdCdcbiAgICApO1xuICB9XG5cbiAgaXNMYWJlbE9uUmlnaHQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGFiZWwgPSAodGhpcy5jYXJkRGF0YS52YWx1ZSBhcyBWYWx1ZVNldHRpbmcpPy5sYWJlbDtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0xhYmVsT2JqZWN0KGxhYmVsKSAmJiAobGFiZWwgYXMgTGFiZWxTZXR0aW5nKS5wb3NpdGlvbiA9PT0gJ3JpZ2h0J1xuICAgICk7XG4gIH1cblxuICBnZXRNZXRyaWNDYXJkQ29udGFpbmVyU3R5bGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdtaW4td2lkdGgnOiB0aGlzLmNhcmREYXRhLnNpemU/Lm1pbldpZHRoIHx8ICcxMDAlJyxcbiAgICAgICdtYXgtd2lkdGgnOiB0aGlzLmNhcmREYXRhLnNpemU/Lm1heFdpZHRoIHx8ICdjYWxjKDI1JSAtIDE2cHgpJyxcbiAgICAgIHdpZHRoOiB0aGlzLmNhcmREYXRhLnNpemU/LmZpeGVkV2lkdGggfHwgJ2F1dG8nLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXRyaWNDYXJkU3R5bGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzpcbiAgICAgICAgdGhpcy5jYXJkRGF0YS5hcHBlYXJhbmNlPy5iYWNrZ3JvdW5kQ29sb3IgfHxcbiAgICAgICAgUFRNZXRyaWNDYXJkQ29tcG9uZW50LkRFRkFVTFRfQkFDS0dST1VORF9DT0xPUixcbiAgICAgICdtaW4td2lkdGgnOiB0aGlzLmNhcmREYXRhLnNpemU/Lm1pbldpZHRoIHx8ICcxMDAlJyxcbiAgICAgICdtYXgtd2lkdGgnOiB0aGlzLmNhcmREYXRhLnNpemU/Lm1heFdpZHRoIHx8ICdjYWxjKDI1JSAtIDE2cHgpJyxcbiAgICAgIHdpZHRoOiB0aGlzLmNhcmREYXRhLnNpemU/LmZpeGVkV2lkdGggfHwgJ2F1dG8nLFxuICAgIH07XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRyaWMtY2FyZC1jb250YWluZXJcIiBbbmdTdHlsZV09XCJnZXRNZXRyaWNDYXJkQ29udGFpbmVyU3R5bGUoKVwiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJjYXJkRGF0YS52ZXJ0aWNhbExpbmU/LnNob3dcIlxuICAgIGNsYXNzPVwidmVydGljYWwtbGluZVwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBjYXJkRGF0YS52ZXJ0aWNhbExpbmU/LmNvbG9yIHx8ICcjNWE2N2Q4J1xuICAgIH1cIlxuICA+PC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkXCIgW25nU3R5bGVdPVwiZ2V0TWV0cmljQ2FyZFN0eWxlKClcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtaGVhZGVyXCI+XG4gICAgICA8aVxuICAgICAgICAqbmdJZj1cImlzSWNvbk9iamVjdCgpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SWNvblRleHQoKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEljb25TdHlsZXMoKVwiXG4gICAgICA+PC9pPlxuICAgICAgPGkgKm5nSWY9XCIhaXNJY29uT2JqZWN0KClcIiBbbmdDbGFzc109XCJjYXJkRGF0YS5pY29uXCI+PC9pPlxuXG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cImlzVGl0bGVPYmplY3QoKVwiXG4gICAgICAgIGNsYXNzPVwibWV0cmljLWNhcmQtaGVhZGVyLXRleHRcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRUaXRsZVN0eWxlcygpXCJcbiAgICAgID5cbiAgICAgICAge3sgZ2V0VGl0bGVUZXh0KCkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWlzVGl0bGVPYmplY3QoKVwiIGNsYXNzPVwibWV0cmljLWNhcmQtaGVhZGVyLXRleHRcIj5cbiAgICAgICAge3sgY2FyZERhdGEudGl0bGUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtY2FyZC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXZhbHVlXCIgW25nU3R5bGVdPVwiZ2V0VmFsdWVTdHlsZXMoKVwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiaXNMYWJlbE9uTGVmdCgpXCJcbiAgICAgICAgICBjbGFzcz1cInZhbHVlLWxhYmVsXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlcygnbGVmdCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldExhYmVsVGV4dCgpIH19XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJnZXRWYWx1ZVN0eWxlcygpXCI+e3sgZ2V0VmFsdWVUZXh0KCkgfX08L3NwYW4+XG5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdJZj1cImlzTGFiZWxPblJpZ2h0KClcIlxuICAgICAgICAgIGNsYXNzPVwidmFsdWUtbGFiZWxcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGVzKCdyaWdodCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldExhYmVsVGV4dCgpIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiY2FyZERhdGEuZGl2aWRlcj8uc2hvd1wiXG4gICAgICAgIGNsYXNzPVwibWV0cmljLWRpdmlkZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmRDb2xvcjogY2FyZERhdGEuZGl2aWRlcj8uY29sb3IgfHwgJyNlMmU4ZjAnIH1cIlxuICAgICAgPjwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiaXNBZGRpdGlvbmFsSW5mb09iamVjdCgpXCJcbiAgICAgICAgY2xhc3M9XCJtZXRyaWMtYWRkaXRpb25hbC1pbmZvXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0QWRkaXRpb25hbEluZm9TdHlsZXMoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGdldEFkZGl0aW9uYWxJbmZvVGV4dCgpIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIhaXNBZGRpdGlvbmFsSW5mb09iamVjdCgpXCJcbiAgICAgICAgY2xhc3M9XCJtZXRyaWMtYWRkaXRpb25hbC1pbmZvXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0QWRkaXRpb25hbEluZm9TdHlsZXMoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGNhcmREYXRhLmFkZGl0aW9uYWxJbmZvIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==