@hestia-earth/ui-components 0.24.0-5 → 0.24.0-7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/maps-utils.d.ts +1 -0
- package/esm2022/common/maps-utils.mjs +1 -1
- package/esm2022/cycles/cycles-nodes/cycles-nodes.component.mjs +3 -3
- package/esm2022/impact-assessments/impact-assessments-products/impact-assessments-products.component.mjs +3 -3
- package/esm2022/node/node-store.service.mjs +6 -4
- package/esm2022/sites/sites-maps/sites-maps.component.mjs +25 -10
- package/esm2022/sites/sites-measurements/sites-measurements.component.mjs +3 -3
- package/fesm2022/hestia-earth-ui-components.mjs +33 -16
- package/fesm2022/hestia-earth-ui-components.mjs.map +1 -1
- package/package.json +1 -1
- package/sites/sites-maps/sites-maps.component.d.ts +8 -5
|
@@ -129,11 +129,11 @@ export class ImpactAssessmentsProductsComponent {
|
|
|
129
129
|
this.selectedIndex.set(+value);
|
|
130
130
|
}
|
|
131
131
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: ImpactAssessmentsProductsComponent, deps: [{ token: i1.HeNodeStoreService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
132
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: ImpactAssessmentsProductsComponent, selector: "he-impact-assessments-products", inputs: { dataState: "dataState", nodeKey: "nodeKey", filterTermTypes: "filterTermTypes", enableFilterMethodModel: "enableFilterMethodModel" }, ngImport: i0, template: "<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"indicators().length\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter indicators by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"impactAssessments().length > 1 || enableBreakdown() || !isOriginal()\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.table\"\n (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Table view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"impactAssessments().length > 1\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.chart\"\n (click)=\"selectedView = View.chart\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Chart view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"enableBreakdown()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.breakdown\"\n (click)=\"selectedView = View.breakdown\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Breakdown view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.logs\"\n (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto py-0\">\n <div class=\"select is-small\" *ngIf=\"enableFilterMethodModel\">\n <select (change)=\"updateSelectedMethodModel($event)\">\n <option [ngValue]=\"undefined\">Filter Model</option>\n <option *ngFor=\"let term of methodModels()\" [ngValue]=\"term\">{{ term.name }}</option>\n </select>\n </div>\n </th>\n <th class=\"has-border-right\"></th>\n <th class=\"has-border-right\"></th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.name\">\n <he-node-link [node]=\"indicator.value.term\">\n <span [innerHtml]=\"indicator.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#product'\" target=\"_blank\">Product</a>\n </th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.units\">\n <span [innerHtml]=\"indicator.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"indicator.value.term\"></he-terms-units-description>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let impactAssessment of impactAssessments(); trackBy: trackById; let i = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"impactName(impactAssessment)\">\n <he-node-link [node]=\"impactAssessment\">\n <span>{{ i + 1 }}. {{ impactName(impactAssessment) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.units\">\n <span>1 {{ impactAssessment.product?.term?.units }}</span>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.name\">\n <he-node-link *ngIf=\"impactAssessment.product?.term\" [node]=\"impactAssessment.product.term\">\n <span>{{ impactAssessment.product.term.name | ellipsis: 30 }}</span>\n </he-node-link>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let indicator of indicators()\">\n <span\n *ngIf=\"indicator.value.values[impactAssessment['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, {\n data: indicator.value.values[impactAssessment['@id']],\n impactAssessment: impactAssessment\n })\n \">\n <span pointer>\n {{\n propertyValue(indicator.value.values[impactAssessment['@id']].value, indicator.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"indicator.value.values[impactAssessment['@id']].node\"\n key=\"value\"\n [state]=\"impactAssessment.aggregated ? 'aggregated' : undefined\"></he-blank-node-state>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n</div>\n\n<he-impact-assessments-indicator-breakdown-chart\n *ngIf=\"selectedView === View.breakdown\"\n [impactAssessment]=\"impactAssessments()[0]\"\n [indicators]=\"impactAssessments()[0][_nodeKey()]\"></he-impact-assessments-indicator-breakdown-chart>\n\n<he-impact-assessments-indicators-chart\n *ngIf=\"selectedView === View.chart && impactAssessments().length > 1\"\n [key]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"></he-impact-assessments-indicators-chart>\n\n<ng-container *ngIf=\"selectedView === View.logs && !isOriginal()\">\n <div class=\"field has-addons pt-2 px-3\" *ngIf=\"impactAssessments().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select an Impact Assessment</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of impactAssessments(); let i = index\" [value]=\"i\">\n {{ i + 1 }}. {{ impactName(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [noDataMessage]=\"noDataMessage()\"></he-node-logs-models>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"impactAssessments()\"\n [filename]=\"'impact-' + _nodeKey() + '.csv'\"\n [isUpload]=\"false\"\n [headerKeys]=\"['impactAssessment.id', 'impactAssessment.@id', 'impactAssessment.' + _nodeKey() + '.']\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span [class.is-hidden]=\"!isOriginal()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"impactAssessment\" let-data=\"data\">\n <p *bindOnce=\"node\">\n <b>\n <span *ngIf=\"data.cycle\">{{ cycleLabel(node.cycle) }}</span>\n <span *ngIf=\"!data.cycle\">{{ data.name }}</span>\n </b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"_nodeKey()\"></he-node-value-details>\n</ng-template>\n\n<ng-template #suggestion let-impact=\"result\" let-t=\"term\">\n <div class=\"is-block\">\n <ngb-highlight [result]=\"impact.name || impact.cycle.name\" [term]=\"t\"></ngb-highlight>\n </div>\n <div class=\"columns is-flex\">\n <div class=\"column\" *ngIf=\"impact.country\">\n <span class=\"pr-1 has-text-underline\">Country:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.country.name\" [term]=\"t\"></ngb-highlight></span>\n </div>\n <div class=\"column\" *ngIf=\"impact.product\">\n <span class=\"pr-1 has-text-underline\">Product:</span>\n <span class=\"is-inline-flex\">\n <ngb-highlight [result]=\"impact.product.term?.name || impact.product.name\" [term]=\"t\"></ngb-highlight>\n </span>\n </div>\n <div class=\"column\" *ngIf=\"impact.endDate\">\n <span class=\"pr-1 has-text-underline\">Date:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.endDate\" [term]=\"t\"></ngb-highlight></span>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}he-data-table ::ng-deep .table thead tr th:nth-child(3),he-data-table ::ng-deep .table tbody tr td:nth-child(3){min-width:110px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i4.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term", "accentSensitive"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i6.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i7.BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: i8.BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted"] }, { kind: "component", type: i9.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i10.SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: i11.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: i12.NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: i13.NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: i14.NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey", "dataState"] }, { kind: "component", type: i15.TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: i16.ImpactAssessmentsIndicatorsChartComponent, selector: "he-impact-assessments-indicators-chart", inputs: ["key", "filterTermTypes"] }, { kind: "component", type: i17.ImpactAssessmentsIndicatorBreakdownChartComponent, selector: "he-impact-assessments-indicator-breakdown-chart", inputs: ["impactAssessment", "indicators"] }, { kind: "pipe", type: i18.CompoundPipe, name: "compound" }, { kind: "pipe", type: i19.DefaultPipe, name: "default" }, { kind: "pipe", type: i20.EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: i21.PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
132
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: ImpactAssessmentsProductsComponent, selector: "he-impact-assessments-products", inputs: { dataState: "dataState", nodeKey: "nodeKey", filterTermTypes: "filterTermTypes", enableFilterMethodModel: "enableFilterMethodModel" }, ngImport: i0, template: "<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"indicators().length\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter indicators by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"impactAssessments().length > 1 || enableBreakdown() || !isOriginal()\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.table\"\n (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Table view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"impactAssessments().length > 1\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.chart\"\n (click)=\"selectedView = View.chart\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Chart view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"enableBreakdown()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.breakdown\"\n (click)=\"selectedView = View.breakdown\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Breakdown view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.logs\"\n (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto py-0\">\n <div class=\"select is-small\" *ngIf=\"enableFilterMethodModel\">\n <select (change)=\"updateSelectedMethodModel($event)\">\n <option [ngValue]=\"undefined\">Filter Model</option>\n <option *ngFor=\"let term of methodModels()\" [ngValue]=\"term\">{{ term.name }}</option>\n </select>\n </div>\n </th>\n <th class=\"has-border-right\"></th>\n <th class=\"has-border-right\"></th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.name\">\n <he-node-link [node]=\"indicator.value.term\">\n <span [innerHtml]=\"indicator.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#product'\" target=\"_blank\">Product</a>\n </th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.units\">\n <span [innerHtml]=\"indicator.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"indicator.value.term\"></he-terms-units-description>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let impactAssessment of impactAssessments(); trackBy: trackById; let i = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"impactName(impactAssessment)\">\n <he-node-link [node]=\"impactAssessment\">\n <span>{{ i + 1 }}. {{ impactName(impactAssessment) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.units\">\n <span>1 {{ impactAssessment.product?.term?.units }}</span>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.name\">\n <he-node-link *ngIf=\"impactAssessment.product?.term\" [node]=\"impactAssessment.product.term\">\n <span>{{ impactAssessment.product.term.name | ellipsis: 30 }}</span>\n </he-node-link>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let indicator of indicators()\">\n <span\n *ngIf=\"indicator.value.values[impactAssessment['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, {\n data: indicator.value.values[impactAssessment['@id']],\n impactAssessment: impactAssessment\n })\n \">\n <span pointer>\n {{\n propertyValue(indicator.value.values[impactAssessment['@id']].value, indicator.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"indicator.value.values[impactAssessment['@id']].node\"\n key=\"value\"\n [state]=\"impactAssessment.aggregated ? 'aggregated' : undefined\"></he-blank-node-state>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n</div>\n\n<he-impact-assessments-indicator-breakdown-chart\n *ngIf=\"selectedView === View.breakdown\"\n [impactAssessment]=\"impactAssessments()[0]\"\n [indicators]=\"impactAssessments()[0][_nodeKey()]\"></he-impact-assessments-indicator-breakdown-chart>\n\n<he-impact-assessments-indicators-chart\n *ngIf=\"selectedView === View.chart && impactAssessments().length > 1\"\n [key]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"></he-impact-assessments-indicators-chart>\n\n<ng-container *ngIf=\"selectedView === View.logs && !isOriginal()\">\n <div class=\"field has-addons pt-2 px-3\" *ngIf=\"impactAssessments().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select an Impact Assessment</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of impactAssessments(); let i = index\" [value]=\"i\">\n {{ i + 1 }}. {{ impactName(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [noDataMessage]=\"noDataMessage()\"></he-node-logs-models>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"impactAssessments()\"\n [filename]=\"'impact-' + _nodeKey() + '.csv'\"\n [isUpload]=\"false\"\n [headerKeys]=\"['impactAssessment.id', 'impactAssessment.@id', 'impactAssessment.' + _nodeKey() + '.']\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span [class.is-hidden]=\"!isOriginal()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"impactAssessment\" let-data=\"data\">\n <p *bindOnce=\"node\">\n <b>\n <span *ngIf=\"data.cycle\">{{ cycleLabel(node.cycle) }}</span>\n <span *ngIf=\"!data.cycle\">{{ data.name }}</span>\n </b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"_nodeKey()\"></he-node-value-details>\n</ng-template>\n\n<ng-template #suggestion let-impact=\"result\" let-t=\"term\">\n <div class=\"is-block\">\n <ngb-highlight [result]=\"impact.name || impact.cycle.name\" [term]=\"t\"></ngb-highlight>\n </div>\n <div class=\"columns is-flex\">\n <div class=\"column\" *ngIf=\"impact.country\">\n <span class=\"pr-1 has-text-underline\">Country:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.country.name\" [term]=\"t\"></ngb-highlight></span>\n </div>\n <div class=\"column\" *ngIf=\"impact.product\">\n <span class=\"pr-1 has-text-underline\">Product:</span>\n <span class=\"is-inline-flex\">\n <ngb-highlight [result]=\"impact.product.term?.name || impact.product.name\" [term]=\"t\"></ngb-highlight>\n </span>\n </div>\n <div class=\"column\" *ngIf=\"impact.endDate\">\n <span class=\"pr-1 has-text-underline\">Date:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.endDate\" [term]=\"t\"></ngb-highlight></span>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}he-data-table ::ng-deep .table thead tr th:nth-child(3),he-data-table ::ng-deep .table tbody tr td:nth-child(3){min-width:110px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i4.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term", "accentSensitive"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i6.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i7.BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: i8.BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted"] }, { kind: "component", type: i9.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i10.SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: i11.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: i12.NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: i13.NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: i14.NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey", "dataState"] }, { kind: "component", type: i15.TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: i16.ImpactAssessmentsIndicatorsChartComponent, selector: "he-impact-assessments-indicators-chart", inputs: ["key", "filterTermTypes"] }, { kind: "component", type: i17.ImpactAssessmentsIndicatorBreakdownChartComponent, selector: "he-impact-assessments-indicator-breakdown-chart", inputs: ["impactAssessment", "indicators"] }, { kind: "pipe", type: i18.CompoundPipe, name: "compound" }, { kind: "pipe", type: i19.DefaultPipe, name: "default" }, { kind: "pipe", type: i20.EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: i21.PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
133
133
|
}
|
|
134
134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: ImpactAssessmentsProductsComponent, decorators: [{
|
|
135
135
|
type: Component,
|
|
136
|
-
args: [{ selector: 'he-impact-assessments-products', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"indicators().length\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter indicators by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"impactAssessments().length > 1 || enableBreakdown() || !isOriginal()\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.table\"\n (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Table view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"impactAssessments().length > 1\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.chart\"\n (click)=\"selectedView = View.chart\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Chart view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"enableBreakdown()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.breakdown\"\n (click)=\"selectedView = View.breakdown\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Breakdown view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.logs\"\n (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto py-0\">\n <div class=\"select is-small\" *ngIf=\"enableFilterMethodModel\">\n <select (change)=\"updateSelectedMethodModel($event)\">\n <option [ngValue]=\"undefined\">Filter Model</option>\n <option *ngFor=\"let term of methodModels()\" [ngValue]=\"term\">{{ term.name }}</option>\n </select>\n </div>\n </th>\n <th class=\"has-border-right\"></th>\n <th class=\"has-border-right\"></th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.name\">\n <he-node-link [node]=\"indicator.value.term\">\n <span [innerHtml]=\"indicator.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#product'\" target=\"_blank\">Product</a>\n </th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.units\">\n <span [innerHtml]=\"indicator.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"indicator.value.term\"></he-terms-units-description>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let impactAssessment of impactAssessments(); trackBy: trackById; let i = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"impactName(impactAssessment)\">\n <he-node-link [node]=\"impactAssessment\">\n <span>{{ i + 1 }}. {{ impactName(impactAssessment) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.units\">\n <span>1 {{ impactAssessment.product?.term?.units }}</span>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.name\">\n <he-node-link *ngIf=\"impactAssessment.product?.term\" [node]=\"impactAssessment.product.term\">\n <span>{{ impactAssessment.product.term.name | ellipsis: 30 }}</span>\n </he-node-link>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let indicator of indicators()\">\n <span\n *ngIf=\"indicator.value.values[impactAssessment['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, {\n data: indicator.value.values[impactAssessment['@id']],\n impactAssessment: impactAssessment\n })\n \">\n <span pointer>\n {{\n propertyValue(indicator.value.values[impactAssessment['@id']].value, indicator.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"indicator.value.values[impactAssessment['@id']].node\"\n key=\"value\"\n [state]=\"impactAssessment.aggregated ? 'aggregated' : undefined\"></he-blank-node-state>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n</div>\n\n<he-impact-assessments-indicator-breakdown-chart\n *ngIf=\"selectedView === View.breakdown\"\n [impactAssessment]=\"impactAssessments()[0]\"\n [indicators]=\"impactAssessments()[0][_nodeKey()]\"></he-impact-assessments-indicator-breakdown-chart>\n\n<he-impact-assessments-indicators-chart\n *ngIf=\"selectedView === View.chart && impactAssessments().length > 1\"\n [key]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"></he-impact-assessments-indicators-chart>\n\n<ng-container *ngIf=\"selectedView === View.logs && !isOriginal()\">\n <div class=\"field has-addons pt-2 px-3\" *ngIf=\"impactAssessments().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select an Impact Assessment</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of impactAssessments(); let i = index\" [value]=\"i\">\n {{ i + 1 }}. {{ impactName(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [noDataMessage]=\"noDataMessage()\"></he-node-logs-models>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"impactAssessments()\"\n [filename]=\"'impact-' + _nodeKey() + '.csv'\"\n [isUpload]=\"false\"\n [headerKeys]=\"['impactAssessment.id', 'impactAssessment.@id', 'impactAssessment.' + _nodeKey() + '.']\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span [class.is-hidden]=\"!isOriginal()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"impactAssessment\" let-data=\"data\">\n <p *bindOnce=\"node\">\n <b>\n <span *ngIf=\"data.cycle\">{{ cycleLabel(node.cycle) }}</span>\n <span *ngIf=\"!data.cycle\">{{ data.name }}</span>\n </b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"_nodeKey()\"></he-node-value-details>\n</ng-template>\n\n<ng-template #suggestion let-impact=\"result\" let-t=\"term\">\n <div class=\"is-block\">\n <ngb-highlight [result]=\"impact.name || impact.cycle.name\" [term]=\"t\"></ngb-highlight>\n </div>\n <div class=\"columns is-flex\">\n <div class=\"column\" *ngIf=\"impact.country\">\n <span class=\"pr-1 has-text-underline\">Country:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.country.name\" [term]=\"t\"></ngb-highlight></span>\n </div>\n <div class=\"column\" *ngIf=\"impact.product\">\n <span class=\"pr-1 has-text-underline\">Product:</span>\n <span class=\"is-inline-flex\">\n <ngb-highlight [result]=\"impact.product.term?.name || impact.product.name\" [term]=\"t\"></ngb-highlight>\n </span>\n </div>\n <div class=\"column\" *ngIf=\"impact.endDate\">\n <span class=\"pr-1 has-text-underline\">Date:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.endDate\" [term]=\"t\"></ngb-highlight></span>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}he-data-table ::ng-deep .table thead tr th:nth-child(3),he-data-table ::ng-deep .table tbody tr td:nth-child(3){min-width:110px}\n"] }]
|
|
136
|
+
args: [{ selector: 'he-impact-assessments-products', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"indicators().length\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter indicators by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"impactAssessments().length > 1 || enableBreakdown() || !isOriginal()\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.table\"\n (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Table view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"impactAssessments().length > 1\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.chart\"\n (click)=\"selectedView = View.chart\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Chart view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"enableBreakdown()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.breakdown\"\n (click)=\"selectedView = View.breakdown\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"chart-bar\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Breakdown view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal()\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView === View.logs\"\n (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto py-0\">\n <div class=\"select is-small\" *ngIf=\"enableFilterMethodModel\">\n <select (change)=\"updateSelectedMethodModel($event)\">\n <option [ngValue]=\"undefined\">Filter Model</option>\n <option *ngFor=\"let term of methodModels()\" [ngValue]=\"term\">{{ term.name }}</option>\n </select>\n </div>\n </th>\n <th class=\"has-border-right\"></th>\n <th class=\"has-border-right\"></th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.name\">\n <he-node-link [node]=\"indicator.value.term\">\n <span [innerHtml]=\"indicator.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/ImpactAssessment#product'\" target=\"_blank\">Product</a>\n </th>\n <th *ngFor=\"let indicator of indicators()\" [attr.title]=\"indicator.value.term.units\">\n <span [innerHtml]=\"indicator.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"indicator.value.term\"></he-terms-units-description>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let impactAssessment of impactAssessments(); trackBy: trackById; let i = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"impactName(impactAssessment)\">\n <he-node-link [node]=\"impactAssessment\">\n <span>{{ i + 1 }}. {{ impactName(impactAssessment) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.units\">\n <span>1 {{ impactAssessment.product?.term?.units }}</span>\n </td>\n <td class=\"has-border-right\" [attr.title]=\"impactAssessment.product?.term?.name\">\n <he-node-link *ngIf=\"impactAssessment.product?.term\" [node]=\"impactAssessment.product.term\">\n <span>{{ impactAssessment.product.term.name | ellipsis: 30 }}</span>\n </he-node-link>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let indicator of indicators()\">\n <span\n *ngIf=\"indicator.value.values[impactAssessment['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, {\n data: indicator.value.values[impactAssessment['@id']],\n impactAssessment: impactAssessment\n })\n \">\n <span pointer>\n {{\n propertyValue(indicator.value.values[impactAssessment['@id']].value, indicator.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"indicator.value.values[impactAssessment['@id']].node\"\n key=\"value\"\n [state]=\"impactAssessment.aggregated ? 'aggregated' : undefined\"></he-blank-node-state>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n</div>\n\n<he-impact-assessments-indicator-breakdown-chart\n *ngIf=\"selectedView === View.breakdown\"\n [impactAssessment]=\"impactAssessments()[0]\"\n [indicators]=\"impactAssessments()[0][_nodeKey()]\"></he-impact-assessments-indicator-breakdown-chart>\n\n<he-impact-assessments-indicators-chart\n *ngIf=\"selectedView === View.chart && impactAssessments().length > 1\"\n [key]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"></he-impact-assessments-indicators-chart>\n\n<ng-container *ngIf=\"selectedView === View.logs && !isOriginal()\">\n <div class=\"field has-addons pt-2 px-3\" *ngIf=\"impactAssessments().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select an Impact Assessment</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of impactAssessments(); let i = index\" [value]=\"i\">\n {{ i + 1 }}. {{ impactName(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"_nodeKey()\"\n [filterTermTypes]=\"_filterTermTypes()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [noDataMessage]=\"noDataMessage()\"></he-node-logs-models>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"impactAssessments()\"\n [filename]=\"'impact-' + _nodeKey() + '.csv'\"\n [isUpload]=\"false\"\n [headerKeys]=\"['impactAssessment.id', 'impactAssessment.@id', 'impactAssessment.' + _nodeKey() + '.']\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span [class.is-hidden]=\"!isOriginal()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"impactAssessment\" let-data=\"data\">\n <p *bindOnce=\"node\">\n <b>\n <span *ngIf=\"data.cycle\">{{ cycleLabel(node.cycle) }}</span>\n <span *ngIf=\"!data.cycle\">{{ data.name }}</span>\n </b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"_nodeKey()\"></he-node-value-details>\n</ng-template>\n\n<ng-template #suggestion let-impact=\"result\" let-t=\"term\">\n <div class=\"is-block\">\n <ngb-highlight [result]=\"impact.name || impact.cycle.name\" [term]=\"t\"></ngb-highlight>\n </div>\n <div class=\"columns is-flex\">\n <div class=\"column\" *ngIf=\"impact.country\">\n <span class=\"pr-1 has-text-underline\">Country:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.country.name\" [term]=\"t\"></ngb-highlight></span>\n </div>\n <div class=\"column\" *ngIf=\"impact.product\">\n <span class=\"pr-1 has-text-underline\">Product:</span>\n <span class=\"is-inline-flex\">\n <ngb-highlight [result]=\"impact.product.term?.name || impact.product.name\" [term]=\"t\"></ngb-highlight>\n </span>\n </div>\n <div class=\"column\" *ngIf=\"impact.endDate\">\n <span class=\"pr-1 has-text-underline\">Date:</span>\n <span class=\"is-inline-flex\"><ngb-highlight [result]=\"impact.endDate\" [term]=\"t\"></ngb-highlight></span>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}he-data-table ::ng-deep .table thead tr th:nth-child(3),he-data-table ::ng-deep .table tbody tr td:nth-child(3){min-width:110px}\n"] }]
|
|
137
137
|
}], ctorParameters: function () { return [{ type: i1.HeNodeStoreService }]; }, propDecorators: { dataState: [{
|
|
138
138
|
type: Input
|
|
139
139
|
}], nodeKey: [{
|
|
@@ -143,4 +143,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImpor
|
|
|
143
143
|
}], enableFilterMethodModel: [{
|
|
144
144
|
type: Input
|
|
145
145
|
}] } });
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbXBhY3QtYXNzZXNzbWVudHMvaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzL2ltcGFjdC1hc3Nlc3NtZW50cy1wcm9kdWN0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvaW1wYWN0LWFzc2Vzc21lbnRzL2ltcGFjdC1hc3Nlc3NtZW50cy1wcm9kdWN0cy9pbXBhY3QtYXNzZXNzbWVudHMtcHJvZHVjdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQXdFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFFaEIsWUFBWSxFQUNaLG9CQUFvQixFQUNyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFN0MsSUFBSyxJQUtKO0FBTEQsV0FBSyxJQUFJO0lBQ1AsdUJBQWUsQ0FBQTtJQUNmLHVCQUFlLENBQUE7SUFDZiwrQkFBdUIsQ0FBQTtJQUN2QixxQkFBYSxDQUFBO0FB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QkFEVixLQUFLO2dCQVFGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBUUYsdUJBQXVCO3NCQUQxQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIGNvbXB1dGVkLCBlZmZlY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQgeyBJQ3ljbGVKU09OTEQsIElJbXBhY3RBc3Nlc3NtZW50SlNPTkxELCBJbmRpY2F0b3IsIFRlcm1UZXJtVHlwZSwgVGVybSwgTm9kZVR5cGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuaW1wb3J0IG9yZGVyQnkgZnJvbSAnbG9kYXNoLm9yZGVyYnknO1xuaW1wb3J0IHVuaXFCeSBmcm9tICdsb2Rhc2gudW5pcWJ5JztcblxuaW1wb3J0IHtcbiAgQmxhbmtOb2Rlc0tleSxcbiAgZ3JvdXBOb2Rlc0J5VGVybSxcbiAgSUdyb3VwZWRLZXlzLFxuICBncm91cHBlZEtleXMsXG4gIGlzTWV0aG9kTW9kZWxBbGxvd2VkXG59IGZyb20gJy4uLy4uL2NvbW1vbi9ub2RlLXV0aWxzJztcbmltcG9ydCB7IEhlTm9kZVN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGJhc2VVcmwgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuXG5lbnVtIFZpZXcge1xuICB0YWJsZSA9ICd0YWJsZScsXG4gIGNoYXJ0ID0gJ2NoYXJ0JyxcbiAgYnJlYWtkb3duID0gJ2JyZWFrZG93bicsXG4gIGxvZ3MgPSAnbG9ncydcbn1cblxuY29uc3QgdGVybUFsbG93ZWQgPSAodGVybT86IFRlcm0sIGZpbHRlclRlcm1UeXBlczogVGVybVRlcm1UeXBlW10gPSBbXSkgPT5cbiAgIWZpbHRlclRlcm1UeXBlcz8ubGVuZ3RoIHx8IChmaWx0ZXJUZXJtVHlwZXMgfHwgW10pLmluY2x1ZGVzKHRlcm0/LnRlcm1UeXBlKTtcblxuY29uc3QgZmlsdGVyTm9kZSA9IChmaWx0ZXJCeU1ldGhvZE1vZGVsOiBib29sZWFuLCBmaWx0ZXJNZXRob2RNb2RlbD86IFRlcm0sIGZpbHRlclRlcm0/OiBzdHJpbmcpID0+IChub2RlOiBJbmRpY2F0b3IpID0+XG4gIFtcbiAgICAhZmlsdGVyQnlNZXRob2RNb2RlbCB8fCBpc01ldGhvZE1vZGVsQWxsb3dlZChmaWx0ZXJNZXRob2RNb2RlbCkobm9kZSksXG4gICAgIWZpbHRlclRlcm0gfHwgbm9kZT8udGVybT8ubmFtZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoZmlsdGVyVGVybS50b0xvd2VyQ2FzZSgpKVxuICBdLmV2ZXJ5KEJvb2xlYW4pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1pbXBhY3QtYXNzZXNzbWVudHMtcHJvZHVjdHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEltcGFjdEFzc2Vzc21lbnRzUHJvZHVjdHNDb21wb25lbnQge1xuICBwcm90ZWN0ZWQgX2RhdGFTdGF0ZSA9IHNpZ25hbChEYXRhU3RhdGUub3JpZ2luYWwpO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhU3RhdGUodmFsdWU6IERhdGFTdGF0ZSkge1xuICAgIHRoaXMuX2RhdGFTdGF0ZS5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9ub2RlS2V5ID0gc2lnbmFsKEJsYW5rTm9kZXNLZXkuaW1wYWN0cyk7XG4gIEBJbnB1dCgpXG4gIHNldCBub2RlS2V5KHZhbHVlOiBCbGFua05vZGVzS2V5KSB7XG4gICAgdGhpcy5fbm9kZUtleS5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9maWx0ZXJUZXJtVHlwZXMgPSBzaWduYWwoW10gYXMgVGVybVRlcm1UeXBlW10pO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBmaWx0ZXJUZXJtVHlwZXModmFsdWU6IFRlcm1UZXJtVHlwZVtdKSB7XG4gICAgdGhpcy5fZmlsdGVyVGVybVR5cGVzLnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9lbmFibGVGaWx0ZXJNZXRob2RNb2RlbCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KClcbiAgc2V0IGVuYWJsZUZpbHRlck1ldGhvZE1vZGVsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZW5hYmxlRmlsdGVyTWV0aG9kTW9kZWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTtcbiAgcHJvdGVjdGVkIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHByb3RlY3RlZCBzaG93RG93bmxvYWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIFZpZXcgPSBWaWV3O1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRWaWV3ID0gVmlldy50YWJsZTtcblxuICBwcml2YXRlIGN5Y2xlcyA9IHRvU2lnbmFsKHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kQnlTdGF0ZSQ8SUN5Y2xlSlNPTkxEPihOb2RlVHlwZS5DeWNsZSwgRGF0YVN0YXRlLm9yaWdpbmFsKSk7XG5cbiAgcHJpdmF0ZSBvcmlnaW5hbEltcGFjdEFzc2Vzc21lbnRzID0gdG9TaWduYWwoXG4gICAgdGhpcy5ub2RlU3RvcmVTZXJ2aWNlLmZpbmRCeVN0YXRlJDxJSW1wYWN0QXNzZXNzbWVudEpTT05MRD4oTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCwgRGF0YVN0YXRlLm9yaWdpbmFsKVxuICApO1xuICBwcml2YXRlIF9hbGxJbXBhY3RBc3Nlc3NtZW50cyA9IHRvU2lnbmFsKFxuICAgIHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kJDxJSW1wYWN0QXNzZXNzbWVudEpTT05MRD4oTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudClcbiAgKTtcbiAgcHJvdGVjdGVkIGltcGFjdEFzc2Vzc21lbnRzID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5fYWxsSW1wYWN0QXNzZXNzbWVudHMoKT8ubWFwKGRhdGEgPT4gZGF0YVt0aGlzLl9kYXRhU3RhdGUoKV0pIHx8IFtdXG4gICk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuICBwcml2YXRlIG9naXJpbmFsU2VsZWN0ZWRJbXBhY3RBc3Nlc3NtZW50ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcmlnaW5hbEltcGFjdEFzc2Vzc21lbnRzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcml2YXRlIHNlbGVjdGVkSW1wYWN0QXNzZXNzbWVudCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaW1wYWN0QXNzZXNzbWVudHMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZE9yaWdpbmFsVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vZ2lyaW5hbFNlbGVjdGVkSW1wYWN0QXNzZXNzbWVudCgpPy5bdGhpcy5fbm9kZUtleSgpXSB8fCBbXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRJbXBhY3RBc3Nlc3NtZW50KCk/Llt0aGlzLl9ub2RlS2V5KCldIHx8IFtdKTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkTm9kZSA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5zZWxlY3RlZEltcGFjdEFzc2Vzc21lbnQoKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEltcGFjdEFzc2Vzc21lbnQoKSxcbiAgICAgICAgICBkYXRhU3RhdGU6IERhdGFTdGF0ZS5yZWNhbGN1bGF0ZWRcbiAgICAgICAgfVxuICAgICAgOiBudWxsXG4gICk7XG5cbiAgcHJvdGVjdGVkIGlzT3JpZ2luYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9kYXRhU3RhdGUoKSA9PT0gRGF0YVN0YXRlLm9yaWdpbmFsKTtcbiAgcHJpdmF0ZSBvcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzT3JpZ2luYWwoKSA/IG51bGwgOiB0aGlzLm9yaWdpbmFsSW1wYWN0QXNzZXNzbWVudHMoKSkgfHwgW10pO1xuXG4gIHByb3RlY3RlZCBlbmFibGVCcmVha2Rvd24gPSBjb21wdXRlZChcbiAgICAoKSA9PiAhdGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5pbXBhY3RBc3Nlc3NtZW50cygpLmxlbmd0aCA9PT0gMSAmJiB0aGlzLl9ub2RlS2V5KCkgIT09ICdlbWlzc2lvbnNSZXNvdXJjZVVzZSdcbiAgKTtcblxuICBwcml2YXRlIHNob3VsZEZpbHRlckJ5TWV0aG9kTW9kZWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9lbmFibGVGaWx0ZXJNZXRob2RNb2RlbCgpICYmICF0aGlzLmlzT3JpZ2luYWwoKSk7XG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtID0gc2lnbmFsKCcnKTtcblxuICAvLyBhcyB3ZSBmaWx0ZXIgYnkgbWV0aG9kTW9kZWwsIHdlIG1pZ2h0IGhhdmUgYW4gZW1wdHkgdGFibGUgZm9yIHRoZSBkZWZhdWx0IG1vZGVscyBidXQgbm90IGZvciBvdGhlciBtb2RlbHNcbiAgcHJvdGVjdGVkIGhhc0RhdGEgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuX2VuYWJsZUZpbHRlck1ldGhvZE1vZGVsKCkgPyB0aGlzLm1ldGhvZE1vZGVscygpLmxlbmd0aCA6IHRoaXMuaW5kaWNhdG9ycygpLmxlbmd0aFxuICApO1xuXG4gIHByb3RlY3RlZCBub0RhdGFNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLl9ub2RlS2V5KCkgPT09IEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zUmVzb3VyY2VVc2VcbiAgICAgID8gJ1dlIGNhbm5vdCBjYWxjdWxhdGUgdGhlc2UgZGF0YSwgbW9zdCBsaWtlbHkgYmVjYXVzZSB3ZSBhcmUgbWlzc2luZyB0aGUgcXVhbnRpdHkgcHJvZHVjZWQgb3IgYmVjYXVzZSB3ZSBhcmUgbWlzc2luZyBkYXRhIHRvIGFsbG9jYXRlIGVudmlyb25tZW50YWwgaW1wYWN0IGRhdGEgYmV0d2VlbiBjby1wcm9kdWN0cy4nXG4gICAgICA6IHVuZGVmaW5lZFxuICApO1xuXG4gIHByb3RlY3RlZCBtZXRob2RNb2RlbHMgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgdW5pcUJ5KFxuICAgICAgICB0aGlzLmltcGFjdEFzc2Vzc21lbnRzKClcbiAgICAgICAgICAuZmxhdE1hcChpbXBhY3QgPT4gKGltcGFjdFt0aGlzLl9ub2RlS2V5KCldIHx8IFtdKS5tYXAodiA9PiB2Lm1ldGhvZE1vZGVsKSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAnQGlkJ1xuICAgICAgKSBhcyBUZXJtW11cbiAgKTtcblxuICBwcml2YXRlIF9zZWxlY3RlZE1ldGhvZE1vZGVsID0gc2lnbmFsKHVuZGVmaW5lZCBhcyBUZXJtKTtcblxuICBwcm90ZWN0ZWQgaW5kaWNhdG9ycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyBUT0RPOiB3aGVuIHRoZXJlIGFyZSBubyBpbmRpY2F0b3JzIGZvciB0aGUgZGVmYXVsdCBtb2RlbCwgdGhlIHRhYmxlIGFwcGVhcnMgZW1wdHlcbiAgICAvLyBzaG91bGQgZGVmYXVsdCBiYWNrIHRvIHRoZSBmaXJzdCBtb2RlbCBpbiB0aGlzIGNhc2VcbiAgICBjb25zdCBpbmRpY2F0b3JQZXJJbXBhY3RBc3Nlc3NtZW50ID0gZ3JvdXBOb2Rlc0J5VGVybTxJSW1wYWN0QXNzZXNzbWVudEpTT05MRCwgSW5kaWNhdG9yPihcbiAgICAgIHRoaXMuaW1wYWN0QXNzZXNzbWVudHMoKSxcbiAgICAgIHRoaXMuX25vZGVLZXkoKSxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSxcbiAgICAgIGZpbHRlck5vZGUodGhpcy5zaG91bGRGaWx0ZXJCeU1ldGhvZE1vZGVsKCksIHRoaXMuX3NlbGVjdGVkTWV0aG9kTW9kZWwoKSwgdGhpcy5maWx0ZXJUZXJtKCkpXG4gICAgKTtcbiAgICByZXR1cm4gb3JkZXJCeShcbiAgICAgIGdyb3VwcGVkS2V5cyhpbmRpY2F0b3JQZXJJbXBhY3RBc3Nlc3NtZW50KSBhcyBhbnlbXSxcbiAgICAgIFsndmFsdWUubWV0aG9kVGllck9yZGVyJywgJ2tleSddLFxuICAgICAgWydhc2MnLCAnYXNjJ11cbiAgICApLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB0ZXJtQWxsb3dlZCh2YWx1ZT8udGVybSwgdGhpcy5fZmlsdGVyVGVybVR5cGVzKCkpKSBhcyBJR3JvdXBlZEtleXM8SW5kaWNhdG9yPltdO1xuICB9KTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vZGVTdG9yZVNlcnZpY2U6IEhlTm9kZVN0b3JlU2VydmljZSkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBtYWtlIHN1cmUgbG9ncyBkb2VzIG5vdCByZW1haW4gZGlzcGxheWVkIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gb3JpZ2luYWwgdmlld1xuICAgICAgaWYgKHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuc2VsZWN0ZWRWaWV3ID09PSBWaWV3LmxvZ3MpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSBWaWV3LnRhYmxlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUltcGFjdEFzc2Vzc21lbnRKU09OTEQpIHtcbiAgICByZXR1cm4gaXRlbVsnQGlkJ107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0ZWRNZXRob2RNb2RlbCh7IHRhcmdldDogeyB2YWx1ZSB9IH0pIHtcbiAgICB0aGlzLl9zZWxlY3RlZE1ldGhvZE1vZGVsLnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlUG9wb3Zlcihwb3BvdmVyLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHBvcG92ZXIuaXNPcGVuKCkgPyBwb3BvdmVyLmNsb3NlKCkgOiBwb3BvdmVyLm9wZW4oY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW1wYWN0TmFtZShpbXBhY3Q6IElJbXBhY3RBc3Nlc3NtZW50SlNPTkxEKSB7XG4gICAgcmV0dXJuIGltcGFjdC5uYW1lIHx8IChpbXBhY3QuY3ljbGUgPyB0aGlzLmN5Y2xlTGFiZWwoaW1wYWN0LmN5Y2xlKSA6IGltcGFjdFsnQGlkJ10pIHx8IChpbXBhY3QgYXMgYW55KS5pZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjeWNsZUxhYmVsKHsgJ0BpZCc6IGlkLCBuYW1lIH06IGFueSkge1xuICAgIHJldHVybiBuYW1lIHx8IHRoaXMuY3ljbGVzKCkuZmluZCh2ID0+IHZbJ0BpZCddID09PSBpZCk/Lm5hbWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVyQnlUZXJtKHRlcm06IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyVGVybS5zZXQodGVybSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0SW5kZXgoeyB0YXJnZXQ6IHsgdmFsdWUgfSB9KSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4LnNldCgrdmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtMiBpcy1tLTBcIiAqbmdJZj1cImluZGljYXRvcnMoKS5sZW5ndGhcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFZpZXcgPT09IFZpZXcudGFibGVcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtZ2hvc3RcIlxuICAgICAgICAoY2xpY2spPVwic2hvd0Rvd25sb2FkID0gdHJ1ZVwiXG4gICAgICAgIG5nYlRvb2x0aXA9XCJEb3dubG9hZCBhcyBDU1ZcIlxuICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImRvd25sb2FkXCIgc2l6ZT1cImxnXCI+PC9mYS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSBWaWV3LnRhYmxlXCI+XG4gICAgPGhlLXNlYXJjaC1leHRlbmRcbiAgICAgIGNsYXNzPVwiaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGluZGljYXRvcnMgYnkgbmFtZVwiXG4gICAgICAoc2VhcmNoKT1cImZpbHRlckJ5VGVybSgkZXZlbnQpXCI+PC9oZS1zZWFyY2gtZXh0ZW5kPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIiAqbmdJZj1cImltcGFjdEFzc2Vzc21lbnRzKCkubGVuZ3RoID4gMSB8fCBlbmFibGVCcmVha2Rvd24oKSB8fCAhaXNPcmlnaW5hbCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkVmlldyA9PT0gVmlldy50YWJsZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldyA9IFZpZXcudGFibGVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJsaXN0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWhpZGRlbi1tb2JpbGVcIj5UYWJsZSB2aWV3PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImltcGFjdEFzc2Vzc21lbnRzKCkubGVuZ3RoID4gMVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcgPT09IFZpZXcuY2hhcnRcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcgPSBWaWV3LmNoYXJ0XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2hhcnQtYmFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWhpZGRlbi1tb2JpbGVcIj5DaGFydCB2aWV3PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImVuYWJsZUJyZWFrZG93bigpXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkVmlldyA9PT0gVmlldy5icmVha2Rvd25cIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcgPSBWaWV3LmJyZWFrZG93blwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImNoYXJ0LWJhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1oaWRkZW4tbW9iaWxlXCI+QnJlYWtkb3duIHZpZXc8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiIWlzT3JpZ2luYWwoKVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcgPT09IFZpZXcubG9nc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldyA9IFZpZXcubG9nc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaGlkZGVuLW1vYmlsZVwiPlJlY2FsY3VsYXRpb25zIGxvZ3M8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJweC0zIHBiLTNcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInNlbGVjdGVkVmlldyAhPT0gVmlldy50YWJsZVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGF0YSgpOyBlbHNlIGVtcHR5VGFibGVcIj5cbiAgICA8aGUtZGF0YS10YWJsZSBjbGFzcz1cIm1iLTEgaXMtc21hbGxcIiBbc21hbGxdPVwidHJ1ZVwiIG1heEhlaWdodD1cIjMyMFwiPlxuICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gcHktMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNtYWxsXCIgKm5nSWY9XCJlbmFibGVGaWx0ZXJNZXRob2RNb2RlbFwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZE1ldGhvZE1vZGVsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwidW5kZWZpbmVkXCI+RmlsdGVyIE1vZGVsPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB0ZXJtIG9mIG1ldGhvZE1vZGVscygpXCIgW25nVmFsdWVdPVwidGVybVwiPnt7IHRlcm0ubmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCI+PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHRcIj48L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBpbmRpY2F0b3Igb2YgaW5kaWNhdG9ycygpXCIgW2F0dHIudGl0bGVdPVwiaW5kaWNhdG9yLnZhbHVlLnRlcm0ubmFtZVwiPlxuICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cImluZGljYXRvci52YWx1ZS50ZXJtXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJpbmRpY2F0b3IudmFsdWUudGVybS5uYW1lIHwgZWxsaXBzaXM6IDMwIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDx0ciBjbGFzcz1cImlzLWl0YWxpYyBoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS9JbXBhY3RBc3Nlc3NtZW50I2Z1bmN0aW9uYWxVbml0J1wiIHRhcmdldD1cIl9ibGFua1wiPkZ1bmN0aW9uYWwgdW5pdDwvYT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS9JbXBhY3RBc3Nlc3NtZW50I3Byb2R1Y3QnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UHJvZHVjdDwvYT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGluZGljYXRvciBvZiBpbmRpY2F0b3JzKClcIiBbYXR0ci50aXRsZV09XCJpbmRpY2F0b3IudmFsdWUudGVybS51bml0c1wiPlxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cImluZGljYXRvci52YWx1ZS50ZXJtLnVuaXRzIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxoZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLW1sLTJcIlxuICAgICAgICAgICAgICAgIFt0ZXJtXT1cImluZGljYXRvci52YWx1ZS50ZXJtXCI+PC9oZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltcGFjdEFzc2Vzc21lbnQgb2YgaW1wYWN0QXNzZXNzbWVudHMoKTsgdHJhY2tCeTogdHJhY2tCeUlkOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiIFthdHRyLnRpdGxlXT1cImltcGFjdE5hbWUoaW1wYWN0QXNzZXNzbWVudClcIj5cbiAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cImltcGFjdEFzc2Vzc21lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19LiB7eyBpbXBhY3ROYW1lKGltcGFjdEFzc2Vzc21lbnQpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2F0dHIudGl0bGVdPVwiaW1wYWN0QXNzZXNzbWVudC5wcm9kdWN0Py50ZXJtPy51bml0c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuPjEge3sgaW1wYWN0QXNzZXNzbWVudC5wcm9kdWN0Py50ZXJtPy51bml0cyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFthdHRyLnRpdGxlXT1cImltcGFjdEFzc2Vzc21lbnQucHJvZHVjdD8udGVybT8ubmFtZVwiPlxuICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgKm5nSWY9XCJpbXBhY3RBc3Nlc3NtZW50LnByb2R1Y3Q/LnRlcm1cIiBbbm9kZV09XCJpbXBhY3RBc3Nlc3NtZW50LnByb2R1Y3QudGVybVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaW1wYWN0QXNzZXNzbWVudC5wcm9kdWN0LnRlcm0ubmFtZSB8IGVsbGlwc2lzOiAzMCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaXMtbm93cmFwXCIgKm5nRm9yPVwibGV0IGluZGljYXRvciBvZiBpbmRpY2F0b3JzKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbmRpY2F0b3IudmFsdWUudmFsdWVzW2ltcGFjdEFzc2Vzc21lbnRbJ0BpZCddXTsgZWxzZSBlbXB0eVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFtuZ2JQb3BvdmVyXT1cImRldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxuICAgICAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwibWFudWFsXCJcbiAgICAgICAgICAgICAgICAgICNwPVwibmdiUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVQb3BvdmVyKHAsIHtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpbmRpY2F0b3IudmFsdWUudmFsdWVzW2ltcGFjdEFzc2Vzc21lbnRbJ0BpZCddXSxcbiAgICAgICAgICAgICAgICAgICAgICBpbXBhY3RBc3Nlc3NtZW50OiBpbXBhY3RBc3Nlc3NtZW50XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHBvaW50ZXI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZShpbmRpY2F0b3IudmFsdWUudmFsdWVzW2ltcGFjdEFzc2Vzc21lbnRbJ0BpZCddXS52YWx1ZSwgaW5kaWNhdG9yLnZhbHVlLnRlcm1bJ0BpZCddKVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBwcmVjaXNpb246IDNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZGVmYXVsdDogJy0nXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YVN0YXRlXT1cIl9kYXRhU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtub2RlXT1cImluZGljYXRvci52YWx1ZS52YWx1ZXNbaW1wYWN0QXNzZXNzbWVudFsnQGlkJ11dLm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICBrZXk9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdGF0ZV09XCJpbXBhY3RBc3Nlc3NtZW50LmFnZ3JlZ2F0ZWQgPyAnYWdncmVnYXRlZCcgOiB1bmRlZmluZWRcIj48L2hlLWJsYW5rLW5vZGUtc3RhdGU+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9oZS1kYXRhLXRhYmxlPlxuXG4gICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGhlLWltcGFjdC1hc3Nlc3NtZW50cy1pbmRpY2F0b3ItYnJlYWtkb3duLWNoYXJ0XG4gICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSBWaWV3LmJyZWFrZG93blwiXG4gIFtpbXBhY3RBc3Nlc3NtZW50XT1cImltcGFjdEFzc2Vzc21lbnRzKClbMF1cIlxuICBbaW5kaWNhdG9yc109XCJpbXBhY3RBc3Nlc3NtZW50cygpWzBdW19ub2RlS2V5KCldXCI+PC9oZS1pbXBhY3QtYXNzZXNzbWVudHMtaW5kaWNhdG9yLWJyZWFrZG93bi1jaGFydD5cblxuPGhlLWltcGFjdC1hc3Nlc3NtZW50cy1pbmRpY2F0b3JzLWNoYXJ0XG4gICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSBWaWV3LmNoYXJ0ICYmIGltcGFjdEFzc2Vzc21lbnRzKCkubGVuZ3RoID4gMVwiXG4gIFtrZXldPVwiX25vZGVLZXkoKVwiXG4gIFtmaWx0ZXJUZXJtVHlwZXNdPVwiX2ZpbHRlclRlcm1UeXBlcygpXCI+PC9oZS1pbXBhY3QtYXNzZXNzbWVudHMtaW5kaWNhdG9ycy1jaGFydD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVmlldyA9PT0gVmlldy5sb2dzICYmICFpc09yaWdpbmFsKClcIj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgcHQtMiBweC0zXCIgKm5nSWY9XCJpbXBhY3RBc3Nlc3NtZW50cygpLmxlbmd0aCA+IDFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtc3RhdGljIGlzLXNlY29uZGFyeVwiPlNlbGVjdCBhbiBJbXBhY3QgQXNzZXNzbWVudDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbCBpcy1mdWxsd2lkdGggaXMtc2Vjb25kYXJ5XCI+XG4gICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJzZWxlY3RJbmRleCgkZXZlbnQpXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgaW1wYWN0QXNzZXNzbWVudHMoKTsgbGV0IGkgPSBpbmRleFwiIFt2YWx1ZV09XCJpXCI+XG4gICAgICAgICAgICB7eyBpICsgMSB9fS4ge3sgaW1wYWN0TmFtZSh2YWx1ZSkgfX1cbiAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGhlLW5vZGUtbG9ncy1tb2RlbHNcbiAgICAqbmdJZj1cInNlbGVjdGVkTm9kZSgpXCJcbiAgICBbbm9kZV09XCJzZWxlY3RlZE5vZGUoKVwiXG4gICAgW25vZGVLZXldPVwiX25vZGVLZXkoKVwiXG4gICAgW2ZpbHRlclRlcm1UeXBlc109XCJfZmlsdGVyVGVybVR5cGVzKClcIlxuICAgIFtvcmlnaW5hbFZhbHVlc109XCJzZWxlY3RlZE9yaWdpbmFsVmFsdWVzKClcIlxuICAgIFtyZWNhbGN1bGF0ZWRWYWx1ZXNdPVwic2VsZWN0ZWRSZWNhbGN1bGF0ZWRWYWx1ZXMoKVwiXG4gICAgW25vRGF0YU1lc3NhZ2VdPVwibm9EYXRhTWVzc2FnZSgpXCI+PC9oZS1ub2RlLWxvZ3MtbW9kZWxzPlxuPC9uZy1jb250YWluZXI+XG5cbjxoZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybVxuICAqbmdJZj1cInNob3dEb3dubG9hZFwiXG4gIFtub2Rlc109XCJpbXBhY3RBc3Nlc3NtZW50cygpXCJcbiAgW2ZpbGVuYW1lXT1cIidpbXBhY3QtJyArIF9ub2RlS2V5KCkgKyAnLmNzdidcIlxuICBbaXNVcGxvYWRdPVwiZmFsc2VcIlxuICBbaGVhZGVyS2V5c109XCJbJ2ltcGFjdEFzc2Vzc21lbnQuaWQnLCAnaW1wYWN0QXNzZXNzbWVudC5AaWQnLCAnaW1wYWN0QXNzZXNzbWVudC4nICsgX25vZGVLZXkoKSArICcuJ11cIlxuICAoY2xvc2VkKT1cInNob3dEb3dubG9hZCA9IGZhbHNlXCI+PC9oZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlPlxuICA8ZGl2IGNsYXNzPVwiaGFzLXRleHQtY2VudGVyZWRcIj5cbiAgICA8c3Bhbj5ObyBkYXRhIGF2YWlsYWJsZTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFmaWx0ZXJUZXJtKClcIj5tYXRjaGluZyB5b3VyIHNlYXJjaCBjcml0ZXJpYTwvc3Bhbj5cbiAgICA8c3Bhbj4uPC9zcGFuPlxuICAgIDxzcGFuIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWlzT3JpZ2luYWwoKVwiPlxuICAgICAgU3dpdGNoIHRvXG4gICAgICA8Y29kZT5yZWNhbGN1bGF0ZWQ8L2NvZGU+XG4gICAgICB2ZXJzaW9uLlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5VmFsdWU+XG4gIDxzcGFuPi08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RldGFpbHMgbGV0LW5vZGU9XCJpbXBhY3RBc3Nlc3NtZW50XCIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxwICpiaW5kT25jZT1cIm5vZGVcIj5cbiAgICA8Yj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YS5jeWNsZVwiPnt7IGN5Y2xlTGFiZWwobm9kZS5jeWNsZSkgfX08L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFkYXRhLmN5Y2xlXCI+e3sgZGF0YS5uYW1lIH19PC9zcGFuPlxuICAgIDwvYj5cbiAgPC9wPlxuICA8aGUtbm9kZS12YWx1ZS1kZXRhaWxzXG4gICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgW2RhdGFTdGF0ZV09XCJfZGF0YVN0YXRlKClcIlxuICAgIFtub2RlVHlwZV09XCJub2RlWydAdHlwZSddXCJcbiAgICBbZGF0YUtleV09XCJfbm9kZUtleSgpXCI+PC9oZS1ub2RlLXZhbHVlLWRldGFpbHM+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N1Z2dlc3Rpb24gbGV0LWltcGFjdD1cInJlc3VsdFwiIGxldC10PVwidGVybVwiPlxuICA8ZGl2IGNsYXNzPVwiaXMtYmxvY2tcIj5cbiAgICA8bmdiLWhpZ2hsaWdodCBbcmVzdWx0XT1cImltcGFjdC5uYW1lIHx8IGltcGFjdC5jeWNsZS5uYW1lXCIgW3Rlcm1dPVwidFwiPjwvbmdiLWhpZ2hsaWdodD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uXCIgKm5nSWY9XCJpbXBhY3QuY291bnRyeVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwci0xIGhhcy10ZXh0LXVuZGVybGluZVwiPkNvdW50cnk6PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtZmxleFwiPjxuZ2ItaGlnaGxpZ2h0IFtyZXN1bHRdPVwiaW1wYWN0LmNvdW50cnkubmFtZVwiIFt0ZXJtXT1cInRcIj48L25nYi1oaWdobGlnaHQ+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiAqbmdJZj1cImltcGFjdC5wcm9kdWN0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInByLTEgaGFzLXRleHQtdW5kZXJsaW5lXCI+UHJvZHVjdDo8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1mbGV4XCI+XG4gICAgICAgIDxuZ2ItaGlnaGxpZ2h0IFtyZXN1bHRdPVwiaW1wYWN0LnByb2R1Y3QudGVybT8ubmFtZSB8fCBpbXBhY3QucHJvZHVjdC5uYW1lXCIgW3Rlcm1dPVwidFwiPjwvbmdiLWhpZ2hsaWdodD5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uXCIgKm5nSWY9XCJpbXBhY3QuZW5kRGF0ZVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwci0xIGhhcy10ZXh0LXVuZGVybGluZVwiPkRhdGU6PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtZmxleFwiPjxuZ2ItaGlnaGxpZ2h0IFtyZXN1bHRdPVwiaW1wYWN0LmVuZERhdGVcIiBbdGVybV09XCJ0XCI+PC9uZ2ItaGlnaGxpZ2h0Pjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbXBhY3QtYXNzZXNzbWVudHMvaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzL2ltcGFjdC1hc3Nlc3NtZW50cy1wcm9kdWN0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvaW1wYWN0LWFzc2Vzc21lbnRzL2ltcGFjdC1hc3Nlc3NtZW50cy1wcm9kdWN0cy9pbXBhY3QtYXNzZXNzbWVudHMtcHJvZHVjdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQXdFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFFaEIsWUFBWSxFQUNaLG9CQUFvQixFQUNyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFN0MsSUFBSyxJQUtKO0FBTEQsV0FBSyxJQUFJO0lBQ1AsdUJBQWUsQ0FBQTtJQUNmLHVCQUFlLENBQUE7SUFDZiwrQkFBdUIsQ0FBQTtJQUN2QixxQkFBYSxDQUFBO0FB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QkFEVixLQUFLO2dCQVFGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBUUYsdUJBQXVCO3NCQUQxQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIGNvbXB1dGVkLCBlZmZlY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQgeyBJQ3ljbGVKU09OTEQsIElJbXBhY3RBc3Nlc3NtZW50SlNPTkxELCBJbmRpY2F0b3IsIFRlcm1UZXJtVHlwZSwgVGVybSwgTm9kZVR5cGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuaW1wb3J0IG9yZGVyQnkgZnJvbSAnbG9kYXNoLm9yZGVyYnknO1xuaW1wb3J0IHVuaXFCeSBmcm9tICdsb2Rhc2gudW5pcWJ5JztcblxuaW1wb3J0IHtcbiAgQmxhbmtOb2Rlc0tleSxcbiAgZ3JvdXBOb2Rlc0J5VGVybSxcbiAgSUdyb3VwZWRLZXlzLFxuICBncm91cHBlZEtleXMsXG4gIGlzTWV0aG9kTW9kZWxBbGxvd2VkXG59IGZyb20gJy4uLy4uL2NvbW1vbi9ub2RlLXV0aWxzJztcbmltcG9ydCB7IEhlTm9kZVN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGJhc2VVcmwgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuXG5lbnVtIFZpZXcge1xuICB0YWJsZSA9ICd0YWJsZScsXG4gIGNoYXJ0ID0gJ2NoYXJ0JyxcbiAgYnJlYWtkb3duID0gJ2JyZWFrZG93bicsXG4gIGxvZ3MgPSAnbG9ncydcbn1cblxuY29uc3QgdGVybUFsbG93ZWQgPSAodGVybT86IFRlcm0sIGZpbHRlclRlcm1UeXBlczogVGVybVRlcm1UeXBlW10gPSBbXSkgPT5cbiAgIWZpbHRlclRlcm1UeXBlcz8ubGVuZ3RoIHx8IChmaWx0ZXJUZXJtVHlwZXMgfHwgW10pLmluY2x1ZGVzKHRlcm0/LnRlcm1UeXBlKTtcblxuY29uc3QgZmlsdGVyTm9kZSA9IChmaWx0ZXJCeU1ldGhvZE1vZGVsOiBib29sZWFuLCBmaWx0ZXJNZXRob2RNb2RlbD86IFRlcm0sIGZpbHRlclRlcm0/OiBzdHJpbmcpID0+IChub2RlOiBJbmRpY2F0b3IpID0+XG4gIFtcbiAgICAhZmlsdGVyQnlNZXRob2RNb2RlbCB8fCBpc01ldGhvZE1vZGVsQWxsb3dlZChmaWx0ZXJNZXRob2RNb2RlbCkobm9kZSksXG4gICAgIWZpbHRlclRlcm0gfHwgbm9kZT8udGVybT8ubmFtZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoZmlsdGVyVGVybS50b0xvd2VyQ2FzZSgpKVxuICBdLmV2ZXJ5KEJvb2xlYW4pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1pbXBhY3QtYXNzZXNzbWVudHMtcHJvZHVjdHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW1wYWN0LWFzc2Vzc21lbnRzLXByb2R1Y3RzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEltcGFjdEFzc2Vzc21lbnRzUHJvZHVjdHNDb21wb25lbnQge1xuICBwcm90ZWN0ZWQgX2RhdGFTdGF0ZSA9IHNpZ25hbChEYXRhU3RhdGUub3JpZ2luYWwpO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhU3RhdGUodmFsdWU6IERhdGFTdGF0ZSkge1xuICAgIHRoaXMuX2RhdGFTdGF0ZS5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9ub2RlS2V5ID0gc2lnbmFsKEJsYW5rTm9kZXNLZXkuaW1wYWN0cyk7XG4gIEBJbnB1dCgpXG4gIHNldCBub2RlS2V5KHZhbHVlOiBCbGFua05vZGVzS2V5KSB7XG4gICAgdGhpcy5fbm9kZUtleS5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9maWx0ZXJUZXJtVHlwZXMgPSBzaWduYWwoW10gYXMgVGVybVRlcm1UeXBlW10pO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBmaWx0ZXJUZXJtVHlwZXModmFsdWU6IFRlcm1UZXJtVHlwZVtdKSB7XG4gICAgdGhpcy5fZmlsdGVyVGVybVR5cGVzLnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9lbmFibGVGaWx0ZXJNZXRob2RNb2RlbCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KClcbiAgc2V0IGVuYWJsZUZpbHRlck1ldGhvZE1vZGVsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZW5hYmxlRmlsdGVyTWV0aG9kTW9kZWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTtcbiAgcHJvdGVjdGVkIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHByb3RlY3RlZCBzaG93RG93bmxvYWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIFZpZXcgPSBWaWV3O1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRWaWV3ID0gVmlldy50YWJsZTtcblxuICBwcml2YXRlIGN5Y2xlcyA9IHRvU2lnbmFsKHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kQnlTdGF0ZSQ8SUN5Y2xlSlNPTkxEPihOb2RlVHlwZS5DeWNsZSwgRGF0YVN0YXRlLm9yaWdpbmFsKSk7XG5cbiAgcHJpdmF0ZSBvcmlnaW5hbEltcGFjdEFzc2Vzc21lbnRzID0gdG9TaWduYWwoXG4gICAgdGhpcy5ub2RlU3RvcmVTZXJ2aWNlLmZpbmRCeVN0YXRlJDxJSW1wYWN0QXNzZXNzbWVudEpTT05MRD4oTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCwgRGF0YVN0YXRlLm9yaWdpbmFsKVxuICApO1xuICBwcml2YXRlIF9hbGxJbXBhY3RBc3Nlc3NtZW50cyA9IHRvU2lnbmFsKFxuICAgIHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kJDxJSW1wYWN0QXNzZXNzbWVudEpTT05MRD4oTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudClcbiAgKTtcbiAgcHJvdGVjdGVkIGltcGFjdEFzc2Vzc21lbnRzID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5fYWxsSW1wYWN0QXNzZXNzbWVudHMoKT8ubWFwKGRhdGEgPT4gZGF0YVt0aGlzLl9kYXRhU3RhdGUoKV0pIHx8IFtdXG4gICk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuICBwcml2YXRlIG9naXJpbmFsU2VsZWN0ZWRJbXBhY3RBc3Nlc3NtZW50ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcmlnaW5hbEltcGFjdEFzc2Vzc21lbnRzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcml2YXRlIHNlbGVjdGVkSW1wYWN0QXNzZXNzbWVudCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaW1wYWN0QXNzZXNzbWVudHMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZE9yaWdpbmFsVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vZ2lyaW5hbFNlbGVjdGVkSW1wYWN0QXNzZXNzbWVudCgpPy5bdGhpcy5fbm9kZUtleSgpXSB8fCBbXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRJbXBhY3RBc3Nlc3NtZW50KCk/Llt0aGlzLl9ub2RlS2V5KCldIHx8IFtdKTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkTm9kZSA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5zZWxlY3RlZEltcGFjdEFzc2Vzc21lbnQoKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEltcGFjdEFzc2Vzc21lbnQoKSxcbiAgICAgICAgICBkYXRhU3RhdGU6IERhdGFTdGF0ZS5yZWNhbGN1bGF0ZWRcbiAgICAgICAgfVxuICAgICAgOiBudWxsXG4gICk7XG5cbiAgcHJvdGVjdGVkIGlzT3JpZ2luYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9kYXRhU3RhdGUoKSA9PT0gRGF0YVN0YXRlLm9yaWdpbmFsKTtcbiAgcHJpdmF0ZSBvcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzT3JpZ2luYWwoKSA/IG51bGwgOiB0aGlzLm9yaWdpbmFsSW1wYWN0QXNzZXNzbWVudHMoKSkgfHwgW10pO1xuXG4gIHByb3RlY3RlZCBlbmFibGVCcmVha2Rvd24gPSBjb21wdXRlZChcbiAgICAoKSA9PiAhdGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5pbXBhY3RBc3Nlc3NtZW50cygpLmxlbmd0aCA9PT0gMSAmJiB0aGlzLl9ub2RlS2V5KCkgIT09ICdlbWlzc2lvbnNSZXNvdXJjZVVzZSdcbiAgKTtcblxuICBwcml2YXRlIHNob3VsZEZpbHRlckJ5TWV0aG9kTW9kZWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9lbmFibGVGaWx0ZXJNZXRob2RNb2RlbCgpICYmICF0aGlzLmlzT3JpZ2luYWwoKSk7XG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtID0gc2lnbmFsKCcnKTtcblxuICAvLyBhcyB3ZSBmaWx0ZXIgYnkgbWV0aG9kTW9kZWwsIHdlIG1pZ2h0IGhhdmUgYW4gZW1wdHkgdGFibGUgZm9yIHRoZSBkZWZhdWx0IG1vZGVscyBidXQgbm90IGZvciBvdGhlciBtb2RlbHNcbiAgcHJvdGVjdGVkIGhhc0RhdGEgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuX2VuYWJsZUZpbHRlck1ldGhvZE1vZGVsKCkgPyB0aGlzLm1ldGhvZE1vZGVscygpLmxlbmd0aCA6IHRoaXMuaW5kaWNhdG9ycygpLmxlbmd0aFxuICApO1xuXG4gIHByb3RlY3RlZCBub0RhdGFNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLl9ub2RlS2V5KCkgPT09IEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zUmVzb3VyY2VVc2VcbiAgICAgID8gJ1dlIGNhbm5vdCBjYWxjdWxhdGUgdGhlc2UgZGF0YSwgbW9zdCBsaWtlbHkgYmVjYXVzZSB3ZSBhcmUgbWlzc2luZyB0aGUgcXVhbnRpdHkgcHJvZHVjZWQgb3IgYmVjYXVzZSB3ZSBhcmUgbWlzc2luZyBkYXRhIHRvIGFsbG9jYXRlIGVudmlyb25tZW50YWwgaW1wYWN0IGRhdGEgYmV0d2VlbiBjby1wcm9kdWN0cy4nXG4gICAgICA6IHVuZGVmaW5lZFxuICApO1xuXG4gIHByb3RlY3RlZCBtZXRob2RNb2RlbHMgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgdW5pcUJ5KFxuICAgICAgICB0aGlzLmltcGFjdEFzc2Vzc21lbnRzKClcbiAgICAgICAgICAuZmxhdE1hcChpbXBhY3QgPT4gKGltcGFjdFt0aGlzLl9ub2RlS2V5KCldIHx8IFtdKS5tYXAodiA9PiB2Lm1ldGhvZE1vZGVsKSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAnQGlkJ1xuICAgICAgKSBhcyBUZXJtW11cbiAgKTtcblxuICBwcml2YXRlIF9zZWxlY3RlZE1ldGhvZE1vZGVsID0gc2lnbmFsKHVuZGVmaW5lZCBhcyBUZXJtKTtcblxuICBwcm90ZWN0ZWQgaW5kaWNhdG9ycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyBUT0RPOiB3aGVuIHRoZXJlIGFyZSBubyBpbmRpY2F0b3JzIGZvciB0aGUgZGVmYXVsdCBtb2RlbCwgdGhlIHRhYmxlIGFwcGVhcnMgZW1wdHlcbiAgICAvLyBzaG91bGQgZGVmYXVsdCBiYWNrIHRvIHRoZSBmaXJzdCBtb2RlbCBpbiB0aGlzIGNhc2VcbiAgICBjb25zdCBpbmRpY2F0b3JQZXJJbXBhY3RBc3Nlc3NtZW50ID0gZ3JvdXBOb2Rlc0J5VGVybTxJSW1wYWN0QXNzZXNzbWVudEpTT05MRCwgSW5kaWNhdG9yPihcbiAgICAgIHRoaXMuaW1wYWN0QXNzZXNzbWVudHMoKSxcbiAgICAgIHRoaXMuX25vZGVLZXkoKSxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSxcbiAgICAgIGZpbHRlck5vZGUodGhpcy5zaG91bGRGaWx0ZXJCeU1ldGhvZE1vZGVsKCksIHRoaXMuX3NlbGVjdGVkTWV0aG9kTW9kZWwoKSwgdGhpcy5maWx0ZXJUZXJtKCkpXG4gICAgKTtcbiAgICByZXR1cm4gb3JkZXJCeShcbiAgICAgIGdyb3VwcGVkS2V5cyhpbmRpY2F0b3JQZXJJbXBhY3RBc3Nlc3NtZW50KSBhcyBhbnlbXSxcbiAgICAgIFsndmFsdWUubWV0aG9kVGllck9yZGVyJywgJ2tleSddLFxuICAgICAgWydhc2MnLCAnYXNjJ11cbiAgICApLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB0ZXJtQWxsb3dlZCh2YWx1ZT8udGVybSwgdGhpcy5fZmlsdGVyVGVybVR5cGVzKCkpKSBhcyBJR3JvdXBlZEtleXM8SW5kaWNhdG9yPltdO1xuICB9KTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vZGVTdG9yZVNlcnZpY2U6IEhlTm9kZVN0b3JlU2VydmljZSkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBtYWtlIHN1cmUgbG9ncyBkb2VzIG5vdCByZW1haW4gZGlzcGxheWVkIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gb3JpZ2luYWwgdmlld1xuICAgICAgaWYgKHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuc2VsZWN0ZWRWaWV3ID09PSBWaWV3LmxvZ3MpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSBWaWV3LnRhYmxlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUltcGFjdEFzc2Vzc21lbnRKU09OTEQpIHtcbiAgICByZXR1cm4gaXRlbVsnQGlkJ107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0ZWRNZXRob2RNb2RlbCh7IHRhcmdldDogeyB2YWx1ZSB9IH0pIHtcbiAgICB0aGlzLl9zZWxlY3RlZE1ldGhvZE1vZGVsLnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlUG9wb3Zlcihwb3BvdmVyLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHBvcG92ZXIuaXNPcGVuKCkgPyBwb3BvdmVyLmNsb3NlKCkgOiBwb3BvdmVyLm9wZW4oY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW1wYWN0TmFtZShpbXBhY3Q6IElJbXBhY3RBc3Nlc3NtZW50SlNPTkxEKSB7XG4gICAgcmV0dXJuIGltcGFjdC5uYW1lIHx8IChpbXBhY3QuY3ljbGUgPyB0aGlzLmN5Y2xlTGFiZWwoaW1wYWN0LmN5Y2xlKSA6IGltcGFjdFsnQGlkJ10pIHx8IChpbXBhY3QgYXMgYW55KS5pZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjeWNsZUxhYmVsKHsgJ0BpZCc6IGlkLCBuYW1lIH06IGFueSkge1xuICAgIHJldHVybiBuYW1lIHx8IHRoaXMuY3ljbGVzKCkuZmluZCh2ID0+IHZbJ0BpZCddID09PSBpZCk/Lm5hbWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVyQnlUZXJtKHRlcm06IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyVGVybS5zZXQodGVybSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0SW5kZXgoeyB0YXJnZXQ6IHsgdmFsdWUgfSB9KSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4LnNldCgrdmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtMiBpcy1tLTBcIiAqbmdJZj1cImluZGljYXRvcnMoKS5sZW5ndGhcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFZpZXcgPT09IFZpZXcudGFibGVcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtZ2hvc3RcIlxuICAgICAgICAoY2xpY2spPVwic2hvd0Rvd25sb2FkID0gdHJ1ZVwiXG4gICAgICAgIG5nYlRvb2x0aXA9XCJEb3dubG9hZCBhcyBDU1ZcIlxuICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImRvd25sb2FkXCIgc2l6ZT1cImxnXCI+PC9mYS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSBWaWV3LnRhYmxlXCI+XG4gICAgPGhlLXNlYXJjaC1leHRlbmRcbiAgICAgIGNsYXNzPVwiaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGluZGljYXRvcnMgYnkgbmFtZVwiXG4gICAgICAoc2VhcmNoKT1cImZpbHRlckJ5VGVybSgkZXZlbnQpXCI+PC9oZS1zZWFyY2gtZXh0ZW5kPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIiAqbmdJZj1cImltcGFjdEFzc2Vzc21lbnRzKCkubGVuZ3RoID4gMSB8fCBlbmFibGVCcmVha2Rvd24oKSB8fCAhaXNPcmlnaW5hbCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkVmlldyA9PT0gVmlldy50YWJsZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldyA9IFZpZXcudGFibGVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJsaXN0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWhpZGRlbi1tb2JpbGVcIj5UYWJsZSB2aWV3PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImltcGFjdEFzc2Vzc21lbnRzKCkubGVuZ3RoID4gMVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcgPT09IFZpZXcuY2hhcnRcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcgPSBWaWV3LmNoYXJ0XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2hhcnQtYmFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWhpZGRlbi1tb2JpbGVcIj5DaGFydCB2aWV3PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImVuYWJsZUJyZWFrZG93bigpXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkVmlldyA9PT0gVmlldy5icmVha2Rvd25cIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcgPSBWaWV3LmJyZWFrZG93blwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImNoYXJ0LWJhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1oaWRkZW4tbW9iaWxlXCI+QnJlYWtkb3duIHZpZXc8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiIWlzT3JpZ2luYWwoKVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcgPT09IFZpZXcubG9nc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldyA9IFZpZXcubG9nc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaGlkZGVuLW1vYmlsZVwiPlJlY2FsY3VsYXRpb25zIGxvZ3M8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJweC0zIHBiLTNcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInNlbGVjdGVkVmlldyAhPT0gVmlldy50YWJsZVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGF0YSgpOyBlbHNlIGVtcHR5VGFibGVcIj5cbiAgICA8aGUtZGF0YS10YWJsZSBjbGFzcz1cIm1iLTEgaXMtc21hbGxcIiBbc21hbGxdPVwidHJ1ZVwiIG1heEhlaWdodD1cIjMyMFwiPlxuICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gcHktMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNtYWxsXCIgKm5nSWY9XCJlbmFibGVGaWx0ZXJNZXRob2RNb2RlbFwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZE1ldGhvZE1vZGVsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwidW5kZWZpbmVkXCI+RmlsdGVyIE1vZGVsPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB0ZXJtIG9mIG1ldGhvZE1vZGVscygpXCIgW25nVmFsdWVdPVwidGVybVwiPnt7IHRlcm0ubmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCI+PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHRcIj48L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBpbmRpY2F0b3Igb2YgaW5kaWNhdG9ycygpXCIgW2F0dHIudGl0bGVdPVwiaW5kaWNhdG9yLnZhbHVlLnRlcm0ubmFtZVwiPlxuICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cImluZGljYXRvci52YWx1ZS50ZXJtXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJpbmRpY2F0b3IudmFsdWUudGVybS5uYW1lIHwgZWxsaXBzaXM6IDMwIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDx0ciBjbGFzcz1cImlzLWl0YWxpYyBoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS9JbXBhY3RBc3Nlc3NtZW50I2Z1bmN0aW9uYWxVbml0J1wiIHRhcmdldD1cIl9ibGFua1wiPkZ1bmN0aW9uYWwgdW5pdDwvYT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS9JbXBhY3RBc3Nlc3NtZW50I3Byb2R1Y3QnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UHJvZHVjdDwvYT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGluZGljYXRvciBvZiBpbmRpY2F0b3JzKClcIiBbYXR0ci50aXRsZV09XCJpbmRpY2F0b3IudmFsdWUudGVybS51bml0c1wiPlxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cImluZGljYXRvci52YWx1ZS50ZXJtLnVuaXRzIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxoZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLW1sLTJcIlxuICAgICAgICAgICAgICAgIFt0ZXJtXT1cImluZGljYXRvci52YWx1ZS50ZXJtXCI+PC9oZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltcGFjdEFzc2Vzc21lbnQgb2YgaW1wYWN0QXNzZXNzbWVudHMoKTsgdHJhY2tCeTogdHJhY2tCeUlkOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiIFthdHRyLnRpdGxlXT1cImltcGFjdE5hbWUoaW1wYWN0QXNzZXNzbWVudClcIj5cbiAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cImltcGFjdEFzc2Vzc21lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19LiB7eyBpbXBhY3ROYW1lKGltcGFjdEFzc2Vzc21lbnQpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2F0dHIudGl0bGVdPVwiaW1wYWN0QXNzZXNzbWVudC5wcm9kdWN0Py50ZXJtPy51bml0c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuPjEge3sgaW1wYWN0QXNzZXNzbWVudC5wcm9kdWN0Py50ZXJtPy51bml0cyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFthdHRyLnRpdGxlXT1cImltcGFjdEFzc2Vzc21lbnQucHJvZHVjdD8udGVybT8ubmFtZVwiPlxuICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgKm5nSWY9XCJpbXBhY3RBc3Nlc3NtZW50LnByb2R1Y3Q/LnRlcm1cIiBbbm9kZV09XCJpbXBhY3RBc3Nlc3NtZW50LnByb2R1Y3QudGVybVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaW1wYWN0QXNzZXNzbWVudC5wcm9kdWN0LnRlcm0ubmFtZSB8IGVsbGlwc2lzOiAzMCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaXMtbm93cmFwXCIgKm5nRm9yPVwibGV0IGluZGljYXRvciBvZiBpbmRpY2F0b3JzKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbmRpY2F0b3IudmFsdWUudmFsdWVzW2ltcGFjdEFzc2Vzc21lbnRbJ0BpZCddXTsgZWxzZSBlbXB0eVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFtuZ2JQb3BvdmVyXT1cImRldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxuICAgICAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwibWFudWFsXCJcbiAgICAgICAgICAgICAgICAgICNwPVwibmdiUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVQb3BvdmVyKHAsIHtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpbmRpY2F0b3IudmFsdWUudmFsdWVzW2ltcGFjdEFzc2Vzc21lbnRbJ0BpZCddXSxcbiAgICAgICAgICAgICAgICAgICAgICBpbXBhY3RBc3Nlc3NtZW50OiBpbXBhY3RBc3Nlc3NtZW50XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHBvaW50ZXI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZShpbmRpY2F0b3IudmFsdWUudmFsdWVzW2ltcGFjdEFzc2Vzc21lbnRbJ0BpZCddXS52YWx1ZSwgaW5kaWNhdG9yLnZhbHVlLnRlcm1bJ0BpZCddKVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBwcmVjaXNpb246IDNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZGVmYXVsdDogJy0nXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YVN0YXRlXT1cIl9kYXRhU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtub2RlXT1cImluZGljYXRvci52YWx1ZS52YWx1ZXNbaW1wYWN0QXNzZXNzbWVudFsnQGlkJ11dLm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICBrZXk9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdGF0ZV09XCJpbXBhY3RBc3Nlc3NtZW50LmFnZ3JlZ2F0ZWQgPyAnYWdncmVnYXRlZCcgOiB1bmRlZmluZWRcIj48L2hlLWJsYW5rLW5vZGUtc3RhdGU+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9oZS1kYXRhLXRhYmxlPlxuXG4gICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGhlLWltcGFjdC1hc3Nlc3NtZW50cy1pbmRpY2F0b3ItYnJlYWtkb3duLWNoYXJ0XG4gICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSBWaWV3LmJyZWFrZG93blwiXG4gIFtpbXBhY3RBc3Nlc3NtZW50XT1cImltcGFjdEFzc2Vzc21lbnRzKClbMF1cIlxuICBbaW5kaWNhdG9yc109XCJpbXBhY3RBc3Nlc3NtZW50cygpWzBdW19ub2RlS2V5KCldXCI+PC9oZS1pbXBhY3QtYXNzZXNzbWVudHMtaW5kaWNhdG9yLWJyZWFrZG93bi1jaGFydD5cblxuPGhlLWltcGFjdC1hc3Nlc3NtZW50cy1pbmRpY2F0b3JzLWNoYXJ0XG4gICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSBWaWV3LmNoYXJ0ICYmIGltcGFjdEFzc2Vzc21lbnRzKCkubGVuZ3RoID4gMVwiXG4gIFtrZXldPVwiX25vZGVLZXkoKVwiXG4gIFtmaWx0ZXJUZXJtVHlwZXNdPVwiX2ZpbHRlclRlcm1UeXBlcygpXCI+PC9oZS1pbXBhY3QtYXNzZXNzbWVudHMtaW5kaWNhdG9ycy1jaGFydD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVmlldyA9PT0gVmlldy5sb2dzICYmICFpc09yaWdpbmFsKClcIj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgcHQtMiBweC0zXCIgKm5nSWY9XCJpbXBhY3RBc3Nlc3NtZW50cygpLmxlbmd0aCA+IDFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtc3RhdGljIGlzLXNlY29uZGFyeVwiPlNlbGVjdCBhbiBJbXBhY3QgQXNzZXNzbWVudDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbCBpcy1mdWxsd2lkdGggaXMtc2Vjb25kYXJ5XCI+XG4gICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJzZWxlY3RJbmRleCgkZXZlbnQpXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgaW1wYWN0QXNzZXNzbWVudHMoKTsgbGV0IGkgPSBpbmRleFwiIFt2YWx1ZV09XCJpXCI+XG4gICAgICAgICAgICB7eyBpICsgMSB9fS4ge3sgaW1wYWN0TmFtZSh2YWx1ZSkgfX1cbiAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGhlLW5vZGUtbG9ncy1tb2RlbHNcbiAgICAqbmdJZj1cInNlbGVjdGVkTm9kZSgpXCJcbiAgICBbbm9kZV09XCJzZWxlY3RlZE5vZGUoKVwiXG4gICAgW25vZGVLZXldPVwiX25vZGVLZXkoKVwiXG4gICAgW2ZpbHRlclRlcm1UeXBlc109XCJfZmlsdGVyVGVybVR5cGVzKClcIlxuICAgIFtvcmlnaW5hbFZhbHVlc109XCJzZWxlY3RlZE9yaWdpbmFsVmFsdWVzKClcIlxuICAgIFtyZWNhbGN1bGF0ZWRWYWx1ZXNdPVwic2VsZWN0ZWRSZWNhbGN1bGF0ZWRWYWx1ZXMoKVwiXG4gICAgW25vRGF0YU1lc3NhZ2VdPVwibm9EYXRhTWVzc2FnZSgpXCI+PC9oZS1ub2RlLWxvZ3MtbW9kZWxzPlxuPC9uZy1jb250YWluZXI+XG5cbjxoZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybVxuICAqbmdJZj1cInNob3dEb3dubG9hZFwiXG4gIFtub2Rlc109XCJpbXBhY3RBc3Nlc3NtZW50cygpXCJcbiAgW2ZpbGVuYW1lXT1cIidpbXBhY3QtJyArIF9ub2RlS2V5KCkgKyAnLmNzdidcIlxuICBbaXNVcGxvYWRdPVwiZmFsc2VcIlxuICBbaGVhZGVyS2V5c109XCJbJ2ltcGFjdEFzc2Vzc21lbnQuaWQnLCAnaW1wYWN0QXNzZXNzbWVudC5AaWQnLCAnaW1wYWN0QXNzZXNzbWVudC4nICsgX25vZGVLZXkoKSArICcuJ11cIlxuICAoY2xvc2VkKT1cInNob3dEb3dubG9hZCA9IGZhbHNlXCI+PC9oZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlPlxuICA8ZGl2IGNsYXNzPVwiaXMtcHQtMyBoYXMtdGV4dC1jZW50ZXJlZFwiPlxuICAgIDxzcGFuPk5vIGRhdGEgYXZhaWxhYmxlPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWZpbHRlclRlcm0oKVwiPm1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhPC9zcGFuPlxuICAgIDxzcGFuPi48L3NwYW4+XG4gICAgPHNwYW4gW2NsYXNzLmlzLWhpZGRlbl09XCIhaXNPcmlnaW5hbCgpXCI+XG4gICAgICBTd2l0Y2ggdG9cbiAgICAgIDxjb2RlPnJlY2FsY3VsYXRlZDwvY29kZT5cbiAgICAgIHZlcnNpb24uXG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlWYWx1ZT5cbiAgPHNwYW4+LTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGV0YWlscyBsZXQtbm9kZT1cImltcGFjdEFzc2Vzc21lbnRcIiBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPHAgKmJpbmRPbmNlPVwibm9kZVwiPlxuICAgIDxiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJkYXRhLmN5Y2xlXCI+e3sgY3ljbGVMYWJlbChub2RlLmN5Y2xlKSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWRhdGEuY3ljbGVcIj57eyBkYXRhLm5hbWUgfX08L3NwYW4+XG4gICAgPC9iPlxuICA8L3A+XG4gIDxoZS1ub2RlLXZhbHVlLWRldGFpbHNcbiAgICBbZGF0YV09XCJkYXRhXCJcbiAgICBbZGF0YVN0YXRlXT1cIl9kYXRhU3RhdGUoKVwiXG4gICAgW25vZGVUeXBlXT1cIm5vZGVbJ0B0eXBlJ11cIlxuICAgIFtkYXRhS2V5XT1cIl9ub2RlS2V5KClcIj48L2hlLW5vZGUtdmFsdWUtZGV0YWlscz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3VnZ2VzdGlvbiBsZXQtaW1wYWN0PVwicmVzdWx0XCIgbGV0LXQ9XCJ0ZXJtXCI+XG4gIDxkaXYgY2xhc3M9XCJpcy1ibG9ja1wiPlxuICAgIDxuZ2ItaGlnaGxpZ2h0IFtyZXN1bHRdPVwiaW1wYWN0Lm5hbWUgfHwgaW1wYWN0LmN5Y2xlLm5hbWVcIiBbdGVybV09XCJ0XCI+PC9uZ2ItaGlnaGxpZ2h0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiAqbmdJZj1cImltcGFjdC5jb3VudHJ5XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInByLTEgaGFzLXRleHQtdW5kZXJsaW5lXCI+Q291bnRyeTo8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1mbGV4XCI+PG5nYi1oaWdobGlnaHQgW3Jlc3VsdF09XCJpbXBhY3QuY291bnRyeS5uYW1lXCIgW3Rlcm1dPVwidFwiPjwvbmdiLWhpZ2hsaWdodD48L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtblwiICpuZ0lmPVwiaW1wYWN0LnByb2R1Y3RcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicHItMSBoYXMtdGV4dC11bmRlcmxpbmVcIj5Qcm9kdWN0Ojwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWZsZXhcIj5cbiAgICAgICAgPG5nYi1oaWdobGlnaHQgW3Jlc3VsdF09XCJpbXBhY3QucHJvZHVjdC50ZXJtPy5uYW1lIHx8IGltcGFjdC5wcm9kdWN0Lm5hbWVcIiBbdGVybV09XCJ0XCI+PC9uZ2ItaGlnaGxpZ2h0PlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiAqbmdJZj1cImltcGFjdC5lbmREYXRlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInByLTEgaGFzLXRleHQtdW5kZXJsaW5lXCI+RGF0ZTo8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1mbGV4XCI+PG5nYi1oaWdobGlnaHQgW3Jlc3VsdF09XCJpbXBhY3QuZW5kRGF0ZVwiIFt0ZXJtXT1cInRcIj48L25nYi1oaWdobGlnaHQ+PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { NodeType } from '@hestia-earth/schema';
|
|
3
3
|
import { DataState } from '@hestia-earth/api';
|
|
4
|
-
import { map, mergeMap, shareReplay, toArray } from 'rxjs/operators';
|
|
5
|
-
import { ReplaySubject, forkJoin } from 'rxjs';
|
|
4
|
+
import { catchError, map, mergeMap, shareReplay, toArray } from 'rxjs/operators';
|
|
5
|
+
import { ReplaySubject, forkJoin, of } from 'rxjs';
|
|
6
6
|
import orderBy from 'lodash.orderby';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import * as i1 from "./node.service";
|
|
@@ -48,7 +48,9 @@ export class HeNodeStoreService {
|
|
|
48
48
|
const index = this._nodesLoadRequests[node['@type']].length;
|
|
49
49
|
const request = forkJoin(dataStates.reduce((prev, dataState) => ({
|
|
50
50
|
...prev,
|
|
51
|
-
[dataState]: this.nodeService
|
|
51
|
+
[dataState]: this.nodeService
|
|
52
|
+
.get$({ ...node, dataState })
|
|
53
|
+
.pipe(catchError(() => of(undefined)))
|
|
52
54
|
}), {})).pipe(shareReplay({ bufferSize: 1, refCount: true }), map((values) => ({
|
|
53
55
|
index,
|
|
54
56
|
type: node['@type'],
|
|
@@ -111,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImpor
|
|
|
111
113
|
providedIn: 'root'
|
|
112
114
|
}]
|
|
113
115
|
}], ctorParameters: function () { return [{ type: i1.HeNodeService }]; } });
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFjLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7OztBQTZCckMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXZFLE1BQU0saUJBQWlCLEdBS25CO0lBQ0YsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDaEIsT0FBTyxFQUFFLGlCQUFpQjtRQUMxQixVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO0tBQ2pDO0lBQ0QsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtRQUMzQixPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7S0FDckM7SUFDRCxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNmLE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztLQUNqQztDQUNGLENBQUM7QUFFRixNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBa0IsRUFBRSxVQUFVLEdBQUcsS0FBSyxF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O29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEpTT05MRCwgTm9kZVR5cGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQgeyBtYXAsIG1lcmdlTWFwLCBzaGFyZVJlcGxheSwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgb3JkZXJCeSBmcm9tICdsb2Rhc2gub3JkZXJieSc7XG5cbmltcG9ydCB7IEhlTm9kZVNlcnZpY2UgfSBmcm9tICcuL25vZGUuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN0b3JlZE5vZGUge1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBOb2RlVHlwZTtcbiAgaWQ6IHN0cmluZztcbn1cblxudHlwZSBub2RlU3RhdGVzID0ge1xuICBbZGF0YVN0YXRlIGluIERhdGFTdGF0ZV0/OiBKU09OTEQ8Tm9kZVR5cGU+O1xufTtcblxudHlwZSBub2RlcyA9IHtcbiAgW25vZGVUeXBlIGluIE5vZGVUeXBlXT86IChub2RlU3RhdGVzICYgSVN0b3JlZE5vZGUpW107XG59O1xuXG50eXBlIG5vZGVMb2FkUmVxdWVzdCA9IHtcbiAgW2RhdGFTdGF0ZSBpbiBEYXRhU3RhdGVdOiBPYnNlcnZhYmxlPEpTT05MRDxOb2RlVHlwZT4+O1xufTtcblxudHlwZSBub2Rlc0xvYWRSZXF1ZXN0ID0ge1xuICBbbm9kZVR5cGUgaW4gTm9kZVR5cGVdPzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcmVxdWVzdDogT2JzZXJ2YWJsZTxub2RlU3RhdGVzICYgSVN0b3JlZE5vZGU+O1xuICB9W107XG59O1xuXG5jb25zdCBkZWZhdWx0RGF0YVN0YXRlcyA9IFtEYXRhU3RhdGUub3JpZ2luYWwsIERhdGFTdGF0ZS5yZWNhbGN1bGF0ZWRdO1xuXG5jb25zdCBub2RlVHlwZURhdGFTdGF0ZToge1xuICBbdHlwZSBpbiBOb2RlVHlwZV0/OiB7XG4gICAgZGVmYXVsdDogRGF0YVN0YXRlW107XG4gICAgYWdncmVnYXRlZD86IERhdGFTdGF0ZVtdO1xuICB9O1xufSA9IHtcbiAgW05vZGVUeXBlLkN5Y2xlXToge1xuICAgIGRlZmF1bHQ6IGRlZmF1bHREYXRhU3RhdGVzLFxuICAgIGFnZ3JlZ2F0ZWQ6IFtEYXRhU3RhdGUub3JpZ2luYWxdXG4gIH0sXG4gIFtOb2RlVHlwZS5JbXBhY3RBc3Nlc3NtZW50XToge1xuICAgIGRlZmF1bHQ6IGRlZmF1bHREYXRhU3RhdGVzLFxuICAgIGFnZ3JlZ2F0ZWQ6IFtEYXRhU3RhdGUucmVjYWxjdWxhdGVkXVxuICB9LFxuICBbTm9kZVR5cGUuU2l0ZV06IHtcbiAgICBkZWZhdWx0OiBkZWZhdWx0RGF0YVN0YXRlcyxcbiAgICBhZ2dyZWdhdGVkOiBbRGF0YVN0YXRlLm9yaWdpbmFsXVxuICB9XG59O1xuXG5jb25zdCBub2RlVHlwZURhdGFTdGF0ZXMgPSAobm9kZVR5cGU6IE5vZGVUeXBlLCBhZ2dyZWdhdGVkID0gZmFsc2UpID0+IHtcbiAgY29uc3QgZGF0YVN0YXRlc01hcHBpbmcgPSBub2RlVHlwZURhdGFTdGF0ZVtub2RlVHlwZV0gfHwge1xuICAgIGRlZmF1bHQ6IFtEYXRhU3RhdGUub3JpZ2luYWxdLFxuICAgIGFnZ3JlZ2F0ZWQ6IFtEYXRhU3RhdGUub3JpZ2luYWxdXG4gIH07XG4gIHJldHVybiBhZ2dyZWdhdGVkID8gZGF0YVN0YXRlc01hcHBpbmcuYWdncmVnYXRlZCA6IGRhdGFTdGF0ZXNNYXBwaW5nLmRlZmF1bHQ7XG59O1xuXG5jb25zdCBzb3J0Tm9kZXMgPSAodmFsdWVzPzogSVN0b3JlZE5vZGVbXSkgPT5cbiAgdmFsdWVzPy5sZW5ndGhcbiAgICA/IG9yZGVyQnkoXG4gICAgICAgIHZhbHVlcy5maWx0ZXIoQm9vbGVhbiksXG4gICAgICAgIFsnb3JpZ2luYWwuYWdncmVnYXRlZCcsICdvcmlnaW5hbC5zaXRlLkBpZCcsICdvcmlnaW5hbC5jeWNsZS5AaWQnLCAnb3JpZ2luYWwuQGlkJ10sXG4gICAgICAgIFsnYXNjJywgJ2FzYycsICdhc2MnLCAnYXNjJ11cbiAgICAgIClcbiAgICA6IFtdO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBIZU5vZGVTdG9yZVNlcnZpY2Uge1xuICBwcml2YXRlIF9ub2Rlc0xvYWRSZXF1ZXN0czogbm9kZXNMb2FkUmVxdWVzdCA9IHt9O1xuICBwcml2YXRlIF9ub2Rlczogbm9kZXMgPSB7fTtcbiAgcHJpdmF0ZSBfbm9kZXMkID0gbmV3IFJlcGxheVN1YmplY3Q8bm9kZXM+KDEpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbm9kZVNlcnZpY2U6IEhlTm9kZVNlcnZpY2UpIHt9XG5cbiAgcHJpdmF0ZSBmaW5kTm9kZUluZGV4PFQgZXh0ZW5kcyBQaWNrPEpTT05MRDxOb2RlVHlwZT4sICdAdHlwZScgfCAnQGlkJz4+KG5vZGU6IFQpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzPy5bbm9kZVsnQHR5cGUnXV0gfHwgW107XG4gICAgcmV0dXJuIG5vZGVzLmZpbmRJbmRleChuID0+IG4udHlwZSA9PT0gbm9kZVsnQHR5cGUnXSAmJiBuLmlkID09PSBub2RlWydAaWQnXSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWROb2RlPFQgZXh0ZW5kcyBQaWNrPEpTT05MRDxOb2RlVHlwZT4sICdAdHlwZScgfCAnQGlkJz4+KG5vZGU6IFQpIHtcbiAgICBjb25zdCBhZ2dyZWdhdGVkID0gJ2FnZ3JlZ2F0ZWQnIGluIG5vZGUgPyAobm9kZS5hZ2dyZWdhdGVkIGFzIGJvb2xlYW4pIDogZmFsc2U7XG4gICAgY29uc3QgZGF0YVN0YXRlcyA9IG5vZGVUeXBlRGF0YVN0YXRlcyhub2RlWydAdHlwZSddLCBhZ2dyZWdhdGVkKTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX25vZGVzTG9hZFJlcXVlc3RzW25vZGVbJ0B0eXBlJ11dLmxlbmd0aDtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBmb3JrSm9pbihcbiAgICAgIGRhdGFTdGF0ZXMucmVkdWNlKFxuICAgICAgICAocHJldiwgZGF0YVN0YXRlKSA9PiAoe1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgW2RhdGFTdGF0ZV06IHRoaXMubm9kZVNlcnZpY2UuZ2V0JDxKU09OTEQ8Tm9kZVR5cGU+Pih7IC4uLm5vZGUsIGRhdGFTdGF0ZSB9KVxuICAgICAgICB9KSxcbiAgICAgICAge30gYXMgbm9kZUxvYWRSZXF1ZXN0XG4gICAgICApXG4gICAgKS5waXBlKFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgKHZhbHVlczogbm9kZVN0YXRlcykgPT5cbiAgICAgICAgICAoe1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICB0eXBlOiBub2RlWydAdHlwZSddLFxuICAgICAgICAgICAgaWQ6IG5vZGVbJ0BpZCddLFxuICAgICAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZXMgd2hlbiB0aGUgc3RhdGVzIHdlcmUgbm90IGZldGNoZWRcbiAgICAgICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhkZWZhdWx0RGF0YVN0YXRlcy5tYXAoZGF0YVN0YXRlID0+IFtkYXRhU3RhdGUsIHZhbHVlc1tEYXRhU3RhdGUub3JpZ2luYWxdIHx8IG5vZGVdKSksXG4gICAgICAgICAgICAuLi52YWx1ZXNcbiAgICAgICAgICB9KSBhcyBub2RlU3RhdGVzICYgSVN0b3JlZE5vZGVcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5fbm9kZXNMb2FkUmVxdWVzdHNbbm9kZVsnQHR5cGUnXV0ucHVzaCh7XG4gICAgICBpZDogbm9kZVsnQGlkJ10sXG4gICAgICByZXF1ZXN0XG4gICAgfSk7XG5cbiAgICByZXF1ZXN0LnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMuX25vZGVzW25vZGVbJ0B0eXBlJ11dW2luZGV4XSA9IGRhdGE7XG4gICAgICB0aGlzLl9ub2RlcyQubmV4dCh0aGlzLl9ub2Rlcyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVxdWVzdDtcbiAgfVxuXG4gIHB1YmxpYyBhZGROb2RlPFQgZXh0ZW5kcyBQaWNrPEpTT05MRDxOb2RlVHlwZT4sICdAdHlwZScgfCAnQGlkJz4+KG5vZGU6IFQpIHtcbiAgICB0aGlzLl9ub2Rlc0xvYWRSZXF1ZXN0c1tub2RlWydAdHlwZSddXSA9IHRoaXMuX25vZGVzTG9hZFJlcXVlc3RzW25vZGVbJ0B0eXBlJ11dIHx8IFtdO1xuICAgIHRoaXMuX25vZGVzW25vZGVbJ0B0eXBlJ11dID0gdGhpcy5fbm9kZXNbbm9kZVsnQHR5cGUnXV0gfHwgW107XG5cbiAgICBjb25zdCBleGlzdGluZ1JlcXVlc3QgPSB0aGlzLl9ub2Rlc0xvYWRSZXF1ZXN0c1tub2RlWydAdHlwZSddXS5maW5kKCh7IGlkIH0pID0+IGlkID09PSBub2RlWydAaWQnXSk7XG4gICAgcmV0dXJuIGV4aXN0aW5nUmVxdWVzdCA/IGV4aXN0aW5nUmVxdWVzdC5yZXF1ZXN0IDogdGhpcy5sb2FkTm9kZTxUPihub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVOb2RlQnlJbmRleChub2RlVHlwZTogTm9kZVR5cGUsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9ub2Rlc0xvYWRSZXF1ZXN0c1tub2RlVHlwZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9ub2Rlc1tub2RlVHlwZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9ub2RlcyQubmV4dCh0aGlzLl9ub2Rlcyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTm9kZTxUIGV4dGVuZHMgSlNPTkxEPE5vZGVUeXBlPj4obm9kZTogVCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maW5kTm9kZUluZGV4KG5vZGUpO1xuICAgIHJldHVybiBpbmRleCA+PSAwID8gdGhpcy5yZW1vdmVOb2RlQnlJbmRleChub2RlWydAdHlwZSddLCBpbmRleCkgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTm9kZXMoKSB7XG4gICAgdGhpcy5fbm9kZXNMb2FkUmVxdWVzdHMgPSB7fTtcbiAgICB0aGlzLl9ub2RlcyA9IHt9O1xuICAgIHRoaXMuX25vZGVzJC5uZXh0KHRoaXMuX25vZGVzKTtcbiAgfVxuXG4gIHB1YmxpYyBub2RlcyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzb3J0ZWROb2RlcyQoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMkKCkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgbm9kZXMgPT5cbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobm9kZXMpLm1hcCgoW25vZGVLZXksIHZhbHVlc10pID0+IFtub2RlS2V5LCBzb3J0Tm9kZXModmFsdWVzKV0pKSBhcyBub2Rlc1xuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaWRzJChub2RlVHlwZTogTm9kZVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcyQoKS5waXBlKFxuICAgICAgbWVyZ2VNYXAodmFsdWVzID0+IHZhbHVlc1tub2RlVHlwZV0pLFxuICAgICAgbWFwKCh7IGlkIH0pID0+IGlkKSxcbiAgICAgIHRvQXJyYXkoKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZmluZCQ8VCBleHRlbmRzIEpTT05MRDxOb2RlVHlwZT4+KFxuICAgIG5vZGVUeXBlOiBOb2RlVHlwZSxcbiAgICBpZD86IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPHsgW2RhdGFTdGF0ZSBpbiBEYXRhU3RhdGVdPzogVCB9W10+IHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcyQoKS5waXBlKG1hcCh2YWx1ZXMgPT4gKCh2YWx1ZXNbbm9kZVR5cGVdIGFzIGFueVtdKSB8fCBbXSkuZmlsdGVyKG5vZGUgPT4gIWlkIHx8IG5vZGUuaWQgPT09IGlkKSkpO1xuICB9XG5cbiAgcHVibGljIGZpbmRCeVN0YXRlJDxUIGV4dGVuZHMgSlNPTkxEPE5vZGVUeXBlPj4obm9kZVR5cGU6IE5vZGVUeXBlLCBkYXRhU3RhdGU6IERhdGFTdGF0ZSwgaWQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kJDxUPihub2RlVHlwZSwgaWQpLnBpcGUobWFwKHZhbHVlcyA9PiB2YWx1ZXMubWFwKHYgPT4gdltkYXRhU3RhdGVdKS5maWx0ZXIoQm9vbGVhbikpKTtcbiAgfVxufVxuIl19
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBYyxhQUFhLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBNkJyQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFdkUsTUFBTSxpQkFBaUIsR0FLbkI7SUFDRixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7S0FDakM7SUFDRCxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1FBQzNCLE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztLQUNyQztJQUNELENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2YsT0FBTyxFQUFFLGlCQUFpQjtRQUMxQixVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO0tBQ2pDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxRQUFrQixF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QUMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7OEdBOUdVLGtCQUFrQjtrSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKU09OTEQsIE5vZGVUeXBlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgRGF0YVN0YXRlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBtZXJnZU1hcCwgc2hhcmVSZXBsYXksIHRvQXJyYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBmb3JrSm9pbiwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCBvcmRlckJ5IGZyb20gJ2xvZGFzaC5vcmRlcmJ5JztcblxuaW1wb3J0IHsgSGVOb2RlU2VydmljZSB9IGZyb20gJy4vbm9kZS5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJU3RvcmVkTm9kZSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIHR5cGU6IE5vZGVUeXBlO1xuICBpZDogc3RyaW5nO1xufVxuXG50eXBlIG5vZGVTdGF0ZXMgPSB7XG4gIFtkYXRhU3RhdGUgaW4gRGF0YVN0YXRlXT86IEpTT05MRDxOb2RlVHlwZT47XG59O1xuXG50eXBlIG5vZGVzID0ge1xuICBbbm9kZVR5cGUgaW4gTm9kZVR5cGVdPzogKG5vZGVTdGF0ZXMgJiBJU3RvcmVkTm9kZSlbXTtcbn07XG5cbnR5cGUgbm9kZUxvYWRSZXF1ZXN0ID0ge1xuICBbZGF0YVN0YXRlIGluIERhdGFTdGF0ZV06IE9ic2VydmFibGU8SlNPTkxEPE5vZGVUeXBlPj47XG59O1xuXG50eXBlIG5vZGVzTG9hZFJlcXVlc3QgPSB7XG4gIFtub2RlVHlwZSBpbiBOb2RlVHlwZV0/OiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICByZXF1ZXN0OiBPYnNlcnZhYmxlPG5vZGVTdGF0ZXMgJiBJU3RvcmVkTm9kZT47XG4gIH1bXTtcbn07XG5cbmNvbnN0IGRlZmF1bHREYXRhU3RhdGVzID0gW0RhdGFTdGF0ZS5vcmlnaW5hbCwgRGF0YVN0YXRlLnJlY2FsY3VsYXRlZF07XG5cbmNvbnN0IG5vZGVUeXBlRGF0YVN0YXRlOiB7XG4gIFt0eXBlIGluIE5vZGVUeXBlXT86IHtcbiAgICBkZWZhdWx0OiBEYXRhU3RhdGVbXTtcbiAgICBhZ2dyZWdhdGVkPzogRGF0YVN0YXRlW107XG4gIH07XG59ID0ge1xuICBbTm9kZVR5cGUuQ3ljbGVdOiB7XG4gICAgZGVmYXVsdDogZGVmYXVsdERhdGFTdGF0ZXMsXG4gICAgYWdncmVnYXRlZDogW0RhdGFTdGF0ZS5vcmlnaW5hbF1cbiAgfSxcbiAgW05vZGVUeXBlLkltcGFjdEFzc2Vzc21lbnRdOiB7XG4gICAgZGVmYXVsdDogZGVmYXVsdERhdGFTdGF0ZXMsXG4gICAgYWdncmVnYXRlZDogW0RhdGFTdGF0ZS5yZWNhbGN1bGF0ZWRdXG4gIH0sXG4gIFtOb2RlVHlwZS5TaXRlXToge1xuICAgIGRlZmF1bHQ6IGRlZmF1bHREYXRhU3RhdGVzLFxuICAgIGFnZ3JlZ2F0ZWQ6IFtEYXRhU3RhdGUub3JpZ2luYWxdXG4gIH1cbn07XG5cbmNvbnN0IG5vZGVUeXBlRGF0YVN0YXRlcyA9IChub2RlVHlwZTogTm9kZVR5cGUsIGFnZ3JlZ2F0ZWQgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBkYXRhU3RhdGVzTWFwcGluZyA9IG5vZGVUeXBlRGF0YVN0YXRlW25vZGVUeXBlXSB8fCB7XG4gICAgZGVmYXVsdDogW0RhdGFTdGF0ZS5vcmlnaW5hbF0sXG4gICAgYWdncmVnYXRlZDogW0RhdGFTdGF0ZS5vcmlnaW5hbF1cbiAgfTtcbiAgcmV0dXJuIGFnZ3JlZ2F0ZWQgPyBkYXRhU3RhdGVzTWFwcGluZy5hZ2dyZWdhdGVkIDogZGF0YVN0YXRlc01hcHBpbmcuZGVmYXVsdDtcbn07XG5cbmNvbnN0IHNvcnROb2RlcyA9ICh2YWx1ZXM/OiBJU3RvcmVkTm9kZVtdKSA9PlxuICB2YWx1ZXM/Lmxlbmd0aFxuICAgID8gb3JkZXJCeShcbiAgICAgICAgdmFsdWVzLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgWydvcmlnaW5hbC5hZ2dyZWdhdGVkJywgJ29yaWdpbmFsLnNpdGUuQGlkJywgJ29yaWdpbmFsLmN5Y2xlLkBpZCcsICdvcmlnaW5hbC5AaWQnXSxcbiAgICAgICAgWydhc2MnLCAnYXNjJywgJ2FzYycsICdhc2MnXVxuICAgICAgKVxuICAgIDogW107XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEhlTm9kZVN0b3JlU2VydmljZSB7XG4gIHByaXZhdGUgX25vZGVzTG9hZFJlcXVlc3RzOiBub2Rlc0xvYWRSZXF1ZXN0ID0ge307XG4gIHByaXZhdGUgX25vZGVzOiBub2RlcyA9IHt9O1xuICBwcml2YXRlIF9ub2RlcyQgPSBuZXcgUmVwbGF5U3ViamVjdDxub2Rlcz4oMSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBub2RlU2VydmljZTogSGVOb2RlU2VydmljZSkge31cblxuICBwcml2YXRlIGZpbmROb2RlSW5kZXg8VCBleHRlbmRzIFBpY2s8SlNPTkxEPE5vZGVUeXBlPiwgJ0B0eXBlJyB8ICdAaWQnPj4obm9kZTogVCkge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXM/Lltub2RlWydAdHlwZSddXSB8fCBbXTtcbiAgICByZXR1cm4gbm9kZXMuZmluZEluZGV4KG4gPT4gbi50eXBlID09PSBub2RlWydAdHlwZSddICYmIG4uaWQgPT09IG5vZGVbJ0BpZCddKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE5vZGU8VCBleHRlbmRzIFBpY2s8SlNPTkxEPE5vZGVUeXBlPiwgJ0B0eXBlJyB8ICdAaWQnPj4obm9kZTogVCkge1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZWQgPSAnYWdncmVnYXRlZCcgaW4gbm9kZSA/IChub2RlLmFnZ3JlZ2F0ZWQgYXMgYm9vbGVhbikgOiBmYWxzZTtcbiAgICBjb25zdCBkYXRhU3RhdGVzID0gbm9kZVR5cGVEYXRhU3RhdGVzKG5vZGVbJ0B0eXBlJ10sIGFnZ3JlZ2F0ZWQpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbm9kZXNMb2FkUmVxdWVzdHNbbm9kZVsnQHR5cGUnXV0ubGVuZ3RoO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IGZvcmtKb2luKFxuICAgICAgZGF0YVN0YXRlcy5yZWR1Y2UoXG4gICAgICAgIChwcmV2LCBkYXRhU3RhdGUpID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBbZGF0YVN0YXRlXTogdGhpcy5ub2RlU2VydmljZVxuICAgICAgICAgICAgLmdldCQ8SlNPTkxEPE5vZGVUeXBlPj4oeyAuLi5ub2RlLCBkYXRhU3RhdGUgfSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YodW5kZWZpbmVkKSkpXG4gICAgICAgIH0pLFxuICAgICAgICB7fSBhcyBub2RlTG9hZFJlcXVlc3RcbiAgICAgIClcbiAgICApLnBpcGUoXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICAgICAgbWFwKFxuICAgICAgICAodmFsdWVzOiBub2RlU3RhdGVzKSA9PlxuICAgICAgICAgICh7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIHR5cGU6IG5vZGVbJ0B0eXBlJ10sXG4gICAgICAgICAgICBpZDogbm9kZVsnQGlkJ10sXG4gICAgICAgICAgICAvLyBkZWZhdWx0IHZhbHVlcyB3aGVuIHRoZSBzdGF0ZXMgd2VyZSBub3QgZmV0Y2hlZFxuICAgICAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKGRlZmF1bHREYXRhU3RhdGVzLm1hcChkYXRhU3RhdGUgPT4gW2RhdGFTdGF0ZSwgdmFsdWVzW0RhdGFTdGF0ZS5vcmlnaW5hbF0gfHwgbm9kZV0pKSxcbiAgICAgICAgICAgIC4uLnZhbHVlc1xuICAgICAgICAgIH0pIGFzIG5vZGVTdGF0ZXMgJiBJU3RvcmVkTm9kZVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLl9ub2Rlc0xvYWRSZXF1ZXN0c1tub2RlWydAdHlwZSddXS5wdXNoKHtcbiAgICAgIGlkOiBub2RlWydAaWQnXSxcbiAgICAgIHJlcXVlc3RcbiAgICB9KTtcblxuICAgIHJlcXVlc3Quc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5fbm9kZXNbbm9kZVsnQHR5cGUnXV1baW5kZXhdID0gZGF0YTtcbiAgICAgIHRoaXMuX25vZGVzJC5uZXh0KHRoaXMuX25vZGVzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXF1ZXN0O1xuICB9XG5cbiAgcHVibGljIGFkZE5vZGU8VCBleHRlbmRzIFBpY2s8SlNPTkxEPE5vZGVUeXBlPiwgJ0B0eXBlJyB8ICdAaWQnPj4obm9kZTogVCkge1xuICAgIHRoaXMuX25vZGVzTG9hZFJlcXVlc3RzW25vZGVbJ0B0eXBlJ11dID0gdGhpcy5fbm9kZXNMb2FkUmVxdWVzdHNbbm9kZVsnQHR5cGUnXV0gfHwgW107XG4gICAgdGhpcy5fbm9kZXNbbm9kZVsnQHR5cGUnXV0gPSB0aGlzLl9ub2Rlc1tub2RlWydAdHlwZSddXSB8fCBbXTtcblxuICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IHRoaXMuX25vZGVzTG9hZFJlcXVlc3RzW25vZGVbJ0B0eXBlJ11dLmZpbmQoKHsgaWQgfSkgPT4gaWQgPT09IG5vZGVbJ0BpZCddKTtcbiAgICByZXR1cm4gZXhpc3RpbmdSZXF1ZXN0ID8gZXhpc3RpbmdSZXF1ZXN0LnJlcXVlc3QgOiB0aGlzLmxvYWROb2RlPFQ+KG5vZGUpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZU5vZGVCeUluZGV4KG5vZGVUeXBlOiBOb2RlVHlwZSwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX25vZGVzTG9hZFJlcXVlc3RzW25vZGVUeXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX25vZGVzW25vZGVUeXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX25vZGVzJC5uZXh0KHRoaXMuX25vZGVzKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVOb2RlPFQgZXh0ZW5kcyBKU09OTEQ8Tm9kZVR5cGU+Pihub2RlOiBUKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmROb2RlSW5kZXgobm9kZSk7XG4gICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLnJlbW92ZU5vZGVCeUluZGV4KG5vZGVbJ0B0eXBlJ10sIGluZGV4KSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJOb2RlcygpIHtcbiAgICB0aGlzLl9ub2Rlc0xvYWRSZXF1ZXN0cyA9IHt9O1xuICAgIHRoaXMuX25vZGVzID0ge307XG4gICAgdGhpcy5fbm9kZXMkLm5leHQodGhpcy5fbm9kZXMpO1xuICB9XG5cbiAgcHVibGljIG5vZGVzJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIHNvcnRlZE5vZGVzJCgpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcyQoKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICBub2RlcyA9PlxuICAgICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhub2RlcykubWFwKChbbm9kZUtleSwgdmFsdWVzXSkgPT4gW25vZGVLZXksIHNvcnROb2Rlcyh2YWx1ZXMpXSkpIGFzIG5vZGVzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpZHMkKG5vZGVUeXBlOiBOb2RlVHlwZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzJCgpLnBpcGUoXG4gICAgICBtZXJnZU1hcCh2YWx1ZXMgPT4gdmFsdWVzW25vZGVUeXBlXSksXG4gICAgICBtYXAoKHsgaWQgfSkgPT4gaWQpLFxuICAgICAgdG9BcnJheSgpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kJDxUIGV4dGVuZHMgSlNPTkxEPE5vZGVUeXBlPj4oXG4gICAgbm9kZVR5cGU6IE5vZGVUeXBlLFxuICAgIGlkPzogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8eyBbZGF0YVN0YXRlIGluIERhdGFTdGF0ZV0/OiBUIH1bXT4ge1xuICAgIHJldHVybiB0aGlzLm5vZGVzJCgpLnBpcGUobWFwKHZhbHVlcyA9PiAoKHZhbHVlc1tub2RlVHlwZV0gYXMgYW55W10pIHx8IFtdKS5maWx0ZXIobm9kZSA9PiAhaWQgfHwgbm9kZS5pZCA9PT0gaWQpKSk7XG4gIH1cblxuICBwdWJsaWMgZmluZEJ5U3RhdGUkPFQgZXh0ZW5kcyBKU09OTEQ8Tm9kZVR5cGU+Pihub2RlVHlwZTogTm9kZVR5cGUsIGRhdGFTdGF0ZTogRGF0YVN0YXRlLCBpZD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmQkPFQ+KG5vZGVUeXBlLCBpZCkucGlwZShtYXAodmFsdWVzID0+IHZhbHVlcy5tYXAodiA9PiB2W2RhdGFTdGF0ZV0pLmZpbHRlcihCb29sZWFuKSkpO1xuICB9XG59XG4iXX0=
|