UNPKG

ngx-toasty

Version:

Angular Toasty component shows growl-style alerts and messages for your web app

763 lines 76.7 kB
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory(require("@angular/core"), require("@angular/common"), require("rxjs/Subject"), require("@angular/platform-browser"));
	else if(typeof define === 'function' && define.amd)
		define(["@angular/core", "@angular/common", "rxjs/Subject", "@angular/platform-browser"], factory);
	else if(typeof exports === 'object')
		exports["ngx-toasty"] = factory(require("@angular/core"), require("@angular/common"), require("rxjs/Subject"), require("@angular/platform-browser"));
	else
		root["ngx-toasty"] = factory(root["@angular/core"], root["@angular/common"], root["rxjs/Subject"], root["@angular/platform-browser"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_7__, __WEBPACK_EXTERNAL_MODULE_8__, __WEBPACK_EXTERNAL_MODULE_9__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, {
/******/ 				configurable: false,
/******/ 				enumerable: true,
/******/ 				get: getter
/******/ 			});
/******/ 		}
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "/";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 6);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {

module.exports = __WEBPACK_EXTERNAL_MODULE_0__;

/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ToastOptions; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ToastData; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return ToastyConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return ToastyEventType; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return ToastyEvent; });
/* harmony export (immutable) */ __webpack_exports__["g"] = toastyServiceFactory;
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return ToastyService; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__angular_core__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__toasty_utils__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_rxjs_Subject__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_rxjs_Subject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_rxjs_Subject__);
// Copyright (C) 2016 Sergey Akopkokhyants
// This project is licensed under the terms of the MIT license.
// https://github.com/cadulis/ngx-toasty
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};



/**
 * Options to configure specific Toast
 */
var ToastOptions = (function () {
    function ToastOptions() {
    }
    ToastOptions = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Injectable"])()
    ], ToastOptions);
    return ToastOptions;
}());

/**
 * Structrure of Toast
 */
var ToastData = (function () {
    function ToastData() {
    }
    ToastData = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Injectable"])()
    ], ToastData);
    return ToastData;
}());

/**
 * Default configuration foa all toats and toasty container
 */
var ToastyConfig = (function () {
    function ToastyConfig() {
        // Maximum number of toasties to show at once
        this.limit = 5;
        // Whether to show the 'X' icon to close the toast
        this.showClose = true;
        // The window position where the toast pops up
        this.position = 'bottom-right';
        // How long (in miliseconds) the toasty shows before it's removed. Set to null/0 to turn off.
        this.timeout = 5000;
        // What theme to use
        this.theme = 'default';
    }
    ToastyConfig = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Injectable"])()
    ], ToastyConfig);
    return ToastyConfig;
}());

var ToastyEventType;
(function (ToastyEventType) {
    ToastyEventType[ToastyEventType["ADD"] = 0] = "ADD";
    ToastyEventType[ToastyEventType["CLEAR"] = 1] = "CLEAR";
    ToastyEventType[ToastyEventType["CLEAR_ALL"] = 2] = "CLEAR_ALL";
})(ToastyEventType || (ToastyEventType = {}));
var ToastyEvent = (function () {
    function ToastyEvent(type, value) {
        this.type = type;
        this.value = value;
    }
    return ToastyEvent;
}());

function toastyServiceFactory(config) {
    return new ToastyService(config);
}
/**
 * Toasty service helps to create different kinds of Toasts
 */
var ToastyService = (function () {
    function ToastyService(config) {
        this.config = config;
        // Init the counter
        this.uniqueCounter = 0;
        // ToastData event emitter
        // private toastsEmitter: EventEmitter<ToastData> = new EventEmitter<ToastData>();
        // Clear event emitter
        // private clearEmitter: EventEmitter<number> = new EventEmitter<number>();
        this.eventSource = new __WEBPACK_IMPORTED_MODULE_2_rxjs_Subject__["Subject"]();
        this.events = this.eventSource.asObservable();
    }
    ToastyService_1 = ToastyService;
    /**
     * Get list of toasts
     */
    // getToasts(): Observable<ToastData> {
    //   return this.toastsEmitter.asObservable();
    // }
    // getClear(): Observable<number> {
    //   return this.clearEmitter.asObservable();
    // }
    /**
     * Create Toast of a default type
     */
    ToastyService.prototype.default = function (options) {
        this.add(options, 'default');
    };
    /**
     * Create Toast of info type
     * @param  {object} options Individual toasty config overrides
     */
    ToastyService.prototype.info = function (options) {
        this.add(options, 'info');
    };
    /**
     * Create Toast of success type
     * @param  {object} options Individual toasty config overrides
     */
    ToastyService.prototype.success = function (options) {
        this.add(options, 'success');
    };
    /**
     * Create Toast of wait type
     * @param  {object} options Individual toasty config overrides
     */
    ToastyService.prototype.wait = function (options) {
        this.add(options, 'wait');
    };
    /**
     * Create Toast of error type
     * @param  {object} options Individual toasty config overrides
     */
    ToastyService.prototype.error = function (options) {
        this.add(options, 'error');
    };
    /**
     * Create Toast of warning type
     * @param  {object} options Individual toasty config overrides
     */
    ToastyService.prototype.warning = function (options) {
        this.add(options, 'warning');
    };
    // Add a new toast item
    ToastyService.prototype.add = function (options, type) {
        var toastyOptions;
        if (Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["c" /* isString */])(options) && options !== '' || Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["b" /* isNumber */])(options)) {
            toastyOptions = {
                title: options.toString()
            };
        }
        else {
            toastyOptions = options;
        }
        if (!toastyOptions || !toastyOptions.title && !toastyOptions.msg) {
            throw new Error('ng2-toasty: No toast title or message specified!');
        }
        type = type || 'default';
        // Set a unique counter for an id
        this.uniqueCounter++;
        // Set the local vs global config items
        var showClose = this._checkConfigItem(this.config, toastyOptions, 'showClose');
        // If we have a theme set, make sure it's a valid one
        var theme;
        if (toastyOptions.theme) {
            theme = ToastyService_1.THEMES.indexOf(toastyOptions.theme) > -1 ? toastyOptions.theme : this.config.theme;
        }
        else {
            theme = this.config.theme;
        }
        var toast = {
            id: this.uniqueCounter,
            title: toastyOptions.title,
            msg: toastyOptions.msg,
            showClose: showClose,
            type: 'toasty-type-' + type,
            theme: 'toasty-theme-' + theme,
            onAdd: toastyOptions.onAdd && Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["a" /* isFunction */])(toastyOptions.onAdd) ? toastyOptions.onAdd : null,
            onRemove: toastyOptions.onRemove && Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["a" /* isFunction */])(toastyOptions.onRemove) ? toastyOptions.onRemove : null,
            onClick: toastyOptions.onClick && Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["a" /* isFunction */])(toastyOptions.onClick) ? toastyOptions.onClick : null
        };
        // If there's a timeout individually or globally, set the toast to timeout
        // Allows a caller to pass null/0 and override the default. Can also set the default to null/0 to turn off.
        toast.timeout = toastyOptions.hasOwnProperty('timeout') ? toastyOptions.timeout : this.config.timeout;
        // Push up a new toast item
        // this.toastsSubscriber.next(toast);
        // this.toastsEmitter.next(toast);
        this.emitEvent(new ToastyEvent(ToastyEventType.ADD, toast));
        // If we have a onAdd function, call it here
        if (toastyOptions.onAdd && Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["a" /* isFunction */])(toastyOptions.onAdd)) {
            toastyOptions.onAdd.call(this, toast);
        }
    };
    // Clear all toasts
    ToastyService.prototype.clearAll = function () {
        // this.clearEmitter.next(null);
        this.emitEvent(new ToastyEvent(ToastyEventType.CLEAR_ALL));
    };
    // Clear the specific one
    ToastyService.prototype.clear = function (id) {
        // this.clearEmitter.next(id);
        this.emitEvent(new ToastyEvent(ToastyEventType.CLEAR, id));
    };
    // Checks whether the local option is set, if not,
    // checks the global config
    ToastyService.prototype._checkConfigItem = function (config, options, property) {
        if (options[property] === false) {
            return false;
        }
        else if (!options[property]) {
            return config[property];
        }
        else {
            return true;
        }
    };
    ToastyService.prototype.emitEvent = function (event) {
        if (this.eventSource) {
            // Push up a new event
            this.eventSource.next(event);
        }
    };
    // Allowed THEMES
    ToastyService.THEMES = ['default', 'material', 'bootstrap'];
    ToastyService = ToastyService_1 = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Injectable"])(),
        __metadata("design:paramtypes", [ToastyConfig])
    ], ToastyService);
    return ToastyService;
    var ToastyService_1;
}());



