gentics-ui-core
Version:
This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.
155 lines • 19.5 kB
JavaScript
import { Injectable, EventEmitter, ComponentFactoryResolver } from '@angular/core';
import { Toast } from './toast.component';
import { OverlayHostService } from '../overlay-host/overlay-host.service';
import * as i0 from "@angular/core";
import * as i1 from "../overlay-host/overlay-host.service";
const defaultOptions = {
message: '',
type: 'default',
delay: 3000,
dismissOnClick: true
};
/**
* A toast notification service. Depends on the [`<gtx-overlay-host>`](#/overlay-host) being present in the app.
*
* ```typescript
* let dismiss = this.notification.show({
* message: 'Content Saved',
* type: 'success',
* delay: 3000
* });
*
* // to manually dismiss the toast
* dismiss();
* ```
*
* ## `INotificationOptions`
*
* The `show()` method takes an `INotificationOptions` object as its argument:
*
* | Property | Type | Default | Description |
* | -------- | ------------------------------ | ------- | ----------- |
* | **message** | `string` | '' | The message to display |
* | **type** | `'default'`,`'error'`,`'success'`,`'warning'` | 'default' | The style of toast |
* | **delay** | `number` | 3000 | ms before toast is dismissed. 0 == no dismiss |
* | **dismissOnClick** | `boolean` | true | If true, the toast can be dismissed by click or swipe|
* | **action.label** | `string` | | Optional action label |
* | **action.onClick** | `Function` | | Callback if action label is clicked |
*
*/
export class Notification {
constructor(componentFactoryResolver, overlayHostService) {
this.componentFactoryResolver = componentFactoryResolver;
this.open$ = new EventEmitter();
this.openToasts = [];
/*
* Spacing between stacked toasts
*/
this.verticalMargin = 10;
overlayHostService.getHostView().then(view => {
this.hostViewContainer = view;
});
}
/**
* Show a toast notification. Returns an object with a dismiss() method, which will
* dismiss the toast when invoked.
*/
show(options) {
let mergedOptions = Object.assign({}, defaultOptions, options);
let toast = this.createToast(mergedOptions);
return {
dismiss: () => toast.dismissFn()
};
}
/**
* Used internally by the [OverlayHost](#/overlay-host) to clean up.
*/
destroyAllToasts() {
this.openToasts.forEach((o) => {
if (typeof o.toast.dismissFn === 'function') {
o.toast.dismissFn();
}
});
this.openToasts = [];
}
/**
* Dispose of the Toast component and remove its reference from the
* openToasts array.
*/
destroyToast(componentRef) {
let toast = componentRef.instance;
let index = this.getToastIndex(toast);
if (-1 < index) {
let timer = this.openToasts[index].dismissTimer;
if (timer) {
clearTimeout(timer);
}
this.openToasts.splice(index, 1);
}
toast.startDismiss();
setTimeout(() => {
componentRef.destroy();
this.positionOpenToasts();
}, 200);
}
/**
* Dynamically create and load a new Toast component next to the
* NotificationHost component in the DOM.
*/
createToast(options) {
let toastFactory = this.componentFactoryResolver.resolveComponentFactory(Toast);
let ref = this.hostViewContainer.createComponent(toastFactory);
let toast = ref.instance;
let dismissTimer;
toast.message = options.message;
toast.type = options.type;
toast.dismissOnClick = options.dismissOnClick;
toast.dismissFn = () => this.destroyToast(ref);
if (options.action && options.action.label) {
toast.actionLabel = options.action.label;
}
if (options.action && options.action.onClick) {
toast.actionOnClick = options.action.onClick;
}
if (0 < options.delay) {
dismissTimer = setTimeout(() => toast.dismissFn(), options.delay);
}
this.openToasts.unshift({
toast,
dismissTimer
});
this.positionOpenToasts();
return toast;
}
positionOpenToasts() {
setTimeout(() => {
this.openToasts.forEach((o) => {
o.toast.position.top = this.getToastTop(o.toast);
});
});
}
/**
* Calculates the value of the "top" offset for this toast by adding up
* the heights of the other toasts which are open above this one.
*/
getToastTop(toast) {
let index = this.getToastIndex(toast);
return this.openToasts
.filter((o, i) => i < index)
.reduce((top, o) => {
return top += o.toast.getHeight() + this.verticalMargin;
}, 0);
}
/**
* Returns the index of the toast object in the openToasts array.
*/
getToastIndex(toast) {
return this.openToasts.map((o) => o.toast).indexOf(toast);
}
}
/** @nocollapse */ Notification.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Notification, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.OverlayHostService }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ Notification.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Notification });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Notification, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.OverlayHostService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFVBQVUsRUFDVixZQUFZLEVBQ1osd0JBQXdCLEVBRTNCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQzs7O0FBaUJ4RSxNQUFNLGNBQWMsR0FBeUI7SUFDekMsT0FBTyxFQUFFLEVBQUU7SUFDWCxJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxJQUFJO0lBQ1gsY0FBYyxFQUFFLElBQUk7Q0FDdkIsQ0FBQztBQU9GOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQVVyQixZQUFvQix3QkFBa0QsRUFDMUQsa0JBQXNDO1FBRDlCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFSdEUsVUFBSyxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBRXpDLGVBQVUsR0FBaUIsRUFBRSxDQUFDO1FBQ3RDOztXQUVHO1FBQ0ssbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFJaEMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLE9BQTZCO1FBQ3JDLElBQUksYUFBYSxHQUF5QixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckYs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ICAgSW5qZWN0YWJsZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RvYXN0LCBUb2FzdFR5cGV9IGZyb20gJy4vdG9hc3QuY29tcG9uZW50JztcbmltcG9ydCB7T3ZlcmxheUhvc3RTZXJ2aWNlfSBmcm9tICcuLi9vdmVybGF5LWhvc3Qvb3ZlcmxheS1ob3N0LnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElOb3RpZmljYXRpb25PcHRpb25zIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgdHlwZT86IFRvYXN0VHlwZXxzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5vdGlmaWNhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzbWlzc2VkIGFmdGVyIHRoaXMgZGVsYXkuXG4gICAgICogVG8gdHVybiBvZmYgYXV0by1kaXNtaXNzYWwsIHNldCB0aGlzIHRvIDAuXG4gICAgICovXG4gICAgZGVsYXk/OiBudW1iZXI7XG4gICAgZGlzbWlzc09uQ2xpY2s/OiBib29sZWFuO1xuICAgIGFjdGlvbj86IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgb25DbGljaz86IEZ1bmN0aW9uO1xuICAgIH07XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBJTm90aWZpY2F0aW9uT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgZGVsYXk6IDMwMDAsXG4gICAgZGlzbWlzc09uQ2xpY2s6IHRydWVcbn07XG5cbmludGVyZmFjZSBJT3BlblRvYXN0IHtcbiAgICB0b2FzdDogVG9hc3Q7XG4gICAgZGlzbWlzc1RpbWVyOiBhbnk7XG59XG5cbi8qKlxuICogQSB0b2FzdCBub3RpZmljYXRpb24gc2VydmljZS4gRGVwZW5kcyBvbiB0aGUgW2A8Z3R4LW92ZXJsYXktaG9zdD5gXSgjL292ZXJsYXktaG9zdCkgYmVpbmcgcHJlc2VudCBpbiB0aGUgYXBwLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGxldCBkaXNtaXNzID0gdGhpcy5ub3RpZmljYXRpb24uc2hvdyh7XG4gKiAgICAgbWVzc2FnZTogJ0NvbnRlbnQgU2F2ZWQnLFxuICogICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAqICAgICBkZWxheTogMzAwMFxuICogfSk7XG4gKlxuICogLy8gdG8gbWFudWFsbHkgZGlzbWlzcyB0aGUgdG9hc3RcbiAqIGRpc21pc3MoKTtcbiAqIGBgYFxuICpcbiAqICMjIGBJTm90aWZpY2F0aW9uT3B0aW9uc2BcbiAqXG4gKiBUaGUgYHNob3coKWAgbWV0aG9kIHRha2VzIGFuIGBJTm90aWZpY2F0aW9uT3B0aW9uc2Agb2JqZWN0IGFzIGl0cyBhcmd1bWVudDpcbiAqXG4gKiB8IFByb3BlcnR5ICAgICAgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlZmF1bHQgICB8IERlc2NyaXB0aW9uIHxcbiAqIHwgLS0tLS0tLS0gICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIHwgLS0tLS0tLSAgIHwgLS0tLS0tLS0tLS0gfFxuICogfCAqKm1lc3NhZ2UqKiAgICAgICAgfCBgc3RyaW5nYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnJyAgICAgICAgfCBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IHxcbiAqIHwgKip0eXBlKiogICAgICAgICAgIHwgYCdkZWZhdWx0J2AsYCdlcnJvcidgLGAnc3VjY2VzcydgLGAnd2FybmluZydgIHwgJ2RlZmF1bHQnIHwgVGhlIHN0eWxlIG9mIHRvYXN0IHxcbiAqIHwgKipkZWxheSoqICAgICAgICAgIHwgYG51bWJlcmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzAwMCAgICAgIHwgbXMgYmVmb3JlIHRvYXN0IGlzIGRpc21pc3NlZC4gMCA9PSBubyBkaXNtaXNzIHxcbiAqIHwgKipkaXNtaXNzT25DbGljayoqIHwgYGJvb2xlYW5gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJ1ZSAgICAgIHwgSWYgdHJ1ZSwgdGhlIHRvYXN0IGNhbiBiZSBkaXNtaXNzZWQgYnkgY2xpY2sgb3Igc3dpcGV8XG4gKiB8ICoqYWN0aW9uLmxhYmVsKiogICB8IGBzdHJpbmdgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IE9wdGlvbmFsIGFjdGlvbiBsYWJlbCB8XG4gKiB8ICoqYWN0aW9uLm9uQ2xpY2sqKiB8IGBGdW5jdGlvbmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IENhbGxiYWNrIGlmIGFjdGlvbiBsYWJlbCBpcyBjbGlja2VkIHxcbiAqXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24ge1xuXG4gICAgb3BlbiQgPSBuZXcgRXZlbnRFbWl0dGVyPElOb3RpZmljYXRpb25PcHRpb25zPigpO1xuICAgIHByaXZhdGUgaG9zdFZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gICAgcHJpdmF0ZSBvcGVuVG9hc3RzOiBJT3BlblRvYXN0W10gPSBbXTtcbiAgICAvKlxuICAgICAqIFNwYWNpbmcgYmV0d2VlbiBzdGFja2VkIHRvYXN0c1xuICAgICAqL1xuICAgIHByaXZhdGUgdmVydGljYWxNYXJnaW46IG51bWJlciA9IDEwO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgICAgICBvdmVybGF5SG9zdFNlcnZpY2U6IE92ZXJsYXlIb3N0U2VydmljZSkge1xuICAgICAgICBvdmVybGF5SG9zdFNlcnZpY2UuZ2V0SG9zdFZpZXcoKS50aGVuKHZpZXcgPT4ge1xuICAgICAgICAgICAgdGhpcy5ob3N0Vmlld0NvbnRhaW5lciA9IHZpZXc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgYSB0b2FzdCBub3RpZmljYXRpb24uIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkaXNtaXNzKCkgbWV0aG9kLCB3aGljaCB3aWxsXG4gICAgICogZGlzbWlzcyB0aGUgdG9hc3Qgd2hlbiBpbnZva2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93KG9wdGlvbnM6IElOb3RpZmljYXRpb25PcHRpb25zKTogeyBkaXNtaXNzOiAoKSA9PiB2b2lkIH0ge1xuICAgICAgICBsZXQgbWVyZ2VkT3B0aW9uczogSU5vdGlmaWNhdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIGxldCB0b2FzdCA9IHRoaXMuY3JlYXRlVG9hc3QobWVyZ2VkT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNtaXNzOiAoKTogdm9pZCA9PiB0b2FzdC5kaXNtaXNzRm4oKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgW092ZXJsYXlIb3N0XSgjL292ZXJsYXktaG9zdCkgdG8gY2xlYW4gdXAuXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3lBbGxUb2FzdHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlblRvYXN0cy5mb3JFYWNoKChvOiBJT3BlblRvYXN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG8udG9hc3QuZGlzbWlzc0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgby50b2FzdC5kaXNtaXNzRm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3BlblRvYXN0cyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugb2YgdGhlIFRvYXN0IGNvbXBvbmVudCBhbmQgcmVtb3ZlIGl0cyByZWZlcmVuY2UgZnJvbSB0aGVcbiAgICAgKiBvcGVuVG9hc3RzIGFycmF5LlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVzdHJveVRvYXN0KGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFRvYXN0Pik6IHZvaWQge1xuICAgICAgICBsZXQgdG9hc3Q6IFRvYXN0ID0gY29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmdldFRvYXN0SW5kZXgodG9hc3QpO1xuICAgICAgICBpZiAoLTEgPCBpbmRleCkge1xuICAgICAgICAgICAgbGV0IHRpbWVyOiBhbnkgPSB0aGlzLm9wZW5Ub2FzdHNbaW5kZXhdLmRpc21pc3NUaW1lcjtcbiAgICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wZW5Ub2FzdHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0b2FzdC5zdGFydERpc21pc3MoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbk9wZW5Ub2FzdHMoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEeW5hbWljYWxseSBjcmVhdGUgYW5kIGxvYWQgYSBuZXcgVG9hc3QgY29tcG9uZW50IG5leHQgdG8gdGhlXG4gICAgICogTm90aWZpY2F0aW9uSG9zdCBjb21wb25lbnQgaW4gdGhlIERPTS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVRvYXN0KG9wdGlvbnM6IElOb3RpZmljYXRpb25PcHRpb25zKTogVG9hc3Qge1xuICAgICAgICBsZXQgdG9hc3RGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoVG9hc3QpO1xuICAgICAgICBsZXQgcmVmID0gdGhpcy5ob3N0Vmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodG9hc3RGYWN0b3J5KTtcbiAgICAgICAgbGV0IHRvYXN0OiBUb2FzdCA9IHJlZi5pbnN0YW5jZTtcblxuICAgICAgICBsZXQgZGlzbWlzc1RpbWVyOiBhbnk7XG4gICAgICAgIHRvYXN0Lm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgICAgIHRvYXN0LnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIHRvYXN0LmRpc21pc3NPbkNsaWNrID0gb3B0aW9ucy5kaXNtaXNzT25DbGljaztcbiAgICAgICAgdG9hc3QuZGlzbWlzc0ZuID0gKCkgPT4gdGhpcy5kZXN0cm95VG9hc3QocmVmKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hY3Rpb24gJiYgb3B0aW9ucy5hY3Rpb24ubGFiZWwpIHtcbiAgICAgICAgICAgIHRvYXN0LmFjdGlvbkxhYmVsID0gb3B0aW9ucy5hY3Rpb24ubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYWN0aW9uICYmIG9wdGlvbnMuYWN0aW9uLm9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRvYXN0LmFjdGlvbk9uQ2xpY2sgPSBvcHRpb25zLmFjdGlvbi5vbkNsaWNrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKDAgPCBvcHRpb25zLmRlbGF5KSB7XG4gICAgICAgICAgICBkaXNtaXNzVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRvYXN0LmRpc21pc3NGbigpLCBvcHRpb25zLmRlbGF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlblRvYXN0cy51bnNoaWZ0KHtcbiAgICAgICAgICAgIHRvYXN0LFxuICAgICAgICAgICAgZGlzbWlzc1RpbWVyXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvc2l0aW9uT3BlblRvYXN0cygpO1xuICAgICAgICByZXR1cm4gdG9hc3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3NpdGlvbk9wZW5Ub2FzdHMoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGVuVG9hc3RzLmZvckVhY2goKG86IElPcGVuVG9hc3QpID0+IHtcbiAgICAgICAgICAgICAgICBvLnRvYXN0LnBvc2l0aW9uLnRvcCA9IHRoaXMuZ2V0VG9hc3RUb3Aoby50b2FzdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWUgb2YgdGhlIFwidG9wXCIgb2Zmc2V0IGZvciB0aGlzIHRvYXN0IGJ5IGFkZGluZyB1cFxuICAgICAqIHRoZSBoZWlnaHRzIG9mIHRoZSBvdGhlciB0b2FzdHMgd2hpY2ggYXJlIG9wZW4gYWJvdmUgdGhpcyBvbmUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRUb2FzdFRvcCh0b2FzdDogVG9hc3QpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmdldFRvYXN0SW5kZXgodG9hc3QpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5Ub2FzdHNcbiAgICAgICAgICAgIC5maWx0ZXIoKG86IElPcGVuVG9hc3QsIGk6IG51bWJlcikgPT4gaSA8IGluZGV4KVxuICAgICAgICAgICAgLnJlZHVjZSgodG9wOiBudW1iZXIsIG86IElPcGVuVG9hc3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9wICs9IG8udG9hc3QuZ2V0SGVpZ2h0KCkgKyB0aGlzLnZlcnRpY2FsTWFyZ2luO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRvYXN0IG9iamVjdCBpbiB0aGUgb3BlblRvYXN0cyBhcnJheS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFRvYXN0SW5kZXgodG9hc3Q6IFRvYXN0KTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlblRvYXN0cy5tYXAoKG86IElPcGVuVG9hc3QpID0+IG8udG9hc3QpLmluZGV4T2YodG9hc3QpO1xuICAgIH1cbn1cbiJdfQ==