kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
491 lines (380 loc) • 39 kB
JavaScript
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.FileUpload = exports["default"] = exports.WarningMsg = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _uploadButton = _interopRequireDefault(require("./upload-button"));
var _icons = require("../icons");
var _loadingSpinner = _interopRequireDefault(require("../loading-spinner"));
var _fileDrop = _interopRequireDefault(require("./file-drop"));
var _utils = require("../../../utils/utils");
var _userGuides = require("../../../constants/user-guides");
var _reactMarkdown = _interopRequireDefault(require("react-markdown"));
var _mediaBreakpoints = require("../../../styles/media-breakpoints");
var _reactIntl = require("react-intl");
function _templateObject19() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 auto;\n"]);
_templateObject19 = function _templateObject19() {
return data;
};
return data;
}
function _templateObject18() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]);
_templateObject18 = function _templateObject18() {
return data;
};
return data;
}
function _templateObject17() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n "]);
_templateObject17 = function _templateObject17() {
return data;
};
return data;
}
function _templateObject16() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 32px;\n ", ";\n ", "\n"]);
_templateObject16 = function _templateObject16() {
return data;
};
return data;
}
function _templateObject15() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n margin-bottom: 32px;\n\n .loading-action {\n margin-right: 10px;\n }\n .loading-spinner {\n margin-left: 10px;\n }\n"]);
_templateObject15 = function _templateObject15() {
return data;
};
return data;
}
function _templateObject14() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n .file-drop {\n position: relative;\n }\n"]);
_templateObject14 = function _templateObject14() {
return data;
};
return data;
}
function _templateObject13() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "]);
_templateObject13 = function _templateObject13() {
return data;
};
return data;
}
function _templateObject12() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]);
_templateObject12 = function _templateObject12() {
return data;
};
return data;
}
function _templateObject11() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n ", ";\n ", ";\n"]);
_templateObject11 = function _templateObject11() {
return data;
};
return data;
}
function _templateObject10() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "]);
_templateObject10 = function _templateObject10() {
return data;
};
return data;
}
function _templateObject9() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]);
_templateObject9 = function _templateObject9() {
return data;
};
return data;
}
function _templateObject8() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 48px;\n\n ", ";\n ", ";\n"]);
_templateObject8 = function _templateObject8() {
return data;
};
return data;
}
function _templateObject7() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"]);
_templateObject7 = function _templateObject7() {
return data;
};
return data;
}
function _templateObject6() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 16px 4px 0;\n "]);
_templateObject6 = function _templateObject6() {
return data;
};
return data;
}
function _templateObject5() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n border-radius: 4px;\n border-style: dashed;\n border-width: 1px;\n border-color: ", ";\n text-align: center;\n width: 100%;\n padding: 48px 8px 0;\n\n .file-upload-or {\n color: ", ";\n padding-right: 4px;\n }\n\n ", ";\n"]);
_templateObject5 = function _templateObject5() {
return data;
};
return data;
}
function _templateObject4() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-block;\n color: ", ";\n font-weight: 500;\n margin-right: 8px;\n"]);
_templateObject4 = function _templateObject4() {
return data;
};
return data;
}
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 10px;\n color: ", ";\n font-weight: 500;\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n "]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 14px;\n margin-bottom: 12px;\n\n ", "\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
// File.type is not reliable if the OS does not have a
// registered mapping for the extension.
// NOTE: Shapefiles must be in a compressed format since
// it requires multiple files to be present.
var defaultValidFileExt = ['csv', 'json', 'geojson'];
var fileIconColor = '#D3D8E0';
var LinkRenderer = function LinkRenderer(props) {
return _react["default"].createElement("a", {
href: props.href,
target: "_blank",
rel: "noopener noreferrer"
}, props.children);
};
var StyledUploadMessage = _styledComponents["default"].div(_templateObject(), function (props) {
return props.theme.textColorLT;
}, _mediaBreakpoints.media.portable(_templateObject2()));
var WarningMsg = _styledComponents["default"].span(_templateObject3(), function (props) {
return props.theme.errorColor;
});
exports.WarningMsg = WarningMsg;
var PositiveMsg = _styledComponents["default"].span(_templateObject4(), function (props) {
return props.theme.primaryBtnActBgd;
});
var StyledFileDrop = _styledComponents["default"].div(_templateObject5(), function (props) {
return props.theme.subtextColorLT;
}, function (props) {
return props.theme.linkBtnColor;
}, _mediaBreakpoints.media.portable(_templateObject6()));
var MsgWrapper = _styledComponents["default"].div(_templateObject7(), function (props) {
return props.theme.modalTitleColor;
});
var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject8(), fileIconColor, _mediaBreakpoints.media.portable(_templateObject9()), _mediaBreakpoints.media.palm(_templateObject10()));
var StyledFileTypeFow = _styledComponents["default"].div(_templateObject11(), _mediaBreakpoints.media.portable(_templateObject12()), _mediaBreakpoints.media.palm(_templateObject13()));
var StyledFileUpload = _styledComponents["default"].div(_templateObject14());
var StyledMessage = _styledComponents["default"].div(_templateObject15());
var StyledDragFileWrapper = _styledComponents["default"].div(_templateObject16(), _mediaBreakpoints.media.portable(_templateObject17()), _mediaBreakpoints.media.portable(_templateObject18()));
var StyledDisclaimer = (0, _styledComponents["default"])(StyledMessage)(_templateObject19());
function FileUploadFactory() {
var FileUpload =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(FileUpload, _Component);
function FileUpload() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, FileUpload);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(FileUpload)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
dragOver: false,
fileLoading: false,
files: [],
errorFiles: []
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "frame", (0, _react.createRef)());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isValidFileType", function (filename) {
var validFileExt = _this.props.validFileExt;
var fileExt = validFileExt.find(function (ext) {
return filename.endsWith(ext);
});
return Boolean(fileExt);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleFileInput", function (files, e) {
if (e) {
e.stopPropagation();
}
var nextState = {
files: [],
errorFiles: [],
dragOver: false
};
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file && _this._isValidFileType(file.name)) {
nextState.files.push(file);
} else {
nextState.errorFiles.push(file.name);
}
}
_this.setState(nextState, function () {
return nextState.files.length ? _this.props.onFileUpload(nextState.files) : null;
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleDragState", function (newState) {
_this.setState({
dragOver: newState
});
});
return _this;
}
(0, _createClass2["default"])(FileUpload, [{
key: "_renderMessage",
value: function _renderMessage() {
var _this$state = this.state,
errorFiles = _this$state.errorFiles,
files = _this$state.files;
if (errorFiles.length) {
return _react["default"].createElement(WarningMsg, null, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'fileUploader.filenNotSupported',
values: {
errorFiles: errorFiles.join(', ')
}
}));
} else if (this.props.fileLoading && files.length) {
return _react["default"].createElement(StyledMessage, {
className: "file-uploader__message"
}, _react["default"].createElement("div", {
className: "loading-action"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'fileUploader.uploading'
})), _react["default"].createElement("div", null, files.map(function (f, i) {
return _react["default"].createElement(PositiveMsg, {
key: i
}, f.name);
}), "..."), _react["default"].createElement("div", {
className: "loading-spinner"
}, _react["default"].createElement(_loadingSpinner["default"], {
size: 20
})));
}
return null;
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$state2 = this.state,
dragOver = _this$state2.dragOver,
files = _this$state2.files;
var _this$props = this.props,
validFileExt = _this$props.validFileExt,
intl = _this$props.intl;
return _react["default"].createElement(StyledFileUpload, {
className: "file-uploader",
ref: this.frame
}, _fileDrop["default"] ? _react["default"].createElement(_fileDrop["default"], {
frame: this.frame.current || document,
onDragOver: function onDragOver() {
return _this2._toggleDragState(true);
},
onDragLeave: function onDragLeave() {
return _this2._toggleDragState(false);
},
onDrop: this._handleFileInput,
className: "file-uploader__file-drop"
}, _react["default"].createElement(StyledUploadMessage, {
className: "file-upload__message"
}, _react["default"].createElement(_reactMarkdown["default"], {
source: "".concat(intl.formatMessage({
id: 'fileUploader.configUploadMessage'
}), "(").concat(_userGuides.GUIDES_FILE_FORMAT, ")."),
renderers: {
link: LinkRenderer
}
})), _react["default"].createElement(StyledFileDrop, {
dragOver: dragOver
}, _react["default"].createElement("div", {
style: {
opacity: dragOver ? 0.5 : 1
}
}, _react["default"].createElement(StyledDragNDropIcon, null, _react["default"].createElement(StyledFileTypeFow, {
className: "file-type-row"
}, validFileExt.map(function (ext) {
return _react["default"].createElement(_icons.FileType, {
key: ext,
ext: ext,
height: "50px",
fontSize: "9px"
});
})), _react["default"].createElement(_icons.DragNDrop, {
height: "44px"
})), _react["default"].createElement("div", null, this._renderMessage())), !files.length ? _react["default"].createElement(StyledDragFileWrapper, null, _react["default"].createElement(MsgWrapper, null, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'fileUploader.message'
})), _react["default"].createElement("span", {
className: "file-upload-or"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'fileUploader.or'
})), _react["default"].createElement(_uploadButton["default"], {
onUpload: this._handleFileInput
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'fileUploader.browseFiles'
}))) : null, _react["default"].createElement(StyledDisclaimer, null, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'fileUploader.disclaimer'
})))) : null, _react["default"].createElement(WarningMsg, null, (0, _utils.isChrome)() ? _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'fileUploader.chromeMessage'
}) : ''));
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, state) {
if (state.fileLoading && props.fileLoading === false && state.files.length) {
return {
files: [],
fileLoading: props.fileLoading
};
}
return {
fileLoading: props.fileLoading
};
}
}]);
return FileUpload;
}(_react.Component);
(0, _defineProperty2["default"])(FileUpload, "propTypes", {
onFileUpload: _propTypes["default"].func.isRequired,
validFileExt: _propTypes["default"].arrayOf(_propTypes["default"].string),
fileLoading: _propTypes["default"].bool
});
(0, _defineProperty2["default"])(FileUpload, "defaultProps", {
validFileExt: defaultValidFileExt
});
return (0, _reactIntl.injectIntl)(FileUpload);
}
var _default = FileUploadFactory;
exports["default"] = _default;
var FileUpload = FileUploadFactory();
exports.FileUpload = FileUpload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkLmpzIl0sIm5hbWVzIjpbImRlZmF1bHRWYWxpZEZpbGVFeHQiLCJmaWxlSWNvbkNvbG9yIiwiTGlua1JlbmRlcmVyIiwicHJvcHMiLCJocmVmIiwiY2hpbGRyZW4iLCJTdHlsZWRVcGxvYWRNZXNzYWdlIiwic3R5bGVkIiwiZGl2IiwidGhlbWUiLCJ0ZXh0Q29sb3JMVCIsIm1lZGlhIiwicG9ydGFibGUiLCJXYXJuaW5nTXNnIiwic3BhbiIsImVycm9yQ29sb3IiLCJQb3NpdGl2ZU1zZyIsInByaW1hcnlCdG5BY3RCZ2QiLCJTdHlsZWRGaWxlRHJvcCIsInN1YnRleHRDb2xvckxUIiwibGlua0J0bkNvbG9yIiwiTXNnV3JhcHBlciIsIm1vZGFsVGl0bGVDb2xvciIsIlN0eWxlZERyYWdORHJvcEljb24iLCJwYWxtIiwiU3R5bGVkRmlsZVR5cGVGb3ciLCJTdHlsZWRGaWxlVXBsb2FkIiwiU3R5bGVkTWVzc2FnZSIsIlN0eWxlZERyYWdGaWxlV3JhcHBlciIsIlN0eWxlZERpc2NsYWltZXIiLCJGaWxlVXBsb2FkRmFjdG9yeSIsIkZpbGVVcGxvYWQiLCJkcmFnT3ZlciIsImZpbGVMb2FkaW5nIiwiZmlsZXMiLCJlcnJvckZpbGVzIiwiZmlsZW5hbWUiLCJ2YWxpZEZpbGVFeHQiLCJmaWxlRXh0IiwiZmluZCIsImV4dCIsImVuZHNXaXRoIiwiQm9vbGVhbiIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJuZXh0U3RhdGUiLCJpIiwibGVuZ3RoIiwiZmlsZSIsIl9pc1ZhbGlkRmlsZVR5cGUiLCJuYW1lIiwicHVzaCIsInNldFN0YXRlIiwib25GaWxlVXBsb2FkIiwibmV3U3RhdGUiLCJzdGF0ZSIsImpvaW4iLCJtYXAiLCJmIiwiaW50bCIsImZyYW1lIiwiRmlsZURyb3AiLCJjdXJyZW50IiwiZG9jdW1lbnQiLCJfdG9nZ2xlRHJhZ1N0YXRlIiwiX2hhbmRsZUZpbGVJbnB1dCIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsIkdVSURFU19GSUxFX0ZPUk1BVCIsImxpbmsiLCJvcGFjaXR5IiwiX3JlbmRlck1lc3NhZ2UiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImFycmF5T2YiLCJzdHJpbmciLCJib29sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUEsbUJBQW1CLEdBQUcsQ0FBQyxLQUFELEVBQVEsTUFBUixFQUFnQixTQUFoQixDQUE1QjtBQUVBLElBQU1DLGFBQWEsR0FBRyxTQUF0Qjs7QUFFQSxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFBQyxLQUFLLEVBQUk7QUFDNUIsU0FDRTtBQUFHLElBQUEsSUFBSSxFQUFFQSxLQUFLLENBQUNDLElBQWY7QUFBcUIsSUFBQSxNQUFNLEVBQUMsUUFBNUI7QUFBcUMsSUFBQSxHQUFHLEVBQUM7QUFBekMsS0FDR0QsS0FBSyxDQUFDRSxRQURULENBREY7QUFLRCxDQU5EOztBQU9BLElBQU1DLG1CQUFtQixHQUFHQyw2QkFBT0MsR0FBVixvQkFDZCxVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDTSxLQUFOLENBQVlDLFdBQWhCO0FBQUEsQ0FEUyxFQUtyQkMsd0JBQU1DLFFBTGUscUJBQXpCOztBQVVPLElBQU1DLFVB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UDtBQUNEOztlQUVjRCxpQjs7QUFDUixJQUFNQyxVQUFVLEdBQUdELGlCQUFpQixFQUFwQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMCBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgY3JlYXRlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBVcGxvYWRCdXR0b24gZnJvbSAnLi91cGxvYWQtYnV0dG9uJztcbmltcG9ydCB7RHJhZ05Ecm9wLCBGaWxlVHlwZX0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IExvYWRpbmdTcGlubmVyIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2xvYWRpbmctc3Bpbm5lcic7XG5pbXBvcnQgRmlsZURyb3AgZnJvbSAnLi9maWxlLWRyb3AnO1xuXG5pbXBvcnQge2lzQ2hyb21lfSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge0dVSURFU19GSUxFX0ZPUk1BVH0gZnJvbSAnY29uc3RhbnRzL3VzZXItZ3VpZGVzJztcbmltcG9ydCBSZWFjdE1hcmtkb3duIGZyb20gJ3JlYWN0LW1hcmtkb3duJztcbi8vIEJyZWFrcG9pbnRzXG5pbXBvcnQge21lZGlhfSBmcm9tICdzdHlsZXMvbWVkaWEtYnJlYWtwb2ludHMnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlLCBpbmplY3RJbnRsfSBmcm9tICdyZWFjdC1pbnRsJztcblxuLy8gRmlsZS50eXBlIGlzIG5vdCByZWxpYWJsZSBpZiB0aGUgT1MgZG9lcyBub3QgaGF2ZSBhXG4vLyByZWdpc3RlcmVkIG1hcHBpbmcgZm9yIHRoZSBleHRlbnNpb24uXG4vLyBOT1RFOiBTaGFwZWZpbGVzIG11c3QgYmUgaW4gYSBjb21wcmVzc2VkIGZvcm1hdCBzaW5jZVxuLy8gaXQgcmVxdWlyZXMgbXVsdGlwbGUgZmlsZXMgdG8gYmUgcHJlc2VudC5cbmNvbnN0IGRlZmF1bHRWYWxpZEZpbGVFeHQgPSBbJ2NzdicsICdqc29uJywgJ2dlb2pzb24nXTtcblxuY29uc3QgZmlsZUljb25Db2xvciA9ICcjRDNEOEUwJztcblxuY29uc3QgTGlua1JlbmRlcmVyID0gcHJvcHMgPT4ge1xuICByZXR1cm4gKFxuICAgIDxhIGhyZWY9e3Byb3BzLmhyZWZ9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L2E+XG4gICk7XG59O1xuY29uc3QgU3R5bGVkVXBsb2FkTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckxUfTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgZm9udC1zaXplOiAxMnB4O1xuICBgfVxuYDtcblxuZXhwb3J0IGNvbnN0IFdhcm5pbmdNc2cgPSBzdHlsZWQuc3BhbmBcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZXJyb3JDb2xvcn07XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG5gO1xuXG5jb25zdCBQb3NpdGl2ZU1zZyA9IHN0eWxlZC5zcGFuYFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnByaW1hcnlCdG5BY3RCZ2R9O1xuICBmb250LXdlaWdodDogNTAwO1xuICBtYXJnaW4tcmlnaHQ6IDhweDtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVEcm9wID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc3VidGV4dENvbG9yTFR9O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA0OHB4IDhweCAwO1xuXG4gIC5maWxlLXVwbG9hZC1vciB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGlua0J0bkNvbG9yfTtcbiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gIH1cblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIHBhZGRpbmc6IDE2cHggNHB4IDA7XG4gIGB9O1xuYDtcblxuY29uc3QgTXNnV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsVGl0bGVDb2xvcn07XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgaGVpZ2h0OiAzNnB4O1xuYDtcblxuY29uc3QgU3R5bGVkRHJhZ05Ecm9wSWNvbiA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke2ZpbGVJY29uQ29sb3J9O1xuICBtYXJnaW4tYm90dG9tOiA0OHB4O1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgYH07XG4gICR7bWVkaWEucGFsbWBcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIGB9O1xuYDtcblxuY29uc3QgU3R5bGVkRmlsZVR5cGVGb3cgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9O1xuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVVcGxvYWQgPSBzdHlsZWQuZGl2YFxuICAuZmlsZS1kcm9wIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZE1lc3NhZ2UgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcblxuICAubG9hZGluZy1hY3Rpb24ge1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgfVxuICAubG9hZGluZy1zcGlubmVyIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICBgfTtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBgfVxuYDtcblxuY29uc3QgU3R5bGVkRGlzY2xhaW1lciA9IHN0eWxlZChTdHlsZWRNZXNzYWdlKWBcbiAgbWFyZ2luOiAwIGF1dG87XG5gO1xuXG5mdW5jdGlvbiBGaWxlVXBsb2FkRmFjdG9yeSgpIHtcbiAgY2xhc3MgRmlsZVVwbG9hZCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIG9uRmlsZVVwbG9hZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHZhbGlkRmlsZUV4dDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgICBmaWxlTG9hZGluZzogUHJvcFR5cGVzLmJvb2xcbiAgICB9O1xuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIHZhbGlkRmlsZUV4dDogZGVmYXVsdFZhbGlkRmlsZUV4dFxuICAgIH07XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgIGRyYWdPdmVyOiBmYWxzZSxcbiAgICAgIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGZpbGVzOiBbXSxcbiAgICAgIGVycm9yRmlsZXM6IFtdXG4gICAgfTtcblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGUuZmlsZUxvYWRpbmcgJiYgcHJvcHMuZmlsZUxvYWRpbmcgPT09IGZhbHNlICYmIHN0YXRlLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpbGVzOiBbXSxcbiAgICAgICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVMb2FkaW5nOiBwcm9wcy5maWxlTG9hZGluZ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmcmFtZSA9IGNyZWF0ZVJlZigpO1xuXG4gICAgX2lzVmFsaWRGaWxlVHlwZSA9IGZpbGVuYW1lID0+IHtcbiAgICAgIGNvbnN0IHt2YWxpZEZpbGVFeHR9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGZpbGVFeHQgPSB2YWxpZEZpbGVFeHQuZmluZChleHQgPT4gZmlsZW5hbWUuZW5kc1dpdGgoZXh0KSk7XG5cbiAgICAgIHJldHVybiBCb29sZWFuKGZpbGVFeHQpO1xuICAgIH07XG5cbiAgICBfaGFuZGxlRmlsZUlucHV0ID0gKGZpbGVzLCBlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0U3RhdGUgPSB7ZmlsZXM6IFtdLCBlcnJvckZpbGVzOiBbXSwgZHJhZ092ZXI6IGZhbHNlfTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuXG4gICAgICAgIGlmIChmaWxlICYmIHRoaXMuX2lzVmFsaWRGaWxlVHlwZShmaWxlLm5hbWUpKSB7XG4gICAgICAgICAgbmV4dFN0YXRlLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFN0YXRlLmVycm9yRmlsZXMucHVzaChmaWxlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCAoKSA9PlxuICAgICAgICBuZXh0U3RhdGUuZmlsZXMubGVuZ3RoID8gdGhpcy5wcm9wcy5vbkZpbGVVcGxvYWQobmV4dFN0YXRlLmZpbGVzKSA6IG51bGxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIF90b2dnbGVEcmFnU3RhdGUgPSBuZXdTdGF0ZSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogbmV3U3RhdGV9KTtcbiAgICB9O1xuXG4gICAgX3JlbmRlck1lc3NhZ2UoKSB7XG4gICAgICBjb25zdCB7ZXJyb3JGaWxlcywgZmlsZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGlmIChlcnJvckZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxXYXJuaW5nTXNnPlxuICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9eydmaWxlVXBsb2FkZXIuZmlsZW5Ob3RTdXBwb3J0ZWQnfVxuICAgICAgICAgICAgICB2YWx1ZXM9e3tlcnJvckZpbGVzOiBlcnJvckZpbGVzLmpvaW4oJywgJyl9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1dhcm5pbmdNc2c+XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZmlsZUxvYWRpbmcgJiYgZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFN0eWxlZE1lc3NhZ2UgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlcl9fbWVzc2FnZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsb2FkaW5nLWFjdGlvblwiPlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci51cGxvYWRpbmcnfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7ZmlsZXMubWFwKChmLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgPFBvc2l0aXZlTXNnIGtleT17aX0+e2YubmFtZX08L1Bvc2l0aXZlTXNnPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgLi4uXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZy1zcGlubmVyXCI+XG4gICAgICAgICAgICAgIDxMb2FkaW5nU3Bpbm5lciBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvU3R5bGVkTWVzc2FnZT5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2RyYWdPdmVyLCBmaWxlc30gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3Qge3ZhbGlkRmlsZUV4dCwgaW50bH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkRmlsZVVwbG9hZCBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZGVyXCIgcmVmPXt0aGlzLmZyYW1lfT5cbiAgICAgICAgICB7RmlsZURyb3AgPyAoXG4gICAgICAgICAgICA8RmlsZURyb3BcbiAgICAgICAgICAgICAgZnJhbWU9e3RoaXMuZnJhbWUuY3VycmVudCB8fCBkb2N1bWVudH1cbiAgICAgICAgICAgICAgb25EcmFnT3Zlcj17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKHRydWUpfVxuICAgICAgICAgICAgICBvbkRyYWdMZWF2ZT17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKGZhbHNlKX1cbiAgICAgICAgICAgICAgb25Ecm9wPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkZXJfX2ZpbGUtZHJvcFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxTdHlsZWRVcGxvYWRNZXNzYWdlIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkX19tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPFJlYWN0TWFya2Rvd25cbiAgICAgICAgICAgICAgICAgIHNvdXJjZT17YCR7aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdmaWxlVXBsb2FkZXIuY29uZmlnVXBsb2FkTWVzc2FnZSdcbiAgICAgICAgICAgICAgICAgIH0pfSgke0dVSURFU19GSUxFX0ZPUk1BVH0pLmB9XG4gICAgICAgICAgICAgICAgICByZW5kZXJlcnM9e3tsaW5rOiBMaW5rUmVuZGVyZXJ9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvU3R5bGVkVXBsb2FkTWVzc2FnZT5cbiAgICAgICAgICAgICAgPFN0eWxlZEZpbGVEcm9wIGRyYWdPdmVyPXtkcmFnT3Zlcn0+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e29wYWNpdHk6IGRyYWdPdmVyID8gMC41IDogMX19PlxuICAgICAgICAgICAgICAgICAgPFN0eWxlZERyYWdORHJvcEljb24+XG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRGaWxlVHlwZUZvdyBjbGFzc05hbWU9XCJmaWxlLXR5cGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3ZhbGlkRmlsZUV4dC5tYXAoZXh0ID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWxlVHlwZSBrZXk9e2V4dH0gZXh0PXtleHR9IGhlaWdodD1cIjUwcHhcIiBmb250U2l6ZT1cIjlweFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRmlsZVR5cGVGb3c+XG4gICAgICAgICAgICAgICAgICAgIDxEcmFnTkRyb3AgaGVpZ2h0PVwiNDRweFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdORHJvcEljb24+XG4gICAgICAgICAgICAgICAgICA8ZGl2Pnt0aGlzLl9yZW5kZXJNZXNzYWdlKCl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgeyFmaWxlcy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgICA8U3R5bGVkRHJhZ0ZpbGVXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICA8TXNnV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci5tZXNzYWdlJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9Nc2dXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZC1vclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLm9yJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8VXBsb2FkQnV0dG9uIG9uVXBsb2FkPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLmJyb3dzZUZpbGVzJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9VcGxvYWRCdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdGaWxlV3JhcHBlcj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8U3R5bGVkRGlzY2xhaW1lcj5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLmRpc2NsYWltZXInfSAvPlxuICAgICAgICAgICAgICAgIDwvU3R5bGVkRGlzY2xhaW1lcj5cbiAgICAgICAgICAgICAgPC9TdHlsZWRGaWxlRHJvcD5cbiAgICAgICAgICAgIDwvRmlsZURyb3A+XG4gICAgICAgICAgKSA6IG51bGx9XG5cbiAgICAgICAgICA8V2FybmluZ01zZz5cbiAgICAgICAgICAgIHtpc0Nocm9tZSgpID8gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWxlVXBsb2FkZXIuY2hyb21lTWVzc2FnZSd9IC8+IDogJyd9XG4gICAgICAgICAgPC9XYXJuaW5nTXNnPlxuICAgICAgICA8L1N0eWxlZEZpbGVVcGxvYWQ+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmplY3RJbnRsKEZpbGVVcGxvYWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlVXBsb2FkRmFjdG9yeTtcbmV4cG9ydCBjb25zdCBGaWxlVXBsb2FkID0gRmlsZVVwbG9hZEZhY3RvcnkoKTtcbiJdfQ==
;