kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
264 lines (232 loc) • 35.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
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 _reactJsonPretty = _interopRequireDefault(require("react-json-pretty"));
var _userGuides = require("../../constants/user-guides");
var _icons = require("../common/icons");
var _styledComponents2 = require("../common/styled-components");
var _defaultSettings = require("../../constants/default-settings");
var _excluded = ["children"];
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
var NO_OP = function NO_OP() {};
var StyledInput = _styledComponents["default"].input(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n padding: ", ";\n color: ", ";\n height: ", ";\n outline: 0;\n font-size: ", ";\n\n :active,\n :focus,\n &.focus,\n &.active {\n outline: 0;\n }\n"])), function (props) {
return props.theme.inputPadding;
}, function (props) {
return props.error ? 'red' : props.theme.titleColorLT;
}, function (props) {
return props.theme.inputBoxHeight;
}, function (props) {
return props.theme.inputFontSize;
});
var StyledWarning = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-weight: ", ";\n"])), function (props) {
return props.theme.errorColor;
}, function (props) {
return props.theme.selectFontWeightBold;
});
var StyledLink = _styledComponents["default"].a(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n text-decoration-line: underline !important;\n"])));
var INTRA_SECTION_MARGING = '8px';
var ExportMapStyledExportSection = (0, _styledComponents["default"])(_styledComponents2.StyledExportSection)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n .disclaimer {\n font-size: ", ";\n color: ", ";\n margin-top: 12px;\n }\n"])), function (props) {
return props.theme.inputFontSize;
}, function (props) {
return props.theme.inputColor;
});
var Link = function Link(_ref) {
var children = _ref.children,
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
return (/*#__PURE__*/_react["default"].createElement(StyledLink, (0, _extends2["default"])({
target: "_blank",
rel: "noopener noreferrer"
}, props), children)
);
};
var BigStyledType = (0, _styledComponents["default"])(_styledComponents2.StyledType)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n height: unset;\n width: unset;\n img {\n width: 180px;\n height: 120px;\n }\n"])));
var exportHtmlPropTypes = {
options: _propTypes["default"].object,
onEditUserMapboxAccessToken: _propTypes["default"].func.isRequired
};
var ExportHtmlMap = function ExportHtmlMap(_ref2) {
var _ref2$onChangeExportM = _ref2.onChangeExportMapHTMLMode,
onChangeExportMapHTMLMode = _ref2$onChangeExportM === void 0 ? NO_OP : _ref2$onChangeExportM,
_ref2$onEditUserMapbo = _ref2.onEditUserMapboxAccessToken,
onEditUserMapboxAccessToken = _ref2$onEditUserMapbo === void 0 ? NO_OP : _ref2$onEditUserMapbo,
_ref2$options = _ref2.options,
options = _ref2$options === void 0 ? {} : _ref2$options;
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledExportSection, {
style: {
marginTop: INTRA_SECTION_MARGING
}
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "description"
}), /*#__PURE__*/_react["default"].createElement("div", {
className: "selection"
}, "Export your map into an interactive html file.")), /*#__PURE__*/_react["default"].createElement(ExportMapStyledExportSection, {
className: "export-map-modal__html-options"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "description"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "title"
}, "Mapbox access token"), /*#__PURE__*/_react["default"].createElement("div", {
className: "subtitle"
}, "Use your own Mapbox access token in the html (optional)")), /*#__PURE__*/_react["default"].createElement("div", {
className: "selection"
}, /*#__PURE__*/_react["default"].createElement(StyledInput, {
onChange: function onChange(e) {
return onEditUserMapboxAccessToken(e.target.value);
},
type: "text",
placeholder: "Paste your Mapbox access token",
value: options ? options.userMapboxToken : ''
}), /*#__PURE__*/_react["default"].createElement("div", {
className: "disclaimer"
}, /*#__PURE__*/_react["default"].createElement(StyledWarning, null, _defaultSettings.TOKEN_MISUSE_WARNING), /*#__PURE__*/_react["default"].createElement("span", null, _defaultSettings.DISCLAIMER), /*#__PURE__*/_react["default"].createElement(Link, {
href: _userGuides.GITHUB_EXPORT_HTML_MAP
}, "How to update an existing map token.")))), /*#__PURE__*/_react["default"].createElement(ExportMapStyledExportSection, null, /*#__PURE__*/_react["default"].createElement("div", {
className: "description"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "title"
}, "Map Mode"), /*#__PURE__*/_react["default"].createElement("div", {
className: "subtitle"
}, "Select the app mode. More ", /*#__PURE__*/_react["default"].createElement("a", {
href: _userGuides.GITHUB_EXPORT_HTML_MAP_MODES
}, "info"))), /*#__PURE__*/_react["default"].createElement("div", {
className: "selection"
}, _defaultSettings.EXPORT_HTML_MAP_MODE_OPTIONS.map(function (mode) {
return (/*#__PURE__*/_react["default"].createElement(BigStyledType, {
key: mode.id,
selected: options.mode === mode.id,
available: mode.available,
onClick: function onClick() {
return mode.available && onChangeExportMapHTMLMode(mode.id);
}
}, /*#__PURE__*/_react["default"].createElement("img", {
src: mode.url,
alt: ""
}), /*#__PURE__*/_react["default"].createElement("p", null, "Allow users to ", mode.label, " the map"))
);
}))))
);
};
ExportHtmlMap.propTypes = exportHtmlPropTypes;
var StyledJsonExportSection = (0, _styledComponents["default"])(ExportMapStyledExportSection)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n .note {\n color: ", ";\n font-size: 11px;\n }\n\n .viewer {\n border: 1px solid ", ";\n background-color: white;\n border-radius: 2px;\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 height: 180px;\n width: 100%;\n overflow-y: scroll;\n overflow-x: auto;\n white-space: pre-wrap;\n word-wrap: break-word;\n max-width: 600px;\n }\n"])), function (props) {
return props.theme.errorColor;
}, function (props) {
return props.theme.selectBorderColorLT;
});
var exportJsonPropTypes = {
options: _propTypes["default"].object
};
var ExportJsonMap = function ExportJsonMap(_ref3) {
var _ref3$config = _ref3.config,
config = _ref3$config === void 0 ? {} : _ref3$config;
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledExportSection, {
style: {
marginTop: INTRA_SECTION_MARGING
}
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "description"
}), /*#__PURE__*/_react["default"].createElement("div", {
className: "selection"
}, "Export current map data and config into a single Json file. You can later open the same map by uploading this file to kepler.gl.")), /*#__PURE__*/_react["default"].createElement(StyledJsonExportSection, {
className: "export-map-modal__json-options"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "description"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "title"
}, "Map Config"), /*#__PURE__*/_react["default"].createElement("div", {
className: "subtitle"
}, _defaultSettings.MAP_CONFIG_DESCRIPTION, /*#__PURE__*/_react["default"].createElement(Link, {
href: _userGuides.GITHUB_ADD_DATA_TO_MAP
}, "addDataToMap"), ".")), /*#__PURE__*/_react["default"].createElement("div", {
className: "selection"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "viewer"
}, /*#__PURE__*/_react["default"].createElement(_reactJsonPretty["default"], {
id: "json-pretty",
json: config
})), /*#__PURE__*/_react["default"].createElement("div", {
className: "disclaimer"
}, /*#__PURE__*/_react["default"].createElement(StyledWarning, null, "* Map config is coupled with loaded datasets. \u2018dataId\u2019 is used to bind layers, filters, and tooltips to a specific dataset. When passing this config to addDataToMap, make sure the dataset id matches the dataId/s in this config.")))))
);
};
ExportJsonMap.propTypes = exportJsonPropTypes;
var propTypes = {
options: _propTypes["default"].object,
onEditUserMapboxAccessToken: _propTypes["default"].func.isRequired,
onChangeExportData: _propTypes["default"].func,
onChangeExportMapType: _propTypes["default"].func,
mapFormat: _propTypes["default"].string
};
var style = {
width: '100%'
};
var ExportMapModal = function ExportMapModal(_ref4) {
var _EXPORT_MAP_FORMATS$H;
var _ref4$config = _ref4.config,
config = _ref4$config === void 0 ? {} : _ref4$config,
_ref4$onChangeExportD = _ref4.onChangeExportData,
onChangeExportData = _ref4$onChangeExportD === void 0 ? NO_OP : _ref4$onChangeExportD,
_ref4$onChangeExportM = _ref4.onChangeExportMapFormat,
onChangeExportMapFormat = _ref4$onChangeExportM === void 0 ? NO_OP : _ref4$onChangeExportM,
_ref4$onChangeExportM2 = _ref4.onChangeExportMapHTMLMode,
onChangeExportMapHTMLMode = _ref4$onChangeExportM2 === void 0 ? NO_OP : _ref4$onChangeExportM2,
_ref4$onEditUserMapbo = _ref4.onEditUserMapboxAccessToken,
onEditUserMapboxAccessToken = _ref4$onEditUserMapbo === void 0 ? NO_OP : _ref4$onEditUserMapbo,
_ref4$options = _ref4.options,
options = _ref4$options === void 0 ? {} : _ref4$options;
return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalContent, {
className: "export-map-modal"
}, /*#__PURE__*/_react["default"].createElement("div", {
style: style
}, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledExportSection, {
style: {
marginBottom: INTRA_SECTION_MARGING
}
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "description"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "title"
}, "Map format"), /*#__PURE__*/_react["default"].createElement("div", {
className: "subtitle"
}, "Choose the format to export your map to")), /*#__PURE__*/_react["default"].createElement("div", {
className: "selection"
}, _defaultSettings.EXPORT_MAP_FORMAT_OPTIONS.map(function (op) {
return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledType, {
key: op.id,
selected: options.format === op.id,
available: op.available,
onClick: function onClick() {
return op.available && onChangeExportMapFormat(op.id);
}
}, /*#__PURE__*/_react["default"].createElement(_icons.FileType, {
ext: op.label,
height: "80px",
fontSize: "11px"
}))
);
}))), (_EXPORT_MAP_FORMATS$H = {}, (0, _defineProperty2["default"])(_EXPORT_MAP_FORMATS$H, _defaultSettings.EXPORT_MAP_FORMATS.HTML, /*#__PURE__*/_react["default"].createElement(ExportHtmlMap, {
onChangeExportMapHTMLMode: onChangeExportMapHTMLMode,
onEditUserMapboxAccessToken: onEditUserMapboxAccessToken,
options: options[options.format]
})), (0, _defineProperty2["default"])(_EXPORT_MAP_FORMATS$H, _defaultSettings.EXPORT_MAP_FORMATS.JSON, /*#__PURE__*/_react["default"].createElement(ExportJsonMap, {
config: config,
onChangeExportData: onChangeExportData,
options: options[options.format]
})), _EXPORT_MAP_FORMATS$H)[options.format]))
);
};
ExportMapModal.propTypes = propTypes;
var ExportMapModalFactory = function ExportMapModalFactory() {
return ExportMapModal;
};
var _default = exports["default"] = ExportMapModalFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFscy9leHBvcnQtbWFwLW1vZGFsLmpzIl0sIm5hbWVzIjpbIk5PX09QIiwiU3R5bGVkSW5wdXQiLCJzdHlsZWQiLCJpbnB1dCIsInByb3BzIiwidGhlbWUiLCJpbnB1dFBhZGRpbmciLCJlcnJvciIsInRpdGxlQ29sb3JMVCIsImlucHV0Qm94SGVpZ2h0IiwiaW5wdXRGb250U2l6ZSIsIlN0eWxlZFdhcm5pbmciLCJzcGFuIiwiZXJyb3JDb2xvciIsInNlbGVjdEZvbnRXZWlnaHRCb2xkIiwiU3R5bGVkTGluayIsImEiLCJJTlRSQV9TRUNUSU9OX01BUkdJTkciLCJFeHBvcnRNYXBTdHlsZWRFeHBvcnRTZWN0aW9uIiwiU3R5bGVkRXhwb3J0U2VjdGlvbiIsImlucHV0Q29sb3IiLCJMaW5rIiwiY2hpbGRyZW4iLCJCaWdTdHlsZWRUeXBlIiwiU3R5bGVkVHlwZSIsImV4cG9ydEh0bWxQcm9wVHlwZXMiLCJvcHRpb25zIiwiUHJvcFR5cGVzIiwib2JqZWN0Iiwib25FZGl0VXNlck1hcGJveEFjY2Vzc1Rva2VuIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJFeHBvcnRIdG1sTWFwIiwib25DaGFuZ2VFeHBvcnRNYXBIVE1MTW9kZSIsIm1hcmdpblRvcCIsImUiLCJ0YXJnZXQiLCJ2YWx1ZSIsInVzZXJNYXBib3hUb2tlbiIsIlRPS0VOX01JU1VTRV9XQVJOSU5HIiwiRElTQ0xBSU1FUiIsIkdJVEhVQl9FWFBPUlRfSFRNTF9NQVAiLCJHSVRIVUJfRVhQT1JUX0hUTUxfTUFQX01PREVTIiwiRVhQT1JUX0hUTUxfTUFQX01PREVfT1BUSU9OUyIsIm1hcCIsIm1vZGUiLCJpZCIsImF2YWlsYWJsZSIsInVybCIsImxhYmVsIiwicHJvcFR5cGVzIiwiU3R5bGVkSnNvbkV4cG9ydFNlY3Rpb24iLCJzZWxlY3RCb3JkZXJDb2xvckxUIiwiZXhwb3J0SnNvblByb3BUeXBlcyIsIkV4cG9ydEpzb25NYXAiLCJjb25maWciLCJNQVBfQ09ORklHX0RFU0NSSVBUSU9OIiwiR0lUSFVCX0FERF9EQVRBX1RPX01BUCIsIm9uQ2hhbmdlRXhwb3J0RGF0YSIsIm9uQ2hhbmdlRXhwb3J0TWFwVHlwZSIsIm1hcEZvcm1hdCIsInN0cmluZyIsInN0eWxlIiwid2lkdGgiLCJFeHBvcnRNYXBNb2RhbCIsIm9uQ2hhbmdlRXhwb3J0TWFwRm9ybWF0IiwibWFyZ2luQm90dG9tIiwiRVhQT1JUX01BUF9GT1JNQVRfT1BUSU9OUyIsIm9wIiwiZm9ybWF0IiwiRVhQT1JUX01BUF9GT1JNQVRTIiwiSFRNTCIsIkpTT04iLCJFeHBvcnRNYXBNb2RhbEZhY3RvcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOzs7Ozs7QUFTQSxJQUFNQSxLQUFLLEdBQUcsU0FBUkEsS0FBUSxHQUFNLENBQUUsQ0FBdEI7O0FBRUEsSUFBTUMsV0FBVyxHQUFHQyw2QkFBT0MsS0FBVix3UUFFSixVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLFlBQWhCO0FBQUEsQ0FGRCxFQUdOLFVBQUFGLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNHLEtBQU4sR0FBYyxLQUFkLEdBQXNCSCxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsWUFBdEM7QUFBQSxDQUhDLEVBSUwsVUFBQUosS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZSSxjQUFoQjtBQUFBLENBSkEsRUFNRixVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlLLGFBQWhCO0FBQUEsQ0FOSCxDQUFqQjs7QUFnQkEsSUFBTUMsYUFBYSxHQUFHVCw2QkFBT1UsSUFBVixpSUFDUixVQUFBUixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlRLFVBQWhCO0FBQUEsQ0FERyxFQUVGLFVBQUFULEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4s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LEVBQUVzQixFQUFFLENBQUNuQixLQUFsQjtBQUF5QixVQUFBLE1BQU0sRUFBQyxNQUFoQztBQUF1QyxVQUFBLFFBQVEsRUFBQztBQUFoRCxVQU5GO0FBRCtCO0FBQUEsS0FBaEMsQ0FESCxDQVRGLENBREYsRUF1QkcscUZBQ0VxQixvQ0FBbUJDLElBRHJCLGVBRUcsZ0NBQUMsYUFBRDtBQUNFLE1BQUEseUJBQXlCLEVBQUV0Qyx5QkFEN0I7QUFFRSxNQUFBLDJCQUEyQixFQUFFSiwyQkFGL0I7QUFHRSxNQUFBLE9BQU8sRUFBRUgsT0FBTyxDQUFDQSxPQUFPLENBQUMyQyxNQUFUO0FBSGxCLE1BRkgsMkRBUUVDLG9DQUFtQkUsSUFSckIsZUFTRyxnQ0FBQyxhQUFEO0FBQ0UsTUFBQSxNQUFNLEVBQUVqQixNQURWO0FBRUUsTUFBQSxrQkFBa0IsRUFBRUcsa0JBRnRCO0FBR0UsTUFBQSxPQUFPLEVBQUVoQyxPQUFPLENBQUNBLE9BQU8sQ0FBQzJDLE1BQVQ7QUFIbEIsTUFUSCwwQkFlQzNDLE9BQU8sQ0FBQzJDLE1BZlQsQ0F2QkgsQ0FERjtBQVJxQjtBQUFBLENBQXZCOztBQW9EQUwsY0FBYyxDQUFDZCxTQUFmLEdBQTJCQSxTQUEzQjs7QUFFQSxJQUFNdUIscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUF3QjtBQUFBLFNBQU1ULGNBQU47QUFBQSxDQUE5Qjs7b0NBRWVTLHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBKU09OUHJldHR5IGZyb20gJ3JlYWN0LWpzb24tcHJldHR5JztcbmltcG9ydCB7R0lUSFVCX0VYUE9SVF9IVE1MX01BUCwgR0lUSFVCX0FERF9EQVRBX1RPX01BUCwgR0lUSFVCX0VYUE9SVF9IVE1MX01BUF9NT0RFU30gZnJvbSAnY29uc3RhbnRzL3VzZXItZ3VpZGVzJztcbmltcG9ydCB7RmlsZVR5cGV9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCB7XG4gIFN0eWxlZE1vZGFsQ29udGVudCxcbiAgU3R5bGVkRXhwb3J0U2VjdGlvbixcbiAgU3R5bGVkVHlwZVxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBESVNDTEFJTUVSLFxuICBFWFBPUlRfTUFQX0ZPUk1BVFMsXG4gIEVYUE9SVF9NQVBfRk9STUFUX09QVElPTlMsXG4gIEVYUE9SVF9IVE1MX01BUF9NT0RFX09QVElPTlMsXG4gIE1BUF9DT05GSUdfREVTQ1JJUFRJT04sXG4gIFRPS0VOX01JU1VTRV9XQVJOSU5HXG59IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuY29uc3QgTk9fT1AgPSAoKSA9PiB7fTtcblxuY29uc3QgU3R5bGVkSW5wdXQgPSBzdHlsZWQuaW5wdXRgXG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmlucHV0UGFkZGluZ307XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLmVycm9yID8gJ3JlZCcgOiBwcm9wcy50aGVtZS50aXRsZUNvbG9yTFR9O1xuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaW5wdXRCb3hIZWlnaHR9O1xuICBvdXRsaW5lOiAwO1xuICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaW5wdXRGb250U2l6ZX07XG5cbiAgOmFjdGl2ZSxcbiAgOmZvY3VzLFxuICAmLmZvY3VzLFxuICAmLmFjdGl2ZSB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkV2FybmluZyA9IHN0eWxlZC5zcGFuYFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvckNvbG9yfTtcbiAgZm9udC13ZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2VsZWN0Rm9udFdlaWdodEJvbGR9O1xuYDtcblxuY29uc3QgU3R5bGVkTGluayA9IHN0eWxlZC5hYFxuICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XG5gO1xuXG5jb25zdCBJTlRSQV9TRUNUSU9OX01BUkdJTkcgPSAnOHB4JztcblxuY29uc3QgRXhwb3J0TWFwU3R5bGVkRXhwb3J0U2VjdGlvbiA9IHN0eWxlZChTdHlsZWRFeHBvcnRTZWN0aW9uKWBcbiAgLmRpc2NsYWltZXIge1xuICAgIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dEZvbnRTaXplfTtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dENvbG9yfTtcbiAgICBtYXJnaW4tdG9wOiAxMnB4O1xuICB9XG5gO1xuXG5jb25zdCBMaW5rID0gKHtjaGlsZHJlbiwgLi4ucHJvcHN9KSA9PiAoXG4gIDxTdHlsZWRMaW5rIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiB7Li4ucHJvcHN9PlxuICAgIHtjaGlsZHJlbn1cbiAgPC9TdHlsZWRMaW5rPlxuKTtcblxuY29uc3QgQmlnU3R5bGVkVHlwZSA9IHN0eWxlZChTdHlsZWRUeXBlKWBcbiAgaGVpZ2h0OiB1bnNldDtcbiAgd2lkdGg6IHVuc2V0O1xuICBpbWcge1xuICAgIHdpZHRoOiAxODBweDtcbiAgICBoZWlnaHQ6IDEyMHB4O1xuICB9XG5gO1xuXG5jb25zdCBleHBvcnRIdG1sUHJvcFR5cGVzID0ge1xuICBvcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvbkVkaXRVc2VyTWFwYm94QWNjZXNzVG9rZW46IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IEV4cG9ydEh0bWxNYXAgPSAoe1xuICBvbkNoYW5nZUV4cG9ydE1hcEhUTUxNb2RlID0gTk9fT1AsXG4gIG9uRWRpdFVzZXJNYXBib3hBY2Nlc3NUb2tlbiA9IE5PX09QLFxuICBvcHRpb25zID0ge31cbn0pID0+IChcbiAgPGRpdj5cbiAgICA8U3R5bGVkRXhwb3J0U2VjdGlvbiBzdHlsZT17e21hcmdpblRvcDogSU5UUkFfU0VDVElPTl9NQVJHSU5HfX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uXCI+XG4gICAgICAgIEV4cG9ydCB5b3VyIG1hcCBpbnRvIGFuIGludGVyYWN0aXZlIGh0bWwgZmlsZS5cbiAgICAgIDwvZGl2PlxuICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgICA8RXhwb3J0TWFwU3R5bGVkRXhwb3J0U2VjdGlvbiBjbGFzc05hbWU9XCJleHBvcnQtbWFwLW1vZGFsX19odG1sLW9wdGlvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgIE1hcGJveCBhY2Nlc3MgdG9rZW5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3VidGl0bGVcIj5cbiAgICAgICAgICBVc2UgeW91ciBvd24gTWFwYm94IGFjY2VzcyB0b2tlbiBpbiB0aGUgaHRtbCAob3B0aW9uYWwpXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICA8U3R5bGVkSW5wdXRcbiAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBvbkVkaXRVc2VyTWFwYm94QWNjZXNzVG9rZW4oZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgTWFwYm94IGFjY2VzcyB0b2tlblwiXG4gICAgICAgICAgdmFsdWU9e29wdGlvbnMgPyBvcHRpb25zLnVzZXJNYXBib3hUb2tlbiA6ICcnfVxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpc2NsYWltZXJcIj5cbiAgICAgICAgICA8U3R5bGVkV2FybmluZz57VE9LRU5fTUlTVVNFX1dBUk5JTkd9PC9TdHlsZWRXYXJuaW5nPlxuICAgICAgICAgIDxzcGFuPntESVNDTEFJTUVSfTwvc3Bhbj5cbiAgICAgICAgICA8TGluayBocmVmPXtHSVRIVUJfRVhQT1JUX0hUTUxfTUFQfT5cbiAgICAgICAgICAgIEhvdyB0byB1cGRhdGUgYW4gZXhpc3RpbmcgbWFwIHRva2VuLlxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L0V4cG9ydE1hcFN0eWxlZEV4cG9ydFNlY3Rpb24+XG4gICAgPEV4cG9ydE1hcFN0eWxlZEV4cG9ydFNlY3Rpb24+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICBNYXAgTW9kZVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgIFNlbGVjdCB0aGUgYXBwIG1vZGUuIE1vcmUgPGEgaHJlZj17R0lUSFVCX0VYUE9SVF9IVE1MX01BUF9NT0RFU30+aW5mbzwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uXCI+XG4gICAgICAgIHtFWFBPUlRfSFRNTF9NQVBfTU9ERV9PUFRJT05TLm1hcChtb2RlID0+XG4gICAgICAgICAgPEJpZ1N0eWxlZFR5cGVcbiAgICAgICAgICAgIGtleT17bW9kZS5pZH1cbiAgICAgICAgICAgIHNlbGVjdGVkPXtvcHRpb25zLm1vZGUgPT09IG1vZGUuaWR9XG4gICAgICAgICAgICBhdmFpbGFibGU9e21vZGUuYXZhaWxhYmxlfVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbW9kZS5hdmFpbGFibGUgJiYgb25DaGFuZ2VFeHBvcnRNYXBIVE1MTW9kZShtb2RlLmlkKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW1nIHNyYz17bW9kZS51cmx9IGFsdD1cIlwiLz5cbiAgICAgICAgICAgIDxwPkFsbG93IHVzZXJzIHRvIHttb2RlLmxhYmVsfSB0aGUgbWFwPC9wPlxuICAgICAgICAgIDwvQmlnU3R5bGVkVHlwZT5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvRXhwb3J0TWFwU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgPC9kaXY+XG4pO1xuXG5FeHBvcnRIdG1sTWFwLnByb3BUeXBlcyA9IGV4cG9ydEh0bWxQcm9wVHlwZXM7XG5cbmNvbnN0IFN0eWxlZEpzb25FeHBvcnRTZWN0aW9uID0gc3R5bGVkKEV4cG9ydE1hcFN0eWxlZEV4cG9ydFNlY3Rpb24pYFxuICAubm90ZSB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZXJyb3JDb2xvcn07XG4gICAgZm9udC1zaXplOiAxMXB4O1xuICB9XG5cbiAgLnZpZXdlciB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zZWxlY3RCb3JkZXJDb2xvckxUfTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgbGluZS1oZWlnaHQ6IDEuNWVtO1xuICAgIHBhZGRpbmc6IDAuNWVtIDMuNWVtIDAuNWVtIDFlbTtcbiAgICBtYXJnaW46IDA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDE4MHB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgfVxuYDtcblxuY29uc3QgZXhwb3J0SnNvblByb3BUeXBlcyA9IHtcbiAgb3B0aW9uczogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgRXhwb3J0SnNvbk1hcCA9ICh7XG4gIGNvbmZpZyA9IHt9XG59KSA9PiAoXG4gIDxkaXY+XG4gICAgPFN0eWxlZEV4cG9ydFNlY3Rpb24gc3R5bGU9e3ttYXJnaW5Ub3A6IElOVFJBX1NFQ1RJT05fTUFSR0lOR319PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICBFeHBvcnQgY3VycmVudCBtYXAgZGF0YSBhbmQgY29uZmlnIGludG8gYSBzaW5nbGUgSnNvbiBmaWxlLiBZb3UgY2FuIGxhdGVyIG9wZW4gdGhlIHNhbWUgbWFwIGJ5IHVwbG9hZGluZyB0aGlzIGZpbGUgdG8ga2VwbGVyLmdsLlxuICAgICAgPC9kaXY+XG4gICAgPC9TdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgIDxTdHlsZWRKc29uRXhwb3J0U2VjdGlvbiBjbGFzc05hbWU9XCJleHBvcnQtbWFwLW1vZGFsX19qc29uLW9wdGlvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgIE1hcCBDb25maWdcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3VidGl0bGVcIj5cbiAgICAgICAgICB7TUFQX0NPTkZJR19ERVNDUklQVElPTn1cbiAgICAgICAgICA8TGluayBocmVmPXtHSVRIVUJfQUREX0RBVEFfVE9fTUFQfT5cbiAgICAgICAgICAgIGFkZERhdGFUb01hcFxuICAgICAgICAgIDwvTGluaz4uXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInZpZXdlclwiPlxuICAgICAgICAgIDxKU09OUHJldHR5IGlkPVwianNvbi1wcmV0dHlcIiBqc29uPXtjb25maWd9Lz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlzY2xhaW1lclwiPlxuICAgICAgICAgIDxTdHlsZWRXYXJuaW5nPlxuICAgICAgICAgICAgKiBNYXAgY29uZmlnIGlzIGNvdXBsZWQgd2l0aCBsb2FkZWQgZGF0YXNldHMuIOKAmGRhdGFJZOKAmSBpcyB1c2VkIHRvIGJpbmQgbGF5ZXJzLCBmaWx0ZXJzLCBhbmQgdG9vbHRpcHMgdG8gYSBzcGVjaWZpYyBkYXRhc2V0LiBXaGVuIHBhc3NpbmcgdGhpcyBjb25maWcgdG8gYWRkRGF0YVRvTWFwLCBtYWtlIHN1cmUgdGhlIGRhdGFzZXQgaWQgbWF0Y2hlcyB0aGUgZGF0YUlkL3MgaW4gdGhpcyBjb25maWcuXG4gICAgICAgICAgPC9TdHlsZWRXYXJuaW5nPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvU3R5bGVkSnNvbkV4cG9ydFNlY3Rpb24+XG4gIDwvZGl2PlxuKTtcblxuRXhwb3J0SnNvbk1hcC5wcm9wVHlwZXMgPSBleHBvcnRKc29uUHJvcFR5cGVzO1xuXG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gIG9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG9uRWRpdFVzZXJNYXBib3hBY2Nlc3NUb2tlbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25DaGFuZ2VFeHBvcnREYXRhOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25DaGFuZ2VFeHBvcnRNYXBUeXBlOiBQcm9wVHlwZXMuZnVuYyxcbiAgbWFwRm9ybWF0OiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBzdHlsZSA9IHt3aWR0aDogJzEwMCUnfTtcblxuY29uc3QgRXhwb3J0TWFwTW9kYWwgPSAoe1xuICBjb25maWcgPSB7fSxcbiAgb25DaGFuZ2VFeHBvcnREYXRhID0gTk9fT1AsXG4gIG9uQ2hhbmdlRXhwb3J0TWFwRm9ybWF0ID0gTk9fT1AsXG4gIG9uQ2hhbmdlRXhwb3J0TWFwSFRNTE1vZGUgPSBOT19PUCxcbiAgb25FZGl0VXNlck1hcGJveEFjY2Vzc1Rva2VuID0gTk9fT1AsXG4gIG9wdGlvbnMgPSB7fVxufSkgPT4gKFxuICA8U3R5bGVkTW9kYWxDb250ZW50IGNsYXNzTmFtZT1cImV4cG9ydC1tYXAtbW9kYWxcIj5cbiAgICA8ZGl2IHN0eWxlPXtzdHlsZX0+XG4gICAgICA8U3R5bGVkRXhwb3J0U2VjdGlvbiBzdHlsZT17e21hcmdpbkJvdHRvbTogSU5UUkFfU0VDVElPTl9NQVJHSU5HfX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlXCI+XG4gICAgICAgICAgICBNYXAgZm9ybWF0XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICAgQ2hvb3NlIHRoZSBmb3JtYXQgdG8gZXhwb3J0IHlvdXIgbWFwIHRvXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICAgIHtFWFBPUlRfTUFQX0ZPUk1BVF9PUFRJT05TLm1hcChvcCA9PlxuICAgICAgICAgICAgPFN0eWxlZFR5cGVcbiAgICAgICAgICAgICAga2V5PXtvcC5pZH1cbiAgICAgICAgICAgICAgc2VsZWN0ZWQ9e29wdGlvbnMuZm9ybWF0ID09PSBvcC5pZH1cbiAgICAgICAgICAgICAgYXZhaWxhYmxlPXtvcC5hdmFpbGFibGV9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9wLmF2YWlsYWJsZSAmJiBvbkNoYW5nZUV4cG9ydE1hcEZvcm1hdChvcC5pZCl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxGaWxlVHlwZSBleHQ9e29wLmxhYmVsfSBoZWlnaHQ9XCI4MHB4XCIgZm9udFNpemU9XCIxMXB4XCIgLz5cbiAgICAgICAgICAgIDwvU3R5bGVkVHlwZT5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgICAgIHt7XG4gICAgICAgIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06ICAoXG4gICAgICAgICAgPEV4cG9ydEh0bWxNYXBcbiAgICAgICAgICAgIG9uQ2hhbmdlRXhwb3J0TWFwSFRNTE1vZGU9e29uQ2hhbmdlRXhwb3J0TWFwSFRNTE1vZGV9XG4gICAgICAgICAgICBvbkVkaXRVc2VyTWFwYm94QWNjZXNzVG9rZW49e29uRWRpdFVzZXJNYXBib3hBY2Nlc3NUb2tlbn1cbiAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnNbb3B0aW9ucy5mb3JtYXRdfVxuICAgICAgICAgIC8+XG4gICAgICAgICksXG4gICAgICAgIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl06IChcbiAgICAgICAgICA8RXhwb3J0SnNvbk1hcFxuICAgICAgICAgICAgY29uZmlnPXtjb25maWd9XG4gICAgICAgICAgICBvbkNoYW5nZUV4cG9ydERhdGE9e29uQ2hhbmdlRXhwb3J0RGF0YX1cbiAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnNbb3B0aW9ucy5mb3JtYXRdfVxuICAgICAgICAgIC8+XG4gICAgICAgIClcbiAgICAgIH1bb3B0aW9ucy5mb3JtYXRdfVxuICAgIDwvZGl2PlxuICA8L1N0eWxlZE1vZGFsQ29udGVudD5cbik7XG5cbkV4cG9ydE1hcE1vZGFsLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuY29uc3QgRXhwb3J0TWFwTW9kYWxGYWN0b3J5ID0gKCkgPT4gRXhwb3J0TWFwTW9kYWw7XG5cbmV4cG9ydCBkZWZhdWx0IEV4cG9ydE1hcE1vZGFsRmFjdG9yeTtcbiJdfQ==