com.phloxui
Version:
PhloxUI Ng2+ Framework
530 lines (529 loc) • 44.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { UISystemClock } from './UISystemClock.service';
/**
* <p style="text-indent: 2em;">
* A <code>ng</code> service class which is an implementation of [[INotificationManager]] service interface. For more information,
* please see [[INotificationManager]].
* </p>
*
* @author shiorin, tee4cute
* @see [[INotificationManager]]
*/
var NotificationManager = /** @class */ (function () {
function NotificationManager(uiSystemClock) {
this.notifications = [];
this.pinNotifications = [];
this.readNotifications = [];
this.uiSystemClock = uiSystemClock;
}
/**
* @param {?} notification
* @return {?}
*/
NotificationManager.prototype.isPinedNotification = /**
* @param {?} notification
* @return {?}
*/
function (notification) {
if (notification === null || typeof notification === 'undefined') {
return false;
}
return this.pinNotifications.indexOf(notification) >= 0;
};
/**
* @param {?} notification
* @return {?}
*/
NotificationManager.prototype.isReadNotification = /**
* @param {?} notification
* @return {?}
*/
function (notification) {
if (notification === null || typeof notification === 'undefined') {
return false;
}
return this.readNotifications.indexOf(notification) >= 0;
};
/**
* @param {?} notification
* @return {?}
*/
NotificationManager.prototype.notify = /**
* @param {?} notification
* @return {?}
*/
function (notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
this.notifications.push(notification);
};
/**
* @param {?} notification
* @return {?}
*/
NotificationManager.prototype.clear = /**
* @param {?} notification
* @return {?}
*/
function (notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
var /** @type {?} */ index = this.notifications.indexOf(notification);
if (index >= 0) {
this.notifications.splice(index, 1);
}
var /** @type {?} */ pinIndex = this.pinNotifications.indexOf(notification);
if (pinIndex >= 0) {
this.pinNotifications.splice(pinIndex, 1);
}
var /** @type {?} */ readIndex = this.readNotifications.indexOf(notification);
if (readIndex >= 0) {
this.readNotifications.splice(readIndex, 1);
}
};
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
NotificationManager.prototype.clearBy = /**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
function (notificationType, name) {
if ((notificationType === null || typeof notificationType === 'undefined') && (name === null || typeof name === 'undefined')) {
this.clearAll();
return;
}
var /** @type {?} */ cancelNotifyArray = [];
try {
for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) {
var notify = _b.value;
var /** @type {?} */ nameCheck = notify.name;
var /** @type {?} */ typeName = notify.type;
var /** @type {?} */ notifyPass = true;
var /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
cancelNotifyArray.push(notify);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
try {
// remove from Array
for (var cancelNotifyArray_1 = tslib_1.__values(cancelNotifyArray), cancelNotifyArray_1_1 = cancelNotifyArray_1.next(); !cancelNotifyArray_1_1.done; cancelNotifyArray_1_1 = cancelNotifyArray_1.next()) {
var notify = cancelNotifyArray_1_1.value;
this.clear(notify);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (cancelNotifyArray_1_1 && !cancelNotifyArray_1_1.done && (_d = cancelNotifyArray_1.return)) _d.call(cancelNotifyArray_1);
}
finally { if (e_2) throw e_2.error; }
}
var e_1, _c, e_2, _d;
};
/**
* @return {?}
*/
NotificationManager.prototype.clearAll = /**
* @return {?}
*/
function () {
var /** @type {?} */ cloneList = this.notifications.slice(0);
try {
for (var cloneList_1 = tslib_1.__values(cloneList), cloneList_1_1 = cloneList_1.next(); !cloneList_1_1.done; cloneList_1_1 = cloneList_1.next()) {
var notify = cloneList_1_1.value;
this.clear(notify);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (cloneList_1_1 && !cloneList_1_1.done && (_a = cloneList_1.return)) _a.call(cloneList_1);
}
finally { if (e_3) throw e_3.error; }
}
var e_3, _a;
};
/**
* @return {?}
*/
NotificationManager.prototype.getNotifications = /**
* @return {?}
*/
function () {
return this.notifications;
};
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
NotificationManager.prototype.getNotificationsBy = /**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
function (notificationType, name) {
var /** @type {?} */ result = [];
try {
for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) {
var notify = _b.value;
var /** @type {?} */ nameCheck = notify.name;
var /** @type {?} */ typeName = notify.type;
var /** @type {?} */ notifyPass = true;
var /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
result.push(notify);
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_4) throw e_4.error; }
}
return result;
var e_4, _c;
};
/**
* @return {?}
*/
NotificationManager.prototype.getShowingNotifications = /**
* @return {?}
*/
function () {
return this.getShowingNotificationsBy(null, null);
};
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
NotificationManager.prototype.getShowingNotificationsBy = /**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
function (notificationType, name) {
var /** @type {?} */ result = [];
try {
for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) {
var notify = _b.value;
var /** @type {?} */ nameCheck = notify.name;
var /** @type {?} */ typeName = notify.type;
var /** @type {?} */ isShow = notify.show;
var /** @type {?} */ notifyPass = true;
var /** @type {?} */ namePass = true;
var /** @type {?} */ timePass = false;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
var /** @type {?} */ createdTime = notify.createdTime;
var /** @type {?} */ timeOut = notify.timeout;
if (createdTime === null || typeof createdTime === 'undefined') {
continue;
}
if (timeOut === null || typeof timeOut !== 'number') {
timeOut = null;
}
var /** @type {?} */ finalTime = new Date(createdTime);
if (timeOut !== null) {
finalTime.addMilliseconds(timeOut);
}
var /** @type {?} */ curDate = this.uiSystemClock.getCurrentClockDateTime();
if (curDate !== null && finalTime.isAfter(curDate)) {
timePass = true;
}
if (notifyPass && namePass && isShow) {
if (timePass) {
result.push(notify);
}
else {
if (this.isPinedNotification(notify)) {
result.push(notify);
}
}
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_5) throw e_5.error; }
}
return result;
var e_5, _c;
};
/**
* @return {?}
*/
NotificationManager.prototype.getUnreadNotifications = /**
* @return {?}
*/
function () {
return this.getUnreadNotificationsBy(null, null);
};
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
NotificationManager.prototype.getUnreadNotificationsBy = /**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
function (notificationType, name) {
var /** @type {?} */ result = [];
try {
for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) {
var notify = _b.value;
var /** @type {?} */ nameCheck = notify.name;
var /** @type {?} */ typeName = notify.type;
var /** @type {?} */ notifyPass = true;
var /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
if (!this.isReadNotification(notify)) {
result.push(notify);
}
}
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_6) throw e_6.error; }
}
return result;
var e_6, _c;
};
/**
* @param {?} notification
* @return {?}
*/
NotificationManager.prototype.markAsRead = /**
* @param {?} notification
* @return {?}
*/
function (notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
var /** @type {?} */ isRead = this.isReadNotification(notification);
if (isRead) {
return;
}
this.readNotifications.push(notification);
};
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
NotificationManager.prototype.markAsReadBy = /**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
function (notificationType, name) {
if ((notificationType === null || typeof notificationType === 'undefined') && (name === null || typeof name === 'undefined')) {
this.markAsReadAll();
return;
}
var /** @type {?} */ readNotifyArray = [];
try {
for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) {
var notify = _b.value;
var /** @type {?} */ nameCheck = notify.name;
var /** @type {?} */ typeName = notify.type;
var /** @type {?} */ notifyPass = true;
var /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
readNotifyArray.push(notify);
}
}
}
catch (e_7_1) { e_7 = { error: e_7_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_7) throw e_7.error; }
}
try {
// set mark read from Array
for (var readNotifyArray_1 = tslib_1.__values(readNotifyArray), readNotifyArray_1_1 = readNotifyArray_1.next(); !readNotifyArray_1_1.done; readNotifyArray_1_1 = readNotifyArray_1.next()) {
var notify = readNotifyArray_1_1.value;
this.markAsRead(notify);
}
}
catch (e_8_1) { e_8 = { error: e_8_1 }; }
finally {
try {
if (readNotifyArray_1_1 && !readNotifyArray_1_1.done && (_d = readNotifyArray_1.return)) _d.call(readNotifyArray_1);
}
finally { if (e_8) throw e_8.error; }
}
var e_7, _c, e_8, _d;
};
/**
* @return {?}
*/
NotificationManager.prototype.markAsReadAll = /**
* @return {?}
*/
function () {
try {
for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) {
var notify = _b.value;
var /** @type {?} */ isRead = this.isReadNotification(notify);
if (!isRead) {
this.readNotifications.push(notify);
}
}
}
catch (e_9_1) { e_9 = { error: e_9_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_9) throw e_9.error; }
}
var e_9, _c;
};
/**
* @param {?} notification
* @return {?}
*/
NotificationManager.prototype.pinNotification = /**
* @param {?} notification
* @return {?}
*/
function (notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
var /** @type {?} */ isPined = this.isPinedNotification(notification);
if (isPined) {
return;
}
this.pinNotifications.push(notification);
};
/**
* @param {?} notification
* @return {?}
*/
NotificationManager.prototype.unpinNotification = /**
* @param {?} notification
* @return {?}
*/
function (notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
var /** @type {?} */ index = this.pinNotifications.indexOf(notification);
if (index >= 0) {
this.pinNotifications.splice(index, 1);
}
};
NotificationManager.decorators = [
{ type: Injectable },
];
/** @nocollapse */
NotificationManager.ctorParameters = function () { return [
{ type: UISystemClock, },
]; };
return NotificationManager;
}());
export { NotificationManager };
function NotificationManager_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
NotificationManager.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
NotificationManager.ctorParameters;
/** @type {?} */
NotificationManager.prototype.notifications;
/** @type {?} */
NotificationManager.prototype.pinNotifications;
/** @type {?} */
NotificationManager.prototype.readNotifications;
/** @type {?} */
NotificationManager.prototype.showDelayTimer;
/** @type {?} */
NotificationManager.prototype.uiSystemClock;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90aWZpY2F0aW9uTWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZS9Ob3RpZmljYXRpb25NYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7SUFvQnBELDZCQUFZLGFBQTRCO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztLQUN0Qzs7Ozs7SUFFTyxpREFBbUI7Ozs7Y0FBQyxZQUEwQjtRQUNsRCxFQUFFLENBQUEsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFBLENBQUM7WUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNoQjtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7O0lBR3BELGdEQUFrQjs7OztjQUFDLFlBQTBCO1FBQ2pELEVBQUUsQ0FBQSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUEsQ0FBQztZQUM3RCxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7Ozs7SUFHdEQsb0NBQU07Ozs7Y0FBQyxZQUEwQjtRQUNwQyxFQUFF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ZWEsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU5vdGlmaWNhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9zaGFyZS9JTm90aWZpY2F0aW9uTWFuYWdlcic7XG5pbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuLi9jb21wb25lbnQvbW9kZWwvTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFVJU3lzdGVtQ2xvY2sgfSBmcm9tICcuL1VJU3lzdGVtQ2xvY2suc2VydmljZSc7XG5cbi8qKlxuICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMmVtO1wiPlxuICogQSA8Y29kZT5uZzwvY29kZT4gc2VydmljZSBjbGFzcyB3aGljaCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV0gc2VydmljZSBpbnRlcmZhY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogcGxlYXNlIHNlZSBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV0uXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICogQHNlZSBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV1cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJTm90aWZpY2F0aW9uTWFuYWdlciB7XG5cbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbltdO1xuICAgIHByaXZhdGUgcGluTm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW107XG4gICAgcHJpdmF0ZSByZWFkTm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW107XG4gICAgcHJpdmF0ZSBzaG93RGVsYXlUaW1lcjogYW55O1xuICAgIHByaXZhdGUgdWlTeXN0ZW1DbG9jazogVUlTeXN0ZW1DbG9jaztcblxuICAgIGNvbnN0cnVjdG9yKHVpU3lzdGVtQ2xvY2s6IFVJU3lzdGVtQ2xvY2spIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gW107XG4gICAgICAgIHRoaXMucGluTm90aWZpY2F0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnJlYWROb3RpZmljYXRpb25zID0gW107XG4gICAgICAgIHRoaXMudWlTeXN0ZW1DbG9jayA9IHVpU3lzdGVtQ2xvY2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpbmVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGluTm90aWZpY2F0aW9ucy5pbmRleE9mKG5vdGlmaWNhdGlvbikgPj0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZihub3RpZmljYXRpb24gPT09IG51bGwgfHwgdHlwZW9mIG5vdGlmaWNhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWROb3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKSA+PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3RpZnkobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnB1c2gobm90aWZpY2F0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGluSW5kZXggPSB0aGlzLnBpbk5vdGlmaWNhdGlvbnMuaW5kZXhPZihub3RpZmljYXRpb24pO1xuXG4gICAgICAgIGlmIChwaW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBpbk5vdGlmaWNhdGlvbnMuc3BsaWNlKHBpbkluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWFkSW5kZXggPSB0aGlzLnJlYWROb3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcblxuICAgICAgICBpZiAocmVhZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMuc3BsaWNlKHJlYWRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJCeShub3RpZmljYXRpb25UeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoKG5vdGlmaWNhdGlvblR5cGUgPT09IG51bGwgfHwgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgPT09ICd1bmRlZmluZWQnKSAmJiAobmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuY2VsTm90aWZ5QXJyYXk6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uVHlwZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZU5hbWUgIT09IG5vdGlmaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lQ2hlY2sgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsTm90aWZ5QXJyYXkucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGZyb20gQXJyYXlcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIGNhbmNlbE5vdGlmeUFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKG5vdGlmeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGxldCBjbG9uZUxpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbnMuc2xpY2UoMCk7XG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiBjbG9uZUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIobm90aWZ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Tm90aWZpY2F0aW9uc0J5KG5vdGlmaWNhdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogTm90aWZpY2F0aW9uW10ge1xuICAgICAgICBsZXQgcmVzdWx0OiBOb3RpZmljYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBuYW1lQ2hlY2s6IHN0cmluZyA9IG5vdGlmeS5uYW1lO1xuICAgICAgICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBub3RpZnkudHlwZTtcblxuICAgICAgICAgICAgbGV0IG5vdGlmeVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5hbWVQYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvblR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9PSBub3RpZmljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmeVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZUNoZWNrICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm90aWZ5UGFzcyAmJiBuYW1lUGFzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaG93aW5nTm90aWZpY2F0aW9ucygpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNob3dpbmdOb3RpZmljYXRpb25zQnkobnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNob3dpbmdOb3RpZmljYXRpb25zQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIGxldCByZXN1bHQ6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuICAgICAgICAgICAgbGV0IGlzU2hvdzogYm9vbGVhbiA9IG5vdGlmeS5zaG93O1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHRpbWVQYXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25UeXBlICE9PSBudWxsICYmIHR5cGVvZiBub3RpZmljYXRpb25UeXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlTmFtZSAhPT0gbm90aWZpY2F0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBub3RpZnlQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVDaGVjayAhPT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBuYW1lUGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNyZWF0ZWRUaW1lOiBEYXRlID0gbm90aWZ5LmNyZWF0ZWRUaW1lO1xuICAgICAgICAgICAgbGV0IHRpbWVPdXQ6IG51bWJlciA9IG5vdGlmeS50aW1lb3V0O1xuICAgICAgICAgICAgaWYgKGNyZWF0ZWRUaW1lID09PSBudWxsIHx8IHR5cGVvZiBjcmVhdGVkVGltZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aW1lT3V0ID09PSBudWxsIHx8IHR5cGVvZiB0aW1lT3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRpbWVPdXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmluYWxUaW1lID0gbmV3IERhdGUoY3JlYXRlZFRpbWUpO1xuICAgICAgICAgICAgaWYgKHRpbWVPdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaW5hbFRpbWUuYWRkTWlsbGlzZWNvbmRzKHRpbWVPdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY3VyRGF0ZTogRGF0ZSA9IHRoaXMudWlTeXN0ZW1DbG9jay5nZXRDdXJyZW50Q2xvY2tEYXRlVGltZSgpO1xuICAgICAgICAgICAgaWYgKGN1ckRhdGUgIT09IG51bGwgJiYgZmluYWxUaW1lLmlzQWZ0ZXIoY3VyRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lUGFzcyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzICYmIGlzU2hvdykge1xuICAgICAgICAgICAgICAgIGlmICh0aW1lUGFzcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaXNQaW5lZE5vdGlmaWNhdGlvbihub3RpZnkpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VW5yZWFkTm90aWZpY2F0aW9uc0J5KG51bGwsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIGxldCByZXN1bHQ6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uVHlwZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZU5hbWUgIT09IG5vdGlmaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lQ2hlY2sgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVhZE5vdGlmaWNhdGlvbihub3RpZnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya0FzUmVhZChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNSZWFkID0gdGhpcy5pc1JlYWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYoaXNSZWFkKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXJrQXNSZWFkQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKChub3RpZmljYXRpb25UeXBlID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb25UeXBlID09PSAndW5kZWZpbmVkJykgJiYgKG5hbWUgPT09IG51bGwgfHwgdHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNSZWFkQWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVhZE5vdGlmeUFycmF5OiBOb3RpZmljYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBuYW1lQ2hlY2s6IHN0cmluZyA9IG5vdGlmeS5uYW1lO1xuICAgICAgICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBub3RpZnkudHlwZTtcblxuICAgICAgICAgICAgbGV0IG5vdGlmeVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5hbWVQYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvblR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9PSBub3RpZmljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmeVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZUNoZWNrICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm90aWZ5UGFzcyAmJiBuYW1lUGFzcykge1xuICAgICAgICAgICAgICAgIHJlYWROb3RpZnlBcnJheS5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgbWFyayByZWFkIGZyb20gQXJyYXlcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHJlYWROb3RpZnlBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNSZWFkKG5vdGlmeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya0FzUmVhZEFsbCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IGlzUmVhZCA9IHRoaXMuaXNSZWFkTm90aWZpY2F0aW9uKG5vdGlmeSk7XG4gICAgICAgICAgICBpZiAoIWlzUmVhZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBpbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzUGluZWQ6IGJvb2xlYW4gPSB0aGlzLmlzUGluZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYoaXNQaW5lZCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBpbk5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bnBpbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5waW5Ob3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMucGluTm90aWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19