kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
215 lines (174 loc) • 21.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getTileData = getTileData;
exports.decodeTile = decodeTile;
exports.vectorTileFeatureToProp = vectorTileFeatureToProp;
var _pbf = _interopRequireDefault(require("pbf"));
var _vectorTile = require("@mapbox/vector-tile");
var _viewportMercatorProject = require("viewport-mercator-project");
// Copyright (c) 2019 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
/* global fetch process */
var TILE_SIZE = 512;
var MAPBOX_TOKEN = 'pk.eyJ1IjoidHVzaGVldCIsImEiOiJjamd3c2Jwdm0xZDJmMndwZGU1OHdvY2prIn0.YwS7ngyYFXDnRYodIV0J4Q';
function getTileData(_ref) {
var x = _ref.x,
y = _ref.y,
z = _ref.z;
var mapSource = "https://a.tiles.mapbox.com/v4/mapbox.mapbox-streets-v7/".concat(z, "/").concat(x, "/").concat(y, ".vector.pbf?access_token=").concat(MAPBOX_TOKEN);
return fetch(mapSource).then(function (response) {
return response.arrayBuffer();
}).then(function (buffer) {
var data = decodeTile(x, y, z, buffer);
return data;
});
}
function decodeTile(x, y, z, arrayBuffer) {
var tile = new _vectorTile.VectorTile(new _pbf["default"](arrayBuffer));
var result = [];
var xProj = x * TILE_SIZE;
var yProj = y * TILE_SIZE;
var scale = Math.pow(2, z);
var projectFunc = project.bind(null, xProj, yProj, scale);
/* eslint-disable guard-for-in */
var layerName = 'building';
var vectorTileLayer = tile.layers[layerName];
if (!vectorTileLayer) {
return [];
}
for (var i = 0; i < vectorTileLayer.length; i++) {
var vectorTileFeature = vectorTileLayer.feature(i);
var features = vectorTileFeatureToProp(vectorTileFeature, projectFunc);
features.forEach(function (f) {
f.properties.layer = layerName;
if (f.properties.height) {
result.push(f);
}
});
}
return result;
}
function project(x, y, scale, line, extent) {
var sizeToPixel = extent / TILE_SIZE;
for (var ii = 0; ii < line.length; ii++) {
var p = line[ii]; // LNGLAT
line[ii] = (0, _viewportMercatorProject.worldToLngLat)([x + p[0] / sizeToPixel, y + p[1] / sizeToPixel], scale);
}
}
/* adapted from @mapbox/vector-tile/lib/vectortilefeature.js for better perf */
/* eslint-disable */
function vectorTileFeatureToProp(vectorTileFeature, project) {
var coords = getCoordinates(vectorTileFeature);
var type = _vectorTile.VectorTileFeature.types[vectorTileFeature.type];
var extent = vectorTileFeature.extent;
var i;
var j;
coords = classifyRings(coords);
for (i = 0; i < coords.length; i++) {
for (j = 0; j < coords[i].length; j++) {
project(coords[i][j], extent);
}
}
return coords.map(function (coordinates) {
return {
coordinates: coordinates,
properties: vectorTileFeature.properties
};
});
}
function getCoordinates(vectorTileFeature) {
var pbf = vectorTileFeature._pbf;
pbf.pos = vectorTileFeature._geometry;
var end = pbf.readVarint() + pbf.pos;
var cmd = 1;
var length = 0;
var x = 0;
var y = 0;
var lines = [];
var line;
while (pbf.pos < end) {
if (length <= 0) {
var cmdLen = pbf.readVarint();
cmd = cmdLen & 0x7;
length = cmdLen >> 3;
}
length--;
if (cmd === 1 || cmd === 2) {
x += pbf.readSVarint();
y += pbf.readSVarint();
if (cmd === 1) {
// moveTo
if (line) lines.push(line);
line = [];
}
line.push([x, y]);
} else if (cmd === 7) {
// Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
if (line) {
line.push(line[0].slice()); // closePolygon
}
} else {
throw new Error("unknown command ".concat(cmd));
}
}
if (line) lines.push(line);
return lines;
} // classifies an array of rings into polygons with outer rings and holes
function classifyRings(rings) {
var len = rings.length;
if (len <= 1) return [rings];
var polygons = [];
var polygon;
var ccw;
for (var i = 0; i < len; i++) {
var area = signedArea(rings[i]);
if (area === 0) {
continue;
}
if (ccw === undefined) {
ccw = area < 0;
}
if (ccw === area < 0) {
if (polygon) {
polygons.push(polygon);
}
polygon = [rings[i]];
} else {
polygon.push(rings[i]);
}
}
if (polygon) {
polygons.push(polygon);
}
return polygons;
}
function signedArea(ring) {
var sum = 0;
for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
p1 = ring[i];
p2 = ring[j];
sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);
}
return sum;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzLzNkLWJ1aWxkaW5nLWxheWVyLzNkLWJ1aWxkaW5nLXV0aWxzLmpzIl0sIm5hbWVzIjpbIlRJTEVfU0laRSIsIk1BUEJPWF9UT0tFTiIsImdldFRpbGVEYXRhIiwieCIsInkiLCJ6IiwibWFwU291cmNlIiwiZmV0Y2giLCJ0aGVuIiwicmVzcG9uc2UiLCJhcnJheUJ1ZmZlciIsImJ1ZmZlciIsImRhdGEiLCJkZWNvZGVUaWxlIiwidGlsZSIsIlZlY3RvclRpbGUiLCJQcm90b2J1ZiIsInJlc3VsdCIsInhQcm9qIiwieVByb2oiLCJzY2FsZSIsIk1hdGgiLCJwb3ciLCJwcm9qZWN0RnVuYyIsInByb2plY3QiLCJiaW5kIiwibGF5ZXJOYW1lIiwidmVjdG9yVGlsZUxheWVyIiwibGF5ZXJzIiwiaSIsImxlbmd0aCIsInZlY3RvclRpbGVGZWF0dXJlIiwiZmVhdHVyZSIsImZlYXR1cmVzIiwidmVjdG9yVGlsZUZlYXR1cmVUb1Byb3AiLCJmb3JFYWNoIiwiZiIsInByb3BlcnRpZXMiLCJsYXllciIsImhlaWdodCIsInB1c2giLCJsaW5lIiwiZXh0ZW50Iiwic2l6ZVRvUGl4ZWwiLCJpaSIsInAiLCJjb29yZHMiLCJnZXRDb29yZGluYXRlcyIsInR5cGUiLCJWZWN0b3JUaWxlRmVhdHVyZSIsInR5cGVzIiwiaiIsImNsYXNzaWZ5UmluZ3MiLCJtYXAiLCJjb29yZGluYXRlcyIsInBiZiIsIl9wYmYiLCJwb3MiLCJfZ2VvbWV0cnkiLCJlbmQiLCJyZWFkVmFyaW50IiwiY21kIiwibGluZXMiLCJjbWRMZW4iLCJyZWFkU1ZhcmludCIsInNsaWNlIiwiRXJyb3IiLCJyaW5ncyIsImxlbiIsInBvbHlnb25zIiwicG9seWdvbiIsImNjdyIsImFyZWEiLCJzaWduZWRBcmVhIiwidW5kZWZpbmVkIiwicmluZyIsInN1bSIsInAxIiwicDIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQXRC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SUYsT0FBSixFQUFhO0FBQ1hELFFBQUFBLFFBQVEsQ0FBQzdCLElBQVQsQ0FBYzhCLE9BQWQ7QUFDRDs7QUFDREEsTUFBQUEsT0FBTyxHQUFHLENBQUNILEtBQUssQ0FBQ3RDLENBQUQsQ0FBTixDQUFWO0FBQ0QsS0FMRCxNQUtPO0FBQ0x5QyxNQUFBQSxPQUFPLENBQUM5QixJQUFSLENBQWEyQixLQUFLLENBQUN0QyxDQUFELENBQWxCO0FBQ0Q7QUFDRjs7QUFDRCxNQUFJeUMsT0FBSixFQUFhO0FBQ1hELElBQUFBLFFBQVEsQ0FBQzdCLElBQVQsQ0FBYzhCLE9BQWQ7QUFDRDs7QUFFRCxTQUFPRCxRQUFQO0FBQ0Q7O0FBRUQsU0FBU0ksVUFBVCxDQUFvQkUsSUFBcEIsRUFBMEI7QUFDeEIsTUFBSUMsR0FBRyxHQUFHLENBQVY7O0FBQ0EsT0FBSyxJQUFJL0MsQ0FBQyxHQUFHLENBQVIsRUFBV3VDLEdBQUcsR0FBR08sSUFBSSxDQUFDN0MsTUFBdEIsRUFBOEJxQixDQUFDLEdBQUdpQixHQUFHLEdBQUcsQ0FBeEMsRUFBMkNTLEVBQTNDLEVBQStDQyxFQUFwRCxFQUF3RGpELENBQUMsR0FBR3VDLEdBQTVELEVBQWlFakIsQ0FBQyxHQUFHdEIsQ0FBQyxFQUF0RSxFQUEwRTtBQUN4RWdELElBQUFBLEVBQUUsR0FBR0YsSUFBSSxDQUFDOUMsQ0FBRCxDQUFUO0FBQ0FpRCxJQUFBQSxFQUFFLEdBQUdILElBQUksQ0FBQ3hCLENBQUQsQ0FBVDtBQUNBeUIsSUFBQUEsR0FBRyxJQUFJLENBQUNFLEVBQUUsQ0FBQyxDQUFELENBQUYsR0FBUUQsRUFBRSxDQUFDLENBQUQsQ0FBWCxLQUFtQkEsRUFBRSxDQUFDLENBQUQsQ0FBRixHQUFRQyxFQUFFLENBQUMsQ0FBRCxDQUE3QixDQUFQO0FBQ0Q7O0FBQ0QsU0FBT0YsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5pbXBvcnQge1ZlY3RvclRpbGUsIFZlY3RvclRpbGVGZWF0dXJlfSBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmltcG9ydCB7d29ybGRUb0xuZ0xhdH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5cbi8qIGdsb2JhbCBmZXRjaCBwcm9jZXNzICovXG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7XG5jb25zdCBNQVBCT1hfVE9LRU4gPVxuICAncGsuZXlKMUlqb2lkSFZ6YUdWbGRDSXNJbUVpT2lKamFtZDNjMkp3ZG0weFpESm1NbmR3WkdVMU9IZHZZMnBySW4wLll3UzduZ3lZRlhEblJZb2RJVjBKNFEnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGlsZURhdGEoe3gsIHksIHp9KSB7XG4gIGNvbnN0IG1hcFNvdXJjZSA9IGBodHRwczovL2EudGlsZXMubWFwYm94LmNvbS92NC9tYXBib3gubWFwYm94LXN0cmVldHMtdjcvJHt6fS8ke3h9LyR7eX0udmVjdG9yLnBiZj9hY2Nlc3NfdG9rZW49JHtNQVBCT1hfVE9LRU59YDtcbiAgcmV0dXJuIGZldGNoKG1hcFNvdXJjZSlcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICB9KVxuICAgIC50aGVuKGJ1ZmZlciA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZGVjb2RlVGlsZSh4LCB5LCB6LCBidWZmZXIpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUaWxlKHgsIHksIHosIGFycmF5QnVmZmVyKSB7XG4gIGNvbnN0IHRpbGUgPSBuZXcgVmVjdG9yVGlsZShuZXcgUHJvdG9idWYoYXJyYXlCdWZmZXIpKTtcblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgeFByb2ogPSB4ICogVElMRV9TSVpFO1xuICBjb25zdCB5UHJvaiA9IHkgKiBUSUxFX1NJWkU7XG4gIGNvbnN0IHNjYWxlID0gTWF0aC5wb3coMiwgeik7XG5cbiAgY29uc3QgcHJvamVjdEZ1bmMgPSBwcm9qZWN0LmJpbmQobnVsbCwgeFByb2osIHlQcm9qLCBzY2FsZSk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgZ3VhcmQtZm9yLWluICovXG4gIGNvbnN0IGxheWVyTmFtZSA9ICdidWlsZGluZyc7XG4gIGNvbnN0IHZlY3RvclRpbGVMYXllciA9IHRpbGUubGF5ZXJzW2xheWVyTmFtZV07XG4gIGlmICghdmVjdG9yVGlsZUxheWVyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmVjdG9yVGlsZUxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmVjdG9yVGlsZUZlYXR1cmUgPSB2ZWN0b3JUaWxlTGF5ZXIuZmVhdHVyZShpKTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHZlY3RvclRpbGVGZWF0dXJlVG9Qcm9wKHZlY3RvclRpbGVGZWF0dXJlLCBwcm9qZWN0RnVuYyk7XG4gICAgZmVhdHVyZXMuZm9yRWFjaChmID0+IHtcbiAgICAgIGYucHJvcGVydGllcy5sYXllciA9IGxheWVyTmFtZTtcbiAgICAgIGlmIChmLnByb3BlcnRpZXMuaGVpZ2h0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QoeCwgeSwgc2NhbGUsIGxpbmUsIGV4dGVudCkge1xuICBjb25zdCBzaXplVG9QaXhlbCA9IGV4dGVudCAvIFRJTEVfU0laRTtcblxuICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGluZS5sZW5ndGg7IGlpKyspIHtcbiAgICBjb25zdCBwID0gbGluZVtpaV07XG4gICAgLy8gTE5HTEFUXG4gICAgbGluZVtpaV0gPSB3b3JsZFRvTG5nTGF0KFxuICAgICAgW3ggKyBwWzBdIC8gc2l6ZVRvUGl4ZWwsIHkgKyBwWzFdIC8gc2l6ZVRvUGl4ZWxdLFxuICAgICAgc2NhbGVcbiAgICApO1xuICB9XG59XG5cbi8qIGFkYXB0ZWQgZnJvbSBAbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcyBmb3IgYmV0dGVyIHBlcmYgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5leHBvcnQgZnVuY3Rpb24gdmVjdG9yVGlsZUZlYXR1cmVUb1Byb3AodmVjdG9yVGlsZUZlYXR1cmUsIHByb2plY3QpIHtcbiAgbGV0IGNvb3JkcyA9IGdldENvb3JkaW5hdGVzKHZlY3RvclRpbGVGZWF0dXJlKTtcbiAgY29uc3QgdHlwZSA9IFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3ZlY3RvclRpbGVGZWF0dXJlLnR5cGVdO1xuICBjb25zdCBleHRlbnQgPSB2ZWN0b3JUaWxlRmVhdHVyZS5leHRlbnQ7XG4gIGxldCBpO1xuICBsZXQgajtcblxuICBjb29yZHMgPSBjbGFzc2lmeVJpbmdzKGNvb3Jkcyk7XG4gIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICBwcm9qZWN0KGNvb3Jkc1tpXVtqXSwgZXh0ZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29vcmRzLm1hcChjb29yZGluYXRlcyA9PiAoe1xuICAgIGNvb3JkaW5hdGVzLFxuICAgIHByb3BlcnRpZXM6IHZlY3RvclRpbGVGZWF0dXJlLnByb3BlcnRpZXNcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXRDb29yZGluYXRlcyh2ZWN0b3JUaWxlRmVhdHVyZSkge1xuICBjb25zdCBwYmYgPSB2ZWN0b3JUaWxlRmVhdHVyZS5fcGJmO1xuICBwYmYucG9zID0gdmVjdG9yVGlsZUZlYXR1cmUuX2dlb21ldHJ5O1xuXG4gIGNvbnN0IGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuICBsZXQgY21kID0gMTtcbiAgbGV0IGxlbmd0aCA9IDA7XG4gIGxldCB4ID0gMDtcbiAgbGV0IHkgPSAwO1xuXG4gIGNvbnN0IGxpbmVzID0gW107XG4gIGxldCBsaW5lO1xuXG4gIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgaWYgKGxlbmd0aCA8PSAwKSB7XG4gICAgICBjb25zdCBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgfVxuXG4gICAgbGVuZ3RoLS07XG5cbiAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgIGlmIChjbWQgPT09IDEpIHtcbiAgICAgICAgLy8gbW92ZVRvXG4gICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICBsaW5lID0gW107XG4gICAgICB9XG5cbiAgICAgIGxpbmUucHVzaChbeCwgeV0pO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGxpbmUucHVzaChsaW5lWzBdLnNsaWNlKCkpOyAvLyBjbG9zZVBvbHlnb25cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG4vLyBjbGFzc2lmaWVzIGFuIGFycmF5IG9mIHJpbmdzIGludG8gcG9seWdvbnMgd2l0aCBvdXRlciByaW5ncyBhbmQgaG9sZXNcblxuZnVuY3Rpb24gY2xhc3NpZnlSaW5ncyhyaW5ncykge1xuICBjb25zdCBsZW4gPSByaW5ncy5sZW5ndGg7XG5cbiAgaWYgKGxlbiA8PSAxKSByZXR1cm4gW3JpbmdzXTtcblxuICBjb25zdCBwb2x5Z29ucyA9IFtdO1xuICBsZXQgcG9seWdvbjtcbiAgbGV0IGNjdztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgYXJlYSA9IHNpZ25lZEFyZWEocmluZ3NbaV0pO1xuICAgIGlmIChhcmVhID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2N3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNjdyA9IGFyZWEgPCAwO1xuICAgIH1cblxuICAgIGlmIChjY3cgPT09IGFyZWEgPCAwKSB7XG4gICAgICBpZiAocG9seWdvbikge1xuICAgICAgICBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgICAgfVxuICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XG4gICAgfVxuICB9XG4gIGlmIChwb2x5Z29uKSB7XG4gICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgfVxuXG4gIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYShyaW5nKSB7XG4gIGxldCBzdW0gPSAwO1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxLCBwMSwgcDI7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICBwMSA9IHJpbmdbaV07XG4gICAgcDIgPSByaW5nW2pdO1xuICAgIHN1bSArPSAocDJbMF0gLSBwMVswXSkgKiAocDFbMV0gKyBwMlsxXSk7XG4gIH1cbiAgcmV0dXJuIHN1bTtcbn1cbiJdfQ==