@kepler.gl/utils
Version:
kepler.gl constants used by kepler.gl components, actions and reducers
201 lines (196 loc) • 28.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.calculateExportImageSize = calculateExportImageSize;
exports.convertToPng = convertToPng;
exports.dataURItoBlob = dataURItoBlob;
exports["default"] = void 0;
exports.downloadFile = downloadFile;
exports.exportHtml = exportHtml;
exports.exportImage = exportImage;
exports.exportJson = exportJson;
exports.exportMap = exportMap;
exports.exportToJsonString = exportToJsonString;
exports.getMapJSON = getMapJSON;
exports.getScaleFromImageSize = getScaleFromImageSize;
exports.isMSEdge = isMSEdge;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _window = require("global/window");
var _get = _interopRequireDefault(require("lodash/get"));
var _constants = require("@kepler.gl/constants");
var _commonUtils = require("@kepler.gl/common-utils");
var _domToImage = _interopRequireDefault(require("./dom-to-image"));
var _utils = require("./utils");
var _exportMapHtml = require("./export-map-html");
var _applicationConfig = require("./application-config");
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
var defaultResolution = _constants.OneXResolutionOption;
var defaultRatio = _constants.FourByThreeRatioOption;
function isMSEdge(window) {
// @ts-ignore msSaveOrOpenBlob was a proprietary addition to the Navigator object, added by Microsoft for Internet Explorer.
return Boolean(window.navigator && window.navigator.msSaveOrOpenBlob);
}
function getScaleFromImageSize() {
var imageW = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var imageH = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var mapW = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var mapH = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
if ([imageW, imageH, mapW, mapH].some(function (d) {
return d <= 0;
})) {
return 1;
}
var base = imageW / imageH > 1 ? imageW : imageH;
var mapBase = imageW / imageH > 1 ? mapW : mapH;
return base / mapBase;
}
function calculateExportImageSize(_ref) {
var mapW = _ref.mapW,
mapH = _ref.mapH,
ratio = _ref.ratio,
resolution = _ref.resolution;
if (mapW <= 0 || mapH <= 0) {
return null;
}
var ratioItem = _constants.EXPORT_IMG_RATIO_OPTIONS.find(function (op) {
return op.id === ratio;
}) || defaultRatio;
var resolutionItem = _constants.EXPORT_IMG_RESOLUTION_OPTIONS.find(function (op) {
return op.id === resolution;
}) || defaultResolution;
var _resolutionItem$getSi = resolutionItem.getSize(mapW, mapH),
scaledWidth = _resolutionItem$getSi.width,
scaledHeight = _resolutionItem$getSi.height;
var _ratioItem$getSize = ratioItem.getSize(scaledWidth, scaledHeight),
imageW = _ratioItem$getSize.width,
imageH = _ratioItem$getSize.height;
var _ref2 = ratioItem.id === _constants.EXPORT_IMG_RATIOS.CUSTOM ? {
scale: undefined
} : resolutionItem,
scale = _ref2.scale;
return {
scale: scale,
imageW: imageW,
imageH: imageH
};
}
function convertToPng(sourceElem, options) {
return _domToImage["default"].toPng(sourceElem, options);
}
function dataURItoBlob(dataURI) {
var binary = (0, _window.atob)(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
// write the bytes of the string to an ArrayBuffer
var ab = new _window.ArrayBuffer(binary.length);
// create a view into the buffer
var ia = new _window.Uint8Array(ab);
for (var i = 0; i < binary.length; i++) {
ia[i] = binary.charCodeAt(i);
}
return new _window.Blob([ab], {
type: mimeString
});
}
function downloadFile(fileBlob, fileName) {
if (isMSEdge(window)) {
window.navigator.msSaveOrOpenBlob(fileBlob, fileName);
} else {
var url = _window.URL.createObjectURL(fileBlob);
var link = _window.document.createElement('a');
link.setAttribute('href', url);
link.setAttribute('download', fileName);
_window.document.body.appendChild(link);
// in some cases where maps are embedded, e.g. need to
// create and dispatch an event so that the browser downloads
// the file instead of navigating to the url
var evt = new MouseEvent('click', {
view: window,
bubbles: false,
cancelable: true
});
link.dispatchEvent(evt);
_window.document.body.removeChild(link);
_window.URL.revokeObjectURL(url);
}
}
/**
* Whether color is rgb
* @returns
*/
function exportImage(uiStateExportImage) {
var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _applicationConfig.getApplicationConfig)().defaultImageName;
var imageDataUri = uiStateExportImage.imageDataUri;
if (imageDataUri) {
var file = dataURItoBlob(imageDataUri);
downloadFile(file, filename);
}
}
function exportToJsonString(data) {
try {
return JSON.stringify(data);
} catch (e) {
if (e instanceof TypeError) return e.message;
// Non-Standard Error Object Property
return e.description;
}
}
function getMapJSON(state) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _applicationConfig.getApplicationConfig)().defaultExportJsonSettings;
var hasData = options.hasData;
var schema = state.visState.schema;
if (!hasData) {
return schema.getConfigToSave(state);
}
var mapToSave = schema.save(state);
// add file name if title is not provided
var title = (0, _get["default"])(mapToSave, ['info', 'title']);
if (!title || !title.length) {
mapToSave = (0, _utils.set)(['info', 'title'], "keplergl_".concat((0, _commonUtils.generateHashId)(6)), mapToSave);
}
return mapToSave;
}
function exportJson(state) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var map = getMapJSON(state, options);
map.info.source = 'kepler.gl';
var fileBlob = new _window.Blob([exportToJsonString(map)], {
type: 'application/json'
});
var fileName = state.appName ? "".concat(state.appName, ".json") : (0, _applicationConfig.getApplicationConfig)().defaultJsonName;
downloadFile(fileBlob, fileName);
}
function exportHtml(state, options) {
var userMapboxToken = options.userMapboxToken,
exportMapboxAccessToken = options.exportMapboxAccessToken,
mode = options.mode;
var data = _objectSpread(_objectSpread({}, getMapJSON(state)), {}, {
mapboxApiAccessToken: (userMapboxToken || '') !== '' ? userMapboxToken : exportMapboxAccessToken,
mode: mode
});
var fileBlob = new _window.Blob([(0, _exportMapHtml.exportMapToHTML)(data)], {
type: 'text/html'
});
downloadFile(fileBlob, state.appName ? "".concat(state.appName, ".html") : (0, _applicationConfig.getApplicationConfig)().defaultHtmlName);
}
function exportMap(state) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _applicationConfig.getApplicationConfig)().defaultExportJsonSettings;
var imageDataUri = state.uiState.exportImage.imageDataUri;
var thumbnail = imageDataUri ? dataURItoBlob(imageDataUri) : null;
var mapToSave = getMapJSON(state, options);
return {
map: mapToSave,
thumbnail: thumbnail
};
}
var exporters = {
exportImage: exportImage,
exportJson: exportJson,
exportHtml: exportHtml
};
var _default = exports["default"] = exporters;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl9nZXQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2NvbnN0YW50cyIsIl9jb21tb25VdGlscyIsIl9kb21Ub0ltYWdlIiwiX3V0aWxzIiwiX2V4cG9ydE1hcEh0bWwiLCJfYXBwbGljYXRpb25Db25maWciLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImRlZmF1bHRSZXNvbHV0aW9uIiwiT25lWFJlc29sdXRpb25PcHRpb24iLCJkZWZhdWx0UmF0aW8iLCJGb3VyQnlUaHJlZVJhdGlvT3B0aW9uIiwiaXNNU0VkZ2UiLCJ3aW5kb3ciLCJCb29sZWFuIiwibmF2aWdhdG9yIiwibXNTYXZlT3JPcGVuQmxvYiIsImdldFNjYWxlRnJvbUltYWdlU2l6ZSIsImltYWdlVyIsInVuZGVmaW5lZCIsImltYWdlSCIsIm1hcFciLCJtYXBIIiwic29tZSIsImQiLCJiYXNlIiwibWFwQmFzZSIsImNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSIsIl9yZWYiLCJyYXRpbyIsInJlc29sdXRpb24iLCJyYXRpb0l0ZW0iLCJFWFBPUlRfSU1HX1JBVElPX09QVElPTlMiLCJmaW5kIiwib3AiLCJpZCIsInJlc29sdXRpb25JdGVtIiwiRVhQT1JUX0lNR19SRVNPTFVUSU9OX09QVElPTlMiLCJfcmVzb2x1dGlvbkl0ZW0kZ2V0U2kiLCJnZXRTaXplIiwic2NhbGVkV2lkdGgiLCJ3aWR0aCIsInNjYWxlZEhlaWdodCIsImhlaWdodCIsIl9yYXRpb0l0ZW0kZ2V0U2l6ZSIsIl9yZWYyIiwiRVhQT1JUX0lNR19SQVRJT1MiLCJDVVNUT00iLCJzY2FsZSIsImNvbnZlcnRUb1BuZyIsInNvdXJjZUVsZW0iLCJvcHRpb25zIiwiZG9tdG9pbWFnZSIsInRvUG5nIiwiZGF0YVVSSXRvQmxvYiIsImRhdGFVUkkiLCJiaW5hcnkiLCJhdG9iIiwic3BsaXQiLCJtaW1lU3RyaW5nIiwiYWIiLCJBcnJheUJ1ZmZlciIsImlhIiwiVWludDhBcnJheSIsImkiLCJjaGFyQ29kZUF0IiwiQmxvYiIsInR5cGUiLCJkb3dubG9hZEZpbGUiLCJmaWxlQmxvYiIsImZpbGVOYW1lIiwidXJsIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwibGluayIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImV2dCIsIk1vdXNlRXZlbnQiLCJ2aWV3IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJkaXNwYXRjaEV2ZW50IiwicmVtb3ZlQ2hpbGQiLCJyZXZva2VPYmplY3RVUkwiLCJleHBvcnRJbWFnZSIsInVpU3RhdGVFeHBvcnRJbWFnZSIsImZpbGVuYW1lIiwiZ2V0QXBwbGljYXRpb25Db25maWciLCJkZWZhdWx0SW1hZ2VOYW1lIiwiaW1hZ2VEYXRhVXJpIiwiZmlsZSIsImV4cG9ydFRvSnNvblN0cmluZyIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiVHlwZUVycm9yIiwibWVzc2FnZSIsImRlc2NyaXB0aW9uIiwiZ2V0TWFwSlNPTiIsInN0YXRlIiwiZGVmYXVsdEV4cG9ydEpzb25TZXR0aW5ncyIsImhhc0RhdGEiLCJzY2hlbWEiLCJ2aXNTdGF0ZSIsImdldENvbmZpZ1RvU2F2ZSIsIm1hcFRvU2F2ZSIsInNhdmUiLCJ0aXRsZSIsImdldCIsInNldCIsImNvbmNhdCIsImdlbmVyYXRlSGFzaElkIiwiZXhwb3J0SnNvbiIsIm1hcCIsImluZm8iLCJzb3VyY2UiLCJhcHBOYW1lIiwiZGVmYXVsdEpzb25OYW1lIiwiZXhwb3J0SHRtbCIsInVzZXJNYXBib3hUb2tlbiIsImV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuIiwibW9kZSIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwiZXhwb3J0TWFwVG9IVE1MIiwiZGVmYXVsdEh0bWxOYW1lIiwiZXhwb3J0TWFwIiwidWlTdGF0ZSIsInRodW1ibmFpbCIsImV4cG9ydGVycyIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9leHBvcnQtdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtCbG9iLCBVUkwsIGF0b2IsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyLCBkb2N1bWVudH0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC9nZXQnO1xuXG5pbXBvcnQge1xuICBFWFBPUlRfSU1HX1JFU09MVVRJT05fT1BUSU9OUyxcbiAgRVhQT1JUX0lNR19SQVRJT19PUFRJT05TLFxuICBSRVNPTFVUSU9OUyxcbiAgRVhQT1JUX0lNR19SQVRJT1MsXG4gIEZvdXJCeVRocmVlUmF0aW9PcHRpb24sXG4gIE9uZVhSZXNvbHV0aW9uT3B0aW9uXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7RXhwb3J0SW1hZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IGRvbXRvaW1hZ2UgZnJvbSAnLi9kb20tdG8taW1hZ2UnO1xuaW1wb3J0IHtzZXR9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtleHBvcnRNYXBUb0hUTUx9IGZyb20gJy4vZXhwb3J0LW1hcC1odG1sJztcbmltcG9ydCB7Z2V0QXBwbGljYXRpb25Db25maWd9IGZyb20gJy4vYXBwbGljYXRpb24tY29uZmlnJztcblxuY29uc3QgZGVmYXVsdFJlc29sdXRpb24gPSBPbmVYUmVzb2x1dGlvbk9wdGlvbjtcblxuY29uc3QgZGVmYXVsdFJhdGlvID0gRm91ckJ5VGhyZWVSYXRpb09wdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTVNFZGdlKHdpbmRvdzogV2luZG93KTogYm9vbGVhbiB7XG4gIC8vIEB0cy1pZ25vcmUgbXNTYXZlT3JPcGVuQmxvYiB3YXMgYSBwcm9wcmlldGFyeSBhZGRpdGlvbiB0byB0aGUgTmF2aWdhdG9yIG9iamVjdCwgYWRkZWQgYnkgTWljcm9zb2Z0IGZvciBJbnRlcm5ldCBFeHBsb3Jlci5cbiAgcmV0dXJuIEJvb2xlYW4od2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVGcm9tSW1hZ2VTaXplKGltYWdlVyA9IDAsIGltYWdlSCA9IDAsIG1hcFcgPSAwLCBtYXBIID0gMCkge1xuICBpZiAoW2ltYWdlVywgaW1hZ2VILCBtYXBXLCBtYXBIXS5zb21lKGQgPT4gZCA8PSAwKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgYmFzZSA9IGltYWdlVyAvIGltYWdlSCA+IDEgPyBpbWFnZVcgOiBpbWFnZUg7XG4gIGNvbnN0IG1hcEJhc2UgPSBpbWFnZVcgLyBpbWFnZUggPiAxID8gbWFwVyA6IG1hcEg7XG4gIHJldHVybiBiYXNlIC8gbWFwQmFzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSh7XG4gIG1hcFcsXG4gIG1hcEgsXG4gIHJhdGlvLFxuICByZXNvbHV0aW9uXG59OiB7XG4gIG1hcFc6IG51bWJlcjtcbiAgbWFwSDogbnVtYmVyO1xuICByYXRpbzoga2V5b2YgdHlwZW9mIEVYUE9SVF9JTUdfUkFUSU9TO1xuICByZXNvbHV0aW9uOiBrZXlvZiB0eXBlb2YgUkVTT0xVVElPTlM7XG59KSB7XG4gIGlmIChtYXBXIDw9IDAgfHwgbWFwSCA8PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByYXRpb0l0ZW0gPSBFWFBPUlRfSU1HX1JBVElPX09QVElPTlMuZmluZChvcCA9PiBvcC5pZCA9PT0gcmF0aW8pIHx8IGRlZmF1bHRSYXRpbztcblxuICBjb25zdCByZXNvbHV0aW9uSXRlbSA9XG4gICAgRVhQT1JUX0lNR19SRVNPTFVUSU9OX09QVElPTlMuZmluZChvcCA9PiBvcC5pZCA9PT0gcmVzb2x1dGlvbikgfHwgZGVmYXVsdFJlc29sdXRpb247XG5cbiAgY29uc3Qge3dpZHRoOiBzY2FsZWRXaWR0aCwgaGVpZ2h0OiBzY2FsZWRIZWlnaHR9ID0gcmVzb2x1dGlvbkl0ZW0uZ2V0U2l6ZShtYXBXLCBtYXBIKTtcblxuICBjb25zdCB7d2lkdGg6IGltYWdlVywgaGVpZ2h0OiBpbWFnZUh9ID0gcmF0aW9JdGVtLmdldFNpemUoc2NhbGVkV2lkdGgsIHNjYWxlZEhlaWdodCk7XG5cbiAgY29uc3Qge3NjYWxlfSA9IHJhdGlvSXRlbS5pZCA9PT0gRVhQT1JUX0lNR19SQVRJT1MuQ1VTVE9NID8ge3NjYWxlOiB1bmRlZmluZWR9IDogcmVzb2x1dGlvbkl0ZW07XG5cbiAgcmV0dXJuIHtcbiAgICBzY2FsZSxcbiAgICBpbWFnZVcsXG4gICAgaW1hZ2VIXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9Qbmcoc291cmNlRWxlbTogSFRNTEVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvbXRvaW1hZ2UudG9Qbmcoc291cmNlRWxlbSwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVVJJdG9CbG9iKGRhdGFVUkk6IHN0cmluZyk6IEJsb2Ige1xuICBjb25zdCBiaW5hcnkgPSBhdG9iKGRhdGFVUkkuc3BsaXQoJywnKVsxXSk7XG5cbiAgLy8gc2VwYXJhdGUgb3V0IHRoZSBtaW1lIGNvbXBvbmVudFxuICBjb25zdCBtaW1lU3RyaW5nID0gZGF0YVVSSS5zcGxpdCgnLCcpWzBdLnNwbGl0KCc6JylbMV0uc3BsaXQoJzsnKVswXTtcblxuICAvLyB3cml0ZSB0aGUgYnl0ZXMgb2YgdGhlIHN0cmluZyB0byBhbiBBcnJheUJ1ZmZlclxuICBjb25zdCBhYiA9IG5ldyBBcnJheUJ1ZmZlcihiaW5hcnkubGVuZ3RoKTtcblxuICAvLyBjcmVhdGUgYSB2aWV3IGludG8gdGhlIGJ1ZmZlclxuICBjb25zdCBpYSA9IG5ldyBVaW50OEFycmF5KGFiKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgIGlhW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEJsb2IoW2FiXSwge3R5cGU6IG1pbWVTdHJpbmd9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmlsZShmaWxlQmxvYjogQmxvYiwgZmlsZU5hbWU6IHN0cmluZykge1xuICBpZiAoaXNNU0VkZ2Uod2luZG93KSkge1xuICAgICh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYihmaWxlQmxvYiwgZmlsZU5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZUJsb2IpO1xuXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZU5hbWUpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAvLyBpbiBzb21lIGNhc2VzIHdoZXJlIG1hcHMgYXJlIGVtYmVkZGVkLCBlLmcuIG5lZWQgdG9cbiAgICAvLyBjcmVhdGUgYW5kIGRpc3BhdGNoIGFuIGV2ZW50IHNvIHRoYXQgdGhlIGJyb3dzZXIgZG93bmxvYWRzXG4gICAgLy8gdGhlIGZpbGUgaW5zdGVhZCBvZiBuYXZpZ2F0aW5nIHRvIHRoZSB1cmxcbiAgICBjb25zdCBldnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICB2aWV3OiB3aW5kb3csXG4gICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KTtcbiAgICBsaW5rLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgY29sb3IgaXMgcmdiXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0SW1hZ2UoXG4gIHVpU3RhdGVFeHBvcnRJbWFnZTogRXhwb3J0SW1hZ2UsXG4gIGZpbGVuYW1lID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS5kZWZhdWx0SW1hZ2VOYW1lXG4pIHtcbiAgY29uc3Qge2ltYWdlRGF0YVVyaX0gPSB1aVN0YXRlRXhwb3J0SW1hZ2U7XG4gIGlmIChpbWFnZURhdGFVcmkpIHtcbiAgICBjb25zdCBmaWxlID0gZGF0YVVSSXRvQmxvYihpbWFnZURhdGFVcmkpO1xuICAgIGRvd25sb2FkRmlsZShmaWxlLCBmaWxlbmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRvSnNvblN0cmluZyhkYXRhKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHJldHVybiBlLm1lc3NhZ2U7XG4gICAgLy8gTm9uLVN0YW5kYXJkIEVycm9yIE9iamVjdCBQcm9wZXJ0eVxuICAgIHJldHVybiAoZSBhcyBhbnkpLmRlc2NyaXB0aW9uO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXBKU09OKHN0YXRlLCBvcHRpb25zID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS5kZWZhdWx0RXhwb3J0SnNvblNldHRpbmdzKSB7XG4gIGNvbnN0IHtoYXNEYXRhfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNjaGVtYSA9IHN0YXRlLnZpc1N0YXRlLnNjaGVtYTtcblxuICBpZiAoIWhhc0RhdGEpIHtcbiAgICByZXR1cm4gc2NoZW1hLmdldENvbmZpZ1RvU2F2ZShzdGF0ZSk7XG4gIH1cblxuICBsZXQgbWFwVG9TYXZlID0gc2NoZW1hLnNhdmUoc3RhdGUpO1xuICAvLyBhZGQgZmlsZSBuYW1lIGlmIHRpdGxlIGlzIG5vdCBwcm92aWRlZFxuICBjb25zdCB0aXRsZSA9IGdldChtYXBUb1NhdmUsIFsnaW5mbycsICd0aXRsZSddKTtcbiAgaWYgKCF0aXRsZSB8fCAhdGl0bGUubGVuZ3RoKSB7XG4gICAgbWFwVG9TYXZlID0gc2V0KFsnaW5mbycsICd0aXRsZSddLCBga2VwbGVyZ2xfJHtnZW5lcmF0ZUhhc2hJZCg2KX1gLCBtYXBUb1NhdmUpO1xuICB9XG4gIHJldHVybiBtYXBUb1NhdmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRKc29uKHN0YXRlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICBjb25zdCBtYXAgPSBnZXRNYXBKU09OKHN0YXRlLCBvcHRpb25zKTtcbiAgbWFwLmluZm8uc291cmNlID0gJ2tlcGxlci5nbCc7XG4gIGNvbnN0IGZpbGVCbG9iID0gbmV3IEJsb2IoW2V4cG9ydFRvSnNvblN0cmluZyhtYXApXSwge3R5cGU6ICdhcHBsaWNhdGlvbi9qc29uJ30pO1xuICBjb25zdCBmaWxlTmFtZSA9IHN0YXRlLmFwcE5hbWUgPyBgJHtzdGF0ZS5hcHBOYW1lfS5qc29uYCA6IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkuZGVmYXVsdEpzb25OYW1lO1xuICBkb3dubG9hZEZpbGUoZmlsZUJsb2IsIGZpbGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydEh0bWwoc3RhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3Qge3VzZXJNYXBib3hUb2tlbiwgZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4sIG1vZGV9ID0gb3B0aW9ucztcblxuICBjb25zdCBkYXRhID0ge1xuICAgIC4uLmdldE1hcEpTT04oc3RhdGUpLFxuICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuOlxuICAgICAgKHVzZXJNYXBib3hUb2tlbiB8fCAnJykgIT09ICcnID8gdXNlck1hcGJveFRva2VuIDogZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4sXG4gICAgbW9kZVxuICB9O1xuXG4gIGNvbnN0IGZpbGVCbG9iID0gbmV3IEJsb2IoW2V4cG9ydE1hcFRvSFRNTChkYXRhKV0sIHt0eXBlOiAndGV4dC9odG1sJ30pO1xuICBkb3dubG9hZEZpbGUoXG4gICAgZmlsZUJsb2IsXG4gICAgc3RhdGUuYXBwTmFtZSA/IGAke3N0YXRlLmFwcE5hbWV9Lmh0bWxgIDogZ2V0QXBwbGljYXRpb25Db25maWcoKS5kZWZhdWx0SHRtbE5hbWVcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE1hcChzdGF0ZSwgb3B0aW9ucyA9IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkuZGVmYXVsdEV4cG9ydEpzb25TZXR0aW5ncykge1xuICBjb25zdCB7aW1hZ2VEYXRhVXJpfSA9IHN0YXRlLnVpU3RhdGUuZXhwb3J0SW1hZ2U7XG4gIGNvbnN0IHRodW1ibmFpbDogQmxvYiB8IG51bGwgPSBpbWFnZURhdGFVcmkgPyBkYXRhVVJJdG9CbG9iKGltYWdlRGF0YVVyaSkgOiBudWxsO1xuICBjb25zdCBtYXBUb1NhdmUgPSBnZXRNYXBKU09OKHN0YXRlLCBvcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIG1hcDogbWFwVG9TYXZlLFxuICAgIHRodW1ibmFpbFxuICB9O1xufVxuXG5jb25zdCBleHBvcnRlcnMgPSB7XG4gIGV4cG9ydEltYWdlLFxuICBleHBvcnRKc29uLFxuICBleHBvcnRIdG1sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHBvcnRlcnM7XG4iXSwibWFwcGlu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
;