UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

317 lines 26.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /*! * Paradigm Framework - Angular Wrapper * Copyright (c) 2017 Miracle Devs, Inc * Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Shared/blob/master/LICENSE) */ import { ServiceBase } from './base.service'; import { DateExtensions, StringExtensions, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared'; import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; /** * Represents a log provider. * The interface was specifically made to * match the one from \@see console that is * the default provider used by \@see LoggingService. * @record */ export function ILogProvider() { } if (false) { /** * Adds a trace log. * @param {?} message the message to be logged. * @return {?} */ ILogProvider.prototype.trace = function (message) { }; /** * Adds a debug log. * @param {?} message the message to be logged. * @return {?} */ ILogProvider.prototype.debug = function (message) { }; /** * Adds an info log. * @param {?} message the message to be logged. * @return {?} */ ILogProvider.prototype.info = function (message) { }; /** * Adds a warn log. * @param {?} message the message to be logged. * @return {?} */ ILogProvider.prototype.warn = function (message) { }; /** * Adds an error log. * @param {?} message the message to be logged. * @return {?} */ ILogProvider.prototype.error = function (message) { }; /** * Adds a critical error log. * @param {?} message the message to be logged. * @return {?} */ ILogProvider.prototype.critical = function (message) { }; } /** @enum {number} */ const LogType = { /** * Represents a trace log. */ Trace: 0, /** * Represents a debug log. */ Debug: 1, /** * Represents an information log. */ Information: 2, /** * Represents a warning log. */ Warning: 3, /** * Represents an error log. */ Error: 4, /** * Represents a critical error log. */ Critical: 5, }; export { LogType }; LogType[LogType.Trace] = 'Trace'; LogType[LogType.Debug] = 'Debug'; LogType[LogType.Information] = 'Information'; LogType[LogType.Warning] = 'Warning'; LogType[LogType.Error] = 'Error'; LogType[LogType.Critical] = 'Critical'; export class LoggingService extends ServiceBase { /** * Creates a new instance of \@see LoggingService. */ constructor() { super(); this.logProvider = console; this.setMessageTemplateForAll('[{0}][{1}] - {3}{2}'); this.minimumLevel = LogType.Information; } /** * Sets a log provider. * By default \@see console is used as provider. * @param {?} logProvider * @return {?} */ setLogProvider(logProvider) { this.logProvider = logProvider; } /** * Sets the message template for a given log type. * There are some predefined content placeholders the user can utilize * to configure the custom messages: * * {0}: The time when the log was added. * * {1}: The type of the log (Trace, Debug , Information, etc) * * {2}: A custom tag value provided by the user. * * {3}: The log message. * @param {?} type * @param {?} message * @return {?} */ setMessageTemplate(type, message) { if (type < 0 || type >= this.messageTemplates.length) { throw new Error(LoggingService.typeNotRecognized); } if (ObjectExtensions.isNull(message)) { throw new Error('The message template can not be null or undefined.'); } this.messageTemplates[type] = message; } /** * Sets the message template for all the types. * There are some predefined content placeholders the user can utilize * to configure the custom messages: * * {0}: The time when the log was added. * * {1}: The type of the log (Trace, Debug , Information, etc) * * {2}: A custom tag value provided by the user. * * {3}: The log message. * @param {?} message * @return {?} */ setMessageTemplateForAll(message) { if (ObjectExtensions.isNull(message)) { throw new Error('The message template can not be null or undefined.'); } this.messageTemplates = []; this.messageTemplates.push(message); this.messageTemplates.push(message); this.messageTemplates.push(message); this.messageTemplates.push(message); this.messageTemplates.push(message); this.messageTemplates.push(message); } /** * Sets the minimum log level. * Log types smaller than this value will be ignored. * @param {?} type * @return {?} */ setMinimumLevel(type) { if (type < 0 || type >= this.messageTemplates.length) { throw new Error(LoggingService.typeNotRecognized); } this.minimumLevel = type; } /** * Logs the specified message. * @param {?} message the message to be logged. * @param {?=} type the type of log entry. * @param {?=} tag a tag value used for further analysis. * @return {?} */ log(message, type = LogType.Trace, tag = null) { if (type < 0 || type >= this.messageTemplates.length) { throw new Error(LoggingService.typeNotRecognized); } if (ObjectExtensions.isNull(message)) { throw new Error('The message can not be null or undefined.'); } if (type < this.minimumLevel) { return; } /** @type {?} */ const formattedMessage = StringExtensions.format(this.messageTemplates[type], DateExtensions.format(new Date(), 'hh:mm:ss'), LogType[type], tag, message); switch (type) { case LogType.Trace: this.logProvider.trace(formattedMessage); break; case LogType.Debug: this.logProvider.debug(formattedMessage); break; case LogType.Information: this.logProvider.info(formattedMessage); break; case LogType.Warning: this.logProvider.warn(formattedMessage); break; case LogType.Error: this.logProvider.error(formattedMessage); break; case LogType.Critical: if (this.logProvider.critical) { this.logProvider.critical(formattedMessage); } else { this.logProvider.error(formattedMessage); } break; } } /** * Adds a trace log entry. * @param {?} message the message to be logged. * @param {?=} tag a tag value for the entry. * @return {?} */ trace(message, tag = null) { this.log(message, LogType.Trace, tag); } /** * Adds a debug log entry. * @param {?} message the message to be logged. * @param {?=} tag a tag value for the entry. * @return {?} */ debug(message, tag = null) { this.log(message, LogType.Debug, tag); } /** * Adds an information log entry. * @param {?} message the message to be logged. * @param {?=} tag a tag value for the entry. * @return {?} */ information(message, tag = null) { this.log(message, LogType.Information, tag); } /** * Adds a warning log entry. * @param {?} message the message to be logged. * @param {?=} tag a tag value for the entry. * @return {?} */ warning(message, tag = null) { this.log(message, LogType.Warning, tag); } /** * Adds an error log entry. * @param {?} message the message to be logged. * @param {?=} tag a tag value for the entry. * @return {?} */ error(message, tag = null) { this.log(message, LogType.Error, tag); } /** * Adds a critical error log entry. * @param {?} message the message to be logged. * @param {?=} tag a tag value for the entry. * @return {?} */ critical(message, tag = null) { this.log(message, LogType.Critical, tag); } } /** * Error message. */ LoggingService.typeNotRecognized = 'The provided type is not recognized as a valid log type.'; LoggingService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ LoggingService.ctorParameters = () => []; /** @nocollapse */ LoggingService.ngInjectableDef = i0.defineInjectable({ factory: function LoggingService_Factory() { return new LoggingService(); }, token: LoggingService, providedIn: "root" }); if (false) { /** * Error message. * @type {?} * @private */ LoggingService.typeNotRecognized; /** * An array of message templates. * @type {?} * @private */ LoggingService.prototype.messageTemplates; /** * The minimum log type that will logged. * Log types smaller than this value will be ignored. * @type {?} * @private */ LoggingService.prototype.minimumLevel; /** * A log provider. * By default \@see console will be used. * @type {?} * @private */ LoggingService.prototype.logProvider; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG1pcmFjbGVkZXZzL3BhcmFkaWdtLXdlYi1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2xvZ2dpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBYyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVEzQyxrQ0FxQ0M7Ozs7Ozs7SUEvQkcsc0RBQTZCOzs7Ozs7SUFNN0Isc0RBQTZCOzs7Ozs7SUFNN0IscURBQTRCOzs7Ozs7SUFNNUIscURBQTRCOzs7Ozs7SUFNNUIsc0RBQTZCOzs7Ozs7SUFNN0IseURBQWlDOzs7O0lBUWpDOztPQUVHO0lBQ0gsUUFBUztJQUVUOztPQUVHO0lBQ0gsUUFBUztJQUVUOztPQUVHO0lBQ0gsY0FBZTtJQUVmOztPQUVHO0lBQ0gsVUFBVztJQUVYOztPQUVHO0lBQ0gsUUFBUztJQUVUOztPQUVHO0lBQ0gsV0FBWTs7Ozs7Ozs7O0FBTWhCLE1BQU0sT0FBTyxjQUFlLFNBQVEsV0FBVzs7OztJQTJCM0M7UUFFSSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUM1QyxDQUFDOzs7Ozs7O0lBTUQsY0FBYyxDQUFDLFdBQXlCO1FBRXBDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBZUQsa0JBQWtCLENBQUMsSUFB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Q0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7Ozs7SUFPRCxLQUFLLENBQUMsT0FBZSxFQUFFLE1BQWMsSUFBSTtRQUVyQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Ozs7Ozs7SUFPRCxRQUFRLENBQUMsT0FBZSxFQUFFLE1BQWMsSUFBSTtRQUV4QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Ozs7O0FBcE91QixnQ0FBaUIsR0FBVywwREFBMEQsQ0FBQzs7WUFSbEgsVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7Ozs7Ozs7OztJQU1HLGlDQUErRzs7Ozs7O0lBSy9HLDBDQUFtQzs7Ozs7OztJQU1uQyxzQ0FBOEI7Ozs7Ozs7SUFNOUIscUNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLlNoYXJlZC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG5cbmltcG9ydCB7IFNlcnZpY2VCYXNlIH0gZnJvbSAnLi9iYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUV4dGVuc2lvbnMsIERpY3Rpb25hcnksIFN0cmluZ0V4dGVuc2lvbnMsIE9iamVjdEV4dGVuc2lvbnMgfSBmcm9tICdAbWlyYWNsZWRldnMvcGFyYWRpZ20tdWktd2ViLXNoYXJlZCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvZyBwcm92aWRlci5cbiAqIFRoZSBpbnRlcmZhY2Ugd2FzIHNwZWNpZmljYWxseSBtYWRlIHRvXG4gKiBtYXRjaCB0aGUgb25lIGZyb20gQHNlZSBjb25zb2xlIHRoYXQgaXNcbiAqIHRoZSBkZWZhdWx0IHByb3ZpZGVyIHVzZWQgYnkgQHNlZSBMb2dnaW5nU2VydmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTG9nUHJvdmlkZXJcbntcbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdHJhY2UgbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICB0cmFjZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRlYnVnIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgZGVidWcobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gaW5mbyBsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIGluZm8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB3YXJuIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBlcnJvciBsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY3JpdGljYWwgZXJyb3IgbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBjcml0aWNhbD8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBFbnVtZXJhdGVzIHRoZSB0eXBlcyBvZiBsb2dnaW5nIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBlbnVtIExvZ1R5cGVcbntcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgdHJhY2UgbG9nLlxuICAgICAqL1xuICAgIFRyYWNlID0gMCxcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBkZWJ1ZyBsb2cuXG4gICAgICovXG4gICAgRGVidWcgPSAxLFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBpbmZvcm1hdGlvbiBsb2cuXG4gICAgICovXG4gICAgSW5mb3JtYXRpb24gPSAyLFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHdhcm5pbmcgbG9nLlxuICAgICAqL1xuICAgIFdhcm5pbmcgPSAzLFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBlcnJvciBsb2cuXG4gICAgICovXG4gICAgRXJyb3IgPSA0LFxuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNyaXRpY2FsIGVycm9yIGxvZy5cbiAgICAgKi9cbiAgICBDcml0aWNhbCA9IDVcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBMb2dnaW5nU2VydmljZSBleHRlbmRzIFNlcnZpY2VCYXNlXG57XG4gICAgLyoqXG4gICAgICogRXJyb3IgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB0eXBlTm90UmVjb2duaXplZDogc3RyaW5nID0gJ1RoZSBwcm92aWRlZCB0eXBlIGlzIG5vdCByZWNvZ25pemVkIGFzIGEgdmFsaWQgbG9nIHR5cGUuJztcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG1lc3NhZ2UgdGVtcGxhdGVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgbWVzc2FnZVRlbXBsYXRlczogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBsb2cgdHlwZSB0aGF0IHdpbGwgbG9nZ2VkLlxuICAgICAqIExvZyB0eXBlcyBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBtaW5pbXVtTGV2ZWw6IExvZ1R5cGU7XG5cbiAgICAvKipcbiAgICAgKiBBIGxvZyBwcm92aWRlci5cbiAgICAgKiBCeSBkZWZhdWx0IEBzZWUgY29uc29sZSB3aWxsIGJlIHVzZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2dQcm92aWRlcjogSUxvZ1Byb3ZpZGVyO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIExvZ2dpbmdTZXJ2aWNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9nUHJvdmlkZXIgPSBjb25zb2xlO1xuICAgICAgICB0aGlzLnNldE1lc3NhZ2VUZW1wbGF0ZUZvckFsbCgnW3swfV1bezF9XSAtIHszfXsyfScpO1xuICAgICAgICB0aGlzLm1pbmltdW1MZXZlbCA9IExvZ1R5cGUuSW5mb3JtYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGxvZyBwcm92aWRlci5cbiAgICAgKiBCeSBkZWZhdWx0IEBzZWUgY29uc29sZSBpcyB1c2VkIGFzIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHNldExvZ1Byb3ZpZGVyKGxvZ1Byb3ZpZGVyOiBJTG9nUHJvdmlkZXIpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyID0gbG9nUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSBmb3IgYSBnaXZlbiBsb2cgdHlwZS5cbiAgICAgKiBUaGVyZSBhcmUgc29tZSBwcmVkZWZpbmVkIGNvbnRlbnQgcGxhY2Vob2xkZXJzIHRoZSB1c2VyIGNhbiB1dGlsaXplXG4gICAgICogdG8gY29uZmlndXJlIHRoZSBjdXN0b20gbWVzc2FnZXM6XG4gICAgICpcbiAgICAgKiB7MH06IFRoZSB0aW1lIHdoZW4gdGhlIGxvZyB3YXMgYWRkZWQuXG4gICAgICpcbiAgICAgKiB7MX06IFRoZSB0eXBlIG9mIHRoZSBsb2cgKFRyYWNlLCBEZWJ1ZyAsIEluZm9ybWF0aW9uLCBldGMpXG4gICAgICpcbiAgICAgKiB7Mn06IEEgY3VzdG9tIHRhZyB2YWx1ZSBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIHszfTogVGhlIGxvZyBtZXNzYWdlLlxuICAgICAqL1xuICAgIHNldE1lc3NhZ2VUZW1wbGF0ZSh0eXBlOiBMb2dUeXBlLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkXG4gICAge1xuICAgICAgICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMubGVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoTG9nZ2luZ1NlcnZpY2UudHlwZU5vdFJlY29nbml6ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG1lc3NhZ2UpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXNzYWdlIHRlbXBsYXRlIGNhbiBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXNbdHlwZV0gPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgZm9yIGFsbCB0aGUgdHlwZXMuXG4gICAgICogVGhlcmUgYXJlIHNvbWUgcHJlZGVmaW5lZCBjb250ZW50IHBsYWNlaG9sZGVycyB0aGUgdXNlciBjYW4gdXRpbGl6ZVxuICAgICAqIHRvIGNvbmZpZ3VyZSB0aGUgY3VzdG9tIG1lc3NhZ2VzOlxuICAgICAqXG4gICAgICogezB9OiBUaGUgdGltZSB3aGVuIHRoZSBsb2cgd2FzIGFkZGVkLlxuICAgICAqXG4gICAgICogezF9OiBUaGUgdHlwZSBvZiB0aGUgbG9nIChUcmFjZSwgRGVidWcgLCBJbmZvcm1hdGlvbiwgZXRjKVxuICAgICAqXG4gICAgICogezJ9OiBBIGN1c3RvbSB0YWcgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiB7M306IFRoZSBsb2cgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzZXRNZXNzYWdlVGVtcGxhdGVGb3JBbGwobWVzc2FnZTogc3RyaW5nKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKE9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG1lc3NhZ2UpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXNzYWdlIHRlbXBsYXRlIGNhbiBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGVtcGxhdGVzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMucHVzaChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIGxvZyBsZXZlbC5cbiAgICAgKiBMb2cgdHlwZXMgc21hbGxlciB0aGFuIHRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHNldE1pbmltdW1MZXZlbCh0eXBlOiBMb2dUeXBlKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gdGhpcy5tZXNzYWdlVGVtcGxhdGVzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKExvZ2dpbmdTZXJ2aWNlLnR5cGVOb3RSZWNvZ25pemVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWluaW11bUxldmVsID0gdHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2dzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgbG9nIGVudHJ5LlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgdXNlZCBmb3IgZnVydGhlciBhbmFseXNpcy5cbiAgICAgKi9cbiAgICBsb2cobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBMb2dUeXBlID0gTG9nVHlwZS5UcmFjZSwgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gdGhpcy5tZXNzYWdlVGVtcGxhdGVzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKExvZ2dpbmdTZXJ2aWNlLnR5cGVOb3RSZWNvZ25pemVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWVzc2FnZSBjYW4gbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPCB0aGlzLm1pbmltdW1MZXZlbClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IFN0cmluZ0V4dGVuc2lvbnMuZm9ybWF0KHRoaXMubWVzc2FnZVRlbXBsYXRlc1t0eXBlXSwgRGF0ZUV4dGVuc2lvbnMuZm9ybWF0KG5ldyBEYXRlKCksICdoaDptbTpzcycpLCBMb2dUeXBlW3R5cGVdLCB0YWcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSlcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBMb2dUeXBlLlRyYWNlOlxuICAgICAgICAgICAgICAgIHRoaXMubG9nUHJvdmlkZXIudHJhY2UoZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTG9nVHlwZS5EZWJ1ZzpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmRlYnVnKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuSW5mb3JtYXRpb246XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dQcm92aWRlci5pbmZvKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuV2FybmluZzpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLndhcm4oZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTG9nVHlwZS5FcnJvcjpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExvZ1R5cGUuQ3JpdGljYWw6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubG9nUHJvdmlkZXIuY3JpdGljYWwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmNyaXRpY2FsKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1Byb3ZpZGVyLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB0cmFjZSBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ1R5cGUuVHJhY2UsIHRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRlYnVnIGxvZyBlbnRyeS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIHRhZyBhIHRhZyB2YWx1ZSBmb3IgdGhlIGVudHJ5LlxuICAgICAqL1xuICAgIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nVHlwZS5EZWJ1ZywgdGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGluZm9ybWF0aW9uIGxvZyBlbnRyeS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIHRhZyBhIHRhZyB2YWx1ZSBmb3IgdGhlIGVudHJ5LlxuICAgICAqL1xuICAgIGluZm9ybWF0aW9uKG1lc3NhZ2U6IHN0cmluZywgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nVHlwZS5JbmZvcm1hdGlvbiwgdGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgd2FybmluZyBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICB3YXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgdGFnOiBzdHJpbmcgPSBudWxsKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nVHlwZS5XYXJuaW5nLCB0YWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gZXJyb3IgbG9nIGVudHJ5LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIHZhbHVlIGZvciB0aGUgZW50cnkuXG4gICAgICovXG4gICAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCB0YWc6IHN0cmluZyA9IG51bGwpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvZyhtZXNzYWdlLCBMb2dUeXBlLkVycm9yLCB0YWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjcml0aWNhbCBlcnJvciBsb2cgZW50cnkuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgdmFsdWUgZm9yIHRoZSBlbnRyeS5cbiAgICAgKi9cbiAgICBjcml0aWNhbChtZXNzYWdlOiBzdHJpbmcsIHRhZzogc3RyaW5nID0gbnVsbCk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ1R5cGUuQ3JpdGljYWwsIHRhZyk7XG4gICAgfVxufVxuIl19