@rivet-health/design-system 2.14.0 → 2.15.0

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.
@@ -37,10 +37,10 @@ export class SingleSelectComponent {
37
37
  }
38
38
  }
39
39
  SingleSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SingleSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
40
- SingleSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SingleSelectComponent, selector: "riv-single-select", inputs: { options: "options", selectedOption: "selectedOption", filterabilityOptions: "filterabilityOptions", loading: "loading", noOptionsMessage: "noOptionsMessage", nodeTemplate: "nodeTemplate", placeholder: "placeholder" }, outputs: { filterQueryChange: "filterQueryChange", selectedOptionChange: "selectedOptionChange" }, ngImport: i0, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:scroll}.single-select-node{display:flex;align-items:center;overflow:hidden;flex-grow:1;text-align:left;padding:var(--size-xsmall) var(--size-xsmall) var(--size-xsmall) calc(var(--base-grid-size) * 6);width:100%}.single-select-node.selected{padding-left:var(--size-small)}.single-select-node:hover{background-color:var(--surface-light-2)}.single-select-node.disabled{cursor:default;background-color:var(--surface-light-0)}.single-select-node.disabled .label,.single-select-node.disabled .label-subtitle{color:var(--type-light-disabled)}.single-select-node riv-icon{flex-shrink:0}.single-select-node .label{font-size:calc(var(--base-grid-size) * 4);line-height:calc(var(--base-grid-size) * 6);overflow:hidden;text-overflow:ellipsis;white-space:pre;flex-grow:1;padding:0 calc(var(--base-grid-size) * 2)}.single-select-node .label-subtitle{padding-left:var(--base-grid-size);color:var(--type-light-low-contrast)}.custom-single-select-node{display:block;width:100%;text-align:left}.empty{padding:var(--size-medium);text-align:center;color:var(--type-light-disabled)}\n"], dependencies: [{ 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.HighlightComponent, selector: "riv-highlight", inputs: ["text", "indices"] }, { kind: "component", type: i4.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i5.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "errorMessage"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
40
+ SingleSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SingleSelectComponent, selector: "riv-single-select", inputs: { options: "options", selectedOption: "selectedOption", filterabilityOptions: "filterabilityOptions", loading: "loading", noOptionsMessage: "noOptionsMessage", nodeTemplate: "nodeTemplate", placeholder: "placeholder" }, outputs: { filterQueryChange: "filterQueryChange", selectedOptionChange: "selectedOptionChange" }, ngImport: i0, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:auto}.single-select-node{display:flex;align-items:center;overflow:hidden;flex-grow:1;text-align:left;padding:var(--size-xsmall) var(--size-xsmall) var(--size-xsmall) calc(var(--base-grid-size) * 6);width:100%}.single-select-node.selected{padding-left:var(--size-small)}.single-select-node:hover{background-color:var(--surface-light-2)}.single-select-node.disabled{cursor:default;background-color:var(--surface-light-0)}.single-select-node.disabled .label,.single-select-node.disabled .label-subtitle{color:var(--type-light-disabled)}.single-select-node riv-icon{flex-shrink:0}.single-select-node .label{font-size:calc(var(--base-grid-size) * 4);line-height:calc(var(--base-grid-size) * 6);overflow:hidden;text-overflow:ellipsis;white-space:pre;flex-grow:1;padding:0 calc(var(--base-grid-size) * 2)}.single-select-node .label-subtitle{padding-left:var(--base-grid-size);color:var(--type-light-low-contrast)}.custom-single-select-node{display:block;width:100%;text-align:left}.empty{padding:var(--size-medium);text-align:center;color:var(--type-light-disabled)}\n"], dependencies: [{ 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.HighlightComponent, selector: "riv-highlight", inputs: ["text", "indices"] }, { kind: "component", type: i4.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i5.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "errorMessage"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
41
41
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SingleSelectComponent, decorators: [{
42
42
  type: Component,
43
- args: [{ selector: 'riv-single-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:scroll}.single-select-node{display:flex;align-items:center;overflow:hidden;flex-grow:1;text-align:left;padding:var(--size-xsmall) var(--size-xsmall) var(--size-xsmall) calc(var(--base-grid-size) * 6);width:100%}.single-select-node.selected{padding-left:var(--size-small)}.single-select-node:hover{background-color:var(--surface-light-2)}.single-select-node.disabled{cursor:default;background-color:var(--surface-light-0)}.single-select-node.disabled .label,.single-select-node.disabled .label-subtitle{color:var(--type-light-disabled)}.single-select-node riv-icon{flex-shrink:0}.single-select-node .label{font-size:calc(var(--base-grid-size) * 4);line-height:calc(var(--base-grid-size) * 6);overflow:hidden;text-overflow:ellipsis;white-space:pre;flex-grow:1;padding:0 calc(var(--base-grid-size) * 2)}.single-select-node .label-subtitle{padding-left:var(--base-grid-size);color:var(--type-light-low-contrast)}.custom-single-select-node{display:block;width:100%;text-align:left}.empty{padding:var(--size-medium);text-align:center;color:var(--type-light-disabled)}\n"] }]
43
+ args: [{ selector: 'riv-single-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button #trigger class=\"trigger\" (click)=\"open = true\">\n <ng-container *ngIf=\"selectedOption; else placeholderValue\">\n <span class=\"value\">{{ selectedOption.title }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'ChevronDown'\" [size]=\"16\"></riv-icon>\n </span>\n</button>\n\n<riv-callout\n *ngIf=\"open\"\n [anchor]=\"trigger\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left'\n ]\"\n (close)=\"open = false\"\n>\n <input\n *ngIf=\"filterabilityOptions.enabled\"\n #filter\n class=\"filter\"\n [placeholder]=\"getFilterPlaceholder()\"\n [value]=\"filterQuery\"\n (input)=\"filterQuery = filter.value; filterQueryChange.emit(filterQuery)\"\n />\n <div class=\"options\">\n <riv-loading-cover [loading]=\"loading\">\n <ng-container *ngIf=\"getNodes(); let nodes\">\n <ng-container *ngIf=\"nodes.length > 0; else empty\">\n <ng-container *ngFor=\"let node of nodes\">\n <ng-container *ngIf=\"nodeTemplate; else standardTemplate\">\n <button\n class=\"custom-single-select-node\"\n [disabled]=\"node.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"\n ></ng-container>\n </button>\n </ng-container>\n <ng-template #standardTemplate>\n <button\n class=\"single-select-node\"\n [class.selected]=\"node?.selected\"\n [class.disabled]=\"node?.disabled\"\n (click)=\"selectedOptionChange.emit(node); open = false\"\n >\n <riv-icon\n [name]=\"'Check'\"\n *ngIf=\"node?.selected\"\n [size]=\"16\"\n ></riv-icon>\n <span class=\"label\">\n <span class=\"label-title\">\n <riv-highlight\n [text]=\"node?.title || ''\"\n [indices]=\"node?.titleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n <span *ngIf=\"node?.subtitle\" class=\"label-subtitle\">\n <riv-highlight\n [text]=\"node?.subtitle || ''\"\n [indices]=\"node?.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </span>\n </span>\n </button>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #empty>\n <div class=\"empty\">\n {{ noOptionsMessage }}\n </div>\n </ng-template>\n </ng-container>\n </riv-loading-cover>\n </div>\n</riv-callout>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small)}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-disabled)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-small);background-color:var(--surface-light-2);border-left:var(--border-width) solid var(--border-light)}.filter{width:100%;outline:none;border:none;border-bottom:var(--border-width) solid var(--border-light);font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small)}.filter::placeholder{color:var(--type-light-disabled)}.options{max-height:calc(var(--base-grid-size) * 200);max-width:calc(var(--base-grid-size) * 150);overflow-y:auto}.single-select-node{display:flex;align-items:center;overflow:hidden;flex-grow:1;text-align:left;padding:var(--size-xsmall) var(--size-xsmall) var(--size-xsmall) calc(var(--base-grid-size) * 6);width:100%}.single-select-node.selected{padding-left:var(--size-small)}.single-select-node:hover{background-color:var(--surface-light-2)}.single-select-node.disabled{cursor:default;background-color:var(--surface-light-0)}.single-select-node.disabled .label,.single-select-node.disabled .label-subtitle{color:var(--type-light-disabled)}.single-select-node riv-icon{flex-shrink:0}.single-select-node .label{font-size:calc(var(--base-grid-size) * 4);line-height:calc(var(--base-grid-size) * 6);overflow:hidden;text-overflow:ellipsis;white-space:pre;flex-grow:1;padding:0 calc(var(--base-grid-size) * 2)}.single-select-node .label-subtitle{padding-left:var(--base-grid-size);color:var(--type-light-low-contrast)}.custom-single-select-node{display:block;width:100%;text-align:left}.empty{padding:var(--size-medium);text-align:center;color:var(--type-light-disabled)}\n"] }]
44
44
  }], propDecorators: { options: [{
45
45
  type: Input
46
46
  }], selectedOption: [{
@@ -0,0 +1,63 @@
1
+ import { timeDay, timeMonth, timeWeek, timeYear } from 'd3-time';
2
+ export const intervals = ['year', 'quarter', 'month', 'week', 'day'];
3
+ export function getTimeInterval(interval) {
4
+ switch (interval) {
5
+ case 'day':
6
+ return timeDay;
7
+ case 'week':
8
+ return timeWeek;
9
+ case 'month':
10
+ return timeMonth;
11
+ case 'quarter':
12
+ return timeMonth.every(3);
13
+ case 'year':
14
+ return timeYear;
15
+ }
16
+ }
17
+ export function getMinorIntervalFormat(interval) {
18
+ switch (interval) {
19
+ case 'day':
20
+ case 'week':
21
+ return '%-d';
22
+ case 'month':
23
+ return '%b';
24
+ case 'quarter':
25
+ return 'Q%q';
26
+ case 'year':
27
+ return '%Y';
28
+ }
29
+ }
30
+ export function getMajorInterval(interval) {
31
+ switch (interval) {
32
+ case 'day':
33
+ case 'week':
34
+ return 'month';
35
+ case 'month':
36
+ case 'quarter':
37
+ case 'year':
38
+ return 'year';
39
+ }
40
+ }
41
+ export function getMajorIntervalFormat(interval, hasMultipleYears) {
42
+ switch (interval) {
43
+ case 'year':
44
+ return hasMultipleYears ? '%Y' : '';
45
+ case 'month':
46
+ return hasMultipleYears ? '%b %Y' : '%b';
47
+ }
48
+ }
49
+ export function getIntervalTitle(interval) {
50
+ switch (interval) {
51
+ case 'year':
52
+ return 'Years';
53
+ case 'quarter':
54
+ return 'Quarters';
55
+ case 'month':
56
+ return 'Months';
57
+ case 'week':
58
+ return 'Weeks';
59
+ case 'day':
60
+ return 'Days';
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9pbnRlcnZhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFL0UsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBVSxDQUFDO0FBRzlFLE1BQU0sVUFBVSxlQUFlLENBQUMsUUFBa0I7SUFDaEQsUUFBUSxRQUFRLEVBQUU7UUFDaEIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxPQUFPLENBQUM7UUFDakIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxRQUFRLENBQUM7UUFDbEIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxTQUFTLENBQUM7UUFDbkIsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQzdCLEtBQUssTUFBTTtZQUNULE9BQU8sUUFBUSxDQUFDO0tBQ25CO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxRQUFrQjtJQUN2RCxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTTtZQUNULE9BQU8sS0FBSyxDQUFDO1FBQ2YsS0FBSyxPQUFPO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLFNBQVM7WUFDWixPQUFPLEtBQUssQ0FBQztRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sSUFBSSxDQUFDO0tBQ2Y7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWtCO0lBQ2pELFFBQVEsUUFBUSxFQUFFO1FBQ2hCLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxNQUFNO1lBQ1QsT0FBTyxPQUFPLENBQUM7UUFDakIsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLFNBQVMsQ0FBQztRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsUUFBNkMsRUFDN0MsZ0JBQXlCO0lBRXpCLFFBQVEsUUFBUSxFQUFFO1FBQ2hCLEtBQUssTUFBTTtZQUNULE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssT0FBTztZQUNWLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0tBQzVDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxRQUFrQjtJQUNqRCxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLE1BQU07WUFDVCxPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLFNBQVM7WUFDWixPQUFPLFVBQVUsQ0FBQztRQUNwQixLQUFLLE9BQU87WUFDVixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDVCxPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLEtBQUs7WUFDUixPQUFPLE1BQU0sQ0FBQztLQUNqQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaW1lSW50ZXJ2YWwsIHRpbWVEYXksIHRpbWVNb250aCwgdGltZVdlZWssIHRpbWVZZWFyIH0gZnJvbSAnZDMtdGltZSc7XG5cbmV4cG9ydCBjb25zdCBpbnRlcnZhbHMgPSBbJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheSddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSW50ZXJ2YWwgPSAodHlwZW9mIGludGVydmFscylbbnVtYmVyXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbDogSW50ZXJ2YWwpOiBUaW1lSW50ZXJ2YWwge1xuICBzd2l0Y2ggKGludGVydmFsKSB7XG4gICAgY2FzZSAnZGF5JzpcbiAgICAgIHJldHVybiB0aW1lRGF5O1xuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgcmV0dXJuIHRpbWVXZWVrO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHJldHVybiB0aW1lTW9udGg7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4gdGltZU1vbnRoLmV2ZXJ5KDMpITtcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHJldHVybiB0aW1lWWVhcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbDogSW50ZXJ2YWwpIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICByZXR1cm4gJyUtZCc7XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuICclYic7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4gJ1ElcSc7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICByZXR1cm4gJyVZJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFqb3JJbnRlcnZhbChpbnRlcnZhbDogSW50ZXJ2YWwpIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICByZXR1cm4gJ21vbnRoJztcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgY2FzZSAneWVhcic6XG4gICAgICByZXR1cm4gJ3llYXInO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWpvckludGVydmFsRm9ybWF0KFxuICBpbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0TWFqb3JJbnRlcnZhbD4sXG4gIGhhc011bHRpcGxlWWVhcnM6IGJvb2xlYW4sXG4pIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuIGhhc011bHRpcGxlWWVhcnMgPyAnJVknIDogJyc7XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIGhhc011bHRpcGxlWWVhcnMgPyAnJWIgJVknIDogJyViJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJ2YWxUaXRsZShpbnRlcnZhbDogSW50ZXJ2YWwpIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuICdZZWFycyc7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4gJ1F1YXJ0ZXJzJztcbiAgICBjYXNlICdtb250aCc6XG4gICAgICByZXR1cm4gJ01vbnRocyc7XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICByZXR1cm4gJ1dlZWtzJztcbiAgICBjYXNlICdkYXknOlxuICAgICAgcmV0dXJuICdEYXlzJztcbiAgfVxufVxuIl19
@@ -1,15 +1,16 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, Input, ViewChild, } from '@angular/core';
2
2
  import { index } from 'd3-array';
3
3
  import { scaleBand, scaleLinear } from 'd3-scale';
4
4
  import { stack } from 'd3-shape';
5
- import { timeMonth } from 'd3-time';
6
5
  import { timeFormat } from 'd3-time-format';
7
- import { BehaviorSubject, combineLatest, map, shareReplay } from 'rxjs';
6
+ import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
7
+ import { getIntervalTitle, getMajorInterval, getMajorIntervalFormat, getMinorIntervalFormat, getTimeInterval, intervals, } from '../intervals';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "@angular/common";
10
10
  import * as i2 from "../../modal/callout/callout.component";
11
11
  import * as i3 from "../../modal/callout/callout.directive";
12
- import * as i4 from "../zero-state/zero-state.component";
12
+ import * as i4 from "../../input/single-select/single-select.component";
13
+ import * as i5 from "../zero-state/zero-state.component";
13
14
  function getDateRange(stacks) {
14
15
  let min = Infinity;
15
16
  let max = -Infinity;
@@ -24,6 +25,20 @@ function getDateRange(stacks) {
24
25
  }
25
26
  return [new Date(min), new Date(max)];
26
27
  }
28
+ function pointReducer(points) {
29
+ return points.reduce((total, { value }) => total + value, 0);
30
+ }
31
+ const MAX_COLUMNS = 72;
32
+ const DEFAULT_INTERVAL = 'month';
33
+ function getColumnWidth(numColumns) {
34
+ if (numColumns <= 6)
35
+ return 72;
36
+ if (numColumns <= 18)
37
+ return 40;
38
+ if (numColumns <= 40)
39
+ return 16;
40
+ return 8;
41
+ }
27
42
  // TODO: once we upgrade to Angular 16, this component can be cleaned up with
28
43
  // signals instead of RxJS.
29
44
  export class StackedColumnComponent {
@@ -32,27 +47,91 @@ export class StackedColumnComponent {
32
47
  this.width$ = new BehaviorSubject(960);
33
48
  this.height$ = new BehaviorSubject(256);
34
49
  this.valueFormatter = v => v.toString();
35
- this.drawData$ = combineLatest([
50
+ this.interval$ = new BehaviorSubject(DEFAULT_INTERVAL);
51
+ this.allowedIntervals$ = this.input$.pipe(map(input => {
52
+ const numVisibleColumns = input.filter(stack => stack.filter(s => s.style === 'tooltipOnly').length === 0).length;
53
+ const [minDate, maxDate] = getDateRange(input);
54
+ return intervals.filter(interval => {
55
+ const timeInterval = getTimeInterval(interval);
56
+ const xStepsCount = timeInterval.range(timeInterval.floor(minDate), timeInterval.floor(timeInterval.offset(maxDate, 1))).length;
57
+ return numVisibleColumns * xStepsCount <= MAX_COLUMNS;
58
+ });
59
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
60
+ this.intervalOptions$ = this.allowedIntervals$.pipe(map(intervals => intervals.map((interval) => ({
61
+ id: interval,
62
+ title: getIntervalTitle(interval),
63
+ }))), shareReplay({ refCount: true, bufferSize: 1 }));
64
+ this.selectedIntervalOption$ = combineLatest([
65
+ this.interval$,
66
+ this.intervalOptions$,
67
+ ]).pipe(map(([interval, options]) => {
68
+ const allowedIntervals = options.map(({ id }) => id);
69
+ if (!allowedIntervals.includes(interval)) {
70
+ const firstAllowed = allowedIntervals.at(0);
71
+ const lastAllowed = allowedIntervals.at(-1);
72
+ if (!firstAllowed || !lastAllowed)
73
+ return null;
74
+ if (intervals.indexOf(interval) < intervals.indexOf(firstAllowed))
75
+ interval = firstAllowed;
76
+ if (intervals.indexOf(interval) > intervals.indexOf(lastAllowed))
77
+ interval = lastAllowed;
78
+ }
79
+ return options.find(o => o.id === interval) ?? null;
80
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
81
+ this.selectedInterval$ = this.selectedIntervalOption$.pipe(map(option => (option ? option.id : DEFAULT_INTERVAL)));
82
+ this.binnedData$ = combineLatest([
36
83
  this.input$,
84
+ this.selectedInterval$,
85
+ ]).pipe(map(([input, interval]) => input.map((stack) => {
86
+ const timeInterval = getTimeInterval(interval);
87
+ return stack.map(series => {
88
+ const binned = new Map();
89
+ for (const point of series.data) {
90
+ const bin = timeInterval.floor(point.date).valueOf();
91
+ if (!binned.has(bin)) {
92
+ binned.set(bin, []);
93
+ }
94
+ binned.get(bin).push(point);
95
+ }
96
+ return {
97
+ ...series,
98
+ data: [...binned.entries()].map(([dateValue, points]) => ({
99
+ date: new Date(dateValue),
100
+ value: pointReducer(points),
101
+ })),
102
+ };
103
+ });
104
+ })), shareReplay({ refCount: true, bufferSize: 1 }));
105
+ this.drawData$ = combineLatest([
106
+ this.binnedData$,
37
107
  this.width$,
38
108
  this.height$,
39
- ]).pipe(map(([input, width, height]) => {
109
+ this.selectedInterval$,
110
+ ]).pipe(map(([binnedData, width, height, interval]) => {
40
111
  const viewBox = `0 0 ${width} ${height}`;
41
- const padding = 8;
42
- const invisColumns = input.filter(stack => stack.filter(s => s.style == 'tooltipOnly').length > 0).length;
43
- const [minDate, maxDate] = getDateRange(input);
44
- const xSteps = timeMonth.range(timeMonth.floor(minDate), timeMonth.floor(timeMonth.offset(maxDate, 1)));
45
- const xFormatter = timeFormat('%b');
112
+ const padding = 16;
113
+ const invisColumns = binnedData.filter(stack => stack.filter(s => s.style == 'tooltipOnly').length > 0).length;
114
+ const visibleColumns = binnedData.length - invisColumns;
115
+ const [minDate, maxDate] = getDateRange(binnedData);
116
+ const hasMultipleYears = minDate.getFullYear() < maxDate.getFullYear();
117
+ const xMinorIntervalFormat = getMinorIntervalFormat(interval);
118
+ const minorFormatter = timeFormat(xMinorIntervalFormat);
119
+ const minorTimeInterval = getTimeInterval(interval);
120
+ const xSteps = minorTimeInterval.range(minorTimeInterval.floor(minDate), minorTimeInterval.floor(minorTimeInterval.offset(maxDate, 1)));
121
+ const xMajorInterval = getMajorInterval(interval);
122
+ const xMajorIntervalFormat = getMajorIntervalFormat(xMajorInterval, hasMultipleYears);
123
+ const majorFormatter = timeFormat(xMajorIntervalFormat);
124
+ const fullFormatter = timeFormat(`${xMinorIntervalFormat} ${xMajorIntervalFormat}`);
46
125
  const xOuterScale = scaleBand()
47
- .domain(xSteps.map(date => xFormatter(date)))
126
+ .domain(xSteps.map(date => fullFormatter(date)))
48
127
  .range([0, width]);
49
- const columnWidth = 10;
128
+ const columnWidth = getColumnWidth(xSteps.length * visibleColumns);
50
129
  const columnPadding = 4;
51
130
  const outerPadding = (xOuterScale.bandwidth() -
52
- (columnPadding * (input.length - 1 - invisColumns) +
53
- columnWidth * (input.length - invisColumns))) /
131
+ (columnPadding * (binnedData.length - 1 - invisColumns) +
132
+ columnWidth * (binnedData.length - invisColumns))) /
54
133
  2;
55
- const renderInformation = input.map(stackData => {
134
+ const renderInformation = binnedData.map(stackData => {
56
135
  const stackedTable = stackData.reduce((table, s) => [
57
136
  ...table,
58
137
  ...s.data.map(point => ({
@@ -94,7 +173,7 @@ export class StackedColumnComponent {
94
173
  }
95
174
  const width = seriesPoint.series.style == 'tooltipOnly' ? 0 : columnWidth;
96
175
  const height = yScale(baseline) - yScale(topline);
97
- const x = (xOuterScale(xFormatter(date)) ?? 0) +
176
+ const x = (xOuterScale(fullFormatter(date)) ?? 0) +
98
177
  outerPadding +
99
178
  columnWidth * (index - invisColumnsSoFar) +
100
179
  columnPadding * (index - invisColumnsSoFar);
@@ -119,17 +198,27 @@ export class StackedColumnComponent {
119
198
  invisColumnsSoFar++;
120
199
  }
121
200
  });
122
- const xTicks = xSteps.map(date => ({
201
+ const xMinorTicks = xSteps.map(date => ({
123
202
  dateValue: date.valueOf(),
124
- label: xFormatter(date),
125
- x: (xOuterScale(xFormatter(date)) ?? 0) + xOuterScale.bandwidth() / 2,
203
+ label: minorFormatter(date),
204
+ x: (xOuterScale(fullFormatter(date)) ?? 0) + xOuterScale.bandwidth() / 2,
126
205
  }));
206
+ const xMajorTicks = interval !== 'year'
207
+ ? xSteps
208
+ .map(date => ({
209
+ dateValue: date.valueOf(),
210
+ label: majorFormatter(date),
211
+ x: (xOuterScale(fullFormatter(date)) ?? 0) +
212
+ xOuterScale.bandwidth() / 2,
213
+ }))
214
+ .filter((tick, i, ticks) => i === 0 || tick.label !== ticks[i - 1].label)
215
+ : [];
127
216
  const yTicks = yScale.ticks(5);
128
217
  const hoverBandWidth = (renderInformation.length - invisColumns) * columnWidth +
129
218
  (renderInformation.length + 1 - invisColumns) * columnPadding;
130
219
  const hoverBands = xSteps.map(date => ({
131
220
  dateValue: date.valueOf(),
132
- x: (xOuterScale(xFormatter(date)) ?? 0) +
221
+ x: (xOuterScale(fullFormatter(date)) ?? 0) +
133
222
  (xOuterScale.bandwidth() - hoverBandWidth) / 2,
134
223
  y: yScale(domainMax),
135
224
  width: hoverBandWidth,
@@ -140,7 +229,8 @@ export class StackedColumnComponent {
140
229
  hoverBands,
141
230
  rects,
142
231
  viewBox,
143
- xTicks,
232
+ xMinorTicks,
233
+ xMajorTicks,
144
234
  yScale,
145
235
  yTicks,
146
236
  };
@@ -181,12 +271,21 @@ export class StackedColumnComponent {
181
271
  get height() {
182
272
  return this.height$.getValue();
183
273
  }
274
+ set interval(v) {
275
+ this.interval$.next(v);
276
+ }
277
+ get interval() {
278
+ return this.interval$.getValue();
279
+ }
280
+ setIntervalOption(option) {
281
+ this.interval = option.id;
282
+ }
184
283
  }
185
284
  StackedColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
186
- StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
285
+ StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter", interval: "interval" }, viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-single-select\n [options]=\"(intervalOptions$ | async) || []\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.SingleSelectComponent, selector: "riv-single-select", inputs: ["options", "selectedOption", "filterabilityOptions", "loading", "noOptionsMessage", "nodeTemplate", "placeholder"], outputs: ["filterQueryChange", "selectedOptionChange"] }, { kind: "component", type: i5.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
187
286
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, decorators: [{
188
287
  type: Component,
189
- args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
288
+ args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-single-select\n [options]=\"(intervalOptions$ | async) || []\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
190
289
  }], propDecorators: { input: [{
191
290
  type: Input
192
291
  }], width: [{
@@ -195,5 +294,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
195
294
  type: Input
196
295
  }], valueFormatter: [{
197
296
  type: Input
297
+ }], interval: [{
298
+ type: Input
299
+ }], controls: [{
300
+ type: ViewChild,
301
+ args: ['controls']
198
302
  }] } });
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFFeEUsU0FBUyxZQUFZLENBQUMsTUFBZTtJQUNuQyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDMUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDbEMsTUFBTSxLQUFLLEdBQUcsSUFB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SztzQkFEZixLQUFLO2dCQVVLLE1BQU07c0JBRGhCLEtBQUs7Z0JBU0MsY0FBYztzQkFEcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IHNjYWxlQmFuZCwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHRpbWVNb250aCB9IGZyb20gJ2QzLXRpbWUnO1xuaW1wb3J0IHsgdGltZUZvcm1hdCB9IGZyb20gJ2QzLXRpbWUtZm9ybWF0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMnO1xuXG5mdW5jdGlvbiBnZXREYXRlUmFuZ2Uoc3RhY2tzOiBTdGFja1tdKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHN0YWNrKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgZGF0ZSB9IG9mIHNlcmllcy5kYXRhKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUpO1xuICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtuZXcgRGF0ZShtaW4pLCBuZXcgRGF0ZShtYXgpXTtcbn1cblxuZXhwb3J0IHR5cGUgVmFsdWUgPSB7IGRhdGU6IERhdGU7IHZhbHVlOiBudW1iZXIgfTtcblxuZXhwb3J0IHR5cGUgU2VyaWVzID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBkYXRhOiBWYWx1ZVtdO1xufSAmIChcbiAgfCB7XG4gICAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgICBzdHlsZT86ICdzb2xpZCcgfCAnc3RyaXBlZCc7XG4gICAgfVxuICB8IHtcbiAgICAgIHN0eWxlOiAndG9vbHRpcE9ubHknO1xuICAgIH1cbik7XG5cbmV4cG9ydCB0eXBlIFN0YWNrID0gU2VyaWVzW107XG5cbi8vIFRPRE86IG9uY2Ugd2UgdXBncmFkZSB0byBBbmd1bGFyIDE2LCB0aGlzIGNvbXBvbmVudCBjYW4gYmUgY2xlYW5lZCB1cCB3aXRoXG4vLyBzaWduYWxzIGluc3RlYWQgb2YgUnhKUy5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLWNvbHVtbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRDb2x1bW5Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tbXT4oW10pO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFN0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndpZHRoJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDI1Nik7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaGVpZ2h0KHY6IG51bWJlcikge1xuICAgIHRoaXMuaGVpZ2h0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICByZWFkb25seSBkcmF3RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLndpZHRoJCxcbiAgICB0aGlzLmhlaWdodCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIHdpZHRoLCBoZWlnaHRdKSA9PiB7XG4gICAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke2hlaWdodH1gO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDg7XG5cbiAgICAgIGNvbnN0IGludmlzQ29sdW1ucyA9IGlucHV0LmZpbHRlcihcbiAgICAgICAgc3RhY2sgPT4gc3RhY2suZmlsdGVyKHMgPT4gcy5zdHlsZSA9PSAndG9vbHRpcE9ubHknKS5sZW5ndGggPiAwLFxuICAgICAgKS5sZW5ndGg7XG5cbiAgICAgIGNvbnN0IFttaW5EYXRlLCBtYXhEYXRlXSA9IGdldERhdGVSYW5nZShpbnB1dCk7XG4gICAgICBjb25zdCB4U3RlcHMgPSB0aW1lTW9udGgucmFuZ2UoXG4gICAgICAgIHRpbWVNb250aC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgdGltZU1vbnRoLmZsb29yKHRpbWVNb250aC5vZmZzZXQobWF4RGF0ZSwgMSkpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHhGb3JtYXR0ZXIgPSB0aW1lRm9ybWF0KCclYicpO1xuICAgICAgY29uc3QgeE91dGVyU2NhbGUgPSBzY2FsZUJhbmQoKVxuICAgICAgICAuZG9tYWluKHhTdGVwcy5tYXAoZGF0ZSA9PiB4Rm9ybWF0dGVyKGRhdGUpKSlcbiAgICAgICAgLnJhbmdlKFswLCB3aWR0aF0pO1xuXG4gICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IDEwO1xuICAgICAgY29uc3QgY29sdW1uUGFkZGluZyA9IDQ7XG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgIChjb2x1bW5QYWRkaW5nICogKGlucHV0Lmxlbmd0aCAtIDEgLSBpbnZpc0NvbHVtbnMpICtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoICogKGlucHV0Lmxlbmd0aCAtIGludmlzQ29sdW1ucykpKSAvXG4gICAgICAgIDI7XG5cbiAgICAgIHR5cGUgU2VyaWVzUG9pbnQgPSBWYWx1ZSAmIHsgc2VyaWVzOiBTZXJpZXMgfTtcblxuICAgICAgY29uc3QgcmVuZGVySW5mb3JtYXRpb24gPSBpbnB1dC5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2tlZFRhYmxlID0gc3RhY2tEYXRhLnJlZHVjZTxTZXJpZXNQb2ludFtdPihcbiAgICAgICAgICAodGFibGUsIHMpID0+IFtcbiAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgLi4ucy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluZGV4ZWRUYWJsZTogTWFwPERhdGUsIE1hcDxzdHJpbmcsIFNlcmllc1BvaW50Pj4gPSBpbmRleChcbiAgICAgICAgICBzdGFja2VkVGFibGUsXG4gICAgICAgICAgZCA9PiBkLmRhdGUsXG4gICAgICAgICAgZCA9PiBkLnNlcmllcy5sYWJlbCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzdGFja2VkID0gc3RhY2s8XG4gICAgICAgICAgdHlwZW9mIGluZGV4ZWRUYWJsZSBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBWPiA/IFtLLCBWXSA6IG5ldmVyXG4gICAgICAgID4oKVxuICAgICAgICAgIC5rZXlzKHN0YWNrRGF0YS5tYXAodiA9PiB2LmxhYmVsKSlcbiAgICAgICAgICAudmFsdWUoKFtfLCBncm91cF0sIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldChrZXkpIS52YWx1ZTtcbiAgICAgICAgICB9KShpbmRleGVkVGFibGUpO1xuXG4gICAgICAgIHJldHVybiB7IGluZGV4ZWRUYWJsZSwgc3RhY2tlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBkb21haW5NYXggPSAwO1xuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSkgPT4ge1xuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLnZhbHVlcygpXS5mb3JFYWNoKChwb2ludE1hcCwgaSkgPT4ge1xuICAgICAgICAgIFsuLi5wb2ludE1hcC52YWx1ZXMoKV0uZm9yRWFjaCgoXywgaikgPT4ge1xuICAgICAgICAgICAgaWYgKF8uc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tYWluTWF4ID0gTWF0aC5tYXgoZG9tYWluTWF4LCAuLi5zdGFja2VkW2pdW2ldKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbMCwgZG9tYWluTWF4XSlcbiAgICAgICAgLnJhbmdlKFtoZWlnaHQgLSBwYWRkaW5nICogMiwgcGFkZGluZ10pO1xuXG4gICAgICBjb25zdCByZWN0czoge1xuICAgICAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBmaWxsOiBzdHJpbmc7XG4gICAgICAgIHN0cmlwZWQ6IGJvb2xlYW47XG4gICAgICAgIHNlcmllc1BvaW50OiBTZXJpZXNQb2ludDtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgbGV0IGludmlzQ29sdW1uc1NvRmFyID0gMDtcbiAgICAgIHJlbmRlckluZm9ybWF0aW9uLmZvckVhY2goKHsgc3RhY2tlZCwgaW5kZXhlZFRhYmxlIH0sIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBpbnZpc0NvbHVtbkZvdW5kID0gZmFsc2U7XG4gICAgICAgIFsuLi5pbmRleGVkVGFibGUuZW50cmllcygpXS5mb3JFYWNoKChbZGF0ZSwgcG9pbnRNYXBdLCBpKSA9PiB7XG4gICAgICAgICAgWy4uLnBvaW50TWFwLmVudHJpZXMoKV0uZm9yRWFjaCgoW18sIHNlcmllc1BvaW50XSwgaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Jhc2VsaW5lLCB0b3BsaW5lXSA9IHN0YWNrZWRbal1baV07XG5cbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgPT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBpbnZpc0NvbHVtbkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID1cbiAgICAgICAgICAgICAgc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScgPyAwIDogY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB5U2NhbGUoYmFzZWxpbmUpIC0geVNjYWxlKHRvcGxpbmUpO1xuICAgICAgICAgICAgY29uc3QgeCA9XG4gICAgICAgICAgICAgICh4T3V0ZXJTY2FsZSh4Rm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgIG91dGVyUGFkZGluZyArXG4gICAgICAgICAgICAgIGNvbHVtbldpZHRoICogKGluZGV4IC0gaW52aXNDb2x1bW5zU29GYXIpICtcbiAgICAgICAgICAgICAgY29sdW1uUGFkZGluZyAqIChpbmRleCAtIGludmlzQ29sdW1uc1NvRmFyKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB5U2NhbGUoYmFzZWxpbmUpIC0gaGVpZ2h0O1xuICAgICAgICAgICAgbGV0IGZpbGwgPSAnJztcbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgIT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBmaWxsID0gYHZhcigke3Nlcmllc1BvaW50LnNlcmllcy5jb2xvclRva2VufSlgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgZmlsbCxcbiAgICAgICAgICAgICAgc3RyaXBlZDogc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW52aXNDb2x1bW5Gb3VuZCkge1xuICAgICAgICAgIGludmlzQ29sdW1uc1NvRmFyKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB4VGlja3MgPSB4U3RlcHMubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgbGFiZWw6IHhGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgIHg6ICh4T3V0ZXJTY2FsZSh4Rm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArIHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC8gMixcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHlUaWNrcyA9IHlTY2FsZS50aWNrcyg1KTtcblxuICAgICAgY29uc3QgaG92ZXJCYW5kV2lkdGggPVxuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoIC0gaW52aXNDb2x1bW5zKSAqIGNvbHVtbldpZHRoICtcbiAgICAgICAgKHJlbmRlckluZm9ybWF0aW9uLmxlbmd0aCArIDEgLSBpbnZpc0NvbHVtbnMpICogY29sdW1uUGFkZGluZztcbiAgICAgIGNvbnN0IGhvdmVyQmFuZHMgPSB4U3RlcHMubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoeEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICh4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAtIGhvdmVyQmFuZFdpZHRoKSAvIDIsXG4gICAgICAgIHk6IHlTY2FsZShkb21haW5NYXgpLFxuICAgICAgICB3aWR0aDogaG92ZXJCYW5kV2lkdGgsXG4gICAgICAgIGhlaWdodDogeVNjYWxlKDApIC0geVNjYWxlKGRvbWFpbk1heCksXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbldpZHRoLFxuICAgICAgICBob3ZlckJhbmRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgdmlld0JveCxcbiAgICAgICAgeFRpY2tzLFxuICAgICAgICB5U2NhbGUsXG4gICAgICAgIHlUaWNrcyxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PlxuICAgICAgaW5wdXQuZXZlcnkoc3RhY2sgPT4gc3RhY2suZXZlcnkoc2VyaWVzID0+IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCkpLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBob3ZlcmVkQmFuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkID0gY29tYmluZUxhdGVzdChbdGhpcy5ob3ZlcmVkQmFuZCQsIHRoaXMuZHJhd0RhdGEkXSkucGlwZShcbiAgICBtYXAoKFtob3ZlcmVkQmFuZCwgZHJhd0RhdGFdKSA9PiB7XG4gICAgICBpZiAoIWhvdmVyZWRCYW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGhvdmVyZWRCYW5kLmV2ZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgYW5jaG9yID0gKDxTVkdSZWN0RWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB0eXBlIE1ldHJpYyA9IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9O1xuICAgICAgY29uc3QgbWV0cmljczogTWV0cmljW10gPSBkcmF3RGF0YS5yZWN0c1xuICAgICAgICAuZmlsdGVyKHJlY3QgPT4gcmVjdC5kYXRlVmFsdWUgPT09IGhvdmVyZWRCYW5kLmRhdGVWYWx1ZSlcbiAgICAgICAgLm1hcChyZWN0ID0+ICh7XG4gICAgICAgICAgbGFiZWw6IHJlY3Quc2VyaWVzUG9pbnQuc2VyaWVzLmxhYmVsLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlRm9ybWF0dGVyKHJlY3Quc2VyaWVzUG9pbnQudmFsdWUpLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG59XG4iLCI8ZGl2ICpuZ0lmPVwiIShlbXB0eSQgfCBhc3luYyk7IGVsc2UgemVyb1N0YXRlXCIgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxsaW5lXG4gICAgICAgICAgeDE9XCIwXCJcbiAgICAgICAgICBbYXR0ci55MV09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICB5Mj1cIjBcIlxuICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWJhY2tncm91bmRcIlxuICAgICAgICBbY2xhc3MuZm9jdXNlZF09XCIoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5kYXRlVmFsdWUgPT09IHRpY2suZGF0ZVZhbHVlXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnggLSAyMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUoMCkgKyAzXCJcbiAgICAgICAgd2lkdGg9XCI0MFwiXG4gICAgICAgIGhlaWdodD1cIjEyXCJcbiAgICAgICAgcng9XCIyXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cInRpY2sueFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUoMCkgKyAxMlwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgID5cbiAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnlUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKHRpY2spXCJcbiAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgaGVpZ2h0PVwiMVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHQgY2xhc3M9XCJ0aWNrLWxhYmVsXCIgeD1cIjBcIiBbYXR0ci55XT1cImQueVNjYWxlKHRpY2spXCIgZHk9XCItNFwiPlxuICAgICAgICB7eyB2YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkLnJlY3RzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cImNvbHVtblwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJyZWN0LmZpbGxcIlxuICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlICE9PSByZWN0LmRhdGVWYWx1ZVxuICAgICAgICBcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDxyZWN0XG4gICAgICAgICpuZ0lmPVwicmVjdC5zdHJpcGVkXCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBmaWxsPVwidXJsKCNzdHJpcGVzKVwiXG4gICAgICA+PC9yZWN0PlxuICAgIDwvZz5cbiAgICA8cmVjdFxuICAgICAgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5ob3ZlckJhbmRzXCJcbiAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAobW91c2VlbnRlcik9XCJcbiAgICAgICAgaG92ZXJlZEJhbmQkLm5leHQoeyBkYXRlVmFsdWU6IHJlY3QuZGF0ZVZhbHVlLCBldmVudDogJGV2ZW50IH0pXG4gICAgICBcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEJhbmQkLm5leHQobnVsbClcIlxuICAgID48L3JlY3Q+XG4gIDwvc3ZnPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjYWxsb3V0JCB8IGFzeW5jOyBsZXQgY2FsbG91dFwiPlxuICA8cml2LWNhbGxvdXRcbiAgICAqcml2LWNhbGxvdXRcbiAgICBbYW5jaG9yXT1cImNhbGxvdXQuYW5jaG9yXCJcbiAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAnY2VudGVyLXJpZ2h0JyxcbiAgICAgICdjZW50ZXItbGVmdCcsXG4gICAgICAndG9wLWNlbnRlcicsXG4gICAgICAnYm90dG9tLWNlbnRlcidcbiAgICBdXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpY1wiICpuZ0Zvcj1cImxldCBtZXRyaWMgb2YgY2FsbG91dC5tZXRyaWNzXCI+XG4gICAgICAgIDxkaXY+e3sgbWV0cmljLmxhYmVsIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpYy12YWx1ZVwiPnt7IG1ldHJpYy52YWx1ZSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZT48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsU0FBUyxHQUNWLE1BQU0sY0FBYyxDQUFDOzs7Ozs7O0FBRXRCLFNBQVMsWUFBWSxDQUFDLE1BQWU7SUFDbkMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO1FBQzFCLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxFQUFFO1lBQzFCLEtB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LENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUE4REQsaUJBQWlCLENBQUMsTUFBb0M7UUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBYyxDQUFDO0lBQ3hDLENBQUM7O21IQXRHVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixzUkNuRm5DLG9zSEF3SUE7MkZEckRhLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxvQkFBb0IsbUJBR2IsdUJBQXVCLENBQUMsTUFBTTs4QkFLcEMsS0FBSztzQkFEZixLQUFLO2dCQVVLLEtBQUs7c0JBRGYsS0FBSztnQkFVSyxNQUFNO3NCQURoQixLQUFLO2dCQVNDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBS0ssUUFBUTtzQkFEbEIsS0FBSztnQkFTVSxRQUFRO3NCQUR2QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IHNjYWxlQmFuZCwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHRpbWVGb3JtYXQgfSBmcm9tICdkMy10aW1lLWZvcm1hdCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW5wdXQvc2luZ2xlLXNlbGVjdC9zaW5nbGUtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBJbnRlcnZhbCxcbiAgZ2V0SW50ZXJ2YWxUaXRsZSxcbiAgZ2V0TWFqb3JJbnRlcnZhbCxcbiAgZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0TWlub3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0VGltZUludGVydmFsLFxuICBpbnRlcnZhbHMsXG59IGZyb20gJy4uL2ludGVydmFscyc7XG5cbmZ1bmN0aW9uIGdldERhdGVSYW5nZShzdGFja3M6IFN0YWNrW10pOiBbRGF0ZSwgRGF0ZV0ge1xuICBsZXQgbWluID0gSW5maW5pdHk7XG4gIGxldCBtYXggPSAtSW5maW5pdHk7XG4gIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2Ygc3RhY2spIHtcbiAgICAgIGZvciAoY29uc3QgeyBkYXRlIH0gb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCB2YWx1ZSk7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW25ldyBEYXRlKG1pbiksIG5ldyBEYXRlKG1heCldO1xufVxuXG5leHBvcnQgdHlwZSBWYWx1ZSA9IHsgZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlciB9O1xuXG5leHBvcnQgdHlwZSBTZXJpZXMgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRhdGE6IFZhbHVlW107XG59ICYgKFxuICB8IHtcbiAgICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICAgIHN0eWxlPzogJ3NvbGlkJyB8ICdzdHJpcGVkJztcbiAgICB9XG4gIHwge1xuICAgICAgc3R5bGU6ICd0b29sdGlwT25seSc7XG4gICAgfVxuKTtcblxuZXhwb3J0IHR5cGUgU3RhY2sgPSBTZXJpZXNbXTtcblxuZnVuY3Rpb24gcG9pbnRSZWR1Y2VyKHBvaW50czogVmFsdWVbXSkge1xuICByZXR1cm4gcG9pbnRzLnJlZHVjZSgodG90YWwsIHsgdmFsdWUgfSkgPT4gdG90YWwgKyB2YWx1ZSwgMCk7XG59XG5cbmNvbnN0IE1BWF9DT0xVTU5TID0gNzI7XG5jb25zdCBERUZBVUxUX0lOVEVSVkFMOiBJbnRlcnZhbCA9ICdtb250aCc7XG5cbmZ1bmN0aW9uIGdldENvbHVtbldpZHRoKG51bUNvbHVtbnM6IG51bWJlcikge1xuICBpZiAobnVtQ29sdW1ucyA8PSA2KSByZXR1cm4gNzI7XG4gIGlmIChudW1Db2x1bW5zIDw9IDE4KSByZXR1cm4gNDA7XG4gIGlmIChudW1Db2x1bW5zIDw9IDQwKSByZXR1cm4gMTY7XG4gIHJldHVybiA4O1xufVxuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1jb2x1bW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1jb2x1bW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWNrW10+KFtdKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja1tdKSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFN0YWNrW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oOTYwKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB3aWR0aCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoJC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigyNTYpO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGhlaWdodCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlaWdodCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEludGVydmFsPihERUZBVUxUX0lOVEVSVkFMKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnRlcnZhbCh2OiBJbnRlcnZhbCkge1xuICAgIHRoaXMuaW50ZXJ2YWwkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBpbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRyb2xzJylcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xzPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRJbnRlcnZhbHMkOiBPYnNlcnZhYmxlPEludGVydmFsW10+ID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT4ge1xuICAgICAgY29uc3QgbnVtVmlzaWJsZUNvbHVtbnMgPSBpbnB1dC5maWx0ZXIoXG4gICAgICAgIHN0YWNrID0+IHN0YWNrLmZpbHRlcihzID0+IHMuc3R5bGUgPT09ICd0b29sdGlwT25seScpLmxlbmd0aCA9PT0gMCxcbiAgICAgICkubGVuZ3RoO1xuXG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoaW5wdXQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJ2YWxzLmZpbHRlcihpbnRlcnZhbCA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIGNvbnN0IHhTdGVwc0NvdW50ID0gdGltZUludGVydmFsLnJhbmdlKFxuICAgICAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IodGltZUludGVydmFsLm9mZnNldChtYXhEYXRlLCAxKSksXG4gICAgICAgICkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbnVtVmlzaWJsZUNvbHVtbnMgKiB4U3RlcHNDb3VudCA8PSBNQVhfQ09MVU1OUztcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaW50ZXJ2YWxPcHRpb25zJCA9IHRoaXMuYWxsb3dlZEludGVydmFscyQucGlwZShcbiAgICBtYXAoaW50ZXJ2YWxzID0+XG4gICAgICBpbnRlcnZhbHMubWFwKFxuICAgICAgICAoaW50ZXJ2YWwpOiBTaW5nbGVTZWxlY3RDb21wb25lbnQuT3B0aW9uID0+ICh7XG4gICAgICAgICAgaWQ6IGludGVydmFsLFxuICAgICAgICAgIHRpdGxlOiBnZXRJbnRlcnZhbFRpdGxlKGludGVydmFsKSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsT3B0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW50ZXJ2YWwkLFxuICAgIHRoaXMuaW50ZXJ2YWxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnRlcnZhbCwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGFsbG93ZWRJbnRlcnZhbHMgPSBvcHRpb25zLm1hcCgoeyBpZCB9KSA9PiBpZCBhcyBJbnRlcnZhbCk7XG4gICAgICBpZiAoIWFsbG93ZWRJbnRlcnZhbHMuaW5jbHVkZXMoaW50ZXJ2YWwpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoMCk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGxvd2VkID0gYWxsb3dlZEludGVydmFscy5hdCgtMSk7XG4gICAgICAgIGlmICghZmlyc3RBbGxvd2VkIHx8ICFsYXN0QWxsb3dlZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGludGVydmFscy5pbmRleE9mKGludGVydmFsKSA8IGludGVydmFscy5pbmRleE9mKGZpcnN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBmaXJzdEFsbG93ZWQ7XG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPiBpbnRlcnZhbHMuaW5kZXhPZihsYXN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBsYXN0QWxsb3dlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zLmZpbmQobyA9PiBvLmlkID09PSBpbnRlcnZhbCkgPz8gbnVsbDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSW50ZXJ2YWwkID0gdGhpcy5zZWxlY3RlZEludGVydmFsT3B0aW9uJC5waXBlKFxuICAgIG1hcChvcHRpb24gPT4gKG9wdGlvbiA/IChvcHRpb24uaWQgYXMgSW50ZXJ2YWwpIDogREVGQVVMVF9JTlRFUlZBTCkpLFxuICApO1xuXG4gIHNldEludGVydmFsT3B0aW9uKG9wdGlvbjogU2luZ2xlU2VsZWN0Q29tcG9uZW50Lk9wdGlvbikge1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBvcHRpb24uaWQgYXMgSW50ZXJ2YWw7XG4gIH1cblxuICByZWFkb25seSBiaW5uZWREYXRhJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5wdXQkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIGludGVydmFsXSkgPT5cbiAgICAgIGlucHV0Lm1hcCgoc3RhY2spOiBTdGFjayA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgcmV0dXJuIHN0YWNrLm1hcChzZXJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGJpbm5lZCA9IG5ldyBNYXA8bnVtYmVyLCBWYWx1ZVtdPigpO1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHRpbWVJbnRlcnZhbC5mbG9vcihwb2ludC5kYXRlKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICBpZiAoIWJpbm5lZC5oYXMoYmluKSkge1xuICAgICAgICAgICAgICBiaW5uZWQuc2V0KGJpbiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmlubmVkLmdldChiaW4pIS5wdXNoKHBvaW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNlcmllcyxcbiAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGVWYWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBwb2ludFJlZHVjZXIocG9pbnRzKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBkcmF3RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmJpbm5lZERhdGEkLFxuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuaGVpZ2h0JCxcbiAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2Jpbm5lZERhdGEsIHdpZHRoLCBoZWlnaHQsIGludGVydmFsXSkgPT4ge1xuICAgICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YDtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcblxuICAgICAgY29uc3QgaW52aXNDb2x1bW5zID0gYmlubmVkRGF0YS5maWx0ZXIoXG4gICAgICAgIHN0YWNrID0+IHN0YWNrLmZpbHRlcihzID0+IHMuc3R5bGUgPT0gJ3Rvb2x0aXBPbmx5JykubGVuZ3RoID4gMCxcbiAgICAgICkubGVuZ3RoO1xuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBiaW5uZWREYXRhLmxlbmd0aCAtIGludmlzQ29sdW1ucztcblxuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGJpbm5lZERhdGEpO1xuICAgICAgY29uc3QgaGFzTXVsdGlwbGVZZWFycyA9IG1pbkRhdGUuZ2V0RnVsbFllYXIoKSA8IG1heERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHhNaW5vckludGVydmFsRm9ybWF0ID0gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbCk7XG4gICAgICBjb25zdCBtaW5vckZvcm1hdHRlciA9IHRpbWVGb3JtYXQoeE1pbm9ySW50ZXJ2YWxGb3JtYXQpO1xuICAgICAgY29uc3QgbWlub3JUaW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeFN0ZXBzID0gbWlub3JUaW1lSW50ZXJ2YWwucmFuZ2UoXG4gICAgICAgIG1pbm9yVGltZUludGVydmFsLmZsb29yKG1pbkRhdGUpLFxuICAgICAgICBtaW5vclRpbWVJbnRlcnZhbC5mbG9vcihtaW5vclRpbWVJbnRlcnZhbC5vZmZzZXQobWF4RGF0ZSwgMSkpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHhNYWpvckludGVydmFsID0gZ2V0TWFqb3JJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbEZvcm1hdCA9IGdldE1ham9ySW50ZXJ2YWxGb3JtYXQoXG4gICAgICAgIHhNYWpvckludGVydmFsLFxuICAgICAgICBoYXNNdWx0aXBsZVllYXJzLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1ham9yRm9ybWF0dGVyID0gdGltZUZvcm1hdCh4TWFqb3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBmdWxsRm9ybWF0dGVyID0gdGltZUZvcm1hdChcbiAgICAgICAgYCR7eE1pbm9ySW50ZXJ2YWxGb3JtYXR9ICR7eE1ham9ySW50ZXJ2YWxGb3JtYXR9YCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHhPdXRlclNjYWxlID0gc2NhbGVCYW5kKClcbiAgICAgICAgLmRvbWFpbih4U3RlcHMubWFwKGRhdGUgPT4gZnVsbEZvcm1hdHRlcihkYXRlKSkpXG4gICAgICAgIC5yYW5nZShbMCwgd2lkdGhdKTtcblxuICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBnZXRDb2x1bW5XaWR0aCh4U3RlcHMubGVuZ3RoICogdmlzaWJsZUNvbHVtbnMpO1xuICAgICAgY29uc3QgY29sdW1uUGFkZGluZyA9IDQ7XG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgIChjb2x1bW5QYWRkaW5nICogKGJpbm5lZERhdGEubGVuZ3RoIC0gMSAtIGludmlzQ29sdW1ucykgK1xuICAgICAgICAgICAgY29sdW1uV2lkdGggKiAoYmlubmVkRGF0YS5sZW5ndGggLSBpbnZpc0NvbHVtbnMpKSkgL1xuICAgICAgICAyO1xuXG4gICAgICB0eXBlIFNlcmllc1BvaW50ID0gVmFsdWUgJiB7IHNlcmllczogU2VyaWVzIH07XG5cbiAgICAgIGNvbnN0IHJlbmRlckluZm9ybWF0aW9uID0gYmlubmVkRGF0YS5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2tlZFRhYmxlID0gc3RhY2tEYXRhLnJlZHVjZTxTZXJpZXNQb2ludFtdPihcbiAgICAgICAgICAodGFibGUsIHMpID0+IFtcbiAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgLi4ucy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluZGV4ZWRUYWJsZTogTWFwPERhdGUsIE1hcDxzdHJpbmcsIFNlcmllc1BvaW50Pj4gPSBpbmRleChcbiAgICAgICAgICBzdGFja2VkVGFibGUsXG4gICAgICAgICAgZCA9PiBkLmRhdGUsXG4gICAgICAgICAgZCA9PiBkLnNlcmllcy5sYWJlbCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzdGFja2VkID0gc3RhY2s8XG4gICAgICAgICAgdHlwZW9mIGluZGV4ZWRUYWJsZSBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBWPiA/IFtLLCBWXSA6IG5ldmVyXG4gICAgICAgID4oKVxuICAgICAgICAgIC5rZXlzKHN0YWNrRGF0YS5tYXAodiA9PiB2LmxhYmVsKSlcbiAgICAgICAgICAudmFsdWUoKFtfLCBncm91cF0sIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldChrZXkpIS52YWx1ZTtcbiAgICAgICAgICB9KShpbmRleGVkVGFibGUpO1xuXG4gICAgICAgIHJldHVybiB7IGluZGV4ZWRUYWJsZSwgc3RhY2tlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBkb21haW5NYXggPSAwO1xuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSkgPT4ge1xuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLnZhbHVlcygpXS5mb3JFYWNoKChwb2ludE1hcCwgaSkgPT4ge1xuICAgICAgICAgIFsuLi5wb2ludE1hcC52YWx1ZXMoKV0uZm9yRWFjaCgoXywgaikgPT4ge1xuICAgICAgICAgICAgaWYgKF8uc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tYWluTWF4ID0gTWF0aC5tYXgoZG9tYWluTWF4LCAuLi5zdGFja2VkW2pdW2ldKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbMCwgZG9tYWluTWF4XSlcbiAgICAgICAgLnJhbmdlKFtoZWlnaHQgLSBwYWRkaW5nICogMiwgcGFkZGluZ10pO1xuXG4gICAgICBjb25zdCByZWN0czoge1xuICAgICAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBmaWxsOiBzdHJpbmc7XG4gICAgICAgIHN0cmlwZWQ6IGJvb2xlYW47XG4gICAgICAgIHNlcmllc1BvaW50OiBTZXJpZXNQb2ludDtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgbGV0IGludmlzQ29sdW1uc1NvRmFyID0gMDtcbiAgICAgIHJlbmRlckluZm9ybWF0aW9uLmZvckVhY2goKHsgc3RhY2tlZCwgaW5kZXhlZFRhYmxlIH0sIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBpbnZpc0NvbHVtbkZvdW5kID0gZmFsc2U7XG4gICAgICAgIFsuLi5pbmRleGVkVGFibGUuZW50cmllcygpXS5mb3JFYWNoKChbZGF0ZSwgcG9pbnRNYXBdLCBpKSA9PiB7XG4gICAgICAgICAgWy4uLnBvaW50TWFwLmVudHJpZXMoKV0uZm9yRWFjaCgoW18sIHNlcmllc1BvaW50XSwgaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Jhc2VsaW5lLCB0b3BsaW5lXSA9IHN0YWNrZWRbal1baV07XG5cbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgPT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBpbnZpc0NvbHVtbkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID1cbiAgICAgICAgICAgICAgc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScgPyAwIDogY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB5U2NhbGUoYmFzZWxpbmUpIC0geVNjYWxlKHRvcGxpbmUpO1xuICAgICAgICAgICAgY29uc3QgeCA9XG4gICAgICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgIG91dGVyUGFkZGluZyArXG4gICAgICAgICAgICAgIGNvbHVtbldpZHRoICogKGluZGV4IC0gaW52aXNDb2x1bW5zU29GYXIpICtcbiAgICAgICAgICAgICAgY29sdW1uUGFkZGluZyAqIChpbmRleCAtIGludmlzQ29sdW1uc1NvRmFyKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB5U2NhbGUoYmFzZWxpbmUpIC0gaGVpZ2h0O1xuICAgICAgICAgICAgbGV0IGZpbGwgPSAnJztcbiAgICAgICAgICAgIGlmIChzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgIT0gJ3Rvb2x0aXBPbmx5Jykge1xuICAgICAgICAgICAgICBmaWxsID0gYHZhcigke3Nlcmllc1BvaW50LnNlcmllcy5jb2xvclRva2VufSlgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgZmlsbCxcbiAgICAgICAgICAgICAgc3RyaXBlZDogc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW52aXNDb2x1bW5Gb3VuZCkge1xuICAgICAgICAgIGludmlzQ29sdW1uc1NvRmFyKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB4TWlub3JUaWNrcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICBsYWJlbDogbWlub3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgIHg6XG4gICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICsgeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLyAyLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgeE1ham9yVGlja3MgPVxuICAgICAgICBpbnRlcnZhbCAhPT0gJ3llYXInXG4gICAgICAgICAgPyB4U3RlcHNcbiAgICAgICAgICAgICAgLm1hcChkYXRlID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbWFqb3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgICAgICAgICAgeDpcbiAgICAgICAgICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgICAgICB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh0aWNrLCBpLCB0aWNrcykgPT5cbiAgICAgICAgICAgICAgICAgIGkgPT09IDAgfHwgdGljay5sYWJlbCAhPT0gdGlja3NbaSAtIDFdLmxhYmVsLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKDUpO1xuXG4gICAgICBjb25zdCBob3ZlckJhbmRXaWR0aCA9XG4gICAgICAgIChyZW5kZXJJbmZvcm1hdGlvbi5sZW5ndGggLSBpbnZpc0NvbHVtbnMpICogY29sdW1uV2lkdGggK1xuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICsgMSAtIGludmlzQ29sdW1ucykgKiBjb2x1bW5QYWRkaW5nO1xuICAgICAgY29uc3QgaG92ZXJCYW5kcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICB4OlxuICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgKHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC0gaG92ZXJCYW5kV2lkdGgpIC8gMixcbiAgICAgICAgeTogeVNjYWxlKGRvbWFpbk1heCksXG4gICAgICAgIHdpZHRoOiBob3ZlckJhbmRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5U2NhbGUoMCkgLSB5U2NhbGUoZG9tYWluTWF4KSxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgIGhvdmVyQmFuZHMsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICB2aWV3Qm94LFxuICAgICAgICB4TWlub3JUaWNrcyxcbiAgICAgICAgeE1ham9yVGlja3MsXG4gICAgICAgIHlTY2FsZSxcbiAgICAgICAgeVRpY2tzLFxuICAgICAgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+XG4gICAgICBpbnB1dC5ldmVyeShzdGFjayA9PiBzdGFjay5ldmVyeShzZXJpZXMgPT4gc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGhvdmVyZWRCYW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIGRhdGVWYWx1ZTogbnVtYmVyO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50O1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgY2FsbG91dCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmhvdmVyZWRCYW5kJCwgdGhpcy5kcmF3RGF0YSRdKS5waXBlKFxuICAgIG1hcCgoW2hvdmVyZWRCYW5kLCBkcmF3RGF0YV0pID0+IHtcbiAgICAgIGlmICghaG92ZXJlZEJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHR5cGUgTWV0cmljID0geyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IGRyYXdEYXRhLnJlY3RzXG4gICAgICAgIC5maWx0ZXIocmVjdCA9PiByZWN0LmRhdGVWYWx1ZSA9PT0gaG92ZXJlZEJhbmQuZGF0ZVZhbHVlKVxuICAgICAgICAubWFwKHJlY3QgPT4gKHtcbiAgICAgICAgICBsYWJlbDogcmVjdC5zZXJpZXNQb2ludC5zZXJpZXMubGFiZWwsXG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIocmVjdC5zZXJpZXNQb2ludC52YWx1ZSksXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHsgYW5jaG9yLCBtZXRyaWNzIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcbn1cbiIsIjxkaXYgKm5nSWY9XCIhKGVtcHR5JCB8IGFzeW5jKTsgZWxzZSB6ZXJvU3RhdGVcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIFthdHRyLngyXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIHkyPVwiMFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1pbm9yVGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGljay1iYWNrZ3JvdW5kXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlID09PSB0aWNrLmRhdGVWYWx1ZVwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54IC0gMjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgM1wiXG4gICAgICAgIHdpZHRoPVwiNDBcIlxuICAgICAgICBoZWlnaHQ9XCIxMlwiXG4gICAgICAgIHJ4PVwiMlwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMTJcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54TWFqb3JUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMjRcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgIGhlaWdodD1cIjFcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0IGNsYXNzPVwidGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5yZWN0c1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJjb2x1bW5cIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIFthdHRyLmZpbGxdPVwicmVjdC5maWxsXCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKSAhPT0gbnVsbCAmJlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSAhPT0gcmVjdC5kYXRlVmFsdWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPHJlY3RcbiAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGQuaG92ZXJCYW5kc1wiXG4gICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgIGhvdmVyZWRCYW5kJC5uZXh0KHsgZGF0ZVZhbHVlOiByZWN0LmRhdGVWYWx1ZSwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICA+PC9yZWN0PlxuICA8L3N2Zz5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInY2VudGVyLXJpZ2h0J1wiXG4gICAgW2FsbG93ZWRQb3NpdGlvbnNdPVwiW1xuICAgICAgJ2NlbnRlci1yaWdodCcsXG4gICAgICAnY2VudGVyLWxlZnQnLFxuICAgICAgJ3RvcC1jZW50ZXInLFxuICAgICAgJ2JvdHRvbS1jZW50ZXInXG4gICAgXVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWNcIiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGNhbGxvdXQubWV0cmljc1wiPlxuICAgICAgICA8ZGl2Pnt7IG1ldHJpYy5sYWJlbCB9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWMtdmFsdWVcIj57eyBtZXRyaWMudmFsdWUgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjemVyb1N0YXRlPlxuICA8cml2LXplcm8tc3RhdGU+PC9yaXYtemVyby1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbHM+XG4gIDxyaXYtc2luZ2xlLXNlbGVjdFxuICAgIFtvcHRpb25zXT1cIihpbnRlcnZhbE9wdGlvbnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICBbc2VsZWN0ZWRPcHRpb25dPVwic2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQgfCBhc3luY1wiXG4gICAgKHNlbGVjdGVkT3B0aW9uQ2hhbmdlKT1cInNldEludGVydmFsT3B0aW9uKCRldmVudClcIlxuICA+PC9yaXYtc2luZ2xlLXNlbGVjdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=