kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
261 lines (222 loc) • 31.2 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.MapInfoPanel = 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 _cloudTile = _interopRequireDefault(require("./cloud-tile"));
var _imageModalContainer = _interopRequireDefault(require("./image-modal-container"));
var _providerModalContainer = _interopRequireDefault(require("./provider-modal-container"));
var _statusPanel = _interopRequireWildcard(require("./status-panel"));
var _defaultSettings = require("../../constants/default-settings");
var _styledComponents2 = require("../common/styled-components");
var _imagePreview = _interopRequireDefault(require("../common/image-preview"));
var _reactIntl = require("react-intl");
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n .save-map-modal-content {\n min-height: 400px;\n flex-direction: column;\n }\n\n .description {\n width: 300px;\n }\n\n .image-preview-panel {\n width: 300px;\n\n .image-preview {\n padding: 0;\n }\n }\n\n .map-info-panel {\n flex-direction: column;\n }\n\n .save-map-modal-description {\n .modal-section-subtitle {\n margin-left: 6px;\n }\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var StyledSaveMapModal = _styledComponents["default"].div.attrs({
className: 'save-map-modal'
})(_templateObject());
var nop = function nop() {};
var MapInfoPanel = function MapInfoPanel(_ref) {
var _ref$mapInfo = _ref.mapInfo,
mapInfo = _ref$mapInfo === void 0 ? {
description: '',
title: ''
} : _ref$mapInfo,
characterLimits = _ref.characterLimits,
onChangeInput = _ref.onChangeInput;
return _react["default"].createElement("div", {
className: "selection map-info-panel"
}, _react["default"].createElement(_styledComponents2.StyledModalSection, {
className: "save-map-modal-name"
}, _react["default"].createElement("div", {
className: "modal-section-title"
}, "Name*"), _react["default"].createElement("div", null, _react["default"].createElement(_styledComponents2.InputLight, {
id: "map-title",
type: "text",
value: mapInfo.title,
onChange: function onChange(e) {
return onChangeInput('title', e);
},
placeholder: "Type map title"
}))), _react["default"].createElement(_styledComponents2.StyledModalSection, null, _react["default"].createElement("div", {
className: "save-map-modal-description",
style: {
display: 'flex'
}
}, _react["default"].createElement("div", {
className: "modal-section-title"
}, "Description"), _react["default"].createElement("div", {
className: "modal-section-subtitle"
}, "(optional)")), _react["default"].createElement("div", null, _react["default"].createElement(_styledComponents2.TextAreaLight, {
rows: "3",
id: "map-description",
style: {
resize: 'none'
},
value: mapInfo.description,
onChange: function onChange(e) {
return onChangeInput('description', e);
},
placeholder: "Type map description"
})), _react["default"].createElement(_styledComponents2.StyledModalInputFootnote, {
className: "save-map-modal-description__footnote",
error: characterLimits.description && mapInfo.description.length > characterLimits.description
}, mapInfo.description.length, "/", characterLimits.description || _defaultSettings.MAP_INFO_CHARACTER.description, ' ', "characters")));
};
exports.MapInfoPanel = MapInfoPanel;
function SaveMapModalFactory() {
var SaveMapModal =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(SaveMapModal, _Component);
function SaveMapModal() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, SaveMapModal);
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"])(SaveMapModal)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onChangeInput", function (key, e) {
var value = e.target.value;
_this.props.onSetMapInfo((0, _defineProperty2["default"])({}, key, value));
});
return _this;
}
(0, _createClass2["default"])(SaveMapModal, [{
key: "render",
value: function render() {
var _this$props = this.props,
mapInfo = _this$props.mapInfo,
exportImage = _this$props.exportImage,
_this$props$character = _this$props.characterLimits,
characterLimits = _this$props$character === void 0 ? {} : _this$props$character,
cloudProviders = _this$props.cloudProviders,
isProviderLoading = _this$props.isProviderLoading,
currentProvider = _this$props.currentProvider,
providerError = _this$props.providerError,
onSetCloudProvider = _this$props.onSetCloudProvider,
onUpdateImageSetting = _this$props.onUpdateImageSetting;
var provider = currentProvider ? cloudProviders.find(function (p) {
return p.name === currentProvider;
}) : null;
return _react["default"].createElement(_providerModalContainer["default"], {
onSetCloudProvider: onSetCloudProvider,
cloudProviders: cloudProviders,
currentProvider: currentProvider
}, _react["default"].createElement(_imageModalContainer["default"], {
currentProvider: currentProvider,
cloudProviders: cloudProviders,
onUpdateImageSetting: onUpdateImageSetting
}, _react["default"].createElement(StyledSaveMapModal, null, _react["default"].createElement(_styledComponents2.StyledModalContent, {
className: "save-map-modal-content"
}, _react["default"].createElement(_styledComponents2.StyledExportSection, {
disabled: isProviderLoading
}, _react["default"].createElement("div", {
className: "description"
}, _react["default"].createElement("div", {
className: "title"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'modal.saveMap.title'
})), _react["default"].createElement("div", {
className: "subtitle"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: 'modal.saveMap.subtitle'
}))), _react["default"].createElement("div", {
className: "selection"
}, cloudProviders.map(function (cloudProvider) {
return _react["default"].createElement(_cloudTile["default"], {
key: cloudProvider.name,
onSelect: function onSelect() {
return onSetCloudProvider(cloudProvider.name);
},
onSetCloudProvider: onSetCloudProvider,
cloudProvider: cloudProvider,
isSelected: cloudProvider.name === currentProvider,
isConnected: Boolean(cloudProvider.getAccessToken && cloudProvider.getAccessToken())
});
}))), provider && provider.getManagementUrl && _react["default"].createElement(_styledComponents2.StyledExportSection, {
style: {
margin: '2px 0'
}
}, _react["default"].createElement("div", {
className: "description"
}), _react["default"].createElement("div", {
className: "selection"
}, _react["default"].createElement("a", {
key: 1,
href: provider.getManagementUrl(),
target: "_blank",
rel: "noopener noreferrer",
style: {
textDecoration: 'underline'
}
}, "Go to your Kepler.gl ", provider.displayName, " page"))), _react["default"].createElement(_styledComponents2.StyledExportSection, null, _react["default"].createElement("div", {
className: "description image-preview-panel"
}, _react["default"].createElement(_imagePreview["default"], {
exportImage: exportImage,
width: _defaultSettings.MAP_THUMBNAIL_DIMENSION.width,
showDimension: false
})), isProviderLoading ? _react["default"].createElement("div", {
className: "selection map-saving-animation"
}, _react["default"].createElement(_statusPanel.UploadAnimation, {
icon: provider && provider.icon
})) : _react["default"].createElement(MapInfoPanel, {
mapInfo: mapInfo,
characterLimits: characterLimits,
onChangeInput: this._onChangeInput
})), providerError ? _react["default"].createElement(_statusPanel["default"], {
isLoading: false,
error: providerError,
providerIcon: provider && provider.icon
}) : null))));
}
}]);
return SaveMapModal;
}(_react.Component);
(0, _defineProperty2["default"])(SaveMapModal, "propTypes", {
exportImage: _propTypes["default"].object.isRequired,
mapInfo: _propTypes["default"].object.isRequired,
isProviderLoading: _propTypes["default"].bool.isRequired,
thumbWidth: _propTypes["default"].number,
thumbHeight: _propTypes["default"].number,
characterLimits: _propTypes["default"].object,
cloudProviders: _propTypes["default"].arrayOf(_propTypes["default"].object),
currentProvider: _propTypes["default"].string,
onSetMapInfo: _propTypes["default"].func.isRequired,
onSetCloudProvider: _propTypes["default"].func.isRequired,
onUpdateImageSetting: _propTypes["default"].func.isRequired
});
(0, _defineProperty2["default"])(SaveMapModal, "defaultProps", {
characterLimits: _defaultSettings.MAP_INFO_CHARACTER,
cloudProviders: [],
currentProvider: null,
providerError: null,
isProviderLoading: false,
onSetCloudProvider: nop,
onUpdateImageSetting: nop
});
return SaveMapModal;
}
var _default = SaveMapModalFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFscy9zYXZlLW1hcC1tb2RhbC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRTYXZlTWFwTW9kYWwiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIm5vcCIsIk1hcEluZm9QYW5lbCIsIm1hcEluZm8iLCJkZXNjcmlwdGlvbiIsInRpdGxlIiwiY2hhcmFjdGVyTGltaXRzIiwib25DaGFuZ2VJbnB1dCIsImUiLCJkaXNwbGF5IiwicmVzaXplIiwibGVuZ3RoIiwiTUFQX0lORk9fQ0hBUkFDVEVSIiwiU2F2ZU1hcE1vZGFsRmFjdG9yeSIsIlNhdmVNYXBNb2RhbCIsImtleSIsInZhbHVlIiwidGFyZ2V0IiwicHJvcHMiLCJvblNldE1hcEluZm8iLCJleHBvcnRJbWFnZSIsImNsb3VkUHJvdmlkZXJzIiwiaXNQcm92aWRlckxvYWRpbmciLCJjdXJyZW50UHJvdmlkZXIiLCJwcm92aWRlckVycm9yIiwib25TZXRDbG91ZFByb3ZpZGVyIiwib25VcGRhdGVJbWFnZVNldHRpbmciLCJwcm92aWRlciIsImZpbmQiLCJwIiwibmFtZSIsIm1hcCIsImNsb3VkUHJvdmlkZXIiLCJCb29sZWFuIiwiZ2V0QWNjZXNzVG9rZW4iLCJnZXRNYW5hZ2VtZW50VXJsIiwibWFyZ2luIiwidGV4dERlY29yYXRpb24iLCJkaXNwbGF5TmFtZSIsIk1BUF9USFVNQk5BSUxfRElNRU5TSU9OIiwid2lkdGgiLCJpY29uIiwiX29uQ2hhbmdlSW5wdXQiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiYm9vbCIsInRodW1iV2lkdGgiLCJudW1iZXIiLCJ0aHVtYkhlaWdodCIsImFycmF5T2YiLCJzdHJpbmciLCJmdW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBUUE7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGtCQUFrQixHQUFHQyw2QkFBT0MsR0FBUCxDQUFXQyxLQUFYLENBQWlCO0FBQzFDQyxFQUFBQSxTQUFTLEVBQUU7QUFEK0IsQ0FBakIsQ0FBSCxtQkFBeEI7O0FBK0JBLElBQU1DLEdBQUcsR0FBRyxTQUFOQSxHQUFNLEdBQU0sQ0FBRSxDQUFwQjs7QUFFTyxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBZTtBQUFBLDBCQUMxQkMsT0FEMEI7QUFBQSxNQUMxQkEsT0FEMEIsNkJBQ2hCO0FBQUNDLElBQUFBLFdBQVcsRUFBRSxFQUFkO0FBQWtCQyxJQUFBQSxLQUFLLEVBQUU7QUFBekIsR0FEZ0I7QUFBQSxNQUUxQkMsZUFGMEIsUUFFMUJBLGVBRjBCO0FBQUEsTUFHMUJDLGFBSDBCLFFBRzFCQSxhQUgwQjtBQUFBLFNBSzFCO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixLQUNFLGdDQUFDLHFDQUFEO0FBQW9CLElBQUEsU0FBUyxFQUFDO0FBQTlCLEtBQ0U7QUFBSyxJQUFBLFNBQVMsRUFBQztBQUFmLGFBREYsRUFFRSw2Q0FDRSxnQ0FBQyw2QkFBRDtBQUNFLElBQUEsRUFBRSxFQUFDLFdBREw7QUFFRSxJQUFBLElBQUksRUFBQyxNQUZQO0FBR0UsSUFBQSxLQUFLLEVBQUVKLE9BQU8sQ0FBQ0UsS0FIakI7QUFJRSxJQUFBLFFBQVEsRUFBRSxrQkFBQUcsQ0FBQztBQUFBLGFBQUlELGFBQWEsQ0FBQyxPQUFELEVBQVVDLENBQVYsQ0FBakI7QUFBQSxLQUpiO0FBS0UsSUFBQSxXQUFXLEVBQUM7QUFMZCxJQURGLENBRkYsQ0FERixFQWFFLGdDQUFDLHFDQUFELFFBQ0U7QUFBSyxJQUFBLFNBQVMsRUFBQyw0QkFBZjtBQUE0QyxJQUFBLEtBQUssRUFBRTtBQUFDQyxNQUFBQSxPQUFPLEVBQUU7QUFBVjtBQUFuRCxLQUNFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixtQkFERixFQUVFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixrQkFGRixDQURGLEVBS0UsNkNBQ0UsZ0NBQUMsZ0NBQUQ7QUFDRSxJQUFBLElBQUksRUFBQyxHQURQO0FBRUUsSUFBQSxFQUFFLEVBQUMsaUJBRkw7QUFHRSxJQUFBLEtBQUssRUFBRTtBQUFDQyxNQUFBQSxNQUFNLEVBQUU7QUFBVCxLQUhUO0FBSUUsSUFBQSxLQUFLLEVBQUVQLE9BQU8sQ0FBQ0MsV0FKakI7QUFLRSxJQUFBLFFBQVEsRUFBRSxrQkFBQUksQ0FBQztBQUFBLGFBQUlELGFBQWEsQ0FBQyxhQUFELEVBQWdCQyxDQUFoQixDQUFqQjtBQUFBLEtBTGI7QUFNRSxJQUFBLFdBQVcsRUFBQztBQU5kLElBREYsQ0FMRixFQWVFLGdDQUFDLDJDQUFEO0FBQ0UsSUFBQSxTQUFTLEVBQUMsc0NBRFo7QUFFRSxJQUFBLEtBQUssRUFDSEYsZUFBZSxDQUFDRixXQUFoQixJQUErQkQsT0FBTyxDQUFDQyxXQUFSLENBQW9CTyxNQUFwQixHQUE2QkwsZUFBZSxDQUFDRjtBQUhoRixLQU1HRCxPQUFPLENBQUNDLFdBQVIsQ0FBb0JPLE1BTnZCLE9BTWdDTCxlQUFlLENBQUNGLFdBQWhCLElBQStCUSxvQ0FBbUJSLFdBTmxGLEVBTStGLEdBTi9GLGVBZkYsQ0FiRixDQUwwQjtBQUFBLENBQXJCOzs7O0FBOENQLFNBQVNTLG1CQUFULEdBQStCO0FBQUEsTUFDdkJDLFlBRHVCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEseUdBMEJWLFVBQUNDLEdBQUQsRUFBTVAsQ0FBTixFQUFZO0FBQUEsWUFFaEJRLEtBRmdCLEdBR3ZCUixDQUh1QixDQUV6QlMsTUFGeUIsQ0FFaEJELEtBRmdCOztBQUkzQixjQUFLRSxLQUFMLENBQVdDLFlBQVgsc0NBQTBCSixHQUExQixFQUFnQ0MsS0FBaEM7QUFDRCxPQS9CMEI7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQSwrQkFpQ2xCO0FBQUEsMEJBV0gsS0FBS0UsS0FYRjtBQUFBLFlBRUxmLE9BRkssZUFFTEEsT0FGSztBQUFBLFlBR0xpQixXQUhLLGVBR0xBLFdBSEs7QUFBQSxnREFJTGQsZUFKSztBQUFBLFlBSUxBLGVBSkssc0NBSWEsRUFKYjtBQUFBLFlBS0xlLGNBTEssZUFLTEEsY0FMSztBQUFBLFlBTUxDLGlCQU5LLGVBTUxBLGlCQU5LO0FBQUEsWUFPTEMsZUFQSyxlQU9MQSxlQVBLO0FBQUEsWUFRTEMsYUFSSyxlQVFMQSxhQVJLO0FBQUEsWUFTTEMsa0JBVEssZUFTTEEsa0JBVEs7QUFBQSxZQVVMQyxvQkFWSyxlQVVMQSxvQkFWSztBQVlQLFlBQU1DLFFBQVEsR0FBR0osZUFBZSxHQUM1QkYsY0FBYyxDQUFDTyxJQUFmLENBQW9CLFVBQUFDLENBQUM7QUFBQSxpQkFBSUEsQ0FBQyxDQUFDQyxJQUFGLEtBQVdQLGVBQWY7QUFBQSxTQUFyQixDQUQ0QixHQUU1QixJQUZKO0FBSUEsZUFDRSxnQ0FBQyxrQ0FBRDtBQUNFLFVBQUEsa0JBQWtCLEVBQUVFLGtCQUR0QjtBQUVFLFVBQUEsY0FBYyxFQUFFSixjQUZsQjtBQUdFLFVBQUEsZUFBZSxFQUFFRTtBQUhuQixXQUtFLGdDQUFDLCtCQUFEO0FBQ0UsVUFBQSxlQUFlLEVBQUVBLGVBRG5CO0FBRUUsVUFBQSxjQUFjLEVBQUVGLGNBRmxCO0FBR0UsVUFBQSxvQkFBb0IsRUFBRUs7QUFIeEIsV0FLRSxnQ0FBQyxrQkFBRCxRQUNFLGdDQUFDLHFDQUFEO0FBQW9CLFVBQUEsU0FBUyxFQUFDO0FBQTlCLFdBQ0UsZ0NBQUMsc0NBQUQ7QUFBcUIsVUFBQSxRQUFRLEVBQUVKO0FBQS9CLFdBQ0U7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLFdBQ0U7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLFdBQXVCLGdDQUFDLDJCQUFEO0FBQWtCLFVBQUEsRUFBRSxFQUFFO0FBQXRCLFVBQXZCLENBREYsRUFFRTtBQUFLLFVBQUEsU0FBUyxFQUFDO0FBQWYsV0FBMEIsZ0NBQUMsMkJBQUQ7QUFBa0IsVUFBQSxFQUFFLEVBQUU7QUFBdEIsVUFBMUIsQ0FGRixDQURGLEVBS0U7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLFdBQ0dELGNBQWMsQ0FBQ1UsR0FBZixDQUFtQixVQUFBQyxhQUFhO0FBQUEsaUJBQy9CLGdDQUFDLHFCQUFEO0FBQ0UsWUFBQSxHQUFHLEVBQUVBLGFBQWEsQ0FBQ0YsSUFEckI7QUFFRSxZQUFBLFFBQVEsRUFBRTtBQUFBLHFCQUFNTCxrQkFBa0IsQ0FBQ08sYUFBYSxDQUFDRixJQUFmLENBQXhCO0FBQUEsYUFGWjtBQUdFLFlBQUEsa0JBQWtCLEVBQUVMLGtCQUh0QjtBQUlFLFlBQUEsYUFBYSxFQUFFTyxhQUpqQjtBQUtFLFlBQUEsVUFBVSxFQUFFQSxhQUFhLENBQUNGLElBQWQsS0FBdUJQLGVBTHJDO0FBTUUsWUFBQSxXQUFXLEVBQUVVLE9BQU8sQ0FDbEJELGFBQWEsQ0FBQ0UsY0FBZCxJQUFnQ0YsYUFBYSxDQUFDRSxjQUFkLEVBRGQ7QUFOdEIsWUFEK0I7QUFBQSxTQUFoQyxDQURILENBTEYsQ0FERixFQXFCR1AsUUFBUSxJQUFJQSxRQUFRLENBQUNRLGdCQUFyQixJQUNDLGdDQUFDLHNDQUFEO0FBQXFCLFVBQUEsS0FBSyxFQUFFO0FBQUNDLFlBQUFBLE1BQU0sRUFBRTtBQUFUO0FBQTVCLFdBQ0U7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLFVBREYsRUFFRTtBQUFLLFVBQUEsU0FBUyxFQUFDO0FBQWYsV0FDRTtBQUNFLFVBQUEsR0FBRyxFQUFFLENBRFA7QUFFRSxVQUFBLElBQUksRUFBRVQsUUFBUSxDQUFDUSxnQkFBVCxFQUZSO0FBR0UsVUFBQSxNQUFNLEVBQUMsUUFIVDtBQUlFLFVBQUEsR0FBRyxFQUFDLHFCQUpOO0FBS0UsVUFBQSxLQUFLLEVBQUU7QUFBQ0UsWUFBQUEsY0FBYyxFQUFFO0FBQWpCO0FBTFQsb0NBT3dCVixRQUFRLENBQUNXLFdBUGpDLFVBREYsQ0FGRixDQXRCSixFQXFDRSxnQ0FBQyxzQ0FBRCxRQUNFO0FBQUssVUFBQSxTQUFTLEVBQUM7QUFBZixXQUNFLGdDQUFDLHdCQUFEO0FBQ0UsVUFBQSxXQUFXLEVBQUVsQixXQURmO0FBRUUsVUFBQSxLQUFLLEVBQUVtQix5Q0FBd0JDLEtBRmpDO0FBR0UsVUFBQSxhQUFhLEVBQUU7QUFIakIsVUFERixDQURGLEVBUUdsQixpQkFBaUIsR0FDaEI7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLFdBQ0UsZ0NBQUMsNEJBQUQ7QUFBaUIsVUFBQSxJQUFJLEVBQUVLLFFBQVEsSUFBSUEsUUFBUSxDQUFDYztBQUE1QyxVQURGLENBRGdCLEdBS2hCLGdDQUFDLFlBQUQ7QUFDRSxVQUFBLE9BQU8sRUFBRXRDLE9BRFg7QUFFRSxVQUFBLGVBQWUsRUFBRUcsZUFGbkI7QUFHRSxVQUFBLGFBQWEsRUFBRSxLQUFLb0M7QUFIdEIsVUFiSixDQXJDRixFQXlER2xCLGFBQWEsR0FDWixnQ0FBQyx1QkFBRDtBQUNFLFVBQUEsU0FBUyxFQUFFLEtBRGI7QUFFRSxVQUFBLEtBQUssRUFBRUEsYUFGVDtBQUdFLFVBQUEsWUFBWSxFQUFFRyxRQUFRLElBQUlBLFFBQVEsQ0FBQ2M7QUFIckMsVUFEWSxHQU1WLElBL0ROLENBREYsQ0FMRixDQUxGLENBREY7QUFpRkQ7QUFsSTBCO0FBQUE7QUFBQSxJQUNGRSxnQkFERTs7QUFBQSxtQ0FDdkI3QixZQUR1QixlQUVSO0FBQ2pCTSxJQUFBQSxXQUFXLEVBQUV3QixzQkFBVUMsTUFBVixDQUFpQkMsVUFEYjtBQUVqQjNDLElBQUFBLE9BQU8sRUFBRXlDLHNCQUFVQyxNQUFWLENBQWlCQyxVQUZUO0FBR2pCeEIsSUFBQUEsaUJBQWlCLEVBQUVzQixzQkFBVUcsSUFBVixDQUFlRCxVQUhqQjtBQUlqQkUsSUFBQUEsVUFBVSxFQUFFSixzQkFBVUssTUFKTDtBQUtqQkMsSUFBQUEsV0FBVyxFQUFFTixzQkFBVUssTUFMTjtBQU1qQjNDLElBQUFBLGVBQWUsRUFBRXNDLHNCQUFVQyxNQU5WO0FBT2pCeEIsSUFBQUEsY0FBYyxFQUFFdUIsc0JBQVVPLE9BQVYsQ0FBa0JQLHNCQUFVQyxNQUE1QixDQVBDO0FBUWpCdEIsSUFBQUEsZUFBZSxFQUFFcUIsc0JBQVVRLE1BUlY7QUFTakJqQyxJQUFBQSxZQUFZLEVBQUV5QixzQkFBVVMsSUFBVixDQUFlUCxVQVRaO0FBVWpCckIsSUFBQUEsa0JBQWtCLEVBQUVtQixzQkFBVVMsSUFBVixDQUFlUCxVQVZsQjtBQVdqQnBCLElBQUFBLG9CQUFvQixFQUFFa0Isc0JBQVVTLElBQVYsQ0FBZVA7QUFYcEIsR0FGUTtBQUFBLG1DQUN2QmhDLFlBRHVCLGtCQWdCTDtBQUNwQlIsSUFBQUEsZUFBZSxFQUFFTSxtQ0FERztBQUVwQlMsSUFBQUEsY0FBYyxFQUFFLEVBRkk7QUFHcEJFLElBQUFBLGVBQWUsRUFBRSxJQUhHO0FBSXBCQyxJQUFBQSxhQUFhLEVBQUUsSUFKSztBQUtwQkYsSUFBQUEsaUJBQWlCLEVBQUUsS0FMQztBQU1wQkcsSUFBQUEsa0JBQWtCLEVBQUV4QixHQU5BO0FBT3BCeUIsSUFBQUEsb0JBQW9CLEVBQUV6QjtBQVBGLEdBaEJLO0FBb0k3QixTQUFPYSxZQUFQO0FBQ0Q7O2VBRWNELG1CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgQ2xvdWRUaWxlIGZyb20gJy4vY2xvdWQtdGlsZSc7XG5pbXBvcnQgSW1hZ2VNb2RhbENvbnRhaW5lciBmcm9tICcuL2ltYWdlLW1vZGFsLWNvbnRhaW5lcic7XG5pbXBvcnQgUHJvdmlkZXJNb2RhbENvbnRhaW5lciBmcm9tICcuL3Byb3ZpZGVyLW1vZGFsLWNvbnRhaW5lcic7XG5cbmltcG9ydCBTdGF0dXNQYW5lbCwge1VwbG9hZEFuaW1hdGlvbn0gZnJvbSAnLi9zdGF0dXMtcGFuZWwnO1xuXG5pbXBvcnQge01BUF9USFVNQk5BSUxfRElNRU5TSU9OLCBNQVBfSU5GT19DSEFSQUNURVJ9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuaW1wb3J0IHtcbiAgU3R5bGVkTW9kYWxDb250ZW50LFxuICBJbnB1dExpZ2h0LFxuICBUZXh0QXJlYUxpZ2h0LFxuICBTdHlsZWRFeHBvcnRTZWN0aW9uLFxuICBTdHlsZWRNb2RhbFNlY3Rpb24sXG4gIFN0eWxlZE1vZGFsSW5wdXRGb290bm90ZVxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgSW1hZ2VQcmV2aWV3IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ltYWdlLXByZXZpZXcnO1xuaW1wb3J0IHsgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gXCJyZWFjdC1pbnRsXCI7XG5cbmNvbnN0IFN0eWxlZFNhdmVNYXBNb2RhbCA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdzYXZlLW1hcC1tb2RhbCdcbn0pYFxuICAuc2F2ZS1tYXAtbW9kYWwtY29udGVudCB7XG4gICAgbWluLWhlaWdodDogNDAwcHg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuXG4gIC5kZXNjcmlwdGlvbiB7XG4gICAgd2lkdGg6IDMwMHB4O1xuICB9XG5cbiAgLmltYWdlLXByZXZpZXctcGFuZWwge1xuICAgIHdpZHRoOiAzMDBweDtcblxuICAgIC5pbWFnZS1wcmV2aWV3IHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICB9XG5cbiAgLm1hcC1pbmZvLXBhbmVsIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG5cbiAgLnNhdmUtbWFwLW1vZGFsLWRlc2NyaXB0aW9uIHtcbiAgICAubW9kYWwtc2VjdGlvbi1zdWJ0aXRsZSB7XG4gICAgICBtYXJnaW4tbGVmdDogNnB4O1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3Qgbm9wID0gKCkgPT4ge307XG5cbmV4cG9ydCBjb25zdCBNYXBJbmZvUGFuZWwgPSAoe1xuICBtYXBJbmZvID0ge2Rlc2NyaXB0aW9uOiAnJywgdGl0bGU6ICcnfSxcbiAgY2hhcmFjdGVyTGltaXRzLFxuICBvbkNoYW5nZUlucHV0XG59KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uIG1hcC1pbmZvLXBhbmVsXCI+XG4gICAgPFN0eWxlZE1vZGFsU2VjdGlvbiBjbGFzc05hbWU9XCJzYXZlLW1hcC1tb2RhbC1uYW1lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5OYW1lKjwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cIm1hcC10aXRsZVwiXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIHZhbHVlPXttYXBJbmZvLnRpdGxlfVxuICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uQ2hhbmdlSW5wdXQoJ3RpdGxlJywgZSl9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIG1hcCB0aXRsZVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L1N0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICA8U3R5bGVkTW9kYWxTZWN0aW9uPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzYXZlLW1hcC1tb2RhbC1kZXNjcmlwdGlvblwiIHN0eWxlPXt7ZGlzcGxheTogJ2ZsZXgnfX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi10aXRsZVwiPkRlc2NyaXB0aW9uPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi1zdWJ0aXRsZVwiPihvcHRpb25hbCk8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPFRleHRBcmVhTGlnaHRcbiAgICAgICAgICByb3dzPVwiM1wiXG4gICAgICAgICAgaWQ9XCJtYXAtZGVzY3JpcHRpb25cIlxuICAgICAgICAgIHN0eWxlPXt7cmVzaXplOiAnbm9uZSd9fVxuICAgICAgICAgIHZhbHVlPXttYXBJbmZvLmRlc2NyaXB0aW9ufVxuICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uQ2hhbmdlSW5wdXQoJ2Rlc2NyaXB0aW9uJywgZSl9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIG1hcCBkZXNjcmlwdGlvblwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxTdHlsZWRNb2RhbElucHV0Rm9vdG5vdGVcbiAgICAgICAgY2xhc3NOYW1lPVwic2F2ZS1tYXAtbW9kYWwtZGVzY3JpcHRpb25fX2Zvb3Rub3RlXCJcbiAgICAgICAgZXJyb3I9e1xuICAgICAgICAgIGNoYXJhY3RlckxpbWl0cy5kZXNjcmlwdGlvbiAmJiBtYXBJbmZvLmRlc2NyaXB0aW9uLmxlbmd0aCA+IGNoYXJhY3RlckxpbWl0cy5kZXNjcmlwdGlvblxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIHttYXBJbmZvLmRlc2NyaXB0aW9uLmxlbmd0aH0ve2NoYXJhY3RlckxpbWl0cy5kZXNjcmlwdGlvbiB8fCBNQVBfSU5GT19DSEFSQUNURVIuZGVzY3JpcHRpb259eycgJ31cbiAgICAgICAgY2hhcmFjdGVyc1xuICAgICAgPC9TdHlsZWRNb2RhbElucHV0Rm9vdG5vdGU+XG4gICAgPC9TdHlsZWRNb2RhbFNlY3Rpb24+XG4gIDwvZGl2PlxuKTtcblxuZnVuY3Rpb24gU2F2ZU1hcE1vZGFsRmFjdG9yeSgpIHtcbiAgY2xhc3MgU2F2ZU1hcE1vZGFsIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgZXhwb3J0SW1hZ2U6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIG1hcEluZm86IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGlzUHJvdmlkZXJMb2FkaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgICAgdGh1bWJXaWR0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIHRodW1iSGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgY2hhcmFjdGVyTGltaXRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgY2xvdWRQcm92aWRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgY3VycmVudFByb3ZpZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgb25TZXRNYXBJbmZvOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgb25TZXRDbG91ZFByb3ZpZGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9O1xuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGNoYXJhY3RlckxpbWl0czogTUFQX0lORk9fQ0hBUkFDVEVSLFxuICAgICAgY2xvdWRQcm92aWRlcnM6IFtdLFxuICAgICAgY3VycmVudFByb3ZpZGVyOiBudWxsLFxuICAgICAgcHJvdmlkZXJFcnJvcjogbnVsbCxcbiAgICAgIGlzUHJvdmlkZXJMb2FkaW5nOiBmYWxzZSxcbiAgICAgIG9uU2V0Q2xvdWRQcm92aWRlcjogbm9wLFxuICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc6IG5vcFxuICAgIH07XG5cbiAgICBfb25DaGFuZ2VJbnB1dCA9IChrZXksIGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdGFyZ2V0OiB7dmFsdWV9XG4gICAgICB9ID0gZTtcbiAgICAgIHRoaXMucHJvcHMub25TZXRNYXBJbmZvKHtba2V5XTogdmFsdWV9KTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYXBJbmZvLFxuICAgICAgICBleHBvcnRJbWFnZSxcbiAgICAgICAgY2hhcmFjdGVyTGltaXRzID0ge30sXG4gICAgICAgIGNsb3VkUHJvdmlkZXJzLFxuICAgICAgICBpc1Byb3ZpZGVyTG9hZGluZyxcbiAgICAgICAgY3VycmVudFByb3ZpZGVyLFxuICAgICAgICBwcm92aWRlckVycm9yLFxuICAgICAgICBvblNldENsb3VkUHJvdmlkZXIsXG4gICAgICAgIG9uVXBkYXRlSW1hZ2VTZXR0aW5nXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gY3VycmVudFByb3ZpZGVyXG4gICAgICAgID8gY2xvdWRQcm92aWRlcnMuZmluZChwID0+IHAubmFtZSA9PT0gY3VycmVudFByb3ZpZGVyKVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxQcm92aWRlck1vZGFsQ29udGFpbmVyXG4gICAgICAgICAgb25TZXRDbG91ZFByb3ZpZGVyPXtvblNldENsb3VkUHJvdmlkZXJ9XG4gICAgICAgICAgY2xvdWRQcm92aWRlcnM9e2Nsb3VkUHJvdmlkZXJzfVxuICAgICAgICAgIGN1cnJlbnRQcm92aWRlcj17Y3VycmVudFByb3ZpZGVyfVxuICAgICAgICA+XG4gICAgICAgICAgPEltYWdlTW9kYWxDb250YWluZXJcbiAgICAgICAgICAgIGN1cnJlbnRQcm92aWRlcj17Y3VycmVudFByb3ZpZGVyfVxuICAgICAgICAgICAgY2xvdWRQcm92aWRlcnM9e2Nsb3VkUHJvdmlkZXJzfVxuICAgICAgICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc9e29uVXBkYXRlSW1hZ2VTZXR0aW5nfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxTdHlsZWRTYXZlTWFwTW9kYWw+XG4gICAgICAgICAgICAgIDxTdHlsZWRNb2RhbENvbnRlbnQgY2xhc3NOYW1lPVwic2F2ZS1tYXAtbW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uIGRpc2FibGVkPXtpc1Byb3ZpZGVyTG9hZGluZ30+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj48Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLnNhdmVNYXAudGl0bGUnfSAvPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN1YnRpdGxlXCI+PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydtb2RhbC5zYXZlTWFwLnN1YnRpdGxlJ30gLz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAge2Nsb3VkUHJvdmlkZXJzLm1hcChjbG91ZFByb3ZpZGVyID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8Q2xvdWRUaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Nsb3VkUHJvdmlkZXIubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0PXsoKSA9PiBvblNldENsb3VkUHJvdmlkZXIoY2xvdWRQcm92aWRlci5uYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2V0Q2xvdWRQcm92aWRlcj17b25TZXRDbG91ZFByb3ZpZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvdWRQcm92aWRlcj17Y2xvdWRQcm92aWRlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ9e2Nsb3VkUHJvdmlkZXIubmFtZSA9PT0gY3VycmVudFByb3ZpZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25uZWN0ZWQ9e0Jvb2xlYW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3VkUHJvdmlkZXIuZ2V0QWNjZXNzVG9rZW4gJiYgY2xvdWRQcm92aWRlci5nZXRBY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgIHtwcm92aWRlciAmJiBwcm92aWRlci5nZXRNYW5hZ2VtZW50VXJsICYmIChcbiAgICAgICAgICAgICAgICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uIHN0eWxlPXt7bWFyZ2luOiAnMnB4IDAnfX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtwcm92aWRlci5nZXRNYW5hZ2VtZW50VXJsKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e3RleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJ319XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgR28gdG8geW91ciBLZXBsZXIuZ2wge3Byb3ZpZGVyLmRpc3BsYXlOYW1lfSBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkZXNjcmlwdGlvbiBpbWFnZS1wcmV2aWV3LXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbWFnZVByZXZpZXdcbiAgICAgICAgICAgICAgICAgICAgICBleHBvcnRJbWFnZT17ZXhwb3J0SW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e01BUF9USFVNQk5BSUxfRElNRU5TSU9OLndpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIHNob3dEaW1lbnNpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7aXNQcm92aWRlckxvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uIG1hcC1zYXZpbmctYW5pbWF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFVwbG9hZEFuaW1hdGlvbiBpY29uPXtwcm92aWRlciAmJiBwcm92aWRlci5pY29ufSAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxNYXBJbmZvUGFuZWxcbiAgICAgICAgICAgICAgICAgICAgICBtYXBJbmZvPXttYXBJbmZvfVxuICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckxpbWl0cz17Y2hhcmFjdGVyTGltaXRzfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQ9e3RoaXMuX29uQ2hhbmdlSW5wdXR9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgICAgICAgICAgICAgICB7cHJvdmlkZXJFcnJvciA/IChcbiAgICAgICAgICAgICAgICAgIDxTdGF0dXNQYW5lbFxuICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmc9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICBlcnJvcj17cHJvdmlkZXJFcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJJY29uPXtwcm92aWRlciAmJiBwcm92aWRlci5pY29ufVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgPC9TdHlsZWRNb2RhbENvbnRlbnQ+XG4gICAgICAgICAgICA8L1N0eWxlZFNhdmVNYXBNb2RhbD5cbiAgICAgICAgICA8L0ltYWdlTW9kYWxDb250YWluZXI+XG4gICAgICAgIDwvUHJvdmlkZXJNb2RhbENvbnRhaW5lcj5cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBTYXZlTWFwTW9kYWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNhdmVNYXBNb2RhbEZhY3Rvcnk7XG4iXX0=