kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
201 lines (172 loc) • 27.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _defaultSettings = require("../../constants/default-settings");
var _icons = require("../common/icons");
var _styledComponents2 = require("../common/styled-components");
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-radius: 2px;\n border: 1px solid ", ";\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 60px;\n justify-content: center;\n margin: 4px;\n padding: 8px 12px;\n width: 140px;\n\n :hover {\n border: 1px solid ", ";\n }\n\n .filtered-title {\n color: ", ";\n font-size: 12px;\n font-weight: 500;\n }\n .filtered-subtitle {\n color: ", ";\n font-size: 11px;\n }\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n border-radius: 2px;\n border: 1px solid ", ";\n color: ", ";\n cursor: pointer;\n font-weight: 500;\n height: 100px;\n margin: 4px;\n padding: 6px 10px;\n width: 100px;\n\n :hover {\n color: ", ";\n border: 1px solid ", ";\n }\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: row;\n margin: 35px 0;\n width: 100%;\n\n .description {\n width: 185px;\n \n .title {\n font-weight: 500;\n color: ", ";\n font-size: 12px;\n }\n .subtitle {\n color: ", ";\n font-size: 11px;\n }\n }\n\n .selection {\n display: flex;\n flex-wrap: wrap;\n flex: 1;\n padding-left: 50px;\n\n select {\n background-color: white;\n border-radius: 1px;\n display: inline-block;\n font: inherit;\n line-height: 1.5em;\n padding: 0.5em 3.5em 0.5em 1em;\n margin: 0; \n box-sizing: border-box;\n appearance: none;\n width: 250px;\n height: 36px;\n\n background-image:\n linear-gradient(45deg, transparent 50%, gray 50%),\n linear-gradient(135deg, gray 50%, transparent 50%),\n linear-gradient(to right, #ccc, #ccc);\n background-position:\n calc(100% - 20px) calc(1em + 2px),\n calc(100% - 15px) calc(1em + 2px),\n calc(100% - 2.5em) 4.5em;\n background-size:\n 5px 5px,\n 5px 5px,\n 1px 1.5em;\n background-repeat: no-repeat;\n }\n\n select:focus {\n background-image:\n linear-gradient(45deg, green 50%, transparent 50%),\n linear-gradient(135deg, transparent 50%, green 50%),\n linear-gradient(to right, #ccc, #ccc);\n background-position:\n calc(100% - 15px) 1em,\n calc(100% - 20px) 1em,\n calc(100% - 2.5em) 4.5em;\n background-size:\n 5px 5px,\n 5px 5px,\n 1px 1.5em;\n background-repeat: no-repeat;\n border-color: green;\n outline: 0;\n }\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var StyledExportDataSection = _styledComponents["default"].div(_templateObject(), function (props) {
return props.theme.textColorLT;
}, function (props) {
return props.theme.textColor;
});
var StyledDataType = _styledComponents["default"].div(_templateObject2(), function (props) {
return props.selected ? props.theme.primaryBtnBgd : props.theme.selectBorderColorLT;
}, function (props) {
return props.selected ? props.theme.primaryBtnBgd : props.theme.selectBorderColorLT;
}, function (props) {
return props.available && props.theme.primaryBtnBgd;
}, function (props) {
return props.available && props.theme.primaryBtnBgd;
});
var StyledFilteredDataOption = _styledComponents["default"].div(_templateObject3(), function (props) {
return props.selected ? props.theme.primaryBtnBgd : props.theme.selectBorderColorLT;
}, function (props) {
return props.theme.primaryBtnBgd;
}, function (props) {
return props.theme.textColorLT;
}, function (props) {
return props.theme.textColor;
});
var propTypes = {
datasets: _propTypes["default"].object.isRequired,
selectedDataset: _propTypes["default"].string,
dataType: _propTypes["default"].string.isRequired,
filtered: _propTypes["default"].bool.isRequired,
// callbacks
onClose: _propTypes["default"].func.isRequired,
onChangeExportSelectedDataset: _propTypes["default"].func.isRequired,
onChangeExportDataType: _propTypes["default"].func.isRequired,
onChangeExportFiltered: _propTypes["default"].func.isRequired,
onChangeExportConfig: _propTypes["default"].func.isRequired
};
var getDataRowCount = function getDataRowCount(datasets, selectedDataset, filtered) {
var selectedData = datasets[selectedDataset];
if (!selectedData) {
return "".concat(Object.keys(datasets).length, " Files ");
}
var allData = selectedData.allData,
data = selectedData.data;
var rowCount = filtered ? data.length : allData.length;
return "".concat(rowCount.toLocaleString('en'), " Rows");
};
var ExportDataModal = function ExportDataModal(_ref) {
var datasets = _ref.datasets,
selectedDataset = _ref.selectedDataset,
dataType = _ref.dataType,
filtered = _ref.filtered,
config = _ref.config,
onChangeExportDataType = _ref.onChangeExportDataType,
onChangeExportSelectedDataset = _ref.onChangeExportSelectedDataset,
onChangeExportFiltered = _ref.onChangeExportFiltered;
return _react["default"].createElement("div", {
className: "export-data-modal"
}, _react["default"].createElement(_styledComponents2.StyledModalContent, null, _react["default"].createElement("div", null, _react["default"].createElement(StyledExportDataSection, null, _react["default"].createElement("div", {
className: "description"
}, _react["default"].createElement("div", {
className: "title"
}, "Dataset"), _react["default"].createElement("div", {
className: "subtitle"
}, "Choose the datasets you want to export")), _react["default"].createElement("div", {
className: "selection"
}, _react["default"].createElement("select", {
value: selectedDataset,
onChange: function onChange(e) {
return onChangeExportSelectedDataset({
dataset: e.target.value
});
}
}, ['All'].concat(Object.keys(datasets)).map(function (d) {
return _react["default"].createElement("option", {
key: d,
value: d
}, datasets[d] && datasets[d].label || d);
})))), _react["default"].createElement(StyledExportDataSection, null, _react["default"].createElement("div", {
className: "description"
}, _react["default"].createElement("div", {
className: "title"
}, "Data Type"), _react["default"].createElement("div", {
className: "subtitle"
}, "Choose the type of data you want to export")), _react["default"].createElement("div", {
className: "selection"
}, _defaultSettings.EXPORT_DATA_TYPE_OPTIONS.map(function (op) {
return _react["default"].createElement(StyledDataType, {
key: op.id,
selected: dataType === op.id,
available: op.available,
onClick: function onClick() {
return op.available && onChangeExportDataType({
dataType: op.id
});
}
}, _react["default"].createElement(_icons.FileType, {
ext: op.label,
height: "80px",
fontSize: "11px"
}));
}))), _react["default"].createElement(StyledExportDataSection, null, _react["default"].createElement("div", {
className: "description"
}, _react["default"].createElement("div", {
className: "title"
}, "Filter Data"), _react["default"].createElement("div", {
className: "subtitle"
}, "You can choose exporting original data or filtered data")), _react["default"].createElement("div", {
className: "selection"
}, _react["default"].createElement(StyledFilteredDataOption, {
selected: !filtered,
onClick: function onClick() {
return onChangeExportFiltered({
filtered: false
});
}
}, _react["default"].createElement("div", {
className: "filtered-title"
}, "Unfiltered Data"), _react["default"].createElement("div", {
className: "filtered-subtitle"
}, getDataRowCount(datasets, selectedDataset, false))), _react["default"].createElement(StyledFilteredDataOption, {
selected: filtered,
onClick: function onClick() {
return onChangeExportFiltered({
filtered: true
});
}
}, _react["default"].createElement("div", {
className: "filtered-title"
}, "Filtered Data"), _react["default"].createElement("div", {
className: "filtered-subtitle"
}, getDataRowCount(datasets, selectedDataset, true))))))));
};
ExportDataModal.propTypes = propTypes;
var ExportDataModalFactory = function ExportDataModalFactory() {
return ExportDataModal;
};
var _default = ExportDataModalFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFscy9leHBvcnQtZGF0YS1tb2RhbC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRFeHBvcnREYXRhU2VjdGlvbiIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJ0ZXh0Q29sb3JMVCIsInRleHRDb2xvciIsIlN0eWxlZERhdGFUeXBlIiwic2VsZWN0ZWQiLCJwcmltYXJ5QnRuQmdkIiwic2VsZWN0Qm9yZGVyQ29sb3JMVCIsImF2YWlsYWJsZSIsIlN0eWxlZEZpbHRlcmVkRGF0YU9wdGlvbiIsInByb3BUeXBlcyIsImRhdGFzZXRzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsInNlbGVjdGVkRGF0YXNldCIsInN0cmluZyIsImRhdGFUeXBlIiwiZmlsdGVyZWQiLCJib29sIiwib25DbG9zZSIsImZ1bmMiLCJvbkNoYW5nZUV4cG9ydFNlbGVjdGVkRGF0YXNldCIsIm9uQ2hhbmdlRXhwb3J0RGF0YVR5cGUiLCJvbkNoYW5nZUV4cG9ydEZpbHRlcmVkIiwib25DaGFuZ2VFeHBvcnRDb25maWciLCJnZXREYXRhUm93Q291bnQiLCJzZWxlY3RlZERhdGEiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiYWxsRGF0YSIsImRhdGEiLCJyb3dDb3VudCIsInRvTG9jYWxlU3RyaW5nIiwiRXhwb3J0RGF0YU1vZGFsIiwiY29uZmlnIiwiZSIsImRhdGFzZXQiLCJ0YXJnZXQiLCJ2YWx1ZSIsImNvbmNhdCIsIm1hcCIsImQiLCJsYWJlbCIsIkVYUE9SVF9EQVRBX1RZUEVfT1BUSU9OUyIsIm9wIiwiaWQiLCJFeHBvcnREYXRhTW9kYWxGYWN0b3J5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSx1QkFBdUIsR0FBR0MsNkJBQU9DLEdBQVYsb0JBV2QsVUFBQUMs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USxFQUFFLENBQUMxQixRQUFyQztBQUErQyxJQUFBLE9BQU8sRUFBRTtBQUFBLGFBQU1NLHNCQUFzQixDQUFDO0FBQUNOLFFBQUFBLFFBQVEsRUFBRTtBQUFYLE9BQUQsQ0FBNUI7QUFBQTtBQUF4RCxLQUNFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZix1QkFERixFQUVFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixLQUFvQ1EsZUFBZSxDQUFDZixRQUFELEVBQVdJLGVBQVgsRUFBNEIsS0FBNUIsQ0FBbkQsQ0FGRixDQURGLEVBS0UsZ0NBQUMsd0JBQUQ7QUFBMEIsSUFBQSxRQUFRLEVBQUVHLFFBQXBDO0FBQThDLElBQUEsT0FBTyxFQUFFO0FBQUEsYUFBTU0sc0JBQXNCLENBQUM7QUFBQ04sUUFBQUEsUUFBUSxFQUFFO0FBQVgsT0FBRCxDQUE1QjtBQUFBO0FBQXZELEtBQ0U7QUFBSyxJQUFBLFNBQVMsRUFBQztBQUFmLHFCQURGLEVBRUU7QUFBSyxJQUFBLFNBQVMsRUFBQztBQUFmLEtBQW9DUSxlQUFlLENBQUNmLFFBQUQsRUFBV0ksZUFBWCxFQUE0QixJQUE1QixDQUFuRCxDQUZGLENBTEYsQ0FURixDQTFDRixDQURGLENBREYsQ0FYc0I7QUFBQSxDQUF4Qjs7QUFpRkFvQixlQUFlLENBQUN6QixTQUFoQixHQUE0QkEsU0FBNUI7O0FBRUEsSUFBTXNDLHNCQUFzQixHQUFHLFNBQXpCQSxzQkFBeUI7QUFBQSxTQUFNYixlQUFOO0FBQUEsQ0FBL0I7O2VBQ2VhLHNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtFWFBPUlRfREFUQV9UWVBFX09QVElPTlN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbmltcG9ydCB7RmlsZVR5cGV9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCB7U3R5bGVkTW9kYWxDb250ZW50fSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5cbmNvbnN0IFN0eWxlZEV4cG9ydERhdGFTZWN0aW9uID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgbWFyZ2luOiAzNXB4IDA7XG4gIHdpZHRoOiAxMDAlO1xuXG4gIC5kZXNjcmlwdGlvbiB7XG4gICAgd2lkdGg6IDE4NXB4O1xuICAgIFxuICAgIC50aXRsZSB7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yTFR9O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgIH1cbiAgICAuc3VidGl0bGUge1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICB9XG4gIH1cblxuICAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBmbGV4OiAxO1xuICAgIHBhZGRpbmctbGVmdDogNTBweDtcblxuICAgIHNlbGVjdCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFweDtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgICBsaW5lLWhlaWdodDogMS41ZW07XG4gICAgICBwYWRkaW5nOiAwLjVlbSAzLjVlbSAwLjVlbSAxZW07XG4gICAgICBtYXJnaW46IDA7ICAgICAgXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgIHdpZHRoOiAyNTBweDtcbiAgICAgIGhlaWdodDogMzZweDtcblxuICAgICAgYmFja2dyb3VuZC1pbWFnZTpcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB0cmFuc3BhcmVudCA1MCUsIGdyYXkgNTAlKSxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgZ3JheSA1MCUsIHRyYW5zcGFyZW50IDUwJSksXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2NjYywgI2NjYyk7XG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOlxuICAgICAgICBjYWxjKDEwMCUgLSAyMHB4KSBjYWxjKDFlbSArIDJweCksXG4gICAgICAgIGNhbGMoMTAwJSAtIDE1cHgpIGNhbGMoMWVtICsgMnB4KSxcbiAgICAgICAgY2FsYygxMDAlIC0gMi41ZW0pIDQuNWVtO1xuICAgICAgYmFja2dyb3VuZC1zaXplOlxuICAgICAgICA1cHggNXB4LFxuICAgICAgICA1cHggNXB4LFxuICAgICAgICAxcHggMS41ZW07XG4gICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIH1cblxuICAgIHNlbGVjdDpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOlxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGdyZWVuIDUwJSwgdHJhbnNwYXJlbnQgNTAlKSxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdHJhbnNwYXJlbnQgNTAlLCBncmVlbiA1MCUpLFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNjY2MsICNjY2MpO1xuICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjpcbiAgICAgICAgY2FsYygxMDAlIC0gMTVweCkgMWVtLFxuICAgICAgICBjYWxjKDEwMCUgLSAyMHB4KSAxZW0sXG4gICAgICAgIGNhbGMoMTAwJSAtIDIuNWVtKSA0LjVlbTtcbiAgICAgIGJhY2tncm91bmQtc2l6ZTpcbiAgICAgICAgNXB4IDVweCxcbiAgICAgICAgNXB4IDVweCxcbiAgICAgICAgMXB4IDEuNWVtO1xuICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47XG4gICAgICBvdXRsaW5lOiAwO1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRGF0YVR5cGUgPSBzdHlsZWQuZGl2YFxuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMuc2VsZWN0ZWQgPyBwcm9wcy50aGVtZS5wcmltYXJ5QnRuQmdkIDogcHJvcHMudGhlbWUuc2VsZWN0Qm9yZGVyQ29sb3JMVH07XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnNlbGVjdGVkID8gcHJvcHMudGhlbWUucHJpbWFyeUJ0bkJnZCA6IHByb3BzLnRoZW1lLnNlbGVjdEJvcmRlckNvbG9yTFR9O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGhlaWdodDogMTAwcHg7XG4gIG1hcmdpbjogNHB4O1xuICBwYWRkaW5nOiA2cHggMTBweDtcbiAgd2lkdGg6IDEwMHB4O1xuXG4gIDpob3ZlciB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMuYXZhaWxhYmxlICYmIHByb3BzLnRoZW1lLnByaW1hcnlCdG5CZ2R9O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMuYXZhaWxhYmxlICYmIHByb3BzLnRoZW1lLnByaW1hcnlCdG5CZ2R9O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRGaWx0ZXJlZERhdGFPcHRpb24gPSBzdHlsZWQuZGl2YFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMuc2VsZWN0ZWQgPyBwcm9wcy50aGVtZS5wcmltYXJ5QnRuQmdkIDogcHJvcHMudGhlbWUuc2VsZWN0Qm9yZGVyQ29sb3JMVH07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiA2MHB4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgbWFyZ2luOiA0cHg7XG4gIHBhZGRpbmc6IDhweCAxMnB4O1xuICB3aWR0aDogMTQwcHg7XG5cbiAgOmhvdmVyIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAke3Byb3BzID0+IHByb3BzLnRoZW1lLnByaW1hcnlCdG5CZ2R9O1xuICB9XG5cbiAgLmZpbHRlcmVkLXRpdGxlIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JMVH07XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIH1cbiAgLmZpbHRlcmVkLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgfVxuYDtcblxuY29uc3QgcHJvcFR5cGVzID0ge1xuICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBzZWxlY3RlZERhdGFzZXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRhdGFUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGZpbHRlcmVkOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAvLyBjYWxsYmFja3NcbiAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25DaGFuZ2VFeHBvcnRTZWxlY3RlZERhdGFzZXQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uQ2hhbmdlRXhwb3J0RGF0YVR5cGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uQ2hhbmdlRXhwb3J0RmlsdGVyZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uQ2hhbmdlRXhwb3J0Q29uZmlnOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBnZXREYXRhUm93Q291bnQgPSAoZGF0YXNldHMsIHNlbGVjdGVkRGF0YXNldCwgZmlsdGVyZWQpID0+IHtcbiAgY29uc3Qgc2VsZWN0ZWREYXRhID0gZGF0YXNldHNbc2VsZWN0ZWREYXRhc2V0XTtcbiAgaWYgKCFzZWxlY3RlZERhdGEpIHtcbiAgICByZXR1cm4gYCR7T2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aH0gRmlsZXMgYCA7XG4gIH1cbiAgY29uc3Qge2FsbERhdGEsIGRhdGF9ID0gc2VsZWN0ZWREYXRhO1xuICBjb25zdCByb3dDb3VudCA9IGZpbHRlcmVkID8gZGF0YS5sZW5ndGggOiBhbGxEYXRhLmxlbmd0aDtcbiAgcmV0dXJuIGAke3Jvd0NvdW50LnRvTG9jYWxlU3RyaW5nKCdlbicpfSBSb3dzYDtcbn07XG5cbmNvbnN0IEV4cG9ydERhdGFNb2RhbCA9ICh7XG4gIGRhdGFzZXRzLFxuICBzZWxlY3RlZERhdGFzZXQsXG4gIGRhdGFUeXBlLFxuICBmaWx0ZXJlZCxcbiAgY29uZmlnLFxuICAvLyBjYWxsYmFja3M6XG4gIG9uQ2hhbmdlRXhwb3J0RGF0YVR5cGUsXG4gIG9uQ2hhbmdlRXhwb3J0U2VsZWN0ZWREYXRhc2V0LFxuICBvbkNoYW5nZUV4cG9ydEZpbHRlcmVkXG59KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiZXhwb3J0LWRhdGEtbW9kYWxcIj5cbiAgICA8U3R5bGVkTW9kYWxDb250ZW50PlxuICAgICAgPGRpdj5cbiAgICAgICAgPFN0eWxlZEV4cG9ydERhdGFTZWN0aW9uPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgRGF0YXNldFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgIENob29zZSB0aGUgZGF0YXNldHMgeW91IHdhbnQgdG8gZXhwb3J0XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICAgICAgPHNlbGVjdCB2YWx1ZT17c2VsZWN0ZWREYXRhc2V0fSBvbkNoYW5nZT17ZSA9PiBvbkNoYW5nZUV4cG9ydFNlbGVjdGVkRGF0YXNldCh7ZGF0YXNldDogZS50YXJnZXQudmFsdWV9KX0+XG4gICAgICAgICAgICB7WydBbGwnXS5jb25jYXQoT2JqZWN0LmtleXMoZGF0YXNldHMpKS5tYXAoZCA9PiAoXG4gICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtkfSB2YWx1ZT17ZH0+eyhkYXRhc2V0c1tkXSAmJiBkYXRhc2V0c1tkXS5sYWJlbCkgfHwgZH08L29wdGlvbj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3R5bGVkRXhwb3J0RGF0YVNlY3Rpb24+XG5cbiAgICAgICAgPFN0eWxlZEV4cG9ydERhdGFTZWN0aW9uPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgRGF0YSBUeXBlXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgQ2hvb3NlIHRoZSB0eXBlIG9mIGRhdGEgeW91IHdhbnQgdG8gZXhwb3J0XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICAgICAge0VYUE9SVF9EQVRBX1RZUEVfT1BUSU9OUy5tYXAob3AgPT5cbiAgICAgICAgICAgICAgPFN0eWxlZERhdGFUeXBlXG4gICAgICAgICAgICAgICAga2V5PXtvcC5pZH1cbiAgICAgICAgICAgICAgICBzZWxlY3RlZD17ZGF0YVR5cGUgPT09IG9wLmlkfVxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZT17b3AuYXZhaWxhYmxlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9wLmF2YWlsYWJsZSAmJiBvbkNoYW5nZUV4cG9ydERhdGFUeXBlKHtkYXRhVHlwZTogb3AuaWR9KX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxGaWxlVHlwZSBleHQ9e29wLmxhYmVsfSBoZWlnaHQ9XCI4MHB4XCIgZm9udFNpemU9XCIxMXB4XCIgLz5cbiAgICAgICAgICAgICAgPC9TdHlsZWREYXRhVHlwZT5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3R5bGVkRXhwb3J0RGF0YVNlY3Rpb24+XG5cbiAgICAgICAgPFN0eWxlZEV4cG9ydERhdGFTZWN0aW9uPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgRmlsdGVyIERhdGFcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICBZb3UgY2FuIGNob29zZSBleHBvcnRpbmcgb3JpZ2luYWwgZGF0YSBvciBmaWx0ZXJlZCBkYXRhXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICAgICAgPFN0eWxlZEZpbHRlcmVkRGF0YU9wdGlvbiBzZWxlY3RlZD17IWZpbHRlcmVkfSBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZUV4cG9ydEZpbHRlcmVkKHtmaWx0ZXJlZDogZmFsc2V9KX0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsdGVyZWQtdGl0bGVcIj5VbmZpbHRlcmVkIERhdGE8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaWx0ZXJlZC1zdWJ0aXRsZVwiPntnZXREYXRhUm93Q291bnQoZGF0YXNldHMsIHNlbGVjdGVkRGF0YXNldCwgZmFsc2UpfTwvZGl2PlxuICAgICAgICAgICAgPC9TdHlsZWRGaWx0ZXJlZERhdGFPcHRpb24+XG4gICAgICAgICAgICA8U3R5bGVkRmlsdGVyZWREYXRhT3B0aW9uIHNlbGVjdGVkPXtmaWx0ZXJlZH0gb25DbGljaz17KCkgPT4gb25DaGFuZ2VFeHBvcnRGaWx0ZXJlZCh7ZmlsdGVyZWQ6IHRydWV9KX0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsdGVyZWQtdGl0bGVcIj5GaWx0ZXJlZCBEYXRhPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsdGVyZWQtc3VidGl0bGVcIj57Z2V0RGF0YVJvd0NvdW50KGRhdGFzZXRzLCBzZWxlY3RlZERhdGFzZXQsIHRydWUpfTwvZGl2PlxuICAgICAgICAgICAgPC9TdHlsZWRGaWx0ZXJlZERhdGFPcHRpb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3R5bGVkRXhwb3J0RGF0YVNlY3Rpb24+XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvU3R5bGVkTW9kYWxDb250ZW50PlxuICA8L2Rpdj5cbik7XG5cbkV4cG9ydERhdGFNb2RhbC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmNvbnN0IEV4cG9ydERhdGFNb2RhbEZhY3RvcnkgPSAoKSA9PiBFeHBvcnREYXRhTW9kYWw7XG5leHBvcnQgZGVmYXVsdCBFeHBvcnREYXRhTW9kYWxGYWN0b3J5O1xuIl19