UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

242 lines (240 loc) 48.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.WarningMsg = exports.FileUpload = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); 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 _styledComponents = _interopRequireDefault(require("styled-components")); var _reactIntl = require("react-intl"); var _uploadButton = _interopRequireDefault(require("./upload-button")); var _icons = require("../icons"); var _fileUploadProgress = _interopRequireDefault(require("./file-upload-progress")); var _fileDrop = _interopRequireDefault(require("./file-drop")); var _utils = require("@kepler.gl/utils"); var _constants = require("@kepler.gl/constants"); var _markdownToJsx = _interopRequireDefault(require("markdown-to-jsx")); var _localization = require("@kepler.gl/localization"); var _styles = require("@kepler.gl/styles"); var _linkRenderer = _interopRequireDefault(require("../link-renderer")); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // Breakpoints function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var fileIconColor = '#D3D8E0'; var StyledUploadMessage = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 14px;\n margin-bottom: 12px;\n\n ", ";\n"])), function (props) { return props.theme.textColorLT; }, _styles.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n "])))); var WarningMsg = exports.WarningMsg = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 10px;\n color: ", ";\n font-weight: 500;\n"])), function (props) { return props.theme.errorColor; }); var StyledFileDrop = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n border-radius: 4px;\n border-style: ", ";\n border-width: 1px;\n border-color: ", ";\n text-align: center;\n width: 100%;\n padding: 48px 8px 0;\n height: 360px;\n\n .file-upload-or {\n color: ", ";\n padding-right: 4px;\n }\n\n .file-type-row {\n opacity: 0.5;\n }\n ", ";\n"])), function (props) { return props.dragOver ? 'solid' : 'dashed'; }, function (props) { return props.dragOver ? props.theme.textColorLT : props.theme.subtextColorLT; }, function (props) { return props.theme.linkBtnColor; }, _styles.media.portable(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 16px 4px 0;\n "])))); var MsgWrapper = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"])), function (props) { return props.theme.modalTitleColor; }); var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 48px;\n\n display: flex;\n justify-content: center;\n\n ", ";\n ", ";\n"])), fileIconColor, _styles.media.portable(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _styles.media.palm(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileTypeFow = _styledComponents["default"].div(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n ", ";\n ", ";\n"])), _styles.media.portable(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _styles.media.palm(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileUpload = _styledComponents["default"].div(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["\n .file-drop {\n position: relative;\n }\n"]))); var StyledMessage = _styledComponents["default"].div(_templateObject14 || (_templateObject14 = (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"]))); var StyledDragFileWrapper = _styledComponents["default"].div(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 32px;\n ", ";\n ", ";\n"])), _styles.media.portable(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n "]))), _styles.media.portable(_templateObject17 || (_templateObject17 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "])))); var StyledDisclaimer = (0, _styledComponents["default"])(StyledMessage)(_templateObject18 || (_templateObject18 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 auto;\n"]))); function FileUploadFactory() { /** @augments {Component<FileUploadProps>} */ var FileUpload = /*#__PURE__*/function (_Component) { function FileUpload() { 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 = _callSuper(this, FileUpload, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { dragOver: false, fileLoading: false, files: [], errorFiles: [] }); (0, _defineProperty2["default"])(_this, "frame", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "_isValidFileType", function (filename) { var _this$props$fileExten = _this.props.fileExtensions, fileExtensions = _this$props$fileExten === void 0 ? [] : _this$props$fileExten; var fileExt = fileExtensions.find(function (ext) { return filename.endsWith(ext); }); return Boolean(fileExt); }); /** @param {FileList} fileList */ (0, _defineProperty2["default"])(_this, "_handleFileInput", function (fileList, event) { if (event) { event.stopPropagation(); } var files = (0, _toConsumableArray2["default"])(fileList).filter(Boolean); var _this$props$disableEx = _this.props.disableExtensionFilter, disableExtensionFilter = _this$props$disableEx === void 0 ? false : _this$props$disableEx; // TODO - move this code out of the component var filesToLoad = []; var errorFiles = []; var _iterator = _createForOfIteratorHelper(files), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var file = _step.value; if (disableExtensionFilter || _this._isValidFileType(file.name)) { filesToLoad.push(file); } else { errorFiles.push(file.name); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var nextState = { files: filesToLoad, errorFiles: errorFiles, dragOver: false }; _this.setState(nextState, function () { return nextState.files.length ? _this.props.onFileUpload(nextState.files) : null; }); }); (0, _defineProperty2["default"])(_this, "_toggleDragState", function (newState) { _this.setState({ dragOver: newState }); }); return _this; } (0, _inherits2["default"])(FileUpload, _Component); return (0, _createClass2["default"])(FileUpload, [{ key: "render", value: function render() { var _this2 = this; var _this$state = this.state, dragOver = _this$state.dragOver, files = _this$state.files, errorFiles = _this$state.errorFiles; var _this$props = this.props, fileLoading = _this$props.fileLoading, fileLoadingProgress = _this$props.fileLoadingProgress, theme = _this$props.theme, intl = _this$props.intl; var _this$props2 = this.props, _this$props2$fileExte = _this$props2.fileExtensions, fileExtensions = _this$props2$fileExte === void 0 ? [] : _this$props2$fileExte, _this$props2$fileForm = _this$props2.fileFormatNames, fileFormatNames = _this$props2$fileForm === void 0 ? [] : _this$props2$fileForm; var fileUploadInfoText = "".concat(intl.formatMessage({ id: 'fileUploader.configUploadMessage' }, { fileFormatNames: fileFormatNames.map(function (format) { return "**".concat(format, "**"); }).join(', ') }), "(").concat(_constants.GUIDES_FILE_FORMAT_DOC, ")."); return /*#__PURE__*/_react["default"].createElement(StyledFileUpload, { className: "file-uploader", ref: this.frame }, _fileDrop["default"] ? /*#__PURE__*/_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" }, /*#__PURE__*/_react["default"].createElement(StyledUploadMessage, { className: "file-upload__message" }, /*#__PURE__*/_react["default"].createElement(_markdownToJsx["default"], { options: { overrides: { a: { component: _linkRenderer["default"] } } } }, fileUploadInfoText)), /*#__PURE__*/_react["default"].createElement(StyledFileDrop, { dragOver: dragOver }, /*#__PURE__*/_react["default"].createElement(StyledFileTypeFow, { className: "file-type-row" }, fileExtensions.map(function (ext) { return /*#__PURE__*/_react["default"].createElement(_icons.FileType, { key: ext, ext: ext, height: "50px", fontSize: "9px" }); })), fileLoading ? /*#__PURE__*/_react["default"].createElement(_fileUploadProgress["default"], { fileLoadingProgress: fileLoadingProgress, theme: theme }) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { style: { opacity: dragOver ? 0.5 : 1 }, className: "file-upload-display-message" }, /*#__PURE__*/_react["default"].createElement(StyledDragNDropIcon, null, /*#__PURE__*/_react["default"].createElement(_icons.DragNDrop, { height: "44px" })), errorFiles.length ? /*#__PURE__*/_react["default"].createElement(WarningMsg, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.fileNotSupported', values: { errorFiles: errorFiles.join(', ') } })) : null), !files.length ? /*#__PURE__*/_react["default"].createElement(StyledDragFileWrapper, null, /*#__PURE__*/_react["default"].createElement(MsgWrapper, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.message' })), /*#__PURE__*/_react["default"].createElement("span", { className: "file-upload-or" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.or' })), /*#__PURE__*/_react["default"].createElement(_uploadButton["default"], { onUpload: this._handleFileInput }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.browseFiles' }))) : null, /*#__PURE__*/_react["default"].createElement(StyledDisclaimer, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.disclaimer' }))))) : null, /*#__PURE__*/_react["default"].createElement(WarningMsg, null, (0, _utils.isChrome)() ? /*#__PURE__*/_react["default"].createElement(_localization.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 }; } }]); }(_react.Component); return (0, _reactIntl.injectIntl)(FileUpload); } var _default = exports["default"] = FileUploadFactory; var FileUpload = exports.FileUpload = FileUploadFactory(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RJbnRsIiwiX3VwbG9hZEJ1dHRvbiIsIl9pY29ucyIsIl9maWxlVXBsb2FkUHJvZ3Jlc3MiLCJfZmlsZURyb3AiLCJfdXRpbHMiLCJfY29uc3RhbnRzIiwiX21hcmtkb3duVG9Kc3giLCJfbG9jYWxpemF0aW9uIiwiX3N0eWxlcyIsIl9saW5rUmVuZGVyZXIiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl90ZW1wbGF0ZU9iamVjdDciLCJfdGVtcGxhdGVPYmplY3Q4IiwiX3RlbXBsYXRlT2JqZWN0OSIsIl90ZW1wbGF0ZU9iamVjdDEwIiwiX3RlbXBsYXRlT2JqZWN0MTEiLCJfdGVtcGxhdGVPYmplY3QxMiIsIl90ZW1wbGF0ZU9iamVjdDEzIiwiX3RlbXBsYXRlT2JqZWN0MTQiLCJfdGVtcGxhdGVPYmplY3QxNSIsIl90ZW1wbGF0ZU9iamVjdDE2IiwiX3RlbXBsYXRlT2JqZWN0MTciLCJfdGVtcGxhdGVPYmplY3QxOCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImZpbGVJY29uQ29sb3IiLCJTdHlsZWRVcGxvYWRNZXNzYWdlIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwidGV4dENvbG9yTFQiLCJtZWRpYSIsInBvcnRhYmxlIiwiV2FybmluZ01zZyIsImV4cG9ydHMiLCJzcGFuIiwiZXJyb3JDb2xvciIsIlN0eWxlZEZpbGVEcm9wIiwiZHJhZ092ZXIiLCJzdWJ0ZXh0Q29sb3JMVCIsImxpbmtCdG5Db2xvciIsIk1zZ1dyYXBwZXIiLCJtb2RhbFRpdGxlQ29sb3IiLCJTdHlsZWREcmFnTkRyb3BJY29uIiwicGFsbSIsIlN0eWxlZEZpbGVUeXBlRm93IiwiU3R5bGVkRmlsZVVwbG9hZCIsIlN0eWxlZE1lc3NhZ2UiLCJTdHlsZWREcmFnRmlsZVdyYXBwZXIiLCJTdHlsZWREaXNjbGFpbWVyIiwiRmlsZVVwbG9hZEZhY3RvcnkiLCJGaWxlVXBsb2FkIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmd1bWVudHMiLCJhcmdzIiwiX2tleSIsImNvbmNhdCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJmaWxlTG9hZGluZyIsImZpbGVzIiwiZXJyb3JGaWxlcyIsImNyZWF0ZVJlZiIsImZpbGVuYW1lIiwiX3RoaXMkcHJvcHMkZmlsZUV4dGVuIiwiZmlsZUV4dGVuc2lvbnMiLCJmaWxlRXh0IiwiZmluZCIsImV4dCIsImVuZHNXaXRoIiwiZmlsZUxpc3QiLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJmaWx0ZXIiLCJfdGhpcyRwcm9wcyRkaXNhYmxlRXgiLCJkaXNhYmxlRXh0ZW5zaW9uRmlsdGVyIiwiZmlsZXNUb0xvYWQiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImZpbGUiLCJfaXNWYWxpZEZpbGVUeXBlIiwicHVzaCIsImVyciIsIm5leHRTdGF0ZSIsInNldFN0YXRlIiwib25GaWxlVXBsb2FkIiwibmV3U3RhdGUiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInJlbmRlciIsIl90aGlzMiIsIl90aGlzJHN0YXRlIiwic3RhdGUiLCJfdGhpcyRwcm9wcyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJpbnRsIiwiX3RoaXMkcHJvcHMyIiwiX3RoaXMkcHJvcHMyJGZpbGVFeHRlIiwiX3RoaXMkcHJvcHMyJGZpbGVGb3JtIiwiZmlsZUZvcm1hdE5hbWVzIiwiZmlsZVVwbG9hZEluZm9UZXh0IiwiZm9ybWF0TWVzc2FnZSIsImlkIiwibWFwIiwiZm9ybWF0Iiwiam9pbiIsIkdVSURFU19GSUxFX0ZPUk1BVF9ET0MiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwicmVmIiwiZnJhbWUiLCJGaWxlRHJvcCIsImN1cnJlbnQiLCJkb2N1bWVudCIsIm9uRHJhZ092ZXIiLCJfdG9nZ2xlRHJhZ1N0YXRlIiwib25EcmFnTGVhdmUiLCJvbkRyb3AiLCJfaGFuZGxlRmlsZUlucHV0Iiwib3B0aW9ucyIsIm92ZXJyaWRlcyIsImNvbXBvbmVudCIsIkxpbmtSZW5kZXJlciIsIkZpbGVUeXBlIiwiaGVpZ2h0IiwiZm9udFNpemUiLCJGcmFnbWVudCIsInN0eWxlIiwib3BhY2l0eSIsIkRyYWdORHJvcCIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJ2YWx1ZXMiLCJvblVwbG9hZCIsImlzQ2hyb21lIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwiQ29tcG9uZW50IiwiaW5qZWN0SW50bCIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIGNyZWF0ZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2luamVjdEludGwsIFdyYXBwZWRDb21wb25lbnRQcm9wc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQgVXBsb2FkQnV0dG9uIGZyb20gJy4vdXBsb2FkLWJ1dHRvbic7XG5pbXBvcnQge0RyYWdORHJvcCwgRmlsZVR5cGV9IGZyb20gJy4uL2ljb25zJztcbmltcG9ydCBGaWxlVXBsb2FkUHJvZ3Jlc3MgZnJvbSAnLi9maWxlLXVwbG9hZC1wcm9ncmVzcyc7XG5pbXBvcnQgRmlsZURyb3AgZnJvbSAnLi9maWxlLWRyb3AnO1xuaW1wb3J0IHtGaWxlTG9hZGluZywgRmlsZUxvYWRpbmdQcm9ncmVzc30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmltcG9ydCB7aXNDaHJvbWV9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtHVUlERVNfRklMRV9GT1JNQVRfRE9DfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgTWFya2Rvd24gZnJvbSAnbWFya2Rvd24tdG8tanN4Jztcbi8vIEJyZWFrcG9pbnRzXG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7bWVkaWF9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcblxuaW1wb3J0IExpbmtSZW5kZXJlciBmcm9tICcuLi9saW5rLXJlbmRlcmVyJztcblxuY29uc3QgZmlsZUljb25Db2xvciA9ICcjRDNEOEUwJztcblxuY29uc3QgU3R5bGVkVXBsb2FkTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckxUfTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgZm9udC1zaXplOiAxMnB4O1xuICBgfTtcbmA7XG5cbmV4cG9ydCBjb25zdCBXYXJuaW5nTXNnID0gc3R5bGVkLnNwYW5gXG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVycm9yQ29sb3J9O1xuICBmb250LXdlaWdodDogNTAwO1xuYDtcblxuaW50ZXJmYWNlIFN0eWxlZEZpbGVEcm9wUHJvcHMge1xuICBkcmFnT3Zlcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IFN0eWxlZEZpbGVEcm9wID0gc3R5bGVkLmRpdjxTdHlsZWRGaWxlRHJvcFByb3BzPmBcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiAke3Byb3BzID0+IChwcm9wcy5kcmFnT3ZlciA/ICdzb2xpZCcgOiAnZGFzaGVkJyl9O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiAke3Byb3BzID0+IChwcm9wcy5kcmFnT3ZlciA/IHByb3BzLnRoZW1lLnRleHRDb2xvckxUIDogcHJvcHMudGhlbWUuc3VidGV4dENvbG9yTFQpfTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogNDhweCA4cHggMDtcbiAgaGVpZ2h0OiAzNjBweDtcblxuICAuZmlsZS11cGxvYWQtb3Ige1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gICAgcGFkZGluZy1yaWdodDogNHB4O1xuICB9XG5cbiAgLmZpbGUtdHlwZS1yb3cge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgfVxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIHBhZGRpbmc6IDE2cHggNHB4IDA7XG4gIGB9O1xuYDtcblxuY29uc3QgTXNnV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsVGl0bGVDb2xvcn07XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgaGVpZ2h0OiAzNnB4O1xuYDtcblxuY29uc3QgU3R5bGVkRHJhZ05Ecm9wSWNvbiA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke2ZpbGVJY29uQ29sb3J9O1xuICBtYXJnaW4tYm90dG9tOiA0OHB4O1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgYH07XG4gICR7bWVkaWEucGFsbWBcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIGB9O1xuYDtcblxuY29uc3QgU3R5bGVkRmlsZVR5cGVGb3cgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9O1xuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVVcGxvYWQgPSBzdHlsZWQuZGl2YFxuICAuZmlsZS1kcm9wIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZE1lc3NhZ2UgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcblxuICAubG9hZGluZy1hY3Rpb24ge1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgfVxuICAubG9hZGluZy1zcGlubmVyIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICBgfTtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZERpc2NsYWltZXIgPSBzdHlsZWQoU3R5bGVkTWVzc2FnZSlgXG4gIG1hcmdpbjogMCBhdXRvO1xuYDtcblxudHlwZSBGaWxlVXBsb2FkUHJvcHMgPSB7XG4gIG9uRmlsZVVwbG9hZDogKGZpbGVzOiBGaWxlW10pID0+IHZvaWQ7XG4gIGZpbGVMb2FkaW5nOiBGaWxlTG9hZGluZyB8IGZhbHNlO1xuICBmaWxlTG9hZGluZ1Byb2dyZXNzOiBGaWxlTG9hZGluZ1Byb2dyZXNzO1xuICB0aGVtZTogb2JqZWN0O1xuICAvKiogQSBsaXN0IG9mIG5hbWVzIG9mIHN1cHBvcnRlZCBmb3JtYXRzIHN1aXRhYmxlIHRvIHByZXNlbnQgdG8gdXNlciAqL1xuICBmaWxlRm9ybWF0TmFtZXM/OiBzdHJpbmdbXTtcbiAgLyoqIEEgbGlzdCBvZiB0eXBpY2FsbHkgMyBsZXR0ZXIgZXh0ZW5zaW9ucyAod2l0aG91dCAnLicpIGZvciBmaWxlIG1hdGNoaW5nICovXG4gIGZpbGVFeHRlbnNpb25zPzogc3RyaW5nW107XG4gIC8qKiBTZXQgdG8gdHJ1ZSBpZiBhcHAgd2FudHMgdG8gZG8gaXRzIG93biBmaWxlIGZpbHRlcmluZyAqL1xuICBkaXNhYmxlRXh0ZW5zaW9uRmlsdGVyPzogYm9vbGVhbjtcbn0gJiBXcmFwcGVkQ29tcG9uZW50UHJvcHM7XG5cbmZ1bmN0aW9uIEZpbGVVcGxvYWRGYWN0b3J5KCkge1xuICAvKiogQGF1Z21lbnRzIHtDb21wb25lbnQ8RmlsZVVwbG9hZFByb3BzPn0gKi9cbiAgY2xhc3MgRmlsZVVwbG9hZCBleHRlbmRzIENvbXBvbmVudDxGaWxlVXBsb2FkUHJvcHM+IHtcbiAgICBzdGF0ZSA9IHtcbiAgICAgIGRyYWdPdmVyOiBmYWxzZSxcbiAgICAgIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGZpbGVzOiBbXSxcbiAgICAgIGVycm9yRmlsZXM6IFtdXG4gICAgfTtcblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGUuZmlsZUxvYWRpbmcgJiYgcHJvcHMuZmlsZUxvYWRpbmcgPT09IGZhbHNlICYmIHN0YXRlLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpbGVzOiBbXSxcbiAgICAgICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVMb2FkaW5nOiBwcm9wcy5maWxlTG9hZGluZ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmcmFtZSA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAgIF9pc1ZhbGlkRmlsZVR5cGUgPSBmaWxlbmFtZSA9PiB7XG4gICAgICBjb25zdCB7ZmlsZUV4dGVuc2lvbnMgPSBbXX0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgZmlsZUV4dCA9IGZpbGVFeHRlbnNpb25zLmZpbmQoZXh0ID0+IGZpbGVuYW1lLmVuZHNXaXRoKGV4dCkpO1xuXG4gICAgICByZXR1cm4gQm9vbGVhbihmaWxlRXh0KTtcbiAgICB9O1xuXG4gICAgLyoqIEBwYXJhbSB7RmlsZUxpc3R9IGZpbGVMaXN0ICovXG4gICAgX2hhbmRsZUZpbGVJbnB1dCA9IChmaWxlTGlzdDogRmlsZUxpc3QsIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZXMgPSBbLi4uZmlsZUxpc3RdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgY29uc3Qge2Rpc2FibGVFeHRlbnNpb25GaWx0ZXIgPSBmYWxzZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAvLyBUT0RPIC0gbW92ZSB0aGlzIGNvZGUgb3V0IG9mIHRoZSBjb21wb25lbnRcbiAgICAgIGNvbnN0IGZpbGVzVG9Mb2FkOiBGaWxlW10gPSBbXTtcbiAgICAgIGNvbnN0IGVycm9yRmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKGRpc2FibGVFeHRlbnNpb25GaWx0ZXIgfHwgdGhpcy5faXNWYWxpZEZpbGVUeXBlKGZpbGUubmFtZSkpIHtcbiAgICAgICAgICBmaWxlc1RvTG9hZC5wdXNoKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yRmlsZXMucHVzaChmaWxlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHtmaWxlczogZmlsZXNUb0xvYWQsIGVycm9yRmlsZXMsIGRyYWdPdmVyOiBmYWxzZX07XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCAoKSA9PlxuICAgICAgICBuZXh0U3RhdGUuZmlsZXMubGVuZ3RoID8gdGhpcy5wcm9wcy5vbkZpbGVVcGxvYWQobmV4dFN0YXRlLmZpbGVzKSA6IG51bGxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIF90b2dnbGVEcmFnU3RhdGUgPSBuZXdTdGF0ZSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogbmV3U3RhdGV9KTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2RyYWdPdmVyLCBmaWxlcywgZXJyb3JGaWxlc30gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3Qge2ZpbGVMb2FkaW5nLCBmaWxlTG9hZGluZ1Byb2dyZXNzLCB0aGVtZSwgaW50bH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge2ZpbGVFeHRlbnNpb25zID0gW10sIGZpbGVGb3JtYXROYW1lcyA9IFtdfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBmaWxlVXBsb2FkSW5mb1RleHQgPSBgJHtpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ2ZpbGVVcGxvYWRlci5jb25maWdVcGxvYWRNZXNzYWdlJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmlsZUZvcm1hdE5hbWVzOiBmaWxlRm9ybWF0TmFtZXMubWFwKGZvcm1hdCA9PiBgKioke2Zvcm1hdH0qKmApLmpvaW4oJywgJylcbiAgICAgICAgfVxuICAgICAgKX0oJHtHVUlERVNfRklMRV9GT1JNQVRfRE9DfSkuYDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRGaWxlVXBsb2FkIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkZXJcIiByZWY9e3RoaXMuZnJhbWV9PlxuICAgICAgICAgIHtGaWxlRHJvcCA/IChcbiAgICAgICAgICAgIDxGaWxlRHJvcFxuICAgICAgICAgICAgICBmcmFtZT17dGhpcy5mcmFtZS5jdXJyZW50IHx8IGRvY3VtZW50fVxuICAgICAgICAgICAgICBvbkRyYWdPdmVyPXsoKSA9PiB0aGlzLl90b2dnbGVEcmFnU3RhdGUodHJ1ZSl9XG4gICAgICAgICAgICAgIG9uRHJhZ0xlYXZlPXsoKSA9PiB0aGlzLl90b2dnbGVEcmFnU3RhdGUoZmFsc2UpfVxuICAgICAgICAgICAgICBvbkRyb3A9e3RoaXMuX2hhbmRsZUZpbGVJbnB1dH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlcl9fZmlsZS1kcm9wXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFN0eWxlZFVwbG9hZE1lc3NhZ2UgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRfX21lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8TWFya2Rvd25cbiAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e3tcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBMaW5rUmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge2ZpbGVVcGxvYWRJbmZvVGV4dH1cbiAgICAgICAgICAgICAgICA8L01hcmtkb3duPlxuICAgICAgICAgICAgICA8L1N0eWxlZFVwbG9hZE1lc3NhZ2U+XG4gICAgICAgICAgICAgIDxTdHlsZWRGaWxlRHJvcCBkcmFnT3Zlcj17ZHJhZ092ZXJ9PlxuICAgICAgICAgICAgICAgIDxTdHlsZWRGaWxlVHlwZUZvdyBjbGFzc05hbWU9XCJmaWxlLXR5cGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICB7ZmlsZUV4dGVuc2lvbnMubWFwKGV4dCA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxGaWxlVHlwZSBrZXk9e2V4dH0gZXh0PXtleHR9IGhlaWdodD1cIjUwcHhcIiBmb250U2l6ZT1cIjlweFwiIC8+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L1N0eWxlZEZpbGVUeXBlRm93PlxuICAgICAgICAgICAgICAgIHtmaWxlTG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgIDxGaWxlVXBsb2FkUHJvZ3Jlc3MgZmlsZUxvYWRpbmdQcm9ncmVzcz17ZmlsZUxvYWRpbmdQcm9ncmVzc30gdGhlbWU9e3RoZW1lfSAvPlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tvcGFjaXR5OiBkcmFnT3ZlciA/IDAuNSA6IDF9fVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkLWRpc3BsYXktbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkRHJhZ05Ecm9wSWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcmFnTkRyb3AgaGVpZ2h0PVwiNDRweFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWREcmFnTkRyb3BJY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAge2Vycm9yRmlsZXMubGVuZ3RoID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFdhcm5pbmdNc2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9eydmaWxlVXBsb2FkZXIuZmlsZU5vdFN1cHBvcnRlZCd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPXt7ZXJyb3JGaWxlczogZXJyb3JGaWxlcy5qb2luKCcsICcpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvV2FybmluZ01zZz5cbiAgICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIHshZmlsZXMubGVuZ3RoID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWREcmFnRmlsZVdyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TXNnV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWxlVXBsb2FkZXIubWVzc2FnZSd9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L01zZ1dyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZC1vclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci5vcid9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VXBsb2FkQnV0dG9uIG9uVXBsb2FkPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci5icm93c2VGaWxlcyd9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1VwbG9hZEJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdGaWxlV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZERpc2NsYWltZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWxlVXBsb2FkZXIuZGlzY2xhaW1lcid9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRGlzY2xhaW1lcj5cbiAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvU3R5bGVkRmlsZURyb3A+XG4gICAgICAgICAgICA8L0ZpbGVEcm9wPlxuICAgICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgICAgPFdhcm5pbmdNc2c+XG4gICAgICAgICAgICB7aXNDaHJvbWUoKSA/IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLmNocm9tZU1lc3NhZ2UnfSAvPiA6ICcnfVxuICAgICAgICAgIDwvV2FybmluZ01zZz5cbiAgICAgICAgPC9TdHlsZWRGaWxlVXBsb2FkPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5qZWN0SW50bChGaWxlVXBsb2FkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsZVVwbG9hZEZhY3Rvcnk7XG5leHBvcnQgY29uc3QgRmlsZVVwbG9hZCA9IEZpbGVVcGxvYWRGYWN0b3J5KCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksYUFBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sbUJBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLFNBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUdBLElBQUFRLE1BQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLFVBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLGNBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFXLGFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLE9BQUEsR0FBQVosT0FBQTtBQUVBLElBQUFhLGFBQUEsR0FBQVgsc0JBQUEsQ0FBQUYsT0FBQTtBQUE0QyxJQUFBYyxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlC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