kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
241 lines (228 loc) • 28.7 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DEFAULT_ERROR_MESSAGE = void 0;
exports.arrayDifference = arrayDifference;
exports.arrayInsert = arrayInsert;
exports.arrayMove = void 0;
exports.camelToTitle = camelToTitle;
exports.camelize = void 0;
exports.filterObjectByPredicate = filterObjectByPredicate;
exports.findById = findById;
exports.generateHashIdFromString = generateHashIdFromString;
exports.getError = getError;
exports.hasMobileWidth = hasMobileWidth;
exports.hasPortableWidth = hasPortableWidth;
exports.insertValue = void 0;
exports.isChrome = isChrome;
exports.isFunction = isFunction;
exports.isObject = isObject;
exports.isPlainObject = isPlainObject;
exports.isTest = isTest;
exports.set = void 0;
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _window = _interopRequireDefault(require("global/window"));
var _strings = require("./strings");
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* Generate a hash string based on string
* @param str
* @returns
*/
function generateHashIdFromString(str) {
// generate hash string based on string
var hash = 0;
var i;
var chr;
var len;
if (str.length === 0) return hash.toString();
for (i = 0, len = str.length; i < len; i++) {
chr = str.charCodeAt(i);
// eslint-disable-next-line no-bitwise
hash = (hash << 5) - hash + chr;
// eslint-disable-next-line no-bitwise
hash |= 0; // Convert to 32bit integer
}
return hash.toString(36);
}
/**
* Detect chrome
* @returns {boolean} - yes or no
*/
function isChrome() {
// Chrome 1+
return _window["default"].chrome && _window["default"].chrome.webstore;
}
/**
* Convert camel style names to title
* strokeColor -> Stroke Color
* @param {string} str
* @returns {string}
*/
function camelToTitle(str) {
var breakWord = str.replace(/([A-Z])/g, ' $1');
return (0, _strings.capitalizeFirstLetter)(breakWord);
}
/**
* Convert names to camel style
* Stroke Color -> strokeColor
* @param {string} str
* @returns {string}
*/
var camelize = exports.camelize = function camelize(str) {
return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) {
if (Number(match) === 0) return ''; // or if (/\s+/.test(match)) for white spaces
return index === 0 ? match.toLowerCase() : match.toUpperCase();
});
};
/**
* immutably insert value to an Array or Object
* @param {Array|Object} obj
* @param {Number|String} key
* @param {*} value
* @returns {Array|Object}
*/
var insertValue = exports.insertValue = function insertValue(obj, key, value) {
if (Array.isArray(obj) && typeof key === 'number') {
return [].concat((0, _toConsumableArray2["default"])(obj.slice(0, key)), [value], (0, _toConsumableArray2["default"])(obj.slice(key + 1, obj.length)));
}
return _objectSpread(_objectSpread({}, obj), {}, (0, _defineProperty2["default"])({}, key, value));
};
/**
* check if value is a loose object including a plain object, array, function
* @param {*} value
*/
function isObject(value) {
return value !== null && ((0, _typeof2["default"])(value) === 'object' || typeof value === 'function');
}
/**
* whether is an object
* @returns {boolean} - yes or no
*/
function isPlainObject(obj) {
return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj);
}
var _setPath = function setPath(_ref, value, obj) {
var _ref2 = (0, _toArray2["default"])(_ref),
key = _ref2[0],
next = _ref2.slice(1);
// is Object allows js object, array and function
if (!isObject(obj)) {
return obj;
}
if (next.length === 0) {
return insertValue(obj, key, value);
}
// @ts-ignore
return insertValue(obj, key, _setPath(next, value, Object.prototype.hasOwnProperty.call(obj, key) ? obj[key] : {}));
};
/**
* Immutable version of _.set
* @param {Array<String|Number>} path
* @param {*} value
* @param {Object} obj
* @returns {Object}
*/
// @ts-ignore
var set = exports.set = function set(path, value, obj) {
return obj === null ? obj : _setPath(path, value, obj);
};
var DEFAULT_ERROR_MESSAGE = exports.DEFAULT_ERROR_MESSAGE = 'Something went wrong';
/**
* Get error information of unknown type
* Extracts as much human readable information as possible
* Ensure result is an Error object suitable for throw or promise rejection
*
* @private
* @param {*} err - Unknown error
* @return {string} - human readable error msg
*/
function getError(err) {
var defaultMessage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_ERROR_MESSAGE;
if (!err) {
return defaultMessage;
}
if (typeof err === 'string') {
return err;
} else if (err instanceof Error) {
return err.message;
} else if ((0, _typeof2["default"])(err) === 'object') {
return Object.prototype.hasOwnProperty.call(err, 'message') ? getError(err.message) : Object.prototype.hasOwnProperty.call(err, 'error') ? getError(err.error) : Object.prototype.hasOwnProperty.call(err, 'err') ? getError(err.err) : JSON.stringify(err);
}
return defaultMessage;
}
function arrayInsert(arr, index, val) {
if (!Array.isArray(arr)) {
return arr;
}
return [].concat((0, _toConsumableArray2["default"])(arr.slice(0, index)), [val], (0, _toConsumableArray2["default"])(arr.slice(index)));
}
var arrayMoveMutate = function arrayMoveMutate(array, from, to) {
array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
};
/**
*
* @param {any[]} array
* @param {number} from
* @param {number} to
* @returns {any[]}
*/
var arrayMove = exports.arrayMove = function arrayMove(array, from, to) {
array = array.slice();
arrayMoveMutate(array, from, to);
return array;
};
function hasMobileWidth(breakPointValues) {
var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.palm, "px)"));
return mobileWidth.matches;
}
function hasPortableWidth(breakPointValues) {
var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.desk, "px)"));
return mobileWidth.matches;
}
function isTest() {
var _globalThis$process;
return ((_globalThis$process = globalThis.process) === null || _globalThis$process === void 0 || (_globalThis$process = _globalThis$process.env) === null || _globalThis$process === void 0 ? void 0 : _globalThis$process.NODE_ENV) === 'test';
}
/**
* Filters an object by an arbitrary predicate
* Returns a new object containing all elements that match the predicate
* @param {Object} obj Object to be filtered
* @param {Function} predicate Predicate by which the object will be filtered
* @returns {Object}
*/
function filterObjectByPredicate(obj, predicate) {
return Object.entries(obj).reduce(function (acc, entry) {
return predicate(entry[0], entry[1]) ? _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], entry[1])) : acc;
}, {});
}
function isFunction(func) {
return typeof func === 'function';
}
function findById(id) {
return function (arr) {
return arr.find(function (a) {
return a.id === id;
});
};
}
/**
* Returns array difference from
*/
function arrayDifference(source) {
var initial = [];
return function (compare) {
return source.reduce(function (acc, element) {
var foundElement = findById(element.id)(compare);
return foundElement ? [].concat((0, _toConsumableArray2["default"])(acc), [foundElement]) : acc;
}, initial);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3RyaW5ncyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZ2VuZXJhdGVIYXNoSWRGcm9tU3RyaW5nIiwic3RyIiwiaGFzaCIsImkiLCJjaHIiLCJsZW4iLCJ0b1N0cmluZyIsImNoYXJDb2RlQXQiLCJpc0Nocm9tZSIsIldpbmRvdyIsImNocm9tZSIsIndlYnN0b3JlIiwiY2FtZWxUb1RpdGxlIiwiYnJlYWtXb3JkIiwicmVwbGFjZSIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImNhbWVsaXplIiwiZXhwb3J0cyIsIm1hdGNoIiwiaW5kZXgiLCJOdW1iZXIiLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaW5zZXJ0VmFsdWUiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzbGljZSIsImlzT2JqZWN0IiwiX3R5cGVvZjIiLCJpc1BsYWluT2JqZWN0Iiwic2V0UGF0aCIsIl9yZWYiLCJfcmVmMiIsIl90b0FycmF5MiIsIm5leHQiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzZXQiLCJwYXRoIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFIiwiZ2V0RXJyb3IiLCJlcnIiLCJkZWZhdWx0TWVzc2FnZSIsInVuZGVmaW5lZCIsIkVycm9yIiwibWVzc2FnZSIsImVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImFycmF5SW5zZXJ0IiwiYXJyIiwidmFsIiwiYXJyYXlNb3ZlTXV0YXRlIiwiYXJyYXkiLCJmcm9tIiwidG8iLCJzcGxpY2UiLCJhcnJheU1vdmUiLCJoYXNNb2JpbGVXaWR0aCIsImJyZWFrUG9pbnRWYWx1ZXMiLCJtb2JpbGVXaWR0aCIsIm1hdGNoTWVkaWEiLCJwYWxtIiwibWF0Y2hlcyIsImhhc1BvcnRhYmxlV2lkdGgiLCJkZXNrIiwiaXNUZXN0IiwiX2dsb2JhbFRoaXMkcHJvY2VzcyIsImdsb2JhbFRoaXMiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJmaWx0ZXJPYmplY3RCeVByZWRpY2F0ZSIsInByZWRpY2F0ZSIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJlbnRyeSIsImlzRnVuY3Rpb24iLCJmdW5jIiwiZmluZEJ5SWQiLCJpZCIsImZpbmQiLCJhIiwiYXJyYXlEaWZmZXJlbmNlIiwic291cmNlIiwiaW5pdGlhbCIsImNvbXBhcmUiLCJlbGVtZW50IiwiZm91bmRFbGVtZW50Il0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBXaW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge2NhcGl0YWxpemVGaXJzdExldHRlcn0gZnJvbSAnLi9zdHJpbmdzJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGhhc2ggc3RyaW5nIGJhc2VkIG9uIHN0cmluZ1xuICogQHBhcmFtIHN0clxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaElkRnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGdlbmVyYXRlIGhhc2ggc3RyaW5nIGJhc2VkIG9uIHN0cmluZ1xuICBsZXQgaGFzaCA9IDA7XG4gIGxldCBpO1xuICBsZXQgY2hyO1xuICBsZXQgbGVuO1xuICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGhhc2gudG9TdHJpbmcoKTtcbiAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2hyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuICByZXR1cm4gaGFzaC50b1N0cmluZygzNik7XG59XG5cbi8qKlxuICogRGV0ZWN0IGNocm9tZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0geWVzIG9yIG5vXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Nocm9tZSgpOiBib29sZWFuIHtcbiAgLy8gQ2hyb21lIDErXG4gIHJldHVybiBXaW5kb3cuY2hyb21lICYmIFdpbmRvdy5jaHJvbWUud2Vic3RvcmU7XG59XG5cbi8qKlxuICogQ29udmVydCBjYW1lbCBzdHlsZSBuYW1lcyB0byB0aXRsZVxuICogc3Ryb2tlQ29sb3IgLT4gU3Ryb2tlIENvbG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxUb1RpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYnJlYWtXb3JkID0gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgJyAkMScpO1xuICByZXR1cm4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGJyZWFrV29yZCk7XG59XG5cbi8qKlxuICogQ29udmVydCBuYW1lcyB0byBjYW1lbCBzdHlsZVxuICogU3Ryb2tlIENvbG9yIC0+IHN0cm9rZUNvbG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgY2FtZWxpemUgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3fFxccyspL2csIChtYXRjaCwgaW5kZXgpID0+IHtcbiAgICBpZiAoTnVtYmVyKG1hdGNoKSA9PT0gMCkgcmV0dXJuICcnOyAvLyBvciBpZiAoL1xccysvLnRlc3QobWF0Y2gpKSBmb3Igd2hpdGUgc3BhY2VzXG4gICAgcmV0dXJuIGluZGV4ID09PSAwID8gbWF0Y2gudG9Mb3dlckNhc2UoKSA6IG1hdGNoLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBpbW11dGFibHkgaW5zZXJ0IHZhbHVlIHRvIGFuIEFycmF5IG9yIE9iamVjdFxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG9ialxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9XG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRWYWx1ZSA9IDxUIGV4dGVuZHMgYW55W10gfCBvYmplY3Q+KFxuICBvYmo6IFQsXG4gIGtleTogbnVtYmVyIHwgc3RyaW5nLFxuICB2YWx1ZTogYW55XG4pOiBUID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJiB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBbLi4ub2JqLnNsaWNlKDAsIGtleSksIHZhbHVlLCAuLi5vYmouc2xpY2Uoa2V5ICsgMSwgb2JqLmxlbmd0aCldIGFzIFQ7XG4gIH1cblxuICByZXR1cm4gey4uLm9iaiwgW2tleV06IHZhbHVlfTtcbn07XG5cbi8qKlxuICogY2hlY2sgaWYgdmFsdWUgaXMgYSBsb29zZSBvYmplY3QgaW5jbHVkaW5nIGEgcGxhaW4gb2JqZWN0LCBhcnJheSwgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgaXMgYW4gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaikgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG5jb25zdCBzZXRQYXRoID0gPFQgZXh0ZW5kcyBhbnlbXSB8IG9iamVjdD4oXG4gIFtrZXksIC4uLm5leHRdOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICB2YWx1ZTogYW55LFxuICBvYmo6IG9iamVjdCB8IGFueVtdXG4pOiBUID0+IHtcbiAgLy8gaXMgT2JqZWN0IGFsbG93cyBqcyBvYmplY3QsIGFycmF5IGFuZCBmdW5jdGlvblxuICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gb2JqIGFzIFQ7XG4gIH1cblxuICBpZiAobmV4dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaW5zZXJ0VmFsdWUob2JqLCBrZXksIHZhbHVlKSBhcyBUO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gaW5zZXJ0VmFsdWUoXG4gICAgb2JqLFxuICAgIGtleSxcbiAgICBzZXRQYXRoKG5leHQsIHZhbHVlLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpID8gb2JqW2tleV0gOiB7fSlcbiAgKTtcbn07XG5cbi8qKlxuICogSW1tdXRhYmxlIHZlcnNpb24gb2YgXy5zZXRcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBzZXQgPSA8VCBleHRlbmRzIGFueVtdIHwgb2JqZWN0PihwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBvYmo6IFQpOiBUID0+XG4gIG9iaiA9PT0gbnVsbCA/IG9iaiA6IHNldFBhdGgocGF0aCwgdmFsdWUsIG9iaik7XG5cbnR5cGUgRXJyb3JPYmplY3QgPSB7XG4gIGVycm9yPzogYW55O1xuICBlcnI/OiBhbnk7XG4gIG1lc3NhZ2U/OiBhbnk7XG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFID0gJ1NvbWV0aGluZyB3ZW50IHdyb25nJztcblxuLyoqXG4gKiBHZXQgZXJyb3IgaW5mb3JtYXRpb24gb2YgdW5rbm93biB0eXBlXG4gKiBFeHRyYWN0cyBhcyBtdWNoIGh1bWFuIHJlYWRhYmxlIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlXG4gKiBFbnN1cmUgcmVzdWx0IGlzIGFuIEVycm9yIG9iamVjdCBzdWl0YWJsZSBmb3IgdGhyb3cgb3IgcHJvbWlzZSByZWplY3Rpb25cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSAgZXJyIC0gVW5rbm93biBlcnJvclxuICogQHJldHVybiB7c3RyaW5nfSAtIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1zZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3IoXG4gIGVycj86IEVycm9yIHwgRXJyb3JPYmplY3QgfCBzdHJpbmcsXG4gIGRlZmF1bHRNZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0Vcbik6IHN0cmluZyB7XG4gIGlmICghZXJyKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNZXNzYWdlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBlcnIubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyLCAnbWVzc2FnZScpXG4gICAgICA/IGdldEVycm9yKGVyci5tZXNzYWdlKVxuICAgICAgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyLCAnZXJyb3InKVxuICAgICAgICA/IGdldEVycm9yKGVyci5lcnJvcilcbiAgICAgICAgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyLCAnZXJyJylcbiAgICAgICAgICA/IGdldEVycm9yKGVyci5lcnIpXG4gICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShlcnIpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRNZXNzYWdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlJbnNlcnQ8VD4oYXJyOiBUW10sIGluZGV4OiBudW1iZXIsIHZhbDogVCk6IFRbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHJldHVybiBbLi4uYXJyLnNsaWNlKDAsIGluZGV4KSwgdmFsLCAuLi5hcnIuc2xpY2UoaW5kZXgpXTtcbn1cblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gKGFycmF5LCBmcm9tLCB0bykgPT4ge1xuICBhcnJheS5zcGxpY2UodG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55W119IGFycmF5XG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbVxuICogQHBhcmFtIHtudW1iZXJ9IHRvXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmV4cG9ydCBjb25zdCBhcnJheU1vdmUgPSA8VD4oYXJyYXk6IFRbXSwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogVFtdID0+IHtcbiAgYXJyYXkgPSBhcnJheS5zbGljZSgpO1xuICBhcnJheU1vdmVNdXRhdGUoYXJyYXksIGZyb20sIHRvKTtcbiAgcmV0dXJuIGFycmF5O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc01vYmlsZVdpZHRoKGJyZWFrUG9pbnRWYWx1ZXM6IHtwYWxtOiBudW1iZXI7IGRlc2s6IG51bWJlcn0pOiBib29sZWFuIHtcbiAgY29uc3QgbW9iaWxlV2lkdGggPSBXaW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHticmVha1BvaW50VmFsdWVzLnBhbG19cHgpYCk7XG4gIHJldHVybiBtb2JpbGVXaWR0aC5tYXRjaGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9ydGFibGVXaWR0aChicmVha1BvaW50VmFsdWVzOiB7cGFsbTogbnVtYmVyOyBkZXNrOiBudW1iZXJ9KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vYmlsZVdpZHRoID0gV2luZG93Lm1hdGNoTWVkaWEoYChtYXgtd2lkdGg6ICR7YnJlYWtQb2ludFZhbHVlcy5kZXNrfXB4KWApO1xuICByZXR1cm4gbW9iaWxlV2lkdGgubWF0Y2hlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcz8uZW52Py5OT0RFX0VOViA9PT0gJ3Rlc3QnO1xufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gb2JqZWN0IGJ5IGFuIGFyYml0cmFyeSBwcmVkaWNhdGVcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBPYmplY3QgdG8gYmUgZmlsdGVyZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBQcmVkaWNhdGUgYnkgd2hpY2ggdGhlIG9iamVjdCB3aWxsIGJlIGZpbHRlcmVkXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0QnlQcmVkaWNhdGUob2JqLCBwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikucmVkdWNlKFxuICAgIChhY2MsIGVudHJ5KSA9PiAocHJlZGljYXRlKGVudHJ5WzBdLCBlbnRyeVsxXSkgPyB7Li4uYWNjLCBbZW50cnlbMF1dOiBlbnRyeVsxXX0gOiBhY2MpLFxuICAgIHt9XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmM6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEJ5SWQoaWQ6IHN0cmluZyk6IDxYIGV4dGVuZHMge2lkOiBzdHJpbmd9PihhcnI6IFhbXSkgPT4gWCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcnIgPT4gYXJyLmZpbmQoYSA9PiBhLmlkID09PSBpZCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBkaWZmZXJlbmNlIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5RGlmZmVyZW5jZTxYIGV4dGVuZHMge2lkOiBzdHJpbmd9Pihzb3VyY2U6IFhbXSk6IChjb21wYXJlOiBYW10pID0+IFhbXSB7XG4gIGNvbnN0IGluaXRpYWw6IFhbXSA9IFtdO1xuICByZXR1cm4gY29tcGFyZSA9PlxuICAgIHNvdXJjZS5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgZm91bmRFbGVtZW50ID0gZmluZEJ5SWQoZWxlbWVudC5pZCkoY29tcGFyZSk7XG4gICAgICByZXR1cm4gZm91bmRFbGVtZW50ID8gWy4uLmFjYywg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
;