@hestia-earth/ui-components 0.20.2 → 0.20.3
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/esm2020/files/files-error.model.mjs +12 -8
- package/esm2020/node/node-logs-models/node-logs-models.component.mjs +3 -3
- package/fesm2015/hestia-earth-ui-components.mjs +16 -9
- package/fesm2015/hestia-earth-ui-components.mjs.map +1 -1
- package/fesm2020/hestia-earth-ui-components.mjs +13 -9
- package/fesm2020/hestia-earth-ui-components.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -230,10 +230,10 @@ export class NodeLogsModelsComponent {
|
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
NodeLogsModelsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NodeLogsModelsComponent, deps: [{ token: i1.HeNodeService }, { token: i2.HeSearchService }, { token: i3.HeEngineService }], target: i0.ɵɵFactoryTarget.Component });
|
|
233
|
-
NodeLogsModelsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { node: "node", nodeKey: "nodeKey", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", filterTermTypes: "filterTermTypes", filterTermTypesLabel: "filterTermTypesLabel", logsKey: "logsKey" }, ngImport: i0, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\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>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"allTerms?.length\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"false\"\n (selectItem)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per </span>\n <span [ngSwitch]=\"functionalUnit\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes\">Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!loading && blankNodes.length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>No data</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <span *ngIf=\"blankNode.key\">{{blankNode.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{blankNode.originalValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.originalValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{blankNode.recalculatedValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.recalculatedValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"\n ></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta *ngIf=\"blankNode.originalValueByMethodId[model.methodId] !== null && blankNode.recalculatedValueByMethodId[model.methodId] !== null; else noValue\"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"\n ></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: blankNode}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\" target=\"_blank\" [title]=\"subValue.key\"\n >\n <span>{{subValue.key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{subValue.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{subValue.key | keyToLabel}}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{subValue.id | keyToLabel}}</span>\n <he-node-link *ngSwitchDefault class=\"is-block pl-4\" [node]=\"termById(subValue.id)\" [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\"\n (click)=\"showLegend = !showLegend\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{logColor[status.value]}}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{status.value}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyRequired\"\n (change)=\"filterResults()\"\n [disabled]=\"!!term\"\n >\n <span class=\"ml-2\">Show only {{filteredType | pluralize}} included in the default Hestia system boundary</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model:models, data}\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model, data}\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"p.isOpen() ? p.close() : (model.showLogs ? p.open({ logs: model.logs }) : null)\"\n >\n <span class=\"is-capitalized\">{{methodName(model)}}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">[{{model.logs?.methodTier || model.model?.methodTier}}]</span>\n\n <span class=\"pl-1 has-text-{{logColor[model.status]}} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p1=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\"\n >\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (<ng-container *ngTemplateOutlet=\"docsLink; context: {$implicit: model.model}\"></ng-container>)\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context:{key, value:logs.requirements[key]}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context:key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-dark is-fullwidth is-striped\">\n <thead>\n <tr>\n <th class=\"has-text-white\">\n <span>Filename</span>\n </th>\n <th class=\"has-text-white\">\n <span>Column Title</span>\n </th>\n <th class=\"has-text-white\">\n <span>Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-text-white\">\n <tr *ngFor=\"let data of logs.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{value}}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else defaultValue\">\n <he-node-link class=\"is-inline-block is-align-middle\" linkClass=\"is-dark\" [node]=\"linkedNode\" [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\n</ng-template>\n\n<ng-template #logLine let-key=\"key\" let-value=\"value\">\n <tr>\n <td class=\"has-border-right copy-log\">\n <span class=\"is-inline-block is-align-middle\" [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{key | keyToLabel}}</ng-container>\n\n <ng-container *ngSwitchCase=\"'node_type_allowed'\">Is the current <code>Node</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'siteType_allowed'\">Is the current <code>siteType</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">Is the current primary product <code>@id</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_termType_allowed'\">Is the current primary product <code>termType</code> allowed to run this model</ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'pesticides_complete'\">Pesticide data are <code>complete</code></ng-container>\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">Cycle contains <code>pesticideAI</code> Inputs</ng-container>\n <ng-container *ngSwitchCase=\"'all_pesticideAI_have_lookup_value'\">All <code>pesticideAI</code> Inputs have a lookup value</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\"><code>aboveGroundCropResidueBurnt</code> is present as Product</ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n </span>\n <he-clipboard class=\"is-inline-block is-align-middle\" clipboardClass=\"is-size-7 is-p-1\" [icon]=\"['far', 'clone']\" [value]=\"key\" [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context:{key,value}\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{v.key}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{v}}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{vv.value}}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{model.status}}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">The <code>siteType</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">The primary product <code>@id</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">The primary product <code>termType</code> is not relevant.</li>\n </ul>\n </ng-container>\n\n <ng-container *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!model.logs?.shouldRun\">\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on the model name on the left to view the debugging logs.</p>\n </ng-container>\n <ng-container *ngIf=\"model.logs?.logs?.error\">\n <p>The model failed to run for the following reason:</p>\n <p><code>{{model.logs.logs.error}}</code></p>\n </ng-container>\n </li>\n </ng-template>\n\n <li class=\"is-no-run-orchestrator\" *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{nodeType | pluralize:0}}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\n The {{data.type || 'blank node'}} with Term <code>{{data.termId}}</code> is already present or already added by another model.\n </span>\n </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{model.config.runStrategy}}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">\n We only gap-fill this key if not present\n </span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">\n We only gap-fill this Blank Node if not present.\n </span>\n </p>\n\n <p class=\"is-mt-1\">\n <span class=\"is-run-with-measured\" *ngIf=\"model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\">\n The <code>{{model.config.value}}</code> was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>The recalculated <b>methodTier</b> was</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">the original <b>methodTier</b>.</span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n <ng-container *ngIf=\"model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{model.config.mergeArgs.replaceThreshold[1] * 100}}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}.</b>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\"\n (click)=\"$event.stopPropagation()\"\n >\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: i6.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i7.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: i8.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i9.BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }, { kind: "component", type: i10.ClipboardComponent, selector: "he-clipboard", inputs: ["value", "disabled", "hideText", "icon", "size", "rotate", "clipboardClass"] }, { kind: "component", type: i11.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i12.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "pipe", type: i13.CompoundPipe, name: "compound" }, { kind: "pipe", type: i14.DefaultPipe, name: "default" }, { kind: "pipe", type: i15.KeysPipe, name: "keys" }, { kind: "pipe", type: i16.PluralizePipe, name: "pluralize" }, { kind: "pipe", type: i17.KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: i18.PrecisionPipe, name: "precision" }, { kind: "pipe", type: i19.TimesPipe, name: "times" }, { kind: "pipe", type: i20.IsArrayPipe, name: "isArray" }, { kind: "pipe", type: i21.IsObjectPipe, name: "isObject" }] });
|
|
233
|
+
NodeLogsModelsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { node: "node", nodeKey: "nodeKey", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", filterTermTypes: "filterTermTypes", filterTermTypesLabel: "filterTermTypesLabel", logsKey: "logsKey" }, ngImport: i0, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\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>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"allTerms?.length\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"false\"\n (selectItem)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per </span>\n <span [ngSwitch]=\"functionalUnit\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes\">Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!loading && blankNodes.length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>No data</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <span *ngIf=\"blankNode.key\">{{blankNode.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{blankNode.originalValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.originalValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{blankNode.recalculatedValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.recalculatedValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"\n ></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta *ngIf=\"blankNode.originalValueByMethodId[model.methodId] !== null && blankNode.recalculatedValueByMethodId[model.methodId] !== null; else noValue\"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"\n ></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: blankNode}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\" target=\"_blank\" [title]=\"subValue.key\"\n >\n <span>{{subValue.key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{subValue.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{subValue.key | keyToLabel}}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{subValue.id | keyToLabel}}</span>\n <he-node-link *ngSwitchDefault class=\"is-block pl-4\" [node]=\"termById(subValue.id)\" [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\"\n (click)=\"showLegend = !showLegend\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{logColor[status.value]}}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{status.value}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyRequired\"\n (change)=\"filterResults()\"\n [disabled]=\"!!term\"\n >\n <span class=\"ml-2\">Show only {{filteredType | pluralize}} included in the default Hestia system boundary</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model:models, data}\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model, data}\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"p.isOpen() ? p.close() : (model.showLogs ? p.open({ logs: model.logs }) : null)\"\n >\n <span class=\"is-capitalized\">{{methodName(model)}}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">[{{model.logs?.methodTier || model.model?.methodTier}}]</span>\n\n <span class=\"pl-1 has-text-{{logColor[model.status]}} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p1=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\"\n >\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (<ng-container *ngTemplateOutlet=\"docsLink; context: {$implicit: model.model}\"></ng-container>)\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context:{key, value:logs.requirements[key]}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context:key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-dark is-fullwidth is-striped\">\n <thead>\n <tr>\n <th class=\"has-text-white\">\n <span>Filename</span>\n </th>\n <th class=\"has-text-white\">\n <span>Column Title</span>\n </th>\n <th class=\"has-text-white\">\n <span>Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-text-white\">\n <tr *ngFor=\"let data of logs.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{value}}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else defaultValue\">\n <he-node-link class=\"is-inline-block is-align-middle\" linkClass=\"is-dark\" [node]=\"linkedNode\" [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\n</ng-template>\n\n<ng-template #logLine let-key=\"key\" let-value=\"value\">\n <tr>\n <td class=\"has-border-right copy-log\">\n <span class=\"is-inline-block is-align-middle\" [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{key | keyToLabel}}</ng-container>\n\n <ng-container *ngSwitchCase=\"'node_type_allowed'\">Is the current <code>Node</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'siteType_allowed'\">Is the current <code>siteType</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">Is the current primary product <code>@id</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_termType_allowed'\">Is the current primary product <code>termType</code> allowed to run this model</ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'pesticides_complete'\">Pesticide data are <code>complete</code></ng-container>\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">Cycle contains <code>pesticideAI</code> Inputs</ng-container>\n <ng-container *ngSwitchCase=\"'all_pesticideAI_have_lookup_value'\">All <code>pesticideAI</code> Inputs have a lookup value</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\"><code>aboveGroundCropResidueBurnt</code> is present as Product</ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n\n <ng-container *ngSwitchCase=\"'term_type_cropResidue_complete'\">Data completeness for \"cropResidue\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_excreta_complete'\">Data completeness for \"excreta\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_fertiliser_complete'\">Data completeness for \"fertiliser\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_material_complete'\">Data completeness for \"material\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_other_complete'\">Data completeness for \"other\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_pesticidesAntibiotics_complete'\">Data completeness for \"pesticidesAntibiotics\" must be <code>true</code></ng-container>\n\n <ng-container *ngSwitchCase=\"'term_type_cropResidue_incomplete'\">Data completeness for \"cropResidue\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_excreta_incomplete'\">Data completeness for \"excreta\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_fertiliser_incomplete'\">Data completeness for \"fertiliser\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_material_incomplete'\">Data completeness for \"material\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_other_incomplete'\">Data completeness for \"other\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_pesticidesAntibiotics_incomplete'\">Data completeness for \"pesticidesAntibiotics\" must be <code>false</code></ng-container>\n </span>\n <he-clipboard class=\"is-inline-block is-align-middle\" clipboardClass=\"is-size-7 is-p-1\" [icon]=\"['far', 'clone']\" [value]=\"key\" [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context:{key,value}\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{v.key}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{v}}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{vv.value}}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{model.status}}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">The <code>siteType</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">The primary product <code>@id</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">The primary product <code>termType</code> is not relevant.</li>\n </ul>\n </ng-container>\n\n <ng-container *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!model.logs?.shouldRun\">\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on the model name on the left to view the debugging logs.</p>\n </ng-container>\n <ng-container *ngIf=\"model.logs?.logs?.error\">\n <p>The model failed to run for the following reason:</p>\n <p><code>{{model.logs.logs.error}}</code></p>\n </ng-container>\n </li>\n </ng-template>\n\n <li class=\"is-no-run-orchestrator\" *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{nodeType | pluralize:0}}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\n The {{data.type || 'blank node'}} with Term <code>{{data.termId}}</code> is already present or already added by another model.\n </span>\n </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{model.config.runStrategy}}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">\n We only gap-fill this key if not present\n </span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">\n We only gap-fill this Blank Node if not present.\n </span>\n </p>\n\n <p class=\"is-mt-1\">\n <span class=\"is-run-with-measured\" *ngIf=\"model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\">\n The <code>{{model.config.value}}</code> was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>The recalculated <b>methodTier</b> was</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">the original <b>methodTier</b>.</span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n <ng-container *ngIf=\"model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{model.config.mergeArgs.replaceThreshold[1] * 100}}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}.</b>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\"\n (click)=\"$event.stopPropagation()\"\n >\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: i6.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i7.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: i8.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i9.BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }, { kind: "component", type: i10.ClipboardComponent, selector: "he-clipboard", inputs: ["value", "disabled", "hideText", "icon", "size", "rotate", "clipboardClass"] }, { kind: "component", type: i11.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i12.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "pipe", type: i13.CompoundPipe, name: "compound" }, { kind: "pipe", type: i14.DefaultPipe, name: "default" }, { kind: "pipe", type: i15.KeysPipe, name: "keys" }, { kind: "pipe", type: i16.PluralizePipe, name: "pluralize" }, { kind: "pipe", type: i17.KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: i18.PrecisionPipe, name: "precision" }, { kind: "pipe", type: i19.TimesPipe, name: "times" }, { kind: "pipe", type: i20.IsArrayPipe, name: "isArray" }, { kind: "pipe", type: i21.IsObjectPipe, name: "isObject" }] });
|
|
234
234
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NodeLogsModelsComponent, decorators: [{
|
|
235
235
|
type: Component,
|
|
236
|
-
args: [{ selector: 'he-node-logs-models', template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\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>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"allTerms?.length\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"false\"\n (selectItem)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per </span>\n <span [ngSwitch]=\"functionalUnit\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes\">Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!loading && blankNodes.length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>No data</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <span *ngIf=\"blankNode.key\">{{blankNode.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{blankNode.originalValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.originalValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{blankNode.recalculatedValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.recalculatedValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"\n ></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta *ngIf=\"blankNode.originalValueByMethodId[model.methodId] !== null && blankNode.recalculatedValueByMethodId[model.methodId] !== null; else noValue\"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"\n ></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: blankNode}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\" target=\"_blank\" [title]=\"subValue.key\"\n >\n <span>{{subValue.key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{subValue.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{subValue.key | keyToLabel}}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{subValue.id | keyToLabel}}</span>\n <he-node-link *ngSwitchDefault class=\"is-block pl-4\" [node]=\"termById(subValue.id)\" [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\"\n (click)=\"showLegend = !showLegend\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{logColor[status.value]}}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{status.value}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyRequired\"\n (change)=\"filterResults()\"\n [disabled]=\"!!term\"\n >\n <span class=\"ml-2\">Show only {{filteredType | pluralize}} included in the default Hestia system boundary</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model:models, data}\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model, data}\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"p.isOpen() ? p.close() : (model.showLogs ? p.open({ logs: model.logs }) : null)\"\n >\n <span class=\"is-capitalized\">{{methodName(model)}}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">[{{model.logs?.methodTier || model.model?.methodTier}}]</span>\n\n <span class=\"pl-1 has-text-{{logColor[model.status]}} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p1=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\"\n >\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (<ng-container *ngTemplateOutlet=\"docsLink; context: {$implicit: model.model}\"></ng-container>)\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context:{key, value:logs.requirements[key]}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context:key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-dark is-fullwidth is-striped\">\n <thead>\n <tr>\n <th class=\"has-text-white\">\n <span>Filename</span>\n </th>\n <th class=\"has-text-white\">\n <span>Column Title</span>\n </th>\n <th class=\"has-text-white\">\n <span>Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-text-white\">\n <tr *ngFor=\"let data of logs.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{value}}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else defaultValue\">\n <he-node-link class=\"is-inline-block is-align-middle\" linkClass=\"is-dark\" [node]=\"linkedNode\" [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\n</ng-template>\n\n<ng-template #logLine let-key=\"key\" let-value=\"value\">\n <tr>\n <td class=\"has-border-right copy-log\">\n <span class=\"is-inline-block is-align-middle\" [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{key | keyToLabel}}</ng-container>\n\n <ng-container *ngSwitchCase=\"'node_type_allowed'\">Is the current <code>Node</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'siteType_allowed'\">Is the current <code>siteType</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">Is the current primary product <code>@id</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_termType_allowed'\">Is the current primary product <code>termType</code> allowed to run this model</ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'pesticides_complete'\">Pesticide data are <code>complete</code></ng-container>\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">Cycle contains <code>pesticideAI</code> Inputs</ng-container>\n <ng-container *ngSwitchCase=\"'all_pesticideAI_have_lookup_value'\">All <code>pesticideAI</code> Inputs have a lookup value</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\"><code>aboveGroundCropResidueBurnt</code> is present as Product</ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n </span>\n <he-clipboard class=\"is-inline-block is-align-middle\" clipboardClass=\"is-size-7 is-p-1\" [icon]=\"['far', 'clone']\" [value]=\"key\" [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context:{key,value}\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{v.key}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{v}}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{vv.value}}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{model.status}}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">The <code>siteType</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">The primary product <code>@id</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">The primary product <code>termType</code> is not relevant.</li>\n </ul>\n </ng-container>\n\n <ng-container *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!model.logs?.shouldRun\">\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on the model name on the left to view the debugging logs.</p>\n </ng-container>\n <ng-container *ngIf=\"model.logs?.logs?.error\">\n <p>The model failed to run for the following reason:</p>\n <p><code>{{model.logs.logs.error}}</code></p>\n </ng-container>\n </li>\n </ng-template>\n\n <li class=\"is-no-run-orchestrator\" *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{nodeType | pluralize:0}}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\n The {{data.type || 'blank node'}} with Term <code>{{data.termId}}</code> is already present or already added by another model.\n </span>\n </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{model.config.runStrategy}}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">\n We only gap-fill this key if not present\n </span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">\n We only gap-fill this Blank Node if not present.\n </span>\n </p>\n\n <p class=\"is-mt-1\">\n <span class=\"is-run-with-measured\" *ngIf=\"model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\">\n The <code>{{model.config.value}}</code> was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>The recalculated <b>methodTier</b> was</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">the original <b>methodTier</b>.</span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n <ng-container *ngIf=\"model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{model.config.mergeArgs.replaceThreshold[1] * 100}}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}.</b>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\"\n (click)=\"$event.stopPropagation()\"\n >\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"] }]
|
|
236
|
+
args: [{ selector: 'he-node-logs-models', template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\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>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"allTerms?.length\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"false\"\n (selectItem)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per </span>\n <span [ngSwitch]=\"functionalUnit\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes\">Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!loading && blankNodes.length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>No data</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <span *ngIf=\"blankNode.key\">{{blankNode.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{blankNode.originalValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.originalValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{blankNode.recalculatedValue | precision:3 | default:'-'}}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">{{blankNode.recalculatedValueByMethodId[model.methodId] | precision:3 | default:'-'}}</div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"\n ></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta *ngIf=\"blankNode.originalValueByMethodId[model.methodId] !== null && blankNode.recalculatedValueByMethodId[model.methodId] !== null; else noValue\"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"\n ></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: blankNode}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a class=\"is-inline-block is-pre-wrap\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\" target=\"_blank\" [title]=\"subValue.key\"\n >\n <span>{{subValue.key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{subValue.key}}</span>\n </td>\n <td *ngIf=\"isBlankNodes\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{subValue.key | keyToLabel}}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{subValue.id | keyToLabel}}</span>\n <he-node-link *ngSwitchDefault class=\"is-block pl-4\" [node]=\"termById(subValue.id)\" [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {data: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\"\n (click)=\"showLegend = !showLegend\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{logColor[status.value]}}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{status.value}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyRequired\"\n (change)=\"filterResults()\"\n [disabled]=\"!!term\"\n >\n <span class=\"ml-2\">Show only {{filteredType | pluralize}} included in the default Hestia system boundary</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model:models, data}\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {model, data}\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"p.isOpen() ? p.close() : (model.showLogs ? p.open({ logs: model.logs }) : null)\"\n >\n <span class=\"is-capitalized\">{{methodName(model)}}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">[{{model.logs?.methodTier || model.model?.methodTier}}]</span>\n\n <span class=\"pl-1 has-text-{{logColor[model.status]}} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow\"\n triggers=\"manual\" #p1=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\"\n >\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (<ng-container *ngTemplateOutlet=\"docsLink; context: {$implicit: model.model}\"></ng-container>)\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context:{key, value:logs.requirements[key]}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context:key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-dark is-fullwidth is-striped\">\n <thead>\n <tr>\n <th class=\"has-text-white\">\n <span>Filename</span>\n </th>\n <th class=\"has-text-white\">\n <span>Column Title</span>\n </th>\n <th class=\"has-text-white\">\n <span>Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-text-white\">\n <tr *ngFor=\"let data of logs.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{value}}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else defaultValue\">\n <he-node-link class=\"is-inline-block is-align-middle\" linkClass=\"is-dark\" [node]=\"linkedNode\" [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\n</ng-template>\n\n<ng-template #logLine let-key=\"key\" let-value=\"value\">\n <tr>\n <td class=\"has-border-right copy-log\">\n <span class=\"is-inline-block is-align-middle\" [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{key | keyToLabel}}</ng-container>\n\n <ng-container *ngSwitchCase=\"'node_type_allowed'\">Is the current <code>Node</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'siteType_allowed'\">Is the current <code>siteType</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">Is the current primary product <code>@id</code> allowed to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'primary_product_termType_allowed'\">Is the current primary product <code>termType</code> allowed to run this model</ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">Has geospatial data necessary to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'pesticides_complete'\">Pesticide data are <code>complete</code></ng-container>\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">Cycle contains <code>pesticideAI</code> Inputs</ng-container>\n <ng-container *ngSwitchCase=\"'all_pesticideAI_have_lookup_value'\">All <code>pesticideAI</code> Inputs have a lookup value</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\"><code>aboveGroundCropResidueBurnt</code> is present as Product</ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n\n <ng-container *ngSwitchCase=\"'term_type_cropResidue_complete'\">Data completeness for \"cropResidue\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_excreta_complete'\">Data completeness for \"excreta\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_fertiliser_complete'\">Data completeness for \"fertiliser\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_material_complete'\">Data completeness for \"material\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_other_complete'\">Data completeness for \"other\" must be <code>true</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_pesticidesAntibiotics_complete'\">Data completeness for \"pesticidesAntibiotics\" must be <code>true</code></ng-container>\n\n <ng-container *ngSwitchCase=\"'term_type_cropResidue_incomplete'\">Data completeness for \"cropResidue\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_excreta_incomplete'\">Data completeness for \"excreta\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_fertiliser_incomplete'\">Data completeness for \"fertiliser\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_material_incomplete'\">Data completeness for \"material\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_other_incomplete'\">Data completeness for \"other\" must be <code>false</code></ng-container>\n <ng-container *ngSwitchCase=\"'term_type_pesticidesAntibiotics_incomplete'\">Data completeness for \"pesticidesAntibiotics\" must be <code>false</code></ng-container>\n </span>\n <he-clipboard class=\"is-inline-block is-align-middle\" clipboardClass=\"is-size-7 is-p-1\" [icon]=\"['far', 'clone']\" [value]=\"key\" [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context:{key,value}\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{v.key}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{v}}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{vv.value}}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{model.status}}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">The <code>siteType</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">The primary product <code>@id</code> is not relevant.</li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">The primary product <code>termType</code> is not relevant.</li>\n </ul>\n </ng-container>\n\n <ng-container *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!model.logs?.shouldRun\">\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on the model name on the left to view the debugging logs.</p>\n </ng-container>\n <ng-container *ngIf=\"model.logs?.logs?.error\">\n <p>The model failed to run for the following reason:</p>\n <p><code>{{model.logs.logs.error}}</code></p>\n </ng-container>\n </li>\n </ng-template>\n\n <li class=\"is-no-run-orchestrator\" *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{nodeType | pluralize:0}}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\n The {{data.type || 'blank node'}} with Term <code>{{data.termId}}</code> is already present or already added by another model.\n </span>\n </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{model.config.runStrategy}}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">\n We only gap-fill this key if not present\n </span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">\n We only gap-fill this Blank Node if not present.\n </span>\n </p>\n\n <p class=\"is-mt-1\">\n <span class=\"is-run-with-measured\" *ngIf=\"model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\">\n The <code>{{model.config.value}}</code> was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>The recalculated <b>methodTier</b> was</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">the original <b>methodTier</b>.</span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n <ng-container *ngIf=\"model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{model.config.mergeArgs.replaceThreshold[1] * 100}}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{model.config?.mergeArgs?.replaceThreshold?.[0] || 'value'}}.</b>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\"\n (click)=\"$event.stopPropagation()\"\n >\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"] }]
|
|
237
237
|
}], ctorParameters: function () { return [{ type: i1.HeNodeService }, { type: i2.HeSearchService }, { type: i3.HeEngineService }]; }, propDecorators: { node: [{
|
|
238
238
|
type: Input
|
|
239
239
|
}], nodeKey: [{
|
|
@@ -251,4 +251,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
251
251
|
}], logsKey: [{
|
|
252
252
|
type: Input
|
|
253
253
|
}] } });
|
|
254
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBYyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFDTCxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUM1RixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBdUIsUUFBUSxFQUFRLFlBQVksRUFDMUYsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQzdHLG1CQUFtQixFQUNwQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUNpQyxTQUFTLEVBQTJCLGdCQUFnQixFQUFFLGVBQWUsRUFDM0csVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQTBDLGVBQWUsRUFDMUYsV0FBVyxFQUNsQixNQUFNLDBCQUEwQixDQUFDO0FBR2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIs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QUs7Z0JBR0UsT0FBTztzQkFEZCxLQUFLO2dCQUdFLGNBQWM7c0JBRHJCLEtBQUs7Z0JBR0Usa0JBQWtCO3NCQUR6QixLQUFLO2dCQUdFLEtBQUs7c0JBRFosS0FBSztnQkFHRSxlQUFlO3NCQUR0QixLQUFLO2dCQUdFLG9CQUFvQjtzQkFEM0IsS0FBSztnQkFHRSxPQUFPO3NCQURkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdCwgZmlsdGVyLCByZWR1Y2UsIHRvQXJyYXksIG1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgbWVyZ2VNYXAsIG1lcmdlQWxsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEN5Y2xlRnVuY3Rpb25hbFVuaXQsIEVtaXNzaW9uTWV0aG9kVGllciwgSVRlcm1KU09OTEQsIEpTT05MRCwgTm9kZVR5cGUsIFRlcm0sIFRlcm1UZXJtVHlwZSxcbiAgZW1pc3Npb25UZXJtVGVybVR5cGUsIGluZGljYXRvclRlcm1UZXJtVHlwZSwgaW5wdXRUZXJtVGVybVR5cGUsIG1lYXN1cmVtZW50VGVybVRlcm1UeXBlLCBwcmFjdGljZVRlcm1UZXJtVHlwZSxcbiAgcHJvZHVjdFRlcm1UZXJtVHlwZVxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBrZXlUb0xhYmVsIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuXG5pbXBvcnQge1xuICBJQmxhbmtOb2RlTG9nU3ViVmFsdWUsIElCbGFua05vZGVMb2csIExvZ1N0YXR1cywgSUNvbmZpZ01vZGVsLCBibGFua05vZGUsIGdyb3VwTG9nc0J5TW9kZWwsIGdyb3VwTG9nc0J5VGVybSxcbiAgbW9kZWxDb3VudCwgY29tcHV0ZVRlcm1zLCBsb2dWYWx1ZUFycmF5LCBJTm9kZVRlcm1Mb2dzLCBJTm9kZUxvZ3MsIG5vbkJsYW5rTm9kZSwgZ3JvdXBkTG9nc0J5S2V5LCBJTm9uQmxhbmtOb2RlTG9nLFxuICBJTG9nLCBjb21wdXRlS2V5c1xufSBmcm9tICcuL25vZGUtbG9ncy1tb2RlbHMubW9kZWwnO1xuaW1wb3J0IHsgSUpTT05Ob2RlLCBIZU5vZGVTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IEhlRW5naW5lU2VydmljZSwgSU1vZGVsLCBJT3JjaGVzdHJhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vZW5naW5lL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IG1hdGNoRXhhY3RRdWVyeSwgbWF0Y2hJZCwgbWF0Y2hUZXJtVHlwZSwgbWF0Y2hUeXBlIH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5tb2RlbCc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgYmFzZVVybCwgaXNFeHRlcm5hbCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyB0ZXJtVHlwZUxhYmVsIH0gZnJvbSAnLi4vLi4vdGVybXMvdGVybXMubW9kZWwnO1xuXG50eXBlIG5vZGVLZXkgPSAnaW5wdXRzJyB8ICdwcm9kdWN0cycgfCAnY29tcGxldGVuZXNzJyB8ICdwcmFjdGljZXMnIHwgJ2VtaXNzaW9ucycgfCAnZW1pc3Npb25zUmVzb3VyY2VVc2UnIHwgJ2ltcGFjdHMnIHwgJ2VuZHBvaW50cyc7XG5cbmNvbnN0IG5vZGVUeXBlc0xvd2VyQ2FzZSA9IE9iamVjdC52YWx1ZXMoTm9kZVR5cGUpLm1hcCh2ID0+IHYudG9Mb3dlckNhc2UoKSk7XG5cbmNvbnN0IGxvZ0ljb246IHtcbiAgW3N0YXR1cyBpbiBMb2dTdGF0dXNdPzogc3RyaW5nIHwgc3RyaW5nW107XG59ID0ge1xuICBbTG9nU3RhdHVzLnN1Y2Nlc3NdOiAnY2hlY2snLFxuICBbTG9nU3RhdHVzLmVycm9yXTogJ3RpbWVzJyxcbiAgW0xvZ1N0YXR1cy5za2lwSGllcmFyY2h5XTogWydmYXInLCAnY2lyY2xlJ10sXG4gIFtMb2dTdGF0dXMuZGF0YVByb3ZpZGVkXTogJ2NpcmNsZScsXG4gIFtMb2dTdGF0dXMubm90UmVxdWlyZWRdOiAnZG90LWNpcmNsZSdcbn07XG5cbmNvbnN0IGxvZ0NvbG9yOiB7XG4gIFtzdGF0dXMgaW4gTG9nU3RhdHVzXT86IHN0cmluZztcbn0gPSB7XG4gIFtMb2dTdGF0dXMuc3VjY2Vzc106ICdzdWNjZXNzJyxcbiAgW0xvZ1N0YXR1cy5lcnJvcl06ICdkYW5nZXInLFxuICBbTG9nU3RhdHVzLnNraXBIaWVyYXJjaHldOiAnZGFyaycsXG4gIFtMb2dTdGF0dXMuZGF0YVByb3ZpZGVkXTogJ2RhcmsnLFxuICBbTG9nU3RhdHVzLm5vdFJlcXVpcmVkXTogJ2dyZXknXG59O1xuXG5jb25zdCBtZXRob2RJZExhYmVsID0gKG1ldGhvZElkOiBzdHJpbmcsIG1vZGVsPzogSU1vZGVsKSA9PlxuICAoXG4gICAgbWV0aG9kSWRcbiAgICAgID8gKHtcbiAgICAgICAgJ2N5Y2xlL3RyYW5zZm9ybWF0aW9uJzogJ0RhdGEgRnJvbSBUcmFuc2Zvcm1hdGlvbicsXG4gICAgICAgIGltcGFjdF9hc3Nlc3NtZW50OiAnRGF0YSBGcm9tIEN5Y2xlJ1xuICAgICAgfSlbbWV0aG9kSWRdXG4gICAgICA6ICcnXG4gICkgfHwgKFxuICAgIG1ldGhvZElkLmluY2x1ZGVzKCcvJykgPyBtZXRob2RJZC5zcGxpdCgnLycpWzBdIDoga2V5VG9MYWJlbChtZXRob2RJZClcbiAgKTtcblxuY29uc3QgZ2V0TW9kZWxzQXQgPSAobG9nOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWUgfCBJQmxhbmtOb2RlTG9nLCBpbmRleDogbnVtYmVyKSA9PlxuICAoJ21vZGVsc0luU3ViVmFsdWVzJyBpbiBsb2cgPyAhbG9nLm1vZGVsc0luU3ViVmFsdWVzIHx8ICFsb2cuaXNPcGVuIDogdHJ1ZSkgJiYgbG9nLmNvbmZpZ01vZGVsc1tpbmRleF07XG5cbmNvbnN0IHJlcXVpcmVtZW50S2V5cyA9IChyZXF1aXJlbWVudHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pID0+XG4gIE9iamVjdC5rZXlzKHJlcXVpcmVtZW50cykuZmlsdGVyKGsgPT4gIW5vZGVUeXBlc0xvd2VyQ2FzZS5pbmNsdWRlcyhrKSk7XG5cbmNvbnN0IHJlcXVpcmVtZW50Q29sb3IgPSAodmFsdWU6IGFueSkgPT4gIXZhbHVlIHx8IFsnTm9uZScsICdGYWxzZScsICcwJywgJzAuMCddLmluY2x1ZGVzKHZhbHVlKSA/ICdkYW5nZXInIDogJ3doaXRlJztcblxuY29uc3QgcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXk6IHtcbiAgW2tleTogc3RyaW5nXTogKHZhbHVlOiBzdHJpbmcpID0+IFBhcnRpYWw8SlNPTkxEPE5vZGVUeXBlPj47XG59ID0ge1xuICByZWxhdGVkX2N5Y2xlczogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSwgJ0BpZCc6IHYgfSksXG4gIGN5Y2xlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLCAnQGlkJzogdiB9KSxcbiAgaW1wYWN0X2Fzc2Vzc21lbnRfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCwgJ0BpZCc6IHYgfSksXG4gIHNpdGVfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuU2l0ZSwgJ0BpZCc6IHYgfSksXG4gIHNvdXJjZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsICdAaWQnOiB2IH0pXG59O1xuXG5jb25zdCByZXF1aXJlbWVudExpbmtlZE5vZGUgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+XG4gIGtleSBpbiByZXF1aXJlbWVudExpbmtlZE5vZGVCeUtleSAmJlxuICByZXF1aXJlbWVudExpbmtlZE5vZGVCeUtleVtrZXldKHZhbHVlKTtcblxuY29uc3QgaXNTeXN0ZW1Cb3VuZGFyeSA9IChcbiAgeyBpc1JlY2FsY3VsYXRlZCwgaXNSZXF1aXJlZCB9OiBQaWNrPElMb2cgfCBJQmxhbmtOb2RlTG9nU3ViVmFsdWUsICdpc1JlY2FsY3VsYXRlZCcgfCAnaXNSZXF1aXJlZCc+XG4pID0+IFtcbiAgaXNSZWNhbGN1bGF0ZWQsXG4gIGlzUmVxdWlyZWRcbl0uc29tZShCb29sZWFuKTtcblxuY29uc3QgaXNHZW5lcmljVGVybSA9ICh0ZXJtSWQ6IHN0cmluZykgPT4gW1xuICB0ZXJtSWQuc3RhcnRzV2l0aCgnZXhjcmV0YScpXG5dLmV2ZXJ5KEJvb2xlYW4pO1xuXG5jb25zdCBleHRyYVRlcm1JZHNGcm9tQ29uZmlnID0gKGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZywga2V5OiBub2RlS2V5KSA9PlxuICBjb25maWcubW9kZWxzLmZsYXQoKS5maWx0ZXIobSA9PiBtLmtleSA9PT0ga2V5KS5tYXAobSA9PiBtLnZhbHVlKS5maWx0ZXIoQm9vbGVhbikuZmlsdGVyKHYgPT4gIWlzR2VuZXJpY1Rlcm0odikpO1xuXG5jb25zdCBtYXRjaFRlcm1UeXBlRnJvbUtleToge1xuICBba2V5OiBzdHJpbmddOiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIHByb2R1Y3RzOiBwcm9kdWN0VGVybVRlcm1UeXBlLnRlcm0sXG4gIGlucHV0czogaW5wdXRUZXJtVGVybVR5cGUudGVybSxcbiAgbWVhc3VyZW1lbnRzOiBtZWFzdXJlbWVudFRlcm1UZXJtVHlwZS50ZXJtLFxuICBwcmFjdGljZXM6IHByYWN0aWNlVGVybVRlcm1UeXBlLnRlcm0sXG4gIGVtaXNzaW9uczogZW1pc3Npb25UZXJtVGVybVR5cGUudGVybSxcbiAgZW1pc3Npb25zUmVzb3VyY2VVc2U6IGluZGljYXRvclRlcm1UZXJtVHlwZS50ZXJtLFxuICBpbXBhY3RzOiBpbmRpY2F0b3JUZXJtVGVybVR5cGUudGVybSxcbiAgZW5kcG9pbnRzOiBpbmRpY2F0b3JUZXJtVGVybVR5cGUudGVybVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtbm9kZS1sb2dzLW1vZGVscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVMb2dzTW9kZWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBsb2dzOiBzdHJpbmc7XG4gIHByaXZhdGUgYWxsQmxhbmtOb2RlczogKElCbGFua05vZGVMb2cgfCBJTm9uQmxhbmtOb2RlTG9nKVtdID0gW107XG4gIHByaXZhdGUgbWV0aG9kc0J5SWQ/OiB7XG4gICAgW2lkOiBzdHJpbmddOiBJVGVybUpTT05MRDtcbiAgfTtcbiAgcHJpdmF0ZSB0ZXJtc0J5SWQ6IHtcbiAgICBbaWQ6IHN0cmluZ106IElUZXJtSlNPTkxEO1xuICB9ID0ge307XG5cbiAgQElucHV0KClcbiAgcHJpdmF0ZSBub2RlPzogSUpTT05Ob2RlO1xuICBASW5wdXQoKVxuICBwcml2YXRlIG5vZGVLZXk/OiBub2RlS2V5O1xuICBASW5wdXQoKVxuICBwcml2YXRlIG9yaWdpbmFsVmFsdWVzOiBibGFua05vZGVbXSB8IG5vbkJsYW5rTm9kZSA9IFtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHJlY2FsY3VsYXRlZFZhbHVlczogYmxhbmtOb2RlW10gfCBub25CbGFua05vZGUgPSBbXTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSB0ZXJtczogSVRlcm1KU09OTERbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGZpbHRlclRlcm1UeXBlcz86IFRlcm1UZXJtVHlwZVtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGZpbHRlclRlcm1UeXBlc0xhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGxvZ3NLZXk/OiBzdHJpbmc7XG5cbiAgcHVibGljIGxvZ3NVcmw/OiBzdHJpbmc7XG4gIHB1YmxpYyBiYXNlVXJsID0gYmFzZVVybCgpO1xuICBwdWJsaWMgaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWwoKTtcbiAgcHVibGljIEN5Y2xlRnVuY3Rpb25hbFVuaXQgPSBDeWNsZUZ1bmN0aW9uYWxVbml0O1xuICBwdWJsaWMgRW1pc3Npb25NZXRob2RUaWVyID0gRW1pc3Npb25NZXRob2RUaWVyO1xuICBwdWJsaWMgTG9nU3RhdHVzID0gTG9nU3RhdHVzO1xuICBwdWJsaWMgbG9nSWNvbiA9IGxvZ0ljb247XG4gIHB1YmxpYyBsb2dDb2xvciA9IGxvZ0NvbG9yO1xuICBwdWJsaWMgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7XG4gIHB1YmxpYyBnZXRNb2RlbHNBdCA9IGdldE1vZGVsc0F0O1xuICBwdWJsaWMgcmVxdWlyZW1lbnRLZXlzID0gcmVxdWlyZW1lbnRLZXlzO1xuICBwdWJsaWMgcmVxdWlyZW1lbnRDb2xvciA9IHJlcXVpcmVtZW50Q29sb3I7XG4gIHB1YmxpYyBsb2dWYWx1ZUFycmF5ID0gbG9nVmFsdWVBcnJheTtcbiAgcHVibGljIHJlcXVpcmVtZW50TGlua2VkTm9kZSA9IHJlcXVpcmVtZW50TGlua2VkTm9kZTtcbiAgcHVibGljIGlzU3lzdGVtQm91bmRhcnkgPSBpc1N5c3RlbUJvdW5kYXJ5O1xuICBwdWJsaWMgbG9hZGluZyA9IHRydWU7XG4gIHB1YmxpYyBub2RlVHlwZTogTm9kZVR5cGU7XG4gIHB1YmxpYyBibGFua05vZGVzOiAoSUJsYW5rTm9kZUxvZyB8IElOb25CbGFua05vZGVMb2cpW10gPSBbXTtcbiAgcHVibGljIG1ldGhvZE1vZGVsc0NvdW50ID0gMDtcbiAgcHVibGljIG9ubHlSZXF1aXJlZCA9IHRydWU7XG4gIHB1YmxpYyBzaG93TGVnZW5kID0gdHJ1ZTtcblxuICBwdWJsaWMgdGVybT86IHN0cmluZztcbiAgcHVibGljIGFsbFRlcm1zOiAoVGVybSB8IElUZXJtSlNPTkxEKVtdID0gW107XG4gIHB1YmxpYyBzdWdnZXN0VGVybSA9ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKHYgPT4gdGhpcy5zdWdnZXN0QnlUZXJtKHYpKSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm9kZVNlcnZpY2U6IEhlTm9kZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbmdpbmVTZXJ2aWNlOiBIZUVuZ2luZVNlcnZpY2VcbiAgKSB7IH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvZ3NVcmwgPSB0aGlzLm5vZGVTZXJ2aWNlLm5vZGVMb2dzVXJsKHRoaXMubm9kZSk7XG4gICAgLy8gc2F2ZSBhcyBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZCBcInJlc2VydmVkIHlpZWxkIGtleXdvcmRcIiBpc3N1ZVxuICAgIHRoaXMubG9ncyA9IGF3YWl0IHRoaXMuZ2V0TG9ncygpO1xuICAgIGNvbnN0IGdyb3VwZWRMb2dzID0gZ3JvdXBMb2dzQnlNb2RlbCh0aGlzLmxvZ3MpO1xuICAgIGNvbnN0IGxvZ3MgPSB0aGlzLmxvZ3NLZXkgPyBncm91cGVkTG9nc1t0aGlzLmxvZ3NLZXldIDogZ3JvdXBlZExvZ3M7XG5cbiAgICB0aGlzLm5vZGVUeXBlID0gdGhpcy5ub2RlWydAdHlwZSddIHx8IHRoaXMubm9kZS50eXBlO1xuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMuZW5naW5lU2VydmljZS5vY2hlc3RyYXRvckNvbmZpZyh0aGlzLm5vZGVUeXBlLCB0aGlzLm5vZGVbJ0BpZCddIHx8IHRoaXMubm9kZS5pZCk7XG5cbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgIGJvb2w6IHtcbiAgICAgICAgbXVzdDogW1xuICAgICAgICAgIG1hdGNoVHlwZShOb2RlVHlwZS5UZXJtKSxcbiAgICAgICAgICBtYXRjaFRlcm1UeXBlKFRlcm1UZXJtVHlwZS5tb2RlbClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5tZXRob2RzQnlJZCA9IGF3YWl0IGZyb20obW9kZWxzKS5waXBlKFxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcbiAgICAgIGRpc3RpbmN0KHYgPT4gdlsnQGlkJ10pLFxuICAgICAgcmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3VyclsnQGlkJ11dOiBjdXJyIH0pLCB7fSlcbiAgICApLnRvUHJvbWlzZSgpO1xuXG4gICAgLy8gZnJvbSBgbW9kZWwtbGlua3MuanNvbmAgZmlsZVxuICAgIGNvbnN0IGVuZ2luZU1vZGVscyA9IGF3YWl0IHRoaXMuZW5naW5lU2VydmljZS5tb2RlbHMoKTtcblxuICAgIHRoaXMuaXNCbGFua05vZGVzID9cbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0JsYW5rTm9kZXMobG9ncywgZW5naW5lTW9kZWxzLCBjb25maWcpIDpcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc05vbkJsYW5rTm9kZXMobG9ncywgZW5naW5lTW9kZWxzLCBjb25maWcpO1xuXG4gICAgdGhpcy5maWx0ZXJSZXN1bHRzKCk7XG5cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9ncygpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlU2VydmljZS5nZXRMb2codGhpcy5ub2RlKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3VnZ2VzdEJ5VGVybSh0ZXJtOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmFsbFRlcm1zKS5waXBlKFxuICAgICAgbWFwKHYgPT4gdi5uYW1lKSxcbiAgICAgIGZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtLnRvTG93ZXJDYXNlKCkpKSxcbiAgICAgIHRvQXJyYXkoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlYXJjaFRlcm1zKHF1ZXJ5OiBhbnkpIHtcbiAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2g8SVRlcm1KU09OTEQsIE5vZGVUeXBlLlRlcm0+KHtcbiAgICAgIGZpZWxkczogWydAdHlwZScsICdAaWQnLCAnbmFtZSddLFxuICAgICAgbGltaXQ6IDEwMDAwLFxuICAgICAgcXVlcnlcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0JsYW5rTm9kZXMobG9nczogSU5vZGVMb2dzIHwgSU5vZGVUZXJtTG9ncywgZW5naW5lTW9kZWxzOiBJTW9kZWxbXSwgY29uZmlnOiBJT3JjaGVzdHJhdG9yQ29uZmlnKSB7XG4gICAgY29uc3QgZXh0cmFUZXJtSWRzID0gZXh0cmFUZXJtSWRzRnJvbUNvbmZpZyhjb25maWcsIHRoaXMubm9kZUtleSk7XG4gICAgY29uc3QgbWF0Y2hUZXJtVHlwZXMgPSAobWF0Y2hUZXJtVHlwZUZyb21LZXlbdGhpcy5ub2RlS2V5XSB8fCBbXSkubWFwKG1hdGNoVGVybVR5cGUpO1xuICAgIGNvbnN0IGV4dHJhVGVybXMgPSBhd2FpdCB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgIGJvb2w6IHtcbiAgICAgICAgbXVzdDogW1xuICAgICAgICAgIG1hdGNoVHlwZShOb2RlVHlwZS5UZXJtKSxcbiAgICAgICAgICBtYXRjaFRlcm1UeXBlcy5sZW5ndGggPyB7XG4gICAgICAgICAgICBib29sOiB7XG4gICAgICAgICAgICAgIHNob3VsZDogbWF0Y2hUZXJtVHlwZXMsXG4gICAgICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSA6IG51bGxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbiksXG4gICAgICAgIHNob3VsZDogZXh0cmFUZXJtSWRzLm1hcChtYXRjaElkKSxcbiAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYWxsVGVybXMgPSBhd2FpdCBjb21wdXRlVGVybXMoXG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzIGFzIGJsYW5rTm9kZVtdLCB0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcyBhcyBibGFua05vZGVbXSwgdGhpcy50ZXJtcywgdGhpcy5maWx0ZXJUZXJtVHlwZXMsIGV4dHJhVGVybXNcbiAgICApO1xuICAgIGNvbnN0IG1hcEZ1bmMgPSBncm91cExvZ3NCeVRlcm0oXG4gICAgICB0aGlzLm5vZGVUeXBlLCBsb2dzLCBlbmdpbmVNb2RlbHMsIGNvbmZpZywgdGhpcy5vcmlnaW5hbFZhbHVlcyBhcyBibGFua05vZGVbXSwgdGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMgYXMgYmxhbmtOb2RlW10sIHRoaXMubm9kZUtleVxuICAgICk7XG4gICAgY29uc3QgYWxsQmxhbmtOb2RlcyA9IHRoaXMuYWxsVGVybXMuZmxhdE1hcChtYXBGdW5jKTtcbiAgICB0aGlzLm1ldGhvZE1vZGVsc0NvdW50ID0gbW9kZWxDb3VudChhbGxCbGFua05vZGVzKTtcblxuICAgIHRoaXMudGVybXNCeUlkID0gYXdhaXQgb2YoYWxsQmxhbmtOb2RlcykucGlwZShcbiAgICAgIG1lcmdlTWFwKHYgPT4gdi5mbGF0TWFwKHZ2ID0+IHZ2LnN1YlZhbHVlcykpLFxuICAgICAgbWFwKHYgPT4gdi5pZCksXG4gICAgICBkaXN0aW5jdCgpLFxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcbiAgICAgIHRvQXJyYXkoKSxcbiAgICAgIG1lcmdlTWFwKGlkcyA9PiBmcm9tKHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgICBib29sOiB7XG4gICAgICAgICAgbXVzdDogW1xuICAgICAgICAgICAgbWF0Y2hUeXBlKE5vZGVUeXBlLlRlcm0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzaG91bGQ6IGlkcy5tYXAoaWQgPT4gbWF0Y2hFeGFjdFF1ZXJ5KCdAaWQnLCBpZCkpLFxuICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSksXG4gICAgICBtZXJnZUFsbCgpLFxuICAgICAgcmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3VyclsnQGlkJ11dOiBjdXJyIH0pLCB7fSlcbiAgICApLnRvUHJvbWlzZSgpO1xuXG4gICAgdGhpcy5hbGxCbGFua05vZGVzID0gYWxsQmxhbmtOb2RlcztcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc05vbkJsYW5rTm9kZXMobG9nczogSU5vZGVMb2dzIHwgSU5vZGVUZXJtTG9ncywgZW5naW5lTW9kZWxzOiBJTW9kZWxbXSwgY29uZmlnOiBJT3JjaGVzdHJhdG9yQ29uZmlnKSB7XG4gICAgY29uc3QgbWFwRnVuYyA9IGdyb3VwZExvZ3NCeUtleShcbiAgICAgIHRoaXMubm9kZVR5cGUsIGxvZ3MsIGVuZ2luZU1vZGVscywgdGhpcy5vcmlnaW5hbFZhbHVlcyBhcyBub25CbGFua05vZGUsIHRoaXMucmVjYWxjdWxhdGVkVmFsdWVzIGFzIG5vbkJsYW5rTm9kZVxuICAgICk7XG4gICAgY29uc3Qga2V5cyA9IGNvbXB1dGVLZXlzKHRoaXMub3JpZ2luYWxWYWx1ZXMgYXMgbm9uQmxhbmtOb2RlLCB0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcyBhcyBub25CbGFua05vZGUpO1xuICAgIGNvbnN0IGFsbEJsYW5rTm9kZXMgPSBrZXlzLmZsYXRNYXAobWFwRnVuYyk7XG4gICAgdGhpcy5hbGxCbGFua05vZGVzID0gYWxsQmxhbmtOb2RlcztcbiAgICB0aGlzLm1ldGhvZE1vZGVsc0NvdW50ID0gMTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNCbGFua05vZGVzKCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMub3JpZ2luYWxWYWx1ZXMpIHx8IEFycmF5LmlzQXJyYXkodGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlCbGFua05vZGUoX2luZGV4OiBudW1iZXIsIG5vZGU6IGFueSkge1xuICAgIHJldHVybiBub2RlLnRlcm1JZCB8fCBub2RlLmtleTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyZWRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlclRlcm1UeXBlc0xhYmVsIHx8IHRoaXMuZmlsdGVyVGVybVR5cGVzPy5tYXAodGVybVR5cGVMYWJlbCkuam9pbignICYgJyk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckJsYW5rTm9kZSh7IHRlcm06IHsgbmFtZSB9LCBzdWJWYWx1ZXMsIC4uLmxvZyB9OiBJQmxhbmtOb2RlTG9nKSB7XG4gICAgcmV0dXJuIHRoaXMudGVybVxuICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXJtLnRvTG93ZXJDYXNlKCkpXG4gICAgICA6IChcbiAgICAgICAgIXRoaXMuZmlsdGVyVGVybVR5cGVzPy5sZW5ndGggfHxcbiAgICAgICAgIXRoaXMub25seVJlcXVpcmVkIHx8IGlzU3lzdGVtQm91bmRhcnkobG9nKSB8fCBzdWJWYWx1ZXMuc29tZShpc1N5c3RlbUJvdW5kYXJ5KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJSZXN1bHRzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ibGFua05vZGVzID0gdGhpcy5hbGxCbGFua05vZGVzLmZpbHRlcihsb2cgPT4gISgndGVybScgaW4gbG9nKSB8fCB0aGlzLmZpbHRlckJsYW5rTm9kZShsb2cpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRob2ROYW1lKHsgbWV0aG9kSWQsIG1vZGVsIH06IElDb25maWdNb2RlbCkge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZHNCeUlkW21ldGhvZElkXT8ubmFtZSB8fCBtZXRob2RJZExhYmVsKG1ldGhvZElkLCBtb2RlbCk7XG4gIH1cblxuICBwdWJsaWMgaGFzTWV0aG9kVGllcih2YWx1ZXM6IGJsYW5rTm9kZVtdLCBtZXRob2RUaWVyOiBFbWlzc2lvbk1ldGhvZFRpZXIpIHtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUodiA9PiAnbWV0aG9kVGllcicgaW4gdiAmJiB2Lm1ldGhvZFRpZXIgPT09IG1ldGhvZFRpZXIpO1xuICB9XG5cbiAgcHVibGljIHRlcm1CeUlkKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50ZXJtc0J5SWRbaWRdIHx8IHtcbiAgICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgICAnQGlkJzogaWQsXG4gICAgICBuYW1lOiB0ZXJtVHlwZUxhYmVsKGlkKVxuICAgIH0gYXMgSVRlcm1KU09OTEQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uYWxVbml0KCkge1xuICAgIHJldHVybiAodGhpcy5ub2RlIGFzIGFueSk/LmZ1bmN0aW9uYWxVbml0IGFzIEN5Y2xlRnVuY3Rpb25hbFVuaXQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJweC0zIHBiLTNcIj5cbiAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LXJpZ2h0IG1iLTJcIiAqbmdJZj1cIiFpc0V4dGVybmFsXCI+XG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiAqbmdJZj1cImxvZ3NVcmxcIiBbaHJlZl09XCJsb2dzVXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiZXh0ZXJuYWwtbGluay1hbHRcIj48L2ZhLWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5PcGVuIEZ1bGwgTG9nczwvc3Bhbj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuXG4gIDxoZS1kYXRhLXRhYmxlIGNsYXNzPVwibWItMSBpcy1zbWFsbFwiIFtzbWFsbF09XCJ0cnVlXCIgbWF4SGVpZ2h0PVwiMzIwXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiICpuZ0lmPVwiYWxsVGVybXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZCBoYXMtaWNvbnMtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dCBzZWFyY2gtaW5wdXQgaXMtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0ZXJtXCIgbmFtZT1cInRlcm1cIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYnkgbmFtZVwiXG4gICAgICAgICAgICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInN1Z2dlc3RUZXJtXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c0ZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RJdGVtKT1cImZpbHRlclJlc3VsdHMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaGlkZGVuXT1cIiF0ZXJtXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0ZXJtID0gJyc7IGZpbHRlclJlc3VsdHMoKTtcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggKm5nSWY9XCJpc0JsYW5rTm9kZXNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcHItMVwiPlVuaXRzPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+KHBlciA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBbbmdTd2l0Y2hdPVwiZnVuY3Rpb25hbFVuaXRcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ3ljbGVGdW5jdGlvbmFsVW5pdFsnMSBoYSddXCI+aGVjdGFyZTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+a2cgcHJvZHVjdDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+KTwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aD5PcmlnaW5hbDwvdGg+XG4gICAgICAgICAgPHRoPlJlY2FsY3VsYXRlZDwvdGg+XG4gICAgICAgICAgPHRoICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+RGlmZmVyZW5jZTwvdGg+XG4gICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIG1ldGhvZE1vZGVsc0NvdW50IHwgdGltZXM7IGxldCBpID0gaW5kZXhcIj4oe3tpICsgMX19KTwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8dHIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLXRleHQtY2VudGVyZWRcIiBjb2xzcGFuPVwiNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LWNlbnRlciBweS0zXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJzcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgKm5nSWY9XCIhbG9hZGluZyAmJiBibGFua05vZGVzLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImhhcy10ZXh0LWNlbnRlcmVkXCIgY29sc3Bhbj1cIjZcIj5cbiAgICAgICAgICAgIDxzcGFuPk5vIGRhdGE8L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmxhbmtOb2RlIG9mIGJsYW5rTm9kZXM7IHRyYWNrQnk6IHRyYWNrQnlCbGFua05vZGVcIj5cbiAgICAgICAgICA8dHIgW2NsYXNzLmhhcy1zdWItcm93c109XCJibGFua05vZGUuY2FuT3BlblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0IGlzLW5vd3JhcFwiIFthdHRyLnRpdGxlXT1cImJsYW5rTm9kZS50ZXJtPy5uYW1lIHx8IGJsYW5rTm9kZS5rZXlcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHByLTIgb3Blbi1ub2RlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmxhbmtOb2RlLmlzT3BlbiA9ICFibGFua05vZGUuaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImJsYW5rTm9kZS5jYW5PcGVuXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImJsYW5rTm9kZS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1wcmUtd3JhcFwiICpuZ0lmPVwiYmxhbmtOb2RlLnRlcm1cIiBbbm9kZV09XCJibGFua05vZGUudGVybVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwiYmxhbmtOb2RlLnRlcm0ubmFtZSB8IGNvbXBvdW5kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJibGFua05vZGUua2V5XCI+e3tibGFua05vZGUua2V5fX08L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtbm93cmFwXCIgW2lubmVySHRtbF09XCJibGFua05vZGUudGVybT8udW5pdHMgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9yaWdpbmFsVmFsdWU+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tibGFua05vZGUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsYW5rTm9kZS5hbGxQYXJhbGxlbDsgZWxzZSBkZWZhdWx0T3JpZ2luYWxWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGJsYW5rTm9kZS5jb25maWdNb2RlbHNbMF1cIj57e2JsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gfCBwcmVjaXNpb246MyB8IGRlZmF1bHQ6Jy0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWJsYW5rTm9kZS5pc09yaWdpbmFsIHx8IGJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZDsgZWxzZSBub3RSZWNhbGN1bGF0ZWRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZWNhbGN1bGF0ZWRWYWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7YmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlIHwgcHJlY2lzaW9uOjMgfCBkZWZhdWx0OictJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsYW5rTm9kZS5hbGxQYXJhbGxlbDsgZWxzZSBkZWZhdWx0UmVjYWxjdWxhdGVkVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGJsYW5rTm9kZS5jb25maWdNb2RlbHNbMF1cIj57e2JsYW5rTm9kZS5yZWNhbGN1bGF0ZWRWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdIHwgcHJlY2lzaW9uOjMgfCBkZWZhdWx0OictJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzQmxhbmtOb2Rlc1wiIGNsYXNzPVwiaXMtbm93cmFwXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERlbHRhVmFsdWU+XG4gICAgICAgICAgICAgICAgPGhlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGEgKm5nSWY9XCJibGFua05vZGUub3JpZ2luYWwubGVuZ3RoICYmIGJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZDsgZWxzZSBub1ZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW29yaWdpbmFsVmFsdWVdPVwiYmxhbmtOb2RlLm9yaWdpbmFsVmFsdWVcIlxuICAgICAgICAgICAgICAgID48L2hlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGE+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibGFua05vZGUuYWxsUGFyYWxsZWw7IGVsc2UgZGVmYXVsdERlbHRhVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBibGFua05vZGUuY29uZmlnTW9kZWxzWzBdXCI+XG4gICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YSAqbmdJZj1cImJsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gIT09IG51bGwgJiYgYmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gIT09IG51bGw7IGVsc2Ugbm9WYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcmlnaW5hbFZhbHVlXT1cImJsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF1cIlxuICAgICAgICAgICAgICAgICAgPjwvaGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDoge2RhdGE6IGJsYW5rTm9kZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3ViVmFsdWUgb2YgYmxhbmtOb2RlLmtleXNcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5zdWJWYWx1ZXM/Lmxlbmd0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0IGlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcGwtMyBwci0xIGZpZWxkLW5vZGVcIj5GaWVsZDo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtcHJlLXdyYXBcIiAqbmdJZj1cImJsYW5rTm9kZS50eXBlXCJcbiAgICAgICAgICAgICAgICBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGJsYW5rTm9kZS50eXBlICsgJyMnICsgc3ViVmFsdWUua2V5XCIgdGFyZ2V0PVwiX2JsYW5rXCIgW3RpdGxlXT1cInN1YlZhbHVlLmtleVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e3N1YlZhbHVlLmtleX19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcFwiICpuZ0lmPVwiIWJsYW5rTm9kZS50eXBlXCI+e3tzdWJWYWx1ZS5rZXl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXNcIj48L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgIT09IG51bGw7IGVsc2Ugbm9WYWx1ZVwiPnt7c3ViVmFsdWUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3ViVmFsdWUuaXNSZWNhbGN1bGF0ZWQgfHwgc3ViVmFsdWUua2V5ID09PSAnaW1wYWN0QXNzZXNzbWVudCc7IGVsc2Ugbm90UmVjYWxjdWxhdGVkXCI+XG4gICAgICAgICAgICAgICAge3tzdWJWYWx1ZS5yZWNhbGN1bGF0ZWRWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+LTwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7ZGF0YTogc3ViVmFsdWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN1YlZhbHVlIG9mIGJsYW5rTm9kZS5zdWJWYWx1ZXNcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcCBwbC0zXCI+e3tzdWJWYWx1ZS5rZXkgfCBrZXlUb0xhYmVsfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YlZhbHVlLmlkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcHItMVwiPjo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzdWJWYWx1ZS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCIgKm5nU3dpdGNoQ2FzZT1cIidiYWNrZ3JvdW5kRGF0YSdcIj57e3N1YlZhbHVlLmlkIHwga2V5VG9MYWJlbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayAqbmdTd2l0Y2hEZWZhdWx0IGNsYXNzPVwiaXMtYmxvY2sgcGwtNFwiIFtub2RlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKVwiIFthdHRyLnRpdGxlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwidGVybUJ5SWQoc3ViVmFsdWUuaWQpLm5hbWUgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ub3dyYXBcIiAqbmdJZj1cInN1YlZhbHVlLnNob3dVbml0c1wiIFtpbm5lckh0bWxdPVwiYmxhbmtOb2RlLnRlcm0/LnVuaXRzIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgIT09IG51bGw7IGVsc2Ugbm9WYWx1ZVwiPnt7c3ViVmFsdWUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3ViVmFsdWUuaXNSZWNhbGN1bGF0ZWQ7IGVsc2Ugbm90UmVjYWxjdWxhdGVkXCI+XG4gICAgICAgICAgICAgICAge3tzdWJWYWx1ZS5yZWNhbGN1bGF0ZWRWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+LTwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7ZGF0YTogc3ViVmFsdWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvaGUtZGF0YS10YWJsZT5cblxuICA8ZGl2IGNsYXNzPVwiaXMtc2l6ZS03IGlzLWl0YWxpY1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLXZhcmlhYmxlIGlzLTEgbXktMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgcHItMlwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXNob3dMZWdlbmRcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInNob3dMZWdlbmRcIj48L2ZhLWljb24+XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCI+TGVnZW5kOjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8dWwgY2xhc3M9XCJjb250ZW50IHBsLTJcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFzaG93TGVnZW5kXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhdHVzIG9mIExvZ1N0YXR1cyB8IGtleXNcIj5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImxvZ0ljb25bc3RhdHVzLnZhbHVlXVwiIGNsYXNzPVwiaGFzLXRleHQte3tsb2dDb2xvcltzdGF0dXMudmFsdWVdfX1cIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwibG9nSWNvbltzdGF0dXMudmFsdWVdXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj57e3N0YXR1cy52YWx1ZX19PC9zcGFuPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBoYXMtdGV4dC1yaWdodFwiICpuZ0lmPVwiZmlsdGVyZWRUeXBlXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImlzLWlubGluZS1ibG9jayBjaGVja2JveFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNlbGVjdG9yXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwib25seVJlcXVpcmVkXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsdGVyUmVzdWx0cygpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXRlcm1cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5TaG93IG9ubHkge3tmaWx0ZXJlZFR5cGUgfCBwbHVyYWxpemV9fSBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCBIZXN0aWEgc3lzdGVtIGJvdW5kYXJ5PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjYmxhbmtOb2RlTW9kZWxzIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8bmctdGVtcGxhdGUgI25vdEluU3lzdGVtQm91bmRhcnk+XG4gICAgPHRkIFthdHRyLmNvbHNwYW5dPVwibWV0aG9kTW9kZWxzQ291bnRcIj5cbiAgICAgIDxzcGFuPk5vdCBpbiBIZXN0aWEgc3lzdGVtIGJvdW5kYXJ5PC9zcGFuPlxuICAgIDwvdGQ+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU3lzdGVtQm91bmRhcnkoZGF0YSk7IGVsc2Ugbm9WYWx1ZVwiPlxuICAgIDx0ZCBjbGFzcz1cImJsYW5rLW5vZGUtaW5kZXgte3tpfX1cIiAqbmdGb3I9XCJsZXQgYyBvZiBtZXRob2RNb2RlbHNDb3VudCB8IHRpbWVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0TW9kZWxzQXQoZGF0YSwgaSk7IGxldCBtb2RlbHM7IGVsc2Ugbm9WYWx1ZVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgI21vZGVsU2VyaWU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsOyBjb250ZXh0OiB7bW9kZWw6bW9kZWxzLCBkYXRhfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibW9kZWxzIHwgaXNBcnJheTsgZWxzZSBtb2RlbFNlcmllXCI+XG4gICAgICAgICAgPHAgKm5nRm9yPVwibGV0IG1vZGVsIG9mIG1vZGVsc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsOyBjb250ZXh0OiB7bW9kZWwsIGRhdGF9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdGQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNibGFua05vZGVNb2RlbCBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcFwiXG4gICAgW2NsYXNzLnRyaWdnZXItcG9wb3Zlcl09XCJtb2RlbC5zaG93TG9nc1wiXG4gICAgW25nYlBvcG92ZXJdPVwibG9nRGV0YWlsc1wiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwPVwibmdiUG9wb3ZlclwiIHBsYWNlbWVudD1cImxlZnRcIiBjb250YWluZXI9XCJib2R5XCJcbiAgICAoY2xpY2spPVwicC5pc09wZW4oKSA/IHAuY2xvc2UoKSA6IChtb2RlbC5zaG93TG9ncyA/IHAub3Blbih7IGxvZ3M6IG1vZGVsLmxvZ3MgfSkgOiBudWxsKVwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImlzLWNhcGl0YWxpemVkXCI+e3ttZXRob2ROYW1lKG1vZGVsKX19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiICpuZ0lmPVwibW9kZWwubG9ncz8ubWV0aG9kVGllciB8fCBtb2RlbC5tb2RlbD8ubWV0aG9kVGllclwiPlt7e21vZGVsLmxvZ3M/Lm1ldGhvZFRpZXIgfHwgbW9kZWwubW9kZWw/Lm1ldGhvZFRpZXJ9fV08L3NwYW4+XG5cbiAgICA8c3BhbiBjbGFzcz1cInBsLTEgaGFzLXRleHQte3tsb2dDb2xvclttb2RlbC5zdGF0dXNdfX0gdHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgIFtuZ2JQb3BvdmVyXT1cImxvZ1N0YXR1c0RldGFpbHNcIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwMT1cIm5nYlBvcG92ZXJcIiBwbGFjZW1lbnQ9XCJsZWZ0XCIgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwMS5pc09wZW4oKSA/IHAxLmNsb3NlKCkgOiBwMS5vcGVuKHsgbW9kZWwsIGRhdGEgfSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cImxvZ0ljb25bbW9kZWwuc3RhdHVzXVwiPjwvZmEtaWNvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8c3BhbiBjbGFzcz1cInBsLTFcIiAqbmdJZj1cIm1vZGVsLm1vZGVsXCI+XG4gICAgICAoPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRvY3NMaW5rOyBjb250ZXh0OiB7JGltcGxpY2l0OiBtb2RlbC5tb2RlbH1cIj48L25nLWNvbnRhaW5lcj4pXG4gICAgPC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vVmFsdWU+LTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm90UmVjYWxjdWxhdGVkPm5vdCByZWNhbGN1bGF0ZWQ8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvZ0RldGFpbHMgbGV0LWxvZ3M9XCJsb2dzXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIiAqYmluZE9uY2U9XCJsb2dzXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1mdWxsd2lkdGhcIj5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZ3M/LnJlcXVpcmVtZW50c1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiByZXF1aXJlbWVudEtleXMobG9ncy5yZXF1aXJlbWVudHMpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDp7a2V5LCB2YWx1ZTpsb2dzLnJlcXVpcmVtZW50c1trZXldfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9ncz8ubG9nc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBsb2dzLmxvZ3MgfCBrZXlzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDprZXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwibG9nc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJpdC1tdC0yXCIgKm5nSWY9XCJsb2dzPy5taXNzaW5nTG9va3Vwcz8ubGVuZ3RoXCI+XG4gICAgICA8cD5PcHRpb25hbCBkYXRhIG1pc3Npbmc6PC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyIGRhdGEtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLWRhcmsgaXMtZnVsbHdpZHRoIGlzLXN0cmlwZWRcIj5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+RmlsZW5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+Q29sdW1uIFRpdGxlPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlJvdyAodGVybS5pZCk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgPHRib2R5IGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBsb2dzLm1pc3NpbmdMb29rdXBzXCI+XG4gICAgICAgICAgICAgIDx0ZD57e2RhdGEuZmlsZW5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57e2RhdGEuY29sdW1ufX08L3RkPlxuICAgICAgICAgICAgICA8dGQ+e3tkYXRhLnRlcm1JZH19PC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nTGluZVZhbHVlIGxldC1rZXk9XCJrZXlcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRWYWx1ZT5cbiAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi1taWRkbGVcIj57e3ZhbHVlfX08L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXF1aXJlbWVudExpbmtlZE5vZGUoa2V5LCB2YWx1ZSk7IGxldCBsaW5rZWROb2RlOyBlbHNlIGRlZmF1bHRWYWx1ZVwiPlxuICAgIDxoZS1ub2RlLWxpbmsgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCIgbGlua0NsYXNzPVwiaXMtZGFya1wiIFtub2RlXT1cImxpbmtlZE5vZGVcIiBbc2hvd0V4dGVybmFsTGlua109XCJ0cnVlXCI+PC9oZS1ub2RlLWxpbms+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dMaW5lIGxldC1rZXk9XCJrZXlcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICA8dHI+XG4gICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodCBjb3B5LWxvZ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCIgW25nU3dpdGNoXT1cImtleVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+e3trZXkgfCBrZXlUb0xhYmVsfX08L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbm9kZV90eXBlX2FsbG93ZWQnXCI+SXMgdGhlIGN1cnJlbnQgPGNvZGU+Tm9kZTwvY29kZT4gYWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2l0ZVR5cGVfYWxsb3dlZCdcIj5JcyB0aGUgY3VycmVudCA8Y29kZT5zaXRlVHlwZTwvY29kZT4gYWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJpbWFyeV9wcm9kdWN0X2lkX2FsbG93ZWQnXCI+SXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBwcm9kdWN0IDxjb2RlPkBpZDwvY29kZT4gYWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJpbWFyeV9wcm9kdWN0X3Rlcm1UeXBlX2FsbG93ZWQnXCI+SXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBwcm9kdWN0IDxjb2RlPnRlcm1UeXBlPC9jb2RlPiBhbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2dlb3NwYXRpYWxfZGF0YSdcIj5IYXMgZ2Vvc3BhdGlhbCBkYXRhIG5lY2Vzc2FyeSB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29udGFpbnNfZ2Vvc3BhdGlhbF9kYXRhJ1wiPkhhcyBnZW9zcGF0aWFsIGRhdGEgbmVjZXNzYXJ5IHRvIHJ1biB0aGlzIG1vZGVsPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW50X3NpemUnXCI+Q3VycmVudCBwb2x5Z29uIGFyZWE8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21heF9hcmVhX3NpemUnXCI+TWF4aW11bSBwb2x5Z29uIGFyZWEgdG8gcnVuIHRoaXMgbW9kZWw8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2JlbG93X21heF9hcmVhX3NpemUnXCI+UG9seWdvbiBiZWxvdyB0aGUgbWF4aW11bSBhcmVhPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyZWdpb25fZmFjdG9yJ1wiPkZhY3RvciBmcm9tIHJlZ2lvbiBsb29rdXA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGVzdGljaWRlc19jb21wbGV0ZSdcIj5QZXN0aWNpZGUgZGF0YSBhcmUgPGNvZGU+Y29tcGxldGU8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidoYXNfcGVzdGljaWRlc19pbnB1dHMnXCI+Q3ljbGUgY29udGFpbnMgPGNvZGU+cGVzdGljaWRlQUk8L2NvZGU+IElucHV0czwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWxsX3Blc3RpY2lkZUFJX2hhdmVfbG9va3VwX3ZhbHVlJ1wiPkFsbCA8Y29kZT5wZXN0aWNpZGVBSTwvY29kZT4gSW5wdXRzIGhhdmUgYSBsb29rdXAgdmFsdWU8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaGFzX2Nyb3BfcmVzaWR1ZV9idXJudCdcIj48Y29kZT5hYm92ZUdyb3VuZENyb3BSZXNpZHVlQnVybnQ8L2NvZGU+IGlzIHByZXNlbnQgYXMgUHJvZHVjdDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXF1aWRfc2x1cnJ5X3NsdWRnZV9QJ1wiPkxpcXVpZCwgU2x1cnJ5LCBhbmQgU2x1ZGdlIFA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxoZS1jbGlwYm9hcmQgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCIgY2xpcGJvYXJkQ2xhc3M9XCJpcy1zaXplLTcgaXMtcC0xXCIgW2ljb25dPVwiWydmYXInLCAnY2xvbmUnXVwiIFt2YWx1ZV09XCJrZXlcIiBbaGlkZVRleHRdPVwidHJ1ZVwiPjwvaGUtY2xpcGJvYXJkPlxuICAgIDwvdGQ+XG4gICAgPHRkPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVWYWx1ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmVWYWx1ZTsgY29udGV4dDp7a2V5LHZhbHVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxkaXYgKm5nSWY9XCJsb2dWYWx1ZUFycmF5KHZhbHVlKTsgbGV0IHZhbHVlQXJyYXk7IGVsc2Ugc2luZ2xlVmFsdWVcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1ib3JkZXJlZCBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgPHRoZWFkICpuZ0lmPVwidmFsdWVBcnJheVswXSB8IGlzT2JqZWN0XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCIgKm5nRm9yPVwibGV0IHYgb2YgdmFsdWVBcnJheVswXSB8IGtleXNcIj57e3Yua2V5fX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgdiBvZiB2YWx1ZUFycmF5XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlQXJyYXlWYWx1ZT5cbiAgICAgICAgICAgICAgICA8dGQ+e3t2fX08L3RkPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidiB8IGlzT2JqZWN0OyBlbHNlIHNpbmdsZUFycmF5VmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHZ2IG9mIHYgfCBrZXlzXCI+e3t2di52YWx1ZX19PC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RkPlxuICA8L3RyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dTdGF0dXNEZXRhaWxzIGxldC1tb2RlbD1cIm1vZGVsXCIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwibW9kZWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICAgICAgPHNwYW4+U3RhdHVzOjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPnt7bW9kZWwuc3RhdHVzfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZWwuc3RhdHVzID09PSBMb2dTdGF0dXMubm90UmVxdWlyZWQgJiYgbW9kZWwubG9ncz8uaXNfbm90X3JlbGV2YW50ID09PSAnVHJ1ZSdcIj5cbiAgICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kaXNjXCI+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8uc2l0ZVR5cGVfYWxsb3dlZCA9PT0gJ0ZhbHNlJ1wiPlRoZSA8Y29kZT5zaXRlVHlwZTwvY29kZT4gaXMgbm90IHJlbGV2YW50LjwvbGk+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8ucHJvZHVjdF9pZF9hbGxvd2VkID09PSAnRmFsc2UnXCI+VGhlIHByaW1hcnkgcHJvZHVjdCA8Y29kZT5AaWQ8L2NvZGU+IGlzIG5vdCByZWxldmFudC48L2xpPlxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzLmxvZ3M/LnByb2R1Y3RfdGVybVR5cGVfYWxsb3dlZCA9PT0gJ0ZhbHNlJ1wiPlRoZSBwcmltYXJ5IHByb2R1Y3QgPGNvZGU+dGVybVR5cGU8L2NvZGU+IGlzIG5vdCByZWxldmFudC48L2xpPlxuICAgICAgPC91bD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5sb2dzICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLm5vdFJlcXVpcmVkICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLnNraXBIaWVyYXJjaHlcIj5cbiAgICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kaXNjXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd1J1bk9yY2hlc3RyYXRvcj5cbiAgICAgICAgICA8bGkgY2xhc3M9XCJpcy1ydW4tb3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgICA8cCAqbmdJZj1cIm1vZGVsLmxvZ3M/LnNob3VsZFJ1blwiPkFsbCB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbWV0IHRvIHJ1biB0aGUgbW9kZWwuPC9wPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2RlbC5sb2dzPy5zaG91bGRSdW5cIj5cbiAgICAgICAgICAgICAgPHA+U29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbm90IG1ldCB0byBydW4gdGhlIG1vZGVsLjwvcD5cbiAgICAgICAgICAgICAgPHA+WW91IGNhbiBjbGljayBvbiB0aGUgbW9kZWwgbmFtZSBvbiB0aGUgbGVmdCB0byB2aWV3IHRoZSBkZWJ1Z2dpbmcgbG9ncy48L3A+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5sb2dzPy5sb2dzPy5lcnJvclwiPlxuICAgICAgICAgICAgICA8cD5UaGUgbW9kZWwgZmFpbGVkIHRvIHJ1biBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246PC9wPlxuICAgICAgICAgICAgICA8cD48Y29kZT57e21vZGVsLmxvZ3MubG9ncy5lcnJvcn19PC9jb2RlPjwvcD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPGxpIGNsYXNzPVwiaXMtbm8tcnVuLW9yY2hlc3RyYXRvclwiICpuZ0lmPVwibW9kZWwubG9ncz8uc2hvdWxkUnVuT3JjaGVzdHJhdG9yID09PSBmYWxzZTsgZWxzZSBzaG93UnVuT3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2RlbC5sb2dzLnJ1blJlcXVpcmVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi1ub2RlLXR5cGUtbm90LWFsbG93ZWRcIiAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8ubm9kZV90eXBlX2FsbG93ZWQgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICAgICAgVGhpcyBtb2RlbCBzaG91bGQgbm90IHJ1biBmb3Ige3tub2RlVHlwZSB8IHBsdXJhbGl6ZTowfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcnVuTm9Db25maWc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi1ub3QtZW1wdHlcIiAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8uaXNfZW1wdHkgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICAgICAgVGhlIHt7ZGF0YS50eXBlIHx8ICdibGFuayBub2RlJ319IHdpdGggVGVybSA8Y29kZT57e2RhdGEudGVybUlkfX08L2NvZGU+IGlzIGFscmVhZHkgcHJlc2VudCBvciBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgbW9kZWwuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5jb25maWc7IGVsc2UgcnVuTm9Db25maWdcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaXMtcnVuLXN0cmF0ZWd5LXt7bW9kZWwuY29uZmlnLnJ1blN0cmF0ZWd5fX1cIiBbbmdTd2l0Y2hdPVwibW9kZWwuY29uZmlnLnJ1blN0cmF0ZWd5XCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYWx3YXlzJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhZGRfa2V5X2lmX21pc3NpbmcnXCI+XG4gICAgICAgICAgICAgICAgV2Ugb25seSBnYXAtZmlsbCB0aGlzIGtleSBpZiBub3QgcHJlc2VudFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYWRkX2JsYW5rX25vZGVfaWZfbWlzc2luZydcIj5cbiAgICAgICAgICAgICAgICBXZSBvbmx5IGdhcC1maWxsIHRoaXMgQmxhbmsgTm9kZSBpZiBub3QgcHJlc2VudC5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8cCBjbGFzcz1cImlzLW10LTFcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ydW4td2l0aC1tZWFzdXJlZFwiICpuZ0lmPVwibW9kZWwuY29uZmlnLnJ1bkFyZ3M/LnJ1bk5vbk1lYXN1cmVkICYmIGhhc01ldGhvZFRpZXIoZGF0YS5vcmlnaW5hbCwgRW1pc3Npb25NZXRob2RUaWVyLm1lYXN1cmVkKVwiPlxuICAgICAgICAgICAgICAgIFRoZSA8Y29kZT57e21vZGVsLmNvbmZpZy52YWx1ZX19PC9jb2RlPiB3YXMgcmVwb3J0ZWQgYXMgbWVhc3VyZWQuXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9saT5cblxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzPy5yZXBsYWNlTG93ZXJUaWVyICE9PSB1bmRlZmluZWRcIj5cbiAgICAgICAgICA8c3Bhbj5UaGUgcmVjYWxjdWxhdGVkIDxiPm1ldGhvZFRpZXI8L2I+IHdhczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTEgaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwiIW1vZGVsLmxvZ3MucmVwbGFjZUxvd2VyVGllclwiPmxvd2VyIHRoYW48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xIGlzLXVuZGVybGluZWRcIiAqbmdJZj1cIm1vZGVsLmxvZ3MucmVwbGFjZUxvd2VyVGllclwiPmhpZ2hlciB0aGFuIG9yIGVxdWFsIHRvPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPnRoZSBvcmlnaW5hbCA8Yj5tZXRob2RUaWVyPC9iPi48L3NwYW4+XG4gICAgICAgIDwvbGk+XG5cbiAgICAgICAgPGxpIGNsYXNzPVwiaXMtbWVyZ2UtcmVwbGFjZUxvd2VyVGllclwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlTG93ZXJUaWVyXCI+XG4gICAgICAgICAgPHNwYW4+VGhlIHJlY2FsY3VsYXRlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7bW9kZWwuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnfX08L2I+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj53YXM8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGVsLmNvbmZpZy5tZXJnZUFyZ3NcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXVuZGVybGluZWRcIiAqbmdJZj1cIiFtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5sZXNzIHRoYW48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCIgKm5nSWY9XCJtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5tb3JlIHRoYW4gb3IgZXF1YWwgdG88L3NwYW4+XG4gICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJpcy1wbC0xXCI+e3ttb2RlbC5jb25maWcubWVyZ2VBcmdzLnJlcGxhY2VUaHJlc2hvbGRbMV0gKiAxMDB9fSU8L2I+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1vZGVsLmNvbmZpZy5tZXJnZUFyZ3NcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXVuZGVybGluZWRcIiAqbmdJZj1cIiFtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5ub3Qgc3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkXCI+c3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPmRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbDwvc3Bhbj5cbiAgICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7bW9kZWwuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnfX0uPC9iPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RvY3NMaW5rIGxldC1tb2RlbD5cbiAgPGEgW2hyZWZdPVwibW9kZWwuYXBpRG9jc1BhdGggfHwgbW9kZWwuZG9jUGF0aCB8fCBtb2RlbC5wYXRoXCIgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgPlxuICAgIDxzcGFuPkRvY3M8L3NwYW4+XG4gICAgPGZhLWljb24gY2xhc3M9XCJtbC0xXCIgaWNvbj1cImV4dGVybmFsLWxpbmstYWx0XCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBYyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFDTCxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUM1RixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBdUIsUUFBUSxFQUFRLFlBQVksRUFDMUYsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQzdHLG1CQUFtQixFQUNwQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUNpQyxTQUFTLEVBQTJCLGdCQUFnQixFQUFFLGVBQWUsRUFDM0csVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQTBDLGVBQWUsRUFDMUYsV0FBVyxFQUNsQixNQUFNLDBCQUEwQixDQUFDO0FBR2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIs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QUs7Z0JBR0UsT0FBTztzQkFEZCxLQUFLO2dCQUdFLGNBQWM7c0JBRHJCLEtBQUs7Z0JBR0Usa0JBQWtCO3NCQUR6QixLQUFLO2dCQUdFLEtBQUs7c0JBRFosS0FBSztnQkFHRSxlQUFlO3NCQUR0QixLQUFLO2dCQUdFLG9CQUFvQjtzQkFEM0IsS0FBSztnQkFHRSxPQUFPO3NCQURkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdCwgZmlsdGVyLCByZWR1Y2UsIHRvQXJyYXksIG1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgbWVyZ2VNYXAsIG1lcmdlQWxsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEN5Y2xlRnVuY3Rpb25hbFVuaXQsIEVtaXNzaW9uTWV0aG9kVGllciwgSVRlcm1KU09OTEQsIEpTT05MRCwgTm9kZVR5cGUsIFRlcm0sIFRlcm1UZXJtVHlwZSxcbiAgZW1pc3Npb25UZXJtVGVybVR5cGUsIGluZGljYXRvclRlcm1UZXJtVHlwZSwgaW5wdXRUZXJtVGVybVR5cGUsIG1lYXN1cmVtZW50VGVybVRlcm1UeXBlLCBwcmFjdGljZVRlcm1UZXJtVHlwZSxcbiAgcHJvZHVjdFRlcm1UZXJtVHlwZVxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBrZXlUb0xhYmVsIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuXG5pbXBvcnQge1xuICBJQmxhbmtOb2RlTG9nU3ViVmFsdWUsIElCbGFua05vZGVMb2csIExvZ1N0YXR1cywgSUNvbmZpZ01vZGVsLCBibGFua05vZGUsIGdyb3VwTG9nc0J5TW9kZWwsIGdyb3VwTG9nc0J5VGVybSxcbiAgbW9kZWxDb3VudCwgY29tcHV0ZVRlcm1zLCBsb2dWYWx1ZUFycmF5LCBJTm9kZVRlcm1Mb2dzLCBJTm9kZUxvZ3MsIG5vbkJsYW5rTm9kZSwgZ3JvdXBkTG9nc0J5S2V5LCBJTm9uQmxhbmtOb2RlTG9nLFxuICBJTG9nLCBjb21wdXRlS2V5c1xufSBmcm9tICcuL25vZGUtbG9ncy1tb2RlbHMubW9kZWwnO1xuaW1wb3J0IHsgSUpTT05Ob2RlLCBIZU5vZGVTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IEhlRW5naW5lU2VydmljZSwgSU1vZGVsLCBJT3JjaGVzdHJhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vZW5naW5lL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IG1hdGNoRXhhY3RRdWVyeSwgbWF0Y2hJZCwgbWF0Y2hUZXJtVHlwZSwgbWF0Y2hUeXBlIH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5tb2RlbCc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgYmFzZVVybCwgaXNFeHRlcm5hbCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyB0ZXJtVHlwZUxhYmVsIH0gZnJvbSAnLi4vLi4vdGVybXMvdGVybXMubW9kZWwnO1xuXG50eXBlIG5vZGVLZXkgPSAnaW5wdXRzJyB8ICdwcm9kdWN0cycgfCAnY29tcGxldGVuZXNzJyB8ICdwcmFjdGljZXMnIHwgJ2VtaXNzaW9ucycgfCAnZW1pc3Npb25zUmVzb3VyY2VVc2UnIHwgJ2ltcGFjdHMnIHwgJ2VuZHBvaW50cyc7XG5cbmNvbnN0IG5vZGVUeXBlc0xvd2VyQ2FzZSA9IE9iamVjdC52YWx1ZXMoTm9kZVR5cGUpLm1hcCh2ID0+IHYudG9Mb3dlckNhc2UoKSk7XG5cbmNvbnN0IGxvZ0ljb246IHtcbiAgW3N0YXR1cyBpbiBMb2dTdGF0dXNdPzogc3RyaW5nIHwgc3RyaW5nW107XG59ID0ge1xuICBbTG9nU3RhdHVzLnN1Y2Nlc3NdOiAnY2hlY2snLFxuICBbTG9nU3RhdHVzLmVycm9yXTogJ3RpbWVzJyxcbiAgW0xvZ1N0YXR1cy5za2lwSGllcmFyY2h5XTogWydmYXInLCAnY2lyY2xlJ10sXG4gIFtMb2dTdGF0dXMuZGF0YVByb3ZpZGVkXTogJ2NpcmNsZScsXG4gIFtMb2dTdGF0dXMubm90UmVxdWlyZWRdOiAnZG90LWNpcmNsZSdcbn07XG5cbmNvbnN0IGxvZ0NvbG9yOiB7XG4gIFtzdGF0dXMgaW4gTG9nU3RhdHVzXT86IHN0cmluZztcbn0gPSB7XG4gIFtMb2dTdGF0dXMuc3VjY2Vzc106ICdzdWNjZXNzJyxcbiAgW0xvZ1N0YXR1cy5lcnJvcl06ICdkYW5nZXInLFxuICBbTG9nU3RhdHVzLnNraXBIaWVyYXJjaHldOiAnZGFyaycsXG4gIFtMb2dTdGF0dXMuZGF0YVByb3ZpZGVkXTogJ2RhcmsnLFxuICBbTG9nU3RhdHVzLm5vdFJlcXVpcmVkXTogJ2dyZXknXG59O1xuXG5jb25zdCBtZXRob2RJZExhYmVsID0gKG1ldGhvZElkOiBzdHJpbmcsIG1vZGVsPzogSU1vZGVsKSA9PlxuICAoXG4gICAgbWV0aG9kSWRcbiAgICAgID8gKHtcbiAgICAgICAgJ2N5Y2xlL3RyYW5zZm9ybWF0aW9uJzogJ0RhdGEgRnJvbSBUcmFuc2Zvcm1hdGlvbicsXG4gICAgICAgIGltcGFjdF9hc3Nlc3NtZW50OiAnRGF0YSBGcm9tIEN5Y2xlJ1xuICAgICAgfSlbbWV0aG9kSWRdXG4gICAgICA6ICcnXG4gICkgfHwgKFxuICAgIG1ldGhvZElkLmluY2x1ZGVzKCcvJykgPyBtZXRob2RJZC5zcGxpdCgnLycpWzBdIDoga2V5VG9MYWJlbChtZXRob2RJZClcbiAgKTtcblxuY29uc3QgZ2V0TW9kZWxzQXQgPSAobG9nOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWUgfCBJQmxhbmtOb2RlTG9nLCBpbmRleDogbnVtYmVyKSA9PlxuICAoJ21vZGVsc0luU3ViVmFsdWVzJyBpbiBsb2cgPyAhbG9nLm1vZGVsc0luU3ViVmFsdWVzIHx8ICFsb2cuaXNPcGVuIDogdHJ1ZSkgJiYgbG9nLmNvbmZpZ01vZGVsc1tpbmRleF07XG5cbmNvbnN0IHJlcXVpcmVtZW50S2V5cyA9IChyZXF1aXJlbWVudHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pID0+XG4gIE9iamVjdC5rZXlzKHJlcXVpcmVtZW50cykuZmlsdGVyKGsgPT4gIW5vZGVUeXBlc0xvd2VyQ2FzZS5pbmNsdWRlcyhrKSk7XG5cbmNvbnN0IHJlcXVpcmVtZW50Q29sb3IgPSAodmFsdWU6IGFueSkgPT4gIXZhbHVlIHx8IFsnTm9uZScsICdGYWxzZScsICcwJywgJzAuMCddLmluY2x1ZGVzKHZhbHVlKSA/ICdkYW5nZXInIDogJ3doaXRlJztcblxuY29uc3QgcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXk6IHtcbiAgW2tleTogc3RyaW5nXTogKHZhbHVlOiBzdHJpbmcpID0+IFBhcnRpYWw8SlNPTkxEPE5vZGVUeXBlPj47XG59ID0ge1xuICByZWxhdGVkX2N5Y2xlczogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSwgJ0BpZCc6IHYgfSksXG4gIGN5Y2xlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLCAnQGlkJzogdiB9KSxcbiAgaW1wYWN0X2Fzc2Vzc21lbnRfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCwgJ0BpZCc6IHYgfSksXG4gIHNpdGVfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuU2l0ZSwgJ0BpZCc6IHYgfSksXG4gIHNvdXJjZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsICdAaWQnOiB2IH0pXG59O1xuXG5jb25zdCByZXF1aXJlbWVudExpbmtlZE5vZGUgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+XG4gIGtleSBpbiByZXF1aXJlbWVudExpbmtlZE5vZGVCeUtleSAmJlxuICByZXF1aXJlbWVudExpbmtlZE5vZGVCeUtleVtrZXldKHZhbHVlKTtcblxuY29uc3QgaXNTeXN0ZW1Cb3VuZGFyeSA9IChcbiAgeyBpc1JlY2FsY3VsYXRlZCwgaXNSZXF1aXJlZCB9OiBQaWNrPElMb2cgfCBJQmxhbmtOb2RlTG9nU3ViVmFsdWUsICdpc1JlY2FsY3VsYXRlZCcgfCAnaXNSZXF1aXJlZCc+XG4pID0+IFtcbiAgaXNSZWNhbGN1bGF0ZWQsXG4gIGlzUmVxdWlyZWRcbl0uc29tZShCb29sZWFuKTtcblxuY29uc3QgaXNHZW5lcmljVGVybSA9ICh0ZXJtSWQ6IHN0cmluZykgPT4gW1xuICB0ZXJtSWQuc3RhcnRzV2l0aCgnZXhjcmV0YScpXG5dLmV2ZXJ5KEJvb2xlYW4pO1xuXG5jb25zdCBleHRyYVRlcm1JZHNGcm9tQ29uZmlnID0gKGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZywga2V5OiBub2RlS2V5KSA9PlxuICBjb25maWcubW9kZWxzLmZsYXQoKS5maWx0ZXIobSA9PiBtLmtleSA9PT0ga2V5KS5tYXAobSA9PiBtLnZhbHVlKS5maWx0ZXIoQm9vbGVhbikuZmlsdGVyKHYgPT4gIWlzR2VuZXJpY1Rlcm0odikpO1xuXG5jb25zdCBtYXRjaFRlcm1UeXBlRnJvbUtleToge1xuICBba2V5OiBzdHJpbmddOiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIHByb2R1Y3RzOiBwcm9kdWN0VGVybVRlcm1UeXBlLnRlcm0sXG4gIGlucHV0czogaW5wdXRUZXJtVGVybVR5cGUudGVybSxcbiAgbWVhc3VyZW1lbnRzOiBtZWFzdXJlbWVudFRlcm1UZXJtVHlwZS50ZXJtLFxuICBwcmFjdGljZXM6IHByYWN0aWNlVGVybVRlcm1UeXBlLnRlcm0sXG4gIGVtaXNzaW9uczogZW1pc3Npb25UZXJtVGVybVR5cGUudGVybSxcbiAgZW1pc3Npb25zUmVzb3VyY2VVc2U6IGluZGljYXRvclRlcm1UZXJtVHlwZS50ZXJtLFxuICBpbXBhY3RzOiBpbmRpY2F0b3JUZXJtVGVybVR5cGUudGVybSxcbiAgZW5kcG9pbnRzOiBpbmRpY2F0b3JUZXJtVGVybVR5cGUudGVybVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtbm9kZS1sb2dzLW1vZGVscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVMb2dzTW9kZWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBsb2dzOiBzdHJpbmc7XG4gIHByaXZhdGUgYWxsQmxhbmtOb2RlczogKElCbGFua05vZGVMb2cgfCBJTm9uQmxhbmtOb2RlTG9nKVtdID0gW107XG4gIHByaXZhdGUgbWV0aG9kc0J5SWQ/OiB7XG4gICAgW2lkOiBzdHJpbmddOiBJVGVybUpTT05MRDtcbiAgfTtcbiAgcHJpdmF0ZSB0ZXJtc0J5SWQ6IHtcbiAgICBbaWQ6IHN0cmluZ106IElUZXJtSlNPTkxEO1xuICB9ID0ge307XG5cbiAgQElucHV0KClcbiAgcHJpdmF0ZSBub2RlPzogSUpTT05Ob2RlO1xuICBASW5wdXQoKVxuICBwcml2YXRlIG5vZGVLZXk/OiBub2RlS2V5O1xuICBASW5wdXQoKVxuICBwcml2YXRlIG9yaWdpbmFsVmFsdWVzOiBibGFua05vZGVbXSB8IG5vbkJsYW5rTm9kZSA9IFtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHJlY2FsY3VsYXRlZFZhbHVlczogYmxhbmtOb2RlW10gfCBub25CbGFua05vZGUgPSBbXTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSB0ZXJtczogSVRlcm1KU09OTERbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGZpbHRlclRlcm1UeXBlcz86IFRlcm1UZXJtVHlwZVtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGZpbHRlclRlcm1UeXBlc0xhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGxvZ3NLZXk/OiBzdHJpbmc7XG5cbiAgcHVibGljIGxvZ3NVcmw/OiBzdHJpbmc7XG4gIHB1YmxpYyBiYXNlVXJsID0gYmFzZVVybCgpO1xuICBwdWJsaWMgaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWwoKTtcbiAgcHVibGljIEN5Y2xlRnVuY3Rpb25hbFVuaXQgPSBDeWNsZUZ1bmN0aW9uYWxVbml0O1xuICBwdWJsaWMgRW1pc3Npb25NZXRob2RUaWVyID0gRW1pc3Npb25NZXRob2RUaWVyO1xuICBwdWJsaWMgTG9nU3RhdHVzID0gTG9nU3RhdHVzO1xuICBwdWJsaWMgbG9nSWNvbiA9IGxvZ0ljb247XG4gIHB1YmxpYyBsb2dDb2xvciA9IGxvZ0NvbG9yO1xuICBwdWJsaWMgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7XG4gIHB1YmxpYyBnZXRNb2RlbHNBdCA9IGdldE1vZGVsc0F0O1xuICBwdWJsaWMgcmVxdWlyZW1lbnRLZXlzID0gcmVxdWlyZW1lbnRLZXlzO1xuICBwdWJsaWMgcmVxdWlyZW1lbnRDb2xvciA9IHJlcXVpcmVtZW50Q29sb3I7XG4gIHB1YmxpYyBsb2dWYWx1ZUFycmF5ID0gbG9nVmFsdWVBcnJheTtcbiAgcHVibGljIHJlcXVpcmVtZW50TGlua2VkTm9kZSA9IHJlcXVpcmVtZW50TGlua2VkTm9kZTtcbiAgcHVibGljIGlzU3lzdGVtQm91bmRhcnkgPSBpc1N5c3RlbUJvdW5kYXJ5O1xuICBwdWJsaWMgbG9hZGluZyA9IHRydWU7XG4gIHB1YmxpYyBub2RlVHlwZTogTm9kZVR5cGU7XG4gIHB1YmxpYyBibGFua05vZGVzOiAoSUJsYW5rTm9kZUxvZyB8IElOb25CbGFua05vZGVMb2cpW10gPSBbXTtcbiAgcHVibGljIG1ldGhvZE1vZGVsc0NvdW50ID0gMDtcbiAgcHVibGljIG9ubHlSZXF1aXJlZCA9IHRydWU7XG4gIHB1YmxpYyBzaG93TGVnZW5kID0gdHJ1ZTtcblxuICBwdWJsaWMgdGVybT86IHN0cmluZztcbiAgcHVibGljIGFsbFRlcm1zOiAoVGVybSB8IElUZXJtSlNPTkxEKVtdID0gW107XG4gIHB1YmxpYyBzdWdnZXN0VGVybSA9ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKHYgPT4gdGhpcy5zdWdnZXN0QnlUZXJtKHYpKSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm9kZVNlcnZpY2U6IEhlTm9kZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbmdpbmVTZXJ2aWNlOiBIZUVuZ2luZVNlcnZpY2VcbiAgKSB7IH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvZ3NVcmwgPSB0aGlzLm5vZGVTZXJ2aWNlLm5vZGVMb2dzVXJsKHRoaXMubm9kZSk7XG4gICAgLy8gc2F2ZSBhcyBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZCBcInJlc2VydmVkIHlpZWxkIGtleXdvcmRcIiBpc3N1ZVxuICAgIHRoaXMubG9ncyA9IGF3YWl0IHRoaXMuZ2V0TG9ncygpO1xuICAgIGNvbnN0IGdyb3VwZWRMb2dzID0gZ3JvdXBMb2dzQnlNb2RlbCh0aGlzLmxvZ3MpO1xuICAgIGNvbnN0IGxvZ3MgPSB0aGlzLmxvZ3NLZXkgPyBncm91cGVkTG9nc1t0aGlzLmxvZ3NLZXldIDogZ3JvdXBlZExvZ3M7XG5cbiAgICB0aGlzLm5vZGVUeXBlID0gdGhpcy5ub2RlWydAdHlwZSddIHx8IHRoaXMubm9kZS50eXBlO1xuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMuZW5naW5lU2VydmljZS5vY2hlc3RyYXRvckNvbmZpZyh0aGlzLm5vZGVUeXBlLCB0aGlzLm5vZGVbJ0BpZCddIHx8IHRoaXMubm9kZS5pZCk7XG5cbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgIGJvb2w6IHtcbiAgICAgICAgbXVzdDogW1xuICAgICAgICAgIG1hdGNoVHlwZShOb2RlVHlwZS5UZXJtKSxcbiAgICAgICAgICBtYXRjaFRlcm1UeXBlKFRlcm1UZXJtVHlwZS5tb2RlbClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5tZXRob2RzQnlJZCA9IGF3YWl0IGZyb20obW9kZWxzKS5waXBlKFxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcbiAgICAgIGRpc3RpbmN0KHYgPT4gdlsnQGlkJ10pLFxuICAgICAgcmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3VyclsnQGlkJ11dOiBjdXJyIH0pLCB7fSlcbiAgICApLnRvUHJvbWlzZSgpO1xuXG4gICAgLy8gZnJvbSBgbW9kZWwtbGlua3MuanNvbmAgZmlsZVxuICAgIGNvbnN0IGVuZ2luZU1vZGVscyA9IGF3YWl0IHRoaXMuZW5naW5lU2VydmljZS5tb2RlbHMoKTtcblxuICAgIHRoaXMuaXNCbGFua05vZGVzID9cbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0JsYW5rTm9kZXMobG9ncywgZW5naW5lTW9kZWxzLCBjb25maWcpIDpcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc05vbkJsYW5rTm9kZXMobG9ncywgZW5naW5lTW9kZWxzLCBjb25maWcpO1xuXG4gICAgdGhpcy5maWx0ZXJSZXN1bHRzKCk7XG5cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9ncygpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlU2VydmljZS5nZXRMb2codGhpcy5ub2RlKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3VnZ2VzdEJ5VGVybSh0ZXJtOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmFsbFRlcm1zKS5waXBlKFxuICAgICAgbWFwKHYgPT4gdi5uYW1lKSxcbiAgICAgIGZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtLnRvTG93ZXJDYXNlKCkpKSxcbiAgICAgIHRvQXJyYXkoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlYXJjaFRlcm1zKHF1ZXJ5OiBhbnkpIHtcbiAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2g8SVRlcm1KU09OTEQsIE5vZGVUeXBlLlRlcm0+KHtcbiAgICAgIGZpZWxkczogWydAdHlwZScsICdAaWQnLCAnbmFtZSddLFxuICAgICAgbGltaXQ6IDEwMDAwLFxuICAgICAgcXVlcnlcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0JsYW5rTm9kZXMobG9nczogSU5vZGVMb2dzIHwgSU5vZGVUZXJtTG9ncywgZW5naW5lTW9kZWxzOiBJTW9kZWxbXSwgY29uZmlnOiBJT3JjaGVzdHJhdG9yQ29uZmlnKSB7XG4gICAgY29uc3QgZXh0cmFUZXJtSWRzID0gZXh0cmFUZXJtSWRzRnJvbUNvbmZpZyhjb25maWcsIHRoaXMubm9kZUtleSk7XG4gICAgY29uc3QgbWF0Y2hUZXJtVHlwZXMgPSAobWF0Y2hUZXJtVHlwZUZyb21LZXlbdGhpcy5ub2RlS2V5XSB8fCBbXSkubWFwKG1hdGNoVGVybVR5cGUpO1xuICAgIGNvbnN0IGV4dHJhVGVybXMgPSBhd2FpdCB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgIGJvb2w6IHtcbiAgICAgICAgbXVzdDogW1xuICAgICAgICAgIG1hdGNoVHlwZShOb2RlVHlwZS5UZXJtKSxcbiAgICAgICAgICBtYXRjaFRlcm1UeXBlcy5sZW5ndGggPyB7XG4gICAgICAgICAgICBib29sOiB7XG4gICAgICAgICAgICAgIHNob3VsZDogbWF0Y2hUZXJtVHlwZXMsXG4gICAgICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSA6IG51bGxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbiksXG4gICAgICAgIHNob3VsZDogZXh0cmFUZXJtSWRzLm1hcChtYXRjaElkKSxcbiAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYWxsVGVybXMgPSBhd2FpdCBjb21wdXRlVGVybXMoXG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzIGFzIGJsYW5rTm9kZVtdLCB0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcyBhcyBibGFua05vZGVbXSwgdGhpcy50ZXJtcywgdGhpcy5maWx0ZXJUZXJtVHlwZXMsIGV4dHJhVGVybXNcbiAgICApO1xuICAgIGNvbnN0IG1hcEZ1bmMgPSBncm91cExvZ3NCeVRlcm0oXG4gICAgICB0aGlzLm5vZGVUeXBlLCBsb2dzLCBlbmdpbmVNb2RlbHMsIGNvbmZpZywgdGhpcy5vcmlnaW5hbFZhbHVlcyBhcyBibGFua05vZGVbXSwgdGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMgYXMgYmxhbmtOb2RlW10sIHRoaXMubm9kZUtleVxuICAgICk7XG4gICAgY29uc3QgYWxsQmxhbmtOb2RlcyA9IHRoaXMuYWxsVGVybXMuZmxhdE1hcChtYXBGdW5jKTtcbiAgICB0aGlzLm1ldGhvZE1vZGVsc0NvdW50ID0gbW9kZWxDb3VudChhbGxCbGFua05vZGVzKTtcblxuICAgIHRoaXMudGVybXNCeUlkID0gYXdhaXQgb2YoYWxsQmxhbmtOb2RlcykucGlwZShcbiAgICAgIG1lcmdlTWFwKHYgPT4gdi5mbGF0TWFwKHZ2ID0+IHZ2LnN1YlZhbHVlcykpLFxuICAgICAgbWFwKHYgPT4gdi5pZCksXG4gICAgICBkaXN0aW5jdCgpLFxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcbiAgICAgIHRvQXJyYXkoKSxcbiAgICAgIG1lcmdlTWFwKGlkcyA9PiBmcm9tKHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgICBib29sOiB7XG4gICAgICAgICAgbXVzdDogW1xuICAgICAgICAgICAgbWF0Y2hUeXBlKE5vZGVUeXBlLlRlcm0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzaG91bGQ6IGlkcy5tYXAoaWQgPT4gbWF0Y2hFeGFjdFF1ZXJ5KCdAaWQnLCBpZCkpLFxuICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSksXG4gICAgICBtZXJnZUFsbCgpLFxuICAgICAgcmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3VyclsnQGlkJ11dOiBjdXJyIH0pLCB7fSlcbiAgICApLnRvUHJvbWlzZSgpO1xuXG4gICAgdGhpcy5hbGxCbGFua05vZGVzID0gYWxsQmxhbmtOb2RlcztcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc05vbkJsYW5rTm9kZXMobG9nczogSU5vZGVMb2dzIHwgSU5vZGVUZXJtTG9ncywgZW5naW5lTW9kZWxzOiBJTW9kZWxbXSwgY29uZmlnOiBJT3JjaGVzdHJhdG9yQ29uZmlnKSB7XG4gICAgY29uc3QgbWFwRnVuYyA9IGdyb3VwZExvZ3NCeUtleShcbiAgICAgIHRoaXMubm9kZVR5cGUsIGxvZ3MsIGVuZ2luZU1vZGVscywgdGhpcy5vcmlnaW5hbFZhbHVlcyBhcyBub25CbGFua05vZGUsIHRoaXMucmVjYWxjdWxhdGVkVmFsdWVzIGFzIG5vbkJsYW5rTm9kZVxuICAgICk7XG4gICAgY29uc3Qga2V5cyA9IGNvbXB1dGVLZXlzKHRoaXMub3JpZ2luYWxWYWx1ZXMgYXMgbm9uQmxhbmtOb2RlLCB0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcyBhcyBub25CbGFua05vZGUpO1xuICAgIGNvbnN0IGFsbEJsYW5rTm9kZXMgPSBrZXlzLmZsYXRNYXAobWFwRnVuYyk7XG4gICAgdGhpcy5hbGxCbGFua05vZGVzID0gYWxsQmxhbmtOb2RlcztcbiAgICB0aGlzLm1ldGhvZE1vZGVsc0NvdW50ID0gMTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNCbGFua05vZGVzKCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMub3JpZ2luYWxWYWx1ZXMpIHx8IEFycmF5LmlzQXJyYXkodGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlCbGFua05vZGUoX2luZGV4OiBudW1iZXIsIG5vZGU6IGFueSkge1xuICAgIHJldHVybiBub2RlLnRlcm1JZCB8fCBub2RlLmtleTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyZWRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlclRlcm1UeXBlc0xhYmVsIHx8IHRoaXMuZmlsdGVyVGVybVR5cGVzPy5tYXAodGVybVR5cGVMYWJlbCkuam9pbignICYgJyk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckJsYW5rTm9kZSh7IHRlcm06IHsgbmFtZSB9LCBzdWJWYWx1ZXMsIC4uLmxvZyB9OiBJQmxhbmtOb2RlTG9nKSB7XG4gICAgcmV0dXJuIHRoaXMudGVybVxuICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXJtLnRvTG93ZXJDYXNlKCkpXG4gICAgICA6IChcbiAgICAgICAgIXRoaXMuZmlsdGVyVGVybVR5cGVzPy5sZW5ndGggfHxcbiAgICAgICAgIXRoaXMub25seVJlcXVpcmVkIHx8IGlzU3lzdGVtQm91bmRhcnkobG9nKSB8fCBzdWJWYWx1ZXMuc29tZShpc1N5c3RlbUJvdW5kYXJ5KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJSZXN1bHRzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ibGFua05vZGVzID0gdGhpcy5hbGxCbGFua05vZGVzLmZpbHRlcihsb2cgPT4gISgndGVybScgaW4gbG9nKSB8fCB0aGlzLmZpbHRlckJsYW5rTm9kZShsb2cpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRob2ROYW1lKHsgbWV0aG9kSWQsIG1vZGVsIH06IElDb25maWdNb2RlbCkge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZHNCeUlkW21ldGhvZElkXT8ubmFtZSB8fCBtZXRob2RJZExhYmVsKG1ldGhvZElkLCBtb2RlbCk7XG4gIH1cblxuICBwdWJsaWMgaGFzTWV0aG9kVGllcih2YWx1ZXM6IGJsYW5rTm9kZVtdLCBtZXRob2RUaWVyOiBFbWlzc2lvbk1ldGhvZFRpZXIpIHtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUodiA9PiAnbWV0aG9kVGllcicgaW4gdiAmJiB2Lm1ldGhvZFRpZXIgPT09IG1ldGhvZFRpZXIpO1xuICB9XG5cbiAgcHVibGljIHRlcm1CeUlkKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50ZXJtc0J5SWRbaWRdIHx8IHtcbiAgICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgICAnQGlkJzogaWQsXG4gICAgICBuYW1lOiB0ZXJtVHlwZUxhYmVsKGlkKVxuICAgIH0gYXMgSVRlcm1KU09OTEQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uYWxVbml0KCkge1xuICAgIHJldHVybiAodGhpcy5ub2RlIGFzIGFueSk/LmZ1bmN0aW9uYWxVbml0IGFzIEN5Y2xlRnVuY3Rpb25hbFVuaXQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJweC0zIHBiLTNcIj5cbiAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LXJpZ2h0IG1iLTJcIiAqbmdJZj1cIiFpc0V4dGVybmFsXCI+XG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiAqbmdJZj1cImxvZ3NVcmxcIiBbaHJlZl09XCJsb2dzVXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiZXh0ZXJuYWwtbGluay1hbHRcIj48L2ZhLWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5PcGVuIEZ1bGwgTG9nczwvc3Bhbj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuXG4gIDxoZS1kYXRhLXRhYmxlIGNsYXNzPVwibWItMSBpcy1zbWFsbFwiIFtzbWFsbF09XCJ0cnVlXCIgbWF4SGVpZ2h0PVwiMzIwXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiICpuZ0lmPVwiYWxsVGVybXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZCBoYXMtaWNvbnMtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dCBzZWFyY2gtaW5wdXQgaXMtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0ZXJtXCIgbmFtZT1cInRlcm1cIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYnkgbmFtZVwiXG4gICAgICAgICAgICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInN1Z2dlc3RUZXJtXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c0ZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RJdGVtKT1cImZpbHRlclJlc3VsdHMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaGlkZGVuXT1cIiF0ZXJtXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0ZXJtID0gJyc7IGZpbHRlclJlc3VsdHMoKTtcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggKm5nSWY9XCJpc0JsYW5rTm9kZXNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcHItMVwiPlVuaXRzPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+KHBlciA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBbbmdTd2l0Y2hdPVwiZnVuY3Rpb25hbFVuaXRcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ3ljbGVGdW5jdGlvbmFsVW5pdFsnMSBoYSddXCI+aGVjdGFyZTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+a2cgcHJvZHVjdDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+KTwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aD5PcmlnaW5hbDwvdGg+XG4gICAgICAgICAgPHRoPlJlY2FsY3VsYXRlZDwvdGg+XG4gICAgICAgICAgPHRoICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+RGlmZmVyZW5jZTwvdGg+XG4gICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIG1ldGhvZE1vZGVsc0NvdW50IHwgdGltZXM7IGxldCBpID0gaW5kZXhcIj4oe3tpICsgMX19KTwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8dHIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLXRleHQtY2VudGVyZWRcIiBjb2xzcGFuPVwiNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LWNlbnRlciBweS0zXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJzcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgKm5nSWY9XCIhbG9hZGluZyAmJiBibGFua05vZGVzLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImhhcy10ZXh0LWNlbnRlcmVkXCIgY29sc3Bhbj1cIjZcIj5cbiAgICAgICAgICAgIDxzcGFuPk5vIGRhdGE8L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmxhbmtOb2RlIG9mIGJsYW5rTm9kZXM7IHRyYWNrQnk6IHRyYWNrQnlCbGFua05vZGVcIj5cbiAgICAgICAgICA8dHIgW2NsYXNzLmhhcy1zdWItcm93c109XCJibGFua05vZGUuY2FuT3BlblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0IGlzLW5vd3JhcFwiIFthdHRyLnRpdGxlXT1cImJsYW5rTm9kZS50ZXJtPy5uYW1lIHx8IGJsYW5rTm9kZS5rZXlcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHByLTIgb3Blbi1ub2RlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmxhbmtOb2RlLmlzT3BlbiA9ICFibGFua05vZGUuaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImJsYW5rTm9kZS5jYW5PcGVuXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImJsYW5rTm9kZS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1wcmUtd3JhcFwiICpuZ0lmPVwiYmxhbmtOb2RlLnRlcm1cIiBbbm9kZV09XCJibGFua05vZGUudGVybVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwiYmxhbmtOb2RlLnRlcm0ubmFtZSB8IGNvbXBvdW5kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJibGFua05vZGUua2V5XCI+e3tibGFua05vZGUua2V5fX08L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtbm93cmFwXCIgW2lubmVySHRtbF09XCJibGFua05vZGUudGVybT8udW5pdHMgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9yaWdpbmFsVmFsdWU+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tibGFua05vZGUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsYW5rTm9kZS5hbGxQYXJhbGxlbDsgZWxzZSBkZWZhdWx0T3JpZ2luYWxWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGJsYW5rTm9kZS5jb25maWdNb2RlbHNbMF1cIj57e2JsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gfCBwcmVjaXNpb246MyB8IGRlZmF1bHQ6Jy0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWJsYW5rTm9kZS5pc09yaWdpbmFsIHx8IGJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZDsgZWxzZSBub3RSZWNhbGN1bGF0ZWRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZWNhbGN1bGF0ZWRWYWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7YmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlIHwgcHJlY2lzaW9uOjMgfCBkZWZhdWx0OictJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsYW5rTm9kZS5hbGxQYXJhbGxlbDsgZWxzZSBkZWZhdWx0UmVjYWxjdWxhdGVkVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGJsYW5rTm9kZS5jb25maWdNb2RlbHNbMF1cIj57e2JsYW5rTm9kZS5yZWNhbGN1bGF0ZWRWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdIHwgcHJlY2lzaW9uOjMgfCBkZWZhdWx0OictJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzQmxhbmtOb2Rlc1wiIGNsYXNzPVwiaXMtbm93cmFwXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERlbHRhVmFsdWU+XG4gICAgICAgICAgICAgICAgPGhlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGEgKm5nSWY9XCJibGFua05vZGUub3JpZ2luYWwubGVuZ3RoICYmIGJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZDsgZWxzZSBub1ZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW29yaWdpbmFsVmFsdWVdPVwiYmxhbmtOb2RlLm9yaWdpbmFsVmFsdWVcIlxuICAgICAgICAgICAgICAgID48L2hlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGE+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibGFua05vZGUuYWxsUGFyYWxsZWw7IGVsc2UgZGVmYXVsdERlbHRhVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBibGFua05vZGUuY29uZmlnTW9kZWxzWzBdXCI+XG4gICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YSAqbmdJZj1cImJsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gIT09IG51bGwgJiYgYmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gIT09IG51bGw7IGVsc2Ugbm9WYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcmlnaW5hbFZhbHVlXT1cImJsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF1cIlxuICAgICAgICAgICAgICAgICAgPjwvaGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDoge2RhdGE6IGJsYW5rTm9kZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3ViVmFsdWUgb2YgYmxhbmtOb2RlLmtleXNcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5zdWJWYWx1ZXM/Lmxlbmd0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0IGlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcGwtMyBwci0xIGZpZWxkLW5vZGVcIj5GaWVsZDo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtcHJlLXdyYXBcIiAqbmdJZj1cImJsYW5rTm9kZS50eXBlXCJcbiAgICAgICAgICAgICAgICBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGJsYW5rTm9kZS50eXBlICsgJyMnICsgc3ViVmFsdWUua2V5XCIgdGFyZ2V0PVwiX2JsYW5rXCIgW3RpdGxlXT1cInN1YlZhbHVlLmtleVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e3N1YlZhbHVlLmtleX19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcFwiICpuZ0lmPVwiIWJsYW5rTm9kZS50eXBlXCI+e3tzdWJWYWx1ZS5rZXl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXNcIj48L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgIT09IG51bGw7IGVsc2Ugbm9WYWx1ZVwiPnt7c3ViVmFsdWUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3ViVmFsdWUuaXNSZWNhbGN1bGF0ZWQgfHwgc3ViVmFsdWUua2V5ID09PSAnaW1wYWN0QXNzZXNzbWVudCc7IGVsc2Ugbm90UmVjYWxjdWxhdGVkXCI+XG4gICAgICAgICAgICAgICAge3tzdWJWYWx1ZS5yZWNhbGN1bGF0ZWRWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+LTwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7ZGF0YTogc3ViVmFsdWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN1YlZhbHVlIG9mIGJsYW5rTm9kZS5zdWJWYWx1ZXNcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcCBwbC0zXCI+e3tzdWJWYWx1ZS5rZXkgfCBrZXlUb0xhYmVsfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YlZhbHVlLmlkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcHItMVwiPjo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzdWJWYWx1ZS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCIgKm5nU3dpdGNoQ2FzZT1cIidiYWNrZ3JvdW5kRGF0YSdcIj57e3N1YlZhbHVlLmlkIHwga2V5VG9MYWJlbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayAqbmdTd2l0Y2hEZWZhdWx0IGNsYXNzPVwiaXMtYmxvY2sgcGwtNFwiIFtub2RlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKVwiIFthdHRyLnRpdGxlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwidGVybUJ5SWQoc3ViVmFsdWUuaWQpLm5hbWUgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ub3dyYXBcIiAqbmdJZj1cInN1YlZhbHVlLnNob3dVbml0c1wiIFtpbm5lckh0bWxdPVwiYmxhbmtOb2RlLnRlcm0/LnVuaXRzIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgIT09IG51bGw7IGVsc2Ugbm9WYWx1ZVwiPnt7c3ViVmFsdWUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3ViVmFsdWUuaXNSZWNhbGN1bGF0ZWQ7IGVsc2Ugbm90UmVjYWxjdWxhdGVkXCI+XG4gICAgICAgICAgICAgICAge3tzdWJWYWx1ZS5yZWNhbGN1bGF0ZWRWYWx1ZSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzXCI+LTwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7ZGF0YTogc3ViVmFsdWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvaGUtZGF0YS10YWJsZT5cblxuICA8ZGl2IGNsYXNzPVwiaXMtc2l6ZS03IGlzLWl0YWxpY1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLXZhcmlhYmxlIGlzLTEgbXktMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgcHItMlwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXNob3dMZWdlbmRcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInNob3dMZWdlbmRcIj48L2ZhLWljb24+XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCI+TGVnZW5kOjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8dWwgY2xhc3M9XCJjb250ZW50IHBsLTJcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFzaG93TGVnZW5kXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhdHVzIG9mIExvZ1N0YXR1cyB8IGtleXNcIj5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImxvZ0ljb25bc3RhdHVzLnZhbHVlXVwiIGNsYXNzPVwiaGFzLXRleHQte3tsb2dDb2xvcltzdGF0dXMudmFsdWVdfX1cIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwibG9nSWNvbltzdGF0dXMudmFsdWVdXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj57e3N0YXR1cy52YWx1ZX19PC9zcGFuPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBoYXMtdGV4dC1yaWdodFwiICpuZ0lmPVwiZmlsdGVyZWRUeXBlXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImlzLWlubGluZS1ibG9jayBjaGVja2JveFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNlbGVjdG9yXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwib25seVJlcXVpcmVkXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsdGVyUmVzdWx0cygpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXRlcm1cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5TaG93IG9ubHkge3tmaWx0ZXJlZFR5cGUgfCBwbHVyYWxpemV9fSBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCBIZXN0aWEgc3lzdGVtIGJvdW5kYXJ5PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjYmxhbmtOb2RlTW9kZWxzIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8bmctdGVtcGxhdGUgI25vdEluU3lzdGVtQm91bmRhcnk+XG4gICAgPHRkIFthdHRyLmNvbHNwYW5dPVwibWV0aG9kTW9kZWxzQ291bnRcIj5cbiAgICAgIDxzcGFuPk5vdCBpbiBIZXN0aWEgc3lzdGVtIGJvdW5kYXJ5PC9zcGFuPlxuICAgIDwvdGQ+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU3lzdGVtQm91bmRhcnkoZGF0YSk7IGVsc2Ugbm9WYWx1ZVwiPlxuICAgIDx0ZCBjbGFzcz1cImJsYW5rLW5vZGUtaW5kZXgte3tpfX1cIiAqbmdGb3I9XCJsZXQgYyBvZiBtZXRob2RNb2RlbHNDb3VudCB8IHRpbWVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0TW9kZWxzQXQoZGF0YSwgaSk7IGxldCBtb2RlbHM7IGVsc2Ugbm9WYWx1ZVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgI21vZGVsU2VyaWU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsOyBjb250ZXh0OiB7bW9kZWw6bW9kZWxzLCBkYXRhfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibW9kZWxzIHwgaXNBcnJheTsgZWxzZSBtb2RlbFNlcmllXCI+XG4gICAgICAgICAgPHAgKm5nRm9yPVwibGV0IG1vZGVsIG9mIG1vZGVsc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsOyBjb250ZXh0OiB7bW9kZWwsIGRhdGF9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdGQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNibGFua05vZGVNb2RlbCBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcFwiXG4gICAgW2NsYXNzLnRyaWdnZXItcG9wb3Zlcl09XCJtb2RlbC5zaG93TG9nc1wiXG4gICAgW25nYlBvcG92ZXJdPVwibG9nRGV0YWlsc1wiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwPVwibmdiUG9wb3ZlclwiIHBsYWNlbWVudD1cImxlZnRcIiBjb250YWluZXI9XCJib2R5XCJcbiAgICAoY2xpY2spPVwicC5pc09wZW4oKSA/IHAuY2xvc2UoKSA6IChtb2RlbC5zaG93TG9ncyA/IHAub3Blbih7IGxvZ3M6IG1vZGVsLmxvZ3MgfSkgOiBudWxsKVwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImlzLWNhcGl0YWxpemVkXCI+e3ttZXRob2ROYW1lKG1vZGVsKX19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiICpuZ0lmPVwibW9kZWwubG9ncz8ubWV0aG9kVGllciB8fCBtb2RlbC5tb2RlbD8ubWV0aG9kVGllclwiPlt7e21vZGVsLmxvZ3M/Lm1ldGhvZFRpZXIgfHwgbW9kZWwubW9kZWw/Lm1ldGhvZFRpZXJ9fV08L3NwYW4+XG5cbiAgICA8c3BhbiBjbGFzcz1cInBsLTEgaGFzLXRleHQte3tsb2dDb2xvclttb2RlbC5zdGF0dXNdfX0gdHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgIFtuZ2JQb3BvdmVyXT1cImxvZ1N0YXR1c0RldGFpbHNcIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwMT1cIm5nYlBvcG92ZXJcIiBwbGFjZW1lbnQ9XCJsZWZ0XCIgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwMS5pc09wZW4oKSA/IHAxLmNsb3NlKCkgOiBwMS5vcGVuKHsgbW9kZWwsIGRhdGEgfSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cImxvZ0ljb25bbW9kZWwuc3RhdHVzXVwiPjwvZmEtaWNvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8c3BhbiBjbGFzcz1cInBsLTFcIiAqbmdJZj1cIm1vZGVsLm1vZGVsXCI+XG4gICAgICAoPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRvY3NMaW5rOyBjb250ZXh0OiB7JGltcGxpY2l0OiBtb2RlbC5tb2RlbH1cIj48L25nLWNvbnRhaW5lcj4pXG4gICAgPC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vVmFsdWU+LTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm90UmVjYWxjdWxhdGVkPm5vdCByZWNhbGN1bGF0ZWQ8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvZ0RldGFpbHMgbGV0LWxvZ3M9XCJsb2dzXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIiAqYmluZE9uY2U9XCJsb2dzXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1mdWxsd2lkdGhcIj5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZ3M/LnJlcXVpcmVtZW50c1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiByZXF1aXJlbWVudEtleXMobG9ncy5yZXF1aXJlbWVudHMpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDp7a2V5LCB2YWx1ZTpsb2dzLnJlcXVpcmVtZW50c1trZXldfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9ncz8ubG9nc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBsb2dzLmxvZ3MgfCBrZXlzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDprZXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwibG9nc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJpdC1tdC0yXCIgKm5nSWY9XCJsb2dzPy5taXNzaW5nTG9va3Vwcz8ubGVuZ3RoXCI+XG4gICAgICA8cD5PcHRpb25hbCBkYXRhIG1pc3Npbmc6PC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyIGRhdGEtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLWRhcmsgaXMtZnVsbHdpZHRoIGlzLXN0cmlwZWRcIj5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+RmlsZW5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+Q29sdW1uIFRpdGxlPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlJvdyAodGVybS5pZCk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgPHRib2R5IGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBsb2dzLm1pc3NpbmdMb29rdXBzXCI+XG4gICAgICAgICAgICAgIDx0ZD57e2RhdGEuZmlsZW5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57e2RhdGEuY29sdW1ufX08L3RkPlxuICAgICAgICAgICAgICA8dGQ+e3tkYXRhLnRlcm1JZH19PC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nTGluZVZhbHVlIGxldC1rZXk9XCJrZXlcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRWYWx1ZT5cbiAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi1taWRkbGVcIj57e3ZhbHVlfX08L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXF1aXJlbWVudExpbmtlZE5vZGUoa2V5LCB2YWx1ZSk7IGxldCBsaW5rZWROb2RlOyBlbHNlIGRlZmF1bHRWYWx1ZVwiPlxuICAgIDxoZS1ub2RlLWxpbmsgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCIgbGlua0NsYXNzPVwiaXMtZGFya1wiIFtub2RlXT1cImxpbmtlZE5vZGVcIiBbc2hvd0V4dGVybmFsTGlua109XCJ0cnVlXCI+PC9oZS1ub2RlLWxpbms+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dMaW5lIGxldC1rZXk9XCJrZXlcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICA8dHI+XG4gICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodCBjb3B5LWxvZ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCIgW25nU3dpdGNoXT1cImtleVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+e3trZXkgfCBrZXlUb0xhYmVsfX08L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbm9kZV90eXBlX2FsbG93ZWQnXCI+SXMgdGhlIGN1cnJlbnQgPGNvZGU+Tm9kZTwvY29kZT4gYWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2l0ZVR5cGVfYWxsb3dlZCdcIj5JcyB0aGUgY3VycmVudCA8Y29kZT5zaXRlVHlwZTwvY29kZT4gYWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJpbWFyeV9wcm9kdWN0X2lkX2FsbG93ZWQnXCI+SXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBwcm9kdWN0IDxjb2RlPkBpZDwvY29kZT4gYWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJpbWFyeV9wcm9kdWN0X3Rlcm1UeXBlX2FsbG93ZWQnXCI+SXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBwcm9kdWN0IDxjb2RlPnRlcm1UeXBlPC9jb2RlPiBhbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2dlb3NwYXRpYWxfZGF0YSdcIj5IYXMgZ2Vvc3BhdGlhbCBkYXRhIG5lY2Vzc2FyeSB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29udGFpbnNfZ2Vvc3BhdGlhbF9kYXRhJ1wiPkhhcyBnZW9zcGF0aWFsIGRhdGEgbmVjZXNzYXJ5IHRvIHJ1biB0aGlzIG1vZGVsPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW50X3NpemUnXCI+Q3VycmVudCBwb2x5Z29uIGFyZWE8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21heF9hcmVhX3NpemUnXCI+TWF4aW11bSBwb2x5Z29uIGFyZWEgdG8gcnVuIHRoaXMgbW9kZWw8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2JlbG93X21heF9hcmVhX3NpemUnXCI+UG9seWdvbiBiZWxvdyB0aGUgbWF4aW11bSBhcmVhPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyZWdpb25fZmFjdG9yJ1wiPkZhY3RvciBmcm9tIHJlZ2lvbiBsb29rdXA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGVzdGljaWRlc19jb21wbGV0ZSdcIj5QZXN0aWNpZGUgZGF0YSBhcmUgPGNvZGU+Y29tcGxldGU8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidoYXNfcGVzdGljaWRlc19pbnB1dHMnXCI+Q3ljbGUgY29udGFpbnMgPGNvZGU+cGVzdGljaWRlQUk8L2NvZGU+IElucHV0czwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWxsX3Blc3RpY2lkZUFJX2hhdmVfbG9va3VwX3ZhbHVlJ1wiPkFsbCA8Y29kZT5wZXN0aWNpZGVBSTwvY29kZT4gSW5wdXRzIGhhdmUgYSBsb29rdXAgdmFsdWU8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaGFzX2Nyb3BfcmVzaWR1ZV9idXJudCdcIj48Y29kZT5hYm92ZUdyb3VuZENyb3BSZXNpZHVlQnVybnQ8L2NvZGU+IGlzIHByZXNlbnQgYXMgUHJvZHVjdDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXF1aWRfc2x1cnJ5X3NsdWRnZV9QJ1wiPkxpcXVpZCwgU2x1cnJ5LCBhbmQgU2x1ZGdlIFA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGVybV90eXBlX2Nyb3BSZXNpZHVlX2NvbXBsZXRlJ1wiPkRhdGEgY29tcGxldGVuZXNzIGZvciBcImNyb3BSZXNpZHVlXCIgbXVzdCBiZSA8Y29kZT50cnVlPC9jb2RlPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGVybV90eXBlX2V4Y3JldGFfY29tcGxldGUnXCI+RGF0YSBjb21wbGV0ZW5lc3MgZm9yIFwiZXhjcmV0YVwiIG11c3QgYmUgPGNvZGU+dHJ1ZTwvY29kZT48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Rlcm1fdHlwZV9mZXJ0aWxpc2VyX2NvbXBsZXRlJ1wiPkRhdGEgY29tcGxldGVuZXNzIGZvciBcImZlcnRpbGlzZXJcIiBtdXN0IGJlIDxjb2RlPnRydWU8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXJtX3R5cGVfbWF0ZXJpYWxfY29tcGxldGUnXCI+RGF0YSBjb21wbGV0ZW5lc3MgZm9yIFwibWF0ZXJpYWxcIiBtdXN0IGJlIDxjb2RlPnRydWU8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXJtX3R5cGVfb3RoZXJfY29tcGxldGUnXCI+RGF0YSBjb21wbGV0ZW5lc3MgZm9yIFwib3RoZXJcIiBtdXN0IGJlIDxjb2RlPnRydWU8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXJtX3R5cGVfcGVzdGljaWRlc0FudGliaW90aWNzX2NvbXBsZXRlJ1wiPkRhdGEgY29tcGxldGVuZXNzIGZvciBcInBlc3RpY2lkZXNBbnRpYmlvdGljc1wiIG11c3QgYmUgPGNvZGU+dHJ1ZTwvY29kZT48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGVybV90eXBlX2Nyb3BSZXNpZHVlX2luY29tcGxldGUnXCI+RGF0YSBjb21wbGV0ZW5lc3MgZm9yIFwiY3JvcFJlc2lkdWVcIiBtdXN0IGJlIDxjb2RlPmZhbHNlPC9jb2RlPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGVybV90eXBlX2V4Y3JldGFfaW5jb21wbGV0ZSdcIj5EYXRhIGNvbXBsZXRlbmVzcyBmb3IgXCJleGNyZXRhXCIgbXVzdCBiZSA8Y29kZT5mYWxzZTwvY29kZT48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Rlcm1fdHlwZV9mZXJ0aWxpc2VyX2luY29tcGxldGUnXCI+RGF0YSBjb21wbGV0ZW5lc3MgZm9yIFwiZmVydGlsaXNlclwiIG11c3QgYmUgPGNvZGU+ZmFsc2U8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXJtX3R5cGVfbWF0ZXJpYWxfaW5jb21wbGV0ZSdcIj5EYXRhIGNvbXBsZXRlbmVzcyBmb3IgXCJtYXRlcmlhbFwiIG11c3QgYmUgPGNvZGU+ZmFsc2U8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXJtX3R5cGVfb3RoZXJfaW5jb21wbGV0ZSdcIj5EYXRhIGNvbXBsZXRlbmVzcyBmb3IgXCJvdGhlclwiIG11c3QgYmUgPGNvZGU+ZmFsc2U8L2NvZGU+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXJtX3R5cGVfcGVzdGljaWRlc0FudGliaW90aWNzX2luY29tcGxldGUnXCI+RGF0YSBjb21wbGV0ZW5lc3MgZm9yIFwicGVzdGljaWRlc0FudGliaW90aWNzXCIgbXVzdCBiZSA8Y29kZT5mYWxzZTwvY29kZT48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxoZS1jbGlwYm9hcmQgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCIgY2xpcGJvYXJkQ2xhc3M9XCJpcy1zaXplLTcgaXMtcC0xXCIgW2ljb25dPVwiWydmYXInLCAnY2xvbmUnXVwiIFt2YWx1ZV09XCJrZXlcIiBbaGlkZVRleHRdPVwidHJ1ZVwiPjwvaGUtY2xpcGJvYXJkPlxuICAgIDwvdGQ+XG4gICAgPHRkPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVWYWx1ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmVWYWx1ZTsgY29udGV4dDp7a2V5LHZhbHVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxkaXYgKm5nSWY9XCJsb2dWYWx1ZUFycmF5KHZhbHVlKTsgbGV0IHZhbHVlQXJyYXk7IGVsc2Ugc2luZ2xlVmFsdWVcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1ib3JkZXJlZCBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgPHRoZWFkICpuZ0lmPVwidmFsdWVBcnJheVswXSB8IGlzT2JqZWN0XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCIgKm5nRm9yPVwibGV0IHYgb2YgdmFsdWVBcnJheVswXSB8IGtleXNcIj57e3Yua2V5fX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgdiBvZiB2YWx1ZUFycmF5XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlQXJyYXlWYWx1ZT5cbiAgICAgICAgICAgICAgICA8dGQ+e3t2fX08L3RkPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidiB8IGlzT2JqZWN0OyBlbHNlIHNpbmdsZUFycmF5VmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHZ2IG9mIHYgfCBrZXlzXCI+e3t2di52YWx1ZX19PC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RkPlxuICA8L3RyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dTdGF0dXNEZXRhaWxzIGxldC1tb2RlbD1cIm1vZGVsXCIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwibW9kZWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICAgICAgPHNwYW4+U3RhdHVzOjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPnt7bW9kZWwuc3RhdHVzfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZWwuc3RhdHVzID09PSBMb2dTdGF0dXMubm90UmVxdWlyZWQgJiYgbW9kZWwubG9ncz8uaXNfbm90X3JlbGV2YW50ID09PSAnVHJ1ZSdcIj5cbiAgICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kaXNjXCI+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8uc2l0ZVR5cGVfYWxsb3dlZCA9PT0gJ0ZhbHNlJ1wiPlRoZSA8Y29kZT5zaXRlVHlwZTwvY29kZT4gaXMgbm90IHJlbGV2YW50LjwvbGk+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8ucHJvZHVjdF9pZF9hbGxvd2VkID09PSAnRmFsc2UnXCI+VGhlIHByaW1hcnkgcHJvZHVjdCA8Y29kZT5AaWQ8L2NvZGU+IGlzIG5vdCByZWxldmFudC48L2xpPlxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzLmxvZ3M/LnByb2R1Y3RfdGVybVR5cGVfYWxsb3dlZCA9PT0gJ0ZhbHNlJ1wiPlRoZSBwcmltYXJ5IHByb2R1Y3QgPGNvZGU+dGVybVR5cGU8L2NvZGU+IGlzIG5vdCByZWxldmFudC48L2xpPlxuICAgICAgPC91bD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5sb2dzICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLm5vdFJlcXVpcmVkICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLnNraXBIaWVyYXJjaHlcIj5cbiAgICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kaXNjXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd1J1bk9yY2hlc3RyYXRvcj5cbiAgICAgICAgICA8bGkgY2xhc3M9XCJpcy1ydW4tb3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgICA8cCAqbmdJZj1cIm1vZGVsLmxvZ3M/LnNob3VsZFJ1blwiPkFsbCB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbWV0IHRvIHJ1biB0aGUgbW9kZWwuPC9wPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2RlbC5sb2dzPy5zaG91bGRSdW5cIj5cbiAgICAgICAgICAgICAgPHA+U29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbm90IG1ldCB0byBydW4gdGhlIG1vZGVsLjwvcD5cbiAgICAgICAgICAgICAgPHA+WW91IGNhbiBjbGljayBvbiB0aGUgbW9kZWwgbmFtZSBvbiB0aGUgbGVmdCB0byB2aWV3IHRoZSBkZWJ1Z2dpbmcgbG9ncy48L3A+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5sb2dzPy5sb2dzPy5lcnJvclwiPlxuICAgICAgICAgICAgICA8cD5UaGUgbW9kZWwgZmFpbGVkIHRvIHJ1biBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246PC9wPlxuICAgICAgICAgICAgICA8cD48Y29kZT57e21vZGVsLmxvZ3MubG9ncy5lcnJvcn19PC9jb2RlPjwvcD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPGxpIGNsYXNzPVwiaXMtbm8tcnVuLW9yY2hlc3RyYXRvclwiICpuZ0lmPVwibW9kZWwubG9ncz8uc2hvdWxkUnVuT3JjaGVzdHJhdG9yID09PSBmYWxzZTsgZWxzZSBzaG93UnVuT3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2RlbC5sb2dzLnJ1blJlcXVpcmVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi1ub2RlLXR5cGUtbm90LWFsbG93ZWRcIiAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8ubm9kZV90eXBlX2FsbG93ZWQgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICAgICAgVGhpcyBtb2RlbCBzaG91bGQgbm90IHJ1biBmb3Ige3tub2RlVHlwZSB8IHBsdXJhbGl6ZTowfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcnVuTm9Db25maWc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi1ub3QtZW1wdHlcIiAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8uaXNfZW1wdHkgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICAgICAgVGhlIHt7ZGF0YS50eXBlIHx8ICdibGFuayBub2RlJ319IHdpdGggVGVybSA8Y29kZT57e2RhdGEudGVybUlkfX08L2NvZGU+IGlzIGFscmVhZHkgcHJlc2VudCBvciBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgbW9kZWwuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5jb25maWc7IGVsc2UgcnVuTm9Db25maWdcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaXMtcnVuLXN0cmF0ZWd5LXt7bW9kZWwuY29uZmlnLnJ1blN0cmF0ZWd5fX1cIiBbbmdTd2l0Y2hdPVwibW9kZWwuY29uZmlnLnJ1blN0cmF0ZWd5XCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYWx3YXlzJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhZGRfa2V5X2lmX21pc3NpbmcnXCI+XG4gICAgICAgICAgICAgICAgV2Ugb25seSBnYXAtZmlsbCB0aGlzIGtleSBpZiBub3QgcHJlc2VudFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYWRkX2JsYW5rX25vZGVfaWZfbWlzc2luZydcIj5cbiAgICAgICAgICAgICAgICBXZSBvbmx5IGdhcC1maWxsIHRoaXMgQmxhbmsgTm9kZSBpZiBub3QgcHJlc2VudC5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8cCBjbGFzcz1cImlzLW10LTFcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ydW4td2l0aC1tZWFzdXJlZFwiICpuZ0lmPVwibW9kZWwuY29uZmlnLnJ1bkFyZ3M/LnJ1bk5vbk1lYXN1cmVkICYmIGhhc01ldGhvZFRpZXIoZGF0YS5vcmlnaW5hbCwgRW1pc3Npb25NZXRob2RUaWVyLm1lYXN1cmVkKVwiPlxuICAgICAgICAgICAgICAgIFRoZSA8Y29kZT57e21vZGVsLmNvbmZpZy52YWx1ZX19PC9jb2RlPiB3YXMgcmVwb3J0ZWQgYXMgbWVhc3VyZWQuXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9saT5cblxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzPy5yZXBsYWNlTG93ZXJUaWVyICE9PSB1bmRlZmluZWRcIj5cbiAgICAgICAgICA8c3Bhbj5UaGUgcmVjYWxjdWxhdGVkIDxiPm1ldGhvZFRpZXI8L2I+IHdhczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTEgaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwiIW1vZGVsLmxvZ3MucmVwbGFjZUxvd2VyVGllclwiPmxvd2VyIHRoYW48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xIGlzLXVuZGVybGluZWRcIiAqbmdJZj1cIm1vZGVsLmxvZ3MucmVwbGFjZUxvd2VyVGllclwiPmhpZ2hlciB0aGFuIG9yIGVxdWFsIHRvPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPnRoZSBvcmlnaW5hbCA8Yj5tZXRob2RUaWVyPC9iPi48L3NwYW4+XG4gICAgICAgIDwvbGk+XG5cbiAgICAgICAgPGxpIGNsYXNzPVwiaXMtbWVyZ2UtcmVwbGFjZUxvd2VyVGllclwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlTG93ZXJUaWVyXCI+XG4gICAgICAgICAgPHNwYW4+VGhlIHJlY2FsY3VsYXRlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7bW9kZWwuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnfX08L2I+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj53YXM8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGVsLmNvbmZpZy5tZXJnZUFyZ3NcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXVuZGVybGluZWRcIiAqbmdJZj1cIiFtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5sZXNzIHRoYW48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCIgKm5nSWY9XCJtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5tb3JlIHRoYW4gb3IgZXF1YWwgdG88L3NwYW4+XG4gICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJpcy1wbC0xXCI+e3ttb2RlbC5jb25maWcubWVyZ2VBcmdzLnJlcGxhY2VUaHJlc2hvbGRbMV0gKiAxMDB9fSU8L2I+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1vZGVsLmNvbmZpZy5tZXJnZUFyZ3NcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXVuZGVybGluZWRcIiAqbmdJZj1cIiFtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5ub3Qgc3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkXCI+c3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPmRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbDwvc3Bhbj5cbiAgICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7bW9kZWwuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnfX0uPC9iPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RvY3NMaW5rIGxldC1tb2RlbD5cbiAgPGEgW2hyZWZdPVwibW9kZWwuYXBpRG9jc1BhdGggfHwgbW9kZWwuZG9jUGF0aCB8fCBtb2RlbC5wYXRoXCIgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgPlxuICAgIDxzcGFuPkRvY3M8L3NwYW4+XG4gICAgPGZhLWljb24gY2xhc3M9XCJtbC0xXCIgaWNvbj1cImV4dGVybmFsLWxpbmstYWx0XCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuIl19
|