kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
226 lines (185 loc) • 20.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createNewDataEntry = createNewDataEntry;
exports.removeSuffixAndDelimiters = removeSuffixAndDelimiters;
exports.findPointFieldPairs = findPointFieldPairs;
exports.datasetColorMaker = void 0;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _colorUtils = require("./color-utils");
var _lodash = _interopRequireDefault(require("lodash.uniq"));
var _defaultSettings = require("../constants/default-settings");
var _utils = require("./utils");
var _dataProcessor = require("../processors/data-processor");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var _marked =
/*#__PURE__*/
_regenerator["default"].mark(generateColor);
// apply a color for each dataset
// to use as label colors
var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_colorUtils.hexToRgb);
/**
* Random color generator
*/
function generateColor() {
var index;
return _regenerator["default"].wrap(function generateColor$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
index = 0;
case 1:
if (!(index < datasetColors.length + 1)) {
_context.next = 7;
break;
}
if (index === datasetColors.length) {
index = 0;
}
_context.next = 5;
return datasetColors[index++];
case 5:
_context.next = 1;
break;
case 7:
case "end":
return _context.stop();
}
}
}, _marked);
}
var datasetColorMaker = generateColor();
exports.datasetColorMaker = datasetColorMaker;
function getNewDatasetColor(datasets) {
var presetColors = datasetColors.map(String);
var usedColors = (0, _lodash["default"])(Object.values(datasets).map(function (d) {
return String(d.color);
})).filter(function (c) {
return presetColors.includes(c);
});
if (usedColors.length === presetColors.length) {
// if we already depleted the pool of color
return datasetColorMaker.next().value;
}
var color = datasetColorMaker.next().value;
while (usedColors.includes(String(color))) {
color = datasetColorMaker.next().value;
}
return color;
}
function createNewDataEntry(_ref) {
var _ref$info = _ref.info,
info = _ref$info === void 0 ? {} : _ref$info,
data = _ref.data;
var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var validatedData = (0, _dataProcessor.validateInputData)(data);
if (!validatedData) {
return {};
}
var allData = validatedData.rows;
var datasetInfo = _objectSpread({
id: (0, _utils.generateHashId)(4),
label: 'new dataset'
}, info);
var dataId = datasetInfo.id; // add tableFieldIndex and id to fields
// TODO: don't need id and name and tableFieldIndex anymore
// Add value accessor instead
var fields = validatedData.fields.map(function (f, i) {
return _objectSpread({}, f, {
id: f.name,
tableFieldIndex: i + 1
});
});
return (0, _defineProperty2["default"])({}, dataId, _objectSpread({}, datasetInfo, {
color: datasetInfo.color || getNewDatasetColor(datasets),
id: dataId,
allData: allData,
// TODO: no need to make a copy anymore, only save fieldedIndex
data: allData.slice(),
filteredIndex: allData.map(function (_, i) {
return i;
}),
filteredIndexForDomain: allData.map(function (_, i) {
return i;
}),
fieldPairs: findPointFieldPairs(fields),
fields: fields
}));
}
function removeSuffixAndDelimiters(layerName, suffix) {
return layerName.replace(new RegExp(suffix, 'ig'), '').replace(/[_,.]+/g, ' ').trim();
}
/**
* Find point fields pairs from fields
*
* @param {Array} fields
* @returns {Array} found point fields
*/
function findPointFieldPairs(fields) {
var allNames = fields.map(function (f) {
return f.name.toLowerCase();
}); // get list of all fields with matching suffixes
return allNames.reduce(function (carry, fieldName, idx) {
// This search for pairs will early exit if found.
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _defaultSettings.TRIP_POINT_FIELDS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var suffixPair = _step.value;
// match first suffix```
if (fieldName.endsWith(suffixPair[0])) {
var _ret = function () {
// match second suffix
var otherPattern = new RegExp("".concat(suffixPair[0], "$"));
var partner = fieldName.replace(otherPattern, suffixPair[1]);
var partnerIdx = allNames.findIndex(function (d) {
return d === partner;
});
if (partnerIdx > -1) {
var defaultName = removeSuffixAndDelimiters(fieldName, suffixPair[0]);
carry.push({
defaultName: defaultName,
pair: {
lat: {
fieldIdx: idx,
value: fields[idx].name
},
lng: {
fieldIdx: partnerIdx,
value: fields[partnerIdx].name
}
},
suffix: suffixPair
});
return {
v: carry
};
}
}();
if ((0, _typeof2["default"])(_ret) === "object") return _ret.v;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return carry;
}, []);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRhc2V0LXV0aWxzLmpzIl0sIm5hbWVzIjpbImdlbmVyYXRlQ29sb3IiLCJkYXRhc2V0Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJpbmRleCIsImxlbmd0aCIsImRhdGFzZXRDb2xvck1ha2VyIiwiZ2V0TmV3RGF0YXNldENvbG9yIiwiZGF0YXNldHMiLCJwcmVzZXRDb2xvcnMiLCJTdHJpbmciLCJ1c2VkQ29sb3JzIiwiT2JqZWN0IiwidmFsdWVzIiwiZCIsImNvbG9yIiwiZmlsdGVyIiwiYyIsImluY2x1ZGVzIiwibmV4dCIsInZhbHVlIiwiY3JlYXRlTmV3RGF0YUVudHJ5IiwiaW5mbyIsImRhdGEiLCJ2YWxpZGF0ZWREYXRhIiwiYWxsRGF0YSIsInJvd3MiLCJkYXRhc2V0SW5mbyIsImlkIiwibGFiZWwiLCJkYXRhSWQiLCJmaWVsZHMiLCJmIiwiaSIsIm5hbWUiLCJ0YWJsZUZpZWxkSW5kZXgiLCJzbGljZSIsImZpbHRlcmVkSW5kZXgiLCJfIiwiZmlsdGVyZWRJbmRleEZvckRvbWFpbiIsImZpZWxkUGFpcnMiLCJmaW5kUG9pbnRGaWVsZFBhaXJzIiwicmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyIsImxheWVyTmFtZSIsInN1ZmZpeCIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwiYWxsTmFtZXMiLCJ0b0xvd2VyQ2FzZSIsInJlZHVjZSIsImNhcnJ5IiwiZmllbGROYW1lIiwiaWR4IiwiVFJJUF9QT0lOVF9GSUVMRFMiLCJzdWZmaXhQYWlyIiwiZW5kc1dpdGgiLCJvdGhlclBhdHRlcm4iLCJwYXJ0bmVyIiwicGFydG5lcklkeCIsImZpbmRJbmRleCIsImRlZmF1bHROYW1lIiwicHVzaCIsInBhaXIiLCJsYXQiLCJmaWVsZElkeCIsImxuZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs2QkFnQlVBLGE7O0FBZlY7QUFDQTtBQUNB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QU9KO0FBQVA7QUFDRDtBQTNCb0M7O0FBQUE7QUE0QnRDO0FBQ0Y7QUFqQytDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBa0NoRCxXQUFPQSxLQUFQO0FBQ0QsR0FuQ00sRUFtQ0osRUFuQ0ksQ0FBUDtBQW9DRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7aGV4VG9SZ2J9IGZyb20gJy4vY29sb3ItdXRpbHMnO1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IHtUUklQX1BPSU5UX0ZJRUxEU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3ZhbGlkYXRlSW5wdXREYXRhfSBmcm9tICdwcm9jZXNzb3JzL2RhdGEtcHJvY2Vzc29yJztcbi8vIGFwcGx5IGEgY29sb3IgZm9yIGVhY2ggZGF0YXNldFxuLy8gdG8gdXNlIGFzIGxhYmVsIGNvbG9yc1xuY29uc3QgZGF0YXNldENvbG9ycyA9IFtcbiAgJyM4RjJGQkYnLFxuICAnIzAwNUNGRicsXG4gICcjQzA2Qzg0JyxcbiAgJyNGOEIxOTUnLFxuICAnIzU0N0E4MicsXG4gICcjM0VBQ0E4JyxcbiAgJyNBMkQ0QUInXG5dLm1hcChoZXhUb1JnYik7XG5cbi8qKlxuICogUmFuZG9tIGNvbG9yIGdlbmVyYXRvclxuICovXG5mdW5jdGlvbiogZ2VuZXJhdGVDb2xvcigpIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgZGF0YXNldENvbG9ycy5sZW5ndGggKyAxKSB7XG4gICAgaWYgKGluZGV4ID09PSBkYXRhc2V0Q29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBkYXRhc2V0Q29sb3JzW2luZGV4KytdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkYXRhc2V0Q29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuZnVuY3Rpb24gZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzKSB7XG4gIGNvbnN0IHByZXNldENvbG9ycyA9IGRhdGFzZXRDb2xvcnMubWFwKFN0cmluZyk7XG4gIGNvbnN0IHVzZWRDb2xvcnMgPSB1bmlxKFxuICAgIE9iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcChkID0+IFN0cmluZyhkLmNvbG9yKSlcbiAgKS5maWx0ZXIoYyA9PiBwcmVzZXRDb2xvcnMuaW5jbHVkZXMoYykpO1xuXG4gIGlmICh1c2VkQ29sb3JzLmxlbmd0aCA9PT0gcHJlc2V0Q29sb3JzLmxlbmd0aCkge1xuICAgIC8vIGlmIHdlIGFscmVhZHkgZGVwbGV0ZWQgdGhlIHBvb2wgb2YgY29sb3JcbiAgICByZXR1cm4gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgbGV0IGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB3aGlsZSAodXNlZENvbG9ycy5pbmNsdWRlcyhTdHJpbmcoY29sb3IpKSkge1xuICAgIGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV3RGF0YUVudHJ5KHtpbmZvID0ge30sIGRhdGF9LCBkYXRhc2V0cyA9IHt9KSB7XG4gIGNvbnN0IHZhbGlkYXRlZERhdGEgPSB2YWxpZGF0ZUlucHV0RGF0YShkYXRhKTtcbiAgaWYgKCF2YWxpZGF0ZWREYXRhKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgYWxsRGF0YSA9IHZhbGlkYXRlZERhdGEucm93cztcbiAgY29uc3QgZGF0YXNldEluZm8gPSB7XG4gICAgaWQ6IGdlbmVyYXRlSGFzaElkKDQpLFxuICAgIGxhYmVsOiAnbmV3IGRhdGFzZXQnLFxuICAgIC4uLmluZm9cbiAgfTtcbiAgY29uc3QgZGF0YUlkID0gZGF0YXNldEluZm8uaWQ7XG5cbiAgLy8gYWRkIHRhYmxlRmllbGRJbmRleCBhbmQgaWQgdG8gZmllbGRzXG4gIC8vIFRPRE86IGRvbid0IG5lZWQgaWQgYW5kIG5hbWUgYW5kIHRhYmxlRmllbGRJbmRleCBhbnltb3JlXG4gIC8vIEFkZCB2YWx1ZSBhY2Nlc3NvciBpbnN0ZWFkXG4gIGNvbnN0IGZpZWxkcyA9IHZhbGlkYXRlZERhdGEuZmllbGRzLm1hcCgoZiwgaSkgPT4gKHtcbiAgICAuLi5mLFxuICAgIGlkOiBmLm5hbWUsXG4gICAgdGFibGVGaWVsZEluZGV4OiBpICsgMVxuICB9KSk7XG5cbiAgcmV0dXJuIHtcbiAgICBbZGF0YUlkXToge1xuICAgICAgLi4uZGF0YXNldEluZm8sXG4gICAgICBjb2xvcjogZGF0YXNldEluZm8uY29sb3IgfHwgZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzKSxcbiAgICAgIGlkOiBkYXRhSWQsXG4gICAgICBhbGxEYXRhLFxuICAgICAgLy8gVE9ETzogbm8gbmVlZCB0byBtYWtlIGEgY29weSBhbnltb3JlLCBvbmx5IHNhdmUgZmllbGRlZEluZGV4XG4gICAgICBkYXRhOiBhbGxEYXRhLnNsaWNlKCksXG4gICAgICBmaWx0ZXJlZEluZGV4OiBhbGxEYXRhLm1hcCgoXywgaSkgPT4gaSksXG4gICAgICBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluOiBhbGxEYXRhLm1hcCgoXywgaSkgPT4gaSksXG4gICAgICBmaWVsZFBhaXJzOiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcyksXG4gICAgICBmaWVsZHNcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdWZmaXhBbmREZWxpbWl0ZXJzKGxheWVyTmFtZSwgc3VmZml4KSB7XG4gIHJldHVybiBsYXllck5hbWVcbiAgICAucmVwbGFjZShuZXcgUmVnRXhwKHN1ZmZpeCwgJ2lnJyksICcnKVxuICAgIC5yZXBsYWNlKC9bXywuXSsvZywgJyAnKVxuICAgIC50cmltKCk7XG59XG5cbi8qKlxuICogRmluZCBwb2ludCBmaWVsZHMgcGFpcnMgZnJvbSBmaWVsZHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBmaWVsZHNcbiAqIEByZXR1cm5zIHtBcnJheX0gZm91bmQgcG9pbnQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcykge1xuICBjb25zdCBhbGxOYW1lcyA9IGZpZWxkcy5tYXAoZiA9PiBmLm5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gZ2V0IGxpc3Qgb2YgYWxsIGZpZWxkcyB3aXRoIG1hdGNoaW5nIHN1ZmZpeGVzXG4gIHJldHVybiBhbGxOYW1lcy5yZWR1Y2UoKGNhcnJ5LCBmaWVsZE5hbWUsIGlkeCkgPT4ge1xuICAgIC8vIFRoaXMgc2VhcmNoIGZvciBwYWlycyB3aWxsIGVhcmx5IGV4aXQgaWYgZm91bmQuXG4gICAgZm9yIChjb25zdCBzdWZmaXhQYWlyIG9mIFRSSVBfUE9JTlRfRklFTERTKSB7XG4gICAgICAvLyBtYXRjaCBmaXJzdCBzdWZmaXhgYGBcbiAgICAgIGlmIChmaWVsZE5hbWUuZW5kc1dpdGgoc3VmZml4UGFpclswXSkpIHtcbiAgICAgICAgLy8gbWF0Y2ggc2Vjb25kIHN1ZmZpeFxuICAgICAgICBjb25zdCBvdGhlclBhdHRlcm4gPSBuZXcgUmVnRXhwKGAke3N1ZmZpeFBhaXJbMF19XFwkYCk7XG4gICAgICAgIGNvbnN0IHBhcnRuZXIgPSBmaWVsZE5hbWUucmVwbGFjZShvdGhlclBhdHRlcm4sIHN1ZmZpeFBhaXJbMV0pO1xuXG4gICAgICAgIGNvbnN0IHBhcnRuZXJJZHggPSBhbGxOYW1lcy5maW5kSW5kZXgoZCA9PiBkID09PSBwYXJ0bmVyKTtcbiAgICAgICAgaWYgKHBhcnRuZXJJZHggPiAtMSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHROYW1lID0gcmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyhcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHN1ZmZpeFBhaXJbMF1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2FycnkucHVzaCh7XG4gICAgICAgICAgICBkZWZhdWx0TmFtZSxcbiAgICAgICAgICAgIHBhaXI6IHtcbiAgICAgICAgICAgICAgbGF0OiB7XG4gICAgICAgICAgICAgICAgZmllbGRJZHg6IGlkeCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRzW2lkeF0ubmFtZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBsbmc6IHtcbiAgICAgICAgICAgICAgICBmaWVsZElkeDogcGFydG5lcklkeCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRzW3BhcnRuZXJJZHhdLm5hbWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1ZmZpeDogc3VmZml4UGFpclxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBjYXJyeTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2Fycnk7XG4gIH0sIFtdKTtcbn1cbiJdfQ==