@nova-ui/bits
Version:
SolarWinds Nova Framework
102 lines • 16.2 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { Component } from "@angular/core";
import { Router, RoutesRecognized } from "@angular/router";
import defaults from "lodash/defaults";
import { filter, map } from "rxjs/operators";
import { SrlcStage } from "./public-api";
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "../../message/message.component";
/** @ignore */
export class SrlcIndicatorComponent {
constructor(router) {
this.router = router;
this.globalSrlc = {
stage: SrlcStage.preAlpha,
eolDate: new Date("1/1/2100"),
hideIndicator: false,
};
this.getMessageType = () => {
switch (this.componentSrlc.stage) {
case SrlcStage.preAlpha:
return "critical";
case SrlcStage.alpha:
return "warning";
case SrlcStage.beta:
return "info";
case SrlcStage.ga:
return "ok";
case SrlcStage.support:
return "hint";
case SrlcStage.eol:
return "error";
default:
return "error";
}
};
this.getMessageText = () => {
switch (this.componentSrlc.stage) {
case SrlcStage.preAlpha:
return `<strong>Under Development</strong> DO NOT USE. This component is under active development and significant,
API breaking changes are still expected. Its use will not be supported.`;
case SrlcStage.alpha:
// eslint-disable-next-line max-len
return `<strong>Alpha</strong> USE AT YOUR OWN RISK. This component may be unstable, include defects and is still subject to API breaking changes.
We encourage prototypical use and feedback - but won't support production use.`;
case SrlcStage.beta:
return `<strong>Beta</strong> This component is in the final testing stage. It should be quite stable,
but some defects may still exist. Keep an eye on it!`;
case SrlcStage.ga:
return `<strong>Production Ready</strong> Available for production use - see documented examples below.`;
case SrlcStage.support:
return `<strong>Deprecated</strong> Sorry, but we no longer recommend using this component.
Only critical issues are going to be fixed.
End Of Life is scheduled to <strong>${this.componentSrlc.eolDate?.toDateString()}</strong>.`;
case SrlcStage.eol:
return `<strong>Not Supported</strong> Sorry, but this component is not supported any more!`;
default:
return `Current state of this component is unknown. Please, contact Nova team for more details.`;
}
};
}
ngOnInit() {
this.router.events
.pipe(filter((event) => event instanceof RoutesRecognized), map((event) => {
let route = event.state.root;
while (route.firstChild) {
route = route.firstChild;
}
return route;
}))
.subscribe((route) => {
const routeDataSrlc = (route.data || {}).srlc;
this.componentSrlc = defaults(routeDataSrlc || {}, this.globalSrlc);
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SrlcIndicatorComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SrlcIndicatorComponent, selector: "nui-srlc-indicator", ngImport: i0, template: "<nui-message\n [type]=\"getMessageType()\"\n [allowDismiss]=\"false\"\n *ngIf=\"!!componentSrlc && !componentSrlc.hideIndicator\"\n>\n <span [innerHTML]=\"getMessageText()\"></span>\n</nui-message>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MessageComponent, selector: "nui-message", inputs: ["type", "allowDismiss", "manualControl"], outputs: ["dismiss"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SrlcIndicatorComponent, decorators: [{
type: Component,
args: [{ selector: "nui-srlc-indicator", template: "<nui-message\n [type]=\"getMessageType()\"\n [allowDismiss]=\"false\"\n *ngIf=\"!!componentSrlc && !componentSrlc.hideIndicator\"\n>\n <span [innerHTML]=\"getMessageText()\"></span>\n</nui-message>\n" }]
}], ctorParameters: () => [{ type: i1.Router }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JsYy1pbmRpY2F0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kb2NzL3NybGMtaW5kaWNhdG9yL3NybGMtaW5kaWNhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZG9jcy9zcmxjLWluZGljYXRvci9zcmxjLWluZGljYXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQWdCLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7QUFFdkQsY0FBYztBQUtkLE1BQU0sT0FBTyxzQkFBc0I7SUFDL0IsWUFBb0IsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFM0IsZUFBVSxHQUFpQjtZQUM5QixLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVE7WUFDekIsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM3QixhQUFhLEVBQUUsS0FBSztTQUN2QixDQUFDO1FBeUJLLG1CQUFjLEdBQUcsR0FBVyxFQUFFO1lBQ2pDLFFBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Z0JBQzlCLEtBQUssU0FBUyxDQUFDLFFBQVE7b0JBQ25CLE9BQU8sVUFBVSxDQUFDO2dCQUN0QixLQUFLLFNBQVMsQ0FBQyxLQUFLO29CQUNoQixPQUFPLFNBQVMsQ0FBQztnQkFDckIsS0FBSyxTQUFTLENBQUMsSUFBSTtvQkFDZixPQUFPLE1BQU0sQ0FBQztnQkFDbEIsS0FBSyxTQUFTLENBQUMsRUFBRTtvQkFDYixPQUFPLElBQUksQ0FBQztnQkFDaEIsS0FBSyxTQUFTLENBQUMsT0FBTztvQkFDbEIsT0FBTyxNQUFNLENBQUM7Z0JBQ2xCLEtBQUssU0FBUyxDQUFDLEdBQUc7b0JBQ2QsT0FBTyxPQUFPLENBQUM7Z0JBQ25CO29CQUNJLE9BQU8sT0FBTyxDQUFDO2FBQ3RCO1FBQ0wsQ0FBQyxDQUFDO1FBRUssbUJBQWMsR0FBRyxHQUFXLEVBQUU7WUFDakMsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtnQkFDOUIsS0FBSyxTQUFTLENBQUMsUUFBUTtvQkFDbkIsT0FBTzs0RkFDcUUsQ0FBQztnQkFDakYsS0FBSyxTQUFTLENBQUMsS0FBSztvQkFDaEIsbUNBQW1DO29CQUNuQyxPQUFPO21HQUM0RSxDQUFDO2dCQUN4RixLQUFLLFNBQVMsQ0FBQyxJQUFJO29CQUNmLE9BQU87eUVBQ2tELENBQUM7Z0JBQzlELEtBQUssU0FBUyxDQUFDLEVBQUU7b0JBQ2IsT0FBTyxpR0FBaUcsQ0FBQztnQkFDN0csS0FBSyxTQUFTLENBQUMsT0FBTztvQkFDbEIsT0FBTzs7MERBRW1DLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7Z0JBQ3JHLEtBQUssU0FBUyxDQUFDLEdBQUc7b0JBQ2QsT0FBTyxxRkFBcUYsQ0FBQztnQkFDakc7b0JBQ0ksT0FBTyx5RkFBeUYsQ0FBQzthQUN4RztRQUNMLENBQUMsQ0FBQztJQXpFbUMsQ0FBQztJQVUvQixRQUFRO1FBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ2IsSUFBSSxDQUNELE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxZQUFZLGdCQUFnQixDQUFDLEVBQ3BELEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1YsSUFBSSxLQUFLLEdBQXNCLEtBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ2pELE9BQU8sS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDckIsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7YUFDNUI7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FDTDthQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pCLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQ3pCLGFBQWEsSUFBSSxFQUFFLEVBQ25CLElBQUksQ0FBQyxVQUFVLENBQ2xCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7K0dBOUJRLHNCQUFzQjttR0FBdEIsc0JBQXNCLDBEQ2hDbkMscU5BT0E7OzRGRHlCYSxzQkFBc0I7a0JBSmxDLFNBQVM7K0JBQ0ksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFJvdXRlciwgUm91dGVzUmVjb2duaXplZCB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCBkZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBJU3JsY0RldGFpbHMsIFNybGNTdGFnZSB9IGZyb20gXCIuL3B1YmxpYy1hcGlcIjtcblxuLyoqIEBpZ25vcmUgKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS1zcmxjLWluZGljYXRvclwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vc3JsYy1pbmRpY2F0b3IuY29tcG9uZW50Lmh0bWxcIixcbn0pXG5leHBvcnQgY2xhc3MgU3JsY0luZGljYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge31cblxuICAgIHB1YmxpYyBnbG9iYWxTcmxjOiBJU3JsY0RldGFpbHMgPSB7XG4gICAgICAgIHN0YWdlOiBTcmxjU3RhZ2UucHJlQWxwaGEsXG4gICAgICAgIGVvbERhdGU6IG5ldyBEYXRlKFwiMS8xLzIxMDBcIiksXG4gICAgICAgIGhpZGVJbmRpY2F0b3I6IGZhbHNlLFxuICAgIH07XG5cbiAgICBwdWJsaWMgY29tcG9uZW50U3JsYzogSVNybGNEZXRhaWxzO1xuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgUm91dGVzUmVjb2duaXplZCksXG4gICAgICAgICAgICAgICAgbWFwKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGUgPSAoPFJvdXRlc1JlY29nbml6ZWQ+ZXZlbnQpLnN0YXRlLnJvb3Q7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZSA9IHJvdXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdXRlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyb3V0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlRGF0YVNybGMgPSAocm91dGUuZGF0YSB8fCB7fSkuc3JsYztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNybGMgPSBkZWZhdWx0cyhcbiAgICAgICAgICAgICAgICAgICAgcm91dGVEYXRhU3JsYyB8fCB7fSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxTcmxjXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNZXNzYWdlVHlwZSA9ICgpOiBzdHJpbmcgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29tcG9uZW50U3JsYy5zdGFnZSkge1xuICAgICAgICAgICAgY2FzZSBTcmxjU3RhZ2UucHJlQWxwaGE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY3JpdGljYWxcIjtcbiAgICAgICAgICAgIGNhc2UgU3JsY1N0YWdlLmFscGhhOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIndhcm5pbmdcIjtcbiAgICAgICAgICAgIGNhc2UgU3JsY1N0YWdlLmJldGE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5mb1wiO1xuICAgICAgICAgICAgY2FzZSBTcmxjU3RhZ2UuZ2E6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgICAgICAgIGNhc2UgU3JsY1N0YWdlLnN1cHBvcnQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaGludFwiO1xuICAgICAgICAgICAgY2FzZSBTcmxjU3RhZ2UuZW9sOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIGdldE1lc3NhZ2VUZXh0ID0gKCk6IHN0cmluZyA9PiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jb21wb25lbnRTcmxjLnN0YWdlKSB7XG4gICAgICAgICAgICBjYXNlIFNybGNTdGFnZS5wcmVBbHBoYTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYDxzdHJvbmc+VW5kZXIgRGV2ZWxvcG1lbnQ8L3N0cm9uZz4gRE8gTk9UIFVTRS4gVGhpcyBjb21wb25lbnQgaXMgdW5kZXIgYWN0aXZlIGRldmVsb3BtZW50IGFuZCBzaWduaWZpY2FudCxcbiAgICAgICAgICAgICAgICAgICAgQVBJIGJyZWFraW5nIGNoYW5nZXMgYXJlIHN0aWxsIGV4cGVjdGVkLiBJdHMgdXNlIHdpbGwgbm90IGJlIHN1cHBvcnRlZC5gO1xuICAgICAgICAgICAgY2FzZSBTcmxjU3RhZ2UuYWxwaGE6XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICByZXR1cm4gYDxzdHJvbmc+QWxwaGE8L3N0cm9uZz4gVVNFIEFUIFlPVVIgT1dOIFJJU0suIFRoaXMgY29tcG9uZW50IG1heSBiZSB1bnN0YWJsZSwgaW5jbHVkZSBkZWZlY3RzIGFuZCBpcyBzdGlsbCBzdWJqZWN0IHRvIEFQSSBicmVha2luZyBjaGFuZ2VzLlxuICAgICAgICAgICAgICAgICAgICBXZSBlbmNvdXJhZ2UgcHJvdG90eXBpY2FsIHVzZSBhbmQgZmVlZGJhY2sgLSBidXQgd29uJ3Qgc3VwcG9ydCBwcm9kdWN0aW9uIHVzZS5gO1xuICAgICAgICAgICAgY2FzZSBTcmxjU3RhZ2UuYmV0YTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYDxzdHJvbmc+QmV0YTwvc3Ryb25nPiBUaGlzIGNvbXBvbmVudCBpcyBpbiB0aGUgZmluYWwgdGVzdGluZyBzdGFnZS4gSXQgc2hvdWxkIGJlIHF1aXRlIHN0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgYnV0IHNvbWUgZGVmZWN0cyBtYXkgc3RpbGwgZXhpc3QuIEtlZXAgYW4gZXllIG9uIGl0IWA7XG4gICAgICAgICAgICBjYXNlIFNybGNTdGFnZS5nYTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYDxzdHJvbmc+UHJvZHVjdGlvbiBSZWFkeTwvc3Ryb25nPiBBdmFpbGFibGUgZm9yIHByb2R1Y3Rpb24gdXNlIC0gc2VlIGRvY3VtZW50ZWQgZXhhbXBsZXMgYmVsb3cuYDtcbiAgICAgICAgICAgIGNhc2UgU3JsY1N0YWdlLnN1cHBvcnQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGA8c3Ryb25nPkRlcHJlY2F0ZWQ8L3N0cm9uZz4gU29ycnksIGJ1dCB3ZSBubyBsb25nZXIgcmVjb21tZW5kIHVzaW5nIHRoaXMgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgICAgICBPbmx5IGNyaXRpY2FsIGlzc3VlcyBhcmUgZ29pbmcgdG8gYmUgZml4ZWQuXG4gICAgICAgICAgICAgICAgICAgIEVuZCBPZiBMaWZlIGlzIHNjaGVkdWxlZCB0byA8c3Ryb25nPiR7dGhpcy5jb21wb25lbnRTcmxjLmVvbERhdGU/LnRvRGF0ZVN0cmluZygpfTwvc3Ryb25nPi5gO1xuICAgICAgICAgICAgY2FzZSBTcmxjU3RhZ2UuZW9sOlxuICAgICAgICAgICAgICAgIHJldHVybiBgPHN0cm9uZz5Ob3QgU3VwcG9ydGVkPC9zdHJvbmc+IFNvcnJ5LCBidXQgdGhpcyBjb21wb25lbnQgaXMgbm90IHN1cHBvcnRlZCBhbnkgbW9yZSFgO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYEN1cnJlbnQgc3RhdGUgb2YgdGhpcyBjb21wb25lbnQgaXMgdW5rbm93bi4gUGxlYXNlLCBjb250YWN0IE5vdmEgdGVhbSBmb3IgbW9yZSBkZXRhaWxzLmA7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPG51aS1tZXNzYWdlXG4gICAgW3R5cGVdPVwiZ2V0TWVzc2FnZVR5cGUoKVwiXG4gICAgW2FsbG93RGlzbWlzc109XCJmYWxzZVwiXG4gICAgKm5nSWY9XCIhIWNvbXBvbmVudFNybGMgJiYgIWNvbXBvbmVudFNybGMuaGlkZUluZGljYXRvclwiXG4+XG4gICAgPHNwYW4gW2lubmVySFRNTF09XCJnZXRNZXNzYWdlVGV4dCgpXCI+PC9zcGFuPlxuPC9udWktbWVzc2FnZT5cbiJdfQ==