@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
126 lines • 18.4 kB
JavaScript
import { Component, EventEmitter, Injector, Input, Output, ViewChild, ViewContainerRef } from '@angular/core';
import { Router } from '@angular/router';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { WizardService } from '../wizard.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "../wizard.service";
import * as i3 from "@angular/common";
import * as i4 from "../../common/icon.directive";
import * as i5 from "../../i18n/c8y-translate.directive";
import * as i6 from "../../i18n/c8y-translate.pipe";
export class WizardOutletComponent {
constructor(router, c8yWizardService, viewContainerRef, injector) {
this.router = router;
this.c8yWizardService = c8yWizardService;
this.viewContainerRef = viewContainerRef;
this.injector = injector;
/**
* The initial state to be assigned to the created component.
*/
this.initialState = {};
/**
* The event that is emitted when the wizard entry is clicked.
*/
this.onSelect = new EventEmitter();
/**
* The event that is emitted when the URL path is provided.
*/
this.onPath = new EventEmitter();
/**
* List of wizard entries.
*/
this.entries = [];
/**
* @ignore
*/
this.showList = true;
/**
* @ignore
*/
this.destroy$ = new Subject();
}
ngAfterViewInit() {
this.c8yWizardService
.getEntriesListById(this.id)
.pipe(takeUntil(this.destroy$))
.subscribe((entries) => {
this.container.clear();
this.entries = entries;
this.onEntriesLoaded();
});
}
/**
* Handles the wizard entry, if the entry contains a path, the user will be redirected to it.
* Otherwise, an attempt will be made to create a dynamic component provided in the entry.
* @param entry Wizard menu entry.
*/
handleEntry(entry = {}) {
const { path, component, injector } = entry;
if (path) {
this.handlePath(path);
return;
}
if (component) {
this.handleComponent(component, injector);
this.onSelect.emit(entry);
}
}
/**
* Resets the wizard to its initial state.
*/
reset() {
if (this.componentInstance) {
this.componentInstance = undefined;
this.container.clear();
this.showList = true;
}
}
ngOnDestroy() {
if (this.componentInstance) {
this.container.clear();
}
this.destroy$.next(true);
this.destroy$.unsubscribe();
}
onEntriesLoaded() {
const [firstEntry] = this.entries;
const isSingleEntry = this.entries.length === 1;
const shouldRedirectToPath = firstEntry && !!firstEntry.path;
const shouldOmitListOfEntries = isSingleEntry && !shouldRedirectToPath;
if (shouldOmitListOfEntries) {
this.handleEntry(firstEntry);
}
}
handlePath(path) {
this.router.navigateByUrl(path);
this.onPath.emit(path);
}
handleComponent(component, injector) {
this.showList = false;
const componentInstance = this.viewContainerRef.createComponent(component, {
environmentInjector: (injector || this.injector)
});
Object.assign(componentInstance.instance, this.initialState);
this.componentInstance = componentInstance;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardOutletComponent, deps: [{ token: i1.Router }, { token: i2.WizardService }, { token: i0.ViewContainerRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WizardOutletComponent, selector: "c8y-wizard-outlet", inputs: { initialState: "initialState", id: "id" }, outputs: { onSelect: "onSelect", onPath: "onPath" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container>\n <div class=\"modal-inner-scroll animated fadeIn\" *ngIf=\"showList\" id=\"modal-body\">\n <p class=\"p-16 text-center text-medium separator-bottom\">\n <span translate>Select method</span>\n </p>\n <div class=\"list-group list-group-links\" *ngIf=\"entries.length > 0; else emptyState\">\n <button\n *ngFor=\"let entry of entries\"\n type=\"button\"\n class=\"list-group-item d-flex a-i-center p-t-8 p-b-8\"\n (click)=\"handleEntry(entry)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"entry.c8yIcon || 'cogs'\"></i>\n </div>\n <div title=\"{{ entry.name | translate }}\" class=\"list-item-body text-truncate\">\n {{ entry.name | translate }}\n </div>\n </button>\n </div>\n\n <ng-template #emptyState>\n <div class=\"c8y-empty-state\">\n <p>{{ 'No options available.' | translate }}</p>\n </div>\n </ng-template>\n </div>\n</ng-container>\n<template #container [hidden]=\"showList\"></template>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: i6.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardOutletComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-wizard-outlet', template: "<ng-container>\n <div class=\"modal-inner-scroll animated fadeIn\" *ngIf=\"showList\" id=\"modal-body\">\n <p class=\"p-16 text-center text-medium separator-bottom\">\n <span translate>Select method</span>\n </p>\n <div class=\"list-group list-group-links\" *ngIf=\"entries.length > 0; else emptyState\">\n <button\n *ngFor=\"let entry of entries\"\n type=\"button\"\n class=\"list-group-item d-flex a-i-center p-t-8 p-b-8\"\n (click)=\"handleEntry(entry)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"entry.c8yIcon || 'cogs'\"></i>\n </div>\n <div title=\"{{ entry.name | translate }}\" class=\"list-item-body text-truncate\">\n {{ entry.name | translate }}\n </div>\n </button>\n </div>\n\n <ng-template #emptyState>\n <div class=\"c8y-empty-state\">\n <p>{{ 'No options available.' | translate }}</p>\n </div>\n </ng-template>\n </div>\n</ng-container>\n<template #container [hidden]=\"showList\"></template>\n" }]
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.WizardService }, { type: i0.ViewContainerRef }, { type: i0.Injector }], propDecorators: { container: [{
type: ViewChild,
args: ['container', { read: ViewContainerRef }]
}], initialState: [{
type: Input
}], id: [{
type: Input
}], onSelect: [{
type: Output
}], onPath: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLW91dGxldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb3JlL3dpemFyZC93aXphcmQtb3V0bGV0L3dpemFyZC1vdXRsZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vY29yZS93aXphcmQvd2l6YXJkLW91dGxldC93aXphcmQtb3V0bGV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBR1QsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7QUFNbEQsTUFBTSxPQUFPLHFCQUFxQjtJQW1DaEMsWUFDVSxNQUFjLEVBQ2QsZ0JBQStCLEVBQy9CLGdCQUFrQyxFQUNsQyxRQUFrQjtRQUhsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFlO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXJDNUI7O1dBRUc7UUFDTSxpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQU1oQzs7V0FFRztRQUNPLGFBQVEsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuRTs7V0FFRztRQUNPLFdBQU0sR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1RDs7V0FFRztRQUNILFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBQzVCOztXQUVHO1FB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QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0lBQzdDLENBQUM7K0dBakhVLHFCQUFxQjttR0FBckIscUJBQXFCLHFQQUNBLGdCQUFnQiw2QkN6QmxELGdpQ0E2QkE7OzRGRExhLHFCQUFxQjtrQkFKakMsU0FBUzsrQkFDRSxtQkFBbUI7NkpBSXVCLFNBQVM7c0JBQTVELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUl6QyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLEVBQUU7c0JBQVYsS0FBSztnQkFJSSxRQUFRO3NCQUFqQixNQUFNO2dCQUlHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFR5cGUsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBXaXphcmRFbnRyeSB9IGZyb20gJy4uL3dpemFyZC5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmRTZXJ2aWNlIH0gZnJvbSAnLi4vd2l6YXJkLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktd2l6YXJkLW91dGxldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aXphcmQtb3V0bGV0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaXphcmRPdXRsZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgc3RhdGUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaW5pdGlhbFN0YXRlOiBhbnkgPSB7fTtcbiAgLyoqXG4gICAqIFRoZSBpZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgcGFydGljdWxhciB3aXphcmQgYW5kIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGl0IHdoZW4gaG9va2luZyB3aXphcmQgZW50cmllcy5cbiAgICogRXhhbXBsZTogXCJ3aXphcmRJZFwiLlxuICAgKi9cbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgd2l6YXJkIGVudHJ5IGlzIGNsaWNrZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjxXaXphcmRFbnRyeT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIFVSTCBwYXRoIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uUGF0aDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHdpemFyZCBlbnRyaWVzLlxuICAgKi9cbiAgZW50cmllczogV2l6YXJkRW50cnlbXSA9IFtdO1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2hvd0xpc3QgPSB0cnVlO1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIGNvbXBvbmVudEluc3RhbmNlOiBDb21wb25lbnRSZWY8dW5rbm93bj47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBjOHlXaXphcmRTZXJ2aWNlOiBXaXphcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuYzh5V2l6YXJkU2VydmljZVxuICAgICAgLmdldEVudHJpZXNMaXN0QnlJZCh0aGlzLmlkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoZW50cmllczogV2l6YXJkRW50cnlbXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICAgICAgICB0aGlzLm9uRW50cmllc0xvYWRlZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgd2l6YXJkIGVudHJ5LCBpZiB0aGUgZW50cnkgY29udGFpbnMgYSBwYXRoLCB0aGUgdXNlciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gaXQuXG4gICAqIE90aGVyd2lzZSwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gY3JlYXRlIGEgZHluYW1pYyBjb21wb25lbnQgcHJvdmlkZWQgaW4gdGhlIGVudHJ5LlxuICAgKiBAcGFyYW0gZW50cnkgV2l6YXJkIG1lbnUgZW50cnkuXG4gICAqL1xuICBoYW5kbGVFbnRyeShlbnRyeTogV2l6YXJkRW50cnkgPSB7fSBhcyBXaXphcmRFbnRyeSkge1xuICAgIGNvbnN0IHsgcGF0aCwgY29tcG9uZW50LCBpbmplY3RvciB9ID0gZW50cnk7XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGF0aChwYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbXBvbmVudChjb21wb25lbnQsIGluamVjdG9yKTtcbiAgICAgIHRoaXMub25TZWxlY3QuZW1pdChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgd2l6YXJkIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgdGhpcy5zaG93TGlzdCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRW50cmllc0xvYWRlZCgpIHtcbiAgICBjb25zdCBbZmlyc3RFbnRyeV0gPSB0aGlzLmVudHJpZXM7XG4gICAgY29uc3QgaXNTaW5nbGVFbnRyeSA9IHRoaXMuZW50cmllcy5sZW5ndGggPT09IDE7XG4gICAgY29uc3Qgc2hvdWxkUmVkaXJlY3RUb1BhdGggPSBmaXJzdEVudHJ5ICYmICEhZmlyc3RFbnRyeS5wYXRoO1xuICAgIGNvbnN0IHNob3VsZE9taXRMaXN0T2ZFbnRyaWVzID0gaXNTaW5nbGVFbnRyeSAmJiAhc2hvdWxkUmVkaXJlY3RUb1BhdGg7XG5cbiAgICBpZiAoc2hvdWxkT21pdExpc3RPZkVudHJpZXMpIHtcbiAgICAgIHRoaXMuaGFuZGxlRW50cnkoZmlyc3RFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQYXRoKHBhdGg6IHN0cmluZykge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocGF0aCk7XG4gICAgdGhpcy5vblBhdGguZW1pdChwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTx1bmtub3duPiwgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5zaG93TGlzdCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IChpbmplY3RvciB8fCB0aGlzLmluamVjdG9yKSBhcyBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZSwgdGhpcy5pbml0aWFsU3RhdGUpO1xuICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnRJbnN0YW5jZTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWlubmVyLXNjcm9sbCBhbmltYXRlZCBmYWRlSW5cIiAqbmdJZj1cInNob3dMaXN0XCIgaWQ9XCJtb2RhbC1ib2R5XCI+XG4gICAgPHAgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHRleHQtbWVkaXVtIHNlcGFyYXRvci1ib3R0b21cIj5cbiAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TZWxlY3QgbWV0aG9kPC9zcGFuPlxuICAgIDwvcD5cbiAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWxpbmtzXCIgKm5nSWY9XCJlbnRyaWVzLmxlbmd0aCA+IDA7IGVsc2UgZW1wdHlTdGF0ZVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdGb3I9XCJsZXQgZW50cnkgb2YgZW50cmllc1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkLWZsZXggYS1pLWNlbnRlciBwLXQtOCBwLWItOFwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVFbnRyeShlbnRyeSlcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1pdGVtLWljb25cIj5cbiAgICAgICAgICA8aSBbYzh5SWNvbl09XCJlbnRyeS5jOHlJY29uIHx8ICdjb2dzJ1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgdGl0bGU9XCJ7eyBlbnRyeS5uYW1lIHwgdHJhbnNsYXRlIH19XCIgY2xhc3M9XCJsaXN0LWl0ZW0tYm9keSB0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAge3sgZW50cnkubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZVwiPlxuICAgICAgICA8cD57eyAnTm8gb3B0aW9ucyBhdmFpbGFibGUuJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48dGVtcGxhdGUgI2NvbnRhaW5lciBbaGlkZGVuXT1cInNob3dMaXN0XCI+PC90ZW1wbGF0ZT5cbiJdfQ==