@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
157 lines • 19.3 kB
JavaScript
import { __decorate, __metadata, __param } 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';
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
*/
let HammerGesturesManager = class HammerGesturesManager {
constructor(_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']]
]
};
}
}
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.
*/
addEventListener(element, eventName, eventHandler, options = null) {
if (!this.platformBrowser) {
return;
}
// Creating the manager bind events, must be done outside of angular
return this._zone.runOutsideAngular(() => {
let 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);
}
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).
*/
addGlobalEventListener(target, eventName, eventHandler) {
if (!this.platformBrowser) {
return;
}
const 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
*/
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 });
* ```
*/
setManagerOption(element, event, options) {
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.
*/
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.
*/
getManagerForElement(element) {
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.
*/
removeManagerForElement(element) {
let index = null;
for (let i = 0; i < this._hammerManagers.length; i++) {
if (element === this._hammerManagers[i].element) {
index = i;
break;
}
}
if (index !== null) {
const item = this._hammerManagers.splice(index, 1)[0];
// destroy also
item.manager.destroy();
}
}
/** Destroys all internally tracked HammerManagers, removing event listeners in the process. */
destroy() {
for (const item of this._hammerManagers) {
item.manager.destroy();
}
this._hammerManagers = [];
}
};
HammerGesturesManager.ctorParameters = () => [
{ 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);
export { HammerGesturesManager };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91Y2guanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2NvcmUvdG91Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQztBQUUvQjs7OztHQUlHO0FBRUgsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFTOUIsWUFBb0IsS0FBYSxFQUE0QixHQUFRLEVBQVUsWUFBMEI7UUFBckYsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUE0QixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFQekc7O1dBRUc7UUFDTyxrQkFBYSxHQUFrQixFQUFFLENBQUM7UUFFcEMsb0JBQWUsR0FBNkQsRUFBRSxDQUFDO1FBR25GLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUc7Z0JBQ2pCLDhHQUE4RztnQkFDOUcscUZBQXFGO2dCQUNyRixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLFdBQVcsRUFBRTtvQkFDVCxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTs0QkFDWCxTQUFTLEVBQUUsTUFBTSxDQUFDLG9CQUFv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TTs0Q0FBRyxNQUFNLFNBQUMsUUFBUTtZQUEwQyxZQUFZOztBQVRoRyxxQkFBcUI7SUFEakMsVUFBVSxFQUFFO0lBVTJCLFdBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO3FDQUF6QixNQUFNLFVBQTRELFlBQVk7R0FUaEcscUJBQXFCLENBcUpqQztTQXJKWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgybVnZXRET00gYXMgZ2V0RE9NIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgRVZFTlRfU1VGRklYID0gJ3ByZWNpc2UnO1xuXG4vKipcbiAqIFRvdWNoIGdlc3R1cmVzIG1hbmFnZXIgYmFzZWQgb24gSGFtbWVyLmpzXG4gKiBVc2Ugd2l0aCBjYXV0aW9uLCB0aGlzIHdpbGwgdHJhY2sgcmVmZXJlbmNlcyBmb3Igc2luZ2xlIG1hbmFnZXIgcGVyIGVsZW1lbnQuIFZlcnkgVEJELiBNdWNoIFRPRE8uXG4gKiBAaGlkZGVuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIYW1tZXJHZXN0dXJlc01hbmFnZXIge1xuICAgIHByaXZhdGUgcGxhdGZvcm1Ccm93c2VyOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IG9wdGlvbiBkZWZhdWx0cyBmb3IgZWFjaCByZWNvZ25pemVyLCBzZWUgaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9hcGkvIGZvciBBUEkgbGlzdGluZy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFtbWVyT3B0aW9uczogSGFtbWVyT3B0aW9ucyA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfaGFtbWVyTWFuYWdlcnM6IEFycmF5PHsgZWxlbWVudDogRXZlbnRUYXJnZXQsIG1hbmFnZXI6IEhhbW1lck1hbmFnZXI7IH0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF96b25lOiBOZ1pvbmUsIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnksIHByaXZhdGUgcGxhdGZvcm1VdGlsOiBQbGF0Zm9ybVV0aWwpIHtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybUJyb3dzZXIgPSB0aGlzLnBsYXRmb3JtVXRpbC5pc0Jyb3dzZXI7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtQnJvd3Nlcikge1xuICAgICAgICAgICAgdGhpcy5oYW1tZXJPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIEQuUC4gIzQ0NyBGb3JjZSBUb3VjaElucHV0IGR1ZSB0byBQb2ludGVyRXZlbnRJbnB1dCBidWcgKGh0dHBzOi8vZ2l0aHViLmNvbS9oYW1tZXJqcy9oYW1tZXIuanMvaXNzdWVzLzEwNjUpXG4gICAgICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9JZ25pdGVVSS9pZ25pdGV1aS1hbmd1bGFyL2lzc3Vlcy80NDcjaXNzdWVjb21tZW50LTMyNDYwMTgwM1xuICAgICAgICAgICAgICAgIGlucHV0Q2xhc3M6IEhhbW1lci5Ub3VjaElucHV0LFxuICAgICAgICAgICAgICAgIHJlY29nbml6ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIFtIYW1tZXIuUGFuLCB7IHRocmVzaG9sZDogMCB9XSxcbiAgICAgICAgICAgICAgICAgICAgW0hhbW1lci5Td2lwZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBIYW1tZXIuRElSRUNUSU9OX0hPUklaT05UQUxcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgICAgIFtIYW1tZXIuVGFwXSxcbiAgICAgICAgICAgICAgICAgICAgW0hhbW1lci5UYXAsIHsgZXZlbnQ6ICdkb3VibGV0YXAnLCB0YXBzOiAyIH0sIFsndGFwJ11dXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0cyhldmVudE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy4nICsgRVZFTlRfU1VGRklYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGlzdGVuZXIgZXh0ZW5kZWQgd2l0aCBvcHRpb25zIGZvciBIYW1tZXIuanMuIFdpbGwgdXNlIGRlZmF1bHRzIGlmIG5vbmUgYXJlIHByb3ZpZGVkLlxuICAgICAqIE1vZGVsaW5nIGFmdGVyIG90aGVyIGV2ZW50IHBsdWdpbnMgZm9yIGVhc3kgZnV0dXJlIG1vZGlmaWNhdGlvbnMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICBldmVudE5hbWU6IHN0cmluZyxcbiAgICAgICAgZXZlbnRIYW5kbGVyOiAoZXZlbnRPYmopID0+IHZvaWQsXG4gICAgICAgIG9wdGlvbnM6IEhhbW1lck9wdGlvbnMgPSBudWxsKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wbGF0Zm9ybUJyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0aW5nIHRoZSBtYW5hZ2VyIGJpbmQgZXZlbnRzLCBtdXN0IGJlIGRvbmUgb3V0c2lkZSBvZiBhbmd1bGFyXG4gICAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtYzogSGFtbWVyTWFuYWdlciA9IHRoaXMuZ2V0TWFuYWdlckZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAobWMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBuZXcgSGFtbWVyIGlzIGEgc2hvcnRjdXQgZm9yIE1hbmFnZXIgd2l0aCBkZWZhdWx0c1xuICAgICAgICAgICAgICAgIG1jID0gbmV3IEhhbW1lcihlbGVtZW50LCBPYmplY3QuYXNzaWduKHRoaXMuaGFtbWVyT3B0aW9ucywgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTWFuYWdlckZvckVsZW1lbnQoZWxlbWVudCwgbWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChldmVudE9iaikgPT4geyB0aGlzLl96b25lLnJ1bigoKSA9PiB7IGV2ZW50SGFuZGxlcihldmVudE9iaik7IH0pOyB9O1xuICAgICAgICAgICAgbWMub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IG1jLm9mZihldmVudE5hbWUsIGhhbmRsZXIpOyB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGlzdGVuZXIgZXh0ZW5kZWQgd2l0aCBvcHRpb25zIGZvciBIYW1tZXIuanMuIFdpbGwgdXNlIGRlZmF1bHRzIGlmIG5vbmUgYXJlIHByb3ZpZGVkLlxuICAgICAqIE1vZGVsaW5nIGFmdGVyIG90aGVyIGV2ZW50IHBsdWdpbnMgZm9yIGVhc3kgZnV0dXJlIG1vZGlmaWNhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IENhbiBiZSBvbmUgb2YgZWl0aGVyIHdpbmRvdywgYm9keSBvciBkb2N1bWVudChmYWxsYmFjayBkZWZhdWx0KS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQ6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcjogKGV2ZW50T2JqKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wbGF0Zm9ybUJyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldCk7XG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIG1hbmFnZXIgYmluZCBldmVudHMsIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50IGFzIEhUTUxFbGVtZW50LCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3NlcyBbRG9tXUFkYXB0ZXIuZ2V0R2xvYmFsRXZlbnRUYXJnZXQgdG8gZ2V0IGdsb2JhbCBldmVudCB0YXJnZXRzLlxuICAgICAqIFN1cHBvcnRlZDogd2luZG93LCBkb2N1bWVudCwgYm9keS4gRGVmYXVsdHMgdG8gZG9jdW1lbnQgZm9yIGludmFsaWQgYXJncy5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldDogc3RyaW5nKTogRXZlbnRUYXJnZXQge1xuICAgICAgICByZXR1cm4gZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5kb2MsIHRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IEhhbW1lck1hbmFnZXIgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBET00gZWxlbWVudCB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFuYWdlciBvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIG1hbmFnZXIuc2V0TWFuYWdlck9wdGlvbihteUVsZW0sIFwicGFuXCIsIHsgcG9pbnRlcnM6IDEgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldE1hbmFnZXJPcHRpb24oZWxlbWVudDogRXZlbnRUYXJnZXQsIGV2ZW50OiBzdHJpbmcsIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgbWFuYWdlci5nZXQoZXZlbnQpLnNldChvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYW4gZWxlbWVudCBhbmQgbWFuYWdlciBtYXAgdG8gdGhlIGludGVybmFsIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgRE9NIGVsZW1lbnQgdXNlZCB0byBjcmVhdGUgdGhlIG1hbmFnZXIgb24uXG4gICAgICovXG4gICAgcHVibGljIGFkZE1hbmFnZXJGb3JFbGVtZW50KGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCBtYW5hZ2VyOiBIYW1tZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX2hhbW1lck1hbmFnZXJzLnB1c2goe2VsZW1lbnQsIG1hbmFnZXJ9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgSGFtbWVyTWFuYWdlciBmb3IgdGhlIGVsZW1lbnQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHVzZWQgdG8gY3JlYXRlIHRoZSBtYW5hZ2VyIG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50OiBFdmVudFRhcmdldCk6IEhhbW1lck1hbmFnZXIge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAgdGhpcy5faGFtbWVyTWFuYWdlcnMuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZWxlbWVudCA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID8gcmVzdWx0WzBdLm1hbmFnZXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBIYW1tZXJNYW5hZ2VyIGZvciB0aGUgZWxlbWVudCwgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzIGluIHRoZSBwcm9jZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHVzZWQgdG8gY3JlYXRlIHRoZSBtYW5hZ2VyIG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faGFtbWVyTWFuYWdlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSB0aGlzLl9oYW1tZXJNYW5hZ2Vyc1tpXS5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hhbW1lck1hbmFnZXJzLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgICAvLyBkZXN0cm95IGFsc29cbiAgICAgICAgICAgIGl0ZW0ubWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRGVzdHJveXMgYWxsIGludGVybmFsbHkgdHJhY2tlZCBIYW1tZXJNYW5hZ2VycywgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzIGluIHRoZSBwcm9jZXNzLiAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5faGFtbWVyTWFuYWdlcnMpIHtcbiAgICAgICAgICAgIGl0ZW0ubWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFtbWVyTWFuYWdlcnMgPSBbXTtcbiAgICB9XG59XG4iXX0=