/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (immutable) */ __webpack_exports__["c"] = isString;
/* harmony export (immutable) */ __webpack_exports__["b"] = isNumber;
/* harmony export (immutable) */ __webpack_exports__["a"] = isFunction;
/**
 * Check and return true if an object is type of string
 */
function isString(obj) {
    return typeof obj === "string";
}
/**
 * Check and return true if an object is type of number
 */
function isNumber(obj) {
    return typeof obj === "number";
}
/**
 * Check and return true if an object is type of Function
 */
function isFunction(obj) {
    return typeof obj === "function";
}


/***/ }),
/* 3 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ToastyComponent; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__angular_core__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__toasty_utils__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__toasty_service__ = __webpack_require__(1);
// Copyright (C) 2016 Sergey Akopkokhyants
// This project is licensed under the terms of the MIT license.
// https://github.com/cadulis/ngx-toasty
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};



/**
 * Toasty is container for Toast components
 */
var ToastyComponent = (function () {
    function ToastyComponent(config, toastyService) {
        this.config = config;
        this.toastyService = toastyService;
        this._position = '';
        // The storage for toasts.
        this.toasts = [];
        // Initialise position
        this.position = '';
    }
    ToastyComponent_1 = ToastyComponent;
    Object.defineProperty(ToastyComponent.prototype, "position", {
        get: function () {
            return this._position;
        },
        // The window position where the toast pops up. Possible values:
        // - bottom-right (default value from ToastConfig)
        // - bottom-left
        // - top-right
        // - top-left
        // - top-center
        // - bottom-center
        // - center-center
        set: function (value) {
            if (value) {
                var notFound = true;
                for (var i = 0; i < ToastyComponent_1.POSITIONS.length; i++) {
                    if (ToastyComponent_1.POSITIONS[i] === value) {
                        notFound = false;
                        break;
                    }
                }
                if (notFound) {
                    // Position was wrong - clear it here to use the one from config.
                    value = this.config.position;
                }
            }
            else {
                value = this.config.position;
            }
            this._position = 'toasty-position-' + value;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * `ngOnInit` is called right after the directive's data-bound properties have been checked for the
     * first time, and before any of its children have been checked. It is invoked only once when the
     * directive is instantiated.
     */
    ToastyComponent.prototype.ngOnInit = function () {
        var _this = this;
        // We listen events from our service
        this.toastyService.events.subscribe(function (event) {
            if (event.type === __WEBPACK_IMPORTED_MODULE_2__toasty_service__["e" /* ToastyEventType */].ADD) {
                // Add the new one
                var toast = event.value;
                _this.add(toast);
            }
            else if (event.type === __WEBPACK_IMPORTED_MODULE_2__toasty_service__["e" /* ToastyEventType */].CLEAR) {
                // Clear the one by number
                var id = event.value;
                _this.clear(id);
            }
            else if (event.type === __WEBPACK_IMPORTED_MODULE_2__toasty_service__["e" /* ToastyEventType */].CLEAR_ALL) {
                // Lets clear all toasts
                _this.clearAll();
            }
        });
    };
    /**
     * Event listener of 'clickToast' event comes from ToastyComponent.
     * This method executes click option callback associated with this Toast.
     */
    ToastyComponent.prototype.clickToast = function (toast) {
        if (toast.onClick && Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["a" /* isFunction */])(toast.onClick)) {
            this.clear(toast.id);
            toast.onClick.apply(this, toast);
        }
    };
    /**
     * Event listener of 'closeToast' event comes from ToastyComponent.
     * This method removes ToastComponent associated with this Toast.
     */
    ToastyComponent.prototype.closeToast = function (toast) {
        this.clear(toast.id);
    };
    /**
     * Add new Toast
     */
    ToastyComponent.prototype.add = function (toast) {
        // If we've gone over our limit, remove the earliest
        // one from the array
        if (this.toasts.length >= this.config.limit) {
            this.toasts.shift();
        }
        // Add toasty to array
        this.toasts.push(toast);
        //
        // If there's a timeout individually or globally,
        // set the toast to timeout
        if (toast.timeout) {
            this._setTimeout(toast);
        }
    };
    /**
     * Clear individual toast by id
     * @param id is unique identifier of Toast
     */
    ToastyComponent.prototype.clear = function (id) {
        var _this = this;
        if (id) {
            this.toasts.forEach(function (value, key) {
                if (value.id === id) {
                    if (value.onRemove && Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["a" /* isFunction */])(value.onRemove)) {
                        value.onRemove.call(_this, value);
                    }
                    _this.toasts.splice(key, 1);
                }
            });
        }
        else {
            throw new Error('Please provide id of Toast to close');
        }
    };
    /**
     * Clear all toasts
     */
    ToastyComponent.prototype.clearAll = function () {
        var _this = this;
        this.toasts.forEach(function (value, key) {
            if (value.onRemove && Object(__WEBPACK_IMPORTED_MODULE_1__toasty_utils__["a" /* isFunction */])(value.onRemove)) {
                value.onRemove.call(_this, value);
            }
        });
        this.toasts = [];
    };
    /**
     * Custom setTimeout function for specific setTimeouts on individual toasts.
     */
    ToastyComponent.prototype._setTimeout = function (toast) {
        var _this = this;
        window.setTimeout(function () {
            _this.clear(toast.id);
        }, toast.timeout);
    };
    /**
     * Set of constants defins position of Toasty on the page.
     */
    ToastyComponent.POSITIONS = ['bottom-right', 'bottom-left', 'top-right', 'top-left', 'top-center', 'bottom-center', 'center-center'];
    __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
        __metadata("design:type", String),
        __metadata("design:paramtypes", [String])
    ], ToastyComponent.prototype, "position", null);
    ToastyComponent = ToastyComponent_1 = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"])({
            selector: 'ng2-toasty',
            template: "\n    <div id=\"toasty\" [ngClass]=\"[position]\">\n        <ng2-toast *ngFor=\"let toast of toasts\" [toast]=\"toast\" (clickToast)=\"clickToast(toast)\" (closeToast)=\"closeToast(toast)\"></ng2-toast>\n    </div>"
        }),
        __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_2__toasty_service__["c" /* ToastyConfig */], __WEBPACK_IMPORTED_MODULE_2__toasty_service__["f" /* ToastyService */]])
    ], ToastyComponent);
    return ToastyComponent;
    var ToastyComponent_1;
}());



