UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

202 lines 21.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ComponentFactoryResolver, Injectable, ApplicationRef, Injector } from '@angular/core'; import { ModalComponent } from '../modal.component'; import { ModalBackdrop } from '../modal-utils/modal-backdrop'; import { ModalContainer } from '../modal-utils/modal-container'; import { ModalConfig } from '../modal-utils/modal-config'; import { ModalRef } from '../modal-utils/modal-ref'; import { ModalInjector } from '../modal-utils/modal-injector'; /** * Service used to dynamically generate a modal. */ export class ModalService { /** * @hidden * @param {?} componentFactoryResolver * @param {?} appRef * @param {?} injector */ constructor(componentFactoryResolver, appRef, injector) { this.componentFactoryResolver = componentFactoryResolver; this.appRef = appRef; this.injector = injector; this.modals = []; } /** * Status of the modal service. * Returns true if there are open modals, false otherwise. * @return {?} */ hasOpenModals() { return this.modals && this.modals.length > 0; } /** * Dismisses all currently open modals. * @return {?} */ dismissAll() { this.modals.forEach((/** * @param {?} item * @return {?} */ item => { this.destroyModalComponent(item.modalRef); })); } /** * Opens a modal component with a content of type TemplateRef or a component type. * @param {?} contentType Content of the modal component. * @param {?=} modalConfig Configuration of the modal component. * @return {?} */ open(contentType, modalConfig = new ModalConfig()) { // Get default values from model modalConfig = Object.assign(new ModalConfig(), modalConfig); // Setup injectable data /** @type {?} */ const configMap = new WeakMap(); /** @type {?} */ const modalRef = new ModalRef(); modalRef.data = (modalConfig ? modalConfig.data : undefined); configMap.set(ModalRef, modalRef); // Prepare container /** @type {?} */ const containerFactory = this.componentFactoryResolver.resolveComponentFactory(ModalContainer); /** @type {?} */ const containerRef = containerFactory.create(this.injector); this.appRef.attachView(containerRef.hostView); // Prepare modal /** @type {?} */ const componentFactory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); /** @type {?} */ const componentRef = componentFactory.create(new ModalInjector(this.injector, configMap)); this.appRef.attachView(componentRef.hostView); // Prepare backdrop /** @type {?} */ let backdropRef; if (modalConfig.hasBackdrop) { /** @type {?} */ const backdropFactory = this.componentFactoryResolver.resolveComponentFactory(ModalBackdrop); backdropRef = backdropFactory.create(new ModalInjector(this.injector, configMap)); this.appRef.attachView(backdropRef.hostView); } // Subscribe to close of modalRef /** @type {?} */ const refSub = modalRef.afterClosed.subscribe((/** * @return {?} */ () => { this.destroyModalComponent(componentRef); refSub.unsubscribe(); }), (/** * @return {?} */ () => { this.destroyModalComponent(componentRef); refSub.unsubscribe(); })); // Assign component attributes /** @type {?} */ const configObj = Object.assign({}, modalConfig); Object.keys(configObj).forEach((/** * @param {?} key * @return {?} */ key => { if (key !== 'data') { componentRef.instance[key] = configObj[key]; if (modalConfig.hasBackdrop) { backdropRef.instance[key] = configObj[key]; } } })); componentRef.instance.childComponentType = contentType; // Sizing componentRef.location.nativeElement.style.minWidth = configObj.minWidth; componentRef.location.nativeElement.style.minHeight = configObj.minHeight; componentRef.location.nativeElement.style.maxWidth = configObj.maxWidth; componentRef.location.nativeElement.style.maxHeight = configObj.maxHeight; componentRef.location.nativeElement.style.width = configObj.width; componentRef.location.nativeElement.style.height = configObj.height; // Render container /** @type {?} */ const containerEl = (/** @type {?} */ (((/** @type {?} */ (containerRef.hostView))).rootNodes[0])); document.body.appendChild(containerEl); // Render backdrop if (modalConfig.hasBackdrop) { /** @type {?} */ const domBackdrop = (/** @type {?} */ (((/** @type {?} */ (backdropRef.hostView))).rootNodes[0])); containerRef.location.nativeElement.appendChild(domBackdrop); } // Render modal /** @type {?} */ const domElement = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0])); containerRef.location.nativeElement.appendChild(domElement); this.modals.push({ modalRef: componentRef, backdropRef: backdropRef, containerRef: containerRef }); return modalRef; } /** * @private * @param {?} modal * @return {?} */ destroyModalComponent(modal) { /** @type {?} */ const arrayRef = this.modals.find((/** * @param {?} item * @return {?} */ (item) => item.modalRef === modal)); /** @type {?} */ const indexOf = this.modals.indexOf(arrayRef); this.appRef.detachView(arrayRef.modalRef.hostView); this.appRef.detachView(arrayRef.containerRef.hostView); arrayRef.containerRef.destroy(); arrayRef.modalRef.destroy(); if (arrayRef.backdropRef) { this.appRef.detachView(arrayRef.backdropRef.hostView); arrayRef.backdropRef.destroy(); } this.modals[indexOf] = null; this.modals = this.modals.filter((/** * @param {?} item * @return {?} */ item => item !== null && item !== undefined)); } } ModalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ModalService.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: ApplicationRef }, { type: Injector } ]; if (false) { /** * @type {?} * @private */ ModalService.prototype.modals; /** * @type {?} * @private */ ModalService.prototype.componentFactoryResolver; /** * @type {?} * @private */ ModalService.prototype.appRef; /** * @type {?} * @private */ ModalService.prototype.injector; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z1bmRhbWVudGFsLW5neC8iLCJzb3VyY2VzIjpbImxpYi9tb2RhbC9tb2RhbC1zZXJ2aWNlL21vZGFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBS1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7QUFNOUQsTUFBTSxPQUFPLFlBQVk7Ozs7Ozs7SUFRckIsWUFBb0Isd0JBQWtELEVBQ2xELE1BQXNCLEVBQ3RCLFFBQWtCO1FBRmxCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVQ5QixXQUFNLEdBSVIsRUFBRSxDQUFDO0lBS2dDLENBQUM7Ozs7OztJQU1uQyxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQzs7Ozs7SUFLTSxVQUFVO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPOzs7O1FBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FB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Ozs7SUFrQlIsOEJBSVM7Ozs7O0lBR0csZ0RBQTBEOzs7OztJQUMxRCw4QkFBOEI7Ozs7O0lBQzlCLGdDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEluamVjdGFibGUsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgRW1iZWRkZWRWaWV3UmVmLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBUeXBlLFxuICAgIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTW9kYWxCYWNrZHJvcCB9IGZyb20gJy4uL21vZGFsLXV0aWxzL21vZGFsLWJhY2tkcm9wJztcbmltcG9ydCB7IE1vZGFsQ29udGFpbmVyIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtY29udGFpbmVyJztcbmltcG9ydCB7IE1vZGFsQ29uZmlnIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtY29uZmlnJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtcmVmJztcbmltcG9ydCB7IE1vZGFsSW5qZWN0b3IgfSBmcm9tICcuLi9tb2RhbC11dGlscy9tb2RhbC1pbmplY3Rvcic7XG5cbi8qKlxuICogU2VydmljZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGEgbW9kYWwuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2Uge1xuICAgIHByaXZhdGUgbW9kYWxzOiB7XG4gICAgICAgIG1vZGFsUmVmOiBDb21wb25lbnRSZWY8TW9kYWxDb21wb25lbnQ+LFxuICAgICAgICBiYWNrZHJvcFJlZj86IENvbXBvbmVudFJlZjxNb2RhbEJhY2tkcm9wPixcbiAgICAgICAgY29udGFpbmVyUmVmPzogQ29tcG9uZW50UmVmPE1vZGFsQ29udGFpbmVyPlxuICAgIH1bXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge31cblxuICAgIC8qKlxuICAgICAqIFN0YXR1cyBvZiB0aGUgbW9kYWwgc2VydmljZS5cbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG9wZW4gbW9kYWxzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGhhc09wZW5Nb2RhbHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGFscyAmJiB0aGlzLm1vZGFscy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc21pc3NlcyBhbGwgY3VycmVudGx5IG9wZW4gbW9kYWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNtaXNzQWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGFscy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95TW9kYWxDb21wb25lbnQoaXRlbS5tb2RhbFJlZik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgbW9kYWwgY29tcG9uZW50IHdpdGggYSBjb250ZW50IG9mIHR5cGUgVGVtcGxhdGVSZWYgb3IgYSBjb21wb25lbnQgdHlwZS5cbiAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgQ29udGVudCBvZiB0aGUgbW9kYWwgY29tcG9uZW50LlxuICAgICAqIEBwYXJhbSBtb2RhbENvbmZpZyBDb25maWd1cmF0aW9uIG9mIHRoZSBtb2RhbCBjb21wb25lbnQuXG4gICAgICovXG4gICAgcHVibGljIG9wZW4oY29udGVudFR5cGU6IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPGFueT4sIG1vZGFsQ29uZmlnOiBNb2RhbENvbmZpZyA9IG5ldyBNb2RhbENvbmZpZygpKTogTW9kYWxSZWYge1xuXG4gICAgICAgIC8vIEdldCBkZWZhdWx0IHZhbHVlcyBmcm9tIG1vZGVsXG4gICAgICAgIG1vZGFsQ29uZmlnID0gT2JqZWN0LmFzc2lnbihuZXcgTW9kYWxDb25maWcoKSwgbW9kYWxDb25maWcpO1xuXG4gICAgICAgIC8vIFNldHVwIGluamVjdGFibGUgZGF0YVxuICAgICAgICBjb25zdCBjb25maWdNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICBjb25zdCBtb2RhbFJlZiA9IG5ldyBNb2RhbFJlZigpO1xuICAgICAgICBtb2RhbFJlZi5kYXRhID0gKG1vZGFsQ29uZmlnID8gbW9kYWxDb25maWcuZGF0YSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbmZpZ01hcC5zZXQoTW9kYWxSZWYsIG1vZGFsUmVmKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBjb250YWluZXJGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTW9kYWxDb250YWluZXIpO1xuICAgICAgICBjb25zdCBjb250YWluZXJSZWYgPSBjb250YWluZXJGYWN0b3J5LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcbiAgICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyhjb250YWluZXJSZWYuaG9zdFZpZXcpO1xuXG4gICAgICAgIC8vIFByZXBhcmUgbW9kYWxcbiAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE1vZGFsQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gY29tcG9uZW50RmFjdG9yeS5jcmVhdGUobmV3IE1vZGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgY29uZmlnTWFwKSk7XG4gICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAvLyBQcmVwYXJlIGJhY2tkcm9wXG4gICAgICAgIGxldCBiYWNrZHJvcFJlZjtcbiAgICAgICAgaWYgKG1vZGFsQ29uZmlnLmhhc0JhY2tkcm9wKSB7XG4gICAgICAgICAgICBjb25zdCBiYWNrZHJvcEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShNb2RhbEJhY2tkcm9wKTtcbiAgICAgICAgICAgIGJhY2tkcm9wUmVmID0gYmFja2Ryb3BGYWN0b3J5LmNyZWF0ZShuZXcgTW9kYWxJbmplY3Rvcih0aGlzLmluamVjdG9yLCBjb25maWdNYXApKTtcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoYmFja2Ryb3BSZWYuaG9zdFZpZXcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGNsb3NlIG9mIG1vZGFsUmVmXG4gICAgICAgIGNvbnN0IHJlZlN1YiA9IG1vZGFsUmVmLmFmdGVyQ2xvc2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lNb2RhbENvbXBvbmVudChjb21wb25lbnRSZWYpO1xuICAgICAgICAgICAgcmVmU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vZGFsQ29tcG9uZW50KGNvbXBvbmVudFJlZik7XG4gICAgICAgICAgICByZWZTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQXNzaWduIGNvbXBvbmVudCBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IGNvbmZpZ09iaiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGFsQ29uZmlnKTtcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnT2JqKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnZGF0YScpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Vba2V5XSA9IGNvbmZpZ09ialtrZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGFsQ29uZmlnLmhhc0JhY2tkcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tkcm9wUmVmLmluc3RhbmNlW2tleV0gPSBjb25maWdPYmpba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY2hpbGRDb21wb25lbnRUeXBlID0gY29udGVudFR5cGU7XG5cbiAgICAgICAgLy8gU2l6aW5nXG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbldpZHRoID0gY29uZmlnT2JqLm1pbldpZHRoO1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5taW5IZWlnaHQgPSBjb25maWdPYmoubWluSGVpZ2h0O1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IGNvbmZpZ09iai5tYXhXaWR0aDtcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gY29uZmlnT2JqLm1heEhlaWdodDtcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSBjb25maWdPYmoud2lkdGg7XG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGNvbmZpZ09iai5oZWlnaHQ7XG5cbiAgICAgICAgLy8gUmVuZGVyIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBjb250YWluZXJFbCA9IChjb250YWluZXJSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXJFbCk7XG5cbiAgICAgICAgLy8gUmVuZGVyIGJhY2tkcm9wXG4gICAgICAgIGlmIChtb2RhbENvbmZpZy5oYXNCYWNrZHJvcCkge1xuICAgICAgICAgICAgY29uc3QgZG9tQmFja2Ryb3AgPSAoYmFja2Ryb3BSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnRhaW5lclJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGRvbUJhY2tkcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbmRlciBtb2RhbFxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb250YWluZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChkb21FbGVtZW50KTtcblxuICAgICAgICB0aGlzLm1vZGFscy5wdXNoKHttb2RhbFJlZjogY29tcG9uZW50UmVmLCBiYWNrZHJvcFJlZjogYmFja2Ryb3BSZWYsIGNvbnRhaW5lclJlZjogY29udGFpbmVyUmVmfSk7XG4gICAgICAgIHJldHVybiBtb2RhbFJlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lNb2RhbENvbXBvbmVudChtb2RhbDogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50Pikge1xuICAgICAgICBjb25zdCBhcnJheVJlZiA9IHRoaXMubW9kYWxzLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubW9kYWxSZWYgPT09IG1vZGFsKTtcbiAgICAgICAgY29uc3QgaW5kZXhPZiA9IHRoaXMubW9kYWxzLmluZGV4T2YoYXJyYXlSZWYpO1xuICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGFycmF5UmVmLm1vZGFsUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhhcnJheVJlZi5jb250YWluZXJSZWYuaG9zdFZpZXcpO1xuICAgICAgICBhcnJheVJlZi5jb250YWluZXJSZWYuZGVzdHJveSgpO1xuICAgICAgICBhcnJheVJlZi5tb2RhbFJlZi5kZXN0cm95KCk7XG5cbiAgICAgICAgaWYgKGFycmF5UmVmLmJhY2tkcm9wUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGFycmF5UmVmLmJhY2tkcm9wUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgICAgIGFycmF5UmVmLmJhY2tkcm9wUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kYWxzW2luZGV4T2ZdID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb2RhbHMgPSB0aGlzLm1vZGFscy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IHVuZGVmaW5lZCk7XG4gICAgfVxuXG59XG4iXX0=