@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
234 lines • 23.5 kB
JavaScript
import { BehaviorSubject } from 'rxjs';
import { Injectable } from '@angular/core';
import { StateService } from '../common/state-service.abstract';
import { gettext } from '../i18n/gettext';
import { isEqual } from 'lodash-es';
import * as i0 from "@angular/core";
/**
* A service which allows to display alerts.
*/
export class AlertService extends StateService {
constructor() {
super(...arguments);
/**
* @ignore
*/
this.state$ = new BehaviorSubject([]);
this.MAX_ALERTS = 3;
this.ALERT_TIMEOUT = 3000;
}
/**
* Returns all alerts.
* @readonly
*/
get state() {
return this.state$.value;
}
/**
* Adds a new alert to the current state.
*/
add(alert) {
this.addAlert(alert);
}
/**
* Adds a alert by text.
*/
addByText(type, txt, detailedData) {
this.addAlert({ text: txt, type, detailedData });
}
/**
* Returns all alerts.
* @deprecated Use alertService.alerts instead.
*/
list() {
return this.state;
}
/**
* Remove an alert from the current state.
*/
remove(alert) {
this.changeAlerts(this.state.filter(item => !this.areSame(alert, item)));
}
/**
* Updates matching alert with provided values.
*/
update(alert, fieldsToUpdate) {
this.changeAlerts(this.state.map(item => {
if (this.areSame(alert, item)) {
Object.assign(item, fieldsToUpdate);
}
return item;
}));
}
/**
* Removes last danger alert.
* It can be used e.g. in the case of a failed request which triggered an alert, to hide it from user.
*
* ```js
* try {
* // something that might throw a danger server msg
* } catch (ex) {
* this.alertService.removeLastDanger();
* }
* ```
*/
removeLastDanger() {
const firstDangerAlert = this.state.reverse().find(({ type }) => type === 'danger');
this.changeAlerts(this.state.filter(alert => alert !== firstDangerAlert));
}
/**
* Shorthand for a save successful alert.
* @param savedObject The object which was saved.
* @return A function that can be executed to show the msg.
*/
saveSuccess(savedObject) {
return () => {
const text = `${savedObject} saved successfully`;
this.addByText('success', text);
};
}
/**
* Shorthand for a create successful alert.
* @param createdObject The object which was created.
* @return A function that can be executed to show the msg.
*/
createSuccess(createdObject) {
return () => {
const text = `${createdObject} created successfully`;
this.addByText('success', text);
};
}
/**
* Clears all alerts.
*/
clearAll() {
this.changeAlerts([]);
}
/**
* A shorthand to display a simple success message.
* @param text The success text.
* @param detailedData The text with additional information.
*/
success(text, detailedData) {
this.addByText('success', text, detailedData);
}
/**
* A shorthand to display a simple danger message.
* @param text The danger text.
* @param detailedData The text with additional information.
*/
danger(text, detailedData) {
this.addByText('danger', text, detailedData);
}
/**
* A shorthand to display a simple info message.
* @param text The info text.
* @param detailedData The text with additional information.
*/
info(text, detailedData) {
this.addByText('info', text, detailedData);
}
/**
* A shorthand to display a simple warning message.
* @param text The warning text.
* @param detailedData The text with additional information.
*/
warning(text, detailedData) {
this.addByText('warning', text, detailedData);
}
/**
* A shorthand to display a simple system message.
* @param text The system message text.
* @param detailedData The text with additional information.
*/
system(text, detailedData) {
this.addByText('system', text, detailedData);
}
/**
* Creates alert from standard api errors.
* Should be used for errors generated by @c8y/client services.
* @param {IResult} error The error from server.
* @param {alertType} type The type of alert.
*/
addServerFailure(error, type = 'danger') {
const { data, res } = error;
let text = data?.message || null;
let detailedData;
if (data) {
if (typeof data === 'object') {
detailedData = data.exceptionMessage;
}
else if (typeof data === 'string') {
detailedData = data;
}
}
const hasRelevantMessage = !!(text || detailedData);
if (!text) {
text = gettext('A server error occurred.');
}
if (res && !hasRelevantMessage) {
detailedData = {
status: res.status,
statusText: res.statusText,
url: res.url
};
}
this.addAlert({
type,
text,
detailedData
});
}
/**
* Compares two alert objects. Alerts are same if text, type, detailed data and callbacks are same.
* Callbacks are same if they refer to the same function.
*/
areSame(alert1, alert2) {
return (alert1.text === alert2.text &&
alert1.type === alert2.type &&
isEqual(alert1.detailedData, alert2.detailedData) &&
alert1.onClose === alert2.onClose &&
alert1.onDetail === alert2.onDetail);
}
changeAlerts(newAlerts) {
this.state$.next(newAlerts);
}
addAlert(alert) {
if (!alert.text && !alert.type) {
throw new Error('Cannot add empty alert');
}
const alertAlreadyAdded = this.state.find(item => this.areSame(alert, item));
if (alertAlreadyAdded) {
return;
}
this.changeAlerts([...this.state, alert]);
this.hideAutomaticallyIfNeeded(alert);
this.removeOldestIfMax();
}
hideAutomaticallyIfNeeded(alert) {
const isSuccess = alert.type === 'success';
const noDetails = !alert.detailedData;
let alertTimeout = isSuccess && noDetails ? this.ALERT_TIMEOUT : 0;
if (typeof alert.timeout !== 'undefined') {
alertTimeout = alert.timeout;
}
if (alertTimeout) {
setTimeout(() => this.remove(alert), alertTimeout);
}
}
removeOldestIfMax() {
if (this.state.length > this.MAX_ALERTS) {
const [, ...firstRemoved] = this.state;
this.changeAlerts(firstRemoved);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlertService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlertService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlertService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvYWxlcnQvYWxlcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUdwQzs7R0FFRztBQUlILE1BQU0sT0FBTyxZQUFhLFNBQVEsWUFBWTtJQUg5Qzs7UUFXRTs7V0FFRztRQUNILFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBVSxFQUFFLENBQUMsQ0FBQztRQUVsQyxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysa0JBQWEsR0FBRyxJQUFJLENBQUM7S0FnTzlCO0lBN09DOzs7T0FHRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQVNEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLEtBQVk7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxJQUFlLEVBQUUsR0FBVyxFQUFFLFlBQXFCO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxL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QUFFLENBQUM7WUFDekMsWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7K0dBN09VLFlBQVk7bUhBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxlcnQgfSBmcm9tICcuL2FsZXJ0Lm1vZGVsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3N0YXRlLXNlcnZpY2UuYWJzdHJhY3QnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuZXhwb3J0IHR5cGUgQWxlcnRUeXBlID0gJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcicgfCAnaW5mbycgfCAnc3lzdGVtJztcbi8qKlxuICogQSBzZXJ2aWNlIHdoaWNoIGFsbG93cyB0byBkaXNwbGF5IGFsZXJ0cy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnRTZXJ2aWNlIGV4dGVuZHMgU3RhdGVTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGFsZXJ0cy5cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUkLnZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFsZXJ0W10+KFtdKTtcblxuICBwcml2YXRlIE1BWF9BTEVSVFMgPSAzO1xuICBwcml2YXRlIEFMRVJUX1RJTUVPVVQgPSAzMDAwO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGFsZXJ0IHRvIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgYWRkKGFsZXJ0OiBBbGVydCkge1xuICAgIHRoaXMuYWRkQWxlcnQoYWxlcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBhbGVydCBieSB0ZXh0LlxuICAgKi9cbiAgYWRkQnlUZXh0KHR5cGU6IEFsZXJ0VHlwZSwgdHh0OiBzdHJpbmcsIGRldGFpbGVkRGF0YT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWRkQWxlcnQoeyB0ZXh0OiB0eHQsIHR5cGUsIGRldGFpbGVkRGF0YSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBhbGVydHMuXG4gICAqIEBkZXByZWNhdGVkIFVzZSBhbGVydFNlcnZpY2UuYWxlcnRzIGluc3RlYWQuXG4gICAqL1xuICBsaXN0KCk6IEFsZXJ0W10ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhbGVydCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgcmVtb3ZlKGFsZXJ0OiBBbGVydCkge1xuICAgIHRoaXMuY2hhbmdlQWxlcnRzKHRoaXMuc3RhdGUuZmlsdGVyKGl0ZW0gPT4gIXRoaXMuYXJlU2FtZShhbGVydCwgaXRlbSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIG1hdGNoaW5nIGFsZXJ0IHdpdGggcHJvdmlkZWQgdmFsdWVzLlxuICAgKi9cbiAgdXBkYXRlKGFsZXJ0OiBBbGVydCwgZmllbGRzVG9VcGRhdGU6IFBhcnRpYWw8QWxlcnQ+KSB7XG4gICAgdGhpcy5jaGFuZ2VBbGVydHMoXG4gICAgICB0aGlzLnN0YXRlLm1hcChpdGVtID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXJlU2FtZShhbGVydCwgaXRlbSkpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIGZpZWxkc1RvVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGxhc3QgZGFuZ2VyIGFsZXJ0LlxuICAgKiBJdCBjYW4gYmUgdXNlZCBlLmcuIGluIHRoZSBjYXNlIG9mIGEgZmFpbGVkIHJlcXVlc3Qgd2hpY2ggdHJpZ2dlcmVkIGFuIGFsZXJ0LCB0byBoaWRlIGl0IGZyb20gdXNlci5cbiAgICpcbiAgICogYGBganNcbiAgICogIHRyeSB7XG4gICAqICAgIC8vIHNvbWV0aGluZyB0aGF0IG1pZ2h0IHRocm93IGEgZGFuZ2VyIHNlcnZlciBtc2dcbiAgICogIH0gY2F0Y2ggKGV4KSB7XG4gICAqICAgdGhpcy5hbGVydFNlcnZpY2UucmVtb3ZlTGFzdERhbmdlcigpO1xuICAgKiAgfVxuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUxhc3REYW5nZXIoKSB7XG4gICAgY29uc3QgZmlyc3REYW5nZXJBbGVydCA9IHRoaXMuc3RhdGUucmV2ZXJzZSgpLmZpbmQoKHsgdHlwZSB9KSA9PiB0eXBlID09PSAnZGFuZ2VyJyk7XG4gICAgdGhpcy5jaGFuZ2VBbGVydHModGhpcy5zdGF0ZS5maWx0ZXIoYWxlcnQgPT4gYWxlcnQgIT09IGZpcnN0RGFuZ2VyQWxlcnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG9ydGhhbmQgZm9yIGEgc2F2ZSBzdWNjZXNzZnVsIGFsZXJ0LlxuICAgKiBAcGFyYW0gc2F2ZWRPYmplY3QgVGhlIG9iamVjdCB3aGljaCB3YXMgc2F2ZWQuXG4gICAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBleGVjdXRlZCB0byBzaG93IHRoZSBtc2cuXG4gICAqL1xuICBzYXZlU3VjY2VzcyhzYXZlZE9iamVjdDogc3RyaW5nKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBgJHtzYXZlZE9iamVjdH0gc2F2ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgIHRoaXMuYWRkQnlUZXh0KCdzdWNjZXNzJywgdGV4dCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG9ydGhhbmQgZm9yIGEgY3JlYXRlIHN1Y2Nlc3NmdWwgYWxlcnQuXG4gICAqIEBwYXJhbSBjcmVhdGVkT2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggd2FzIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBleGVjdXRlZCB0byBzaG93IHRoZSBtc2cuXG4gICAqL1xuICBjcmVhdGVTdWNjZXNzKGNyZWF0ZWRPYmplY3QpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IGAke2NyZWF0ZWRPYmplY3R9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgIHRoaXMuYWRkQnlUZXh0KCdzdWNjZXNzJywgdGV4dCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIGFsZXJ0cy5cbiAgICovXG4gIGNsZWFyQWxsKCkge1xuICAgIHRoaXMuY2hhbmdlQWxlcnRzKFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNob3J0aGFuZCB0byBkaXNwbGF5IGEgc2ltcGxlIHN1Y2Nlc3MgbWVzc2FnZS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHN1Y2Nlc3MgdGV4dC5cbiAgICogQHBhcmFtIGRldGFpbGVkRGF0YSBUaGUgdGV4dCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAqL1xuICBzdWNjZXNzKHRleHQ6IHN0cmluZywgZGV0YWlsZWREYXRhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGRCeVRleHQoJ3N1Y2Nlc3MnLCB0ZXh0LCBkZXRhaWxlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2hvcnRoYW5kIHRvIGRpc3BsYXkgYSBzaW1wbGUgZGFuZ2VyIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSBkYW5nZXIgdGV4dC5cbiAgICogQHBhcmFtIGRldGFpbGVkRGF0YSBUaGUgdGV4dCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAqL1xuICBkYW5nZXIodGV4dDogc3RyaW5nLCBkZXRhaWxlZERhdGE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFkZEJ5VGV4dCgnZGFuZ2VyJywgdGV4dCwgZGV0YWlsZWREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNob3J0aGFuZCB0byBkaXNwbGF5IGEgc2ltcGxlIGluZm8gbWVzc2FnZS5cbiAgICogQHBhcmFtIHRleHQgVGhlIGluZm8gdGV4dC5cbiAgICogQHBhcmFtIGRldGFpbGVkRGF0YSBUaGUgdGV4dCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAqL1xuICBpbmZvKHRleHQ6IHN0cmluZywgZGV0YWlsZWREYXRhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGRCeVRleHQoJ2luZm8nLCB0ZXh0LCBkZXRhaWxlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2hvcnRoYW5kIHRvIGRpc3BsYXkgYSBzaW1wbGUgd2FybmluZyBtZXNzYWdlLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgd2FybmluZyB0ZXh0LlxuICAgKiBAcGFyYW0gZGV0YWlsZWREYXRhIFRoZSB0ZXh0IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHdhcm5pbmcodGV4dDogc3RyaW5nLCBkZXRhaWxlZERhdGE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFkZEJ5VGV4dCgnd2FybmluZycsIHRleHQsIGRldGFpbGVkRGF0YSk7XG4gIH1cbiAgLyoqXG4gICAqIEEgc2hvcnRoYW5kIHRvIGRpc3BsYXkgYSBzaW1wbGUgc3lzdGVtIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSBzeXN0ZW0gbWVzc2FnZSB0ZXh0LlxuICAgKiBAcGFyYW0gZGV0YWlsZWREYXRhIFRoZSB0ZXh0IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHN5c3RlbSh0ZXh0OiBzdHJpbmcsIGRldGFpbGVkRGF0YT86IHN0cmluZykge1xuICAgIHRoaXMuYWRkQnlUZXh0KCdzeXN0ZW0nLCB0ZXh0LCBkZXRhaWxlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYWxlcnQgZnJvbSBzdGFuZGFyZCBhcGkgZXJyb3JzLlxuICAgKiBTaG91bGQgYmUgdXNlZCBmb3IgZXJyb3JzIGdlbmVyYXRlZCBieSBAYzh5L2NsaWVudCBzZXJ2aWNlcy5cbiAgICogQHBhcmFtIHtJUmVzdWx0fSAgZXJyb3IgVGhlIGVycm9yIGZyb20gc2VydmVyLlxuICAgKiBAcGFyYW0ge2FsZXJ0VHlwZX0gdHlwZSBUaGUgdHlwZSBvZiBhbGVydC5cbiAgICovXG4gIGFkZFNlcnZlckZhaWx1cmUoZXJyb3I6IGFueSwgdHlwZTogQWxlcnRUeXBlID0gJ2RhbmdlcicpIHtcbiAgICBjb25zdCB7IGRhdGEsIHJlcyB9ID0gZXJyb3I7XG4gICAgbGV0IHRleHQgPSBkYXRhPy5tZXNzYWdlIHx8IG51bGw7XG4gICAgbGV0IGRldGFpbGVkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBkZXRhaWxlZERhdGEgPSBkYXRhLmV4Y2VwdGlvbk1lc3NhZ2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZXRhaWxlZERhdGEgPSBkYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoYXNSZWxldmFudE1lc3NhZ2UgPSAhISh0ZXh0IHx8IGRldGFpbGVkRGF0YSk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0ZXh0ID0gZ2V0dGV4dCgnQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuJyk7XG4gICAgfVxuICAgIGlmIChyZXMgJiYgIWhhc1JlbGV2YW50TWVzc2FnZSkge1xuICAgICAgZGV0YWlsZWREYXRhID0ge1xuICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcy5zdGF0dXNUZXh0LFxuICAgICAgICB1cmw6IHJlcy51cmxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5hZGRBbGVydCh7XG4gICAgICB0eXBlLFxuICAgICAgdGV4dCxcbiAgICAgIGRldGFpbGVkRGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIHR3byBhbGVydCBvYmplY3RzLiBBbGVydHMgYXJlIHNhbWUgaWYgdGV4dCwgdHlwZSwgZGV0YWlsZWQgZGF0YSBhbmQgY2FsbGJhY2tzIGFyZSBzYW1lLlxuICAgKiBDYWxsYmFja3MgYXJlIHNhbWUgaWYgdGhleSByZWZlciB0byB0aGUgc2FtZSBmdW5jdGlvbi5cbiAgICovXG4gIGFyZVNhbWUoYWxlcnQxOiBBbGVydCwgYWxlcnQyOiBBbGVydCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhbGVydDEudGV4dCA9PT0gYWxlcnQyLnRleHQgJiZcbiAgICAgIGFsZXJ0MS50eXBlID09PSBhbGVydDIudHlwZSAmJlxuICAgICAgaXNFcXVhbChhbGVydDEuZGV0YWlsZWREYXRhLCBhbGVydDIuZGV0YWlsZWREYXRhKSAmJlxuICAgICAgYWxlcnQxLm9uQ2xvc2UgPT09IGFsZXJ0Mi5vbkNsb3NlICYmXG4gICAgICBhbGVydDEub25EZXRhaWwgPT09IGFsZXJ0Mi5vbkRldGFpbFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZUFsZXJ0cyhuZXdBbGVydHM6IEFsZXJ0W10pIHtcbiAgICB0aGlzLnN0YXRlJC5uZXh0KG5ld0FsZXJ0cyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEFsZXJ0KGFsZXJ0OiBBbGVydCk6IHZvaWQge1xuICAgIGlmICghYWxlcnQudGV4dCAmJiAhYWxlcnQudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGVtcHR5IGFsZXJ0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxlcnRBbHJlYWR5QWRkZWQgPSB0aGlzLnN0YXRlLmZpbmQoaXRlbSA9PiB0aGlzLmFyZVNhbWUoYWxlcnQsIGl0ZW0pKTtcbiAgICBpZiAoYWxlcnRBbHJlYWR5QWRkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZUFsZXJ0cyhbLi4udGhpcy5zdGF0ZSwgYWxlcnRdKTtcbiAgICB0aGlzLmhpZGVBdXRvbWF0aWNhbGx5SWZOZWVkZWQoYWxlcnQpO1xuICAgIHRoaXMucmVtb3ZlT2xkZXN0SWZNYXgoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUF1dG9tYXRpY2FsbHlJZk5lZWRlZChhbGVydDogQWxlcnQpIHtcbiAgICBjb25zdCBpc1N1Y2Nlc3MgPSBhbGVydC50eXBlID09PSAnc3VjY2Vzcyc7XG4gICAgY29uc3Qgbm9EZXRhaWxzID0gIWFsZXJ0LmRldGFpbGVkRGF0YTtcbiAgICBsZXQgYWxlcnRUaW1lb3V0ID0gaXNTdWNjZXNzICYmIG5vRGV0YWlscyA/IHRoaXMuQUxFUlRfVElNRU9VVCA6IDA7XG4gICAgaWYgKHR5cGVvZiBhbGVydC50aW1lb3V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgYWxlcnRUaW1lb3V0ID0gYWxlcnQudGltZW91dDtcbiAgICB9XG4gICAgaWYgKGFsZXJ0VGltZW91dCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbW92ZShhbGVydCksIGFsZXJ0VGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVPbGRlc3RJZk1heCgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5sZW5ndGggPiB0aGlzLk1BWF9BTEVSVFMpIHtcbiAgICAgIGNvbnN0IFssIC4uLmZpcnN0UmVtb3ZlZF0gPSB0aGlzLnN0YXRlO1xuICAgICAgdGhpcy5jaGFuZ2VBbGVydHMoZmlyc3RSZW1vdmVkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==