/***/ }),
/* 4 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ToastComponent; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__angular_core__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__toasty_service__ = __webpack_require__(1);
// Copyright (C) 2016 Sergey Akopkokhyants
// This project is licensed under the terms of the MIT license.
// https://github.com/cadulis/ngx-toasty
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};


/**
 * A Toast component shows message with title and close button.
 */
var ToastComponent = (function () {
    function ToastComponent() {
        this.clickToastEvent = new __WEBPACK_IMPORTED_MODULE_0__angular_core__["EventEmitter"]();
        this.closeToastEvent = new __WEBPACK_IMPORTED_MODULE_0__angular_core__["EventEmitter"]();
    }
    /**
     * Event handler invokes when user clicks on toast.
     * This method emit new event into ToastyContainer to process click on toast.
     */
    ToastComponent.prototype.click = function ($event) {
        $event.preventDefault();
        this.clickToastEvent.next(this.toast);
    };
    /**
     * Event handler invokes when user clicks on close button.
     * This method emit new event into ToastyContainer to close it.
     */
    ToastComponent.prototype.close = function ($event) {
        $event.preventDefault();
        this.closeToastEvent.next(this.toast);
    };
    __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
        __metadata("design:type", __WEBPACK_IMPORTED_MODULE_1__toasty_service__["a" /* ToastData */])
    ], ToastComponent.prototype, "toast", void 0);
    __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Output"])('clickToast'),
        __metadata("design:type", Object)
    ], ToastComponent.prototype, "clickToastEvent", void 0);
    __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Output"])('closeToast'),
        __metadata("design:type", Object)
    ], ToastComponent.prototype, "closeToastEvent", void 0);
    ToastComponent = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Component"])({
            selector: 'ng2-toast',
            template: "\n        <div class=\"toast\" [ngClass]=\"[toast.type, toast.theme]\" (click)=\"click($event)\">\n            <div *ngIf=\"toast.showClose\" class=\"close-button\" (click)=\"close($event)\"></div>\n            <div *ngIf=\"toast.title || toast.msg\" class=\"toast-text\">\n                <span *ngIf=\"toast.title\" class=\"toast-title\" [innerHTML]=\"toast.title | safeHtml\"></span>\n                <br *ngIf=\"toast.title && toast.msg\" />\n                <span *ngIf=\"toast.msg\" class=\"toast-msg\" [innerHtml]=\"toast.msg | safeHtml\"></span>\n            </div>\n        </div>"
        })
    ], ToastComponent);
    return ToastComponent;
}());



/***/ }),
/* 5 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SafeHtmlPipe; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_platform_browser__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_platform_browser___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__angular_platform_browser__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__angular_core__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__angular_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__angular_core__);
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};


var SafeHtmlPipe = (function () {
    function SafeHtmlPipe(domSanitized) {
        this.domSanitized = domSanitized;
    }
    SafeHtmlPipe.prototype.transform = function (value) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        return this.domSanitized.bypassSecurityTrustHtml(value);
    };
    SafeHtmlPipe = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_1__angular_core__["Pipe"])({ name: 'safeHtml' }),
        __metadata("design:paramtypes", [__WEBPACK_IMPORTED_MODULE_0__angular_platform_browser__["DomSanitizer"]])
    ], SafeHtmlPipe);
    return SafeHtmlPipe;
}());



/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "providers", function() { return providers; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ToastyModule", function() { return ToastyModule; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__angular_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__angular_core__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__angular_common__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__angular_common___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__angular_common__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__ = __webpack_require__(1);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastOptions", function() { return __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastData", function() { return __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["a"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastyConfig", function() { return __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastyEventType", function() { return __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["e"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastyEvent", function() { return __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["d"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "toastyServiceFactory", function() { return __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["g"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastyService", function() { return __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["f"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_toasty_component__ = __webpack_require__(3);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastyComponent", function() { return __WEBPACK_IMPORTED_MODULE_3__src_toasty_component__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_toast_component__ = __webpack_require__(4);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ToastComponent", function() { return __WEBPACK_IMPORTED_MODULE_4__src_toast_component__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_shared__ = __webpack_require__(5);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SafeHtmlPipe", function() { return __WEBPACK_IMPORTED_MODULE_5__src_shared__["a"]; });
// Copyright (C) 2016 Sergey Akopkokhyants
// This project is licensed under the terms of the MIT license.
// https://github.com/cadulis/ngx-toasty
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};










var providers = [
    __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["c" /* ToastyConfig */],
    { provide: __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["f" /* ToastyService */], useFactory: __WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["g" /* toastyServiceFactory */], deps: [__WEBPACK_IMPORTED_MODULE_2__src_toasty_service__["c" /* ToastyConfig */]] }
];
var ToastyModule = (function () {
    function ToastyModule() {
    }
    ToastyModule_1 = ToastyModule;
    ToastyModule.forRoot = function () {
        return {
            ngModule: ToastyModule_1,
            providers: providers
        };
    };
    ToastyModule = ToastyModule_1 = __decorate([
        Object(__WEBPACK_IMPORTED_MODULE_0__angular_core__["NgModule"])({
            imports: [__WEBPACK_IMPORTED_MODULE_1__angular_common__["CommonModule"]],
            declarations: [__WEBPACK_IMPORTED_MODULE_4__src_toast_component__["a" /* ToastComponent */], __WEBPACK_IMPORTED_MODULE_3__src_toasty_component__["a" /* ToastyComponent */], __WEBPACK_IMPORTED_MODULE_5__src_shared__["a" /* SafeHtmlPipe */]],
            exports: [__WEBPACK_IMPORTED_MODULE_4__src_toast_component__["a" /* ToastComponent */], __WEBPACK_IMPORTED_MODULE_3__src_toasty_component__["a" /* ToastyComponent */]],
            providers: providers
        })
    ], ToastyModule);
    return ToastyModule;
    var ToastyModule_1;
}());



