UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

270 lines 19.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /*! * Paradigm Framework - Angular Wrapper * Copyright (c) 2017 Miracle Devs, Inc * Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Shared/blob/master/LICENSE) */ import { Injectable, ComponentFactoryResolver, Injector } from '@angular/core'; import { ArrayList, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared'; import { ServiceBase } from './base.service'; import * as i0 from "@angular/core"; /** * Represents a modal dialog instance. * This class lifespan depends on the modal dialog lifespan. * @template TParameters, TResult */ var /** * Represents a modal dialog instance. * This class lifespan depends on the modal dialog lifespan. * @template TParameters, TResult */ ModalInstance = /** @class */ (function () { /** * Creates an instance of @see ModalInstance * @param type the modal component type. */ function ModalInstance(type) { this.type = type; } Object.defineProperty(ModalInstance.prototype, "componentRef", { /** * Gets the component ref associated to the modal dialog. */ get: /** * Gets the component ref associated to the modal dialog. * @return {?} */ function () { return this.innerComponentRef; }, enumerable: true, configurable: true }); /** * Sets the component ref reference. * @param componentRef the component ref object. */ /** * Sets the component ref reference. * @param {?} componentRef the component ref object. * @return {?} */ ModalInstance.prototype.setComponentRef = /** * Sets the component ref reference. * @param {?} componentRef the component ref object. * @return {?} */ function (componentRef) { this.innerComponentRef = componentRef; }; return ModalInstance; }()); /** * Represents a modal dialog instance. * This class lifespan depends on the modal dialog lifespan. * @template TParameters, TResult */ export { ModalInstance }; if (false) { /** * A reference to the component ref object. * @type {?} * @private */ ModalInstance.prototype.innerComponentRef; /** * The type of the modal component. * @type {?} */ ModalInstance.prototype.type; /** * Resolves and finish successfully the modal dialog. * @type {?} */ ModalInstance.prototype.resolve; /** * Rejects and finish unsuccessfully the modal dialog. * @type {?} */ ModalInstance.prototype.reject; } var ModalService = /** @class */ (function (_super) { tslib_1.__extends(ModalService, _super); /** * Creates a new instance of @see ModalService * @param resolver a reference to the component factory resolver, * @param injector a reference to the DI injector container */ function ModalService(resolver, injector) { var _this = _super.call(this) || this; _this.resolver = resolver; _this.injector = injector; _this.modalInstances = new ArrayList(); return _this; } /** * Sets the view container ref that will hold and contain * the modal components. * @param container the view container ref. */ /** * Sets the view container ref that will hold and contain * the modal components. * @param {?} container the view container ref. * @return {?} */ ModalService.prototype.setViewContainer = /** * Sets the view container ref that will hold and contain * the modal components. * @param {?} container the view container ref. * @return {?} */ function (container) { if (ObjectExtensions.isNull(container)) { throw new Error('The container can not be null or undefined.'); } this.viewContainer = container; }; /** * Gets the stack of modal instances. */ /** * Gets the stack of modal instances. * @return {?} */ ModalService.prototype.getModalInstances = /** * Gets the stack of modal instances. * @return {?} */ function () { return this.modalInstances; }; /** * Opens a modal dialog component. * @param type The modal component type. * @param parameters the creation parameters to pass to the modal component. */ /** * Opens a modal dialog component. * @template TParameters, TResult * @param {?} type The modal component type. * @param {?=} parameters the creation parameters to pass to the modal component. * @return {?} */ ModalService.prototype.open = /** * Opens a modal dialog component. * @template TParameters, TResult * @param {?} type The modal component type. * @param {?=} parameters the creation parameters to pass to the modal component. * @return {?} */ function (type, parameters) { var _this = this; // create modal instance. /** @type {?} */ var modalInstance = new ModalInstance(type); this.modalInstances.add(modalInstance); // setup the modal promise. /** @type {?} */ var promise = new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { modalInstance.resolve = (/** * @param {?=} result * @return {?} */ function (result) { resolve(result); _this.remove(modalInstance); }); modalInstance.reject = (/** * @param {?=} reason * @return {?} */ function (reason) { reject(reason); _this.remove(modalInstance); }); })); // create the component. /** @type {?} */ var factory = this.resolver.resolveComponentFactory(type); /** @type {?} */ var componentRef = factory.create(this.injector); // initialize the modal and component. modalInstance.setComponentRef(componentRef); componentRef.instance.setModalService(this); componentRef.instance.setModalInstance(modalInstance); componentRef.instance.setParameters(parameters); // insert view on screen. this.viewContainer.insert(componentRef.hostView); // return the promise. return promise; }; /** * Removes the modal from the stack of modal instances. * @param modalInstance the modal that will be removed. */ /** * Removes the modal from the stack of modal instances. * @private * @template TParameters, TResult * @param {?} modalInstance the modal that will be removed. * @return {?} */ ModalService.prototype.remove = /** * Removes the modal from the stack of modal instances. * @private * @template TParameters, TResult * @param {?} modalInstance the modal that will be removed. * @return {?} */ function (modalInstance) { this.modalInstances.remove(modalInstance); this.viewContainer.remove(this.viewContainer.indexOf(modalInstance.componentRef.hostView)); }; ModalService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ ModalService.ctorParameters = function () { return [ { type: ComponentFactoryResolver }, { type: Injector } ]; }; /** @nocollapse */ ModalService.ngInjectableDef = i0.defineInjectable({ factory: function ModalService_Factory() { return new ModalService(i0.inject(i0.ComponentFactoryResolver), i0.inject(i0.INJECTOR)); }, token: ModalService, providedIn: "root" }); return ModalService; }(ServiceBase)); export { ModalService }; if (false) { /** * A stack of modal instances. * @type {?} * @private */ ModalService.prototype.modalInstances; /** * A reference to the view container ref that will hold * and contain the modal components. * @type {?} * @private */ ModalService.prototype.viewContainer; /** * @type {?} * @private */ ModalService.prototype.resolver; /** * @type {?} * @private */ ModalService.prototype.injector; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFFckgsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQVU3Qzs7Ozs7O0lBMkJJOzs7T0FHRztJQUNILHVCQUFZLElBQW9EO1FBRTVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFURCxzQkFBSSx1Q0FBWTtRQUhoQjs7V0FFRzs7Ozs7UUFDSCxjQUE2RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBVzdHOzs7T0FHRzs7Ozs7O0lBQ0gsdUNBQWU7Ozs7O0lBQWYsVUFBZ0IsWUFBb0U7UUFFaEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztJQUMxQyxDQUFDO0lBQ0wsb0JBQUM7QUFBRCxDQUFDLEFBNUNELElBNENDOzs7Ozs7Ozs7Ozs7O0lBdkNHLDBDQUFrRjs7Ozs7SUFLbEYsNkJBQThEOzs7OztJQUs5RCxnQ0FBK0I7Ozs7O0lBSy9CLCtCQUFvQjs7QUEwQnhCO0lBR2tDLHdDQUFXO0lBYXpDOzs7O09BSUc7SUFDSCxzQkFDWSxRQUFrQyxFQUNsQyxRQUFrQjtRQUY5QixZQUlJLGlCQUFPLFNBRVY7UUFMVyxjQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxjQUFRLEdBQVIsUUFBUSxDQUFVO1FBRzFCLEtBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQzs7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7SUFDSCx1Q0FBZ0I7Ozs7OztJQUFoQixVQUFpQixTQUEyQjtRQUV4QyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFDdEM7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDbEU7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsd0NBQWlCOzs7O0lBQWpCO1FBRUksT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7OztJQUNILDJCQUFJOzs7Ozs7O0lBQUosVUFBMkIsSUFBb0QsRUFBRSxVQUF3QjtRQUF6RyxpQkFvQ0M7OztZQWpDUyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQXVCLElBQUksQ0FBQztRQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7O1lBR2pDLE9BQU8sR0FBRyxJQUFJLE9BQU87Ozs7O1FBQVUsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUVqRCxhQUFhLENBQUMsT0FBTzs7OztZQUFHLFVBQUMsTUFBZ0I7Z0JBRXJDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEIsS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUEsQ0FBQztZQUNGLGFBQWEsQ0FBQyxNQUFNOzs7O1lBQUcsVUFBQyxNQUFlO2dCQUVuQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2YsS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUEsQ0FBQztRQUNOLENBQUMsRUFBQzs7O1lBR0ksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDOztZQUNyRCxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRWxELHNDQUFzQztRQUN0QyxhQUFhLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVqRCxzQkFBc0I7UUFDdEIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7Ozs7SUFDSyw2QkFBTTs7Ozs7OztJQUFkLFVBQXFDLGFBQWtEO1FBRW5GLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDOztnQkF2R0osVUFBVSxTQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7OztnQkE3RG9CLHdCQUF3QjtnQkFBRSxRQUFROzs7dUJBTnZEO0NBeUtDLEFBeEdELENBR2tDLFdBQVcsR0FxRzVDO1NBckdZLFlBQVk7Ozs7Ozs7SUFLckIsc0NBQTJEOzs7Ozs7O0lBTTNELHFDQUF3Qzs7Ozs7SUFRcEMsZ0NBQTBDOzs7OztJQUMxQyxnQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIFBhcmFkaWdtIEZyYW1ld29yayAtIEFuZ3VsYXIgV3JhcHBlclxuICogQ29weXJpZ2h0IChjKSAyMDE3IE1pcmFjbGUgRGV2cywgSW5jXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9NaXJhY2xlRGV2cy9QYXJhZGlnbS5XZWIuU2hhcmVkL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBJbmplY3RvciwgVHlwZSwgQ29tcG9uZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9jb21wb25lbnRzL21vZGFsLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IEFycmF5TGlzdCwgT2JqZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0BtaXJhY2xlZGV2cy9wYXJhZGlnbS11aS13ZWItc2hhcmVkJztcbmltcG9ydCB7IFNlcnZpY2VCYXNlIH0gZnJvbSAnLi9iYXNlLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBNb2RhbFJlc29sdmU8VFJlc3VsdD4gPSAocmVzdWx0OiBUUmVzdWx0KSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBNb2RhbFJlamVjdCA9IChyZWFzb246IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbW9kYWwgZGlhbG9nIGluc3RhbmNlLlxuICogVGhpcyBjbGFzcyBsaWZlc3BhbiBkZXBlbmRzIG9uIHRoZSBtb2RhbCBkaWFsb2cgbGlmZXNwYW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RhbEluc3RhbmNlPFRQYXJhbWV0ZXJzLCBUUmVzdWx0Plxue1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgcmVmIG9iamVjdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8TW9kYWxDb21wb25lbnRCYXNlPFRQYXJhbWV0ZXJzLCBUUmVzdWx0Pj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgbW9kYWwgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHR5cGU6IFR5cGU8TW9kYWxDb21wb25lbnRCYXNlPFRQYXJhbWV0ZXJzLCBUUmVzdWx0Pj47XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhbmQgZmluaXNoIHN1Y2Nlc3NmdWxseSB0aGUgbW9kYWwgZGlhbG9nLlxuICAgICAqL1xuICAgIHJlc29sdmU6IE1vZGFsUmVzb2x2ZTxUUmVzdWx0PjtcblxuICAgIC8qKlxuICAgICAqIFJlamVjdHMgYW5kIGZpbmlzaCB1bnN1Y2Nlc3NmdWxseSB0aGUgbW9kYWwgZGlhbG9nLlxuICAgICAqL1xuICAgIHJlamVjdDogTW9kYWxSZWplY3Q7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgcmVmIGFzc29jaWF0ZWQgdG8gdGhlIG1vZGFsIGRpYWxvZy5cbiAgICAgKi9cbiAgICBnZXQgY29tcG9uZW50UmVmKCk6IENvbXBvbmVudFJlZjxNb2RhbENvbXBvbmVudEJhc2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+PiB7IHJldHVybiB0aGlzLmlubmVyQ29tcG9uZW50UmVmOyB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEBzZWUgTW9kYWxJbnN0YW5jZVxuICAgICAqIEBwYXJhbSB0eXBlIHRoZSBtb2RhbCBjb21wb25lbnQgdHlwZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+KVxuICAgIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnQgcmVmIHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gY29tcG9uZW50UmVmIHRoZSBjb21wb25lbnQgcmVmIG9iamVjdC5cbiAgICAgKi9cbiAgICBzZXRDb21wb25lbnRSZWYoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8TW9kYWxDb21wb25lbnRCYXNlPFRQYXJhbWV0ZXJzLCBUUmVzdWx0Pj4pOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmlubmVyQ29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlQmFzZVxue1xuICAgIC8qKlxuICAgICAqIEEgc3RhY2sgb2YgbW9kYWwgaW5zdGFuY2VzLlxuICAgICAqL1xuICAgIHByaXZhdGUgbW9kYWxJbnN0YW5jZXM6IEFycmF5TGlzdDxNb2RhbEluc3RhbmNlPGFueSwgYW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgdmlldyBjb250YWluZXIgcmVmIHRoYXQgd2lsbCBob2xkXG4gICAgICogYW5kIGNvbnRhaW4gdGhlIG1vZGFsIGNvbXBvbmVudHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIE1vZGFsU2VydmljZVxuICAgICAqIEBwYXJhbSByZXNvbHZlciBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IGZhY3RvcnkgcmVzb2x2ZXIsXG4gICAgICogQHBhcmFtIGluamVjdG9yIGEgcmVmZXJlbmNlIHRvIHRoZSBESSBpbmplY3RvciBjb250YWluZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcilcbiAgICB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubW9kYWxJbnN0YW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmlldyBjb250YWluZXIgcmVmIHRoYXQgd2lsbCBob2xkIGFuZCBjb250YWluXG4gICAgICogdGhlIG1vZGFsIGNvbXBvbmVudHMuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgdmlldyBjb250YWluZXIgcmVmLlxuICAgICAqL1xuICAgIHNldFZpZXdDb250YWluZXIoY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKE9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKGNvbnRhaW5lcikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvbnRhaW5lciBjYW4gbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIG9mIG1vZGFsIGluc3RhbmNlcy5cbiAgICAgKi9cbiAgICBnZXRNb2RhbEluc3RhbmNlcygpOiBBcnJheUxpc3Q8TW9kYWxJbnN0YW5jZTxhbnksIGFueT4+XG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RhbEluc3RhbmNlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIG1vZGFsIGRpYWxvZyBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG1vZGFsIGNvbXBvbmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjcmVhdGlvbiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1vZGFsIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBvcGVuPFRQYXJhbWV0ZXJzLCBUUmVzdWx0Pih0eXBlOiBUeXBlPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+LCBwYXJhbWV0ZXJzPzogVFBhcmFtZXRlcnMpOiBQcm9taXNlPFRSZXN1bHQ+XG4gICAge1xuICAgICAgICAvLyBjcmVhdGUgbW9kYWwgaW5zdGFuY2UuXG4gICAgICAgIGNvbnN0IG1vZGFsSW5zdGFuY2UgPSBuZXcgTW9kYWxJbnN0YW5jZTxUUGFyYW1ldGVycywgVFJlc3VsdD4odHlwZSk7XG4gICAgICAgIHRoaXMubW9kYWxJbnN0YW5jZXMuYWRkKG1vZGFsSW5zdGFuY2UpO1xuXG4gICAgICAgIC8vIHNldHVwIHRoZSBtb2RhbCBwcm9taXNlLlxuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VFJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgbW9kYWxJbnN0YW5jZS5yZXNvbHZlID0gKHJlc3VsdD86IFRSZXN1bHQpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKG1vZGFsSW5zdGFuY2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1vZGFsSW5zdGFuY2UucmVqZWN0ID0gKHJlYXNvbj86IHN0cmluZykgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShtb2RhbEluc3RhbmNlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29tcG9uZW50LlxuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0eXBlKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gZmFjdG9yeS5jcmVhdGUodGhpcy5pbmplY3Rvcik7XG5cbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbW9kYWwgYW5kIGNvbXBvbmVudC5cbiAgICAgICAgbW9kYWxJbnN0YW5jZS5zZXRDb21wb25lbnRSZWYoY29tcG9uZW50UmVmKTtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnNldE1vZGFsU2VydmljZSh0aGlzKTtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnNldE1vZGFsSW5zdGFuY2UobW9kYWxJbnN0YW5jZSk7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIC8vIGluc2VydCB2aWV3IG9uIHNjcmVlbi5cbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmluc2VydChjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXG4gICAgICAgIC8vIHJldHVybiB0aGUgcHJvbWlzZS5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbW9kYWwgZnJvbSB0aGUgc3RhY2sgb2YgbW9kYWwgaW5zdGFuY2VzLlxuICAgICAqIEBwYXJhbSBtb2RhbEluc3RhbmNlIHRoZSBtb2RhbCB0aGF0IHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZTxUUGFyYW1ldGVycywgVFJlc3VsdD4obW9kYWxJbnN0YW5jZTogTW9kYWxJbnN0YW5jZTxUUGFyYW1ldGVycywgVFJlc3VsdD4pOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm1vZGFsSW5zdGFuY2VzLnJlbW92ZShtb2RhbEluc3RhbmNlKTtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLnJlbW92ZSh0aGlzLnZpZXdDb250YWluZXIuaW5kZXhPZihtb2RhbEluc3RhbmNlLmNvbXBvbmVudFJlZi5ob3N0VmlldykpO1xuICAgIH1cbn1cbiJdfQ==