@ruc-lib/metered-progress-bar 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/esm2020/lib/ruc-metered-progress-bar/ruc-metered-progress-bar.component.mjs +4 -3
- package/esm2020/lib/ruclib-metered-progress-bar.module.mjs +5 -5
- package/esm2020/ruc-lib-metered-progress-bar.mjs +5 -0
- package/fesm2015/ruc-lib-metered-progress-bar.mjs +231 -0
- package/fesm2015/ruc-lib-metered-progress-bar.mjs.map +1 -0
- package/fesm2020/ruc-lib-metered-progress-bar.mjs +230 -0
- package/fesm2020/ruc-lib-metered-progress-bar.mjs.map +1 -0
- package/lib/ruclib-metered-progress-bar.module.d.ts +2 -1
- package/package.json +11 -11
- package/esm2020/ruc-lib-meteredProgressBar.mjs +0 -5
- package/fesm2015/ruc-lib-meteredProgressBar.mjs +0 -230
- package/fesm2015/ruc-lib-meteredProgressBar.mjs.map +0 -1
- package/fesm2020/ruc-lib-meteredProgressBar.mjs +0 -229
- package/fesm2020/ruc-lib-meteredProgressBar.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ npm install @uxpractice/ruc-lib
|
|
|
14
14
|
### Install Individual Component
|
|
15
15
|
If you only need the Metered Progress Bar component:
|
|
16
16
|
```bash
|
|
17
|
-
npm install @
|
|
17
|
+
npm install @ruc-lib/metered-progress-bar
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
## Usage
|
|
@@ -23,16 +23,20 @@ npm install @uxpractice/metered-progress-bar
|
|
|
23
23
|
In your Angular module file (e.g., `app.module.ts`), import the `RucMeteredProgressBarModule`:
|
|
24
24
|
|
|
25
25
|
```typescript
|
|
26
|
-
import { RucMeteredProgressBarModule } from '@
|
|
26
|
+
import { RucMeteredProgressBarModule } from '@ruc-lib/metered-progress-bar';
|
|
27
27
|
import { AppComponent } from './app.component';
|
|
28
28
|
import { NgModule } from '@angular/core';
|
|
29
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
30
|
+
import { MatCardModule } from '@angular/material/card';
|
|
29
31
|
import { BrowserModule } from '@angular/platform-browser';
|
|
30
32
|
|
|
31
33
|
@NgModule({
|
|
32
34
|
declarations: [AppComponent],
|
|
33
35
|
imports: [
|
|
34
36
|
BrowserModule,
|
|
35
|
-
RucMeteredProgressBarModule
|
|
37
|
+
RucMeteredProgressBarModule,
|
|
38
|
+
MatIconModule,
|
|
39
|
+
MatCardModule
|
|
36
40
|
],
|
|
37
41
|
providers: [],
|
|
38
42
|
bootstrap: [AppComponent]
|
|
@@ -3,6 +3,7 @@ import { MeteredBarConfig } from '../model/metered-bar.config';
|
|
|
3
3
|
import { LablePositionEnums } from '../enums/lable-position.enum';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "@angular/material/card";
|
|
6
7
|
export class RucMeteredProgressBarComponent {
|
|
7
8
|
constructor() {
|
|
8
9
|
this.hoveredCategoryDetail = null;
|
|
@@ -181,13 +182,13 @@ export class RucMeteredProgressBarComponent {
|
|
|
181
182
|
}
|
|
182
183
|
}
|
|
183
184
|
RucMeteredProgressBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RucMeteredProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
184
|
-
RucMeteredProgressBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RucMeteredProgressBarComponent, selector: "uxp-ruc-metered-progress-bar", inputs: { rucInputData: "rucInputData", customTheme: "customTheme" }, ngImport: i0, template: "<div class=\"progress-container\" class={{customTheme}} [class.vertical]=\"isVertical\" [class.horizontal]=\"!isVertical\">\r\n <div class=\"progress-bar\">\r\n <!-- Removed (mouseenter) and (mouseleave) from progress-bar if only category hover is needed -->\r\n <div *ngIf=\"rucInputData.barLabels\" class=\"progress-label-container {{rucInputData.orientation}}\">\r\n <span class=\"progress-label\">{{progress | number:'1.0-0'}}% of {{rucInputData.max}} {{rucInputData.unitType}}\r\n Used</span>\r\n </div>\r\n <div class=\"progress\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\"\r\n [style.transition]=\"rucInputData.orientation === 'vertical' ? 'height 0.3s ease' : 'width 0.3s ease'\"\r\n [ngStyle]=\"progressStyles\">\r\n <!-- This div is now only for displaying the colored bar -->\r\n </div>\r\n <!-- The hover label is now a sibling to .progress, positioned absolutely within .progress-bar -->\r\n <div class=\"hover-label\" *ngIf=\"hoveredCategoryDetail\" [ngStyle]=\"hoverLabelStyle\">\r\n {{hoveredCategoryDetail.category.label}}: {{hoveredCategoryDetail.percentageText}}\r\n </div>\r\n <!-- This overlay is now a sibling to .progress, sized to match it, to reliably capture mouse events -->\r\n <div class=\"progress-event-overlay\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\" (mousemove)=\"onProgressMouseMove($event)\"\r\n (mouseleave)=\"onProgressMouseLeave()\"></div>\r\n </div>\r\n <div class=\"categories-container\" *ngIf=\"rucInputData.categories.length > 0\">\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'basic'\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === 'top' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same')\r\n }\" class=\"categories\">\r\n <div class=\"category\" *ngFor=\"let category of rucInputData.categories\" [style.color]=\"category.color\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotBasic\" class=\"category-icon-wrapper\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotBasic>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <span class=\"category-label\">{{category.label}}</span>\r\n <span class=\"category-value\">({{(category.value / rucInputData.max * 100) | number:'1.0-0' }}%)</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'widget'\"\r\n class=\"categories widget-style\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.top || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same)\r\n }\">\r\n <ng-container *ngFor=\"let category of rucInputData.categories\">\r\n <div class=\"widget-category\">\r\n <div class=\"widget-content\">\r\n <div class=\"widget-icon-box\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotWidget\" class=\"widget-icon\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotWidget>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"widget-label\">{{category.label}}</div>\r\n </div>\r\n </div>\r\n <div class=\"widget-value\">\r\n <div>{{category.value}}</div>\r\n </div>\r\n </div>\r\n\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".progress-container{position:relative;margin:20px 0}.progress-container.horizontal{width:100%;height:35px}.progress-container.horizontal .progress-bar{width:100%;height:42%}.progress-container.vertical{width:60px;height:320px;margin:0 auto}.progress-container.vertical .progress-bar{width:24%;height:100%}.progress-label-container{position:absolute;z-index:2;width:100%;height:100%;pointer-events:none;display:flex}.progress-label-container.horizontal{justify-content:right;align-items:flex-end;bottom:15px}.progress-label-container.vertical{justify-content:flex-start;align-items:flex-end;left:35px}.progress-label{padding:2px 5px;font-size:12px;color:#333;white-space:nowrap}.progress-label-container.horizontal .progress-label{margin-top:5px;margin-right:5px}.progress-label-container.vertical .progress-label{transform:rotate(-90deg);transform-origin:bottom left;margin-right:5px}.progress-bar{position:relative;background:white;border:1px solid #e0e0e0;border-radius:4px}.progress-bar .hover-label{position:absolute;top:-28px;left:50%;transform:translate(-50%);background-color:#000c;color:#fff;padding:4px 8px;border-radius:4px;font-size:.8em;z-index:5;white-space:nowrap;pointer-events:none}.progress-event-overlay{position:absolute;top:0;left:0;z-index:4}.progress{position:relative;background:#2196F3;transition:width .3s ease,height .3s ease}.progress-bar.horizontal .progress{width:100%;height:100%}.progress-bar.vertical .progress{width:100%;height:0}.icons-container{position:absolute;display:flex;justify-content:space-between;width:100%;height:100%;align-items:center}.icons-container i{position:absolute;font-size:1.2em;color:#fff}.start-icon{left:0}.end-icon{right:0}.above-threshold{color:gold}.categories-container{width:100%;box-sizing:border-box}.categories{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px}.categories-block-top,.categories-block-bottom,.categories-block-left,.categories-block-right{position:absolute;z-index:1}.categories-block-top{bottom:100%;left:0;padding-bottom:8px}.categories-block-bottom{top:100%;left:0;padding-top:10px}.categories-block-left{right:100%;top:0;padding-right:8px;width:200px}.categories-block-left .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.categories-block-right{left:100%;top:0;padding-left:8px;width:200px}.categories-block-right .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.category{display:flex;align-items:center;gap:6px;padding:8px;border-radius:4px}.category-label{font-weight:500}.category-value{color:#666;font-size:.9em}.category-color{width:10px;height:10px;border-radius:50%;overflow:hidden;flex-shrink:0}.category-icon-wrapper{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.color-gradient{width:100%;height:100%}.categories.widget-style{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-start;align-items:flex-start;margin:10px 0}.categories.widget-style .widget-category{width:calc(25% - 7.5px);min-width:159px;box-sizing:border-box;flex-shrink:0;flex-grow:0}@media (max-width: 1200px){.categories.widget-style .widget-category{width:calc(33.33% - 6.66px)}}@media (max-width: 768px){.categories.widget-style .widget-category{width:calc(50% - 5px)}}@media (max-width: 480px){.categories.widget-style .widget-category{width:100%}}.categories-block-left,.categories-block-right{flex-direction:inherit;align-items:flex-start;gap:10px}.categories-block-left .widget-category,.categories-block-right .widget-category{width:100%;max-width:none}.widget-category{background-color:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:10px 15px;box-shadow:0 2px 4px #0000001a}.widget-content{display:flex;width:100%;align-items:center;margin:0}.widget-icon{border:1px solid #ddd;border-radius:10px;width:35px;height:35px;line-height:45px;text-align:center;background-color:#fdfdfd}.widget-content .category-color{margin-right:35px}.widget-icon,.widget-color{margin-right:8px;flex-shrink:0}.widget-color{width:24px;height:24px;border-radius:50%}.widget-label{flex-grow:1;text-align:left;display:block}.widget-value{font-weight:700;flex-shrink:0;margin-left:45px;text-align:left;margin-top:5px}.widget-icon-box{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
185
|
+
RucMeteredProgressBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RucMeteredProgressBarComponent, selector: "uxp-ruc-metered-progress-bar", inputs: { rucInputData: "rucInputData", customTheme: "customTheme" }, ngImport: i0, template: "<div class=\"progress-container\" class={{customTheme}} [class.vertical]=\"isVertical\" [class.horizontal]=\"!isVertical\">\r\n <div class=\"progress-bar\">\r\n <!-- Removed (mouseenter) and (mouseleave) from progress-bar if only category hover is needed -->\r\n <div *ngIf=\"rucInputData.barLabels\" class=\"progress-label-container {{rucInputData.orientation}}\">\r\n <p class=\"progress-label\">{{progress | number:'1.0-0'}}% of {{rucInputData.max}} {{rucInputData.unitType}}\r\n Used</p>\r\n </div>\r\n <!-- <mat-progress-bar> -->\r\n <div class=\"progress\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\"\r\n [style.transition]=\"rucInputData.orientation === 'vertical' ? 'height 0.3s ease' : 'width 0.3s ease'\"\r\n [ngStyle]=\"progressStyles\">\r\n <!-- This div is now only for displaying the colored bar -->\r\n </div>\r\n <!-- </mat-progress-bar> -->\r\n <!-- The hover label is now a sibling to .progress, positioned absolutely within .progress-bar -->\r\n <div class=\"hover-label\" *ngIf=\"hoveredCategoryDetail\" [ngStyle]=\"hoverLabelStyle\">\r\n {{hoveredCategoryDetail.category.label}}: {{hoveredCategoryDetail.percentageText}}\r\n </div>\r\n <!-- This overlay is now a sibling to .progress, sized to match it, to reliably capture mouse events -->\r\n <div class=\"progress-event-overlay\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\" (mousemove)=\"onProgressMouseMove($event)\"\r\n (mouseleave)=\"onProgressMouseLeave()\"></div>\r\n </div>\r\n <div class=\"categories-container\" *ngIf=\"rucInputData.categories.length > 0\">\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'basic'\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === 'top' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same')\r\n }\" class=\"categories\">\r\n <div class=\"category\" *ngFor=\"let category of rucInputData.categories\" [style.color]=\"category.color\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotBasic\" class=\"category-icon-wrapper\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotBasic>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <span class=\"category-label\">{{category.label}}</span>\r\n <p class=\"category-value\">({{(category.value / rucInputData.max * 100) | number:'1.0-0' }}%)</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'widget'\"\r\n class=\"categories widget-style\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.top || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same)\r\n }\">\r\n <ng-container *ngFor=\"let category of rucInputData.categories\">\r\n <mat-card>\r\n <div class=\"widget-category\">\r\n <div class=\"widget-content\">\r\n <div class=\"widget-icon-box\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotWidget\" class=\"widget-icon\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotWidget>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"widget-label\">{{category.label}}</div>\r\n </div>\r\n </div>\r\n <div class=\"widget-value\">\r\n <div>{{category.value}}</div>\r\n </div>\r\n </div>\r\n </mat-card>\r\n\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".progress-container{position:relative;margin:20px 0}.progress-container.horizontal{width:100%;height:35px}.progress-container.horizontal .progress-bar{width:100%;height:42%}.progress-container.vertical{width:60px;height:320px;margin:0 auto}.progress-container.vertical .progress-bar{width:24%;height:100%}.progress-label-container{position:absolute;z-index:2;width:100%;height:100%;pointer-events:none;display:flex}.progress-label-container.horizontal{justify-content:right;align-items:flex-end;bottom:15px}.progress-label-container.vertical{justify-content:flex-start;align-items:flex-end;left:35px}.progress-label{padding:2px 5px;font-size:12px;white-space:nowrap}.progress-label-container.horizontal .progress-label{margin-top:5px;margin-right:5px}.progress-label-container.vertical .progress-label{transform:rotate(-90deg);transform-origin:bottom left;margin-right:5px}.progress-bar{position:relative;border:1px solid #e0e0e0;border-radius:4px}.progress-bar .hover-label{position:absolute;top:-28px;left:50%;transform:translate(-50%);background-color:#000c;color:#fff;padding:4px 8px;border-radius:4px;font-size:.8em;z-index:5;white-space:nowrap;pointer-events:none}.progress-event-overlay{position:absolute;top:0;left:0;z-index:4}.progress{position:relative;background:#2196F3;transition:width .3s ease,height .3s ease}.progress-bar.horizontal .progress{width:100%;height:100%}.progress-bar.vertical .progress{width:100%;height:0}.icons-container{position:absolute;display:flex;justify-content:space-between;width:100%;height:100%;align-items:center}.icons-container i{position:absolute;font-size:1.2em;color:#fff}.start-icon{left:0}.end-icon{right:0}.above-threshold{color:gold}.categories-container{width:100%;box-sizing:border-box}.categories{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px}.categories-block-top,.categories-block-bottom,.categories-block-left,.categories-block-right{position:absolute;z-index:1}.categories-block-top{bottom:100%;left:0;padding-bottom:8px}.categories-block-bottom{top:100%;left:0;padding-top:10px}.categories-block-left{right:100%;top:0;padding-right:8px;width:200px}.categories-block-left .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.categories-block-right{left:100%;top:0;padding-left:8px;width:200px}.categories-block-right .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.category{display:flex;align-items:center;gap:6px;padding:8px;border-radius:4px}.category-label{font-weight:500}.category-value{font-size:.9em}.category-color{width:10px;height:10px;border-radius:50%;overflow:hidden;flex-shrink:0}.category-icon-wrapper{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.color-gradient{width:100%;height:100%}.categories.widget-style{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-start;align-items:flex-start;margin:10px 0}.categories.widget-style .widget-category{width:calc(25% - 7.5px);min-width:159px;box-sizing:border-box;flex-shrink:0;flex-grow:0}@media (max-width: 1200px){.categories.widget-style .widget-category{width:calc(33.33% - 6.66px)}}@media (max-width: 768px){.categories.widget-style .widget-category{width:calc(50% - 5px)}}@media (max-width: 480px){.categories.widget-style .widget-category{width:100%}}.categories-block-left,.categories-block-right{flex-direction:inherit;align-items:flex-start;gap:10px}.categories-block-left .widget-category,.categories-block-right .widget-category{width:100%;max-width:none}.widget-category{padding:10px 15px}.widget-content{display:flex;width:100%;align-items:center;margin:0}.widget-icon{border:1px solid #ddd;border-radius:10px;width:35px;height:35px;line-height:45px;text-align:center;background-color:#fdfdfd}.widget-content .category-color{margin-right:35px}.widget-icon,.widget-color{margin-right:8px;flex-shrink:0}.widget-color{width:24px;height:24px;border-radius:50%}.widget-label{flex-grow:1;text-align:left;display:block}.widget-value{font-weight:700;flex-shrink:0;margin-left:45px;text-align:left;margin-top:5px}.widget-icon-box{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
185
186
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RucMeteredProgressBarComponent, decorators: [{
|
|
186
187
|
type: Component,
|
|
187
|
-
args: [{ selector: 'uxp-ruc-metered-progress-bar', template: "<div class=\"progress-container\" class={{customTheme}} [class.vertical]=\"isVertical\" [class.horizontal]=\"!isVertical\">\r\n <div class=\"progress-bar\">\r\n <!-- Removed (mouseenter) and (mouseleave) from progress-bar if only category hover is needed -->\r\n <div *ngIf=\"rucInputData.barLabels\" class=\"progress-label-container {{rucInputData.orientation}}\">\r\n <
|
|
188
|
+
args: [{ selector: 'uxp-ruc-metered-progress-bar', template: "<div class=\"progress-container\" class={{customTheme}} [class.vertical]=\"isVertical\" [class.horizontal]=\"!isVertical\">\r\n <div class=\"progress-bar\">\r\n <!-- Removed (mouseenter) and (mouseleave) from progress-bar if only category hover is needed -->\r\n <div *ngIf=\"rucInputData.barLabels\" class=\"progress-label-container {{rucInputData.orientation}}\">\r\n <p class=\"progress-label\">{{progress | number:'1.0-0'}}% of {{rucInputData.max}} {{rucInputData.unitType}}\r\n Used</p>\r\n </div>\r\n <!-- <mat-progress-bar> -->\r\n <div class=\"progress\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\"\r\n [style.transition]=\"rucInputData.orientation === 'vertical' ? 'height 0.3s ease' : 'width 0.3s ease'\"\r\n [ngStyle]=\"progressStyles\">\r\n <!-- This div is now only for displaying the colored bar -->\r\n </div>\r\n <!-- </mat-progress-bar> -->\r\n <!-- The hover label is now a sibling to .progress, positioned absolutely within .progress-bar -->\r\n <div class=\"hover-label\" *ngIf=\"hoveredCategoryDetail\" [ngStyle]=\"hoverLabelStyle\">\r\n {{hoveredCategoryDetail.category.label}}: {{hoveredCategoryDetail.percentageText}}\r\n </div>\r\n <!-- This overlay is now a sibling to .progress, sized to match it, to reliably capture mouse events -->\r\n <div class=\"progress-event-overlay\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\" (mousemove)=\"onProgressMouseMove($event)\"\r\n (mouseleave)=\"onProgressMouseLeave()\"></div>\r\n </div>\r\n <div class=\"categories-container\" *ngIf=\"rucInputData.categories.length > 0\">\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'basic'\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === 'top' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same')\r\n }\" class=\"categories\">\r\n <div class=\"category\" *ngFor=\"let category of rucInputData.categories\" [style.color]=\"category.color\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotBasic\" class=\"category-icon-wrapper\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotBasic>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <span class=\"category-label\">{{category.label}}</span>\r\n <p class=\"category-value\">({{(category.value / rucInputData.max * 100) | number:'1.0-0' }}%)</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'widget'\"\r\n class=\"categories widget-style\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.top || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same)\r\n }\">\r\n <ng-container *ngFor=\"let category of rucInputData.categories\">\r\n <mat-card>\r\n <div class=\"widget-category\">\r\n <div class=\"widget-content\">\r\n <div class=\"widget-icon-box\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotWidget\" class=\"widget-icon\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotWidget>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"widget-label\">{{category.label}}</div>\r\n </div>\r\n </div>\r\n <div class=\"widget-value\">\r\n <div>{{category.value}}</div>\r\n </div>\r\n </div>\r\n </mat-card>\r\n\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".progress-container{position:relative;margin:20px 0}.progress-container.horizontal{width:100%;height:35px}.progress-container.horizontal .progress-bar{width:100%;height:42%}.progress-container.vertical{width:60px;height:320px;margin:0 auto}.progress-container.vertical .progress-bar{width:24%;height:100%}.progress-label-container{position:absolute;z-index:2;width:100%;height:100%;pointer-events:none;display:flex}.progress-label-container.horizontal{justify-content:right;align-items:flex-end;bottom:15px}.progress-label-container.vertical{justify-content:flex-start;align-items:flex-end;left:35px}.progress-label{padding:2px 5px;font-size:12px;white-space:nowrap}.progress-label-container.horizontal .progress-label{margin-top:5px;margin-right:5px}.progress-label-container.vertical .progress-label{transform:rotate(-90deg);transform-origin:bottom left;margin-right:5px}.progress-bar{position:relative;border:1px solid #e0e0e0;border-radius:4px}.progress-bar .hover-label{position:absolute;top:-28px;left:50%;transform:translate(-50%);background-color:#000c;color:#fff;padding:4px 8px;border-radius:4px;font-size:.8em;z-index:5;white-space:nowrap;pointer-events:none}.progress-event-overlay{position:absolute;top:0;left:0;z-index:4}.progress{position:relative;background:#2196F3;transition:width .3s ease,height .3s ease}.progress-bar.horizontal .progress{width:100%;height:100%}.progress-bar.vertical .progress{width:100%;height:0}.icons-container{position:absolute;display:flex;justify-content:space-between;width:100%;height:100%;align-items:center}.icons-container i{position:absolute;font-size:1.2em;color:#fff}.start-icon{left:0}.end-icon{right:0}.above-threshold{color:gold}.categories-container{width:100%;box-sizing:border-box}.categories{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px}.categories-block-top,.categories-block-bottom,.categories-block-left,.categories-block-right{position:absolute;z-index:1}.categories-block-top{bottom:100%;left:0;padding-bottom:8px}.categories-block-bottom{top:100%;left:0;padding-top:10px}.categories-block-left{right:100%;top:0;padding-right:8px;width:200px}.categories-block-left .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.categories-block-right{left:100%;top:0;padding-left:8px;width:200px}.categories-block-right .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.category{display:flex;align-items:center;gap:6px;padding:8px;border-radius:4px}.category-label{font-weight:500}.category-value{font-size:.9em}.category-color{width:10px;height:10px;border-radius:50%;overflow:hidden;flex-shrink:0}.category-icon-wrapper{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.color-gradient{width:100%;height:100%}.categories.widget-style{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-start;align-items:flex-start;margin:10px 0}.categories.widget-style .widget-category{width:calc(25% - 7.5px);min-width:159px;box-sizing:border-box;flex-shrink:0;flex-grow:0}@media (max-width: 1200px){.categories.widget-style .widget-category{width:calc(33.33% - 6.66px)}}@media (max-width: 768px){.categories.widget-style .widget-category{width:calc(50% - 5px)}}@media (max-width: 480px){.categories.widget-style .widget-category{width:100%}}.categories-block-left,.categories-block-right{flex-direction:inherit;align-items:flex-start;gap:10px}.categories-block-left .widget-category,.categories-block-right .widget-category{width:100%;max-width:none}.widget-category{padding:10px 15px}.widget-content{display:flex;width:100%;align-items:center;margin:0}.widget-icon{border:1px solid #ddd;border-radius:10px;width:35px;height:35px;line-height:45px;text-align:center;background-color:#fdfdfd}.widget-content .category-color{margin-right:35px}.widget-icon,.widget-color{margin-right:8px;flex-shrink:0}.widget-color{width:24px;height:24px;border-radius:50%}.widget-label{flex-grow:1;text-align:left;display:block}.widget-value{font-weight:700;flex-shrink:0;margin-left:45px;text-align:left;margin-top:5px}.widget-icon-box{display:flex;align-items:center}\n"] }]
|
|
188
189
|
}], propDecorators: { rucInputData: [{
|
|
189
190
|
type: Input
|
|
190
191
|
}], customTheme: [{
|
|
191
192
|
type: Input
|
|
192
193
|
}] } });
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyL3J1Yy1tZXRlcmVkLXByb2dyZXNzLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Yy1tZXRlcmVkLXByb2dyZXNzLWJhci9ydWMtbWV0ZXJlZC1wcm9ncmVzcy1iYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFrQixnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7QUFVbEUsTUFBTSxPQUFPLDhCQUE4QjtJQVAzQztRQVVFLDBCQUFxQixHQUFnRSxJQUFJLENBQUM7UUFDMUYsb0JBQWUsR0FBdUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUNwSyx1QkFBa0IsR0FBRyxDQUFDLENBQUM7S0F5THhCO0lBeExDOzs7T0FHRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksUUFBUTtRQUNWLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxD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LEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhdGVnb3J5Q29uZmlnLCBNZXRlcmVkQmFyQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWwvbWV0ZXJlZC1iYXIuY29uZmlnJztcclxuaW1wb3J0IHsgTGFibGVQb3NpdGlvbkVudW1zIH0gZnJvbSAnLi4vZW51bXMvbGFibGUtcG9zaXRpb24uZW51bSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1eHAtcnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ydWMtbWV0ZXJlZC1wcm9ncmVzcy1iYXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgUnVjTWV0ZXJlZFByb2dyZXNzQmFyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBydWNJbnB1dERhdGEhOiBNZXRlcmVkQmFyQ29uZmlnO1xyXG4gIEBJbnB1dCgpIGN1c3RvbVRoZW1lITogc3RyaW5nO1xyXG4gIGhvdmVyZWRDYXRlZ29yeURldGFpbDogeyBjYXRlZ29yeTogQ2F0ZWdvcnlDb25maWcsIHBlcmNlbnRhZ2VUZXh0OiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xyXG4gIGhvdmVyTGFiZWxTdHlsZTogeyBsZWZ0OiBzdHJpbmc7IHRvcDogc3RyaW5nOyBkaXNwbGF5OiBzdHJpbmc7IHRyYW5zZm9ybTogc3RyaW5nOyB9ID0geyBsZWZ0OiAnMHB4JywgdG9wOiAnLTI4cHgnLCBkaXNwbGF5OiAnbm9uZScsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknIH07XHJcbiAgcHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcclxuICAvKipcclxuICAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhbGwgY2F0ZWdvcmllcy5cclxuICAgKiBAcmV0dXJucyBUaGUgc3VtIG9mIGFsbCBjYXRlZ29yeSB2YWx1ZXMuXHJcbiAgICovXHJcbiAgZ2V0IHRvdGFsVmFsdWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnJ1Y0lucHV0RGF0YS5jYXRlZ29yaWVzLnJlZHVjZSgoc3VtLCBjYXRlZ29yeSkgPT4gc3VtICsgY2F0ZWdvcnkudmFsdWUsIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlcyB0aGUgb3ZlcmFsbCBwcm9ncmVzcyBwZXJjZW50YWdlIG9mIHRoZSBiYXIgYmFzZWQgb24gdG90YWwgdmFsdWUsIG1pbiwgYW5kIG1heC5cclxuICAgKiBAcmV0dXJucyBUaGUgcHJvZ3Jlc3MgYXMgYSBwZXJjZW50YWdlICgwLTEwMCkuXHJcbiAgICovXHJcbiAgZ2V0IHByb2dyZXNzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKCh0aGlzLnRvdGFsVmFsdWUgLSB0aGlzLnJ1Y0lucHV0RGF0YS5taW4pIC8gKHRoaXMucnVjSW5wdXREYXRhLm1heCAtIHRoaXMucnVjSW5wdXREYXRhLm1pbikpICogMTAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvZ3Jlc3MgYmFyIGlzIG9yaWVudGVkIHZlcnRpY2FsbHkuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb3JpZW50YXRpb24gaXMgJ3ZlcnRpY2FsJywgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGdldCBpc1ZlcnRpY2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucnVjSW5wdXREYXRhLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIHRoZSBDU1MgbGluZWFyLWdyYWRpZW50IHN0cmluZyBmb3IgdGhlIHByb2dyZXNzIGJhci5cclxuICAgKiBUaGUgZ3JhZGllbnQgaXMgY29tcG9zZWQgb2Ygc2VnbWVudHMgYmFzZWQgb24gY2F0ZWdvcnkgdmFsdWVzIGFuZCBjb2xvcnMuXHJcbiAgICogSWYgbm8gY2F0ZWdvcmllcyBvciB0b3RhbCB2YWx1ZSBpcyB6ZXJvLCBpdCByZXR1cm5zIGEgdHJhbnNwYXJlbnQgZ3JhZGllbnQuXHJcbiAgICogQHJldHVybnMgQSBDU1MgbGluZWFyLWdyYWRpZW50IHN0cmluZy5cclxuICAgKi9cclxuICBnZXQgcHJvZ3Jlc3NTdHlsZXMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmlzVmVydGljYWwgPyAndG8gYm90dG9tJyA6ICd0byByaWdodCc7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJ1Y0lucHV0RGF0YSB8fCAhdGhpcy5ydWNJbnB1dERhdGEuY2F0ZWdvcmllcykge1xyXG4gICAgICByZXR1cm4geyBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsVmFsdWU7XHJcbiAgICBjb25zdCBjb2xvclN0b3BzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IGN1bXVsYXRpdmVQZXJjZW50YWdlID0gMDtcclxuXHJcbiAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgIHRoaXMucnVjSW5wdXREYXRhLmNhdGVnb3JpZXMuZm9yRWFjaChjYXRlZ29yeSA9PiB7XHJcbiAgICAgICAgaWYgKGNhdGVnb3J5LnZhbHVlIDw9IDApIHJldHVybjsgLy8gU2tpcCBjYXRlZ29yaWVzIHdpdGggemVybyBvciBuZWdhdGl2ZSBjb250cmlidXRpb25cclxuXHJcbiAgICAgICAgY29uc3Qgc2VnbWVudFBlcmNlbnRhZ2UgPSAoY2F0ZWdvcnkudmFsdWUgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgY29uc3QgY29sb3IgPSBjYXRlZ29yeS5jb2xvcjtcclxuXHJcbiAgICAgICAgLy8gQWRkIHN0YXJ0IG9mIHRoZSBzZWdtZW50IHVzaW5nIHRoZSBwcmV2aW91cyBjdW11bGF0aXZlIHBlcmNlbnRhZ2VcclxuICAgICAgICBjb2xvclN0b3BzLnB1c2goYCR7Y29sb3J9ICR7Y3VtdWxhdGl2ZVBlcmNlbnRhZ2V9JWApO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgY3VtdWxhdGl2ZSBwZXJjZW50YWdlIGZvciB0aGUgZW5kIG9mIHRoaXMgc2VnbWVudFxyXG4gICAgICAgIGN1bXVsYXRpdmVQZXJjZW50YWdlICs9IHNlZ21lbnRQZXJjZW50YWdlO1xyXG5cclxuICAgICAgICAvLyBBZGQgZW5kIG9mIHRoZSBzZWdtZW50XHJcbiAgICAgICAgLy8gVXNlIE1hdGgubWluIHRvIGNhcCBhdCAxMDAlIGluIGNhc2Ugb2YgZmxvYXRpbmcgcG9pbnQgb3ZlcnNob290IG9uIHRoZSBsYXN0IHNlZ21lbnRcclxuICAgICAgICBjb2xvclN0b3BzLnB1c2goYCR7Y29sb3J9ICR7TWF0aC5taW4oY3VtdWxhdGl2ZVBlcmNlbnRhZ2UsIDEwMCl9JWApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sb3JTdG9wcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHsgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJhc2VHcmFkaWVudCA9IGBsaW5lYXItZ3JhZGllbnQoJHtkaXJlY3Rpb259LCAke2NvbG9yU3RvcHMuam9pbignLCAnKX0pYDtcclxuICAgIGNvbnN0IHN0eWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG4gICAgY29uc3QgYmFyU3R5bGUgPSB0aGlzLnJ1Y0lucHV0RGF0YT8uYmFyU3R5bGU7XHJcblxyXG4gICAgc3dpdGNoIChiYXJTdHlsZSkge1xyXG4gICAgICBjYXNlICdzdHJpcGUnOlxyXG4gICAgICAgIC8vIFRoaXMgdXNlcyBtdWx0aXBsZSBiYWNrZ3JvdW5kcyBmb3IgYW4gb3ZlcmxheSBlZmZlY3QsIGFzIHJlcXVlc3RlZC5cclxuICAgICAgICBzdHlsZXNbJ2JhY2tncm91bmQnXSA9IGByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KC00NWRlZywgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDVweCwgcmdiYSgwLCAwLCAwLCAwLjEpIDVweCwgcmdiYSgwLCAwLCAwLCAwLjEpIDEwcHgpLCAke2Jhc2VHcmFkaWVudH1gO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjaXJjbGUnOiB7XHJcbiAgICAgICAgLy8gVGhpcyB1c2VzIGEgbWFzay4gVGhlIGJhY2tncm91bmQgaXMgdGhlIGNvbG9yLCB0aGUgbWFzayBjdXRzIG91dCB0aGUgc2hhcGUuXHJcbiAgICAgICAgc3R5bGVzWydiYWNrZ3JvdW5kJ10gPSBiYXNlR3JhZGllbnQ7XHJcbiAgICAgICAgLy8gQSByZXBlYXRpbmcgcGF0dGVybiBvZiBjaXJjbGVzLiBFYWNoIGNpcmNsZSBoYXMgYSBkaWFtZXRlciBvZiA4cHgsIHdpdGggYSA0cHggZ2FwLlxyXG4gICAgICAgIGNvbnN0IGNpcmNsZU1hc2sgPSAncmFkaWFsLWdyYWRpZW50KGNpcmNsZSwgYmxhY2sgNHB4LCB0cmFuc3BhcmVudCA0cHgpIDAgMCAvIDEycHggMTJweCc7XHJcbiAgICAgICAgc3R5bGVzWyctd2Via2l0LW1hc2snXSA9IGNpcmNsZU1hc2s7XHJcbiAgICAgICAgc3R5bGVzWydtYXNrJ10gPSBjaXJjbGVNYXNrO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3JlY3RhbmdsZSc6IHtcclxuICAgICAgICBzdHlsZXNbJ2JhY2tncm91bmQnXSA9IGJhc2VHcmFkaWVudDtcclxuICAgICAgICAvLyBGb3IgdmVydGljYWwgYmFyLCBjcmVhdGUgaG9yaXpvbnRhbCByZWN0YW5nbGVzICgwZGVnKS4gRm9yIGhvcml6b250YWwgYmFyLCBjcmVhdGUgdmVydGljYWwgcmVjdGFuZ2xlcyAoOTBkZWcpLlxyXG4gICAgICAgIGNvbnN0IHJlY3REaXJlY3Rpb24gPSB0aGlzLmlzVmVydGljYWwgPyAnMGRlZycgOiAnOTBkZWcnO1xyXG4gICAgICAgIC8vIEEgcmVwZWF0aW5nIHBhdHRlcm4gb2YgYmFycy4gRWFjaCBiYXIgaXMgNnB4IHdpZGUgd2l0aCBhIDZweCBnYXAuXHJcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlTWFzayA9IGByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KCR7cmVjdERpcmVjdGlvbn0sIGJsYWNrLCBibGFjayA2cHgsIHRyYW5zcGFyZW50IDZweCwgdHJhbnNwYXJlbnQgMTJweClgO1xyXG4gICAgICAgIHN0eWxlc1snLXdlYmtpdC1tYXNrJ10gPSByZWN0YW5nbGVNYXNrO1xyXG4gICAgICAgIHN0eWxlc1snbWFzayddID0gcmVjdGFuZ2xlTWFzaztcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OiAvLyAnc29saWQnIG9yIHVuZGVmaW5lZFxyXG4gICAgICAgIHN0eWxlc1snYmFja2dyb3VuZCddID0gYmFzZUdyYWRpZW50O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0eWxlcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBtb3VzZSBtb3ZlbWVudCBvdmVyIHRoZSBwcm9ncmVzcyBiYXIgdG8gZGlzcGxheSBjYXRlZ29yeS1zcGVjaWZpYyBob3ZlciBkZXRhaWxzLlxyXG4gICAqIEl0IGNhbGN1bGF0ZXMgdGhlIGhvdmVyZWQgc2VnbWVudCBiYXNlZCBvbiBtb3VzZSBwb3NpdGlvbiBhbmQgdXBkYXRlcyB0aGUgaG92ZXIgbGFiZWwuXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBNb3VzZUV2ZW50IG9iamVjdC5cclxuICAgKi9cclxuICBvblByb2dyZXNzTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBwcm9ncmVzc0JhckVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBsZXQgY3VycmVudEN1bXVsYXRpdmVHcmFkaWVudFBjdCA9IDA7XHJcbiAgICBsZXQgZm91bmRDYXRlZ29yeUZvckhvdmVyOiBDYXRlZ29yeUNvbmZpZyB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IGhvdmVyUGVyY2VudGFnZV9vbkZpbGxlZEJhciA9IDA7XHJcbiAgICBsZXQgbW91c2VQb3NpdGlvbldpdGhpblByb2dyZXNzRGl2ID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5pc1ZlcnRpY2FsKSB7XHJcbiAgICAgIG1vdXNlUG9zaXRpb25XaXRoaW5Qcm9ncmVzc0RpdiA9IGV2ZW50Lm9mZnNldFk7IC8vIFkgcG9zaXRpb24gd2l0aGluIHRoZSAucHJvZ3Jlc3MgZGl2XHJcbiAgICAgIGNvbnN0IGZpbGxlZEhlaWdodFB4ID0gcHJvZ3Jlc3NCYXJFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgaWYgKGZpbGxlZEhlaWdodFB4IDw9IDApIHsgLy8gQXZvaWQgZGl2aXNpb24gYnkgemVybyBpZiBlbGVtZW50IGhhcyBubyBoZWlnaHRcclxuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3NNb3VzZUxlYXZlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGhvdmVyUGVyY2VudGFnZV9vbkZpbGxlZEJhciA9IChtb3VzZVBvc2l0aW9uV2l0aGluUHJvZ3Jlc3NEaXYgLyBmaWxsZWRIZWlnaHRQeCkgKiAxMDA7XHJcbiAgICB9IGVsc2UgeyAvLyBIb3Jpem9udGFsXHJcbiAgICAgIG1vdXNlUG9zaXRpb25XaXRoaW5Qcm9ncmVzc0RpdiA9IGV2ZW50Lm9mZnNldFg7IC8vIFggcG9zaXRpb24gd2l0aGluIHRoZSAucHJvZ3Jlc3MgZGl2XHJcbiAgICAgIGNvbnN0IGZpbGxlZFdpZHRoUHggPSBwcm9ncmVzc0JhckVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGlmIChmaWxsZWRXaWR0aFB4IDw9IDApIHsgLy8gQXZvaWQgZGl2aXNpb24gYnkgemVybyBpZiBlbGVtZW50IGhhcyBubyB3aWR0aFxyXG4gICAgICAgIHRoaXMub25Qcm9ncmVzc01vdXNlTGVhdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaG92ZXJQZXJjZW50YWdlX29uRmlsbGVkQmFyID0gKG1vdXNlUG9zaXRpb25XaXRoaW5Qcm9ncmVzc0RpdiAvIGZpbGxlZFdpZHRoUHgpICogMTAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRvdGFsVmFsdWUgPiAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5ydWNJbnB1dERhdGEuY2F0ZWdvcmllcykge1xyXG4gICAgICAgIGlmIChjYXRlZ29yeS52YWx1ZSA8PSAwKSBjb250aW51ZTsgLy8gU2tpcCBjYXRlZ29yaWVzIHdpdGggemVybyBvciBuZWdhdGl2ZSBjb250cmlidXRpb25cclxuXHJcbiAgICAgICAgY29uc3Qgc2VnbWVudEdyYWRpZW50UGN0ID0gKGNhdGVnb3J5LnZhbHVlIC8gdGhpcy50b3RhbFZhbHVlKSAqIDEwMDtcclxuICAgICAgICBjb25zdCBzZWdtZW50U3RhcnRHcmFkaWVudFBjdCA9IGN1cnJlbnRDdW11bGF0aXZlR3JhZGllbnRQY3Q7XHJcbiAgICAgICAgY29uc3Qgc2VnbWVudEVuZEdyYWRpZW50UGN0ID0gY3VycmVudEN1bXVsYXRpdmVHcmFkaWVudFBjdCArIHNlZ21lbnRHcmFkaWVudFBjdDtcclxuXHJcbiAgICAgICAgLy8gRW5zdXJlIGhvdmVyUGVyY2VudGFnZSBpcyB3aXRoaW4gdGhlIHNlZ21lbnQsIGhhbmRsaW5nIHBvdGVudGlhbCBmbG9hdGluZyBwb2ludCBpbmFjY3VyYWNpZXMgZm9yIHRoZSBsYXN0IHNlZ21lbnRcclxuICAgICAgICBpZiAoaG92ZXJQZXJjZW50YWdlX29uRmlsbGVkQmFyID49IHNlZ21lbnRTdGFydEdyYWRpZW50UGN0ICYmIC8vIENoZWNrIGlmIG1vdXNlIGlzIHdpdGhpbiBvciBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlZ21lbnRcclxuICAgICAgICAgIChob3ZlclBlcmNlbnRhZ2Vfb25GaWxsZWRCYXIgPCBzZWdtZW50RW5kR3JhZGllbnRQY3QgfHxcclxuICAgICAgICAgICAgKHNlZ21lbnRFbmRHcmFkaWVudFBjdCA+PSA5OS45OSAmJiBob3ZlclBlcmNlbnRhZ2Vfb25GaWxsZWRCYXIgPD0gMTAwLjAxKSkpIHsgLy8gVG9sZXJhdGUgc2xpZ2h0IG92ZXJzaG9vdCBmb3IgbGFzdCBzZWdtZW50XHJcbiAgICAgICAgICBmb3VuZENhdGVnb3J5Rm9ySG92ZXIgPSBjYXRlZ29yeTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50Q3VtdWxhdGl2ZUdyYWRpZW50UGN0ID0gc2VnbWVudEVuZEdyYWRpZW50UGN0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvdW5kQ2F0ZWdvcnlGb3JIb3Zlcikge1xyXG4gICAgICBjb25zdCBwZXJjZW50YWdlT2ZNYXggPSAoZm91bmRDYXRlZ29yeUZvckhvdmVyLnZhbHVlIC8gdGhpcy5ydWNJbnB1dERhdGEubWF4KSAqIDEwMDsgLy8gQ2FsY3VsYXRlIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gbWF4IHZhbHVlXHJcbiAgICAgIHRoaXMuaG92ZXJlZENhdGVnb3J5RGV0YWlsID0geyBjYXRlZ29yeTogZm91bmRDYXRlZ29yeUZvckhvdmVyLCBwZXJjZW50YWdlVGV4dDogcGVyY2VudGFnZU9mTWF4LnRvRml4ZWQoMCkgKyAnJScgfTtcclxuICAgICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgIHRoaXMuaG92ZXJMYWJlbFN0eWxlID0ge1xyXG4gICAgICAgICAgbGVmdDogJ2NhbGMoMTAwJSArIDVweCknLCAvLyBQb3NpdGlvbiB0byB0aGUgcmlnaHQgb2YgdGhlIHZlcnRpY2FsIGJhclxyXG4gICAgICAgICAgdG9wOiBtb3VzZVBvc2l0aW9uV2l0aGluUHJvZ3Jlc3NEaXYgKyAncHgnLFxyXG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcclxuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSknIC8vIFZlcnRpY2FsbHkgY2VudGVyIGxhYmVsIG9uIG1vdXNlIFlcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaG92ZXJMYWJlbFN0eWxlID0ge1xyXG4gICAgICAgICAgbGVmdDogbW91c2VQb3NpdGlvbldpdGhpblByb2dyZXNzRGl2ICsgJ3B4JyxcclxuICAgICAgICAgIHRvcDogJy0yOHB4JywgLy8gUG9zaXRpb24gYWJvdmUgaG9yaXpvbnRhbCBiYXJcclxuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXHJcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJyAvLyBIb3Jpem9udGFsbHkgY2VudGVyIGxhYmVsIG9uIG1vdXNlIFhcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhvdmVyZWRDYXRlZ29yeURldGFpbCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaG92ZXJMYWJlbFN0eWxlID0geyAuLi50aGlzLmhvdmVyTGFiZWxTdHlsZSwgZGlzcGxheTogJ25vbmUnIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIaWRlcyB0aGUgaG92ZXIgbGFiZWwgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBwcm9ncmVzcyBiYXIuXHJcbiAgICovXHJcbiAgb25Qcm9ncmVzc01vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhvdmVyZWRDYXRlZ29yeURldGFpbCA9IG51bGw7XHJcbiAgICB0aGlzLmhvdmVyTGFiZWxTdHlsZSA9IHsgLi4udGhpcy5ob3ZlckxhYmVsU3R5bGUsIGRpc3BsYXk6ICdub25lJyB9O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBnZXQgdGhlIGxhYmVsIHBvc2l0aW9uICBzdHJpbmcgdmFsdWVcclxuICAgICAqL1xyXG4gIHB1YmxpYyBnZXQgTGFibGVQb3NpdGlvbkVudW1zKCk6IHR5cGVvZiBMYWJsZVBvc2l0aW9uRW51bXMge1xyXG4gICAgcmV0dXJuIExhYmxlUG9zaXRpb25FbnVtcztcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5lclwiIGNsYXNzPXt7Y3VzdG9tVGhlbWV9fSBbY2xhc3MudmVydGljYWxdPVwiaXNWZXJ0aWNhbFwiIFtjbGFzcy5ob3Jpem9udGFsXT1cIiFpc1ZlcnRpY2FsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxyXG4gICAgPCEtLSBSZW1vdmVkIChtb3VzZWVudGVyKSBhbmQgKG1vdXNlbGVhdmUpIGZyb20gcHJvZ3Jlc3MtYmFyIGlmIG9ubHkgY2F0ZWdvcnkgaG92ZXIgaXMgbmVlZGVkIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInJ1Y0lucHV0RGF0YS5iYXJMYWJlbHNcIiBjbGFzcz1cInByb2dyZXNzLWxhYmVsLWNvbnRhaW5lciB7e3J1Y0lucHV0RGF0YS5vcmllbnRhdGlvbn19XCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj57e3Byb2dyZXNzIHwgbnVtYmVyOicxLjAtMCd9fSUgb2Yge3tydWNJbnB1dERhdGEubWF4fX0ge3tydWNJbnB1dERhdGEudW5pdFR5cGV9fVxyXG4gICAgICAgIFVzZWQ8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiIFtzdHlsZS53aWR0aF09XCJpc1ZlcnRpY2FsID8gJzEwMCUnIDogcHJvZ3Jlc3MgKyAnJSdcIlxyXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cImlzVmVydGljYWwgPyBwcm9ncmVzcyArICclJyA6ICcxMDAlJ1wiXHJcbiAgICAgIFtzdHlsZS50cmFuc2l0aW9uXT1cInJ1Y0lucHV0RGF0YS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/ICdoZWlnaHQgMC4zcyBlYXNlJyA6ICd3aWR0aCAwLjNzIGVhc2UnXCJcclxuICAgICAgW25nU3R5bGVdPVwicHJvZ3Jlc3NTdHlsZXNcIj5cclxuICAgICAgPCEtLSBUaGlzIGRpdiBpcyBub3cgb25seSBmb3IgZGlzcGxheWluZyB0aGUgY29sb3JlZCBiYXIgLS0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gVGhlIGhvdmVyIGxhYmVsIGlzIG5vdyBhIHNpYmxpbmcgdG8gLnByb2dyZXNzLCBwb3NpdGlvbmVkIGFic29sdXRlbHkgd2l0aGluIC5wcm9ncmVzcy1iYXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaG92ZXItbGFiZWxcIiAqbmdJZj1cImhvdmVyZWRDYXRlZ29yeURldGFpbFwiIFtuZ1N0eWxlXT1cImhvdmVyTGFiZWxTdHlsZVwiPlxyXG4gICAgICB7e2hvdmVyZWRDYXRlZ29yeURldGFpbC5jYXRlZ29yeS5sYWJlbH19OiB7e2hvdmVyZWRDYXRlZ29yeURldGFpbC5wZXJjZW50YWdlVGV4dH19XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gVGhpcyBvdmVybGF5IGlzIG5vdyBhIHNpYmxpbmcgdG8gLnByb2dyZXNzLCBzaXplZCB0byBtYXRjaCBpdCwgdG8gcmVsaWFibHkgY2FwdHVyZSBtb3VzZSBldmVudHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZXZlbnQtb3ZlcmxheVwiIFtzdHlsZS53aWR0aF09XCJpc1ZlcnRpY2FsID8gJzEwMCUnIDogcHJvZ3Jlc3MgKyAnJSdcIlxyXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cImlzVmVydGljYWwgPyBwcm9ncmVzcyArICclJyA6ICcxMDAlJ1wiIChtb3VzZW1vdmUpPVwib25Qcm9ncmVzc01vdXNlTW92ZSgkZXZlbnQpXCJcclxuICAgICAgKG1vdXNlbGVhdmUpPVwib25Qcm9ncmVzc01vdXNlTGVhdmUoKVwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLWNvbnRhaW5lclwiICpuZ0lmPVwicnVjSW5wdXREYXRhLmNhdGVnb3JpZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgPGRpdiAqbmdJZj1cInJ1Y0lucHV0RGF0YS5zaG93Q2F0ZWdvcnlMYWJlbHMgJiYgcnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxTdHlsZSA9PT0gJ2Jhc2ljJ1wiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAnY2F0ZWdvcmllcy1ibG9jay10b3AnOiAgICAhaXNWZXJ0aWNhbCAmJiAocnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09ICd0b3AnIHx8IHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSAnc2FtZScpLFxyXG4gICAgICAgICAgICdjYXRlZ29yaWVzLWJsb2NrLWxlZnQnOiAgIGlzVmVydGljYWwgJiYgKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSAnbGVmdCcgfHwgcnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09ICdzYW1lJyksXHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stcmlnaHQnOiAgaXNWZXJ0aWNhbCAmJiAhKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSAnbGVmdCcgfHwgcnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09ICdzYW1lJylcclxuICAgICAgICAgfVwiIGNsYXNzPVwiY2F0ZWdvcmllc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgcnVjSW5wdXREYXRhLmNhdGVnb3JpZXNcIiBbc3R5bGUuY29sb3JdPVwiY2F0ZWdvcnkuY29sb3JcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2F0ZWdvcnkuaWNvbiAhPT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2F0ZWdvcnkuaWNvbjsgZWxzZSBjb2xvckRvdEJhc2ljXCIgY2xhc3M9XCJjYXRlZ29yeS1pY29uLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiIFtzdHlsZS5jb2xvcl09XCJjYXRlZ29yeS5jb2xvclwiPnt7IGNhdGVnb3J5Lmljb24gfX08L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29sb3JEb3RCYXNpYz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWNvbG9yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLWdyYWRpZW50XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNhdGVnb3J5LmNvbG9yID8gJ2xpbmVhci1ncmFkaWVudCh0byByaWdodCwgJyArIGNhdGVnb3J5LmNvbG9yICsgJywgJyArIGNhdGVnb3J5LmNvbG9yICsgJyknIDogJydcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktbGFiZWxcIj57e2NhdGVnb3J5LmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS12YWx1ZVwiPih7eyhjYXRlZ29yeS52YWx1ZSAvIHJ1Y0lucHV0RGF0YS5tYXggKiAxMDApIHwgbnVtYmVyOicxLjAtMCcgfX0lKTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwicnVjSW5wdXREYXRhLnNob3dDYXRlZ29yeUxhYmVscyAmJiBydWNJbnB1dERhdGEuY2F0ZWdvcnlMYWJlbFN0eWxlID09PSAnd2lkZ2V0J1wiXHJcbiAgICAgIGNsYXNzPVwiY2F0ZWdvcmllcyB3aWRnZXQtc3R5bGVcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stdG9wJzogICAgIWlzVmVydGljYWwgJiYgKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMudG9wIHx8IHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMuc2FtZSksXHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stbGVmdCc6ICAgaXNWZXJ0aWNhbCAmJiAocnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09IExhYmxlUG9zaXRpb25FbnVtcy5sZWZ0IHx8IHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMuc2FtZSksXHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stcmlnaHQnOiAgaXNWZXJ0aWNhbCAmJiAhKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMubGVmdCB8fCBydWNJbnB1dERhdGEuY2F0ZWdvcnlMYWJlbHNPcmllbnRhdGlvbiA9PT0gTGFibGVQb3NpdGlvbkVudW1zLnNhbWUpXHJcbiAgICAgICAgIH1cIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgcnVjSW5wdXREYXRhLmNhdGVnb3JpZXNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0LWNhdGVnb3J5XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldC1pY29uLWJveFwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXRlZ29yeS5pY29uICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYXRlZ29yeS5pY29uOyBlbHNlIGNvbG9yRG90V2lkZ2V0XCIgY2xhc3M9XCJ3aWRnZXQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCIgW3N0eWxlLmNvbG9yXT1cImNhdGVnb3J5LmNvbG9yXCI+e3sgY2F0ZWdvcnkuaWNvbiB9fTwvaT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb2xvckRvdFdpZGdldD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWNvbG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLWdyYWRpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNhdGVnb3J5LmNvbG9yID8gJ2xpbmVhci1ncmFkaWVudCh0byByaWdodCwgJyArIGNhdGVnb3J5LmNvbG9yICsgJywgJyArIGNhdGVnb3J5LmNvbG9yICsgJyknIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXQtbGFiZWxcIj57e2NhdGVnb3J5LmxhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXQtdmFsdWVcIj5cclxuICAgICAgICAgICAgPGRpdj57e2NhdGVnb3J5LnZhbHVlfX08L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyL3J1Yy1tZXRlcmVkLXByb2dyZXNzLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Yy1tZXRlcmVkLXByb2dyZXNzLWJhci9ydWMtbWV0ZXJlZC1wcm9ncmVzcy1iYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFrQixnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBVWxFLE1BQU0sT0FBTyw4QkFBOEI7SUFQM0M7UUFVRSwwQkFBcUIsR0FBZ0UsSUFBSSxDQUFDO1FBQzFGLG9CQUFlLEdBQXVFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUM7UUFDcEssdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO0tBeUx4QjtJQXhMQzs7O09BR0c7SUFDSCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLFFBQVE7UUFDVixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcs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QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDYXRlZ29yeUNvbmZpZywgTWV0ZXJlZEJhckNvbmZpZyB9IGZyb20gJy4uL21vZGVsL21ldGVyZWQtYmFyLmNvbmZpZyc7XHJcbmltcG9ydCB7IExhYmxlUG9zaXRpb25FbnVtcyB9IGZyb20gJy4uL2VudW1zL2xhYmxlLXBvc2l0aW9uLmVudW0nO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndXhwLXJ1Yy1tZXRlcmVkLXByb2dyZXNzLWJhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3J1Yy1tZXRlcmVkLXByb2dyZXNzLWJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJ1Y01ldGVyZWRQcm9ncmVzc0JhckNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgcnVjSW5wdXREYXRhITogTWV0ZXJlZEJhckNvbmZpZztcclxuICBASW5wdXQoKSBjdXN0b21UaGVtZSE6IHN0cmluZztcclxuICBob3ZlcmVkQ2F0ZWdvcnlEZXRhaWw6IHsgY2F0ZWdvcnk6IENhdGVnb3J5Q29uZmlnLCBwZXJjZW50YWdlVGV4dDogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcclxuICBob3ZlckxhYmVsU3R5bGU6IHsgbGVmdDogc3RyaW5nOyB0b3A6IHN0cmluZzsgZGlzcGxheTogc3RyaW5nOyB0cmFuc2Zvcm06IHN0cmluZzsgfSA9IHsgbGVmdDogJzBweCcsIHRvcDogJy0yOHB4JywgZGlzcGxheTogJ25vbmUnLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJyB9O1xyXG4gIHByb2dyZXNzUGVyY2VudGFnZSA9IDA7XHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlcyB0aGUgdG90YWwgdmFsdWUgb2YgYWxsIGNhdGVnb3JpZXMuXHJcbiAgICogQHJldHVybnMgVGhlIHN1bSBvZiBhbGwgY2F0ZWdvcnkgdmFsdWVzLlxyXG4gICAqL1xyXG4gIGdldCB0b3RhbFZhbHVlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5ydWNJbnB1dERhdGEuY2F0ZWdvcmllcy5yZWR1Y2UoKHN1bSwgY2F0ZWdvcnkpID0+IHN1bSArIGNhdGVnb3J5LnZhbHVlLCAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgdGhlIG92ZXJhbGwgcHJvZ3Jlc3MgcGVyY2VudGFnZSBvZiB0aGUgYmFyIGJhc2VkIG9uIHRvdGFsIHZhbHVlLCBtaW4sIGFuZCBtYXguXHJcbiAgICogQHJldHVybnMgVGhlIHByb2dyZXNzIGFzIGEgcGVyY2VudGFnZSAoMC0xMDApLlxyXG4gICAqL1xyXG4gIGdldCBwcm9ncmVzcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICgodGhpcy50b3RhbFZhbHVlIC0gdGhpcy5ydWNJbnB1dERhdGEubWluKSAvICh0aGlzLnJ1Y0lucHV0RGF0YS5tYXggLSB0aGlzLnJ1Y0lucHV0RGF0YS5taW4pKSAqIDEwMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgaWYgdGhlIHByb2dyZXNzIGJhciBpcyBvcmllbnRlZCB2ZXJ0aWNhbGx5LlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9yaWVudGF0aW9uIGlzICd2ZXJ0aWNhbCcsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBnZXQgaXNWZXJ0aWNhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJ1Y0lucHV0RGF0YS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyB0aGUgQ1NTIGxpbmVhci1ncmFkaWVudCBzdHJpbmcgZm9yIHRoZSBwcm9ncmVzcyBiYXIuXHJcbiAgICogVGhlIGdyYWRpZW50IGlzIGNvbXBvc2VkIG9mIHNlZ21lbnRzIGJhc2VkIG9uIGNhdGVnb3J5IHZhbHVlcyBhbmQgY29sb3JzLlxyXG4gICAqIElmIG5vIGNhdGVnb3JpZXMgb3IgdG90YWwgdmFsdWUgaXMgemVybywgaXQgcmV0dXJucyBhIHRyYW5zcGFyZW50IGdyYWRpZW50LlxyXG4gICAqIEByZXR1cm5zIEEgQ1NTIGxpbmVhci1ncmFkaWVudCBzdHJpbmcuXHJcbiAgICovXHJcbiAgZ2V0IHByb2dyZXNzU3R5bGVzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5pc1ZlcnRpY2FsID8gJ3RvIGJvdHRvbScgOiAndG8gcmlnaHQnO1xyXG5cclxuICAgIGlmICghdGhpcy5ydWNJbnB1dERhdGEgfHwgIXRoaXMucnVjSW5wdXREYXRhLmNhdGVnb3JpZXMpIHtcclxuICAgICAgcmV0dXJuIHsgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbFZhbHVlO1xyXG4gICAgY29uc3QgY29sb3JTdG9wczogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCBjdW11bGF0aXZlUGVyY2VudGFnZSA9IDA7XHJcblxyXG4gICAgaWYgKHRvdGFsID4gMCkge1xyXG4gICAgICB0aGlzLnJ1Y0lucHV0RGF0YS5jYXRlZ29yaWVzLmZvckVhY2goY2F0ZWdvcnkgPT4ge1xyXG4gICAgICAgIGlmIChjYXRlZ29yeS52YWx1ZSA8PSAwKSByZXR1cm47IC8vIFNraXAgY2F0ZWdvcmllcyB3aXRoIHplcm8gb3IgbmVnYXRpdmUgY29udHJpYnV0aW9uXHJcblxyXG4gICAgICAgIGNvbnN0IHNlZ21lbnRQZXJjZW50YWdlID0gKGNhdGVnb3J5LnZhbHVlIC8gdG90YWwpICogMTAwO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yID0gY2F0ZWdvcnkuY29sb3I7XHJcblxyXG4gICAgICAgIC8vIEFkZCBzdGFydCBvZiB0aGUgc2VnbWVudCB1c2luZyB0aGUgcHJldmlvdXMgY3VtdWxhdGl2ZSBwZXJjZW50YWdlXHJcbiAgICAgICAgY29sb3JTdG9wcy5wdXNoKGAke2NvbG9yfSAke2N1bXVsYXRpdmVQZXJjZW50YWdlfSVgKTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIGN1bXVsYXRpdmUgcGVyY2VudGFnZSBmb3IgdGhlIGVuZCBvZiB0aGlzIHNlZ21lbnRcclxuICAgICAgICBjdW11bGF0aXZlUGVyY2VudGFnZSArPSBzZWdtZW50UGVyY2VudGFnZTtcclxuXHJcbiAgICAgICAgLy8gQWRkIGVuZCBvZiB0aGUgc2VnbWVudFxyXG4gICAgICAgIC8vIFVzZSBNYXRoLm1pbiB0byBjYXAgYXQgMTAwJSBpbiBjYXNlIG9mIGZsb2F0aW5nIHBvaW50IG92ZXJzaG9vdCBvbiB0aGUgbGFzdCBzZWdtZW50XHJcbiAgICAgICAgY29sb3JTdG9wcy5wdXNoKGAke2NvbG9yfSAke01hdGgubWluKGN1bXVsYXRpdmVQZXJjZW50YWdlLCAxMDApfSVgKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbG9yU3RvcHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB7IGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlR3JhZGllbnQgPSBgbGluZWFyLWdyYWRpZW50KCR7ZGlyZWN0aW9ufSwgJHtjb2xvclN0b3BzLmpvaW4oJywgJyl9KWA7XHJcbiAgICBjb25zdCBzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICAgIGNvbnN0IGJhclN0eWxlID0gdGhpcy5ydWNJbnB1dERhdGE/LmJhclN0eWxlO1xyXG5cclxuICAgIHN3aXRjaCAoYmFyU3R5bGUpIHtcclxuICAgICAgY2FzZSAnc3RyaXBlJzpcclxuICAgICAgICAvLyBUaGlzIHVzZXMgbXVsdGlwbGUgYmFja2dyb3VuZHMgZm9yIGFuIG92ZXJsYXkgZWZmZWN0LCBhcyByZXF1ZXN0ZWQuXHJcbiAgICAgICAgc3R5bGVzWydiYWNrZ3JvdW5kJ10gPSBgcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgtNDVkZWcsIHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCA1cHgsIHJnYmEoMCwgMCwgMCwgMC4xKSA1cHgsIHJnYmEoMCwgMCwgMCwgMC4xKSAxMHB4KSwgJHtiYXNlR3JhZGllbnR9YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY2lyY2xlJzoge1xyXG4gICAgICAgIC8vIFRoaXMgdXNlcyBhIG1hc2suIFRoZSBiYWNrZ3JvdW5kIGlzIHRoZSBjb2xvciwgdGhlIG1hc2sgY3V0cyBvdXQgdGhlIHNoYXBlLlxyXG4gICAgICAgIHN0eWxlc1snYmFja2dyb3VuZCddID0gYmFzZUdyYWRpZW50O1xyXG4gICAgICAgIC8vIEEgcmVwZWF0aW5nIHBhdHRlcm4gb2YgY2lyY2xlcy4gRWFjaCBjaXJjbGUgaGFzIGEgZGlhbWV0ZXIgb2YgOHB4LCB3aXRoIGEgNHB4IGdhcC5cclxuICAgICAgICBjb25zdCBjaXJjbGVNYXNrID0gJ3JhZGlhbC1ncmFkaWVudChjaXJjbGUsIGJsYWNrIDRweCwgdHJhbnNwYXJlbnQgNHB4KSAwIDAgLyAxMnB4IDEycHgnO1xyXG4gICAgICAgIHN0eWxlc1snLXdlYmtpdC1tYXNrJ10gPSBjaXJjbGVNYXNrO1xyXG4gICAgICAgIHN0eWxlc1snbWFzayddID0gY2lyY2xlTWFzaztcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdyZWN0YW5nbGUnOiB7XHJcbiAgICAgICAgc3R5bGVzWydiYWNrZ3JvdW5kJ10gPSBiYXNlR3JhZGllbnQ7XHJcbiAgICAgICAgLy8gRm9yIHZlcnRpY2FsIGJhciwgY3JlYXRlIGhvcml6b250YWwgcmVjdGFuZ2xlcyAoMGRlZykuIEZvciBob3Jpem9udGFsIGJhciwgY3JlYXRlIHZlcnRpY2FsIHJlY3RhbmdsZXMgKDkwZGVnKS5cclxuICAgICAgICBjb25zdCByZWN0RGlyZWN0aW9uID0gdGhpcy5pc1ZlcnRpY2FsID8gJzBkZWcnIDogJzkwZGVnJztcclxuICAgICAgICAvLyBBIHJlcGVhdGluZyBwYXR0ZXJuIG9mIGJhcnMuIEVhY2ggYmFyIGlzIDZweCB3aWRlIHdpdGggYSA2cHggZ2FwLlxyXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZU1hc2sgPSBgcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgke3JlY3REaXJlY3Rpb259LCBibGFjaywgYmxhY2sgNnB4LCB0cmFuc3BhcmVudCA2cHgsIHRyYW5zcGFyZW50IDEycHgpYDtcclxuICAgICAgICBzdHlsZXNbJy13ZWJraXQtbWFzayddID0gcmVjdGFuZ2xlTWFzaztcclxuICAgICAgICBzdHlsZXNbJ21hc2snXSA9IHJlY3RhbmdsZU1hc2s7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZGVmYXVsdDogLy8gJ3NvbGlkJyBvciB1bmRlZmluZWRcclxuICAgICAgICBzdHlsZXNbJ2JhY2tncm91bmQnXSA9IGJhc2VHcmFkaWVudDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHlsZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgbW91c2UgbW92ZW1lbnQgb3ZlciB0aGUgcHJvZ3Jlc3MgYmFyIHRvIGRpc3BsYXkgY2F0ZWdvcnktc3BlY2lmaWMgaG92ZXIgZGV0YWlscy5cclxuICAgKiBJdCBjYWxjdWxhdGVzIHRoZSBob3ZlcmVkIHNlZ21lbnQgYmFzZWQgb24gbW91c2UgcG9zaXRpb24gYW5kIHVwZGF0ZXMgdGhlIGhvdmVyIGxhYmVsLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgTW91c2VFdmVudCBvYmplY3QuXHJcbiAgICovXHJcbiAgb25Qcm9ncmVzc01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgcHJvZ3Jlc3NCYXJFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgbGV0IGN1cnJlbnRDdW11bGF0aXZlR3JhZGllbnRQY3QgPSAwO1xyXG4gICAgbGV0IGZvdW5kQ2F0ZWdvcnlGb3JIb3ZlcjogQ2F0ZWdvcnlDb25maWcgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBob3ZlclBlcmNlbnRhZ2Vfb25GaWxsZWRCYXIgPSAwO1xyXG4gICAgbGV0IG1vdXNlUG9zaXRpb25XaXRoaW5Qcm9ncmVzc0RpdiA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCkge1xyXG4gICAgICBtb3VzZVBvc2l0aW9uV2l0aGluUHJvZ3Jlc3NEaXYgPSBldmVudC5vZmZzZXRZOyAvLyBZIHBvc2l0aW9uIHdpdGhpbiB0aGUgLnByb2dyZXNzIGRpdlxyXG4gICAgICBjb25zdCBmaWxsZWRIZWlnaHRQeCA9IHByb2dyZXNzQmFyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIGlmIChmaWxsZWRIZWlnaHRQeCA8PSAwKSB7IC8vIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gaWYgZWxlbWVudCBoYXMgbm8gaGVpZ2h0XHJcbiAgICAgICAgdGhpcy5vblByb2dyZXNzTW91c2VMZWF2ZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBob3ZlclBlcmNlbnRhZ2Vfb25GaWxsZWRCYXIgPSAobW91c2VQb3NpdGlvbldpdGhpblByb2dyZXNzRGl2IC8gZmlsbGVkSGVpZ2h0UHgpICogMTAwO1xyXG4gICAgfSBlbHNlIHsgLy8gSG9yaXpvbnRhbFxyXG4gICAgICBtb3VzZVBvc2l0aW9uV2l0aGluUHJvZ3Jlc3NEaXYgPSBldmVudC5vZmZzZXRYOyAvLyBYIHBvc2l0aW9uIHdpdGhpbiB0aGUgLnByb2dyZXNzIGRpdlxyXG4gICAgICBjb25zdCBmaWxsZWRXaWR0aFB4ID0gcHJvZ3Jlc3NCYXJFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICBpZiAoZmlsbGVkV2lkdGhQeCA8PSAwKSB7IC8vIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gaWYgZWxlbWVudCBoYXMgbm8gd2lkdGhcclxuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3NNb3VzZUxlYXZlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGhvdmVyUGVyY2VudGFnZV9vbkZpbGxlZEJhciA9IChtb3VzZVBvc2l0aW9uV2l0aGluUHJvZ3Jlc3NEaXYgLyBmaWxsZWRXaWR0aFB4KSAqIDEwMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy50b3RhbFZhbHVlID4gMCkge1xyXG4gICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMucnVjSW5wdXREYXRhLmNhdGVnb3JpZXMpIHtcclxuICAgICAgICBpZiAoY2F0ZWdvcnkudmFsdWUgPD0gMCkgY29udGludWU7IC8vIFNraXAgY2F0ZWdvcmllcyB3aXRoIHplcm8gb3IgbmVnYXRpdmUgY29udHJpYnV0aW9uXHJcblxyXG4gICAgICAgIGNvbnN0IHNlZ21lbnRHcmFkaWVudFBjdCA9IChjYXRlZ29yeS52YWx1ZSAvIHRoaXMudG90YWxWYWx1ZSkgKiAxMDA7XHJcbiAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0R3JhZGllbnRQY3QgPSBjdXJyZW50Q3VtdWxhdGl2ZUdyYWRpZW50UGN0O1xyXG4gICAgICAgIGNvbnN0IHNlZ21lbnRFbmRHcmFkaWVudFBjdCA9IGN1cnJlbnRDdW11bGF0aXZlR3JhZGllbnRQY3QgKyBzZWdtZW50R3JhZGllbnRQY3Q7XHJcblxyXG4gICAgICAgIC8vIEVuc3VyZSBob3ZlclBlcmNlbnRhZ2UgaXMgd2l0aGluIHRoZSBzZWdtZW50LCBoYW5kbGluZyBwb3RlbnRpYWwgZmxvYXRpbmcgcG9pbnQgaW5hY2N1cmFjaWVzIGZvciB0aGUgbGFzdCBzZWdtZW50XHJcbiAgICAgICAgaWYgKGhvdmVyUGVyY2VudGFnZV9vbkZpbGxlZEJhciA+PSBzZWdtZW50U3RhcnRHcmFkaWVudFBjdCAmJiAvLyBDaGVjayBpZiBtb3VzZSBpcyB3aXRoaW4gb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWdtZW50XHJcbiAgICAgICAgICAoaG92ZXJQZXJjZW50YWdlX29uRmlsbGVkQmFyIDwgc2VnbWVudEVuZEdyYWRpZW50UGN0IHx8XHJcbiAgICAgICAgICAgIChzZWdtZW50RW5kR3JhZGllbnRQY3QgPj0gOTkuOTkgJiYgaG92ZXJQZXJjZW50YWdlX29uRmlsbGVkQmFyIDw9IDEwMC4wMSkpKSB7IC8vIFRvbGVyYXRlIHNsaWdodCBvdmVyc2hvb3QgZm9yIGxhc3Qgc2VnbWVudFxyXG4gICAgICAgICAgZm91bmRDYXRlZ29yeUZvckhvdmVyID0gY2F0ZWdvcnk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY3VycmVudEN1bXVsYXRpdmVHcmFkaWVudFBjdCA9IHNlZ21lbnRFbmRHcmFkaWVudFBjdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3VuZENhdGVnb3J5Rm9ySG92ZXIpIHtcclxuICAgICAgY29uc3QgcGVyY2VudGFnZU9mTWF4ID0gKGZvdW5kQ2F0ZWdvcnlGb3JIb3Zlci52YWx1ZSAvIHRoaXMucnVjSW5wdXREYXRhLm1heCkgKiAxMDA7IC8vIENhbGN1bGF0ZSBwZXJjZW50YWdlIHJlbGF0aXZlIHRvIG1heCB2YWx1ZVxyXG4gICAgICB0aGlzLmhvdmVyZWRDYXRlZ29yeURldGFpbCA9IHsgY2F0ZWdvcnk6IGZvdW5kQ2F0ZWdvcnlGb3JIb3ZlciwgcGVyY2VudGFnZVRleHQ6IHBlcmNlbnRhZ2VPZk1heC50b0ZpeGVkKDApICsgJyUnIH07XHJcbiAgICAgIGlmICh0aGlzLmlzVmVydGljYWwpIHtcclxuICAgICAgICB0aGlzLmhvdmVyTGFiZWxTdHlsZSA9IHtcclxuICAgICAgICAgIGxlZnQ6ICdjYWxjKDEwMCUgKyA1cHgpJywgLy8gUG9zaXRpb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSB2ZXJ0aWNhbCBiYXJcclxuICAgICAgICAgIHRvcDogbW91c2VQb3NpdGlvbldpdGhpblByb2dyZXNzRGl2ICsgJ3B4JyxcclxuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXHJcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpJyAvLyBWZXJ0aWNhbGx5IGNlbnRlciBsYWJlbCBvbiBtb3VzZSBZXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhvdmVyTGFiZWxTdHlsZSA9IHtcclxuICAgICAgICAgIGxlZnQ6IG1vdXNlUG9zaXRpb25XaXRoaW5Qcm9ncmVzc0RpdiArICdweCcsXHJcbiAgICAgICAgICB0b3A6ICctMjhweCcsIC8vIFBvc2l0aW9uIGFib3ZlIGhvcml6b250YWwgYmFyXHJcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxyXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScgLy8gSG9yaXpvbnRhbGx5IGNlbnRlciBsYWJlbCBvbiBtb3VzZSBYXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ob3ZlcmVkQ2F0ZWdvcnlEZXRhaWwgPSBudWxsO1xyXG4gICAgICB0aGlzLmhvdmVyTGFiZWxTdHlsZSA9IHsgLi4udGhpcy5ob3ZlckxhYmVsU3R5bGUsIGRpc3BsYXk6ICdub25lJyB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGlkZXMgdGhlIGhvdmVyIGxhYmVsIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgcHJvZ3Jlc3MgYmFyLlxyXG4gICAqL1xyXG4gIG9uUHJvZ3Jlc3NNb3VzZUxlYXZlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ob3ZlcmVkQ2F0ZWdvcnlEZXRhaWwgPSBudWxsO1xyXG4gICAgdGhpcy5ob3ZlckxhYmVsU3R5bGUgPSB7IC4uLnRoaXMuaG92ZXJMYWJlbFN0eWxlLCBkaXNwbGF5OiAnbm9uZScgfTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogZ2V0IHRoZSBsYWJlbCBwb3NpdGlvbiAgc3RyaW5nIHZhbHVlXHJcbiAgICAgKi9cclxuICBwdWJsaWMgZ2V0IExhYmxlUG9zaXRpb25FbnVtcygpOiB0eXBlb2YgTGFibGVQb3NpdGlvbkVudW1zIHtcclxuICAgIHJldHVybiBMYWJsZVBvc2l0aW9uRW51bXM7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXJcIiBjbGFzcz17e2N1c3RvbVRoZW1lfX0gW2NsYXNzLnZlcnRpY2FsXT1cImlzVmVydGljYWxcIiBbY2xhc3MuaG9yaXpvbnRhbF09XCIhaXNWZXJ0aWNhbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIj5cclxuICAgIDwhLS0gUmVtb3ZlZCAobW91c2VlbnRlcikgYW5kIChtb3VzZWxlYXZlKSBmcm9tIHByb2dyZXNzLWJhciBpZiBvbmx5IGNhdGVnb3J5IGhvdmVyIGlzIG5lZWRlZCAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJydWNJbnB1dERhdGEuYmFyTGFiZWxzXCIgY2xhc3M9XCJwcm9ncmVzcy1sYWJlbC1jb250YWluZXIge3tydWNJbnB1dERhdGEub3JpZW50YXRpb259fVwiPlxyXG4gICAgICA8cCBjbGFzcz1cInByb2dyZXNzLWxhYmVsXCI+e3twcm9ncmVzcyB8IG51bWJlcjonMS4wLTAnfX0lIG9mIHt7cnVjSW5wdXREYXRhLm1heH19IHt7cnVjSW5wdXREYXRhLnVuaXRUeXBlfX1cclxuICAgICAgICBVc2VkPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIDxtYXQtcHJvZ3Jlc3MtYmFyPiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCIgW3N0eWxlLndpZHRoXT1cImlzVmVydGljYWwgPyAnMTAwJScgOiBwcm9ncmVzcyArICclJ1wiXHJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJpc1ZlcnRpY2FsID8gcHJvZ3Jlc3MgKyAnJScgOiAnMTAwJSdcIlxyXG4gICAgICAgIFtzdHlsZS50cmFuc2l0aW9uXT1cInJ1Y0lucHV0RGF0YS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/ICdoZWlnaHQgMC4zcyBlYXNlJyA6ICd3aWR0aCAwLjNzIGVhc2UnXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJwcm9ncmVzc1N0eWxlc1wiPlxyXG4gICAgICAgIDwhLS0gVGhpcyBkaXYgaXMgbm93IG9ubHkgZm9yIGRpc3BsYXlpbmcgdGhlIGNvbG9yZWQgYmFyIC0tPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwhLS0gPC9tYXQtcHJvZ3Jlc3MtYmFyPiAtLT5cclxuICAgIDwhLS0gVGhlIGhvdmVyIGxhYmVsIGlzIG5vdyBhIHNpYmxpbmcgdG8gLnByb2dyZXNzLCBwb3NpdGlvbmVkIGFic29sdXRlbHkgd2l0aGluIC5wcm9ncmVzcy1iYXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaG92ZXItbGFiZWxcIiAqbmdJZj1cImhvdmVyZWRDYXRlZ29yeURldGFpbFwiIFtuZ1N0eWxlXT1cImhvdmVyTGFiZWxTdHlsZVwiPlxyXG4gICAgICB7e2hvdmVyZWRDYXRlZ29yeURldGFpbC5jYXRlZ29yeS5sYWJlbH19OiB7e2hvdmVyZWRDYXRlZ29yeURldGFpbC5wZXJjZW50YWdlVGV4dH19XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gVGhpcyBvdmVybGF5IGlzIG5vdyBhIHNpYmxpbmcgdG8gLnByb2dyZXNzLCBzaXplZCB0byBtYXRjaCBpdCwgdG8gcmVsaWFibHkgY2FwdHVyZSBtb3VzZSBldmVudHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZXZlbnQtb3ZlcmxheVwiIFtzdHlsZS53aWR0aF09XCJpc1ZlcnRpY2FsID8gJzEwMCUnIDogcHJvZ3Jlc3MgKyAnJSdcIlxyXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cImlzVmVydGljYWwgPyBwcm9ncmVzcyArICclJyA6ICcxMDAlJ1wiIChtb3VzZW1vdmUpPVwib25Qcm9ncmVzc01vdXNlTW92ZSgkZXZlbnQpXCJcclxuICAgICAgKG1vdXNlbGVhdmUpPVwib25Qcm9ncmVzc01vdXNlTGVhdmUoKVwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLWNvbnRhaW5lclwiICpuZ0lmPVwicnVjSW5wdXREYXRhLmNhdGVnb3JpZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgPGRpdiAqbmdJZj1cInJ1Y0lucHV0RGF0YS5zaG93Q2F0ZWdvcnlMYWJlbHMgJiYgcnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxTdHlsZSA9PT0gJ2Jhc2ljJ1wiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAnY2F0ZWdvcmllcy1ibG9jay10b3AnOiAgICAhaXNWZXJ0aWNhbCAmJiAocnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09ICd0b3AnIHx8IHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSAnc2FtZScpLFxyXG4gICAgICAgICAgICdjYXRlZ29yaWVzLWJsb2NrLWxlZnQnOiAgIGlzVmVydGljYWwgJiYgKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSAnbGVmdCcgfHwgcnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09ICdzYW1lJyksXHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stcmlnaHQnOiAgaXNWZXJ0aWNhbCAmJiAhKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSAnbGVmdCcgfHwgcnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09ICdzYW1lJylcclxuICAgICAgICAgfVwiIGNsYXNzPVwiY2F0ZWdvcmllc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgcnVjSW5wdXREYXRhLmNhdGVnb3JpZXNcIiBbc3R5bGUuY29sb3JdPVwiY2F0ZWdvcnkuY29sb3JcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2F0ZWdvcnkuaWNvbiAhPT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2F0ZWdvcnkuaWNvbjsgZWxzZSBjb2xvckRvdEJhc2ljXCIgY2xhc3M9XCJjYXRlZ29yeS1pY29uLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiIFtzdHlsZS5jb2xvcl09XCJjYXRlZ29yeS5jb2xvclwiPnt7IGNhdGVnb3J5Lmljb24gfX08L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29sb3JEb3RCYXNpYz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWNvbG9yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLWdyYWRpZW50XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNhdGVnb3J5LmNvbG9yID8gJ2xpbmVhci1ncmFkaWVudCh0byByaWdodCwgJyArIGNhdGVnb3J5LmNvbG9yICsgJywgJyArIGNhdGVnb3J5LmNvbG9yICsgJyknIDogJydcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktbGFiZWxcIj57e2NhdGVnb3J5LmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJjYXRlZ29yeS12YWx1ZVwiPih7eyhjYXRlZ29yeS52YWx1ZSAvIHJ1Y0lucHV0RGF0YS5tYXggKiAxMDApIHwgbnVtYmVyOicxLjAtMCcgfX0lKTwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwicnVjSW5wdXREYXRhLnNob3dDYXRlZ29yeUxhYmVscyAmJiBydWNJbnB1dERhdGEuY2F0ZWdvcnlMYWJlbFN0eWxlID09PSAnd2lkZ2V0J1wiXHJcbiAgICAgIGNsYXNzPVwiY2F0ZWdvcmllcyB3aWRnZXQtc3R5bGVcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stdG9wJzogICAgIWlzVmVydGljYWwgJiYgKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMudG9wIHx8IHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMuc2FtZSksXHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stbGVmdCc6ICAgaXNWZXJ0aWNhbCAmJiAocnVjSW5wdXREYXRhLmNhdGVnb3J5TGFiZWxzT3JpZW50YXRpb24gPT09IExhYmxlUG9zaXRpb25FbnVtcy5sZWZ0IHx8IHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMuc2FtZSksXHJcbiAgICAgICAgICAgJ2NhdGVnb3JpZXMtYmxvY2stcmlnaHQnOiAgaXNWZXJ0aWNhbCAmJiAhKHJ1Y0lucHV0RGF0YS5jYXRlZ29yeUxhYmVsc09yaWVudGF0aW9uID09PSBMYWJsZVBvc2l0aW9uRW51bXMubGVmdCB8fCBydWNJbnB1dERhdGEuY2F0ZWdvcnlMYWJlbHNPcmllbnRhdGlvbiA9PT0gTGFibGVQb3NpdGlvbkVudW1zLnNhbWUpXHJcbiAgICAgICAgIH1cIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgcnVjSW5wdXREYXRhLmNhdGVnb3JpZXNcIj5cclxuICAgICAgICA8bWF0LWNhcmQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0LWNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXQtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXQtaWNvbi1ib3hcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXRlZ29yeS5pY29uICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhdGVnb3J5Lmljb247IGVsc2UgY29sb3JEb3RXaWRnZXRcIiBjbGFzcz1cIndpZGdldC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiIFtzdHlsZS5jb2xvcl09XCJjYXRlZ29yeS5jb2xvclwiPnt7IGNhdGVnb3J5Lmljb24gfX08L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbG9yRG90V2lkZ2V0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1jb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLWdyYWRpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiY2F0ZWdvcnkuY29sb3IgPyAnbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAnICsgY2F0ZWdvcnkuY29sb3IgKyAnLCAnICsgY2F0ZWdvcnkuY29sb3IgKyAnKScgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXQtbGFiZWxcIj57e2NhdGVnb3J5LmxhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXQtdmFsdWVcIj5cclxuICAgICAgICAgICAgICA8ZGl2Pnt7Y2F0ZWdvcnkudmFsdWV9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LWNhcmQ+XHJcblxyXG5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|
|
@@ -2,19 +2,19 @@ import { NgModule } from '@angular/core';
|
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { MatIconModule } from '@angular/material/icon';
|
|
4
4
|
import { RucMeteredProgressBarComponent } from './ruc-metered-progress-bar/ruc-metered-progress-bar.component';
|
|
5
|
+
import { MatCardModule } from '@angular/material/card';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
|
-
// import { RucMeteredProgressBarComponent } from './ruc-metered-progress-bar/ruc-metered-progress-bar/ruc-metered-progress-bar.component';
|
|
7
7
|
export class RuclibMeteredProgressBarModule {
|
|
8
8
|
}
|
|
9
9
|
RuclibMeteredProgressBarModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
10
|
-
RuclibMeteredProgressBarModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, declarations: [RucMeteredProgressBarComponent], imports: [CommonModule, MatIconModule], exports: [RucMeteredProgressBarComponent] });
|
|
11
|
-
RuclibMeteredProgressBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, imports: [CommonModule, MatIconModule] });
|
|
10
|
+
RuclibMeteredProgressBarModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, declarations: [RucMeteredProgressBarComponent], imports: [CommonModule, MatIconModule, MatCardModule], exports: [RucMeteredProgressBarComponent] });
|
|
11
|
+
RuclibMeteredProgressBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, imports: [CommonModule, MatIconModule, MatCardModule] });
|
|
12
12
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, decorators: [{
|
|
13
13
|
type: NgModule,
|
|
14
14
|
args: [{
|
|
15
|
-
imports: [CommonModule, MatIconModule],
|
|
15
|
+
imports: [CommonModule, MatIconModule, MatCardModule],
|
|
16
16
|
declarations: [RucMeteredProgressBarComponent],
|
|
17
17
|
exports: [RucMeteredProgressBarComponent],
|
|
18
18
|
}]
|
|
19
19
|
}] });
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVjbGliLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDL0csT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQVF2RCxNQUFNLE9BQU8sOEJBQThCOzs0SEFBOUIsOEJBQThCOzZIQUE5Qiw4QkFBOEIsaUJBSDFCLDhCQUE4QixhQURuQyxZQUFZLEVBQUMsYUFBYSxFQUFDLGFBQWEsYUFFeEMsOEJBQThCOzZIQUU3Qiw4QkFBOEIsWUFKL0IsWUFBWSxFQUFDLGFBQWEsRUFBQyxhQUFhOzRGQUl2Qyw4QkFBOEI7a0JBTDFDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFDLGFBQWEsRUFBQyxhQUFhLENBQUM7b0JBQ25ELFlBQVksRUFBRSxDQUFDLDhCQUE4QixDQUFDO29CQUM5QyxPQUFPLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztpQkFDMUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IFJ1Y01ldGVyZWRQcm9ncmVzc0JhckNvbXBvbmVudCB9IGZyb20gJy4vcnVjLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyL3J1Yy1tZXRlcmVkLXByb2dyZXNzLWJhci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XHJcblxyXG5cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLE1hdEljb25Nb2R1bGUsTWF0Q2FyZE1vZHVsZV0sXHJcbiAgZGVjbGFyYXRpb25zOiBbUnVjTWV0ZXJlZFByb2dyZXNzQmFyQ29tcG9uZW50XSxcclxuICBleHBvcnRzOiBbUnVjTWV0ZXJlZFByb2dyZXNzQmFyQ29tcG9uZW50XSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJ1Y2xpYk1ldGVyZWRQcm9ncmVzc0Jhck1vZHVsZSB7fVxyXG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLWxpYi1tZXRlcmVkLXByb2dyZXNzLWJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWMtbGliLW1ldGVyZWQtcHJvZ3Jlc3MtYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component, Input, NgModule } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/common';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
import * as i2 from '@angular/material/card';
|
|
7
|
+
import { MatCardModule } from '@angular/material/card';
|
|
8
|
+
|
|
9
|
+
var LablePositionEnums;
|
|
10
|
+
(function (LablePositionEnums) {
|
|
11
|
+
LablePositionEnums["left"] = "left";
|
|
12
|
+
LablePositionEnums["right"] = "right";
|
|
13
|
+
LablePositionEnums["same"] = "same";
|
|
14
|
+
LablePositionEnums["top"] = "top";
|
|
15
|
+
LablePositionEnums["bottom"] = "bottom";
|
|
16
|
+
})(LablePositionEnums || (LablePositionEnums = {}));
|
|
17
|
+
|
|
18
|
+
class RucMeteredProgressBarComponent {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.hoveredCategoryDetail = null;
|
|
21
|
+
this.hoverLabelStyle = { left: '0px', top: '-28px', display: 'none', transform: 'translateX(-50%)' };
|
|
22
|
+
this.progressPercentage = 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Calculates the total value of all categories.
|
|
26
|
+
* @returns The sum of all category values.
|
|
27
|
+
*/
|
|
28
|
+
get totalValue() {
|
|
29
|
+
return this.rucInputData.categories.reduce((sum, category) => sum + category.value, 0);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculates the overall progress percentage of the bar based on total value, min, and max.
|
|
33
|
+
* @returns The progress as a percentage (0-100).
|
|
34
|
+
*/
|
|
35
|
+
get progress() {
|
|
36
|
+
return ((this.totalValue - this.rucInputData.min) / (this.rucInputData.max - this.rucInputData.min)) * 100;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Determines if the progress bar is oriented vertically.
|
|
40
|
+
* @returns True if the orientation is 'vertical', false otherwise.
|
|
41
|
+
*/
|
|
42
|
+
get isVertical() {
|
|
43
|
+
return this.rucInputData.orientation === 'vertical';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Generates the CSS linear-gradient string for the progress bar.
|
|
47
|
+
* The gradient is composed of segments based on category values and colors.
|
|
48
|
+
* If no categories or total value is zero, it returns a transparent gradient.
|
|
49
|
+
* @returns A CSS linear-gradient string.
|
|
50
|
+
*/
|
|
51
|
+
get progressStyles() {
|
|
52
|
+
var _a;
|
|
53
|
+
const direction = this.isVertical ? 'to bottom' : 'to right';
|
|
54
|
+
if (!this.rucInputData || !this.rucInputData.categories) {
|
|
55
|
+
return { background: 'transparent' };
|
|
56
|
+
}
|
|
57
|
+
const total = this.totalValue;
|
|
58
|
+
const colorStops = [];
|
|
59
|
+
let cumulativePercentage = 0;
|
|
60
|
+
if (total > 0) {
|
|
61
|
+
this.rucInputData.categories.forEach(category => {
|
|
62
|
+
if (category.value <= 0)
|
|
63
|
+
return; // Skip categories with zero or negative contribution
|
|
64
|
+
const segmentPercentage = (category.value / total) * 100;
|
|
65
|
+
const color = category.color;
|
|
66
|
+
// Add start of the segment using the previous cumulative percentage
|
|
67
|
+
colorStops.push(`${color} ${cumulativePercentage}%`);
|
|
68
|
+
// Update cumulative percentage for the end of this segment
|
|
69
|
+
cumulativePercentage += segmentPercentage;
|
|
70
|
+
// Add end of the segment
|
|
71
|
+
// Use Math.min to cap at 100% in case of floating point overshoot on the last segment
|
|
72
|
+
colorStops.push(`${color} ${Math.min(cumulativePercentage, 100)}%`);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (colorStops.length === 0) {
|
|
76
|
+
return { background: 'transparent' };
|
|
77
|
+
}
|
|
78
|
+
const baseGradient = `linear-gradient(${direction}, ${colorStops.join(', ')})`;
|
|
79
|
+
const styles = {};
|
|
80
|
+
const barStyle = (_a = this.rucInputData) === null || _a === void 0 ? void 0 : _a.barStyle;
|
|
81
|
+
switch (barStyle) {
|
|
82
|
+
case 'stripe':
|
|
83
|
+
// This uses multiple backgrounds for an overlay effect, as requested.
|
|
84
|
+
styles['background'] = `repeating-linear-gradient(-45deg, transparent, transparent 5px, rgba(0, 0, 0, 0.1) 5px, rgba(0, 0, 0, 0.1) 10px), ${baseGradient}`;
|
|
85
|
+
break;
|
|
86
|
+
case 'circle': {
|
|
87
|
+
// This uses a mask. The background is the color, the mask cuts out the shape.
|
|
88
|
+
styles['background'] = baseGradient;
|
|
89
|
+
// A repeating pattern of circles. Each circle has a diameter of 8px, with a 4px gap.
|
|
90
|
+
const circleMask = 'radial-gradient(circle, black 4px, transparent 4px) 0 0 / 12px 12px';
|
|
91
|
+
styles['-webkit-mask'] = circleMask;
|
|
92
|
+
styles['mask'] = circleMask;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case 'rectangle': {
|
|
96
|
+
styles['background'] = baseGradient;
|
|
97
|
+
// For vertical bar, create horizontal rectangles (0deg). For horizontal bar, create vertical rectangles (90deg).
|
|
98
|
+
const rectDirection = this.isVertical ? '0deg' : '90deg';
|
|
99
|
+
// A repeating pattern of bars. Each bar is 6px wide with a 6px gap.
|
|
100
|
+
const rectangleMask = `repeating-linear-gradient(${rectDirection}, black, black 6px, transparent 6px, transparent 12px)`;
|
|
101
|
+
styles['-webkit-mask'] = rectangleMask;
|
|
102
|
+
styles['mask'] = rectangleMask;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
default: // 'solid' or undefined
|
|
106
|
+
styles['background'] = baseGradient;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
return styles;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Handles mouse movement over the progress bar to display category-specific hover details.
|
|
113
|
+
* It calculates the hovered segment based on mouse position and updates the hover label.
|
|
114
|
+
* @param event The MouseEvent object.
|
|
115
|
+
*/
|
|
116
|
+
onProgressMouseMove(event) {
|
|
117
|
+
const progressBarElement = event.target;
|
|
118
|
+
let currentCumulativeGradientPct = 0;
|
|
119
|
+
let foundCategoryForHover = null;
|
|
120
|
+
let hoverPercentage_onFilledBar = 0;
|
|
121
|
+
let mousePositionWithinProgressDiv = 0;
|
|
122
|
+
if (this.isVertical) {
|
|
123
|
+
mousePositionWithinProgressDiv = event.offsetY; // Y position within the .progress div
|
|
124
|
+
const filledHeightPx = progressBarElement.offsetHeight;
|
|
125
|
+
if (filledHeightPx <= 0) { // Avoid division by zero if element has no height
|
|
126
|
+
this.onProgressMouseLeave();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
hoverPercentage_onFilledBar = (mousePositionWithinProgressDiv / filledHeightPx) * 100;
|
|
130
|
+
}
|
|
131
|
+
else { // Horizontal
|
|
132
|
+
mousePositionWithinProgressDiv = event.offsetX; // X position within the .progress div
|
|
133
|
+
const filledWidthPx = progressBarElement.offsetWidth;
|
|
134
|
+
if (filledWidthPx <= 0) { // Avoid division by zero if element has no width
|
|
135
|
+
this.onProgressMouseLeave();
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
hoverPercentage_onFilledBar = (mousePositionWithinProgressDiv / filledWidthPx) * 100;
|
|
139
|
+
}
|
|
140
|
+
if (this.totalValue > 0) {
|
|
141
|
+
for (const category of this.rucInputData.categories) {
|
|
142
|
+
if (category.value <= 0)
|
|
143
|
+
continue; // Skip categories with zero or negative contribution
|
|
144
|
+
const segmentGradientPct = (category.value / this.totalValue) * 100;
|
|
145
|
+
const segmentStartGradientPct = currentCumulativeGradientPct;
|
|
146
|
+
const segmentEndGradientPct = currentCumulativeGradientPct + segmentGradientPct;
|
|
147
|
+
// Ensure hoverPercentage is within the segment, handling potential floating point inaccuracies for the last segment
|
|
148
|
+
if (hoverPercentage_onFilledBar >= segmentStartGradientPct && // Check if mouse is within or at the start of the segment
|
|
149
|
+
(hoverPercentage_onFilledBar < segmentEndGradientPct ||
|
|
150
|
+
(segmentEndGradientPct >= 99.99 && hoverPercentage_onFilledBar <= 100.01))) { // Tolerate slight overshoot for last segment
|
|
151
|
+
foundCategoryForHover = category;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
currentCumulativeGradientPct = segmentEndGradientPct;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (foundCategoryForHover) {
|
|
158
|
+
const percentageOfMax = (foundCategoryForHover.value / this.rucInputData.max) * 100; // Calculate percentage relative to max value
|
|
159
|
+
this.hoveredCategoryDetail = { category: foundCategoryForHover, percentageText: percentageOfMax.toFixed(0) + '%' };
|
|
160
|
+
if (this.isVertical) {
|
|
161
|
+
this.hoverLabelStyle = {
|
|
162
|
+
left: 'calc(100% + 5px)',
|
|
163
|
+
top: mousePositionWithinProgressDiv + 'px',
|
|
164
|
+
display: 'block',
|
|
165
|
+
transform: 'translateY(-50%)' // Vertically center label on mouse Y
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.hoverLabelStyle = {
|
|
170
|
+
left: mousePositionWithinProgressDiv + 'px',
|
|
171
|
+
top: '-28px',
|
|
172
|
+
display: 'block',
|
|
173
|
+
transform: 'translateX(-50%)' // Horizontally center label on mouse X
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
this.hoveredCategoryDetail = null;
|
|
179
|
+
this.hoverLabelStyle = Object.assign(Object.assign({}, this.hoverLabelStyle), { display: 'none' });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Hides the hover label when the mouse leaves the progress bar.
|
|
184
|
+
*/
|
|
185
|
+
onProgressMouseLeave() {
|
|
186
|
+
this.hoveredCategoryDetail = null;
|
|
187
|
+
this.hoverLabelStyle = Object.assign(Object.assign({}, this.hoverLabelStyle), { display: 'none' });
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* get the label position string value
|
|
191
|
+
*/
|
|
192
|
+
get LablePositionEnums() {
|
|
193
|
+
return LablePositionEnums;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
RucMeteredProgressBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RucMeteredProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
197
|
+
RucMeteredProgressBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RucMeteredProgressBarComponent, selector: "uxp-ruc-metered-progress-bar", inputs: { rucInputData: "rucInputData", customTheme: "customTheme" }, ngImport: i0, template: "<div class=\"progress-container\" class={{customTheme}} [class.vertical]=\"isVertical\" [class.horizontal]=\"!isVertical\">\r\n <div class=\"progress-bar\">\r\n <!-- Removed (mouseenter) and (mouseleave) from progress-bar if only category hover is needed -->\r\n <div *ngIf=\"rucInputData.barLabels\" class=\"progress-label-container {{rucInputData.orientation}}\">\r\n <p class=\"progress-label\">{{progress | number:'1.0-0'}}% of {{rucInputData.max}} {{rucInputData.unitType}}\r\n Used</p>\r\n </div>\r\n <!-- <mat-progress-bar> -->\r\n <div class=\"progress\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\"\r\n [style.transition]=\"rucInputData.orientation === 'vertical' ? 'height 0.3s ease' : 'width 0.3s ease'\"\r\n [ngStyle]=\"progressStyles\">\r\n <!-- This div is now only for displaying the colored bar -->\r\n </div>\r\n <!-- </mat-progress-bar> -->\r\n <!-- The hover label is now a sibling to .progress, positioned absolutely within .progress-bar -->\r\n <div class=\"hover-label\" *ngIf=\"hoveredCategoryDetail\" [ngStyle]=\"hoverLabelStyle\">\r\n {{hoveredCategoryDetail.category.label}}: {{hoveredCategoryDetail.percentageText}}\r\n </div>\r\n <!-- This overlay is now a sibling to .progress, sized to match it, to reliably capture mouse events -->\r\n <div class=\"progress-event-overlay\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\" (mousemove)=\"onProgressMouseMove($event)\"\r\n (mouseleave)=\"onProgressMouseLeave()\"></div>\r\n </div>\r\n <div class=\"categories-container\" *ngIf=\"rucInputData.categories.length > 0\">\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'basic'\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === 'top' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same')\r\n }\" class=\"categories\">\r\n <div class=\"category\" *ngFor=\"let category of rucInputData.categories\" [style.color]=\"category.color\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotBasic\" class=\"category-icon-wrapper\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotBasic>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <span class=\"category-label\">{{category.label}}</span>\r\n <p class=\"category-value\">({{(category.value / rucInputData.max * 100) | number:'1.0-0' }}%)</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'widget'\"\r\n class=\"categories widget-style\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.top || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same)\r\n }\">\r\n <ng-container *ngFor=\"let category of rucInputData.categories\">\r\n <mat-card>\r\n <div class=\"widget-category\">\r\n <div class=\"widget-content\">\r\n <div class=\"widget-icon-box\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotWidget\" class=\"widget-icon\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotWidget>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"widget-label\">{{category.label}}</div>\r\n </div>\r\n </div>\r\n <div class=\"widget-value\">\r\n <div>{{category.value}}</div>\r\n </div>\r\n </div>\r\n </mat-card>\r\n\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".progress-container{position:relative;margin:20px 0}.progress-container.horizontal{width:100%;height:35px}.progress-container.horizontal .progress-bar{width:100%;height:42%}.progress-container.vertical{width:60px;height:320px;margin:0 auto}.progress-container.vertical .progress-bar{width:24%;height:100%}.progress-label-container{position:absolute;z-index:2;width:100%;height:100%;pointer-events:none;display:flex}.progress-label-container.horizontal{justify-content:right;align-items:flex-end;bottom:15px}.progress-label-container.vertical{justify-content:flex-start;align-items:flex-end;left:35px}.progress-label{padding:2px 5px;font-size:12px;white-space:nowrap}.progress-label-container.horizontal .progress-label{margin-top:5px;margin-right:5px}.progress-label-container.vertical .progress-label{transform:rotate(-90deg);transform-origin:bottom left;margin-right:5px}.progress-bar{position:relative;border:1px solid #e0e0e0;border-radius:4px}.progress-bar .hover-label{position:absolute;top:-28px;left:50%;transform:translate(-50%);background-color:#000c;color:#fff;padding:4px 8px;border-radius:4px;font-size:.8em;z-index:5;white-space:nowrap;pointer-events:none}.progress-event-overlay{position:absolute;top:0;left:0;z-index:4}.progress{position:relative;background:#2196F3;transition:width .3s ease,height .3s ease}.progress-bar.horizontal .progress{width:100%;height:100%}.progress-bar.vertical .progress{width:100%;height:0}.icons-container{position:absolute;display:flex;justify-content:space-between;width:100%;height:100%;align-items:center}.icons-container i{position:absolute;font-size:1.2em;color:#fff}.start-icon{left:0}.end-icon{right:0}.above-threshold{color:gold}.categories-container{width:100%;box-sizing:border-box}.categories{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px}.categories-block-top,.categories-block-bottom,.categories-block-left,.categories-block-right{position:absolute;z-index:1}.categories-block-top{bottom:100%;left:0;padding-bottom:8px}.categories-block-bottom{top:100%;left:0;padding-top:10px}.categories-block-left{right:100%;top:0;padding-right:8px;width:200px}.categories-block-left .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.categories-block-right{left:100%;top:0;padding-left:8px;width:200px}.categories-block-right .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.category{display:flex;align-items:center;gap:6px;padding:8px;border-radius:4px}.category-label{font-weight:500}.category-value{font-size:.9em}.category-color{width:10px;height:10px;border-radius:50%;overflow:hidden;flex-shrink:0}.category-icon-wrapper{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.color-gradient{width:100%;height:100%}.categories.widget-style{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-start;align-items:flex-start;margin:10px 0}.categories.widget-style .widget-category{width:calc(25% - 7.5px);min-width:159px;box-sizing:border-box;flex-shrink:0;flex-grow:0}@media (max-width: 1200px){.categories.widget-style .widget-category{width:calc(33.33% - 6.66px)}}@media (max-width: 768px){.categories.widget-style .widget-category{width:calc(50% - 5px)}}@media (max-width: 480px){.categories.widget-style .widget-category{width:100%}}.categories-block-left,.categories-block-right{flex-direction:inherit;align-items:flex-start;gap:10px}.categories-block-left .widget-category,.categories-block-right .widget-category{width:100%;max-width:none}.widget-category{padding:10px 15px}.widget-content{display:flex;width:100%;align-items:center;margin:0}.widget-icon{border:1px solid #ddd;border-radius:10px;width:35px;height:35px;line-height:45px;text-align:center;background-color:#fdfdfd}.widget-content .category-color{margin-right:35px}.widget-icon,.widget-color{margin-right:8px;flex-shrink:0}.widget-color{width:24px;height:24px;border-radius:50%}.widget-label{flex-grow:1;text-align:left;display:block}.widget-value{font-weight:700;flex-shrink:0;margin-left:45px;text-align:left;margin-top:5px}.widget-icon-box{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
198
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RucMeteredProgressBarComponent, decorators: [{
|
|
199
|
+
type: Component,
|
|
200
|
+
args: [{ selector: 'uxp-ruc-metered-progress-bar', template: "<div class=\"progress-container\" class={{customTheme}} [class.vertical]=\"isVertical\" [class.horizontal]=\"!isVertical\">\r\n <div class=\"progress-bar\">\r\n <!-- Removed (mouseenter) and (mouseleave) from progress-bar if only category hover is needed -->\r\n <div *ngIf=\"rucInputData.barLabels\" class=\"progress-label-container {{rucInputData.orientation}}\">\r\n <p class=\"progress-label\">{{progress | number:'1.0-0'}}% of {{rucInputData.max}} {{rucInputData.unitType}}\r\n Used</p>\r\n </div>\r\n <!-- <mat-progress-bar> -->\r\n <div class=\"progress\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\"\r\n [style.transition]=\"rucInputData.orientation === 'vertical' ? 'height 0.3s ease' : 'width 0.3s ease'\"\r\n [ngStyle]=\"progressStyles\">\r\n <!-- This div is now only for displaying the colored bar -->\r\n </div>\r\n <!-- </mat-progress-bar> -->\r\n <!-- The hover label is now a sibling to .progress, positioned absolutely within .progress-bar -->\r\n <div class=\"hover-label\" *ngIf=\"hoveredCategoryDetail\" [ngStyle]=\"hoverLabelStyle\">\r\n {{hoveredCategoryDetail.category.label}}: {{hoveredCategoryDetail.percentageText}}\r\n </div>\r\n <!-- This overlay is now a sibling to .progress, sized to match it, to reliably capture mouse events -->\r\n <div class=\"progress-event-overlay\" [style.width]=\"isVertical ? '100%' : progress + '%'\"\r\n [style.height]=\"isVertical ? progress + '%' : '100%'\" (mousemove)=\"onProgressMouseMove($event)\"\r\n (mouseleave)=\"onProgressMouseLeave()\"></div>\r\n </div>\r\n <div class=\"categories-container\" *ngIf=\"rucInputData.categories.length > 0\">\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'basic'\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === 'top' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same'),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === 'left' || rucInputData.categoryLabelsOrientation === 'same')\r\n }\" class=\"categories\">\r\n <div class=\"category\" *ngFor=\"let category of rucInputData.categories\" [style.color]=\"category.color\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotBasic\" class=\"category-icon-wrapper\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotBasic>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <span class=\"category-label\">{{category.label}}</span>\r\n <p class=\"category-value\">({{(category.value / rucInputData.max * 100) | number:'1.0-0' }}%)</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"rucInputData.showCategoryLabels && rucInputData.categoryLabelStyle === 'widget'\"\r\n class=\"categories widget-style\" [ngClass]=\"{\r\n 'categories-block-top': !isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.top || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-left': isVertical && (rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same),\r\n 'categories-block-right': isVertical && !(rucInputData.categoryLabelsOrientation === LablePositionEnums.left || rucInputData.categoryLabelsOrientation === LablePositionEnums.same)\r\n }\">\r\n <ng-container *ngFor=\"let category of rucInputData.categories\">\r\n <mat-card>\r\n <div class=\"widget-category\">\r\n <div class=\"widget-content\">\r\n <div class=\"widget-icon-box\">\r\n <ng-container *ngIf=\"category.icon !== undefined\">\r\n <div *ngIf=\"category.icon; else colorDotWidget\" class=\"widget-icon\">\r\n <i class=\"material-icons\" [style.color]=\"category.color\">{{ category.icon }}</i>\r\n </div>\r\n <ng-template #colorDotWidget>\r\n <div class=\"category-color\">\r\n <div class=\"color-gradient\"\r\n [style.background]=\"category.color ? 'linear-gradient(to right, ' + category.color + ', ' + category.color + ')' : ''\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"widget-label\">{{category.label}}</div>\r\n </div>\r\n </div>\r\n <div class=\"widget-value\">\r\n <div>{{category.value}}</div>\r\n </div>\r\n </div>\r\n </mat-card>\r\n\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".progress-container{position:relative;margin:20px 0}.progress-container.horizontal{width:100%;height:35px}.progress-container.horizontal .progress-bar{width:100%;height:42%}.progress-container.vertical{width:60px;height:320px;margin:0 auto}.progress-container.vertical .progress-bar{width:24%;height:100%}.progress-label-container{position:absolute;z-index:2;width:100%;height:100%;pointer-events:none;display:flex}.progress-label-container.horizontal{justify-content:right;align-items:flex-end;bottom:15px}.progress-label-container.vertical{justify-content:flex-start;align-items:flex-end;left:35px}.progress-label{padding:2px 5px;font-size:12px;white-space:nowrap}.progress-label-container.horizontal .progress-label{margin-top:5px;margin-right:5px}.progress-label-container.vertical .progress-label{transform:rotate(-90deg);transform-origin:bottom left;margin-right:5px}.progress-bar{position:relative;border:1px solid #e0e0e0;border-radius:4px}.progress-bar .hover-label{position:absolute;top:-28px;left:50%;transform:translate(-50%);background-color:#000c;color:#fff;padding:4px 8px;border-radius:4px;font-size:.8em;z-index:5;white-space:nowrap;pointer-events:none}.progress-event-overlay{position:absolute;top:0;left:0;z-index:4}.progress{position:relative;background:#2196F3;transition:width .3s ease,height .3s ease}.progress-bar.horizontal .progress{width:100%;height:100%}.progress-bar.vertical .progress{width:100%;height:0}.icons-container{position:absolute;display:flex;justify-content:space-between;width:100%;height:100%;align-items:center}.icons-container i{position:absolute;font-size:1.2em;color:#fff}.start-icon{left:0}.end-icon{right:0}.above-threshold{color:gold}.categories-container{width:100%;box-sizing:border-box}.categories{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px}.categories-block-top,.categories-block-bottom,.categories-block-left,.categories-block-right{position:absolute;z-index:1}.categories-block-top{bottom:100%;left:0;padding-bottom:8px}.categories-block-bottom{top:100%;left:0;padding-top:10px}.categories-block-left{right:100%;top:0;padding-right:8px;width:200px}.categories-block-left .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.categories-block-right{left:100%;top:0;padding-left:8px;width:200px}.categories-block-right .categories{flex-direction:inherit;align-items:flex-start;gap:0px}.category{display:flex;align-items:center;gap:6px;padding:8px;border-radius:4px}.category-label{font-weight:500}.category-value{font-size:.9em}.category-color{width:10px;height:10px;border-radius:50%;overflow:hidden;flex-shrink:0}.category-icon-wrapper{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.color-gradient{width:100%;height:100%}.categories.widget-style{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-start;align-items:flex-start;margin:10px 0}.categories.widget-style .widget-category{width:calc(25% - 7.5px);min-width:159px;box-sizing:border-box;flex-shrink:0;flex-grow:0}@media (max-width: 1200px){.categories.widget-style .widget-category{width:calc(33.33% - 6.66px)}}@media (max-width: 768px){.categories.widget-style .widget-category{width:calc(50% - 5px)}}@media (max-width: 480px){.categories.widget-style .widget-category{width:100%}}.categories-block-left,.categories-block-right{flex-direction:inherit;align-items:flex-start;gap:10px}.categories-block-left .widget-category,.categories-block-right .widget-category{width:100%;max-width:none}.widget-category{padding:10px 15px}.widget-content{display:flex;width:100%;align-items:center;margin:0}.widget-icon{border:1px solid #ddd;border-radius:10px;width:35px;height:35px;line-height:45px;text-align:center;background-color:#fdfdfd}.widget-content .category-color{margin-right:35px}.widget-icon,.widget-color{margin-right:8px;flex-shrink:0}.widget-color{width:24px;height:24px;border-radius:50%}.widget-label{flex-grow:1;text-align:left;display:block}.widget-value{font-weight:700;flex-shrink:0;margin-left:45px;text-align:left;margin-top:5px}.widget-icon-box{display:flex;align-items:center}\n"] }]
|
|
201
|
+
}], propDecorators: { rucInputData: [{
|
|
202
|
+
type: Input
|
|
203
|
+
}], customTheme: [{
|
|
204
|
+
type: Input
|
|
205
|
+
}] } });
|
|
206
|
+
|
|
207
|
+
class RuclibMeteredProgressBarModule {
|
|
208
|
+
}
|
|
209
|
+
RuclibMeteredProgressBarModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
210
|
+
RuclibMeteredProgressBarModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, declarations: [RucMeteredProgressBarComponent], imports: [CommonModule, MatIconModule, MatCardModule], exports: [RucMeteredProgressBarComponent] });
|
|
211
|
+
RuclibMeteredProgressBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, imports: [CommonModule, MatIconModule, MatCardModule] });
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibMeteredProgressBarModule, decorators: [{
|
|
213
|
+
type: NgModule,
|
|
214
|
+
args: [{
|
|
215
|
+
imports: [CommonModule, MatIconModule, MatCardModule],
|
|
216
|
+
declarations: [RucMeteredProgressBarComponent],
|
|
217
|
+
exports: [RucMeteredProgressBarComponent],
|
|
218
|
+
}]
|
|
219
|
+
}] });
|
|
220
|
+
|
|
221
|
+
class MeteredBarConfig {
|
|
222
|
+
}
|
|
223
|
+
class CategoryConfig {
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Generated bundle index. Do not edit.
|
|
228
|
+
*/
|
|
229
|
+
|
|
230
|
+
export { CategoryConfig, MeteredBarConfig, RucMeteredProgressBarComponent, RuclibMeteredProgressBarModule };
|
|
231
|
+
//# sourceMappingURL=ruc-lib-metered-progress-bar.mjs.map
|