UNPKG

igniteui-angular

Version:

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

202 lines 18.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Inject, Injectable, NgZone } from '@angular/core'; import { DOCUMENT, ɵgetDOM as getDOM } from '@angular/platform-browser'; /** @type {?} */ const 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 */ export class HammerGesturesManager { /** * @param {?} _zone * @param {?} doc */ constructor(_zone, doc) { this._zone = _zone; this.doc = doc; /** * Event option defaults for each recognizer, see http://hammerjs.github.io/api/ for API listing. */ 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.Pinch, { enable: true }], [Hammer.Rotate, { enable: true }], [Hammer.Swipe, { direction: Hammer.DIRECTION_HORIZONTAL }] ] }; this._hammerManagers = []; } /** * @param {?} eventName * @return {?} */ supports(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. * @param {?} element * @param {?} eventName * @param {?} eventHandler * @param {?=} options * @return {?} */ addEventListener(element, eventName, eventHandler, options = null) { // Creating the manager bind events, must be done outside of angular return this._zone.runOutsideAngular(() => { /** @type {?} */ let mc = this.getManagerForElement(element); if (mc === null) { // new Hammer is a shortcut for Manager with defaults mc = new Hammer(element, this.hammerOptions); this.addManagerForElement(element, mc); } /** @type {?} */ const handler = (eventObj) => { this._zone.run(() => { eventHandler(eventObj); }); }; mc.on(eventName, handler); return () => { 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). * @param {?} eventName * @param {?} eventHandler * @return {?} */ addGlobalEventListener(target, eventName, eventHandler) { /** @type {?} */ const element = this.getGlobalEventTarget(target); // Creating the manager bind events, must be done outside of angular return this.addEventListener((/** @type {?} */ (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 * @return {?} */ getGlobalEventTarget(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 }); * ``` * @param {?} event * @param {?} options * @return {?} */ setManagerOption(element, event, options) { /** @type {?} */ const 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. * @param {?} manager * @return {?} */ addManagerForElement(element, manager) { this._hammerManagers.push({ element, manager }); } /** * Get HammerManager for the element or null * * @param {?} element The DOM element used to create the manager on. * @return {?} */ getManagerForElement(element) { /** @type {?} */ const result = this._hammerManagers.filter((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. * @return {?} */ removeManagerForElement(element) { /** @type {?} */ let index = null; for (let i = 0; i < this._hammerManagers.length; i++) { if (element === this._hammerManagers[i].element) { index = i; break; } } if (index !== null) { /** @type {?} */ const item = this._hammerManagers.splice(index, 1)[0]; // destroy also item.manager.destroy(); } } /** * Destroys all internally tracked HammerManagers, removing event listeners in the process. * @return {?} */ destroy() { for (const item of this._hammerManagers) { item.manager.destroy(); } this._hammerManagers = []; } } HammerGesturesManager.decorators = [ { type: Injectable } ]; /** @nocollapse */ HammerGesturesManager.ctorParameters = () => [ { type: NgZone }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; if (false) { /** * Event option defaults for each recognizer, see http://hammerjs.github.io/api/ for API listing. * @type {?} * @protected */ HammerGesturesManager.prototype.hammerOptions; /** * @type {?} * @private */ HammerGesturesManager.prototype._hammerManagers; /** * @type {?} * @private */ HammerGesturesManager.prototype._zone; /** * @type {?} * @private */ HammerGesturesManager.prototype.doc; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91Y2guanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2NvcmUvdG91Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sSUFBSSxNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7TUFFbEUsWUFBWSxHQUFHLFNBQVM7Ozs7OztBQVE5QixNQUFNLE9BQU8scUJBQXFCOzs7OztJQW9COUIsWUFBb0IsS0FBYSxFQUE0QixHQUFRO1FBQWpELFVBQUssR0FBTCxLQUFLLENBQVE7UUFBNEIsUUFBRyxHQUFILEdBQUcsQ0FBSzs7OztRQWhCM0Qsa0JBQWEsR0FBa0I7OztZQUdyQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsV0FBVyxFQUFFO2dCQUNULENBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBRTtnQkFDaEMsQ0FBRSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFFO2dCQUNsQyxDQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUU7Z0JBQ25DLENBQUUsTUFBTSxDQUFDLEtBQUssRUFBRTt3QkFDWixTQUFTLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtxQkFDekMsQ0FBQzthQUNMO1NBQ0osQ0FBQztRQUVNLG9CQUFlLEdBQTZELEVBQUUsQ0FBQztJQUd2RixDQUFDOzs7OztJQUVNLFFBQVEsQ0FBQyxTQUFpQjtRQUM3QixPQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Ozs7Ozs7Ozs7SUFNTSxnQkFBZ0Is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Q1Q7U0FDSjtRQUNELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTs7a0JBQ1YsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsZUFBZTtZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDOzs7OztJQUdNLE9BQU87UUFDVixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7OztZQXhJSixVQUFVOzs7O1lBVmtCLE1BQU07NENBK0JLLE1BQU0sU0FBQyxRQUFROzs7Ozs7OztJQWhCbkQsOENBWUU7Ozs7O0lBRUYsZ0RBQXVGOzs7OztJQUUzRSxzQ0FBcUI7Ozs7O0lBQUUsb0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5ULCDJtWdldERPTSBhcyBnZXRET00gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuY29uc3QgRVZFTlRfU1VGRklYID0gJ3ByZWNpc2UnO1xuXG4vKipcbiAqIFRvdWNoIGdlc3R1cmVzIG1hbmFnZXIgYmFzZWQgb24gSGFtbWVyLmpzXG4gKiBVc2Ugd2l0aCBjYXV0aW9uLCB0aGlzIHdpbGwgdHJhY2sgcmVmZXJlbmNlcyBmb3Igc2luZ2xlIG1hbmFnZXIgcGVyIGVsZW1lbnQuIFZlcnkgVEJELiBNdWNoIFRPRE8uXG4gKiBAaGlkZGVuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIYW1tZXJHZXN0dXJlc01hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IG9wdGlvbiBkZWZhdWx0cyBmb3IgZWFjaCByZWNvZ25pemVyLCBzZWUgaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9hcGkvIGZvciBBUEkgbGlzdGluZy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFtbWVyT3B0aW9uczogSGFtbWVyT3B0aW9ucyA9IHtcbiAgICAgICAgLy8gRC5QLiAjNDQ3IEZvcmNlIFRvdWNoSW5wdXQgZHVlIHRvIFBvaW50ZXJFdmVudElucHV0IGJ1ZyAoaHR0cHM6Ly9naXRodWIuY29tL2hhbW1lcmpzL2hhbW1lci5qcy9pc3N1ZXMvMTA2NSlcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9JZ25pdGVVSS9pZ25pdGV1aS1hbmd1bGFyL2lzc3Vlcy80NDcjaXNzdWVjb21tZW50LTMyNDYwMTgwM1xuICAgICAgICBpbnB1dENsYXNzOiBIYW1tZXIuVG91Y2hJbnB1dCxcbiAgICAgICAgcmVjb2duaXplcnM6IFtcbiAgICAgICAgICAgIFsgSGFtbWVyLlBhbiwgeyB0aHJlc2hvbGQ6IDAgfSBdLFxuICAgICAgICAgICAgWyBIYW1tZXIuUGluY2gsIHsgZW5hYmxlOiB0cnVlIH0gXSxcbiAgICAgICAgICAgIFsgSGFtbWVyLlJvdGF0ZSwgeyBlbmFibGU6IHRydWUgfSBdLFxuICAgICAgICAgICAgWyBIYW1tZXIuU3dpcGUsIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IEhhbW1lci5ESVJFQ1RJT05fSE9SSVpPTlRBTFxuICAgICAgICAgICAgfV1cbiAgICAgICAgXVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9oYW1tZXJNYW5hZ2VyczogQXJyYXk8eyBlbGVtZW50OiBFdmVudFRhcmdldCwgbWFuYWdlcjogSGFtbWVyTWFuYWdlcjsgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3pvbmU6IE5nWm9uZSwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0cyhldmVudE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy4nICsgRVZFTlRfU1VGRklYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGlzdGVuZXIgZXh0ZW5kZWQgd2l0aCBvcHRpb25zIGZvciBIYW1tZXIuanMuIFdpbGwgdXNlIGRlZmF1bHRzIGlmIG5vbmUgYXJlIHByb3ZpZGVkLlxuICAgICAqIE1vZGVsaW5nIGFmdGVyIG90aGVyIGV2ZW50IHBsdWdpbnMgZm9yIGVhc3kgZnV0dXJlIG1vZGlmaWNhdGlvbnMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyOiAoZXZlbnRPYmopID0+IHZvaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogb2JqZWN0ID0gbnVsbCk6ICgpID0+IHZvaWQge1xuXG4gICAgICAgIC8vIENyZWF0aW5nIHRoZSBtYW5hZ2VyIGJpbmQgZXZlbnRzLCBtdXN0IGJlIGRvbmUgb3V0c2lkZSBvZiBhbmd1bGFyXG4gICAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtYzogSGFtbWVyTWFuYWdlciA9IHRoaXMuZ2V0TWFuYWdlckZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAobWMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBuZXcgSGFtbWVyIGlzIGEgc2hvcnRjdXQgZm9yIE1hbmFnZXIgd2l0aCBkZWZhdWx0c1xuICAgICAgICAgICAgICAgIG1jID0gbmV3IEhhbW1lcihlbGVtZW50LCB0aGlzLmhhbW1lck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTWFuYWdlckZvckVsZW1lbnQoZWxlbWVudCwgbWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChldmVudE9iaikgPT4geyB0aGlzLl96b25lLnJ1bigoKSA9PiB7IGV2ZW50SGFuZGxlcihldmVudE9iaik7IH0pOyB9O1xuICAgICAgICAgICAgbWMub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IG1jLm9mZihldmVudE5hbWUsIGhhbmRsZXIpOyB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGlzdGVuZXIgZXh0ZW5kZWQgd2l0aCBvcHRpb25zIGZvciBIYW1tZXIuanMuIFdpbGwgdXNlIGRlZmF1bHRzIGlmIG5vbmUgYXJlIHByb3ZpZGVkLlxuICAgICAqIE1vZGVsaW5nIGFmdGVyIG90aGVyIGV2ZW50IHBsdWdpbnMgZm9yIGVhc3kgZnV0dXJlIG1vZGlmaWNhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IENhbiBiZSBvbmUgb2YgZWl0aGVyIHdpbmRvdywgYm9keSBvciBkb2N1bWVudChmYWxsYmFjayBkZWZhdWx0KS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQ6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcjogKGV2ZW50T2JqKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldCk7XG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIG1hbmFnZXIgYmluZCBldmVudHMsIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50IGFzIEhUTUxFbGVtZW50LCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3NlcyBbRG9tXUFkYXB0ZXIuZ2V0R2xvYmFsRXZlbnRUYXJnZXQgdG8gZ2V0IGdsb2JhbCBldmVudCB0YXJnZXRzLlxuICAgICAqIFN1cHBvcnRlZDogd2luZG93LCBkb2N1bWVudCwgYm9keS4gRGVmYXVsdHMgdG8gZG9jdW1lbnQgZm9yIGludmFsaWQgYXJncy5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldDogc3RyaW5nKTogRXZlbnRUYXJnZXQge1xuICAgICAgICByZXR1cm4gZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5kb2MsIHRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IEhhbW1lck1hbmFnZXIgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBET00gZWxlbWVudCB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFuYWdlciBvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIG1hbmFnZXIuc2V0TWFuYWdlck9wdGlvbihteUVsZW0sIFwicGFuXCIsIHsgcG9pbnRlcnM6IDEgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldE1hbmFnZXJPcHRpb24oZWxlbWVudDogRXZlbnRUYXJnZXQsIGV2ZW50OiBzdHJpbmcsIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgbWFuYWdlci5nZXQoZXZlbnQpLnNldChvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYW4gZWxlbWVudCBhbmQgbWFuYWdlciBtYXAgdG8gdGhlIGludGVybmFsIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgRE9NIGVsZW1lbnQgdXNlZCB0byBjcmVhdGUgdGhlIG1hbmFnZXIgb24uXG4gICAgICovXG4gICAgcHVibGljIGFkZE1hbmFnZXJGb3JFbGVtZW50KGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCBtYW5hZ2VyOiBIYW1tZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX2hhbW1lck1hbmFnZXJzLnB1c2goe2VsZW1lbnQsIG1hbmFnZXJ9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgSGFtbWVyTWFuYWdlciBmb3IgdGhlIGVsZW1lbnQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHVzZWQgdG8gY3JlYXRlIHRoZSBtYW5hZ2VyIG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50OiBFdmVudFRhcmdldCk6IEhhbW1lck1hbmFnZXIge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAgdGhpcy5faGFtbWVyTWFuYWdlcnMuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZWxlbWVudCA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID8gcmVzdWx0WzBdLm1hbmFnZXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBIYW1tZXJNYW5hZ2VyIGZvciB0aGUgZWxlbWVudCwgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzIGluIHRoZSBwcm9jZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHVzZWQgdG8gY3JlYXRlIHRoZSBtYW5hZ2VyIG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faGFtbWVyTWFuYWdlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSB0aGlzLl9oYW1tZXJNYW5hZ2Vyc1tpXS5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hhbW1lck1hbmFnZXJzLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgICAvLyBkZXN0cm95IGFsc29cbiAgICAgICAgICAgIGl0ZW0ubWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRGVzdHJveXMgYWxsIGludGVybmFsbHkgdHJhY2tlZCBIYW1tZXJNYW5hZ2VycywgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzIGluIHRoZSBwcm9jZXNzLiAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5faGFtbWVyTWFuYWdlcnMpIHtcbiAgICAgICAgICAgIGl0ZW0ubWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFtbWVyTWFuYWdlcnMgPSBbXTtcbiAgICB9XG59XG4iXX0=