UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

264 lines 22.3 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.Angular/blob/master/LICENSE) */ import { Injectable } from '@angular/core'; import { ServiceBase } from './base.service'; import { Dictionary, ArrayList, Guid, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared'; import { getMessageName } from '../decorators/message'; import * as i0 from "@angular/core"; /** * Represents a message bus registration token. * @template T */ export class RegistrationToken { /** * Creates a new instance of \@see RegistrationToken * @param {?} messageBus a reference to the message bus. * @param {?} type the message type. */ constructor(messageBus, type) { this.messageBus = messageBus; this.innerType = type; this.innerGuid = Guid.new(); } /** * Gets the message type. * @return {?} */ get type() { return this.innerType; } /** * Gets the registration guid. * @return {?} */ get guid() { return this.innerGuid; } /** * Removes the callback from the message bus. * @return {?} */ unregister() { this.messageBus.unregister(this); } } if (false) { /** * A reference to the \@see MessageBusService. * @type {?} * @private */ RegistrationToken.prototype.messageBus; /** * The inner message type. * @type {?} * @private */ RegistrationToken.prototype.innerType; /** * A guid identifying this registration. * @type {?} * @private */ RegistrationToken.prototype.innerGuid; } /** * Represents a message bus callback handler. * It holds a method that must be called when certain * message is received. * @template T */ export class MessageBusHandler { /** * Creates a new instance of \@see MessageBusHandler * @param {?} messageBus a reference to the message bus. * @param {?} type the message type. * @param {?} handler the message handler. */ constructor(messageBus, type, handler) { this.innerHandler = handler; this.innerToken = new RegistrationToken(messageBus, type); } /** * Gets the registration token that identifies this handler. * @return {?} */ get token() { return this.innerToken; } /** * Gets the handler function that should be called when the message is received. * @return {?} */ get handler() { return this.innerHandler; } } if (false) { /** * The registration token that identifies this handler. * @type {?} * @private */ MessageBusHandler.prototype.innerToken; /** * The handler or function that should be called when the message is received. * @type {?} * @private */ MessageBusHandler.prototype.innerHandler; } export class MessageBusService extends ServiceBase { /** * Creates a new instance of \@see MessageBusService */ constructor() { super(); this.handlers = new Dictionary(); } /** * Gets the amount of messages registered. * @return {?} */ count() { return this.handlers.count(); } /** * Indicates if the given message type is registered and has handlers associated to it. * @template T * @param {?} messageType the message type. * @return {?} */ isRegistered(messageType) { /** @type {?} */ const type = getMessageName(messageType); return this.handlers.containsKey(type); } /** * Gets the amount of handler or observers a given message has. * @template T * @param {?} messageType the message type. * @return {?} */ handlerCount(messageType) { /** @type {?} */ const type = getMessageName(messageType); if (!this.handlers.containsKey(type)) { return 0; } return this.handlers.get(type).count(); } /** * Registers a new message handler. * The handler will be called every time a message of \@see messageType is called. * @template T * @param {?} messageType the message type. * @param {?} handler the message handler. * @return {?} */ register(messageType, handler) { /** @type {?} */ const type = getMessageName(messageType); if (!this.handlers.containsKey(type)) { this.handlers.add(type, new ArrayList()); } /** @type {?} */ const messageBusHandler = new MessageBusHandler(this, messageType, handler); this.handlers.get(type).add(messageBusHandler); return messageBusHandler.token; } /** * Removes a handler registration from the collection. * @template T * @param {?} token the registration token. * @return {?} */ unregister(token) { /** @type {?} */ const type = getMessageName(token.type); if (!this.handlers.containsKey(type)) { throw new Error('Token has been already unregistered.'); } /** @type {?} */ const handler = this.handlers.get(type); handler.removeAll((/** * @param {?} x * @return {?} */ x => x.token.guid === token.guid)); if (!handler.any()) { this.handlers.remove(type); } } /** * Unregisters all the message handlers. * @return {?} */ unregisterAll() { this.handlers.clear(); } /** * Sends a message to all the registered handlers. * @template T * @param {?} message the message to be sent. * @param {?=} token if specified, the message will be sent only to one handler. * @return {?} */ send(message, token) { return tslib_1.__awaiter(this, void 0, void 0, function* () { if (ObjectExtensions.isNull(message)) { throw new Error('Can not send a null message.'); } if (ObjectExtensions.isNull(message.constructor)) { throw new Error('Message does not have a constructor, and the system can not infer the type.'); } /** @type {?} */ const type = getMessageName((/** @type {?} */ (message.constructor))); if (!this.handlers.containsKey(type)) { return false; } /** @type {?} */ const handlers = this.handlers.get(type) .where((/** * @param {?} x * @return {?} */ x => token == null || token.guid === x.token.guid)) .select((/** * @param {?} x * @return {?} */ x => x.handler)); /** @type {?} */ let accepted = false; for (let i = (handlers.count() - 1); i >= 0; i--) { /** @type {?} */ const handler = handlers.get(i); accepted = true; yield handler(message); } return accepted; }); } } MessageBusService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ MessageBusService.ctorParameters = () => []; /** @nocollapse */ MessageBusService.ngInjectableDef = i0.defineInjectable({ factory: function MessageBusService_Factory() { return new MessageBusService(); }, token: MessageBusService, providedIn: "root" }); if (false) { /** * A collection of message types and all their handlers or observers. * @type {?} * @private */ MessageBusService.prototype.handlers; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tZXNzYWdlLWJ1cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQVF2RCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7SUFzQzFCLFlBQVksVUFBNkIsRUFBRSxJQUFhO1FBRXBELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7Ozs7O0lBdkJELElBQUksSUFBSTtRQUVKLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDOzs7OztJQUtELElBQUksSUFBSTtRQUVKLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDOzs7OztJQWlCRCxVQUFVO1FBRU4sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNKOzs7Ozs7O0lBL0NHLHVDQUFzQzs7Ozs7O0lBS3RDLHNDQUEyQjs7Ozs7O0lBSzNCLHNDQUF3Qjs7Ozs7Ozs7QUE0QzVCLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7SUE0QjFCLFlBQVksVUFBNkIsRUFBRSxJQUFh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LE1BQU07YUFDckI7Ozs7Ozs7Ozs7O0lBTUcscUNBQXdFIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLkFuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IERpY3Rpb25hcnksIEFycmF5TGlzdCwgR3VpZCwgT2JqZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0BtaXJhY2xlZGV2cy9wYXJhZGlnbS11aS13ZWItc2hhcmVkJztcbmltcG9ydCB7IGdldE1lc3NhZ2VOYW1lIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9tZXNzYWdlJztcblxuXG5leHBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBidXMgcmVnaXN0cmF0aW9uIHRva2VuLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uVG9rZW48VD5cbntcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQHNlZSBNZXNzYWdlQnVzU2VydmljZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlubmVyIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyVHlwZTogVHlwZTxUPjtcblxuICAgIC8qKlxuICAgICAqIEEgZ3VpZCBpZGVudGlmeWluZyB0aGlzIHJlZ2lzdHJhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyR3VpZDogR3VpZDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpOiBUeXBlPFQ+XG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmVnaXN0cmF0aW9uIGd1aWQuXG4gICAgICovXG4gICAgZ2V0IGd1aWQoKTogR3VpZFxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJHdWlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBSZWdpc3RyYXRpb25Ub2tlblxuICAgICAqIEBwYXJhbSBtZXNzYWdlQnVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtZXNzYWdlIGJ1cy5cbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+KVxuICAgIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy5pbm5lclR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlubmVyR3VpZCA9IEd1aWQubmV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgbWVzc2FnZSBidXMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcigpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMudW5yZWdpc3Rlcih0aGlzKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgYnVzIGNhbGxiYWNrIGhhbmRsZXIuXG4gKiBJdCBob2xkcyBhIG1ldGhvZCB0aGF0IG11c3QgYmUgY2FsbGVkIHdoZW4gY2VydGFpblxuICogbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VCdXNIYW5kbGVyPFQ+XG57XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lzdHJhdGlvbiB0b2tlbiB0aGF0IGlkZW50aWZpZXMgdGhpcyBoYW5kbGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5uZXJUb2tlbjogUmVnaXN0cmF0aW9uVG9rZW48VD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGFuZGxlciBvciBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVySGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8VD47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByZWdpc3RyYXRpb24gdG9rZW4gdGhhdCBpZGVudGlmaWVzIHRoaXMgaGFuZGxlci5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKTogUmVnaXN0cmF0aW9uVG9rZW48VD4geyByZXR1cm4gdGhpcy5pbm5lclRva2VuOyB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIGdldCBoYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyPFQ+IHsgcmV0dXJuIHRoaXMuaW5uZXJIYW5kbGVyOyB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c0hhbmRsZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1cyBhIHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZSBidXMuXG4gICAgICogQHBhcmFtIHR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPilcbiAgICB7XG4gICAgICAgIHRoaXMuaW5uZXJIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy5pbm5lclRva2VuID0gbmV3IFJlZ2lzdHJhdGlvblRva2VuKG1lc3NhZ2VCdXMsIHR5cGUpO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQnVzU2VydmljZSBleHRlbmRzIFNlcnZpY2VCYXNlXG57XG4gICAgLyoqXG4gICAgICogQSBjb2xsZWN0aW9uIG9mIG1lc3NhZ2UgdHlwZXMgYW5kIGFsbCB0aGVpciBoYW5kbGVycyBvciBvYnNlcnZlcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVyczogRGljdGlvbmFyeTxzdHJpbmcsIEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxhbnk+Pj47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c1NlcnZpY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBBcnJheUxpc3Q8TWVzc2FnZUJ1c0hhbmRsZXI8YW55Pj4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYW1vdW50IG9mIG1lc3NhZ2VzIHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgY291bnQoKTogbnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5jb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSB0eXBlIGlzIHJlZ2lzdGVyZWQgYW5kIGhhcyBoYW5kbGVycyBhc3NvY2lhdGVkIHRvIGl0LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGlzUmVnaXN0ZXJlZDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRNZXNzYWdlTmFtZShtZXNzYWdlVHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmNvbnRhaW5zS2V5KHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFtb3VudCBvZiBoYW5kbGVyIG9yIG9ic2VydmVycyBhIGdpdmVuIG1lc3NhZ2UgaGFzLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGhhbmRsZXJDb3VudDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IG51bWJlclxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKG1lc3NhZ2VUeXBlKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmNvdW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICAgKiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgbWVzc2FnZSBvZiBAc2VlIG1lc3NhZ2VUeXBlIGlzIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZVR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyPFQ+KG1lc3NhZ2VUeXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPik6IFJlZ2lzdHJhdGlvblRva2VuPFQ+XG4gICAge1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZVR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5hZGQodHlwZSwgbmV3IEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxUPj4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlQnVzSGFuZGxlciA9IG5ldyBNZXNzYWdlQnVzSGFuZGxlcih0aGlzLCBtZXNzYWdlVHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmFkZChtZXNzYWdlQnVzSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdXNIYW5kbGVyLnRva2VuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB0b2tlbiB0aGUgcmVnaXN0cmF0aW9uIHRva2VuLlxuICAgICAqL1xuICAgIHVucmVnaXN0ZXI8VD4odG9rZW46IFJlZ2lzdHJhdGlvblRva2VuPFQ+KTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKHRva2VuLnR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBoYXMgYmVlbiBhbHJlYWR5IHVucmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaGFuZGxlci5yZW1vdmVBbGwoeCA9PiB4LnRva2VuLmd1aWQgPT09IHRva2VuLmd1aWQpO1xuXG4gICAgICAgIGlmICghaGFuZGxlci5hbnkoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5yZW1vdmUodHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyBhbGwgdGhlIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlckFsbCgpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBzZW50LlxuICAgICAqIEBwYXJhbSB0b2tlbiBpZiBzcGVjaWZpZWQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCBvbmx5IHRvIG9uZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmQ8VD4obWVzc2FnZTogVCwgdG9rZW4/OiBSZWdpc3RyYXRpb25Ub2tlbjxUPik6IFByb21pc2U8Ym9vbGVhbj5cbiAgICB7XG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNlbmQgYSBudWxsIG1lc3NhZ2UuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobWVzc2FnZS5jb25zdHJ1Y3RvcikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IsIGFuZCB0aGUgc3lzdGVtIGNhbiBub3QgaW5mZXIgdGhlIHR5cGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZS5jb25zdHJ1Y3RvciBhcyBUeXBlPFQ+KTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQodHlwZSlcbiAgICAgICAgICAgIC53aGVyZSh4ID0+IHRva2VuID09IG51bGwgfHwgdG9rZW4uZ3VpZCA9PT0geC50b2tlbi5ndWlkKVxuICAgICAgICAgICAgLnNlbGVjdCh4ID0+IHguaGFuZGxlcik7XG5cbiAgICAgICAgbGV0IGFjY2VwdGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IChoYW5kbGVycy5jb3VudCgpIC0gMSk7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMuZ2V0KGkpO1xuICAgICAgICAgICAgYWNjZXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcihtZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2NlcHRlZDtcbiAgICB9XG59XG4iXX0=