ionic-logging-viewer
Version:
Viewer component for logs written by ionic-logging-service
141 lines • 22 kB
JavaScript
import { Component, Input } from "@angular/core";
import { ModalController, Platform, AlertController } from "@ionic/angular";
import { LoggingService } from "ionic-logging-service";
import * as i0 from "@angular/core";
import * as i1 from "@ionic/angular";
import * as i2 from "ionic-logging-service";
import * as i3 from "@angular/common";
import * as i4 from "../logging-viewer/logging-viewer.component";
import * as i5 from "../logging-viewer-search/logging-viewer-search.component";
import * as i6 from "../logging-viewer-levels/logging-viewer-levels.component";
/**
* Ionic modal containing [LoggingViewerComponent](LoggingViewerComponent.html),
* [LoggingViewerLevelsComponent](LoggingViewerLevelsComponent.html) and
* [LoggingViewerSearchComponent](LoggingViewerSearchComponent.html).
*/
export class LoggingViewerModalComponent {
static { this.languageEn = "en"; }
static { this.languageDe = "de"; }
/**
* Creates a new instance of the component.
*/
constructor(platform, alertController, modalController, loggingService) {
this.alertController = alertController;
this.modalController = modalController;
this.loggingService = loggingService;
this.logger = loggingService.getLogger("Ionic.Logging.Viewer.Modal.Component");
const methodName = "ctor";
this.logger.entry(methodName);
this.isAndroid = platform.is("android");
this.logger.exit(methodName);
}
/**
* Initializes the LoggingViewerModalComponent.
* It configures the supported translations.
*/
ngOnInit() {
// prepare translations
this.translations = {};
this.translations[LoggingViewerModalComponent.languageEn] = {
cancel: "Cancel",
confirmDelete: "Delete all log messages?",
ok: "Ok",
searchPlaceholder: "Search",
title: "Logging",
};
this.translations[LoggingViewerModalComponent.languageDe] = {
cancel: "Abbrechen",
confirmDelete: "Alle Logs löschen?",
ok: "Ok",
searchPlaceholder: "Suchen",
title: "Logging",
};
}
/**
* Eventhandler called by Ionic when the modal is opened.
*/
ionViewDidEnter() {
const methodName = "ionViewDidEnter";
this.logger.entry(methodName);
this.logger.exit(methodName);
}
/**
* Eventhandler called when the cancel button is clicked.
*/
async onClose() {
const methodName = "onClose";
this.logger.entry(methodName);
await this.modalController.dismiss();
this.logger.exit(methodName);
}
/**
* Eventhandler called when the clear button is clicked.
*/
async onClearLogs() {
const methodName = "onClearLogs";
this.logger.entry(methodName);
const alert = await this.alertController.create({
header: this.getTranslation().confirmDelete,
buttons: [
{
text: this.getTranslation().cancel,
role: "cancel",
cssClass: "secondary"
},
{
text: this.getTranslation().ok,
handler: () => {
this.clearLogs();
}
},
]
});
await alert.present();
this.logger.exit(methodName);
}
/**
* Clear logs.
*/
clearLogs() {
if (this.localStorageKeys) {
for (const localStorageKey of this.localStorageKeys.split(",")) {
this.loggingService.removeLogMessagesFromLocalStorage(localStorageKey);
}
}
else {
this.loggingService.removeLogMessages();
}
}
/**
* Helper method returning the current translation:
* - the property translation if defined
* - the translation according property language if valid
* - English translation, otherwise
*/
getTranslation() {
if (typeof this.translation !== "undefined") {
return this.translation;
}
else if (typeof this.language !== "undefined" && typeof this.translations[this.language] === "object") {
return this.translations[this.language];
}
else {
return this.translations[LoggingViewerModalComponent.languageEn];
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.2", ngImport: i0, type: LoggingViewerModalComponent, deps: [{ token: i1.Platform }, { token: i1.AlertController }, { token: i1.ModalController }, { token: i2.LoggingService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.2", type: LoggingViewerModalComponent, selector: "ionic-logging-viewer-modal", inputs: { language: "language", translation: "translation", localStorageKeys: "localStorageKeys", allowClearLogs: "allowClearLogs" }, ngImport: i0, template: "<ion-header>\n\t<ion-toolbar color=primary>\n\t\t<ion-title>{{ getTranslation().title }}</ion-title>\n\t\t<ion-buttons slot=\"start\">\n\t\t\t<ion-button *ngIf=\"!isAndroid\" (click)=\"onClose()\">\n\t\t\t\t{{ getTranslation().cancel }}\n\t\t\t</ion-button>\n\t\t\t<ion-button *ngIf=\"isAndroid\" icon-only (click)=\"onClose()\">\n\t\t\t\t<ion-icon name=\"md-close\"></ion-icon>\n\t\t\t</ion-button>\n\t\t</ion-buttons>\n\t</ion-toolbar>\n\t<ion-toolbar>\n\t\t<ionic-logging-viewer-search [placeholder]=\"getTranslation().searchPlaceholder\"></ionic-logging-viewer-search>\n\t\t<ion-buttons slot=\"end\" *ngIf=\"allowClearLogs !== false\" class=\"clearLogs\">\n\t\t\t<ion-button (click)=\"onClearLogs()\">\n\t\t\t\t<ion-icon name=\"trash-outline\"></ion-icon>\n\t\t\t</ion-button>\n\t\t</ion-buttons>\n\t</ion-toolbar>\n\t<ion-toolbar>\n\t\t<ionic-logging-viewer-levels></ionic-logging-viewer-levels>\n\t</ion-toolbar>\n</ion-header>\n<ion-content>\n\t<ionic-logging-viewer [localStorageKeys]=\"localStorageKeys\"></ionic-logging-viewer>\n</ion-content>", styles: ["ionic-logging-viewer-levels{width:100%;padding-left:12px;padding-right:12px}.clearLogs{padding-top:3px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i4.LoggingViewerComponent, selector: "ionic-logging-viewer", inputs: ["localStorageKeys"] }, { kind: "component", type: i5.LoggingViewerSearchComponent, selector: "ionic-logging-viewer-search", inputs: ["placeholder"] }, { kind: "component", type: i6.LoggingViewerLevelsComponent, selector: "ionic-logging-viewer-levels" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.2", ngImport: i0, type: LoggingViewerModalComponent, decorators: [{
type: Component,
args: [{ selector: "ionic-logging-viewer-modal", template: "<ion-header>\n\t<ion-toolbar color=primary>\n\t\t<ion-title>{{ getTranslation().title }}</ion-title>\n\t\t<ion-buttons slot=\"start\">\n\t\t\t<ion-button *ngIf=\"!isAndroid\" (click)=\"onClose()\">\n\t\t\t\t{{ getTranslation().cancel }}\n\t\t\t</ion-button>\n\t\t\t<ion-button *ngIf=\"isAndroid\" icon-only (click)=\"onClose()\">\n\t\t\t\t<ion-icon name=\"md-close\"></ion-icon>\n\t\t\t</ion-button>\n\t\t</ion-buttons>\n\t</ion-toolbar>\n\t<ion-toolbar>\n\t\t<ionic-logging-viewer-search [placeholder]=\"getTranslation().searchPlaceholder\"></ionic-logging-viewer-search>\n\t\t<ion-buttons slot=\"end\" *ngIf=\"allowClearLogs !== false\" class=\"clearLogs\">\n\t\t\t<ion-button (click)=\"onClearLogs()\">\n\t\t\t\t<ion-icon name=\"trash-outline\"></ion-icon>\n\t\t\t</ion-button>\n\t\t</ion-buttons>\n\t</ion-toolbar>\n\t<ion-toolbar>\n\t\t<ionic-logging-viewer-levels></ionic-logging-viewer-levels>\n\t</ion-toolbar>\n</ion-header>\n<ion-content>\n\t<ionic-logging-viewer [localStorageKeys]=\"localStorageKeys\"></ionic-logging-viewer>\n</ion-content>", styles: ["ionic-logging-viewer-levels{width:100%;padding-left:12px;padding-right:12px}.clearLogs{padding-top:3px}\n"] }]
}], ctorParameters: () => [{ type: i1.Platform }, { type: i1.AlertController }, { type: i1.ModalController }, { type: i2.LoggingService }], propDecorators: { language: [{
type: Input
}], translation: [{
type: Input
}], localStorageKeys: [{
type: Input
}], allowClearLogs: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy12aWV3ZXItbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW9uaWMtbG9nZ2luZy12aWV3ZXIvc3JjL2xpYi9sb2dnaW5nLXZpZXdlci1tb2RhbC9sb2dnaW5nLXZpZXdlci1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb25pYy1sb2dnaW5nLXZpZXdlci9zcmMvbGliL2xvZ2dpbmctdmlld2VyLW1vZGFsL2xvZ2dpbmctdmlld2VyLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBVSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7QUFJL0Q7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTywyQkFBMkI7YUFFeEIsZUFBVSxHQUFHLElBQUksQUFBUCxDQUFRO2FBQ2xCLGVBQVUsR0FBRyxJQUFJLEFBQVAsQ0FBUTtJQXFDakM7O09BRUc7SUFDSCxZQUNDLFFBQWtCLEVBQ1YsZUFBZ0MsRUFDaEMsZUFBZ0MsRUFDaEMsY0FBOEI7UUFGOUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFFdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDL0UsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxT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QWM7UUFDcEIsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pCLENBQUM7YUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN6RyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDRixDQUFDOzhHQTlKVywyQkFBMkI7a0dBQTNCLDJCQUEyQix3TUNsQnhDLCtoQ0EwQmM7OzJGRFJELDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDQyw0QkFBNEI7c0tBYy9CLFFBQVE7c0JBRGQsS0FBSztnQkFRQyxXQUFXO3NCQURqQixLQUFLO2dCQU9DLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFPQyxjQUFjO3NCQURwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQbGF0Zm9ybSwgQWxlcnRDb250cm9sbGVyIH0gZnJvbSBcIkBpb25pYy9hbmd1bGFyXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZ1NlcnZpY2UgfSBmcm9tIFwiaW9uaWMtbG9nZ2luZy1zZXJ2aWNlXCI7XG5cbmltcG9ydCB7IExvZ2dpbmdWaWV3ZXJUcmFuc2xhdGlvbiB9IGZyb20gXCIuLi9sb2dnaW5nLXZpZXdlci10cmFuc2xhdGlvbi5tb2RlbFwiO1xuXG4vKipcbiAqIElvbmljIG1vZGFsIGNvbnRhaW5pbmcgW0xvZ2dpbmdWaWV3ZXJDb21wb25lbnRdKExvZ2dpbmdWaWV3ZXJDb21wb25lbnQuaHRtbCksXG4gKiBbTG9nZ2luZ1ZpZXdlckxldmVsc0NvbXBvbmVudF0oTG9nZ2luZ1ZpZXdlckxldmVsc0NvbXBvbmVudC5odG1sKSBhbmRcbiAqIFtMb2dnaW5nVmlld2VyU2VhcmNoQ29tcG9uZW50XShMb2dnaW5nVmlld2VyU2VhcmNoQ29tcG9uZW50Lmh0bWwpLlxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiaW9uaWMtbG9nZ2luZy12aWV3ZXItbW9kYWxcIixcblx0dGVtcGxhdGVVcmw6IFwiLi9sb2dnaW5nLXZpZXdlci1tb2RhbC5jb21wb25lbnQuaHRtbFwiLFxuXHRzdHlsZVVybHM6IFtcIi4vbG9nZ2luZy12aWV3ZXItbW9kYWwuY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgTG9nZ2luZ1ZpZXdlck1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuXHRwcml2YXRlIHN0YXRpYyBsYW5ndWFnZUVuID0gXCJlblwiO1xuXHRwcml2YXRlIHN0YXRpYyBsYW5ndWFnZURlID0gXCJkZVwiO1xuXG5cdC8qKlxuXHQgKiBMYW5ndWFnZSB0byBiZSB1c2VkIGZvciB0aGUgbW9kYWwuXG5cdCAqIEN1cnJlbnRseSBzdXBwb3J0ZWQ6IGVuLCBkZVxuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIGxhbmd1YWdlOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRyYW5zbGF0aW9uIHRvIGJlIHVzZWQgZm9yIHRoZSBtb2RhbC5cblx0ICogSWYgc3BlY2lmaWVkLCB0aGUgbGFuZ3VhZ2UgaXMgaWdub3JlZC5cblx0ICovXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyB0cmFuc2xhdGlvbjogTG9nZ2luZ1ZpZXdlclRyYW5zbGF0aW9uO1xuXG5cdC8qKlxuXHQgKiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhbFN0b3JhZ2VLZXlzLiBJZiBzZXQsIHRoZSBsb2dzIGdldCBsb2FkZWQgZnJvbSBsb2NhbFN0b3JhZ2UgaW5zdGVhZCBvZiBtZW1vcnkuXG5cdCAqL1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgbG9jYWxTdG9yYWdlS2V5czogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBGbGFnIHNob3dpbmcgYSBkZWxldGUgYnV0dG9uLCB3aGljaCByZW1vdmVzIGFsbCBleGlzdGluZyBsb2cgbWVzc2FnZXMuXG5cdCAqL1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgYWxsb3dDbGVhckxvZ3M6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEZsYWcgY29udHJvbGxpbmcgd2hpY2ggY2xvc2UgYnV0dG9uIHdpbGwgYmUgc2hvd24uXG5cdCAqL1xuXHRwdWJsaWMgaXNBbmRyb2lkOiBib29sZWFuO1xuXG5cdHByaXZhdGUgbG9nZ2VyOiBMb2dnZXI7XG5cblx0cHJpdmF0ZSB0cmFuc2xhdGlvbnM6IHsgW2xhbmd1YWdlOiBzdHJpbmddOiBMb2dnaW5nVmlld2VyVHJhbnNsYXRpb24gfTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0Y29uc3RydWN0b3IoXG5cdFx0cGxhdGZvcm06IFBsYXRmb3JtLFxuXHRcdHByaXZhdGUgYWxlcnRDb250cm9sbGVyOiBBbGVydENvbnRyb2xsZXIsXG5cdFx0cHJpdmF0ZSBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcblx0XHRwcml2YXRlIGxvZ2dpbmdTZXJ2aWNlOiBMb2dnaW5nU2VydmljZSkge1xuXG5cdFx0dGhpcy5sb2dnZXIgPSBsb2dnaW5nU2VydmljZS5nZXRMb2dnZXIoXCJJb25pYy5Mb2dnaW5nLlZpZXdlci5Nb2RhbC5Db21wb25lbnRcIik7XG5cdFx0Y29uc3QgbWV0aG9kTmFtZSA9IFwiY3RvclwiO1xuXHRcdHRoaXMubG9nZ2VyLmVudHJ5KG1ldGhvZE5hbWUpO1xuXG5cdFx0dGhpcy5pc0FuZHJvaWQgPSBwbGF0Zm9ybS5pcyhcImFuZHJvaWRcIik7XG5cblx0XHR0aGlzLmxvZ2dlci5leGl0KG1ldGhvZE5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSBMb2dnaW5nVmlld2VyTW9kYWxDb21wb25lbnQuXG5cdCAqIEl0IGNvbmZpZ3VyZXMgdGhlIHN1cHBvcnRlZCB0cmFuc2xhdGlvbnMuXG5cdCAqL1xuXHRwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG5cdFx0Ly8gcHJlcGFyZSB0cmFuc2xhdGlvbnNcblx0XHR0aGlzLnRyYW5zbGF0aW9ucyA9IHt9O1xuXHRcdHRoaXMudHJhbnNsYXRpb25zW0xvZ2dpbmdWaWV3ZXJNb2RhbENvbXBvbmVudC5sYW5ndWFnZUVuXSA9IHtcblx0XHRcdGNhbmNlbDogXCJDYW5jZWxcIixcblx0XHRcdGNvbmZpcm1EZWxldGU6IFwiRGVsZXRlIGFsbCBsb2cgbWVzc2FnZXM/XCIsXG5cdFx0XHRvazogXCJPa1wiLFxuXHRcdFx0c2VhcmNoUGxhY2Vob2xkZXI6IFwiU2VhcmNoXCIsXG5cdFx0XHR0aXRsZTogXCJMb2dnaW5nXCIsXG5cdFx0fTtcblx0XHR0aGlzLnRyYW5zbGF0aW9uc1tMb2dnaW5nVmlld2VyTW9kYWxDb21wb25lbnQubGFuZ3VhZ2VEZV0gPSB7XG5cdFx0XHRjYW5jZWw6IFwiQWJicmVjaGVuXCIsXG5cdFx0XHRjb25maXJtRGVsZXRlOiBcIkFsbGUgTG9ncyBsw7ZzY2hlbj9cIixcblx0XHRcdG9rOiBcIk9rXCIsXG5cdFx0XHRzZWFyY2hQbGFjZWhvbGRlcjogXCJTdWNoZW5cIixcblx0XHRcdHRpdGxlOiBcIkxvZ2dpbmdcIixcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50aGFuZGxlciBjYWxsZWQgYnkgSW9uaWMgd2hlbiB0aGUgbW9kYWwgaXMgb3BlbmVkLlxuXHQgKi9cblx0cHVibGljIGlvblZpZXdEaWRFbnRlcigpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRob2ROYW1lID0gXCJpb25WaWV3RGlkRW50ZXJcIjtcblx0XHR0aGlzLmxvZ2dlci5lbnRyeShtZXRob2ROYW1lKTtcblxuXHRcdHRoaXMubG9nZ2VyLmV4aXQobWV0aG9kTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnRoYW5kbGVyIGNhbGxlZCB3aGVuIHRoZSBjYW5jZWwgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtZXRob2ROYW1lID0gXCJvbkNsb3NlXCI7XG5cdFx0dGhpcy5sb2dnZXIuZW50cnkobWV0aG9kTmFtZSk7XG5cblx0XHRhd2FpdCB0aGlzLm1vZGFsQ29udHJvbGxlci5kaXNtaXNzKCk7XG5cblx0XHR0aGlzLmxvZ2dlci5leGl0KG1ldGhvZE5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50aGFuZGxlciBjYWxsZWQgd2hlbiB0aGUgY2xlYXIgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgb25DbGVhckxvZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbWV0aG9kTmFtZSA9IFwib25DbGVhckxvZ3NcIjtcblx0XHR0aGlzLmxvZ2dlci5lbnRyeShtZXRob2ROYW1lKTtcblxuXHRcdGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcblx0XHRcdGhlYWRlcjogdGhpcy5nZXRUcmFuc2xhdGlvbigpLmNvbmZpcm1EZWxldGUsXG5cdFx0XHRidXR0b25zOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZXh0OiB0aGlzLmdldFRyYW5zbGF0aW9uKCkuY2FuY2VsLFxuXHRcdFx0XHRcdHJvbGU6IFwiY2FuY2VsXCIsXG5cdFx0XHRcdFx0Y3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRleHQ6IHRoaXMuZ2V0VHJhbnNsYXRpb24oKS5vayxcblx0XHRcdFx0XHRoYW5kbGVyOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmNsZWFyTG9ncygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdF1cblx0XHR9KTtcblx0XHRhd2FpdCBhbGVydC5wcmVzZW50KCk7XG5cblx0XHR0aGlzLmxvZ2dlci5leGl0KG1ldGhvZE5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIGxvZ3MuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJMb2dzKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmxvY2FsU3RvcmFnZUtleXMpIHtcblx0XHRcdGZvciAoY29uc3QgbG9jYWxTdG9yYWdlS2V5IG9mIHRoaXMubG9jYWxTdG9yYWdlS2V5cy5zcGxpdChcIixcIikpIHtcblx0XHRcdFx0dGhpcy5sb2dnaW5nU2VydmljZS5yZW1vdmVMb2dNZXNzYWdlc0Zyb21Mb2NhbFN0b3JhZ2UobG9jYWxTdG9yYWdlS2V5KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5sb2dnaW5nU2VydmljZS5yZW1vdmVMb2dNZXNzYWdlcygpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgbWV0aG9kIHJldHVybmluZyB0aGUgY3VycmVudCB0cmFuc2xhdGlvbjpcblx0ICogLSB0aGUgcHJvcGVydHkgdHJhbnNsYXRpb24gaWYgZGVmaW5lZFxuXHQgKiAtIHRoZSB0cmFuc2xhdGlvbiBhY2NvcmRpbmcgcHJvcGVydHkgbGFuZ3VhZ2UgaWYgdmFsaWRcblx0ICogLSBFbmdsaXNoIHRyYW5zbGF0aW9uLCBvdGhlcndpc2Vcblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2xhdGlvbigpOiBMb2dnaW5nVmlld2VyVHJhbnNsYXRpb24ge1xuXHRcdGlmICh0eXBlb2YgdGhpcy50cmFuc2xhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRpb247XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdGhpcy5sYW5ndWFnZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgdGhpcy50cmFuc2xhdGlvbnNbdGhpcy5sYW5ndWFnZV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0aW9uc1t0aGlzLmxhbmd1YWdlXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRpb25zW0xvZ2dpbmdWaWV3ZXJNb2RhbENvbXBvbmVudC5sYW5ndWFnZUVuXTtcblx0XHR9XG5cdH1cbn1cbiIsIjxpb24taGVhZGVyPlxuXHQ8aW9uLXRvb2xiYXIgY29sb3I9cHJpbWFyeT5cblx0XHQ8aW9uLXRpdGxlPnt7IGdldFRyYW5zbGF0aW9uKCkudGl0bGUgfX08L2lvbi10aXRsZT5cblx0XHQ8aW9uLWJ1dHRvbnMgc2xvdD1cInN0YXJ0XCI+XG5cdFx0XHQ8aW9uLWJ1dHRvbiAqbmdJZj1cIiFpc0FuZHJvaWRcIiAoY2xpY2spPVwib25DbG9zZSgpXCI+XG5cdFx0XHRcdHt7IGdldFRyYW5zbGF0aW9uKCkuY2FuY2VsIH19XG5cdFx0XHQ8L2lvbi1idXR0b24+XG5cdFx0XHQ8aW9uLWJ1dHRvbiAqbmdJZj1cImlzQW5kcm9pZFwiIGljb24tb25seSAoY2xpY2spPVwib25DbG9zZSgpXCI+XG5cdFx0XHRcdDxpb24taWNvbiBuYW1lPVwibWQtY2xvc2VcIj48L2lvbi1pY29uPlxuXHRcdFx0PC9pb24tYnV0dG9uPlxuXHRcdDwvaW9uLWJ1dHRvbnM+XG5cdDwvaW9uLXRvb2xiYXI+XG5cdDxpb24tdG9vbGJhcj5cblx0XHQ8aW9uaWMtbG9nZ2luZy12aWV3ZXItc2VhcmNoIFtwbGFjZWhvbGRlcl09XCJnZXRUcmFuc2xhdGlvbigpLnNlYXJjaFBsYWNlaG9sZGVyXCI+PC9pb25pYy1sb2dnaW5nLXZpZXdlci1zZWFyY2g+XG5cdFx0PGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIiAqbmdJZj1cImFsbG93Q2xlYXJMb2dzICE9PSBmYWxzZVwiIGNsYXNzPVwiY2xlYXJMb2dzXCI+XG5cdFx0XHQ8aW9uLWJ1dHRvbiAoY2xpY2spPVwib25DbGVhckxvZ3MoKVwiPlxuXHRcdFx0XHQ8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIj48L2lvbi1pY29uPlxuXHRcdFx0PC9pb24tYnV0dG9uPlxuXHRcdDwvaW9uLWJ1dHRvbnM+XG5cdDwvaW9uLXRvb2xiYXI+XG5cdDxpb24tdG9vbGJhcj5cblx0XHQ8aW9uaWMtbG9nZ2luZy12aWV3ZXItbGV2ZWxzPjwvaW9uaWMtbG9nZ2luZy12aWV3ZXItbGV2ZWxzPlxuXHQ8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuXHQ8aW9uaWMtbG9nZ2luZy12aWV3ZXIgW2xvY2FsU3RvcmFnZUtleXNdPVwibG9jYWxTdG9yYWdlS2V5c1wiPjwvaW9uaWMtbG9nZ2luZy12aWV3ZXI+XG48L2lvbi1jb250ZW50PiJdfQ==