com.phloxui
Version:
PhloxUI Ng2+ Framework
201 lines (200 loc) • 25.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { EventEmitter } from '@angular/core';
import { Subscription } from 'rxjs';
export class EventUtils {
/**
* @param {?} type
* @param {?} ngComponent
* @param {?} data
* @param {?} $browserEvent
* @return {?}
*/
static newCustomEvent(type, ngComponent, data, $browserEvent) {
let /** @type {?} */ option = {};
option['type'] = type;
option.detail = {};
option.detail['time'] = new Date();
option.detail['target'] = ngComponent;
option.detail['event'] = $browserEvent;
option.detail['data'] = data;
option.detail['eventTarget'] = ($browserEvent === null || typeof $browserEvent === 'undefined') ? undefined : $browserEvent.target;
option['bubbles'] = true;
option['cancelable'] = true;
return this.newCustomEventWithOption(option);
}
/**
* @param {?} option
* @return {?}
*/
static newCustomEventWithOption(option) {
let /** @type {?} */ ev = new CustomEvent(option.type, {
detail: {
time: option.detail.time,
target: option.detail.target,
event: option.detail.event,
data: option.detail.data,
eventTarget: option.detail.eventTarget
},
bubbles: option.bubbles,
cancelable: option.cancelable
});
return ev;
}
/**
* @param {?} component
* @param {?} beforeEventVarName
* @param {?=} $browserEvent
* @param {?=} fireEvent
* @param {?=} doEvent
* @param {?=} emitBeforeEvent
* @param {?=} emitAfterEvent
* @param {?=} doPrevented
* @param {?=} subscrSuffix
* @return {?}
*/
static handleBrowserEvent(component, beforeEventVarName, $browserEvent, fireEvent, doEvent, emitBeforeEvent, emitAfterEvent, doPrevented, subscrSuffix) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
if (!component) {
throw 'The parameter "component" must be specified.';
}
if (!beforeEventVarName) {
throw 'The parameter "beforeEventVarName" must be specified.';
}
let /** @type {?} */ beforeEvent = component[beforeEventVarName];
if (!beforeEvent) {
throw 'Could not find property "' + beforeEventVarName + '" in the given component.';
}
if (!(beforeEvent instanceof EventEmitter)) {
throw 'The property "' + beforeEventVarName + '" is not an EventEmitter.';
}
let /** @type {?} */ subscrName = '__' + beforeEventVarName + (subscrSuffix ? '_' + subscrSuffix : '') + '_subscr' + '__';
// Copy & Paste code below
let /** @type {?} */ subscr = component[subscrName];
if (subscr !== null && subscr !== undefined && !(subscr instanceof Subscription)) {
throw 'The property collision detected: "' + subscrName + '".';
}
if (emitBeforeEvent && typeof emitBeforeEvent !== 'function') {
throw 'The parameter "emitBeforeEvent" must be a function.';
}
if (emitAfterEvent && typeof emitAfterEvent !== 'function') {
throw 'The parameter "emitAfterEvent" must be a function.';
}
if (doEvent && typeof doEvent !== 'function') {
throw 'The parameter "doEvent" must be a function.';
}
if (doPrevented && typeof doPrevented !== 'function') {
throw 'The parameter "doPrevented" must be a function.';
}
return new Promise((resolve, reject) => {
let /** @type {?} */ doInit = () => {
component[subscrName] = beforeEvent.subscribe(($event) => {
let /** @type {?} */ browserEvent = $event;
try {
browserEvent = $event.detail.event;
}
catch (/** @type {?} */ e) {
}
let /** @type {?} */ prom = undefined;
if (!$event.defaultPrevented) {
if (doEvent) {
prom = doEvent(browserEvent);
}
}
else {
if (doPrevented) {
prom = doPrevented(browserEvent);
}
}
if (prom === null || prom === undefined) {
prom = Promise.resolve(null);
}
else if (!(prom instanceof Promise)) {
prom = Promise.resolve(prom);
}
if (emitAfterEvent) {
prom.then((result) => {
if (!$event.defaultPrevented) {
// Emit after event in Promise in case of doEvent()
// returns a promise.
emitAfterEvent.call(component, browserEvent, result);
}
// Delegate result to the next then().
return result;
});
}
prom.then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
};
let /** @type {?} */ undoInit = () => {
if (subscr) {
subscr.unsubscribe();
}
component[subscrName] = undefined;
};
if (fireEvent) {
// Always unsubscribe old before event handler to
// refresh a new doEvent() & doPrevent() function.
undoInit();
if (beforeEvent.observers.length > 0 && emitBeforeEvent) {
// Auto subscribe before event with a new doEvent()
// & doPrevent() function at the end of stream.
doInit();
// Before event subscribers found, only emit before event.
emitBeforeEvent.call(component, $browserEvent);
}
else {
// No before event subscribers found.
let /** @type {?} */ prom = undefined;
if (doEvent) {
prom = doEvent($browserEvent);
}
if (emitAfterEvent) {
if (prom === null || prom === undefined) {
prom = Promise.resolve(null);
}
else if (!(prom instanceof Promise)) {
prom = Promise.resolve(prom);
}
prom.then((result) => {
// Emit after event in Promise in case of doEvent()
// returns a promise.
emitAfterEvent.call(component, $browserEvent, result);
resolve(result);
}).catch((error) => {
reject(error);
});
}
}
}
else if (doEvent) {
let /** @type {?} */ prom = undefined;
if (doEvent) {
prom = doEvent($browserEvent);
}
if (prom === null || prom === undefined) {
prom = Promise.resolve(null);
}
else if (!(prom instanceof Promise)) {
prom = Promise.resolve(prom);
}
// We've to wrap doEvent() result into prom
// in case of it returns a promise.
prom.then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
}
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxNQUFNOzs7Ozs7OztJQUVHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBUyxFQUFFLFdBQWdCLEVBQUUsSUFBUyxFQUFFLGFBQWtCO1FBQ3JGLHFCQUFJLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFFckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUV0QixNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUVuSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFNUIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMs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R0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5QjtnQkFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5Qjs7O2dCQUlELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDbkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNqQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDZixDQUFDLENBQUM7YUFDSjtTQUNGLENBQUMsQ0FBQzs7Q0FFTiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFdmVudFV0aWxzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBuZXdDdXN0b21FdmVudCh0eXBlOiBhbnksIG5nQ29tcG9uZW50OiBhbnksIGRhdGE6IGFueSwgJGJyb3dzZXJFdmVudDogYW55KTogQ3VzdG9tRXZlbnQge1xyXG4gICAgbGV0IG9wdGlvbjogYW55ID0ge307XHJcblxyXG4gICAgb3B0aW9uWyd0eXBlJ10gPSB0eXBlO1xyXG5cclxuICAgIG9wdGlvbi5kZXRhaWwgPSB7fTtcclxuICAgIG9wdGlvbi5kZXRhaWxbJ3RpbWUnXSA9IG5ldyBEYXRlKCk7XHJcbiAgICBvcHRpb24uZGV0YWlsWyd0YXJnZXQnXSA9IG5nQ29tcG9uZW50O1xyXG4gICAgb3B0aW9uLmRldGFpbFsnZXZlbnQnXSA9ICRicm93c2VyRXZlbnQ7XHJcbiAgICBvcHRpb24uZGV0YWlsWydkYXRhJ10gPSBkYXRhO1xyXG4gICAgb3B0aW9uLmRldGFpbFsnZXZlbnRUYXJnZXQnXSA9ICgkYnJvd3NlckV2ZW50ID09PSBudWxsIHx8IHR5cGVvZiAkYnJvd3NlckV2ZW50ID09PSAndW5kZWZpbmVkJykgPyB1bmRlZmluZWQgOiAkYnJvd3NlckV2ZW50LnRhcmdldDtcclxuXHJcbiAgICBvcHRpb25bJ2J1YmJsZXMnXSA9IHRydWU7XHJcbiAgICBvcHRpb25bJ2NhbmNlbGFibGUnXSA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubmV3Q3VzdG9tRXZlbnRXaXRoT3B0aW9uKG9wdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG5ld0N1c3RvbUV2ZW50V2l0aE9wdGlvbihvcHRpb246IGFueSk6IEN1c3RvbUV2ZW50IHtcclxuICAgIGxldCBldiA9IG5ldyBDdXN0b21FdmVudChcclxuICAgICAgb3B0aW9uLnR5cGUsXHJcbiAgICAgIHtcclxuICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgIHRpbWU6IG9wdGlvbi5kZXRhaWwudGltZSxcclxuICAgICAgICAgIHRhcmdldDogb3B0aW9uLmRldGFpbC50YXJnZXQsXHJcbiAgICAgICAgICBldmVudDogb3B0aW9uLmRldGFpbC5ldmVudCxcclxuICAgICAgICAgIGRhdGE6IG9wdGlvbi5kZXRhaWwuZGF0YSxcclxuICAgICAgICAgIGV2ZW50VGFyZ2V0OiBvcHRpb24uZGV0YWlsLmV2ZW50VGFyZ2V0XHJcbiAgICAgICAgfSxcclxuICAgICAgICBidWJibGVzOiBvcHRpb24uYnViYmxlcyxcclxuICAgICAgICBjYW5jZWxhYmxlOiBvcHRpb24uY2FuY2VsYWJsZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBldjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaGFuZGxlQnJvd3NlckV2ZW50KGNvbXBvbmVudDogYW55LCBiZWZvcmVFdmVudFZhck5hbWU6IHN0cmluZywgJGJyb3dzZXJFdmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuLCBkb0V2ZW50PzogRnVuY3Rpb24sIGVtaXRCZWZvcmVFdmVudD86IEZ1bmN0aW9uLCBlbWl0QWZ0ZXJFdmVudD86IEZ1bmN0aW9uLCBkb1ByZXZlbnRlZD86IEZ1bmN0aW9uLCBzdWJzY3JTdWZmaXg/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29tcG9uZW50KSB7XHJcbiAgICAgIHRocm93ICdUaGUgcGFyYW1ldGVyIFwiY29tcG9uZW50XCIgbXVzdCBiZSBzcGVjaWZpZWQuJztcclxuICAgIH1cclxuICAgIGlmICghYmVmb3JlRXZlbnRWYXJOYW1lKSB7XHJcbiAgICAgIHRocm93ICdUaGUgcGFyYW1ldGVyIFwiYmVmb3JlRXZlbnRWYXJOYW1lXCIgbXVzdCBiZSBzcGVjaWZpZWQuJztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYmVmb3JlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gY29tcG9uZW50W2JlZm9yZUV2ZW50VmFyTmFtZV07XHJcblxyXG4gICAgaWYgKCFiZWZvcmVFdmVudCkge1xyXG4gICAgICB0aHJvdyAnQ291bGQgbm90IGZpbmQgcHJvcGVydHkgXCInICsgYmVmb3JlRXZlbnRWYXJOYW1lICsgJ1wiIGluIHRoZSBnaXZlbiBjb21wb25lbnQuJztcclxuICAgIH1cclxuICAgIGlmICghKGJlZm9yZUV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSkge1xyXG4gICAgICB0aHJvdyAnVGhlIHByb3BlcnR5IFwiJyArIGJlZm9yZUV2ZW50VmFyTmFtZSArICdcIiBpcyBub3QgYW4gRXZlbnRFbWl0dGVyLic7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHN1YnNjck5hbWU6IHN0cmluZyA9ICdfXycgKyBiZWZvcmVFdmVudFZhck5hbWUgKyAoc3Vic2NyU3VmZml4ID8gJ18nICsgc3Vic2NyU3VmZml4IDogJycpICsgJ19zdWJzY3InICsgJ19fJztcclxuXHJcbiAgICAvLyBDb3B5ICYgUGFzdGUgY29kZSBiZWxvd1xyXG4gICAgbGV0IHN1YnNjcjogU3Vic2NyaXB0aW9uID0gY29tcG9uZW50W3N1YnNjck5hbWVdO1xyXG5cclxuICAgIGlmIChzdWJzY3IgIT09IG51bGwgJiYgc3Vic2NyICE9PSB1bmRlZmluZWQgJiYgIShzdWJzY3IgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24pKSB7XHJcbiAgICAgIHRocm93ICdUaGUgcHJvcGVydHkgY29sbGlzaW9uIGRldGVjdGVkOiBcIicgKyBzdWJzY3JOYW1lICsgJ1wiLic7XHJcbiAgICB9XHJcbiAgICBpZiAoZW1pdEJlZm9yZUV2ZW50ICYmIHR5cGVvZiBlbWl0QmVmb3JlRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhyb3cgJ1RoZSBwYXJhbWV0ZXIgXCJlbWl0QmVmb3JlRXZlbnRcIiBtdXN0IGJlIGEgZnVuY3Rpb24uJztcclxuICAgIH1cclxuICAgIGlmIChlbWl0QWZ0ZXJFdmVudCAmJiB0eXBlb2YgZW1pdEFmdGVyRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhyb3cgJ1RoZSBwYXJhbWV0ZXIgXCJlbWl0QWZ0ZXJFdmVudFwiIG11c3QgYmUgYSBmdW5jdGlvbi4nO1xyXG4gICAgfVxyXG4gICAgaWYgKGRvRXZlbnQgJiYgdHlwZW9mIGRvRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhyb3cgJ1RoZSBwYXJhbWV0ZXIgXCJkb0V2ZW50XCIgbXVzdCBiZSBhIGZ1bmN0aW9uLic7XHJcbiAgICB9XHJcbiAgICBpZiAoZG9QcmV2ZW50ZWQgJiYgdHlwZW9mIGRvUHJldmVudGVkICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93ICdUaGUgcGFyYW1ldGVyIFwiZG9QcmV2ZW50ZWRcIiBtdXN0IGJlIGEgZnVuY3Rpb24uJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGxldCBkb0luaXQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29tcG9uZW50W3N1YnNjck5hbWVdID0gYmVmb3JlRXZlbnQuc3Vic2NyaWJlKCgkZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBsZXQgYnJvd3NlckV2ZW50OiBFdmVudCA9ICRldmVudDtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGJyb3dzZXJFdmVudCA9ICRldmVudC5kZXRhaWwuZXZlbnQ7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHByb206IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICBpZiAoISRldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChkb0V2ZW50KSB7XHJcbiAgICAgICAgICAgICAgcHJvbSA9IGRvRXZlbnQoYnJvd3NlckV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRvUHJldmVudGVkKSB7XHJcbiAgICAgICAgICAgICAgcHJvbSA9IGRvUHJldmVudGVkKGJyb3dzZXJFdmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocHJvbSA9PT0gbnVsbCB8fCBwcm9tID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIShwcm9tIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcclxuICAgICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShwcm9tKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZW1pdEFmdGVyRXZlbnQpIHtcclxuICAgICAgICAgICAgcHJvbS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoISRldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGFmdGVyIGV2ZW50IGluIFByb21pc2UgaW4gY2FzZSBvZiBkb0V2ZW50KClcclxuICAgICAgICAgICAgICAgIC8vIHJldHVybnMgYSBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgZW1pdEFmdGVyRXZlbnQuY2FsbChjb21wb25lbnQsIGJyb3dzZXJFdmVudCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gRGVsZWdhdGUgcmVzdWx0IHRvIHRoZSBuZXh0IHRoZW4oKS5cclxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICBsZXQgdW5kb0luaXQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKHN1YnNjcikge1xyXG4gICAgICAgICAgc3Vic2NyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnRbc3Vic2NyTmFtZV0gPSB1bmRlZmluZWQ7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoZmlyZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gQWx3YXlzIHVuc3Vic2NyaWJlIG9sZCBiZWZvcmUgZXZlbnQgaGFuZGxlciB0b1xyXG4gICAgICAgIC8vIHJlZnJlc2ggYSBuZXcgZG9FdmVudCgpICYgZG9QcmV2ZW50KCkgZnVuY3Rpb24uXHJcbiAgICAgICAgdW5kb0luaXQoKTtcclxuXHJcbiAgICAgICAgaWYgKGJlZm9yZUV2ZW50Lm9ic2VydmVycy5sZW5ndGggPiAwICYmIGVtaXRCZWZvcmVFdmVudCkge1xyXG4gICAgICAgICAgLy8gQXV0byBzdWJzY3JpYmUgYmVmb3JlIGV2ZW50IHdpdGggYSBuZXcgZG9FdmVudCgpXHJcbiAgICAgICAgICAvLyAmIGRvUHJldmVudCgpIGZ1bmN0aW9uIGF0IHRoZSBlbmQgb2Ygc3RyZWFtLlxyXG4gICAgICAgICAgZG9Jbml0KCk7XHJcblxyXG4gICAgICAgICAgLy8gQmVmb3JlIGV2ZW50IHN1YnNjcmliZXJzIGZvdW5kLCBvbmx5IGVtaXQgYmVmb3JlIGV2ZW50LlxyXG4gICAgICAgICAgZW1pdEJlZm9yZUV2ZW50LmNhbGwoY29tcG9uZW50LCAkYnJvd3NlckV2ZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm8gYmVmb3JlIGV2ZW50IHN1YnNjcmliZXJzIGZvdW5kLlxyXG4gICAgICAgICAgbGV0IHByb206IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICBpZiAoZG9FdmVudCkge1xyXG4gICAgICAgICAgICBwcm9tID0gZG9FdmVudCgkYnJvd3NlckV2ZW50KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZW1pdEFmdGVyRXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByb20gPT09IG51bGwgfHwgcHJvbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghKHByb20gaW5zdGFuY2VvZiBQcm9taXNlKSkge1xyXG4gICAgICAgICAgICAgIHByb20gPSBQcm9taXNlLnJlc29sdmUocHJvbSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHByb20udGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gRW1pdCBhZnRlciBldmVudCBpbiBQcm9taXNlIGluIGNhc2Ugb2YgZG9FdmVudCgpXHJcbiAgICAgICAgICAgICAgLy8gcmV0dXJucyBhIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgZW1pdEFmdGVyRXZlbnQuY2FsbChjb21wb25lbnQsICRicm93c2VyRXZlbnQsIHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGRvRXZlbnQpIHtcclxuICAgICAgICBsZXQgcHJvbTogYW55ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBpZiAoZG9FdmVudCkge1xyXG4gICAgICAgICAgcHJvbSA9IGRvRXZlbnQoJGJyb3dzZXJFdmVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvbSA9PT0gbnVsbCB8fCBwcm9tID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHByb20gPSBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghKHByb20gaW5zdGFuY2VvZiBQcm9taXNlKSkge1xyXG4gICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShwcm9tKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlJ3ZlIHRvIHdyYXAgZG9FdmVudCgpIHJlc3VsdCBpbnRvIHByb21cclxuICAgICAgICAvLyBpbiBjYXNlIG9mIGl0IHJldHVybnMgYSBwcm9taXNlLlxyXG4gICAgICAgIHByb20udGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19