kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
413 lines (347 loc) • 42.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.ListUpload = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactRedux = require("react-redux");
var _datasetActions = require("../../../store/actions/datasetActions");
var _styles = require("@material-ui/core/styles");
var _Grid = _interopRequireDefault(require("@material-ui/core/Grid"));
var _Paper = _interopRequireDefault(require("@material-ui/core/Paper"));
var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox"));
var _Button = _interopRequireDefault(require("@material-ui/core/Button"));
var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
var _materialUiFlatPagination = _interopRequireDefault(require("material-ui-flat-pagination"));
var _loadingSpinner = _interopRequireDefault(require("../loading-spinner"));
var _Radio = _interopRequireDefault(require("@material-ui/core/Radio"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
// import CircularProgress from "@material-ui/core/CircularProgress";
var styles = function styles(theme) {
return {
root: {
flexGrow: 1,
height: '320px'
},
button: {
margin: theme.spacing.unit,
maxHeight: '30px'
}
};
};
/*
Inspired by https://github.com/okonet/react-dropzone/blob/master/src/index.js
*/
var ListUpload = exports.ListUpload = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(ListUpload, _Component);
var _super = _createSuper(ListUpload);
function ListUpload() {
var _this;
(0, _classCallCheck2["default"])(this, ListUpload);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
currentPage: 1,
datasetsPerPage: 4,
offset: 0,
datasetFilter: '',
filteredDatasets: [],
selectedValue: ''
});
// static propTypes = {
// onUpload: PropTypes.func.isRequired
// };
// _setState = s => {
// this.setState({ [s]: true });
// };
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handlePageChange", function (offset, page) {
// console.log("active page is" + page);
_this.setState({
offset: offset,
currentPage: page
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMount", function (datasets) {
return datasets.map(function (dataset) {
return _this.setState((0, _defineProperty2["default"])({}, dataset.id, false));
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_downloadDataset", function (datasets) {
_this.props.dispatch((0, _datasetActions.listDatasetDownload)(datasets));
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_files", function () {
var files = [];
var datasetId = _this.state; // console.log(datasetId);
for (var _i = 0, _Object$entries = Object.entries(datasetId); _i < _Object$entries.length; _i++) {
var _Object$entries$_i2 = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
key = _Object$entries$_i2[0],
value = _Object$entries$_i2[1];
if (value === true) {
var datasets = _this.props.dataset.datasets;
datasets.map(function (dataset) {
if (dataset.id === _this.state.selectedValue) {
// console.log(dataset);
files.push(dataset); // console.log(files);
return _this._downloadDataset(dataset);
}
return dataset;
});
}
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onClick", function () {
// return this._files();
var dataset = _this.props.dataset.datasets.map(function (dataset) {
if (dataset.id === _this.state.selectedValue) {
return _this._downloadDataset(dataset);
}
});
return dataset;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onChange", function (_ref) {
var files = _ref.target.files;
files = _this.props.dataset.listDatasets;
if (!files) {
return;
}
_this.props.onUpload(files);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleChange", function (name) {
return function (event) {
_this.props.dataset.datasets.map(function (dataset) {
// console.log(dataset.id);
var id = dataset.id.toString();
_this.setState((0, _defineProperty2["default"])({}, id, false));
}); // console.log(this.state);
_this.setState((0, _defineProperty2["default"])({}, name, event.target.checked));
};
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleRadioChange", function (event) {
_this.setState({
selectedValue: event.target.value
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_filterDatasets", function (datasetFilter) {
var datasets = _this.props.dataset.datasets;
var filteredDatasets = datasets.filter(function (dataset) {
var datasetName = dataset.name.toLowerCase();
return datasetName.indexOf(datasetFilter.toLowerCase()) !== -1;
});
_this.setState({
filteredDatasets: filteredDatasets
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleFilterChange", function (e) {
_this.setState({
datasetFilter: e.target.value
});
_this._filterDatasets(e.target.value);
});
return _this;
}
(0, _createClass2["default"])(ListUpload, [{
key: "componentDidMount",
value: function componentDidMount() {
// console.log(this.state);
// this.setState({datasets: this.props.dataset.datasets})
var datasets = this.props.dataset.datasets;
if (datasets) {
this._onMount(datasets);
}
}
}, {
key: "_blobToFile",
value: function _blobToFile(theBlob, fileName) {
// A Blob() is almost a File() - it's just missing the two properties below which we will add
// console.log(theBlob);
theBlob.lastModifiedDate = new Date();
theBlob.name = fileName;
return theBlob;
}
}, {
key: "_loadData",
value: function _loadData(response, file) {
return file;
}
}, {
key: "_renderNoDatasetMessage",
value: function _renderNoDatasetMessage() {
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", null, "you have no file(s) in Datahub "))
);
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var classes = this.props.classes;
var datasets = this.props.dataset.datasets;
var _this$state = this.state,
currentPage = _this$state.currentPage,
datasetsPerPage = _this$state.datasetsPerPage,
filteredDatasets = _this$state.filteredDatasets,
datasetFilter = _this$state.datasetFilter;
var indexOfLastDataset = currentPage * datasetsPerPage;
var indexOfFirstDataset = indexOfLastDataset - datasetsPerPage;
var currentDatasets = [];
if (datasetFilter.length === 0) {
currentDatasets = datasets.slice(indexOfFirstDataset, indexOfLastDataset);
} else {
currentDatasets = filteredDatasets.slice(indexOfFirstDataset, indexOfLastDataset);
datasets = filteredDatasets;
} // const currentDatasets = datasets.slice(
// indexOfFirstDataset,
// indexOfLastDataset
// );
var renderDatasets = currentDatasets.map(function (dataset) {
var ID = dataset.id.toString(); // console.log(this.state[ID]);
return (/*#__PURE__*/_react["default"].createElement(_Grid["default"], {
key: dataset.id,
item: true,
xs: 12,
style: {
paddingBottom: '0px',
width: '100%'
}
}, /*#__PURE__*/_react["default"].createElement(_Paper["default"], {
className: classes.paper
}, /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
container: true,
wrap: "nowrap",
spacing: 16,
style: {
margin: 'auto'
}
}, /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
item: true,
style: {
padding: '0px'
}
}, /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
checked: _this2.state.selectedValue === ID,
onChange: _this2.handleRadioChange,
value: dataset.id,
name: "radio-button-demo",
"aria-label": "A"
})), /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
item: true,
xs: true,
style: {
margin: 'auto'
}
}, /*#__PURE__*/_react["default"].createElement(_Typography["default"], null, dataset.name, "-", dataset.availabilityStatus)))))
);
});
var _renderNoDatasetMessage = function _renderNoDatasetMessage() {
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
style: {
fontSize: '14px',
marginBottom: '12px',
color: 'black'
}
}, "You have no files in Datahub", ' '))
);
}; // const loading = "OPEN";
var _renderButton = function _renderButton() {
var datasets = _this2.props.dataset.datasets; // const loadingDataset = true;
if (datasets.length) {
if (_this2.props.ui.progressAddDataStatus === 'OPEN') {
// if (loading === "OPEN") {
return (/*#__PURE__*/_react["default"].createElement("div", {
style: {
margin: 'auto'
}
}, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], null))
);
}
return (/*#__PURE__*/_react["default"].createElement(_Button["default"] // disabled={loadingDataset}
, {
className: classes.button,
onClick: _this2._onClick
}, "Add Data")
);
}
return _renderNoDatasetMessage();
}; // console.log(datasets);
return (/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
className: classes.root,
style: {
display: 'grid'
}
}, /*#__PURE__*/_react["default"].createElement("div", {
style: {
marginLeft: '12px'
}
}, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "filter"
}, "Search: "), /*#__PURE__*/_react["default"].createElement("input", {
style: {
borderTopStyle: 'hidden',
borderLeftStyle: 'hidden',
borderRightStyle: 'hidden',
borderBottomStyle: 'solid',
borderBottomWidth: 'thin',
borderBottomColor: 'lightgray'
},
type: "text",
id: "filter",
value: this.state.datasetFilter,
onChange: this._handleFilterChange
})), /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
container: true,
spacing: 24,
style: {
display: 'inline-block',
margin: 'auto',
width: '100%',
minHeight: '240px'
}
}, renderDatasets), /*#__PURE__*/_react["default"].createElement(_materialUiFlatPagination["default"], {
otherPageColor: "black",
style: {
margin: 'auto'
},
activePage: this.state.currentPage,
limit: this.state.datasetsPerPage,
offset: this.state.offset,
total: datasets.length,
onClick: function onClick(e, offset, page) {
return _this2.handlePageChange(offset, page);
}
}), _renderButton()))
);
}
}]);
return ListUpload;
}(_react.Component);
ListUpload.propTypes = {
classes: _propTypes["default"].object.isRequired
};
var mapStateToProps = function mapStateToProps(state) {
return state;
};
var _default = exports["default"] = (0, _reactRedux.connect)(mapStateToProps, null)((0, _styles.withStyles)(styles)(ListUpload)); // <Wrapper>
// <input
// type="file"
// ref={ref => {this._fileInput = ref}}
// style={{display: 'none'}}
// onChange={this._onChange}
// />
// <span onClick={this._onClick}>{this.props.children}</span>
// </Wrapper>
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2xpc3QtdXBsb2FkLmpzIl0sIm5hbWVzIjpbInN0eWxlcyIsInRoZW1lIiwicm9vdCIsImZsZXhHcm93IiwiaGVpZ2h0IiwiYnV0dG9uIiwibWFyZ2luIiwic3BhY2luZyIsInVuaXQiLCJtYXhIZWlnaHQiLCJMaXN0VXBsb2FkIiwiY3VycmVudFBhZ2UiLCJkYXRhc2V0c1BlclBhZ2UiLCJvZmZzZXQiLCJkYXRhc2V0RmlsdGVyIiwiZmlsdGVyZWREYXRhc2V0cyIsInNlbGVjdGVkVmFsdWUiLCJwYWdlIiwic2V0U3RhdGUiLCJkYXRhc2V0cyIsIm1hcCIsImRhdGFzZXQiLCJpZCIsInByb3BzIiwiZGlzcGF0Y2giLCJmaWxlcyIsImRhdGFzZXRJZCIsInN0YXRlIiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsInZhbHVlIiwicHVzaCIsIl9kb3dubG9hZERhdGFzZXQiLCJ0YXJnZXQiLCJsaXN0RGF0YXNldHMiLCJvblVwbG9hZCIsIm5hbWUiLCJldmVudCIsInRvU3RyaW5nIiwiY2hlY2tlZCIsImZpbHRlciIsImRhdGFzZXROYW1lIiwidG9Mb3dlckNhc2UiLCJpbmRleE9mIiwiZSIsIl9maWx0ZXJEYXRhc2V0cyIsIl9vbk1vdW50IiwidGhlQmxvYiIsImZpbGVOYW1lIiwibGFzdE1vZGlmaWVkRGF0ZSIsIkRhdGUiLCJyZXNwb25zZSIsImZpbGUiLCJjbGFzc2VzIiwiaW5kZXhPZkxhc3REYXRhc2V0IiwiaW5kZXhPZkZpcnN0RGF0YXNldCIsImN1cnJlbnREYXRhc2V0cyIsImxlbmd0aCIsInNsaWNlIiwicmVuZGVyRGF0YXNldHMiLCJJRCIsInBhZGRpbmdCb3R0b20iLCJ3aWR0aCIsInBhcGVyIiwicGFkZGluZyIsImhhbmRsZVJhZGlvQ2hhbmdlIiwiYXZhaWxhYmlsaXR5U3RhdHVzIiwiX3JlbmRlck5vRGF0YXNldE1lc3NhZ2UiLCJmb250U2l6ZSIsIm1hcmdpbkJvdHRvbSIsImNvbG9yIiwiX3JlbmRlckJ1dHRvbiIsInVpIiwicHJvZ3Jlc3NBZGREYXRhU3RhdHVzIiwiX29uQ2xpY2siLCJkaXNwbGF5IiwibWFyZ2luTGVmdCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJCb3R0b21Db2xvciIsIl9oYW5kbGVGaWx0ZXJDaGFuZ2UiLCJtaW5IZWlnaHQiLCJoYW5kbGVQYWdlQ2hhbmdlIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsIm1hcFN0YXRlVG9Qcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7O0FBQ0E7QUFFQSxJQUFNQSxNQUFNLEdBQUcsU0FBVEEsTUFBUyxDQUFBQyxLQUFLO0FBQUEsU0FBSztBQUN2QkMsSUFBQUEsSUFBSSxFQUFFO0FBQ0pDLE1BQUFBLFFBQVEsRUFBRSxDQUROO0FBRUpDLE1BQUFBLE1BQU0sRUFBRTtBQUZKLEtBRGlCO0FBS3ZCQyxJQUFBQSxNQUFNLEVBQUU7QUFDTkMsTUFBQUEsTUFBTSxFQUFFTCxLQUFLLENBQUNNLE9BQU4sQ0FBY0MsSUFEaEI7QUFFTkMsTUFBQUEsU0FBUyxFQUFFO0FBRkw7QUFMZSxHQUFMO0FBQUEsQ0FBcEI7QUFVQTs7Ozs7SUFHYUMsVTs7Ozs7Ozs7Ozs7Ozs7OzhGQUNIO0FBQ05DLE1BQUFBLFdBQVcsRUFBRSxDQURQO0FBRU5DLE1BQUFBLGVBQWUsRUFBRSxDQUZYO0FBR05DLE1BQUFBLE1BQU0sRUFBRSxDQUhGO0FBSU5DLE1BQUFBLGFBQWEsRUFBRSxFQUpUO0FBS05DLE1BQUFBLGdCQUFnQixFQUFFLEVBTFo7QUFNTkMsTUFBQUEsYUFBYSxFQUFFO0FBTlQsSztBQVFSO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTt5R0FDbUIsVUFBQ0gsTUFBRCxFQUFTSSxJQUFULEVBQWtCO0FBQ25DO0FBQ0EsWUFBS0MsUUFBTCxDQUFjO0FBQUNMLFFBQUFBLE1BQU0sRUFBTkEsTUFBRDtBQUFTRixRQUFBQSxXQUFXLEVBQUVNO0FBQXRCLE9BQWQ7QUFDRCxLO2lHQUVVLFVBQUFFLFFBQVEsRUFBSTtBQUNyQixhQUFPQSxRQUFRLENBQUNDLEdBQVQsQ0FBYSxVQUFBQyxPQUFPO0FBQUEsZUFBSSxNQUFLSCxRQUFMLHNDQUFnQkcsT0FBTyxDQUFDQyxFQUF4QixFQUE2QixLQUE3QixFQUFKO0FBQUEsT0FBcEIsQ0FBUDtBQUNELEs7eUdBc0JrQixVQUFBSCxRQUFRLEVBQUk7QUFDN0IsWUFBS0ksS0FBTCxDQUFXQyxRQUFYLENBQW9CLHlDQUFvQkwsUUFBcEIsQ0FBcEI7QUFDRCxLOytGQUVRLFlBQU07QUFDYixVQUFJTSxLQUFLLEdBQUcsRUFBWjtBQUNBLFVBQU1DLFNBQVMsR0FBRyxNQUFLQyxLQUF2QixDQUZhLENBR2I7O0FBQ0EseUNBQTJCQyxNQUFNLENBQUNDLE9BQVAsQ0FBZUgsU0FBZixDQUEzQixxQ0FBc0Q7QUFBakQ7QUFBQSxZQUFPSSxHQUFQO0FBQUEsWUFBWUMsS0FBWjs7QUFDSCxZQUFJQSxLQUFLLEtBQUssSUFBZCxFQUFvQjtBQUNsQixjQUFNWixRQUFRLEdBQUcsTUFBS0ksS0FBTCxDQUFXRixPQUFYLENBQW1CRixRQUFwQztBQUNBQSxVQUFBQSxRQUFRLENBQUNDLEdBQVQsQ0FBYSxVQUFBQyxPQUFPLEVBQUk7QUFDdEIsZ0JBQUlBLE9BQU8sQ0FBQ0MsRUFBUixLQUFlLE1BQUtLLEtBQUwsQ0FBV1gsYUFBOUIsRUFBNkM7QUFDM0M7QUFDQVMsY0FBQUEsS0FBSyxDQUFDTyxJQUFOLENBQVdYLE9BQVgsRUFGMkMsQ0FHM0M7O0FBQ0EscUJBQU8sTUFBS1ksZ0JBQUwsQ0FBc0JaLE9BQXRCLENBQVA7QUFDRDs7QUFDRCxtQkFBT0EsT0FBUDtBQUNELFdBUkQ7QUFTRDtBQUNGO0FBQ0YsSztpR0FFVSxZQUFNO0FBQ2Y7QUFFQSxVQUFNQSxPQUFPLEdBQUcsTUFBS0UsS0FBTCxDQUFXRixPQUFYLENBQW1CRixRQUFuQixDQUE0QkMsR0FBNUIsQ0FBZ0MsVUFBQUMsT0FBTyxFQUFJO0FBQ3pELFlBQUlBLE9BQU8sQ0FBQ0MsRUFBUixLQUFlLE1BQUtLLEtBQUwsQ0FBV1gsYUFBOUIsRUFBNkM7QUFDM0MsaUJBQU8sTUFBS2lCLGdCQUFMLENBQXNCWixPQUF0QixDQUFQO0FBQ0Q7QUFDRixPQUplLENBQWhCOztBQUtBLGFBQU9BLE9BQVA7QUFDRCxLO2tHQUVXLGdCQUF1QjtBQUFBLFVBQVpJLEtBQVksUUFBckJTLE1BQXFCLENBQVpULEtBQVk7QUFDakNBLE1BQUFBLEtBQUssR0FBRyxNQUFLRixLQUFMLENBQVdGLE9BQVgsQ0FBbUJjLFlBQTNCOztBQUNBLFVBQUksQ0FBQ1YsS0FBTCxFQUFZO0FBQ1Y7QUFDRDs7QUFFRCxZQUFLRixLQUFMLENBQVdhLFFBQVgsQ0FBb0JYLEtBQXBCO0FBQ0QsSztxR0FFYyxVQUFBWSxJQUFJO0FBQUEsYUFBSSxVQUFBQyxLQUFLLEVBQUk7QUFDOUIsY0FBS2YsS0FBTCxDQUFXRixPQUFYLENBQW1CRixRQUFuQixDQUE0QkMsR0FBNUIsQ0FBZ0MsVUFBQUMsT0FBTyxFQUFJO0FBQ3pDO0FBQ0EsY0FBTUMsRUFBRSxHQUFHRCxPQUFPLENBQUNDLEVBQVIsQ0FBV2lCLFFBQVgsRUFBWDs7QUFDQSxnQkFBS3JCLFFBQUwsc0NBQWdCSSxFQUFoQixFQUFxQixLQUFyQjtBQUNELFNBSkQsRUFEOEIsQ0FNOUI7OztBQUNBLGNBQUtKLFFBQUwsc0NBQWdCbUIsSUFBaEIsRUFBdUJDLEtBQUssQ0FBQ0osTUFBTixDQUFhTSxPQUFwQztBQUNELE9BUmtCO0FBQUEsSzswR0FVQyxVQUFBRixLQUFLLEVBQUk7QUFDM0IsWUFBS3BCLFFBQUwsQ0FBYztBQUFDRixRQUFBQSxhQUFhLEVBQUVzQixLQUFLLENBQUNKLE1BQU4sQ0FBYUg7QUFBN0IsT0FBZDtBQUNELEs7d0dBVWlCLFVBQUFqQixhQUFhLEVBQUk7QUFDakMsVUFBT0ssUUFBUCxHQUFtQixNQUFLSSxLQUFMLENBQVdGLE9BQTlCLENBQU9GLFFBQVA7QUFDQSxVQUFNSixnQkFBZ0IsR0FBR0ksUUFBUSxDQUFDc0IsTUFBVCxDQUFnQixVQUFBcEIsT0FBTyxFQUFJO0FBQ2xELFlBQU1xQixXQUFXLEdBQUdyQixPQUFPLENBQUNnQixJQUFSLENBQWFNLFdBQWIsRUFBcEI7QUFDQSxlQUFPRCxXQUFXLENBQUNFLE9BQVosQ0FBb0I5QixhQUFhLENBQUM2QixXQUFkLEVBQXBCLE1BQXFELENBQUMsQ0FBN0Q7QUFDRCxPQUh3QixDQUF6Qjs7QUFJQSxZQUFLekIsUUFBTCxDQUFjO0FBQUNILFFBQUFBLGdCQUFnQixFQUFoQkE7QUFBRCxPQUFkO0FBQ0QsSzs0R0FFcUIsVUFBQThCLENBQUMsRUFBSTtBQUN6QixZQUFLM0IsUUFBTCxDQUFjO0FBQ1pKLFFBQUFBLGFBQWEsRUFBRStCLENBQUMsQ0FBQ1gsTUFBRixDQUFTSDtBQURaLE9BQWQ7O0FBR0EsWUFBS2UsZUFBTCxDQUFxQkQsQ0FBQyxDQUFDWCxNQUFGLENBQVNILEtBQTlCO0FBQ0QsSzs7Ozs7O1dBcEdELDZCQUFvQjtBQUNsQjtBQUNBO0FBQ0EsVUFBTVosUUFBUSxHQUFHLEtBQUtJLEtBQUwsQ0FBV0YsT0FBWCxDQUFtQkYsUUFBcEM7O0FBQ0EsVUFBSUEsUUFBSixFQUFjO0FBQ1osYUFBSzRCLFFBQUwsQ0FBYzVCLFFBQWQ7QUFDRDtBQUNGOzs7V0FFRCxxQkFBWTZCLE9BQVosRUFBcUJDLFFBQXJCLEVBQStCO0FBQzdCO0FBQ0E7QUFDQUQsTUFBQUEsT0FBTyxDQUFDRSxnQkFBUixHQUEyQixJQUFJQyxJQUFKLEVBQTNCO0FBQ0FILE1BQUFBLE9BQU8sQ0FBQ1gsSUFBUixHQUFlWSxRQUFmO0FBQ0EsYUFBT0QsT0FBUDtBQUNEOzs7V0FDRCxtQkFBVUksUUFBVixFQUFvQkMsSUFBcEIsRUFBMEI7QUFDeEIsYUFBT0EsSUFBUDtBQUNEOzs7V0E0REQsbUNBQTBCO0FBQ3hCLDJCQUNFLDBEQUNFLDZFQURGO0FBREY7QUFLRDs7O1dBa0JELGtCQUFTO0FBQUE7O0FBQ1AsVUFBT0MsT0FBUCxHQUFrQixLQUFLL0IsS0FBdkIsQ0FBTytCLE9BQVA7QUFDQSxVQUFLbkMsUUFBTCxHQUFpQixLQUFLSSxLQUFMLENBQVdGLE9BQTVCLENBQUtGLFFBQUw7QUFDQSx3QkFLSSxLQUFLUSxLQUxUO0FBQUEsVUFDRWhCLFdBREYsZUFDRUEsV0FERjtBQUFBLFVBRUVDLGVBRkYsZUFFRUEsZUFGRjtBQUFBLFVBR0VHLGdCQUhGLGVBR0VBLGdCQUhGO0FBQUEsVUFJRUQsYUFKRixlQUlFQSxhQUpGO0FBTUEsVUFBTXlDLGtCQUFrQixHQUFHNUMsV0FBVyxHQUFHQyxlQUF6QztBQUNBLFVBQU00QyxtQkFBbUIsR0FBR0Qsa0JBQWtCLEdBQUczQyxlQUFqRDtBQUVBLFVBQUk2QyxlQUFlLEdBQUcsRUFBdEI7O0FBRUEsVUFBSTNDLGFBQWEsQ0FBQzRDLE1BQWQsS0FBeUIsQ0FBN0IsRUFBZ0M7QUFDOUJELFFBQUFBLGVBQWUsR0FBR3RDLFFBQVEsQ0FBQ3dDLEtBQVQsQ0FBZUgsbUJBQWYsRUFBb0NELGtCQUFwQyxDQUFsQjtBQUNELE9BRkQsTUFFTztBQUNMRSxRQUFBQSxlQUFlLEdBQUcxQyxnQkFBZ0IsQ0FBQzRDLEtBQWpCLENBQ2hCSCxtQkFEZ0IsRUFFaEJELGtCQUZnQixDQUFsQjtBQUlBcEMsUUFBQUEsUUFBUSxHQUFHSixnQkFBWDtBQUNELE9BdEJNLENBd0JQO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQSxVQUFNNkMsY0FBYyxHQUFHSCxlQUFlLENBQUNyQyxHQUFoQixDQUFvQixVQUFBQyxPQUFPLEVBQUk7QUFDcEQsWUFBTXdDLEVBQUUsR0FBR3hDLE9BQU8sQ0FBQ0MsRUFBUixDQUFXaUIsUUFBWCxFQUFYLENBRG9ELENBRXBEOztBQUNBLDZCQUNFLGdDQUFDLGdCQUFEO0FBQ0UsWUFBQSxHQUFHLEVBQUVsQixPQUFPLENBQUNDLEVBRGY7QUFFRSxZQUFBLElBQUksTUFGTjtBQUdFLFlBQUEsRUFBRSxFQUFFLEVBSE47QUFJRSxZQUFBLEtBQUssRUFBRTtBQUFDd0MsY0FBQUEsYUFBYSxFQUFFLEtBQWhCO0FBQXVCQyxjQUFBQSxLQUFLLEVBQUU7QUFBOUI7QUFKVCwwQkFNRSxnQ0FBQyxpQkFBRDtBQUFPLFlBQUEsU0FBUyxFQUFFVCxPQUFPLENBQUNVO0FBQTFCLDBCQUNFLGdDQUFDLGdCQUFEO0FBQU0sWUFBQSxTQUFTLE1BQWY7QUFBZ0IsWUFBQSxJQUFJLEVBQUMsUUFBckI7QUFBOEIsWUFBQSxPQUFPLEVBQUUsRUFBdkM7QUFBMkMsWUFBQSxLQUFLLEVBQUU7QUFBQzFELGNBQUFBLE1BQU0sRUFBRTtBQUFUO0FBQWxELDBCQUNFLGdDQUFDLGdCQUFEO0FBQU0sWUFBQSxJQUFJLE1BQVY7QUFBVyxZQUFBLEtBQUssRUFBRTtBQUFDMkQsY0FBQUEsT0FBTyxFQUFFO0FBQVY7QUFBbEIsMEJBQ0UsZ0NBQUMsaUJBQUQ7QUFDRSxZQUFBLE9BQU8sRUFBRSxNQUFJLENBQUN0QyxLQUFMLENBQVdYLGFBQVgsS0FBNkI2QyxFQUR4QztBQUVFLFlBQUEsUUFBUSxFQUFFLE1BQUksQ0FBQ0ssaUJBRmpCO0FBR0UsWUFBQSxLQUFLLEVBQUU3QyxPQUFPLENBQUNDLEVBSGpCO0FBSUUsWUFBQSxJQUFJLEVBQUMsbUJBSlA7QUFLRSwwQkFBVztBQUxiLFlBREYsQ0FERixlQWlCRSxnQ0FBQyxnQkFBRDtBQUFNLFlBQUEsSUFBSSxNQUFWO0FBQVcsWUFBQSxFQUFFLE1BQWI7QUFBYyxZQUFBLEtBQUssRUFBRTtBQUFDaEIsY0FBQUEsTUFBTSxFQUFFO0FBQVQ7QUFBckIsMEJBQ0UsZ0NBQUMsc0JBQUQsUUFDR2UsT0FBTyxDQUFDZ0IsSUFEWCxPQUNrQmhCLE9BQU8sQ0FBQzhDLGtCQUQxQixDQURGLENBakJGLENBREYsQ0FORjtBQURGO0FBa0NELE9BckNzQixDQUF2Qjs7QUF1Q0EsVUFBTUMsdUJBQXVCLEdBQUcsU0FBMUJBLHVCQUEwQixHQUFNO0FBQ3BDLDZCQUNFLDBEQUNFO0FBQUcsWUFBQSxLQUFLLEVBQUU7QUFBQ0MsY0FBQUEsUUFBUSxFQUFFLE1BQVg7QUFBbUJDLGNBQUFBLFlBQVksRUFBRSxNQUFqQztBQUF5Q0MsY0FBQUEsS0FBSyxFQUFFO0FBQWhEO0FBQVYsNkNBQytCLEdBRC9CLENBREY7QUFERjtBQU9ELE9BUkQsQ0FwRU8sQ0E2RVA7OztBQUNBLFVBQU1DLGFBQWEsR0FBRyxTQUFoQkEsYUFBZ0IsR0FBTTtBQUMxQixZQUFPckQsUUFBUCxHQUFtQixNQUFJLENBQUNJLEtBQUwsQ0FBV0YsT0FBOUIsQ0FBT0YsUUFBUCxDQUQwQixDQUUxQjs7QUFDQSxZQUFJQSxRQUFRLENBQUN1QyxNQUFiLEVBQXFCO0FBQ25CLGNBQUksTUFBSSxDQUFDbkMsS0FBTCxDQUFXa0QsRUFBWCxDQUFjQyxxQkFBZCxLQUF3QyxNQUE1QyxFQUFvRDtBQUNsRDtBQUNBLGlDQUNFO0FBQUssZ0JBQUEsS0FBSyxFQUFFO0FBQUNwRSxrQkFBQUEsTUFBTSxFQUFFO0FBQVQ7QUFBWiw4QkFDRSxnQ0FBQywwQkFBRCxPQURGO0FBREY7QUFLRDs7QUFDQywrQkFDRSxnQ0FBQyxrQkFBRCxDQUNFO0FBREY7QUFFRSxjQUFBLFNBQVMsRUFBRWdELE9BQU8sQ0FBQ2pELE1BRnJCO0FBR0UsY0FBQSxPQUFPLEVBQUUsTUFBSSxDQUFDc0U7QUFIaEI7QUFERjtBQWlCSDs7QUFDQyxlQUFPUCx1QkFBdUIsRUFBOUI7QUFFSCxPQWhDRCxDQTlFTyxDQStHUDs7O0FBQ0EsMkJBQ0UsZ0NBQUMsaUJBQUQsQ0FBTyxRQUFQLHFCQUNFO0FBQUssVUFBQSxTQUFTLEVBQUVkLE9BQU8sQ0FBQ3BELElBQXhCO0FBQThCLFVBQUEsS0FBSyxFQUFFO0FBQUMwRSxZQUFBQSxPQUFPLEVBQUU7QUFBVjtBQUFyQyx3QkFDRTtBQUFLLFVBQUEsS0FBSyxFQUFFO0FBQUNDLFlBQUFBLFVBQVUsRUFBRTtBQUFiO0FBQVosd0JBQ0U7QUFBTyxVQUFBLE9BQU8sRUFBQztBQUFmLHNCQURGLGVBRUU7QUFDRSxVQUFBLEtBQUssRUFBRTtBQUNMQyxZQUFBQSxjQUFjLEVBQUUsUUFEWDtBQUVMQyxZQUFBQSxlQUFlLEVBQUUsUUFGWjtBQUdMQyxZQUFBQSxnQkFBZ0IsRUFBRSxRQUhiO0FBSUxDLFlBQUFBLGlCQUFpQixFQUFFLE9BSmQ7QUFLTEMsWUFBQUEsaUJBQWlCLEVBQUUsTUFMZDtBQU1MQyxZQUFBQSxpQkFBaUIsRUFBRTtBQU5kLFdBRFQ7QUFTRSxVQUFBLElBQUksRUFBQyxNQVRQO0FBVUUsVUFBQSxFQUFFLEVBQUMsUUFWTDtBQVdFLFVBQUEsS0FBSyxFQUFFLEtBQUt4RCxLQUFMLENBQVdiLGFBWHBCO0FBWUUsVUFBQSxRQUFRLEVBQUUsS0FBS3NFO0FBWmpCLFVBRkYsQ0FERixlQWtCRSxnQ0FBQyxnQkFBRDtBQUNFLFVBQUEsU0FBUyxNQURYO0FBRUUsVUFBQSxPQUFPLEVBQUUsRUFGWDtBQUdFLFVBQUEsS0FBSyxFQUFFO0FBQ0xSLFlBQUFBLE9BQU8sRUFBRSxjQURKO0FBRUx0RSxZQUFBQSxNQUFNLEVBQUUsTUFGSDtBQUdMeUQsWUFBQUEsS0FBSyxFQUFFLE1BSEY7QUFJTHNCLFlBQUFBLFNBQVMsRUFBRTtBQUpOO0FBSFQsV0FVR3pCLGNBVkgsQ0FsQkYsZUE4QkUsZ0NBQUMsb0NBQUQ7QUFDRSxVQUFBLGNBQWMsRUFBQyxPQURqQjtBQUVFLFVBQUEsS0FBSyxFQUFFO0FBQUN0RCxZQUFBQSxNQUFNLEVBQUU7QUFBVCxXQUZUO0FBR0UsVUFBQSxVQUFVLEVBQUUsS0FBS3FCLEtBQUwsQ0FBV2hCLFdBSHpCO0FBSUUsVUFBQSxLQUFLLEVBQUUsS0FBS2dCLEtBQUwsQ0FBV2YsZUFKcEI7QUFLRSxVQUFBLE1BQU0sRUFBRSxLQUFLZSxLQUFMLENBQVdkLE1BTHJCO0FBTUUsVUFBQSxLQUFLLEVBQUVNLFFBQVEsQ0FBQ3VDLE1BTmxCO0FBT0UsVUFBQSxPQUFPLEVBQUUsaUJBQUNiLENBQUQsRUFBSWhDLE1BQUosRUFBWUksSUFBWjtBQUFBLG1CQUFxQixNQUFJLENBQUNxRSxnQkFBTCxDQUFzQnpFLE1BQXRCLEVBQThCSSxJQUE5QixDQUFyQjtBQUFBO0FBUFgsVUE5QkYsRUF1Q0d1RCxhQUFhLEVBdkNoQixDQURGO0FBREY7QUE2Q0Q7OztFQTVSNkJlLGdCOztBQStSaEM3RSxVQUFVLENBQUM4RSxTQUFYLEdBQXVCO0FBQ3JCbEMsRUFBQUEsT0FBTyxFQUFFbUMsc0JBQVVDLE1BQVYsQ0FBaUJDO0FBREwsQ0FBdkI7O0FBSUEsSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUFBakUsS0FBSztBQUFBLFNBQUlBLEtBQUo7QUFBQSxDQUE3Qjs7b0NBRWUseUJBQVFpRSxlQUFSLEVBQXlCLElBQXpCLEVBQStCLHdCQUFXNUYsTUFBWCxFQUFtQlUsVUFBbkIsQ0FBL0IsQyxFQUVmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbi8vIGltcG9ydCBzdHlsZWQgZnJvbSBcInN0eWxlZC1jb21wb25lbnRzXCI7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7bGlzdERhdGFzZXREb3dubG9hZH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvYWN0aW9ucy9kYXRhc2V0QWN0aW9ucyc7XG5pbXBvcnQge3dpdGhTdHlsZXN9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgR3JpZCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9HcmlkJztcbmltcG9ydCBQYXBlciBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9QYXBlcic7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQ2hlY2tib3gnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9CdXR0b24nO1xuLy8gaW1wb3J0IEF2YXRhciBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvQXZhdGFyXCI7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9UeXBvZ3JhcGh5JztcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJ21hdGVyaWFsLXVpLWZsYXQtcGFnaW5hdGlvbic7XG5pbXBvcnQgTG9hZGluZ1NwaW5uZXIgZnJvbSAnLi4vbG9hZGluZy1zcGlubmVyJztcbmltcG9ydCBSYWRpbyBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9SYWRpbyc7XG4vLyBpbXBvcnQgQ2lyY3VsYXJQcm9ncmVzcyBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvQ2lyY3VsYXJQcm9ncmVzc1wiO1xuXG5jb25zdCBzdHlsZXMgPSB0aGVtZSA9PiAoe1xuICByb290OiB7XG4gICAgZmxleEdyb3c6IDEsXG4gICAgaGVpZ2h0OiAnMzIwcHgnXG4gIH0sXG4gIGJ1dHRvbjoge1xuICAgIG1hcmdpbjogdGhlbWUuc3BhY2luZy51bml0LFxuICAgIG1heEhlaWdodDogJzMwcHgnXG4gIH1cbn0pO1xuLypcbkluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvcmVhY3QtZHJvcHpvbmUvYmxvYi9tYXN0ZXIvc3JjL2luZGV4LmpzXG4qL1xuZXhwb3J0IGNsYXNzIExpc3RVcGxvYWQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0ZSA9IHtcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBkYXRhc2V0c1BlclBhZ2U6IDQsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGRhdGFzZXRGaWx0ZXI6ICcnLFxuICAgIGZpbHRlcmVkRGF0YXNldHM6IFtdLFxuICAgIHNlbGVjdGVkVmFsdWU6ICcnXG4gIH07XG4gIC8vIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gIC8vICAgb25VcGxvYWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgLy8gfTtcblxuICAvLyAgIF9zZXRTdGF0ZSA9IHMgPT4ge1xuICAvLyAgICAgdGhpcy5zZXRTdGF0ZSh7IFtzXTogdHJ1ZSB9KTtcbiAgLy8gICB9O1xuICBoYW5kbGVQYWdlQ2hhbmdlID0gKG9mZnNldCwgcGFnZSkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWN0aXZlIHBhZ2UgaXNcIiArIHBhZ2UpO1xuICAgIHRoaXMuc2V0U3RhdGUoe29mZnNldCwgY3VycmVudFBhZ2U6IHBhZ2V9KTtcbiAgfTtcblxuICBfb25Nb3VudCA9IGRhdGFzZXRzID0+IHtcbiAgICByZXR1cm4gZGF0YXNldHMubWFwKGRhdGFzZXQgPT4gdGhpcy5zZXRTdGF0ZSh7W2RhdGFzZXQuaWRdOiBmYWxzZX0pKTtcbiAgfTtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnN0YXRlKTtcbiAgICAvLyAgIHRoaXMuc2V0U3RhdGUoe2RhdGFzZXRzOiB0aGlzLnByb3BzLmRhdGFzZXQuZGF0YXNldHN9KVxuICAgIGNvbnN0IGRhdGFzZXRzID0gdGhpcy5wcm9wcy5kYXRhc2V0LmRhdGFzZXRzO1xuICAgIGlmIChkYXRhc2V0cykge1xuICAgICAgdGhpcy5fb25Nb3VudChkYXRhc2V0cyk7XG4gICAgfVxuICB9XG5cbiAgX2Jsb2JUb0ZpbGUodGhlQmxvYiwgZmlsZU5hbWUpIHtcbiAgICAvLyBBIEJsb2IoKSBpcyBhbG1vc3QgYSBGaWxlKCkgLSBpdCdzIGp1c3QgbWlzc2luZyB0aGUgdHdvIHByb3BlcnRpZXMgYmVsb3cgd2hpY2ggd2Ugd2lsbCBhZGRcbiAgICAvLyBjb25zb2xlLmxvZyh0aGVCbG9iKTtcbiAgICB0aGVCbG9iLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoZUJsb2IubmFtZSA9IGZpbGVOYW1lO1xuICAgIHJldHVybiB0aGVCbG9iO1xuICB9XG4gIF9sb2FkRGF0YShyZXNwb25zZSwgZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgX2Rvd25sb2FkRGF0YXNldCA9IGRhdGFzZXRzID0+IHtcbiAgICB0aGlzLnByb3BzLmRpc3BhdGNoKGxpc3REYXRhc2V0RG93bmxvYWQoZGF0YXNldHMpKTtcbiAgfTtcblxuICBfZmlsZXMgPSAoKSA9PiB7XG4gICAgdmFyIGZpbGVzID0gW107XG4gICAgY29uc3QgZGF0YXNldElkID0gdGhpcy5zdGF0ZTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0SWQpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGFzZXRJZCkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkYXRhc2V0cyA9IHRoaXMucHJvcHMuZGF0YXNldC5kYXRhc2V0cztcbiAgICAgICAgZGF0YXNldHMubWFwKGRhdGFzZXQgPT4ge1xuICAgICAgICAgIGlmIChkYXRhc2V0LmlkID09PSB0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGFzZXQpO1xuICAgICAgICAgICAgZmlsZXMucHVzaChkYXRhc2V0KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGZpbGVzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kb3dubG9hZERhdGFzZXQoZGF0YXNldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkYXRhc2V0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX29uQ2xpY2sgPSAoKSA9PiB7XG4gICAgLy8gcmV0dXJuIHRoaXMuX2ZpbGVzKCk7XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5wcm9wcy5kYXRhc2V0LmRhdGFzZXRzLm1hcChkYXRhc2V0ID0+IHtcbiAgICAgIGlmIChkYXRhc2V0LmlkID09PSB0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YXNldChkYXRhc2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfTtcblxuICBfb25DaGFuZ2UgPSAoe3RhcmdldDoge2ZpbGVzfX0pID0+IHtcbiAgICBmaWxlcyA9IHRoaXMucHJvcHMuZGF0YXNldC5saXN0RGF0YXNldHM7XG4gICAgaWYgKCFmaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25VcGxvYWQoZmlsZXMpO1xuICB9O1xuXG4gIGhhbmRsZUNoYW5nZSA9IG5hbWUgPT4gZXZlbnQgPT4ge1xuICAgIHRoaXMucHJvcHMuZGF0YXNldC5kYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0LmlkKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YXNldC5pZC50b1N0cmluZygpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7W2lkXTogZmFsc2V9KTtcbiAgICB9KTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnNldFN0YXRlKHtbbmFtZV06IGV2ZW50LnRhcmdldC5jaGVja2VkfSk7XG4gIH07XG5cbiAgaGFuZGxlUmFkaW9DaGFuZ2UgPSBldmVudCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7c2VsZWN0ZWRWYWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlfSk7XG4gIH07XG5cbiAgX3JlbmRlck5vRGF0YXNldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxwPnlvdSBoYXZlIG5vIGZpbGUocykgaW4gRGF0YWh1YiA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgX2ZpbHRlckRhdGFzZXRzID0gZGF0YXNldEZpbHRlciA9PiB7XG4gICAgY29uc3Qge2RhdGFzZXRzfSA9IHRoaXMucHJvcHMuZGF0YXNldDtcbiAgICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gZGF0YXNldHMuZmlsdGVyKGRhdGFzZXQgPT4ge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBkYXRhc2V0Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBkYXRhc2V0TmFtZS5pbmRleE9mKGRhdGFzZXRGaWx0ZXIudG9Mb3dlckNhc2UoKSkgIT09IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe2ZpbHRlcmVkRGF0YXNldHN9KTtcbiAgfTtcblxuICBfaGFuZGxlRmlsdGVyQ2hhbmdlID0gZSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhc2V0RmlsdGVyOiBlLnRhcmdldC52YWx1ZVxuICAgIH0pO1xuICAgIHRoaXMuX2ZpbHRlckRhdGFzZXRzKGUudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2NsYXNzZXN9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQge2RhdGFzZXRzfSA9IHRoaXMucHJvcHMuZGF0YXNldDtcbiAgICBjb25zdCB7XG4gICAgICBjdXJyZW50UGFnZSxcbiAgICAgIGRhdGFzZXRzUGVyUGFnZSxcbiAgICAgIGZpbHRlcmVkRGF0YXNldHMsXG4gICAgICBkYXRhc2V0RmlsdGVyXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaW5kZXhPZkxhc3REYXRhc2V0ID0gY3VycmVudFBhZ2UgKiBkYXRhc2V0c1BlclBhZ2U7XG4gICAgY29uc3QgaW5kZXhPZkZpcnN0RGF0YXNldCA9IGluZGV4T2ZMYXN0RGF0YXNldCAtIGRhdGFzZXRzUGVyUGFnZTtcblxuICAgIGxldCBjdXJyZW50RGF0YXNldHMgPSBbXTtcblxuICAgIGlmIChkYXRhc2V0RmlsdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY3VycmVudERhdGFzZXRzID0gZGF0YXNldHMuc2xpY2UoaW5kZXhPZkZpcnN0RGF0YXNldCwgaW5kZXhPZkxhc3REYXRhc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudERhdGFzZXRzID0gZmlsdGVyZWREYXRhc2V0cy5zbGljZShcbiAgICAgICAgaW5kZXhPZkZpcnN0RGF0YXNldCxcbiAgICAgICAgaW5kZXhPZkxhc3REYXRhc2V0XG4gICAgICApO1xuICAgICAgZGF0YXNldHMgPSBmaWx0ZXJlZERhdGFzZXRzO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGN1cnJlbnREYXRhc2V0cyA9IGRhdGFzZXRzLnNsaWNlKFxuICAgIC8vICAgaW5kZXhPZkZpcnN0RGF0YXNldCxcbiAgICAvLyAgIGluZGV4T2ZMYXN0RGF0YXNldFxuICAgIC8vICk7XG5cbiAgICBjb25zdCByZW5kZXJEYXRhc2V0cyA9IGN1cnJlbnREYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICBjb25zdCBJRCA9IGRhdGFzZXQuaWQudG9TdHJpbmcoKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3RhdGVbSURdKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxHcmlkXG4gICAgICAgICAga2V5PXtkYXRhc2V0LmlkfVxuICAgICAgICAgIGl0ZW1cbiAgICAgICAgICB4cz17MTJ9XG4gICAgICAgICAgc3R5bGU9e3twYWRkaW5nQm90dG9tOiAnMHB4Jywgd2lkdGg6ICcxMDAlJ319XG4gICAgICAgID5cbiAgICAgICAgICA8UGFwZXIgY2xhc3NOYW1lPXtjbGFzc2VzLnBhcGVyfT5cbiAgICAgICAgICAgIDxHcmlkIGNvbnRhaW5lciB3cmFwPVwibm93cmFwXCIgc3BhY2luZz17MTZ9IHN0eWxlPXt7bWFyZ2luOiAnYXV0byd9fT5cbiAgICAgICAgICAgICAgPEdyaWQgaXRlbSBzdHlsZT17e3BhZGRpbmc6ICcwcHgnfX0+XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUgPT09IElEfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlUmFkaW9DaGFuZ2V9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5pZH1cbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJyYWRpby1idXR0b24tZGVtb1wiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7LyogPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAvLyBzdHlsZT17eyBjaGVja2VkOiBbdGhpcy5zdGF0ZVtJRF1dIH19XG4gICAgICAgICAgICAgICAgICAvLyBjaGVja2VkSWNvbj17dGhpcy5zdGF0ZVtJRF19XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLnN0YXRlW0lEXX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUNoYW5nZShJRCl9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5uYW1lfVxuICAgICAgICAgICAgICAgIC8+ICovfVxuICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgIDxHcmlkIGl0ZW0geHMgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319PlxuICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICAgICAge2RhdGFzZXQubmFtZX0te2RhdGFzZXQuYXZhaWxhYmlsaXR5U3RhdHVzfVxuICAgICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDwvUGFwZXI+XG4gICAgICAgIDwvR3JpZD5cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBfcmVuZGVyTm9EYXRhc2V0TWVzc2FnZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHAgc3R5bGU9e3tmb250U2l6ZTogJzE0cHgnLCBtYXJnaW5Cb3R0b206ICcxMnB4JywgY29sb3I6ICdibGFjayd9fT5cbiAgICAgICAgICAgIFlvdSBoYXZlIG5vIGZpbGVzIGluIERhdGFodWJ7JyAnfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH07XG4gICAgLy8gY29uc3QgbG9hZGluZyA9IFwiT1BFTlwiO1xuICAgIGNvbnN0IF9yZW5kZXJCdXR0b24gPSAoKSA9PiB7XG4gICAgICBjb25zdCB7ZGF0YXNldHN9ID0gdGhpcy5wcm9wcy5kYXRhc2V0O1xuICAgICAgLy8gY29uc3QgbG9hZGluZ0RhdGFzZXQgPSB0cnVlO1xuICAgICAgaWYgKGRhdGFzZXRzLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy51aS5wcm9ncmVzc0FkZERhdGFTdGF0dXMgPT09ICdPUEVOJykge1xuICAgICAgICAgIC8vIGlmIChsb2FkaW5nID09PSBcIk9QRU5cIikge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luOiAnYXV0byd9fT5cbiAgICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9IFxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIC8vIGRpc2FibGVkPXtsb2FkaW5nRGF0YXNldH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cbiAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5fb25DbGlja31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQWRkIERhdGFcbiAgICAgICAgICAgICAgey8qIHtsb2FkaW5nRGF0YXNldCAmJiAoXG4gICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzXG4gICAgICAgICAgICAgICAgc2l6ZT17NjB9XG4gICAgICAgICAgICAgICAgdGhpY2tuZXNzPXszfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy50YWJsZVByb2dyZXNzfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX0gKi99XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICApO1xuICAgICAgICBcbiAgICAgIH0gXG4gICAgICAgIHJldHVybiBfcmVuZGVyTm9EYXRhc2V0TWVzc2FnZSgpO1xuICAgICAgXG4gICAgfTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzZXMucm9vdH0gc3R5bGU9e3tkaXNwbGF5OiAnZ3JpZCd9fT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luTGVmdDogJzEycHgnfX0+XG4gICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cImZpbHRlclwiPlNlYXJjaDogPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcFN0eWxlOiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICBib3JkZXJMZWZ0U3R5bGU6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0U3R5bGU6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbVN0eWxlOiAnc29saWQnLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbVdpZHRoOiAndGhpbicsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6ICdsaWdodGdyYXknXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgaWQ9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhc2V0RmlsdGVyfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5faGFuZGxlRmlsdGVyQ2hhbmdlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8R3JpZFxuICAgICAgICAgICAgY29udGFpbmVyXG4gICAgICAgICAgICBzcGFjaW5nPXsyNH1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICBtYXJnaW46ICdhdXRvJyxcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiAnMjQwcHgnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtyZW5kZXJEYXRhc2V0c31cbiAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICAgIG90aGVyUGFnZUNvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319XG4gICAgICAgICAgICBhY3RpdmVQYWdlPXt0aGlzLnN0YXRlLmN1cnJlbnRQYWdlfVxuICAgICAgICAgICAgbGltaXQ9e3RoaXMuc3RhdGUuZGF0YXNldHNQZXJQYWdlfVxuICAgICAgICAgICAgb2Zmc2V0PXt0aGlzLnN0YXRlLm9mZnNldH1cbiAgICAgICAgICAgIHRvdGFsPXtkYXRhc2V0cy5sZW5ndGh9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSwgb2Zmc2V0LCBwYWdlKSA9PiB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2Uob2Zmc2V0LCBwYWdlKX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtfcmVuZGVyQnV0dG9uKCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICApO1xuICB9XG59XG5cbkxpc3RVcGxvYWQucHJvcFR5cGVzID0ge1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IHN0YXRlID0+IHN0YXRlO1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkod2l0aFN0eWxlcyhzdHlsZXMpKExpc3RVcGxvYWQpKTtcblxuLy8gPFdyYXBwZXI+XG4vLyAgICAgICAgIDxpbnB1dFxuLy8gICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbi8vICAgICAgICAgICByZWY9e3JlZiA9PiB7dGhpcy5fZmlsZUlucHV0ID0gcmVmfX1cbi8vICAgICAgICAgICBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319XG4vLyAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX29uQ2hhbmdlfVxuLy8gICAgICAgICAvPlxuLy8gICAgICAgICA8c3BhbiBvbkNsaWNrPXt0aGlzLl9vbkNsaWNrfT57dGhpcy5wcm9wcy5jaGlsZHJlbn08L3NwYW4+XG4vLyAgICAgICA8L1dyYXBwZXI+XG4iXX0=