/***/ }),
/* 7 */
/***/ (function(module, exports) {

module.exports = __WEBPACK_EXTERNAL_MODULE_7__;

/***/ }),
/* 8 */
/***/ (function(module, exports) {

module.exports = __WEBPACK_EXTERNAL_MODULE_8__;

/***/ }),
/* 9 */
/***/ (function(module, exports) {

module.exports = __WEBPACK_EXTERNAL_MODULE_9__;

/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBkYTMwMTBjZDViZWYwMDA2MzgwOSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAYW5ndWxhci9jb3JlXCIiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RvYXN0eS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy90b2FzdHkudXRpbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RvYXN0eS5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RvYXN0LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc2hhcmVkLnRzIiwid2VicGFjazovLy8uL2luZGV4LnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcIkBhbmd1bGFyL2NvbW1vblwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInJ4anMvU3ViamVjdFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7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QUErRDtBQUMvRCx3Q0FBd0M7Ozs7Ozs7QUFFc0I7QUFDZjtBQUVWO0FBQ0U7QUFDRDtBQUNUO0FBRTRCO0FBQ0Y7QUFDWDtBQUM2QztBQUVsRixJQUFJLFNBQVMsR0FBRztJQUNuQix5RUFBWTtJQUNaLEVBQUUsT0FBTyxFQUFFLDBFQUFhLEVBQUUsVUFBVSxFQUFFLGlGQUFvQixFQUFFLElBQUksRUFBRSxDQUFDLHlFQUFZLENBQUMsRUFBRTtDQUNyRixDQUFDO0FBUUY7SUFBQTtJQU9BLENBQUM7cUJBUFksWUFBWTtJQUNkLG9CQUFPLEdBQWQ7UUFDSSxNQUFNLENBQUM7WUFDSCxRQUFRLEVBQUUsY0FBWTtZQUN0QixTQUFTLEVBQUUsU0FBUztTQUN2QixDQUFDO0lBQ04sQ0FBQztJQU5RLFlBQVk7UUFOeEIsK0RBQVEsQ0FBQztZQUNOLE9BQU8sRUFBRSxDQUFDLDZEQUFZLENBQUM7WUFDdkIsWUFBWSxFQUFFLENBQUMsNEVBQWMsRUFBRSw4RUFBZSxFQUFFLGlFQUFZLENBQUM7WUFDN0QsT0FBTyxFQUFFLENBQUUsNEVBQWMsRUFBRSw4RUFBZSxDQUFDO1lBQzNDLFNBQVMsRUFBRSxTQUFTO1NBQ3ZCLENBQUM7T0FDVyxZQUFZLENBT3hCO0lBQUQsbUJBQUM7O0NBQUE7QUFQd0I7Ozs7Ozs7QUM1QnpCLCtDOzs7Ozs7QUNBQSwrQzs7Ozs7O0FDQUEsK0MiLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiQGFuZ3VsYXIvY29yZVwiKSwgcmVxdWlyZShcIkBhbmd1bGFyL2NvbW1vblwiKSwgcmVxdWlyZShcInJ4anMvU3ViamVjdFwiKSwgcmVxdWlyZShcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wiQGFuZ3VsYXIvY29yZVwiLCBcIkBhbmd1bGFyL2NvbW1vblwiLCBcInJ4anMvU3ViamVjdFwiLCBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wibmd4LXRvYXN0eVwiXSA9IGZhY3RvcnkocmVxdWlyZShcIkBhbmd1bGFyL2NvcmVcIiksIHJlcXVpcmUoXCJAYW5ndWxhci9jb21tb25cIiksIHJlcXVpcmUoXCJyeGpzL1N1YmplY3RcIiksIHJlcXVpcmUoXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJuZ3gtdG9hc3R5XCJdID0gZmFjdG9yeShyb290W1wiQGFuZ3VsYXIvY29yZVwiXSwgcm9vdFtcIkBhbmd1bGFyL2NvbW1vblwiXSwgcm9vdFtcInJ4anMvU3ViamVjdFwiXSwgcm9vdFtcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8wX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfN19fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzhfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV85X18pIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGRhMzAxMGNkNWJlZjAwMDYzODA5IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzBfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIkBhbmd1bGFyL2NvcmVcIlxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBDb3B5cmlnaHQgKEMpIDIwMTYgU2VyZ2V5IEFrb3Brb2toeWFudHNcbi8vIFRoaXMgcHJvamVjdCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBsaWNlbnNlLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhZHVsaXMvbmd4LXRvYXN0eVxuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOdW1iZXIsIGlzRnVuY3Rpb24gfSBmcm9tICcuL3RvYXN0eS51dGlscyc7XG5cbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcblxuLyoqXG4gKiBPcHRpb25zIHRvIGNvbmZpZ3VyZSBzcGVjaWZpYyBUb2FzdFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVG9hc3RPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgbXNnPzogc3RyaW5nO1xuICBzaG93Q2xvc2U/OiBib29sZWFuO1xuICB0aGVtZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgb25BZGQ/OiBGdW5jdGlvbjtcbiAgb25SZW1vdmU/OiBGdW5jdGlvbjtcbiAgb25DbGljaz86IEZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIFN0cnVjdHJ1cmUgb2YgVG9hc3RcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRvYXN0RGF0YSB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIG1zZzogc3RyaW5nO1xuICBzaG93Q2xvc2U6IGJvb2xlYW47XG4gIHR5cGU6IHN0cmluZztcbiAgdGhlbWU6IHN0cmluZztcbiAgdGltZW91dDogbnVtYmVyO1xuICBvbkFkZDogRnVuY3Rpb247XG4gIG9uUmVtb3ZlOiBGdW5jdGlvbjtcbiAgb25DbGljazogRnVuY3Rpb247XG59XG5cbi8qKlxuICogRGVmYXVsdCBjb25maWd1cmF0aW9uIGZvYSBhbGwgdG9hdHMgYW5kIHRvYXN0eSBjb250YWluZXJcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRvYXN0eUNvbmZpZyB7XG5cbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgdG9hc3RpZXMgdG8gc2hvdyBhdCBvbmNlXG4gIGxpbWl0OiBudW1iZXIgPSA1O1xuXG4gIC8vIFdoZXRoZXIgdG8gc2hvdyB0aGUgJ1gnIGljb24gdG8gY2xvc2UgdGhlIHRvYXN0XG4gIHNob3dDbG9zZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gVGhlIHdpbmRvdyBwb3NpdGlvbiB3aGVyZSB0aGUgdG9hc3QgcG9wcyB1cFxuICBwb3NpdGlvbjogJ2JvdHRvbS1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAndG9wLWxlZnQnIHwgJ3RvcC1jZW50ZXInIHwgJ2JvdHRvbS1jZW50ZXInIHwgJ2NlbnRlci1jZW50ZXInID0gJ2JvdHRvbS1yaWdodCc7XG5cbiAgLy8gSG93IGxvbmcgKGluIG1pbGlzZWNvbmRzKSB0aGUgdG9hc3R5IHNob3dzIGJlZm9yZSBpdCdzIHJlbW92ZWQuIFNldCB0byBudWxsLzAgdG8gdHVybiBvZmYuXG4gIHRpbWVvdXQ6IG51bWJlciA9IDUwMDA7XG5cbiAgLy8gV2hhdCB0aGVtZSB0byB1c2VcbiAgdGhlbWU6ICdkZWZhdWx0JyB8ICdtYXRlcmlhbCcgfCAnYm9vdHN0cmFwJyA9ICdkZWZhdWx0Jztcbn1cblxuZXhwb3J0IGVudW0gVG9hc3R5RXZlbnRUeXBlIHtcbiAgQURELFxuICBDTEVBUixcbiAgQ0xFQVJfQUxMXG59XG5cbmV4cG9ydCBjbGFzcyBUb2FzdHlFdmVudCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHR5cGU6VG9hc3R5RXZlbnRUeXBlLCBwdWJsaWMgdmFsdWU/OmFueSkge31cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvYXN0eVNlcnZpY2VGYWN0b3J5KGNvbmZpZzogVG9hc3R5Q29uZmlnKTogVG9hc3R5U2VydmljZSAge1xuICAgIHJldHVybiBuZXcgVG9hc3R5U2VydmljZShjb25maWcpO1xufVxuXG4vKipcbiAqIFRvYXN0eSBzZXJ2aWNlIGhlbHBzIHRvIGNyZWF0ZSBkaWZmZXJlbnQga2luZHMgb2YgVG9hc3RzXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUb2FzdHlTZXJ2aWNlIHtcbiAgLy8gQWxsb3dlZCBUSEVNRVNcbiAgc3RhdGljIFRIRU1FUzogQXJyYXk8c3RyaW5nPiA9IFsnZGVmYXVsdCcsICdtYXRlcmlhbCcsICdib290c3RyYXAnXTtcbiAgLy8gSW5pdCB0aGUgY291bnRlclxuICB1bmlxdWVDb3VudGVyOiBudW1iZXIgPSAwO1xuICAvLyBUb2FzdERhdGEgZXZlbnQgZW1pdHRlclxuICAvLyBwcml2YXRlIHRvYXN0c0VtaXR0ZXI6IEV2ZW50RW1pdHRlcjxUb2FzdERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxUb2FzdERhdGE+KCk7XG4gIC8vIENsZWFyIGV2ZW50IGVtaXR0ZXJcbiAgLy8gcHJpdmF0ZSBjbGVhckVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBldmVudFNvdXJjZTogU3ViamVjdDxUb2FzdHlFdmVudD4gPSBuZXcgU3ViamVjdDxUb2FzdHlFdmVudD4oKTtcbiAgcHVibGljIGV2ZW50czogT2JzZXJ2YWJsZTxUb2FzdHlFdmVudD4gPSB0aGlzLmV2ZW50U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBUb2FzdHlDb25maWcpIHt9XG5cbiAgLyoqXG4gICAqIEdldCBsaXN0IG9mIHRvYXN0c1xuICAgKi9cbiAgLy8gZ2V0VG9hc3RzKCk6IE9ic2VydmFibGU8VG9hc3REYXRhPiB7XG4gIC8vICAgcmV0dXJuIHRoaXMudG9hc3RzRW1pdHRlci5hc09ic2VydmFibGUoKTtcbiAgLy8gfVxuXG4gIC8vIGdldENsZWFyKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gIC8vICAgcmV0dXJuIHRoaXMuY2xlYXJFbWl0dGVyLmFzT2JzZXJ2YWJsZSgpO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBUb2FzdCBvZiBhIGRlZmF1bHQgdHlwZVxuICAgKi9cbiAgZGVmYXVsdChvcHRpb25zOiBUb2FzdE9wdGlvbnN8c3RyaW5nfG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWRkKG9wdGlvbnMsICdkZWZhdWx0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFRvYXN0IG9mIGluZm8gdHlwZVxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgSW5kaXZpZHVhbCB0b2FzdHkgY29uZmlnIG92ZXJyaWRlc1xuICAgKi9cbiAgaW5mbyhvcHRpb25zOiBUb2FzdE9wdGlvbnN8c3RyaW5nfG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWRkKG9wdGlvbnMsICdpbmZvJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFRvYXN0IG9mIHN1Y2Nlc3MgdHlwZVxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgSW5kaXZpZHVhbCB0b2FzdHkgY29uZmlnIG92ZXJyaWRlc1xuICAgKi9cbiAgc3VjY2VzcyhvcHRpb25zOiBUb2FzdE9wdGlvbnN8c3RyaW5nfG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWRkKG9wdGlvbnMsICdzdWNjZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFRvYXN0IG9mIHdhaXQgdHlwZVxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgSW5kaXZpZHVhbCB0b2FzdHkgY29uZmlnIG92ZXJyaWRlc1xuICAgKi9cbiAgd2FpdChvcHRpb25zOiBUb2FzdE9wdGlvbnN8c3RyaW5nfG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWRkKG9wdGlvbnMsICd3YWl0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFRvYXN0IG9mIGVycm9yIHR5cGVcbiAgICogQHBhcmFtICB7b2JqZWN0fSBvcHRpb25zIEluZGl2aWR1YWwgdG9hc3R5IGNvbmZpZyBvdmVycmlkZXNcbiAgICovXG4gIGVycm9yKG9wdGlvbnM6IFRvYXN0T3B0aW9uc3xzdHJpbmd8bnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5hZGQob3B0aW9ucywgJ2Vycm9yJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFRvYXN0IG9mIHdhcm5pbmcgdHlwZVxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgSW5kaXZpZHVhbCB0b2FzdHkgY29uZmlnIG92ZXJyaWRlc1xuICAgKi9cbiAgd2FybmluZyhvcHRpb25zOiBUb2FzdE9wdGlvbnN8c3RyaW5nfG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWRkKG9wdGlvbnMsICd3YXJuaW5nJyk7XG4gIH1cblxuICAvLyBBZGQgYSBuZXcgdG9hc3QgaXRlbVxuICBwcml2YXRlIGFkZChvcHRpb25zOiBUb2FzdE9wdGlvbnN8c3RyaW5nfG51bWJlciwgdHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHRvYXN0eU9wdGlvbnM6IFRvYXN0T3B0aW9ucztcblxuICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSAmJiBvcHRpb25zICE9PSAnJyB8fCBpc051bWJlcihvcHRpb25zKSkge1xuICAgICAgdG9hc3R5T3B0aW9ucyA9IDxUb2FzdE9wdGlvbnM+e1xuICAgICAgICB0aXRsZTogb3B0aW9ucy50b1N0cmluZygpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0b2FzdHlPcHRpb25zID0gPFRvYXN0T3B0aW9ucz5vcHRpb25zO1xuICAgIH1cblxuICAgIGlmICghdG9hc3R5T3B0aW9ucyB8fCAhdG9hc3R5T3B0aW9ucy50aXRsZSAmJiAhdG9hc3R5T3B0aW9ucy5tc2cpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbmcyLXRvYXN0eTogTm8gdG9hc3QgdGl0bGUgb3IgbWVzc2FnZSBzcGVjaWZpZWQhJyk7XG4gICAgfVxuXG4gICAgdHlwZSA9IHR5cGUgfHwgJ2RlZmF1bHQnO1xuXG4gICAgLy8gU2V0IGEgdW5pcXVlIGNvdW50ZXIgZm9yIGFuIGlkXG4gICAgdGhpcy51bmlxdWVDb3VudGVyKys7XG5cbiAgICAvLyBTZXQgdGhlIGxvY2FsIHZzIGdsb2JhbCBjb25maWcgaXRlbXNcbiAgICBsZXQgc2hvd0Nsb3NlID0gdGhpcy5fY2hlY2tDb25maWdJdGVtKHRoaXMuY29uZmlnLCB0b2FzdHlPcHRpb25zLCAnc2hvd0Nsb3NlJyk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgdGhlbWUgc2V0LCBtYWtlIHN1cmUgaXQncyBhIHZhbGlkIG9uZVxuICAgIGxldCB0aGVtZTogc3RyaW5nO1xuICAgIGlmICh0b2FzdHlPcHRpb25zLnRoZW1lKSB7XG4gICAgICB0aGVtZSA9IFRvYXN0eVNlcnZpY2UuVEhFTUVTLmluZGV4T2YodG9hc3R5T3B0aW9ucy50aGVtZSkgPiAtMSA/IHRvYXN0eU9wdGlvbnMudGhlbWUgOiB0aGlzLmNvbmZpZy50aGVtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSB0aGlzLmNvbmZpZy50aGVtZTtcbiAgICB9XG5cbiAgICBsZXQgdG9hc3Q6IFRvYXN0RGF0YSA9IDxUb2FzdERhdGE+e1xuICAgICAgaWQgICAgICAgOiB0aGlzLnVuaXF1ZUNvdW50ZXIsXG4gICAgICB0aXRsZSAgICA6IHRvYXN0eU9wdGlvbnMudGl0bGUsXG4gICAgICBtc2cgICAgICA6IHRvYXN0eU9wdGlvbnMubXNnLFxuICAgICAgc2hvd0Nsb3NlOiBzaG93Q2xvc2UsXG4gICAgICB0eXBlICAgICA6ICd0b2FzdHktdHlwZS0nICsgdHlwZSxcbiAgICAgIHRoZW1lICAgIDogJ3RvYXN0eS10aGVtZS0nICsgdGhlbWUsXG4gICAgICBvbkFkZCAgICA6IHRvYXN0eU9wdGlvbnMub25BZGQgJiYgaXNGdW5jdGlvbih0b2FzdHlPcHRpb25zLm9uQWRkKSA/IHRvYXN0eU9wdGlvbnMub25BZGQgOiBudWxsLFxuICAgICAgb25SZW1vdmUgOiB0b2FzdHlPcHRpb25zLm9uUmVtb3ZlICYmIGlzRnVuY3Rpb24odG9hc3R5T3B0aW9ucy5vblJlbW92ZSkgPyB0b2FzdHlPcHRpb25zLm9uUmVtb3ZlIDogbnVsbCxcbiAgICAgIG9uQ2xpY2sgIDogdG9hc3R5T3B0aW9ucy5vbkNsaWNrICYmIGlzRnVuY3Rpb24odG9hc3R5T3B0aW9ucy5vbkNsaWNrKSA/IHRvYXN0eU9wdGlvbnMub25DbGljayA6IG51bGxcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhlcmUncyBhIHRpbWVvdXQgaW5kaXZpZHVhbGx5IG9yIGdsb2JhbGx5LCBzZXQgdGhlIHRvYXN0IHRvIHRpbWVvdXRcbiAgICAvLyBBbGxvd3MgYSBjYWxsZXIgdG8gcGFzcyBudWxsLzAgYW5kIG92ZXJyaWRlIHRoZSBkZWZhdWx0LiBDYW4gYWxzbyBzZXQgdGhlIGRlZmF1bHQgdG8gbnVsbC8wIHRvIHR1cm4gb2ZmLlxuICAgIHRvYXN0LnRpbWVvdXQgPSB0b2FzdHlPcHRpb25zLmhhc093blByb3BlcnR5KCd0aW1lb3V0JykgPyB0b2FzdHlPcHRpb25zLnRpbWVvdXQgOiB0aGlzLmNvbmZpZy50aW1lb3V0O1xuXG4gICAgLy8gUHVzaCB1cCBhIG5ldyB0b2FzdCBpdGVtXG4gICAgLy8gdGhpcy50b2FzdHNTdWJzY3JpYmVyLm5leHQodG9hc3QpO1xuICAgIC8vIHRoaXMudG9hc3RzRW1pdHRlci5uZXh0KHRvYXN0KTtcbiAgICB0aGlzLmVtaXRFdmVudChuZXcgVG9hc3R5RXZlbnQoVG9hc3R5RXZlbnRUeXBlLkFERCwgdG9hc3QpKTtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgb25BZGQgZnVuY3Rpb24sIGNhbGwgaXQgaGVyZVxuICAgIGlmICh0b2FzdHlPcHRpb25zLm9uQWRkICYmIGlzRnVuY3Rpb24odG9hc3R5T3B0aW9ucy5vbkFkZCkpIHtcbiAgICAgIHRvYXN0eU9wdGlvbnMub25BZGQuY2FsbCh0aGlzLCB0b2FzdCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2xlYXIgYWxsIHRvYXN0c1xuICBjbGVhckFsbCgpIHtcbiAgICAvLyB0aGlzLmNsZWFyRW1pdHRlci5uZXh0KG51bGwpO1xuICAgIHRoaXMuZW1pdEV2ZW50KG5ldyBUb2FzdHlFdmVudChUb2FzdHlFdmVudFR5cGUuQ0xFQVJfQUxMKSk7XG4gIH1cblxuICAvLyBDbGVhciB0aGUgc3BlY2lmaWMgb25lXG4gIGNsZWFyKGlkOiBudW1iZXIpIHtcbiAgICAvLyB0aGlzLmNsZWFyRW1pdHRlci5uZXh0KGlkKTtcbiAgICB0aGlzLmVtaXRFdmVudChuZXcgVG9hc3R5RXZlbnQoVG9hc3R5RXZlbnRUeXBlLkNMRUFSLCBpZCkpO1xuICB9XG5cbiAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGxvY2FsIG9wdGlvbiBpcyBzZXQsIGlmIG5vdCxcbiAgLy8gY2hlY2tzIHRoZSBnbG9iYWwgY29uZmlnXG4gIHByaXZhdGUgX2NoZWNrQ29uZmlnSXRlbShjb25maWc6IGFueSwgb3B0aW9uczogYW55LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgaWYgKG9wdGlvbnNbcHJvcGVydHldID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnNbcHJvcGVydHldKSB7XG4gICAgICByZXR1cm4gY29uZmlnW3Byb3BlcnR5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RXZlbnQoZXZlbnQ6IFRvYXN0eUV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmV2ZW50U291cmNlKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHVwIGEgbmV3IGV2ZW50XG4gICAgICAgICAgICB0aGlzLmV2ZW50U291cmNlLm5leHQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL3RzbGludC1sb2FkZXIhLi9zcmMvdG9hc3R5LnNlcnZpY2UudHMiLCIvKipcbiAqIENoZWNrIGFuZCByZXR1cm4gdHJ1ZSBpZiBhbiBvYmplY3QgaXMgdHlwZSBvZiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKG9iajphbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIjtcbn1cblxuLyoqXG4gKiBDaGVjayBhbmQgcmV0dXJuIHRydWUgaWYgYW4gb2JqZWN0IGlzIHR5cGUgb2YgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihvYmo6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm51bWJlclwiO1xufVxuXG4vKipcbiAqIENoZWNrIGFuZCByZXR1cm4gdHJ1ZSBpZiBhbiBvYmplY3QgaXMgdHlwZSBvZiBGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihvYmo6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCI7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvdHNsaW50LWxvYWRlciEuL3NyYy90b2FzdHkudXRpbHMudHMiLCIvLyBDb3B5cmlnaHQgKEMpIDIwMTYgU2VyZ2V5IEFrb3Brb2toeWFudHNcbi8vIFRoaXMgcHJvamVjdCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBsaWNlbnNlLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhZHVsaXMvbmd4LXRvYXN0eVxuXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4vdG9hc3R5LnV0aWxzJztcbmltcG9ydCB7IFRvYXN0eVNlcnZpY2UsIFRvYXN0RGF0YSwgVG9hc3R5Q29uZmlnLCBUb2FzdHlFdmVudCwgVG9hc3R5RXZlbnRUeXBlIH0gZnJvbSAnLi90b2FzdHkuc2VydmljZSc7XG5cbi8qKlxuICogVG9hc3R5IGlzIGNvbnRhaW5lciBmb3IgVG9hc3QgY29tcG9uZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZzItdG9hc3R5JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGlkPVwidG9hc3R5XCIgW25nQ2xhc3NdPVwiW3Bvc2l0aW9uXVwiPlxuICAgICAgICA8bmcyLXRvYXN0ICpuZ0Zvcj1cImxldCB0b2FzdCBvZiB0b2FzdHNcIiBbdG9hc3RdPVwidG9hc3RcIiAoY2xpY2tUb2FzdCk9XCJjbGlja1RvYXN0KHRvYXN0KVwiIChjbG9zZVRvYXN0KT1cImNsb3NlVG9hc3QodG9hc3QpXCI+PC9uZzItdG9hc3Q+XG4gICAgPC9kaXY+YFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogU2V0IG9mIGNvbnN0YW50cyBkZWZpbnMgcG9zaXRpb24gb2YgVG9hc3R5IG9uIHRoZSBwYWdlLlxuICAgKi9cbiAgc3RhdGljIFBPU0lUSU9OUzogQXJyYXk8U3RyaW5nPiA9IFsnYm90dG9tLXJpZ2h0JywgJ2JvdHRvbS1sZWZ0JywgJ3RvcC1yaWdodCcsICd0b3AtbGVmdCcsICd0b3AtY2VudGVyJywgJ2JvdHRvbS1jZW50ZXInLCAnY2VudGVyLWNlbnRlciddO1xuXG4gIHByaXZhdGUgX3Bvc2l0aW9uOiBzdHJpbmcgPSAnJztcbiAgLy8gVGhlIHdpbmRvdyBwb3NpdGlvbiB3aGVyZSB0aGUgdG9hc3QgcG9wcyB1cC4gUG9zc2libGUgdmFsdWVzOlxuICAvLyAtIGJvdHRvbS1yaWdodCAoZGVmYXVsdCB2YWx1ZSBmcm9tIFRvYXN0Q29uZmlnKVxuICAvLyAtIGJvdHRvbS1sZWZ0XG4gIC8vIC0gdG9wLXJpZ2h0XG4gIC8vIC0gdG9wLWxlZnRcbiAgLy8gLSB0b3AtY2VudGVyXG4gIC8vIC0gYm90dG9tLWNlbnRlclxuICAvLyAtIGNlbnRlci1jZW50ZXJcbiAgQElucHV0KCkgc2V0IHBvc2l0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGxldCBub3RGb3VuZCA9IHRydWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRvYXN0eUNvbXBvbmVudC5QT1NJVElPTlMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKFRvYXN0eUNvbXBvbmVudC5QT1NJVElPTlNbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgbm90Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdEZvdW5kKSB7XG4gICAgICAgIC8vIFBvc2l0aW9uIHdhcyB3cm9uZyAtIGNsZWFyIGl0IGhlcmUgdG8gdXNlIHRoZSBvbmUgZnJvbSBjb25maWcuXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb25maWcucG9zaXRpb247XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5jb25maWcucG9zaXRpb247XG4gICAgfVxuICAgIHRoaXMuX3Bvc2l0aW9uID0gJ3RvYXN0eS1wb3NpdGlvbi0nICsgdmFsdWU7XG4gIH1cblxuICBnZXQgcG9zaXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICAvLyBUaGUgc3RvcmFnZSBmb3IgdG9hc3RzLlxuICB0b2FzdHM6IEFycmF5PFRvYXN0RGF0YT4gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogVG9hc3R5Q29uZmlnLCBwcml2YXRlIHRvYXN0eVNlcnZpY2U6IFRvYXN0eVNlcnZpY2UpIHtcbiAgICAvLyBJbml0aWFsaXNlIHBvc2l0aW9uXG4gICAgdGhpcy5wb3NpdGlvbiA9ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZ09uSW5pdGAgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBkaXJlY3RpdmUncyBkYXRhLWJvdW5kIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIHRoZVxuICAgKiBmaXJzdCB0aW1lLCBhbmQgYmVmb3JlIGFueSBvZiBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlXG4gICAqIGRpcmVjdGl2ZSBpcyBpbnN0YW50aWF0ZWQuXG4gICAqL1xuICBuZ09uSW5pdCgpOiBhbnkge1xuICAgIC8vIFdlIGxpc3RlbiBldmVudHMgZnJvbSBvdXIgc2VydmljZVxuICAgIHRoaXMudG9hc3R5U2VydmljZS5ldmVudHMuc3Vic2NyaWJlKChldmVudDogVG9hc3R5RXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50eXBlID09PSBUb2FzdHlFdmVudFR5cGUuQUREKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IG9uZVxuICAgICAgICBsZXQgdG9hc3Q6IFRvYXN0RGF0YSA9IGV2ZW50LnZhbHVlO1xuICAgICAgICB0aGlzLmFkZCh0b2FzdCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFRvYXN0eUV2ZW50VHlwZS5DTEVBUikge1xuICAgICAgICAvLyBDbGVhciB0aGUgb25lIGJ5IG51bWJlclxuICAgICAgICBsZXQgaWQ6IG51bWJlciA9IGV2ZW50LnZhbHVlO1xuICAgICAgICB0aGlzLmNsZWFyKGlkKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gVG9hc3R5RXZlbnRUeXBlLkNMRUFSX0FMTCkge1xuICAgICAgICAvLyBMZXRzIGNsZWFyIGFsbCB0b2FzdHNcbiAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxpc3RlbmVyIG9mICdjbGlja1RvYXN0JyBldmVudCBjb21lcyBmcm9tIFRvYXN0eUNvbXBvbmVudC5cbiAgICogVGhpcyBtZXRob2QgZXhlY3V0ZXMgY2xpY2sgb3B0aW9uIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRvYXN0LlxuICAgKi9cbiAgY2xpY2tUb2FzdCh0b2FzdDogVG9hc3REYXRhKSB7XG4gICAgaWYgKHRvYXN0Lm9uQ2xpY2sgJiYgaXNGdW5jdGlvbih0b2FzdC5vbkNsaWNrKSkge1xuICAgICAgdGhpcy5jbGVhcih0b2FzdC5pZCk7XG4gICAgICB0b2FzdC5vbkNsaWNrLmFwcGx5KHRoaXMsIHRvYXN0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgbGlzdGVuZXIgb2YgJ2Nsb3NlVG9hc3QnIGV2ZW50IGNvbWVzIGZyb20gVG9hc3R5Q29tcG9uZW50LlxuICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIFRvYXN0Q29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRvYXN0LlxuICAgKi9cbiAgY2xvc2VUb2FzdCh0b2FzdDogVG9hc3REYXRhKSB7XG4gICAgdGhpcy5jbGVhcih0b2FzdC5pZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG5ldyBUb2FzdFxuICAgKi9cbiAgYWRkKHRvYXN0OiBUb2FzdERhdGEpIHtcbiAgICAvLyBJZiB3ZSd2ZSBnb25lIG92ZXIgb3VyIGxpbWl0LCByZW1vdmUgdGhlIGVhcmxpZXN0XG4gICAgLy8gb25lIGZyb20gdGhlIGFycmF5XG4gICAgaWYgKHRoaXMudG9hc3RzLmxlbmd0aCA+PSB0aGlzLmNvbmZpZy5saW1pdCkge1xuICAgICAgdGhpcy50b2FzdHMuc2hpZnQoKTtcbiAgICB9XG4gICAgLy8gQWRkIHRvYXN0eSB0byBhcnJheVxuICAgIHRoaXMudG9hc3RzLnB1c2godG9hc3QpO1xuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUncyBhIHRpbWVvdXQgaW5kaXZpZHVhbGx5IG9yIGdsb2JhbGx5LFxuICAgIC8vIHNldCB0aGUgdG9hc3QgdG8gdGltZW91dFxuICAgIGlmICh0b2FzdC50aW1lb3V0KSB7XG4gICAgICB0aGlzLl9zZXRUaW1lb3V0KHRvYXN0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgaW5kaXZpZHVhbCB0b2FzdCBieSBpZFxuICAgKiBAcGFyYW0gaWQgaXMgdW5pcXVlIGlkZW50aWZpZXIgb2YgVG9hc3RcbiAgICovXG4gIGNsZWFyKGlkOiBudW1iZXIpIHtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMudG9hc3RzLmZvckVhY2goKHZhbHVlOiBhbnksIGtleTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS5pZCA9PT0gaWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUub25SZW1vdmUgJiYgaXNGdW5jdGlvbih2YWx1ZS5vblJlbW92ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlLm9uUmVtb3ZlLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRvYXN0cy5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgaWQgb2YgVG9hc3QgdG8gY2xvc2UnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIHRvYXN0c1xuICAgKi9cbiAgY2xlYXJBbGwoKSB7XG4gICAgdGhpcy50b2FzdHMuZm9yRWFjaCgodmFsdWU6IGFueSwga2V5OiBudW1iZXIpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5vblJlbW92ZSAmJiBpc0Z1bmN0aW9uKHZhbHVlLm9uUmVtb3ZlKSkge1xuICAgICAgICB2YWx1ZS5vblJlbW92ZS5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRvYXN0cyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzZXRUaW1lb3V0IGZ1bmN0aW9uIGZvciBzcGVjaWZpYyBzZXRUaW1lb3V0cyBvbiBpbmRpdmlkdWFsIHRvYXN0cy5cbiAgICovXG4gIHByaXZhdGUgX3NldFRpbWVvdXQodG9hc3Q6IFRvYXN0RGF0YSkge1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2xlYXIodG9hc3QuaWQpO1xuICAgIH0sIHRvYXN0LnRpbWVvdXQpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvdHNsaW50LWxvYWRlciEuL3NyYy90b2FzdHkuY29tcG9uZW50LnRzIiwiLy8gQ29weXJpZ2h0IChDKSAyMDE2IFNlcmdleSBBa29wa29raHlhbnRzXG4vLyBUaGlzIHByb2plY3QgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYWR1bGlzL25neC10b2FzdHlcblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVG9hc3REYXRhIH0gZnJvbSAnLi90b2FzdHkuc2VydmljZSc7XG5cbi8qKlxuICogQSBUb2FzdCBjb21wb25lbnQgc2hvd3MgbWVzc2FnZSB3aXRoIHRpdGxlIGFuZCBjbG9zZSBidXR0b24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nMi10b2FzdCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b2FzdFwiIFtuZ0NsYXNzXT1cIlt0b2FzdC50eXBlLCB0b2FzdC50aGVtZV1cIiAoY2xpY2spPVwiY2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRvYXN0LnNob3dDbG9zZVwiIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlKCRldmVudClcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0b2FzdC50aXRsZSB8fCB0b2FzdC5tc2dcIiBjbGFzcz1cInRvYXN0LXRleHRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRvYXN0LnRpdGxlXCIgY2xhc3M9XCJ0b2FzdC10aXRsZVwiIFtpbm5lckhUTUxdPVwidG9hc3QudGl0bGUgfCBzYWZlSHRtbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnIgKm5nSWY9XCJ0b2FzdC50aXRsZSAmJiB0b2FzdC5tc2dcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidG9hc3QubXNnXCIgY2xhc3M9XCJ0b2FzdC1tc2dcIiBbaW5uZXJIdG1sXT1cInRvYXN0Lm1zZyB8IHNhZmVIdG1sXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmBcbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpIHRvYXN0OiBUb2FzdERhdGE7XG4gIEBPdXRwdXQoJ2NsaWNrVG9hc3QnKSBjbGlja1RvYXN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoJ2Nsb3NlVG9hc3QnKSBjbG9zZVRvYXN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGhhbmRsZXIgaW52b2tlcyB3aGVuIHVzZXIgY2xpY2tzIG9uIHRvYXN0LlxuICAgKiBUaGlzIG1ldGhvZCBlbWl0IG5ldyBldmVudCBpbnRvIFRvYXN0eUNvbnRhaW5lciB0byBwcm9jZXNzIGNsaWNrIG9uIHRvYXN0LlxuICAgKi9cbiAgY2xpY2soJGV2ZW50OiBhbnkpIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNsaWNrVG9hc3RFdmVudC5uZXh0KHRoaXMudG9hc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGhhbmRsZXIgaW52b2tlcyB3aGVuIHVzZXIgY2xpY2tzIG9uIGNsb3NlIGJ1dHRvbi5cbiAgICogVGhpcyBtZXRob2QgZW1pdCBuZXcgZXZlbnQgaW50byBUb2FzdHlDb250YWluZXIgdG8gY2xvc2UgaXQuXG4gICAqL1xuICBjbG9zZSgkZXZlbnQ6IGFueSkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY2xvc2VUb2FzdEV2ZW50Lm5leHQodGhpcy50b2FzdCk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy90c2xpbnQtbG9hZGVyIS4vc3JjL3RvYXN0LmNvbXBvbmVudC50cyIsImltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgUGlwZVRyYW5zZm9ybSwgUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AUGlwZSh7IG5hbWU6ICdzYWZlSHRtbCd9KVxuZXhwb3J0IGNsYXNzIFNhZmVIdG1sUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0gIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRvbVNhbml0aXplZDogRG9tU2FuaXRpemVyKSB7fVxuXG4gICAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9tU2FuaXRpemVkLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHZhbHVlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL3RzbGludC1sb2FkZXIhLi9zcmMvc2hhcmVkLnRzIiwiLy8gQ29weXJpZ2h0IChDKSAyMDE2IFNlcmdleSBBa29wa29raHlhbnRzXG4vLyBUaGlzIHByb2plY3QgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYWR1bGlzL25neC10b2FzdHlcblxuaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0ICogZnJvbSAnLi9zcmMvdG9hc3R5LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvdG9hc3R5LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy90b2FzdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvc2hhcmVkJztcblxuaW1wb3J0IHsgVG9hc3R5Q29tcG9uZW50IH0gZnJvbSAnLi9zcmMvdG9hc3R5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2FzdENvbXBvbmVudCB9IGZyb20gJy4vc3JjL3RvYXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYWZlSHRtbFBpcGUgfSBmcm9tICcuL3NyYy9zaGFyZWQnO1xuaW1wb3J0IHsgVG9hc3R5U2VydmljZSwgVG9hc3R5Q29uZmlnLCB0b2FzdHlTZXJ2aWNlRmFjdG9yeSB9IGZyb20gJy4vc3JjL3RvYXN0eS5zZXJ2aWNlJztcblxuZXhwb3J0IGxldCBwcm92aWRlcnMgPSBbXG4gICAgVG9hc3R5Q29uZmlnLFxuICAgIHsgcHJvdmlkZTogVG9hc3R5U2VydmljZSwgdXNlRmFjdG9yeTogdG9hc3R5U2VydmljZUZhY3RvcnksIGRlcHM6IFtUb2FzdHlDb25maWddIH1cbl07XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgZGVjbGFyYXRpb25zOiBbVG9hc3RDb21wb25lbnQsIFRvYXN0eUNvbXBvbmVudCwgU2FmZUh0bWxQaXBlXSxcbiAgICBleHBvcnRzOiBbIFRvYXN0Q29tcG9uZW50LCBUb2FzdHlDb21wb25lbnRdLFxuICAgIHByb3ZpZGVyczogcHJvdmlkZXJzXG59KVxuZXhwb3J0IGNsYXNzIFRvYXN0eU1vZHVsZSB7XG4gICAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZ01vZHVsZTogVG9hc3R5TW9kdWxlLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBwcm92aWRlcnNcbiAgICAgICAgfTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvdHNsaW50LWxvYWRlciEuL2luZGV4LnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzdfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIkBhbmd1bGFyL2NvbW1vblwiXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV84X187XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyeGpzL1N1YmplY3RcIlxuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfOV9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=