UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

171 lines 20.4 kB
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==