@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
133 lines • 19.6 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Inject, Injectable, } from '@angular/core';
import { NavigationStart } from '@angular/router';
import { ReplaySubject, filter, takeUntil } from 'rxjs';
import { DokuActiveModal, DokuModalRef } from './modal-ref';
import { ViewElement } from './view-element';
import * as i0 from "@angular/core";
import * as i1 from "../backdrop/backdrop.service";
import * as i2 from "@angular/router";
export class DokuModalService {
constructor(envInjector, appRef, document, backdropService, injector, router) {
this.envInjector = envInjector;
this.appRef = appRef;
this.document = document;
this.backdropService = backdropService;
this.injector = injector;
this.router = router;
this.modalRefs = [];
this.destroy$ = new ReplaySubject();
this.router.events
.pipe(filter((ev) => ev instanceof NavigationStart), takeUntil(this.destroy$))
.subscribe(() => this.closeAll());
}
ngOnDestroy() {
this.closeAll();
this.destroy$.next(true);
this.destroy$.complete();
}
open(componentOrTemplateRef, config) {
const activeModal = new DokuActiveModal();
const view = ViewElement.createElement(componentOrTemplateRef, {
environmentInjector: this.envInjector,
applicationRef: this.appRef,
document: this.document,
activeModal: activeModal,
injector: this.injector,
});
// Add portal class (if exists) to the portal element
if (config?.portalClass) {
view.element.portal.classList.add(config.portalClass);
}
const componentInstance = view.content.componentRef?.instance || view.content.templateRef?.context;
const modalRef = new DokuModalRef(this, componentInstance, view);
const normalizedConfig = this.setViewByConfig(view, config);
activeModal['_config'] = normalizedConfig;
activeModal.close = modalRef.close.bind(modalRef);
setTimeout(() => {
const { backdropRef } = ViewElement.appendToBody(view, {
backdropService: this.backdropService,
document: this.document,
});
modalRef['backdropRef'] = backdropRef;
// Add overflow-hidden class to the document body
this.document.body.classList.add('d-body-overflow-hidden');
view.content.componentRef?.changeDetectorRef.detectChanges();
view.content.templateRef?.detectChanges();
// Remove focus on trigger element
this.document.activeElement?.blur();
}, 0);
this.modalRefs.push(modalRef);
return modalRef;
}
closeAll() {
this.modalRefs.forEach((ref) => this.close(ref));
}
close(modalRef) {
if (!modalRef['view'])
return;
ViewElement.removeFromBody(modalRef['view'], {
backdropService: this.backdropService,
document: this.document,
backdropRef: modalRef['backdropRef'],
});
modalRef['view'] = undefined;
this.modalRefs = this.modalRefs.filter((ref) => ref !== modalRef);
// Remove overflow-hidden class from document body if all of the modals have been closed.
if (!this.modalRefs.length) {
this.document.body.classList.remove('d-body-overflow-hidden');
}
}
/**
* @returns Normalized DokuModalConfig
*/
setViewByConfig(view, config) {
const normalizedConfig = { ...config };
if (config?.centered === undefined || config.centered === null) {
normalizedConfig.centered = true;
}
if (!config?.variant)
normalizedConfig.variant = 'info';
if (!config?.size)
normalizedConfig.size = 'medium';
if (normalizedConfig.variant) {
view.element.modal.classList.add(`d-modal-variant-${normalizedConfig.variant}`);
if (normalizedConfig.variant === 'form') {
view.element.modal.classList.add('d-modal-scrollable-content');
}
if (normalizedConfig.variant === 'confirmation') {
normalizedConfig.confirmationOptions = { ...normalizedConfig.confirmationOptions };
// Set default size if not set explicitly.
if (!config?.size)
normalizedConfig.size = 'small';
// Set default icon type if not set explicitly.
if (!config?.confirmationOptions?.iconType) {
normalizedConfig.confirmationOptions.iconType = 'warning';
}
// Set default show icon if not set explicitly.
if (!config?.confirmationOptions?.showIcon) {
normalizedConfig.confirmationOptions.showIcon = true;
}
}
}
if (normalizedConfig.centered) {
view.element.modal.classList.add('d-modal-centered');
}
if (normalizedConfig.size) {
view.element.modal.classList.add(`d-modal-${normalizedConfig.size}`);
}
return normalizedConfig;
}
}
DokuModalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuModalService, deps: [{ token: i0.EnvironmentInjector }, { token: i0.ApplicationRef }, { token: DOCUMENT }, { token: i1.DokuBackdropService }, { token: i0.Injector }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
DokuModalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuModalService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuModalService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i0.EnvironmentInjector }, { type: i0.ApplicationRef }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i1.DokuBackdropService }, { type: i0.Injector }, { type: i2.Router }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9tb2RhbC9tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBR0wsTUFBTSxFQUNOLFVBQVUsR0FJWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUs3QyxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ1UsV0FBZ0MsRUFDaEMsTUFBc0IsRUFDSixRQUFrQixFQUNwQyxlQUFvQyxFQUNwQyxRQUFrQixFQUNsQixNQUFjO1FBTGQsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ0osYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNwQyxvQkFBZSxHQUFmLGVBQWUsQ0FBcUI7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBVmQsY0FBUyxHQUE0QixFQUFFLENBQUM7UUFFMUMsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFVckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxZQUFZLGVBQWUsQ0FBQyxFQUM3QyxTQUFTLENBQUMsSUFBSSxD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Y0FGZixNQUFNOzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVNJLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uUmVmLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEb2t1QmFja2Ryb3BTZXJ2aWNlIH0gZnJvbSAnLi4vYmFja2Ryb3AvYmFja2Ryb3Auc2VydmljZSc7XG5pbXBvcnQgeyBEb2t1QWN0aXZlTW9kYWwsIERva3VNb2RhbFJlZiB9IGZyb20gJy4vbW9kYWwtcmVmJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIERva3VNb2RhbENvbmZpZyB9IGZyb20gJy4vbW9kYWwuaW50ZXJmYWNlJztcbmltcG9ydCB7IFZpZXdFbGVtZW50IH0gZnJvbSAnLi92aWV3LWVsZW1lbnQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdU1vZGFsU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBtb2RhbFJlZnM6IERva3VNb2RhbFJlZjx1bmtub3duPltdID0gW107XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbnZJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBiYWNrZHJvcFNlcnZpY2U6IERva3VCYWNrZHJvcFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2KSA9PiBldiBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlQWxsKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFsbCgpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBvcGVuPFQ+KFxuICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcbiAgICBjb25maWc/OiBEb2t1TW9kYWxDb25maWdcbiAgKTogRG9rdU1vZGFsUmVmPFQ+IHtcbiAgICBjb25zdCBhY3RpdmVNb2RhbCA9IG5ldyBEb2t1QWN0aXZlTW9kYWwoKTtcblxuICAgIGNvbnN0IHZpZXcgPSBWaWV3RWxlbWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIHtcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgICBhcHBsaWNhdGlvblJlZjogdGhpcy5hcHBSZWYsXG4gICAgICBkb2N1bWVudDogdGhpcy5kb2N1bWVudCxcbiAgICAgIGFjdGl2ZU1vZGFsOiBhY3RpdmVNb2RhbCxcbiAgICAgIGluamVjdG9yOiB0aGlzLmluamVjdG9yLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHBvcnRhbCBjbGFzcyAoaWYgZXhpc3RzKSB0byB0aGUgcG9ydGFsIGVsZW1lbnRcbiAgICBpZiAoY29uZmlnPy5wb3J0YWxDbGFzcykge1xuICAgICAgdmlldy5lbGVtZW50LnBvcnRhbC5jbGFzc0xpc3QuYWRkKGNvbmZpZy5wb3J0YWxDbGFzcyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPVxuICAgICAgdmlldy5jb250ZW50LmNvbXBvbmVudFJlZj8uaW5zdGFuY2UgfHwgdmlldy5jb250ZW50LnRlbXBsYXRlUmVmPy5jb250ZXh0O1xuXG4gICAgY29uc3QgbW9kYWxSZWYgPSBuZXcgRG9rdU1vZGFsUmVmPFQ+KHRoaXMsIDxUPmNvbXBvbmVudEluc3RhbmNlLCB2aWV3KTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB0aGlzLnNldFZpZXdCeUNvbmZpZyh2aWV3LCBjb25maWcpO1xuXG4gICAgYWN0aXZlTW9kYWxbJ19jb25maWcnXSA9IG5vcm1hbGl6ZWRDb25maWc7XG4gICAgYWN0aXZlTW9kYWwuY2xvc2UgPSBtb2RhbFJlZi5jbG9zZS5iaW5kKG1vZGFsUmVmKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgeyBiYWNrZHJvcFJlZiB9ID0gVmlld0VsZW1lbnQuYXBwZW5kVG9Cb2R5KHZpZXcsIHtcbiAgICAgICAgYmFja2Ryb3BTZXJ2aWNlOiB0aGlzLmJhY2tkcm9wU2VydmljZSxcbiAgICAgICAgZG9jdW1lbnQ6IHRoaXMuZG9jdW1lbnQsXG4gICAgICB9KTtcblxuICAgICAgbW9kYWxSZWZbJ2JhY2tkcm9wUmVmJ10gPSBiYWNrZHJvcFJlZjtcblxuICAgICAgLy8gQWRkIG92ZXJmbG93LWhpZGRlbiBjbGFzcyB0byB0aGUgZG9jdW1lbnQgYm9keVxuICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2QtYm9keS1vdmVyZmxvdy1oaWRkZW4nKTtcblxuICAgICAgdmlldy5jb250ZW50LmNvbXBvbmVudFJlZj8uY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdmlldy5jb250ZW50LnRlbXBsYXRlUmVmPy5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIFJlbW92ZSBmb2N1cyBvbiB0cmlnZ2VyIGVsZW1lbnRcbiAgICAgICh0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpPy5ibHVyKCk7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLm1vZGFsUmVmcy5wdXNoKG1vZGFsUmVmKTtcbiAgICByZXR1cm4gbW9kYWxSZWY7XG4gIH1cblxuICBjbG9zZUFsbCgpIHtcbiAgICB0aGlzLm1vZGFsUmVmcy5mb3JFYWNoKChyZWYpID0+IHRoaXMuY2xvc2UocmVmKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xvc2UobW9kYWxSZWY6IERva3VNb2RhbFJlZjx1bmtub3duPikge1xuICAgIGlmICghbW9kYWxSZWZbJ3ZpZXcnXSkgcmV0dXJuO1xuICAgIFZpZXdFbGVtZW50LnJlbW92ZUZyb21Cb2R5KG1vZGFsUmVmWyd2aWV3J10sIHtcbiAgICAgIGJhY2tkcm9wU2VydmljZTogdGhpcy5iYWNrZHJvcFNlcnZpY2UsXG4gICAgICBkb2N1bWVudDogdGhpcy5kb2N1bWVudCxcbiAgICAgIGJhY2tkcm9wUmVmOiBtb2RhbFJlZlsnYmFja2Ryb3BSZWYnXSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZlsndmlldyddID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubW9kYWxSZWZzID0gdGhpcy5tb2RhbFJlZnMuZmlsdGVyKChyZWYpID0+IHJlZiAhPT0gbW9kYWxSZWYpO1xuXG4gICAgLy8gUmVtb3ZlIG92ZXJmbG93LWhpZGRlbiBjbGFzcyBmcm9tIGRvY3VtZW50IGJvZHkgaWYgYWxsIG9mIHRoZSBtb2RhbHMgaGF2ZSBiZWVuIGNsb3NlZC5cbiAgICBpZiAoIXRoaXMubW9kYWxSZWZzLmxlbmd0aCkge1xuICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2QtYm9keS1vdmVyZmxvdy1oaWRkZW4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBEb2t1TW9kYWxDb25maWdcbiAgICovXG4gIHByaXZhdGUgc2V0Vmlld0J5Q29uZmlnKFxuICAgIHZpZXc6IFJldHVyblR5cGU8dHlwZW9mIFZpZXdFbGVtZW50LmNyZWF0ZUVsZW1lbnQ+LFxuICAgIGNvbmZpZz86IERva3VNb2RhbENvbmZpZ1xuICApOiBEb2t1TW9kYWxDb25maWcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuXG4gICAgaWYgKGNvbmZpZz8uY2VudGVyZWQgPT09IHVuZGVmaW5lZCB8fCBjb25maWcuY2VudGVyZWQgPT09IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb25maWcuY2VudGVyZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZz8udmFyaWFudCkgbm9ybWFsaXplZENvbmZpZy52YXJpYW50ID0gJ2luZm8nO1xuICAgIGlmICghY29uZmlnPy5zaXplKSBub3JtYWxpemVkQ29uZmlnLnNpemUgPSAnbWVkaXVtJztcblxuICAgIGlmIChub3JtYWxpemVkQ29uZmlnLnZhcmlhbnQpIHtcbiAgICAgIHZpZXcuZWxlbWVudC5tb2RhbC5jbGFzc0xpc3QuYWRkKGBkLW1vZGFsLXZhcmlhbnQtJHtub3JtYWxpemVkQ29uZmlnLnZhcmlhbnR9YCk7XG5cbiAgICAgIGlmIChub3JtYWxpemVkQ29uZmlnLnZhcmlhbnQgPT09ICdmb3JtJykge1xuICAgICAgICB2aWV3LmVsZW1lbnQubW9kYWwuY2xhc3NMaXN0LmFkZCgnZC1tb2RhbC1zY3JvbGxhYmxlLWNvbnRlbnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vcm1hbGl6ZWRDb25maWcudmFyaWFudCA9PT0gJ2NvbmZpcm1hdGlvbicpIHtcbiAgICAgICAgbm9ybWFsaXplZENvbmZpZy5jb25maXJtYXRpb25PcHRpb25zID0geyAuLi5ub3JtYWxpemVkQ29uZmlnLmNvbmZpcm1hdGlvbk9wdGlvbnMgfTtcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBzaXplIGlmIG5vdCBzZXQgZXhwbGljaXRseS5cbiAgICAgICAgaWYgKCFjb25maWc/LnNpemUpIG5vcm1hbGl6ZWRDb25maWcuc2l6ZSA9ICdzbWFsbCc7XG4gICAgICAgIC8vIFNldCBkZWZhdWx0IGljb24gdHlwZSBpZiBub3Qgc2V0IGV4cGxpY2l0bHkuXG4gICAgICAgIGlmICghY29uZmlnPy5jb25maXJtYXRpb25PcHRpb25zPy5pY29uVHlwZSkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRDb25maWcuY29uZmlybWF0aW9uT3B0aW9ucy5pY29uVHlwZSA9ICd3YXJuaW5nJztcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBzaG93IGljb24gaWYgbm90IHNldCBleHBsaWNpdGx5LlxuICAgICAgICBpZiAoIWNvbmZpZz8uY29uZmlybWF0aW9uT3B0aW9ucz8uc2hvd0ljb24pIHtcbiAgICAgICAgICBub3JtYWxpemVkQ29uZmlnLmNvbmZpcm1hdGlvbk9wdGlvbnMuc2hvd0ljb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY2VudGVyZWQpIHtcbiAgICAgIHZpZXcuZWxlbWVudC5tb2RhbC5jbGFzc0xpc3QuYWRkKCdkLW1vZGFsLWNlbnRlcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRDb25maWcuc2l6ZSkge1xuICAgICAgdmlldy5lbGVtZW50Lm1vZGFsLmNsYXNzTGlzdC5hZGQoYGQtbW9kYWwtJHtub3JtYWxpemVkQ29uZmlnLnNpemV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRDb25maWc7XG4gIH1cbn1cbiJdfQ==