@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
171 lines • 20.4 kB
JavaScript
import { __decorate, __metadata, __param, __values } from "tslib";
import { Inject, Injectable, NgZone } from '@angular/core';
import { ɵgetDOM as getDOM } from '@angular/platform-browser';
import { DOCUMENT } from '@angular/common';
import { PlatformUtil } from './utils';
var EVENT_SUFFIX = 'precise';
/**
* Touch gestures manager based on Hammer.js
* Use with caution, this will track references for single manager per element. Very TBD. Much TODO.
* @hidden
*/
var HammerGesturesManager = /** @class */ (function () {
function HammerGesturesManager(_zone, doc, platformUtil) {
this._zone = _zone;
this.doc = doc;
this.platformUtil = platformUtil;
/**
* Event option defaults for each recognizer, see http://hammerjs.github.io/api/ for API listing.
*/
this.hammerOptions = {};
this._hammerManagers = [];
this.platformBrowser = this.platformUtil.isBrowser;
if (this.platformBrowser) {
this.hammerOptions = {
// D.P. #447 Force TouchInput due to PointerEventInput bug (https://github.com/hammerjs/hammer.js/issues/1065)
// see https://github.com/IgniteUI/igniteui-angular/issues/447#issuecomment-324601803
inputClass: Hammer.TouchInput,
recognizers: [
[Hammer.Pan, { threshold: 0 }],
[Hammer.Swipe, {
direction: Hammer.DIRECTION_HORIZONTAL
}],
[Hammer.Tap],
[Hammer.Tap, { event: 'doubletap', taps: 2 }, ['tap']]
]
};
}
}
HammerGesturesManager.prototype.supports = function (eventName) {
return eventName.toLowerCase().endsWith('.' + EVENT_SUFFIX);
};
/**
* Add listener extended with options for Hammer.js. Will use defaults if none are provided.
* Modeling after other event plugins for easy future modifications.
*/
HammerGesturesManager.prototype.addEventListener = function (element, eventName, eventHandler, options) {
var _this = this;
if (options === void 0) { options = null; }
if (!this.platformBrowser) {
return;
}
// Creating the manager bind events, must be done outside of angular
return this._zone.runOutsideAngular(function () {
var mc = _this.getManagerForElement(element);
if (mc === null) {
// new Hammer is a shortcut for Manager with defaults
mc = new Hammer(element, Object.assign(_this.hammerOptions, options));
_this.addManagerForElement(element, mc);
}
var handler = function (eventObj) { _this._zone.run(function () { eventHandler(eventObj); }); };
mc.on(eventName, handler);
return function () { mc.off(eventName, handler); };
});
};
/**
* Add listener extended with options for Hammer.js. Will use defaults if none are provided.
* Modeling after other event plugins for easy future modifications.
*
* @param target Can be one of either window, body or document(fallback default).
*/
HammerGesturesManager.prototype.addGlobalEventListener = function (target, eventName, eventHandler) {
if (!this.platformBrowser) {
return;
}
var element = this.getGlobalEventTarget(target);
// Creating the manager bind events, must be done outside of angular
return this.addEventListener(element, eventName, eventHandler);
};
/**
* Exposes [Dom]Adapter.getGlobalEventTarget to get global event targets.
* Supported: window, document, body. Defaults to document for invalid args.
* @param target Target name
*/
HammerGesturesManager.prototype.getGlobalEventTarget = function (target) {
return getDOM().getGlobalEventTarget(this.doc, target);
};
/**
* Set HammerManager options.
*
* @param element The DOM element used to create the manager on.
*
* ### Example
*
* ```ts
* manager.setManagerOption(myElem, "pan", { pointers: 1 });
* ```
*/
HammerGesturesManager.prototype.setManagerOption = function (element, event, options) {
var manager = this.getManagerForElement(element);
manager.get(event).set(options);
};
/**
* Add an element and manager map to the internal collection.
*
* @param element The DOM element used to create the manager on.
*/
HammerGesturesManager.prototype.addManagerForElement = function (element, manager) {
this._hammerManagers.push({ element: element, manager: manager });
};
/**
* Get HammerManager for the element or null
*
* @param element The DOM element used to create the manager on.
*/
HammerGesturesManager.prototype.getManagerForElement = function (element) {
var result = this._hammerManagers.filter(function (value, index, array) {
return value.element === element;
});
return result.length ? result[0].manager : null;
};
/**
* Destroys the HammerManager for the element, removing event listeners in the process.
*
* @param element The DOM element used to create the manager on.
*/
HammerGesturesManager.prototype.removeManagerForElement = function (element) {
var index = null;
for (var i = 0; i < this._hammerManagers.length; i++) {
if (element === this._hammerManagers[i].element) {
index = i;
break;
}
}
if (index !== null) {
var item = this._hammerManagers.splice(index, 1)[0];
// destroy also
item.manager.destroy();
}
};
/** Destroys all internally tracked HammerManagers, removing event listeners in the process. */
HammerGesturesManager.prototype.destroy = function () {
var e_1, _a;
try {
for (var _b = __values(this._hammerManagers), _c = _b.next(); !_c.done; _c = _b.next()) {
var item = _c.value;
item.manager.destroy();
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
this._hammerManagers = [];
};
HammerGesturesManager.ctorParameters = function () { return [
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: PlatformUtil }
]; };
HammerGesturesManager = __decorate([
Injectable(),
__param(1, Inject(DOCUMENT)),
__metadata("design:paramtypes", [NgZone, Object, PlatformUtil])
], HammerGesturesManager);
return HammerGesturesManager;
}());
export { HammerGesturesManager };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91Y2guanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2NvcmUvdG91Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXZDLElBQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQztBQUUvQjs7OztHQUlHO0FBRUg7SUFTSSwrQkFBb0IsS0FBYSxFQUE0QixHQUFRLEVBQVUsWUFBMEI7UUFBckYsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUE0QixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFQekc7O1dBRUc7UUFDTyxrQkFBYSxHQUFrQixFQUFFLENBQUM7UUFFcEMsb0JBQWUsR0FBNkQsRUFBRSxDQUFDO1FBR25GLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUc7Z0JBQ2pCLDhHQUE4RztnQkFDOUcscUZBQXFGO2dCQUNyRixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLFdBQVcsRUFBRTtvQkFDVCxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTs0QkFDWCxTQUFTLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjt5QkFDekMsQ0FBQztvQkFDRixDQUFDLE1BQU0s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QUNELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7O2dCQTNJMEIsTUFBTTtnREFBRyxNQUFNLFNBQUMsUUFBUTtnQkFBMEMsWUFBWTs7SUFUaEcscUJBQXFCO1FBRGpDLFVBQVUsRUFBRTtRQVUyQixXQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTt5Q0FBekIsTUFBTSxVQUE0RCxZQUFZO09BVGhHLHFCQUFxQixDQXFKakM7SUFBRCw0QkFBQztDQUFBLEFBckpELElBcUpDO1NBckpZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyDJtWdldERPTSBhcyBnZXRET00gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbCB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBFVkVOVF9TVUZGSVggPSAncHJlY2lzZSc7XG5cbi8qKlxuICogVG91Y2ggZ2VzdHVyZXMgbWFuYWdlciBiYXNlZCBvbiBIYW1tZXIuanNcbiAqIFVzZSB3aXRoIGNhdXRpb24sIHRoaXMgd2lsbCB0cmFjayByZWZlcmVuY2VzIGZvciBzaW5nbGUgbWFuYWdlciBwZXIgZWxlbWVudC4gVmVyeSBUQkQuIE11Y2ggVE9ETy5cbiAqIEBoaWRkZW5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEhhbW1lckdlc3R1cmVzTWFuYWdlciB7XG4gICAgcHJpdmF0ZSBwbGF0Zm9ybUJyb3dzZXI6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRXZlbnQgb3B0aW9uIGRlZmF1bHRzIGZvciBlYWNoIHJlY29nbml6ZXIsIHNlZSBodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvL2FwaS8gZm9yIEFQSSBsaXN0aW5nLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBoYW1tZXJPcHRpb25zOiBIYW1tZXJPcHRpb25zID0ge307XG5cbiAgICBwcml2YXRlIF9oYW1tZXJNYW5hZ2VyczogQXJyYXk8eyBlbGVtZW50OiBFdmVudFRhcmdldCwgbWFuYWdlcjogSGFtbWVyTWFuYWdlcjsgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3pvbmU6IE5nWm9uZSwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueSwgcHJpdmF0ZSBwbGF0Zm9ybVV0aWw6IFBsYXRmb3JtVXRpbCkge1xuICAgICAgICB0aGlzLnBsYXRmb3JtQnJvd3NlciA9IHRoaXMucGxhdGZvcm1VdGlsLmlzQnJvd3NlcjtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm1Ccm93c2VyKSB7XG4gICAgICAgICAgICB0aGlzLmhhbW1lck9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLy8gRC5QLiAjNDQ3IEZvcmNlIFRvdWNoSW5wdXQgZHVlIHRvIFBvaW50ZXJFdmVudElucHV0IGJ1ZyAoaHR0cHM6Ly9naXRodWIuY29tL2hhbW1lcmpzL2hhbW1lci5qcy9pc3N1ZXMvMTA2NSlcbiAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0lnbml0ZVVJL2lnbml0ZXVpLWFuZ3VsYXIvaXNzdWVzLzQ0NyNpc3N1ZWNvbW1lbnQtMzI0NjAxODAzXG4gICAgICAgICAgICAgICAgaW5wdXRDbGFzczogSGFtbWVyLlRvdWNoSW5wdXQsXG4gICAgICAgICAgICAgICAgcmVjb2duaXplcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgW0hhbW1lci5QYW4sIHsgdGhyZXNob2xkOiAwIH1dLFxuICAgICAgICAgICAgICAgICAgICBbSGFtbWVyLlN3aXBlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IEhhbW1lci5ESVJFQ1RJT05fSE9SSVpPTlRBTFxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICAgICAgW0hhbW1lci5UYXBdLFxuICAgICAgICAgICAgICAgICAgICBbSGFtbWVyLlRhcCwgeyBldmVudDogJ2RvdWJsZXRhcCcsIHRhcHM6IDIgfSwgWyd0YXAnXV1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN1cHBvcnRzKGV2ZW50TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBldmVudE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLicgKyBFVkVOVF9TVUZGSVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBsaXN0ZW5lciBleHRlbmRlZCB3aXRoIG9wdGlvbnMgZm9yIEhhbW1lci5qcy4gV2lsbCB1c2UgZGVmYXVsdHMgaWYgbm9uZSBhcmUgcHJvdmlkZWQuXG4gICAgICogTW9kZWxpbmcgYWZ0ZXIgb3RoZXIgZXZlbnQgcGx1Z2lucyBmb3IgZWFzeSBmdXR1cmUgbW9kaWZpY2F0aW9ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIGV2ZW50TmFtZTogc3RyaW5nLFxuICAgICAgICBldmVudEhhbmRsZXI6IChldmVudE9iaikgPT4gdm9pZCxcbiAgICAgICAgb3B0aW9uczogSGFtbWVyT3B0aW9ucyA9IG51bGwpOiAoKSA9PiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBsYXRmb3JtQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIG1hbmFnZXIgYmluZCBldmVudHMsIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1jOiBIYW1tZXJNYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChtYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIG5ldyBIYW1tZXIgaXMgYSBzaG9ydGN1dCBmb3IgTWFuYWdlciB3aXRoIGRlZmF1bHRzXG4gICAgICAgICAgICAgICAgbWMgPSBuZXcgSGFtbWVyKGVsZW1lbnQsIE9iamVjdC5hc3NpZ24odGhpcy5oYW1tZXJPcHRpb25zLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50LCBtYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50T2JqKSA9PiB7IHRoaXMuX3pvbmUucnVuKCgpID0+IHsgZXZlbnRIYW5kbGVyKGV2ZW50T2JqKTsgfSk7IH07XG4gICAgICAgICAgICBtYy5vbihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHsgbWMub2ZmKGV2ZW50TmFtZSwgaGFuZGxlcik7IH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBsaXN0ZW5lciBleHRlbmRlZCB3aXRoIG9wdGlvbnMgZm9yIEhhbW1lci5qcy4gV2lsbCB1c2UgZGVmYXVsdHMgaWYgbm9uZSBhcmUgcHJvdmlkZWQuXG4gICAgICogTW9kZWxpbmcgYWZ0ZXIgb3RoZXIgZXZlbnQgcGx1Z2lucyBmb3IgZWFzeSBmdXR1cmUgbW9kaWZpY2F0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgQ2FuIGJlIG9uZSBvZiBlaXRoZXIgd2luZG93LCBib2R5IG9yIGRvY3VtZW50KGZhbGxiYWNrIGRlZmF1bHQpLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldDogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiAoZXZlbnRPYmopID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBsYXRmb3JtQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGFyZ2V0KTtcblxuICAgICAgICAvLyBDcmVhdGluZyB0aGUgbWFuYWdlciBiaW5kIGV2ZW50cywgbXVzdCBiZSBkb25lIG91dHNpZGUgb2YgYW5ndWxhclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBvc2VzIFtEb21dQWRhcHRlci5nZXRHbG9iYWxFdmVudFRhcmdldCB0byBnZXQgZ2xvYmFsIGV2ZW50IHRhcmdldHMuXG4gICAgICogU3VwcG9ydGVkOiB3aW5kb3csIGRvY3VtZW50LCBib2R5LiBEZWZhdWx0cyB0byBkb2N1bWVudCBmb3IgaW52YWxpZCBhcmdzLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiBFdmVudFRhcmdldCB7XG4gICAgICAgIHJldHVybiBnZXRET00oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLmRvYywgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgSGFtbWVyTWFuYWdlciBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHVzZWQgdG8gY3JlYXRlIHRoZSBtYW5hZ2VyIG9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogbWFuYWdlci5zZXRNYW5hZ2VyT3B0aW9uKG15RWxlbSwgXCJwYW5cIiwgeyBwb2ludGVyczogMSB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWFuYWdlck9wdGlvbihlbGVtZW50OiBFdmVudFRhcmdldCwgZXZlbnQ6IHN0cmluZywgb3B0aW9uczogYW55KSB7XG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmdldE1hbmFnZXJGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBtYW5hZ2VyLmdldChldmVudCkuc2V0KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBlbGVtZW50IGFuZCBtYW5hZ2VyIG1hcCB0byB0aGUgaW50ZXJuYWwgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBET00gZWxlbWVudCB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFuYWdlciBvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTWFuYWdlckZvckVsZW1lbnQoZWxlbWVudDogRXZlbnRUYXJnZXQsIG1hbmFnZXI6IEhhbW1lck1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5faGFtbWVyTWFuYWdlcnMucHVzaCh7ZWxlbWVudCwgbWFuYWdlcn0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBIYW1tZXJNYW5hZ2VyIGZvciB0aGUgZWxlbWVudCBvciBudWxsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgRE9NIGVsZW1lbnQgdXNlZCB0byBjcmVhdGUgdGhlIG1hbmFnZXIgb24uXG4gICAgICovXG4gICAgcHVibGljIGdldE1hbmFnZXJGb3JFbGVtZW50KGVsZW1lbnQ6IEV2ZW50VGFyZ2V0KTogSGFtbWVyTWFuYWdlciB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9ICB0aGlzLl9oYW1tZXJNYW5hZ2Vycy5maWx0ZXIoKHZhbHVlLCBpbmRleCwgYXJyYXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5lbGVtZW50ID09PSBlbGVtZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPyByZXN1bHRbMF0ubWFuYWdlciA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIEhhbW1lck1hbmFnZXIgZm9yIHRoZSBlbGVtZW50LCByZW1vdmluZyBldmVudCBsaXN0ZW5lcnMgaW4gdGhlIHByb2Nlc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgRE9NIGVsZW1lbnQgdXNlZCB0byBjcmVhdGUgdGhlIG1hbmFnZXIgb24uXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZU1hbmFnZXJGb3JFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oYW1tZXJNYW5hZ2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMuX2hhbW1lck1hbmFnZXJzW2ldLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5faGFtbWVyTWFuYWdlcnMuc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICAgICAgICAgIC8vIGRlc3Ryb3kgYWxzb1xuICAgICAgICAgICAgaXRlbS5tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBEZXN0cm95cyBhbGwgaW50ZXJuYWxseSB0cmFja2VkIEhhbW1lck1hbmFnZXJzLCByZW1vdmluZyBldmVudCBsaXN0ZW5lcnMgaW4gdGhlIHByb2Nlc3MuICovXG4gICAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9oYW1tZXJNYW5hZ2Vycykge1xuICAgICAgICAgICAgaXRlbS5tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oYW1tZXJNYW5hZ2VycyA9IFtdO1xuICAgIH1cbn1cbiJdfQ==