UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

369 lines (315 loc) 38.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.hexIdResolver = exports.hexIdRequiredColumns = exports.hexIdAccessor = exports["default"] = exports.HexagonIdVisConfigs = exports.HEXAGON_ID_FIELDS = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _deck = require("deck.gl"); var _enhancedColumnLayer = _interopRequireDefault(require("../../deckgl-layers/column-layer/enhanced-column-layer")); var _h3Utils = require("./h3-utils"); var _h3HexagonLayerIcon = _interopRequireDefault(require("./h3-hexagon-layer-icon")); var _defaultSettings = require("../../constants/default-settings"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var HEXAGON_ID_FIELDS = exports.HEXAGON_ID_FIELDS = { hex_id: ['hex_id', 'hexagon_id', 'h3_id'] }; var hexIdRequiredColumns = exports.hexIdRequiredColumns = ['hex_id']; var hexIdAccessor = exports.hexIdAccessor = function hexIdAccessor(_ref) { var hex_id = _ref.hex_id; return function (d) { return d[hex_id.fieldIdx]; }; }; var hexIdResolver = exports.hexIdResolver = function hexIdResolver(_ref2) { var hex_id = _ref2.hex_id; return hex_id.fieldIdx; }; var HexagonIdVisConfigs = exports.HexagonIdVisConfigs = { opacity: 'opacity', colorRange: 'colorRange', coverage: 'coverage', sizeRange: 'elevationRange', coverageRange: 'coverageRange', elevationScale: 'elevationScale' }; function hexToRgb(hex) { var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); var r = parseInt(result[1], 16); var g = parseInt(result[2], 16); var b = parseInt(result[3], 16); return [r, g, b]; } var HexagonIdLayer = exports["default"] = /*#__PURE__*/function (_Layer) { (0, _inherits2["default"])(HexagonIdLayer, _Layer); var _super = _createSuper(HexagonIdLayer); function HexagonIdLayer(props) { var _this; (0, _classCallCheck2["default"])(this, HexagonIdLayer); _this = _super.call(this, props); _this.registerVisConfig(HexagonIdVisConfigs); _this.getHexId = (0, _lodash["default"])(hexIdAccessor, hexIdResolver); return _this; } (0, _createClass2["default"])(HexagonIdLayer, [{ key: "type", get: function get() { return 'hexagonId'; } }, { key: "name", get: function get() { return 'H3'; } }, { key: "requiredLayerColumns", get: function get() { return hexIdRequiredColumns; } }, { key: "layerIcon", get: function get() { // use hexagon layer icon for now return _h3HexagonLayerIcon["default"]; } }, { key: "visualChannels", get: function get() { return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "visualChannels", this)), {}, { size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "visualChannels", this).size), {}, { property: 'height' }), coverage: { property: 'coverage', field: 'coverageField', scale: 'coverageScale', domain: 'coverageDomain', range: 'coverageRange', key: 'coverage', channelScaleType: _defaultSettings.CHANNEL_SCALES.radius } }); } }, { key: "getDefaultLayerConfig", value: function getDefaultLayerConfig() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "getDefaultLayerConfig", this).call(this, props)), {}, { // add height visual channel coverageField: null, coverageDomain: [0, 1], coverageScale: 'linear' }); } // TODO: fix complexity /* eslint-disable complexity */ }, { key: "formatLayerData", value: function formatLayerData(_, allData, filteredIndex, oldLayerData) { var _this2 = this; var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var _this$config = this.config, colorScale = _this$config.colorScale, colorDomain = _this$config.colorDomain, colorField = _this$config.colorField, color = _this$config.color, columns = _this$config.columns, sizeField = _this$config.sizeField, sizeScale = _this$config.sizeScale, sizeDomain = _this$config.sizeDomain, coverageField = _this$config.coverageField, coverageScale = _this$config.coverageScale, coverageDomain = _this$config.coverageDomain, _this$config$visConfi = _this$config.visConfig, sizeRange = _this$config$visConfi.sizeRange, colorRange = _this$config$visConfi.colorRange, coverageRange = _this$config$visConfi.coverageRange; // color var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(function (c) { return hexToRgb(c); })); // height var sScale = sizeField && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange, 0); // coverage var coScale = coverageField && this.getVisChannelScale(coverageScale, coverageDomain, coverageRange, 0); var getHexId = this.getHexId(columns); if (!oldLayerData || oldLayerData.getHexId !== getHexId) { this.updateLayerMeta(allData, getHexId); } var data; if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getHexId === getHexId) { data = oldLayerData.data; } else { data = filteredIndex.reduce(function (accu, index, i) { var id = getHexId(allData[index]); var centroid = _this2.dataToFeature.centroids[index]; if (centroid) { accu.push({ // keep a reference to the original data index index: i, data: allData[index], id: id, centroid: centroid }); } return accu; }, []); } var getElevation = sScale ? function (d) { return _this2.getEncodedChannelValue(sScale, d.data, sizeField, 0); } : 0; var getColor = cScale ? function (d) { return _this2.getEncodedChannelValue(cScale, d.data, colorField); } : color; var getCoverage = coScale ? function (d) { return _this2.getEncodedChannelValue(coScale, d.data, coverageField, 0); } : 1; // const layerData = { return { data: data, getElevation: getElevation, getColor: getColor, getHexId: getHexId, getCoverage: getCoverage, hexagonVertices: this.dataToFeature.hexagonVertices, hexagonCenter: this.dataToFeature.hexagonCenter }; } /* eslint-enable complexity */ }, { key: "updateLayerMeta", value: function updateLayerMeta(allData, getHexId) { var hexagonVertices; var hexagonCenter; var centroids = {}; allData.forEach(function (d, index) { var id = getHexId(d); if (!(0, _h3Utils.h3IsValid)(id)) { return; } // find hexagonVertices // only need 1 instance of hexagonVertices if (!hexagonVertices) { hexagonVertices = (0, _h3Utils.getVertices)({ id: id }); hexagonCenter = (0, _h3Utils.getCentroid)({ id: id }); } // save a reference of centroids to dataToFeature // so we don't have to re calculate it again centroids[index] = (0, _h3Utils.getCentroid)({ id: id }); }); var bounds = this.getPointsBounds(Object.values(centroids), function (d) { return d; }); this.dataToFeature = { hexagonVertices: hexagonVertices, hexagonCenter: hexagonCenter, centroids: centroids }; this.updateMeta({ bounds: bounds }); } }, { key: "renderLayer", value: function renderLayer(_ref3) { var data = _ref3.data, idx = _ref3.idx, layerInteraction = _ref3.layerInteraction, objectHovered = _ref3.objectHovered, mapState = _ref3.mapState, interactionConfig = _ref3.interactionConfig; var zoomFactor = this.getZoomFactor(mapState); var eleZoomFactor = this.getElevationZoomFactor(mapState); var config = this.config; var visConfig = config.visConfig; var h3HexagonLayerTriggers = { getColor: { color: config.color, colorField: config.colorField, colorRange: config.visConfig.colorRange, colorScale: config.colorScale }, getElevation: { sizeField: config.sizeField, sizeRange: config.visConfig.sizeRange } }; var columnLayerTriggers = { getCoverage: { coverageField: config.coverageField, coverageRange: config.visConfig.coverageRange } }; return [new _deck.H3HexagonLayer(_objectSpread(_objectSpread(_objectSpread({}, layerInteraction), data), {}, { id: this.id, idx: idx, pickable: true, getHexagon: function getHexagon(x) { return x.id; }, // coverage coverage: config.coverageField ? 1 : visConfig.coverage, // parameters parameters: { depthTest: Boolean(config.sizeField || mapState.dragRotate) }, // highlight autoHighlight: Boolean(config.sizeField), highlightColor: _defaultSettings.HIGHLIGH_COLOR_3D, // elevation extruded: Boolean(config.sizeField), elevationScale: visConfig.elevationScale * eleZoomFactor, // color opacity: visConfig.opacity, // render updateTriggers: h3HexagonLayerTriggers, _subLayerProps: { 'hexagon-cell': { type: _enhancedColumnLayer["default"], getCoverage: data.getCoverage, updateTriggers: columnLayerTriggers } } }))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) && !config.sizeField ? [new _deck.GeoJsonLayer({ id: "".concat(this.id, "-hovered"), data: [(0, _h3Utils.idToPolygonGeo)(objectHovered)], getLineColor: config.highlightColor, lineWidthScale: 8 * zoomFactor })] : [])); } }], [{ key: "findDefaultLayerProps", value: function findDefaultLayerProps(_ref4) { var _ref4$fields = _ref4.fields, fields = _ref4$fields === void 0 ? [] : _ref4$fields; var foundColumns = this.findDefaultColumnField(HEXAGON_ID_FIELDS, fields); if (!foundColumns || !foundColumns.length) { return { props: [] }; } return { props: foundColumns.map(function (columns) { return { isVisible: true, label: 'H3 Hexagon', columns: columns }; }) }; } }]); return HexagonIdLayer; }(_baseLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvaDMtaGV4YWdvbi1sYXllci9oMy1oZXhhZ29uLWxheWVyLmpzIl0sIm5hbWVzIjpbIkhFWEFHT05fSURfRklFTERTIiwiaGV4X2lkIiwiaGV4SWRSZXF1aXJlZENvbHVtbnMiLCJoZXhJZEFjY2Vzc29yIiwiZCIsImZpZWxkSWR4IiwiaGV4SWRSZXNvbHZlciIsIkhleGFnb25JZFZpc0NvbmZpZ3MiLCJvcGFjaXR5IiwiY29sb3JSYW5nZSIsImNvdmVyYWdlIiwic2l6ZVJhbmdlIiwiY292ZXJhZ2VSYW5nZSIsImVsZXZhdGlvblNjYWxlIiwiaGV4VG9SZ2IiLCJoZXgiLCJyZXN1bHQiLCJleGVjIiwiciIsInBhcnNlSW50IiwiZyIsImIiLCJIZXhhZ29uSWRMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRIZXhJZCIsIkgzSGV4YWdvbkxheWVySWNvbiIsInNpemUiLCJwcm9wZXJ0eSIsImZpZWxkIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImtleSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsInJhZGl1cyIsImNvdmVyYWdlRmllbGQiLCJjb3ZlcmFnZURvbWFpbiIsImNvdmVyYWdlU2NhbGUiLCJfIiwiYWxsRGF0YSIsImZpbHRlcmVkSW5kZXgiLCJvbGRMYXllckRhdGEiLCJvcHQiLCJjb25maWciLCJjb2xvclNjYWxlIiwiY29sb3JEb21haW4iLCJjb2xvckZpZWxkIiwiY29sb3IiLCJjb2x1bW5zIiwic2l6ZUZpZWxkIiwic2l6ZVNjYWxlIiwic2l6ZURvbWFpbiIsInZpc0NvbmZpZyIsImNTY2FsZSIsImdldFZpc0NoYW5uZWxTY2FsZSIsImNvbG9ycyIsIm1hcCIsImMiLCJzU2NhbGUiLCJjb1NjYWxlIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YSIsInNhbWVEYXRhIiwicmVkdWNlIiwiYWNjdSIsImluZGV4IiwiaSIsImlkIiwiY2VudHJvaWQiLCJkYXRhVG9GZWF0dXJlIiwiY2VudHJvaWRzIiwicHVzaCIsImdldEVsZXZhdGlvbiIsImdldEVuY29kZWRDaGFubmVsVmFsdWUiLCJnZXRDb2xvciIsImdldENvdmVyYWdlIiwiaGV4YWdvblZlcnRpY2VzIiwiaGV4YWdvbkNlbnRlciIsImZvckVhY2giLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJ1cGRhdGVNZXRhIiwiaWR4IiwibGF5ZXJJbnRlcmFjdGlvbiIsIm9iamVjdEhvdmVyZWQiLCJtYXBTdGF0ZSIsImludGVyYWN0aW9uQ29uZmlnIiwiem9vbUZhY3RvciIsImdldFpvb21GYWN0b3IiLCJlbGVab29tRmFjdG9yIiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsImgzSGV4YWdvbkxheWVyVHJpZ2dlcnMiLCJjb2x1bW5MYXllclRyaWdnZXJzIiwiSDNIZXhhZ29uTGF5ZXIiLCJwaWNrYWJsZSIsImdldEhleGFnb24iLCJ4IiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsIkJvb2xlYW4iLCJkcmFnUm90YXRlIiwiYXV0b0hpZ2hsaWdodCIsImhpZ2hsaWdodENvbG9yIiwiSElHSExJR0hfQ09MT1JfM0QiLCJleHRydWRlZCIsInVwZGF0ZVRyaWdnZXJzIiwiX3N1YkxheWVyUHJvcHMiLCJ0eXBlIiwiRW5oYW5jZWRDb2x1bW5MYXllciIsImlzTGF5ZXJIb3ZlcmVkIiwiR2VvSnNvbkxheWVyIiwiZ2V0TGluZUNvbG9yIiwibGluZVdpZHRoU2NhbGUiLCJmaWVsZHMiLCJmb3VuZENvbHVtbnMiLCJmaW5kRGVmYXVsdENvbHVtbkZpZWxkIiwibGVuZ3RoIiwiaXNWaXNpYmxlIiwibGFiZWwiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVPLElBQU1BLGlCQUFpQiwrQkFBRztBQUMvQkMsRUFBQUEsTUFBTSxFQUFFLENBQUMsUUFBRCxF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QUwsRUFBSztBQUMxQyxVQUFNQyxZQUFZLEdBQUcsS0FBS0Msc0JBQUwsQ0FBNEJ2SCxpQkFBNUIsRUFBK0NxSCxNQUEvQyxDQUFyQjs7QUFDQSxVQUFJLENBQUNDLFlBQUQsSUFBaUIsQ0FBQ0EsWUFBWSxDQUFDRSxNQUFuQyxFQUEyQztBQUN6QyxlQUFPO0FBQUNqRyxVQUFBQSxLQUFLLEVBQUU7QUFBUixTQUFQO0FBQ0Q7O0FBRUQsYUFBTztBQUNMQSxRQUFBQSxLQUFLLEVBQUUrRixZQUFZLENBQUM1RCxHQUFiLENBQWlCLFVBQUFSLE9BQU87QUFBQSxpQkFBSztBQUNsQ3VFLFlBQUFBLFNBQVMsRUFBRSxJQUR1QjtBQUVsQ0MsWUFBQUEsS0FBSyxFQUFFLFlBRjJCO0FBR2xDeEUsWUFBQUEsT0FBTyxFQUFQQTtBQUhrQyxXQUFMO0FBQUEsU0FBeEI7QUFERixPQUFQO0FBT0Q7OztFQXhEeUN5RSxxQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcblxuaW1wb3J0IExheWVyIGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IHtHZW9Kc29uTGF5ZXIsIEgzSGV4YWdvbkxheWVyfSBmcm9tICdkZWNrLmdsJztcbmltcG9ydCBFbmhhbmNlZENvbHVtbkxheWVyIGZyb20gJ2RlY2tnbC1sYXllcnMvY29sdW1uLWxheWVyL2VuaGFuY2VkLWNvbHVtbi1sYXllcic7XG5pbXBvcnQge2dldFZlcnRpY2VzLCBnZXRDZW50cm9pZCwgaWRUb1BvbHlnb25HZW8sIGgzSXNWYWxpZH0gZnJvbSAnLi9oMy11dGlscyc7XG5pbXBvcnQgSDNIZXhhZ29uTGF5ZXJJY29uIGZyb20gJy4vaDMtaGV4YWdvbi1sYXllci1pY29uJztcbmltcG9ydCB7Q0hBTk5FTF9TQ0FMRVMsIEhJR0hMSUdIX0NPTE9SXzNEfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmV4cG9ydCBjb25zdCBIRVhBR09OX0lEX0ZJRUxEUyA9IHtcbiAgaGV4X2lkOiBbJ2hleF9pZCcsICdoZXhhZ29uX2lkJywgJ2gzX2lkJ11cbn07XG5cbmV4cG9ydCBjb25zdCBoZXhJZFJlcXVpcmVkQ29sdW1ucyA9IFsnaGV4X2lkJ107XG5leHBvcnQgY29uc3QgaGV4SWRBY2Nlc3NvciA9ICh7aGV4X2lkfSkgPT4gZCA9PiBkW2hleF9pZC5maWVsZElkeF07XG5leHBvcnQgY29uc3QgaGV4SWRSZXNvbHZlciA9ICh7aGV4X2lkfSkgPT4gaGV4X2lkLmZpZWxkSWR4O1xuXG5leHBvcnQgY29uc3QgSGV4YWdvbklkVmlzQ29uZmlncyA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIGNvdmVyYWdlOiAnY292ZXJhZ2UnLFxuICBzaXplUmFuZ2U6ICdlbGV2YXRpb25SYW5nZScsXG4gIGNvdmVyYWdlUmFuZ2U6ICdjb3ZlcmFnZVJhbmdlJyxcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZSdcbn07XG5cbmZ1bmN0aW9uIGhleFRvUmdiKGhleCkge1xuICBjb25zdCByZXN1bHQgPSAvXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLmV4ZWMoaGV4KTtcblxuICBjb25zdCByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxNik7XG4gIGNvbnN0IGcgPSBwYXJzZUludChyZXN1bHRbMl0sIDE2KTtcbiAgY29uc3QgYiA9IHBhcnNlSW50KHJlc3VsdFszXSwgMTYpO1xuXG4gIHJldHVybiBbciwgZywgYl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhleGFnb25JZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKEhleGFnb25JZFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0SGV4SWQgPSBtZW1vaXplKGhleElkQWNjZXNzb3IsIGhleElkUmVzb2x2ZXIpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdoZXhhZ29uSWQnO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuICdIMyc7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIGhleElkUmVxdWlyZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICAvLyB1c2UgaGV4YWdvbiBsYXllciBpY29uIGZvciBub3dcbiAgICByZXR1cm4gSDNIZXhhZ29uTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscyxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSxcbiAgICAgICAgcHJvcGVydHk6ICdoZWlnaHQnXG4gICAgICB9LFxuICAgICAgY292ZXJhZ2U6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjb3ZlcmFnZScsXG4gICAgICAgIGZpZWxkOiAnY292ZXJhZ2VGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY292ZXJhZ2VTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2NvdmVyYWdlRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdjb3ZlcmFnZVJhbmdlJyxcbiAgICAgICAga2V5OiAnY292ZXJhZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5yYWRpdXNcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRzID0gW119KSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5zID0gdGhpcy5maW5kRGVmYXVsdENvbHVtbkZpZWxkKEhFWEFHT05fSURfRklFTERTLCBmaWVsZHMpO1xuICAgIGlmICghZm91bmRDb2x1bW5zIHx8ICFmb3VuZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge3Byb3BzOiBbXX07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiBmb3VuZENvbHVtbnMubWFwKGNvbHVtbnMgPT4gKHtcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICBsYWJlbDogJ0gzIEhleGFnb24nLFxuICAgICAgICBjb2x1bW5zXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzKSxcblxuICAgICAgLy8gYWRkIGhlaWdodCB2aXN1YWwgY2hhbm5lbFxuICAgICAgY292ZXJhZ2VGaWVsZDogbnVsbCxcbiAgICAgIGNvdmVyYWdlRG9tYWluOiBbMCwgMV0sXG4gICAgICBjb3ZlcmFnZVNjYWxlOiAnbGluZWFyJ1xuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBmaXggY29tcGxleGl0eVxuICAvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4gIGZvcm1hdExheWVyRGF0YShfLCBhbGxEYXRhLCBmaWx0ZXJlZEluZGV4LCBvbGRMYXllckRhdGEsIG9wdCA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY29sb3JTY2FsZSxcbiAgICAgIGNvbG9yRG9tYWluLFxuICAgICAgY29sb3JGaWVsZCxcbiAgICAgIGNvbG9yLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHNpemVGaWVsZCxcbiAgICAgIHNpemVTY2FsZSxcbiAgICAgIHNpemVEb21haW4sXG4gICAgICBjb3ZlcmFnZUZpZWxkLFxuICAgICAgY292ZXJhZ2VTY2FsZSxcbiAgICAgIGNvdmVyYWdlRG9tYWluLFxuICAgICAgdmlzQ29uZmlnOiB7c2l6ZVJhbmdlLCBjb2xvclJhbmdlLCBjb3ZlcmFnZVJhbmdlfVxuICAgIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIC8vIGNvbG9yXG4gICAgY29uc3QgY1NjYWxlID1cbiAgICAgIGNvbG9yRmllbGQgJiZcbiAgICAgIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKFxuICAgICAgICBjb2xvclNjYWxlLFxuICAgICAgICBjb2xvckRvbWFpbixcbiAgICAgICAgY29sb3JSYW5nZS5jb2xvcnMubWFwKGMgPT4gaGV4VG9SZ2IoYykpXG4gICAgICApO1xuXG4gICAgLy8gaGVpZ2h0XG4gICAgY29uc3Qgc1NjYWxlID1cbiAgICAgIHNpemVGaWVsZCAmJiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShzaXplU2NhbGUsIHNpemVEb21haW4sIHNpemVSYW5nZSwgMCk7XG5cbiAgICAvLyBjb3ZlcmFnZVxuICAgIGNvbnN0IGNvU2NhbGUgPVxuICAgICAgY292ZXJhZ2VGaWVsZCAmJlxuICAgICAgdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoY292ZXJhZ2VTY2FsZSwgY292ZXJhZ2VEb21haW4sIGNvdmVyYWdlUmFuZ2UsIDApO1xuXG4gICAgY29uc3QgZ2V0SGV4SWQgPSB0aGlzLmdldEhleElkKGNvbHVtbnMpO1xuXG4gICAgaWYgKCFvbGRMYXllckRhdGEgfHwgb2xkTGF5ZXJEYXRhLmdldEhleElkICE9PSBnZXRIZXhJZCkge1xuICAgICAgdGhpcy51cGRhdGVMYXllck1ldGEoYWxsRGF0YSwgZ2V0SGV4SWQpO1xuICAgIH1cblxuICAgIGxldCBkYXRhO1xuICAgIGlmIChcbiAgICAgIG9sZExheWVyRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmRhdGEgJiZcbiAgICAgIG9wdC5zYW1lRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmdldEhleElkID09PSBnZXRIZXhJZFxuICAgICkge1xuICAgICAgZGF0YSA9IG9sZExheWVyRGF0YS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gZmlsdGVyZWRJbmRleC5yZWR1Y2UoKGFjY3UsIGluZGV4LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gZ2V0SGV4SWQoYWxsRGF0YVtpbmRleF0pO1xuICAgICAgICBjb25zdCBjZW50cm9pZCA9IHRoaXMuZGF0YVRvRmVhdHVyZS5jZW50cm9pZHNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChjZW50cm9pZCkge1xuICAgICAgICAgIGFjY3UucHVzaCh7XG4gICAgICAgICAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBkYXRhIGluZGV4XG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGRhdGE6IGFsbERhdGFbaW5kZXhdLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjZW50cm9pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0RWxldmF0aW9uID0gc1NjYWxlXG4gICAgICA/IGQgPT4gdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKHNTY2FsZSwgZC5kYXRhLCBzaXplRmllbGQsIDApXG4gICAgICA6IDA7XG5cbiAgICBjb25zdCBnZXRDb2xvciA9IGNTY2FsZVxuICAgICAgPyBkID0+IHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIGQuZGF0YSwgY29sb3JGaWVsZClcbiAgICAgIDogY29sb3I7XG5cbiAgICBjb25zdCBnZXRDb3ZlcmFnZSA9IGNvU2NhbGVcbiAgICAgID8gZCA9PiB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoY29TY2FsZSwgZC5kYXRhLCBjb3ZlcmFnZUZpZWxkLCAwKVxuICAgICAgOiAxO1xuXG4gICAgLy8gY29uc3QgbGF5ZXJEYXRhID0ge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0RWxldmF0aW9uLFxuICAgICAgZ2V0Q29sb3IsXG4gICAgICBnZXRIZXhJZCxcbiAgICAgIGdldENvdmVyYWdlLFxuICAgICAgaGV4YWdvblZlcnRpY2VzOiB0aGlzLmRhdGFUb0ZlYXR1cmUuaGV4YWdvblZlcnRpY2VzLFxuICAgICAgaGV4YWdvbkNlbnRlcjogdGhpcy5kYXRhVG9GZWF0dXJlLmhleGFnb25DZW50ZXJcbiAgICB9O1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuXG4gIHVwZGF0ZUxheWVyTWV0YShhbGxEYXRhLCBnZXRIZXhJZCkge1xuICAgIGxldCBoZXhhZ29uVmVydGljZXM7XG4gICAgbGV0IGhleGFnb25DZW50ZXI7XG4gICAgY29uc3QgY2VudHJvaWRzID0ge307XG5cbiAgICBhbGxEYXRhLmZvckVhY2goKGQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGdldEhleElkKGQpO1xuICAgICAgaWYgKCFoM0lzVmFsaWQoaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgaGV4YWdvblZlcnRpY2VzXG4gICAgICAvLyBvbmx5IG5lZWQgMSBpbnN0YW5jZSBvZiBoZXhhZ29uVmVydGljZXNcbiAgICAgIGlmICghaGV4YWdvblZlcnRpY2VzKSB7XG4gICAgICAgIGhleGFnb25WZXJ0aWNlcyA9IGdldFZlcnRpY2VzKHtpZH0pO1xuICAgICAgICBoZXhhZ29uQ2VudGVyID0gZ2V0Q2VudHJvaWQoe2lkfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNhdmUgYSByZWZlcmVuY2Ugb2YgY2VudHJvaWRzIHRvIGRhdGFUb0ZlYXR1cmVcbiAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gcmUgY2FsY3VsYXRlIGl0IGFnYWluXG4gICAgICBjZW50cm9pZHNbaW5kZXhdID0gZ2V0Q2VudHJvaWQoe2lkfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhPYmplY3QudmFsdWVzKGNlbnRyb2lkcyksIGQgPT4gZCk7XG4gICAgdGhpcy5kYXRhVG9GZWF0dXJlID0ge2hleGFnb25WZXJ0aWNlcywgaGV4YWdvbkNlbnRlciwgY2VudHJvaWRzfTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgaWR4LFxuICAgIGxheWVySW50ZXJhY3Rpb24sXG4gICAgb2JqZWN0SG92ZXJlZCxcbiAgICBtYXBTdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZ1xuICB9KSB7XG4gICAgY29uc3Qgem9vbUZhY3RvciA9IHRoaXMuZ2V0Wm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gICAgY29uc3QgZWxlWm9vbUZhY3RvciA9IHRoaXMuZ2V0RWxldmF0aW9uWm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzO1xuICAgIGNvbnN0IHt2aXNDb25maWd9ID0gY29uZmlnO1xuXG4gICAgY29uc3QgaDNIZXhhZ29uTGF5ZXJUcmlnZ2VycyA9IHtcbiAgICAgIGdldENvbG9yOiB7XG4gICAgICAgIGNvbG9yOiBjb25maWcuY29sb3IsXG4gICAgICAgIGNvbG9yRmllbGQ6IGNvbmZpZy5jb2xvckZpZWxkLFxuICAgICAgICBjb2xvclJhbmdlOiBjb25maWcudmlzQ29uZmlnLmNvbG9yUmFuZ2UsXG4gICAgICAgIGNvbG9yU2NhbGU6IGNvbmZpZy5jb2xvclNjYWxlXG4gICAgICB9LFxuICAgICAgZ2V0RWxldmF0aW9uOiB7XG4gICAgICAgIHNpemVGaWVsZDogY29uZmlnLnNpemVGaWVsZCxcbiAgICAgICAgc2l6ZVJhbmdlOiBjb25maWcudmlzQ29uZmlnLnNpemVSYW5nZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjb2x1bW5MYXllclRyaWdnZXJzID0ge1xuICAgICAgZ2V0Q292ZXJhZ2U6IHtcbiAgICAgICAgY292ZXJhZ2VGaWVsZDogY29uZmlnLmNvdmVyYWdlRmllbGQsXG4gICAgICAgIGNvdmVyYWdlUmFuZ2U6IGNvbmZpZy52aXNDb25maWcuY292ZXJhZ2VSYW5nZVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IEgzSGV4YWdvbkxheWVyKHtcbiAgICAgICAgLi4ubGF5ZXJJbnRlcmFjdGlvbixcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGlkeCxcbiAgICAgICAgcGlja2FibGU6IHRydWUsXG4gICAgICAgIGdldEhleGFnb246IHggPT4geC5pZCxcblxuICAgICAgICAvLyBjb3ZlcmFnZVxuICAgICAgICBjb3ZlcmFnZTogY29uZmlnLmNvdmVyYWdlRmllbGQgPyAxIDogdmlzQ29uZmlnLmNvdmVyYWdlLFxuXG4gICAgICAgIC8vIHBhcmFtZXRlcnNcbiAgICAgICAgcGFyYW1ldGVyczoge2RlcHRoVGVzdDogQm9vbGVhbihjb25maWcuc2l6ZUZpZWxkIHx8IG1hcFN0YXRlLmRyYWdSb3RhdGUpfSxcblxuICAgICAgICAvLyBoaWdobGlnaHRcbiAgICAgICAgYXV0b0hpZ2hsaWdodDogQm9vbGVhbihjb25maWcuc2l6ZUZpZWxkKSxcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IEhJR0hMSUdIX0NPTE9SXzNELFxuXG4gICAgICAgIC8vIGVsZXZhdGlvblxuICAgICAgICBleHRydWRlZDogQm9vbGVhbihjb25maWcuc2l6ZUZpZWxkKSxcbiAgICAgICAgZWxldmF0aW9uU2NhbGU6IHZpc0NvbmZpZy5lbGV2YXRpb25TY2FsZSAqIGVsZVpvb21GYWN0b3IsXG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgb3BhY2l0eTogdmlzQ29uZmlnLm9wYWNpdHksXG5cbiAgICAgICAgLy8gcmVuZGVyXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiBoM0hleGFnb25MYXllclRyaWdnZXJzLFxuICAgICAgICBfc3ViTGF5ZXJQcm9wczoge1xuICAgICAgICAgICdoZXhhZ29uLWNlbGwnOiB7XG4gICAgICAgICAgICB0eXBlOiBFbmhhbmNlZENvbHVtbkxheWVyLFxuICAgICAgICAgICAgZ2V0Q292ZXJhZ2U6IGRhdGEuZ2V0Q292ZXJhZ2UsXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2VyczogY29sdW1uTGF5ZXJUcmlnZ2Vyc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAuLi4odGhpcy5pc0xheWVySG92ZXJlZChvYmplY3RIb3ZlcmVkKSAmJiAhY29uZmlnLnNpemVGaWVsZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIG5ldyBHZW9Kc29uTGF5ZXIoe1xuICAgICAgICAgICAgICBpZDogYCR7dGhpcy5pZH0taG92ZXJlZGAsXG4gICAgICAgICAgICAgIGRhdGE6IFtpZFRvUG9seWdvbkdlbyhvYmplY3RIb3ZlcmVkKV0sXG4gICAgICAgICAgICAgIGdldExpbmVDb2xvcjogY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgICAgICAgICBsaW5lV2lkdGhTY2FsZTogOCAqIHpvb21GYWN0b3JcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKVxuICAgIF07XG4gIH1cbn1cbiJdfQ==