sic-mapping-toolkit
Version:
SICMapping Toolkit es una biblioteca para Angular que permite la creación de aplicaciones de Web Mapping por medio de OpenLayers
186 lines • 23.8 kB
JavaScript
import VectorSource from "ol/source/Vector";
import VectorLayer from "ol/layer/Vector";
import cuid from "cuid";
import { MapEvents } from "./map-event-type.enum";
const HIGHLIGHT_ZINDEX = 1000;
const defaultOptions = {
hasHighlight: true,
hasSnap: false,
};
export class SICMap {
constructor(map, options) {
this.map = map;
this.id = options.id || cuid();
this.layers = [];
this.eventHandlers = {};
MapEvents.forEach((x) => {
this.eventHandlers[x] = [];
});
this.map.on(MapEvents, (evt) => {
if (this.eventHandlers[evt.type]) {
const special = this.eventHandlers[evt.type].filter((x) => x.priority === "SPECIAL");
const high = this.eventHandlers[evt.type].filter((x) => x.priority === "HIGH");
const normal = this.eventHandlers[evt.type].filter((x) => x.priority === "NORMAL");
const low = this.eventHandlers[evt.type].filter((x) => x.priority === "LOW");
if (high.length > 0) {
[...high, ...special].forEach((x) => x.fn(evt));
}
else if (normal.length > 0) {
[...normal, ...special].forEach((x) => x.fn(evt));
}
else {
[...low, ...special].forEach((x) => x.fn(evt));
}
}
});
if (options.hasHighlight) {
this.highlightSource = new VectorSource({ wrapX: true });
const highlightLayer = new VectorLayer({
source: this.highlightSource,
zIndex: HIGHLIGHT_ZINDEX,
});
this.map.addLayer(highlightLayer);
}
}
static initMap(map, options = {}) {
return new SICMap(map, Object.assign(Object.assign({}, defaultOptions), options));
}
get Id() {
return this.id;
}
// Métodos para capas
setBaseLayer(layer) {
this.baseLayer = layer;
this.baseLayer.Layer.setZIndex(-1);
this.map.addLayer(layer.Layer);
return this.baseLayer.Id;
}
clearBaseLayer() {
if (!!this.baseLayer) {
this.map.removeLayer(this.baseLayer.Layer);
this.baseLayer = null;
}
}
addLayer(layer) {
this.layers.push(layer);
this.map.addLayer(layer.Layer);
return layer.Id;
}
removeLayer(id) {
const layer = this.layers.find((l) => l.Id === id);
if (!!layer) {
this.map.removeLayer(layer.Layer);
}
this.layers = this.layers.filter((l) => l.Id !== id);
}
// Métodos para popup en el mapa (ol overlays)
addOverlay(popupOverlay) {
this.map.addOverlay(popupOverlay);
}
removeOverlay(popupOverlay) {
this.map.removeOverlay(popupOverlay);
}
// Manejo de Eventos
addEventHandler(eventType, handler, priority = "NORMAL") {
if (!this.eventHandlers[eventType]) {
this.eventHandlers[eventType] = [];
}
const key = eventType + "." + cuid();
const eventHandler = {
key,
priority,
fn: handler,
};
this.eventHandlers[eventType].push(eventHandler);
return key;
}
removeEventHandler(id) {
const evtType = id.split(".")[0];
const idx = this.eventHandlers[evtType].reduce((a, b, i) => (b.key === id ? i : a), -1);
if (idx === -1) {
return;
}
this.eventHandlers[evtType] = [
...this.eventHandlers[evtType].slice(0, idx),
...this.eventHandlers[evtType].slice(idx + 1),
];
}
// Métodos para agregar interacciones
addInteraction(interaction) {
this.map.addInteraction(interaction);
}
removeInteraction(interaction) {
this.map.removeInteraction(interaction);
}
// Métodos para agregar MapControls
addControl(control) {
this.map.addControl(control);
}
removeControl(control) {
this.map.removeControl(control);
}
// Métodos de dibujo
drawFeatures(features, style) {
if (!!this.highlightSource) {
features.forEach((f) => {
f.setStyle(style);
this.highlightSource.addFeature(f);
});
}
else {
throw new Error("No highlight source available");
}
}
clearFeatures(featureIdPrefix) {
if (!this.highlightSource) {
throw new Error("No highlight source available");
}
if (featureIdPrefix) {
this.highlightSource
.getFeatures()
.filter((f) => f.getId().toString().startsWith(featureIdPrefix))
.forEach((f) => this.highlightSource.removeFeature(f));
}
else {
this.highlightSource.clear();
}
}
// Métodos de la vista
getViewExtent() {
return this.map.getView().calculateExtent(this.map.getSize());
}
getViewResolution() {
return this.map.getView().getResolution();
}
moveTo(extent, animated = true) {
this.map.getView().fit(extent, {
duration: animated ? 500 : 0,
});
}
getZoom() {
return this.map.getView().getZoom();
}
setZoom(zoom, animated = true) {
if (animated) {
this.map.getView().animate({ zoom, duration: 500 });
}
else {
this.map.getView().setZoom(zoom);
}
}
getCenter() {
return this.map.getView().getCenter();
}
setCenter(center, animated = true) {
if (animated) {
this.map.getView().animate({ center, duration: 500 });
}
else {
this.map.getView().setCenter(center);
}
}
detectSizeChange() {
this.map.updateSize();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ljLW1hcHBpbmctdG9vbGtpdC9zcmMvbGliL21vZGVscy9tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxZQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFHMUMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFnQjlCLE1BQU0sY0FBYyxHQUFnQjtJQUNsQyxZQUFZLEVBQUUsSUFBSTtJQUNsQixPQUFPLEVBQUUsS0FBSztDQUNmLENBQUM7QUFFRixNQUFNLE9BQU8sTUFBTTtJQVdqQixZQUE0QixHQUFRLEVBQUUsT0FBb0I7UUFBOUIsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUNsQyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxD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SSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsU0FBUyxDQUFDLE1BQXdCLEVBQUUsUUFBUSxHQUFHLElBQUk7UUFDakQsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWFwIGZyb20gXCJvbC9NYXBcIjtcbmltcG9ydCBGZWF0dXJlIGZyb20gXCJvbC9GZWF0dXJlXCI7XG5pbXBvcnQgU3R5bGUgZnJvbSBcIm9sL3N0eWxlL1N0eWxlXCI7XG5pbXBvcnQgeyBPdmVybGF5LCBJbnRlcmFjdGlvbiB9IGZyb20gXCJvbFwiO1xuaW1wb3J0IHsgRXh0ZW50IH0gZnJvbSBcIm9sL2V4dGVudFwiO1xuaW1wb3J0IFZlY3RvclNvdXJjZSBmcm9tIFwib2wvc291cmNlL1ZlY3RvclwiO1xuaW1wb3J0IFZlY3RvckxheWVyIGZyb20gXCJvbC9sYXllci9WZWN0b3JcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJvbC9jb250cm9sL0NvbnRyb2xcIjtcbmltcG9ydCB7IFNJQ0xheWVyIH0gZnJvbSBcIi4vbGF5ZXJcIjtcbmltcG9ydCBjdWlkIGZyb20gXCJjdWlkXCI7XG5cbmltcG9ydCB7IE1hcEV2ZW50VHlwZSwgTWFwRXZlbnRzIH0gZnJvbSBcIi4vbWFwLWV2ZW50LXR5cGUuZW51bVwiO1xuXG5jb25zdCBISUdITElHSFRfWklOREVYID0gMTAwMDtcblxuaW50ZXJmYWNlIE1hcGFPcHRpb25zIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIGhhc0hpZ2hsaWdodD86IGJvb2xlYW47XG4gIGhhc1NuYXA/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBNYXBFdmVudEhhbmRsZXJQcmlvcml0eSA9IFwiTE9XXCIgfCBcIk5PUk1BTFwiIHwgXCJISUdIXCIgfCBcIlNQRUNJQUxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNYXBhRXZlbnRIYW5kbGVyIHtcbiAga2V5OiBzdHJpbmc7XG4gIHByaW9yaXR5OiBNYXBFdmVudEhhbmRsZXJQcmlvcml0eTtcbiAgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE1hcGFPcHRpb25zID0ge1xuICBoYXNIaWdobGlnaHQ6IHRydWUsXG4gIGhhc1NuYXA6IGZhbHNlLFxufTtcblxuZXhwb3J0IGNsYXNzIFNJQ01hcCB7XG4gIHByaXZhdGUgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBoaWdobGlnaHRTb3VyY2U6IFZlY3RvclNvdXJjZTtcbiAgcHJpdmF0ZSBldmVudEhhbmRsZXJzOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PE1hcGFFdmVudEhhbmRsZXI+IH07XG4gIHByaXZhdGUgYmFzZUxheWVyOiBTSUNMYXllcjtcbiAgcHJpdmF0ZSBsYXllcnM6IEFycmF5PFNJQ0xheWVyPjtcblxuICBwdWJsaWMgc3RhdGljIGluaXRNYXAobWFwOiBNYXAsIG9wdGlvbnM6IE1hcGFPcHRpb25zID0ge30pOiBTSUNNYXAge1xuICAgIHJldHVybiBuZXcgU0lDTWFwKG1hcCwgeyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSBtYXA6IE1hcCwgb3B0aW9uczogTWFwYU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCB8fCBjdWlkKCk7XG4gICAgdGhpcy5sYXllcnMgPSBbXTtcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSB7fTtcbiAgICBNYXBFdmVudHMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgdGhpcy5ldmVudEhhbmRsZXJzW3hdID0gW107XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5vbihNYXBFdmVudHMsIChldnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmV2ZW50SGFuZGxlcnNbZXZ0LnR5cGVdKSB7XG4gICAgICAgIGNvbnN0IHNwZWNpYWwgPSB0aGlzLmV2ZW50SGFuZGxlcnNbZXZ0LnR5cGVdLmZpbHRlcihcbiAgICAgICAgICAoeCkgPT4geC5wcmlvcml0eSA9PT0gXCJTUEVDSUFMXCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaGlnaCA9IHRoaXMuZXZlbnRIYW5kbGVyc1tldnQudHlwZV0uZmlsdGVyKFxuICAgICAgICAgICh4KSA9PiB4LnByaW9yaXR5ID09PSBcIkhJR0hcIlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBub3JtYWwgPSB0aGlzLmV2ZW50SGFuZGxlcnNbZXZ0LnR5cGVdLmZpbHRlcihcbiAgICAgICAgICAoeCkgPT4geC5wcmlvcml0eSA9PT0gXCJOT1JNQUxcIlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBsb3cgPSB0aGlzLmV2ZW50SGFuZGxlcnNbZXZ0LnR5cGVdLmZpbHRlcihcbiAgICAgICAgICAoeCkgPT4geC5wcmlvcml0eSA9PT0gXCJMT1dcIlxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChoaWdoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBbLi4uaGlnaCwgLi4uc3BlY2lhbF0uZm9yRWFjaCgoeCkgPT4geC5mbihldnQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChub3JtYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIFsuLi5ub3JtYWwsIC4uLnNwZWNpYWxdLmZvckVhY2goKHgpID0+IHguZm4oZXZ0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgWy4uLmxvdywgLi4uc3BlY2lhbF0uZm9yRWFjaCgoeCkgPT4geC5mbihldnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuaGFzSGlnaGxpZ2h0KSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodFNvdXJjZSA9IG5ldyBWZWN0b3JTb3VyY2UoeyB3cmFwWDogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IGhpZ2hsaWdodExheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICAgICAgc291cmNlOiB0aGlzLmhpZ2hsaWdodFNvdXJjZSxcbiAgICAgICAgekluZGV4OiBISUdITElHSFRfWklOREVYLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcC5hZGRMYXllcihoaWdobGlnaHRMYXllcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cblxuICAvLyBNw6l0b2RvcyBwYXJhIGNhcGFzXG4gIHNldEJhc2VMYXllcihsYXllcjogU0lDTGF5ZXIpIHtcbiAgICB0aGlzLmJhc2VMYXllciA9IGxheWVyO1xuICAgIHRoaXMuYmFzZUxheWVyLkxheWVyLnNldFpJbmRleCgtMSk7XG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIobGF5ZXIuTGF5ZXIpO1xuICAgIHJldHVybiB0aGlzLmJhc2VMYXllci5JZDtcbiAgfVxuXG4gIGNsZWFyQmFzZUxheWVyKCkge1xuICAgIGlmICghIXRoaXMuYmFzZUxheWVyKSB7XG4gICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzLmJhc2VMYXllci5MYXllcik7XG4gICAgICB0aGlzLmJhc2VMYXllciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYWRkTGF5ZXIobGF5ZXI6IFNJQ0xheWVyKSB7XG4gICAgdGhpcy5sYXllcnMucHVzaChsYXllcik7XG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIobGF5ZXIuTGF5ZXIpO1xuICAgIHJldHVybiBsYXllci5JZDtcbiAgfVxuXG4gIHJlbW92ZUxheWVyKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzLmZpbmQoKGwpID0+IGwuSWQgPT09IGlkKTtcbiAgICBpZiAoISFsYXllcikge1xuICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIobGF5ZXIuTGF5ZXIpO1xuICAgIH1cbiAgICB0aGlzLmxheWVycyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5JZCAhPT0gaWQpO1xuICB9XG5cbiAgLy8gTcOpdG9kb3MgcGFyYSBwb3B1cCBlbiBlbCBtYXBhIChvbCBvdmVybGF5cylcbiAgYWRkT3ZlcmxheShwb3B1cE92ZXJsYXk6IE92ZXJsYXkpIHtcbiAgICB0aGlzLm1hcC5hZGRPdmVybGF5KHBvcHVwT3ZlcmxheSk7XG4gIH1cblxuICByZW1vdmVPdmVybGF5KHBvcHVwT3ZlcmxheTogT3ZlcmxheSkge1xuICAgIHRoaXMubWFwLnJlbW92ZU92ZXJsYXkocG9wdXBPdmVybGF5KTtcbiAgfVxuXG4gIC8vIE1hbmVqbyBkZSBFdmVudG9zXG4gIGFkZEV2ZW50SGFuZGxlcihcbiAgICBldmVudFR5cGU6IE1hcEV2ZW50VHlwZSxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQsXG4gICAgcHJpb3JpdHk6IE1hcEV2ZW50SGFuZGxlclByaW9yaXR5ID0gXCJOT1JNQUxcIlxuICApOiBhbnkge1xuICAgIGlmICghdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50VHlwZV0pIHtcbiAgICAgIHRoaXMuZXZlbnRIYW5kbGVyc1tldmVudFR5cGVdID0gW107XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gZXZlbnRUeXBlICsgXCIuXCIgKyBjdWlkKCk7XG4gICAgY29uc3QgZXZlbnRIYW5kbGVyOiBNYXBhRXZlbnRIYW5kbGVyID0ge1xuICAgICAga2V5LFxuICAgICAgcHJpb3JpdHksXG4gICAgICBmbjogaGFuZGxlcixcbiAgICB9O1xuXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50VHlwZV0ucHVzaChldmVudEhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50SGFuZGxlcihpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZ0VHlwZSA9IGlkLnNwbGl0KFwiLlwiKVswXTtcbiAgICBjb25zdCBpZHggPSB0aGlzLmV2ZW50SGFuZGxlcnNbZXZ0VHlwZV0ucmVkdWNlKFxuICAgICAgKGEsIGIsIGkpID0+IChiLmtleSA9PT0gaWQgPyBpIDogYSksXG4gICAgICAtMVxuICAgICk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRIYW5kbGVyc1tldnRUeXBlXSA9IFtcbiAgICAgIC4uLnRoaXMuZXZlbnRIYW5kbGVyc1tldnRUeXBlXS5zbGljZSgwLCBpZHgpLFxuICAgICAgLi4udGhpcy5ldmVudEhhbmRsZXJzW2V2dFR5cGVdLnNsaWNlKGlkeCArIDEpLFxuICAgIF07XG4gIH1cblxuICAvLyBNw6l0b2RvcyBwYXJhIGFncmVnYXIgaW50ZXJhY2Npb25lc1xuICBhZGRJbnRlcmFjdGlvbihpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24pIHtcbiAgICB0aGlzLm1hcC5hZGRJbnRlcmFjdGlvbihpbnRlcmFjdGlvbik7XG4gIH1cblxuICByZW1vdmVJbnRlcmFjdGlvbihpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24pIHtcbiAgICB0aGlzLm1hcC5yZW1vdmVJbnRlcmFjdGlvbihpbnRlcmFjdGlvbik7XG4gIH1cblxuICAvLyBNw6l0b2RvcyBwYXJhIGFncmVnYXIgTWFwQ29udHJvbHNcbiAgYWRkQ29udHJvbChjb250cm9sOiBDb250cm9sKSB7XG4gICAgdGhpcy5tYXAuYWRkQ29udHJvbChjb250cm9sKTtcbiAgfVxuXG4gIHJlbW92ZUNvbnRyb2woY29udHJvbDogQ29udHJvbCkge1xuICAgIHRoaXMubWFwLnJlbW92ZUNvbnRyb2woY29udHJvbCk7XG4gIH1cblxuICAvLyBNw6l0b2RvcyBkZSBkaWJ1am9cbiAgZHJhd0ZlYXR1cmVzKGZlYXR1cmVzOiBBcnJheTxGZWF0dXJlPiwgc3R5bGU/OiBTdHlsZSkge1xuICAgIGlmICghIXRoaXMuaGlnaGxpZ2h0U291cmNlKSB7XG4gICAgICBmZWF0dXJlcy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgIGYuc2V0U3R5bGUoc3R5bGUpO1xuICAgICAgICB0aGlzLmhpZ2hsaWdodFNvdXJjZS5hZGRGZWF0dXJlKGYpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGhpZ2hsaWdodCBzb3VyY2UgYXZhaWxhYmxlXCIpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRmVhdHVyZXMoZmVhdHVyZUlkUHJlZml4OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0U291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBoaWdobGlnaHQgc291cmNlIGF2YWlsYWJsZVwiKTtcbiAgICB9XG5cbiAgICBpZiAoZmVhdHVyZUlkUHJlZml4KSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodFNvdXJjZVxuICAgICAgICAuZ2V0RmVhdHVyZXMoKVxuICAgICAgICAuZmlsdGVyKChmKSA9PiBmLmdldElkKCkudG9TdHJpbmcoKS5zdGFydHNXaXRoKGZlYXR1cmVJZFByZWZpeCkpXG4gICAgICAgIC5mb3JFYWNoKChmKSA9PiB0aGlzLmhpZ2hsaWdodFNvdXJjZS5yZW1vdmVGZWF0dXJlKGYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWdobGlnaHRTb3VyY2UuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyBNw6l0b2RvcyBkZSBsYSB2aXN0YVxuICBnZXRWaWV3RXh0ZW50KCkge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXRWaWV3KCkuY2FsY3VsYXRlRXh0ZW50KHRoaXMubWFwLmdldFNpemUoKSk7XG4gIH1cblxuICBnZXRWaWV3UmVzb2x1dGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0VmlldygpLmdldFJlc29sdXRpb24oKTtcbiAgfVxuXG4gIG1vdmVUbyhleHRlbnQ6IEV4dGVudCwgYW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgdGhpcy5tYXAuZ2V0VmlldygpLmZpdChleHRlbnQsIHtcbiAgICAgIGR1cmF0aW9uOiBhbmltYXRlZCA/IDUwMCA6IDAsXG4gICAgfSk7XG4gIH1cblxuICBnZXRab29tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldFZpZXcoKS5nZXRab29tKCk7XG4gIH1cblxuICBzZXRab29tKHpvb206IG51bWJlciwgYW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgaWYgKGFuaW1hdGVkKSB7XG4gICAgICB0aGlzLm1hcC5nZXRWaWV3KCkuYW5pbWF0ZSh7IHpvb20sIGR1cmF0aW9uOiA1MDAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFwLmdldFZpZXcoKS5zZXRab29tKHpvb20pO1xuICAgIH1cbiAgfVxuXG4gIGdldENlbnRlcigpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0VmlldygpLmdldENlbnRlcigpO1xuICB9XG5cbiAgc2V0Q2VudGVyKGNlbnRlcjogW251bWJlciwgbnVtYmVyXSwgYW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgaWYgKGFuaW1hdGVkKSB7XG4gICAgICB0aGlzLm1hcC5nZXRWaWV3KCkuYW5pbWF0ZSh7IGNlbnRlciwgZHVyYXRpb246IDUwMCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXAuZ2V0VmlldygpLnNldENlbnRlcihjZW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIGRldGVjdFNpemVDaGFuZ2UoKSB7XG4gICAgdGhpcy5tYXAudXBkYXRlU2l6ZSgpO1xuICB9XG59XG4iXX0=