kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
366 lines (310 loc) • 41.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.StyledLayerName = void 0;
exports["default"] = LayerHoverInfoFactory;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
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 _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _styledComponents2 = require("../common/styled-components");
var _icons = require("../common/icons");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _dataUtils = require("../../utils/data-utils");
var _axios = _interopRequireDefault(require("axios"));
var _defaultSettings = require("../../constants/default-settings");
var _templateObject;
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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
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; } }
var StyledLayerName = exports.StyledLayerName = (0, _styledComponents["default"])(_styledComponents2.CenterFlexbox)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 12px;\n letter-spacing: 0.43px;\n text-transform: capitalize;\n padding-left: 14px;\n margin-top: 12px;\n\n svg {\n margin-right: 4px;\n }\n"])), function (props) {
return props.theme.textColorHl;
});
var Row = function Row(_ref) {
var name = _ref.name,
value = _ref.value,
url = _ref.url;
// Set 'url' to 'value' if it looks like a url
if (!url && value && typeof value === 'string' && value.match(/^http/)) {
url = value;
}
var asImg = /<img>/.test(name);
return (/*#__PURE__*/_react["default"].createElement("tr", {
className: "row",
key: name
}, /*#__PURE__*/_react["default"].createElement("td", {
className: "row__name"
}, name), /*#__PURE__*/_react["default"].createElement("td", {
className: "row__value"
}, asImg ? /*#__PURE__*/_react["default"].createElement("img", {
src: value
}) : url ? /*#__PURE__*/_react["default"].createElement("a", {
target: "_blank",
rel: "noopener noreferrer",
href: url
}, value) : value))
);
};
var EntryInfo = function EntryInfo(_ref2) {
var _ref2$fieldsToShow = _ref2.fieldsToShow,
fieldsToShow = _ref2$fieldsToShow === void 0 ? [] : _ref2$fieldsToShow,
fields = _ref2.fields,
data = _ref2.data;
// const {properties} = data;
// console.log(
// 'properties,fieldsTOshow , fields and data inside EntryInfo ',
// properties,
// fieldsToShow,
// fields,
// data
// );
return (/*#__PURE__*/_react["default"].createElement("tbody", null, fieldsToShow.map(function (name) {
return (/*#__PURE__*/_react["default"].createElement(EntryInfoRow, {
key: name,
name: name,
fields: fields,
data: Array.isArray(data) ? data : data.properties[name]
})
);
}))
);
};
var EntryInfoRow = function EntryInfoRow(_ref3) {
var name = _ref3.name,
fields = _ref3.fields,
data = _ref3.data;
var field = fields.find(function (f) {
return f.name === name;
});
if (!field) {
return null;
}
if (Array.isArray(data)) {
var valueIdx = field.tableFieldIndex - 1;
var displayValue = (0, _dataUtils.parseFieldValue)(data[valueIdx], field.type);
return (/*#__PURE__*/_react["default"].createElement(Row, {
name: name,
value: displayValue
})
);
} else {
var _displayValue = data;
return (/*#__PURE__*/_react["default"].createElement(Row, {
name: name,
value: _displayValue
})
);
}
};
var CellInfo = function CellInfo(_ref4) {
var data = _ref4.data,
layer = _ref4.layer;
var _layer$config = layer.config,
colorField = _layer$config.colorField,
sizeField = _layer$config.sizeField,
heightField = _layer$config.heightField,
visConfig = _layer$config.visConfig;
var properties = data.properties;
var colorAggregation = visConfig.colorAggregation; // console.log(
// 'properties, data, colorField and sizeField inside cellInfo',
// data,
// properties,
// colorField,
// sizeField
// );
return (/*#__PURE__*/_react["default"].createElement("tbody", null, properties && properties.name ? /*#__PURE__*/_react["default"].createElement(Row, {
name: 'name',
key: "name",
value: properties.name
}) : null, /*#__PURE__*/_react["default"].createElement(Row, {
name: 'total points',
key: "count",
value: properties ? properties.totalCount : data.points && data.points.length
}), colorField && layer.visualChannels.color ? /*#__PURE__*/_react["default"].createElement(Row, {
name: layer.getVisualChannelDescription('color').measure,
key: "color",
value: properties ? properties.aggregatedData : data.colorValue || 'N/A'
}) : null, sizeField && layer.visualChannels.size ? /*#__PURE__*/_react["default"].createElement(Row, {
name: layer.getVisualChannelDescription('size').measure,
key: "size",
value: properties ? properties.heightAggregatedData : data.elevationValue || 'N/A'
}) : null, heightField && layer.visualChannels.height ? /*#__PURE__*/_react["default"].createElement(Row, {
name: layer.getVisualChannelDescription('height').measure,
key: "size",
value: properties ? properties.heightAggregatedData : data.elevationValue || 'N/A'
}) : null)
);
};
function LayerHoverInfoFactory() {
var LayerHoverInfo = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(LayerHoverInfo, _Component);
var _super = _createSuper(LayerHoverInfo);
function LayerHoverInfo(props) {
var _this;
(0, _classCallCheck2["default"])(this, LayerHoverInfo);
_this = _super.call(this, props);
_this.state = {
fieldsToShow: [],
fields: {},
data: {}
};
return _this;
} // state = {
// fieldsToShow: [],
// fields: {},
// data: {}
// };
(0, _createClass2["default"])(LayerHoverInfo, [{
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
var _this2 = this;
var _this$props = this.props,
data = _this$props.data,
layer = _this$props.layer,
fields = _this$props.fields,
fieldsToShow = _this$props.fieldsToShow,
datasets = _this$props.datasets,
auth = _this$props.auth;
if (layer.type === 'backendPoint' || layer.type === 'backendGeojson' || layer.type === 'geojson') {
if (nextProps.data.docId !== data.docId) {
var uid = auth.uid;
var _datasets$layer$confi2 = datasets[layer.config.dataId],
indexName = _datasets$layer$confi2.indexName,
_fields = _datasets$layer$confi2.fields;
var layerHoverApiData = {
docId: nextProps.data.docId,
fieldsToShow: JSON.stringify(fieldsToShow),
userId: uid,
indexName: indexName
};
var config = {
headers: {
'Content-Type': 'application/json'
}
};
_axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqutilities/hover/v1.0/fetch"), layerHoverApiData, config).then(function (response) {
return _this2.setState({
fieldsToShow: fieldsToShow,
fields: _fields,
data: response.data.data
});
})["catch"](function (e) {
return console.log('error in hoverAPI', e);
});
}
}
}
}, {
key: "componentDidMount",
value: function componentDidMount() {
var _this3 = this;
var _this$props2 = this.props,
data = _this$props2.data,
layer = _this$props2.layer,
fields = _this$props2.fields,
fieldsToShow = _this$props2.fieldsToShow,
datasets = _this$props2.datasets,
auth = _this$props2.auth;
if (layer.type === 'backendPoint' || layer.type === 'backendGeojson' || layer.type === 'geojson') {
var uid = auth.uid;
var _datasets$layer$confi4 = datasets[layer.config.dataId],
indexName = _datasets$layer$confi4.indexName,
_fields2 = _datasets$layer$confi4.fields;
var layerHoverApiData = {
docId: data.docId,
fieldsToShow: JSON.stringify(fieldsToShow),
userId: uid,
indexName: indexName
};
var config = {
headers: {
'Content-Type': 'application/json'
}
};
_axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqutilities/hover/v1.0/fetch"), layerHoverApiData, config).then(function (response) {
return _this3.setState({
fieldsToShow: fieldsToShow,
fields: _fields2,
data: response.data.data
});
})["catch"](function (e) {
return console.log('error inside componentDidMount', e);
});
}
} // componentDidMount() {
// this.setState({...this.state, ...this.props});
// }
}, {
key: "render",
value: function render() {
var _this$props3 = this.props,
data = _this$props3.data,
layer = _this$props3.layer,
fields = _this$props3.fields,
fieldsToShow = _this$props3.fieldsToShow,
datasets = _this$props3.datasets,
auth = _this$props3.auth;
if (!data || !layer || !fieldsToShow.length) {
return null;
}
var prop = _objectSpread(_objectSpread({}, this.state), this.props);
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(StyledLayerName, {
className: "map-popover__layer-name"
}, /*#__PURE__*/_react["default"].createElement(_icons.Layers, {
height: "12px"
}), layer.config.label), /*#__PURE__*/_react["default"].createElement("table", {
className: "map-popover__table"
}, layer.isAggregated && !data.docId ? /*#__PURE__*/_react["default"].createElement(CellInfo, this.props) : /*#__PURE__*/_react["default"].createElement(EntryInfo, prop)))
);
}
}]);
return LayerHoverInfo;
}(_react.Component);
(0, _defineProperty2["default"])(LayerHoverInfo, "propTypes", {
fields: _propTypes["default"].arrayOf(_propTypes["default"].any),
fieldsToShow: _propTypes["default"].arrayOf(_propTypes["default"].any),
layer: _propTypes["default"].object,
data: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].any), _propTypes["default"].object])
});
return LayerHoverInfo;
}
var LayerHoverInfoFactorys = function LayerHoverInfoFactorys() {
var LayerHoverInfo = function LayerHoverInfo(props) {
var data = props.data,
layer = props.layer,
fields = props.fields,
fieldsToShow = props.fieldsToShow,
datasets = props.datasets,
auth = props.auth;
if (!data || !layer || !fieldsToShow.length) {
return null;
}
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(StyledLayerName, {
className: "map-popover__layer-name"
}, /*#__PURE__*/_react["default"].createElement(_icons.Layers, {
height: "12px"
}), props.layer.config.label), /*#__PURE__*/_react["default"].createElement("table", {
className: "map-popover__table"
}, props.layer.isAggregated ? /*#__PURE__*/_react["default"].createElement(CellInfo, props) : /*#__PURE__*/_react["default"].createElement(EntryInfo, props)))
); // }
};
LayerHoverInfo.propTypes = {
fields: _propTypes["default"].arrayOf(_propTypes["default"].any),
fieldsToShow: _propTypes["default"].arrayOf(_propTypes["default"].any),
layer: _propTypes["default"].object,
data: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].any), _propTypes["default"].object])
};
return LayerHoverInfo;
}; // export default LayerHoverInfoFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9sYXllci1ob3Zlci1pbmZvLmpzIl0sIm5hbWVzIjpbIlN0eWxlZExheWVyTmFtZSIsIkNlbnRlckZsZXhib3giLCJwcm9wcyIsInRoZW1lIiwidGV4dENvbG9ySGwiLCJSb3ciLCJuYW1lIiwidmFsdWUiLCJ1cmwiLCJtYXRjaCIsImFzSW1nIiwidGVzdCIsIkVudHJ5SW5mbyIsImZpZWxkc1RvU2hvdyIsImZpZWxkcyIsImRhdGEiLCJtYXAiLCJBcnJheSIsImlzQXJyYXkiLCJwcm9wZXJ0aWVzIiwiRW50cnlJbmZvUm93IiwiZmllbGQiLCJmaW5kIiwiZiIsInZhbHVlSWR4IiwidGFibGVGaWVsZEluZGV4IiwiZGlzcGxheVZhbHVlIiwidHlwZSIsIkNlbGxJbmZvIiwibGF5ZXIiLCJjb25maWciLCJjb2xvckZpZWxkIiwic2l6ZUZpZWxkIiwiaGVpZ2h0RmllbGQiLCJ2aXNDb25maWciLCJjb2xvckFnZ3JlZ2F0aW9uIiwidG90YWxDb3VudCIsInBvaW50cyIsImxlbmd0aCIsInZpc3VhbENoYW5uZWxzIiwiY29sb3IiLCJnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24iLCJtZWFzdXJlIiwiYWdncmVnYXRlZERhdGEiLCJjb2xvclZhbHVlIiwic2l6ZSIsImhlaWdodEFnZ3JlZ2F0ZWREYXRhIiwiZWxldmF0aW9uVmFsdWUiLCJoZWlnaHQiLCJMYXllckhvdmVySW5mb0ZhY3RvcnkiLCJMYXllckhvdmVySW5mbyIsInN0YXRlIiwibmV4dFByb3BzIiwiZGF0YXNldHMiLCJhdXRoIiwiZG9jSWQiLCJ1aWQiLCJkYXRhSWQiLCJpbmRleE5hbWUiLCJsYXllckhvdmVyQXBpRGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1c2VySWQiLCJoZWFkZXJzIiwiYXhpb3MiLCJwb3N0IiwiT05fUFJFTUVTSVNfVVJMIiwidGhlbiIsInJlc3BvbnNlIiwic2V0U3RhdGUiLCJlIiwiY29uc29sZSIsImxvZyIsInByb3AiLCJsYWJlbCIsImlzQWdncmVnYXRlZCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJhbnkiLCJvYmplY3QiLCJvbmVPZlR5cGUiLCJMYXllckhvdmVySW5mb0ZhY3RvcnlzIiwicHJvcFR5cGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQUVPLElBQU1BLGVBQWUsNkJBQUcsa0NBQU9DLGdDQUFQLENBQUgsMlFBQ2pCLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsV0FBaEI7QUFBQSxDQURZLENBQXJCOztBQWFQLElBQU1DLEdBQUcsR0FBRyxTQUFOQSxHQUFNLE9BQXdCO0FBQUEsTUFBdEJDLElBQXNCLFFBQXRCQSxJQUFzQjtBQUFBLE1BQWhCQyxLQUFnQixRQUFoQkEsS0FBZ0I7QUFBQSxNQUFUQyxHQUFTLFFBQVRBLEdBQVM7O0FBQ2xDO0FBQ0EsTUFBSSxDQUFDQSxHQUFELElBQVFELEtBQVIsSUFBaUIsT0FBT0EsS0FBUCxLQUFpQixRQUFsQyxJQUE4Q0EsS0FBSyxDQUFDRSxLQUFOLENBQVksT0FBWixDQUFsRCxFQUF3RTtBQUN0RUQsSUFBQUEsR0FBRyxHQUFHRCxLQUFOO0FBQ0Q7O0FBRUQsTUFBTUcsS0FBSyxHQUFHLFFBQVFDLElBQVIsQ0FBYUwsSUFBYixDQUFkO0FBQ0EsdUJBQ0U7QUFBSSxNQUFBLFNBQVMsRUFBQyxLQUFkO0FBQW9CLE1BQUEsR0FBRyxFQUFFQTtBQUF6QixvQkFDRTtBQUFJLE1BQUEsU0FBUyxFQUFDO0FBQWQsT0FBMkJBLElBQTNCLENBREYsZUFFRTtBQUFJLE1BQUEsU0FBUyxFQUFDO0FBQWQsT0FDR0ksS0FBSyxnQkFDSjtBQUFLLE1BQUEsR0FBRyxFQUFFSDtBQUFWLE1BREksR0FFRkMsR0FBRyxnQkFDTDtBQUFHLE1BQUEsTUFBTSxFQUFDLFFBQVY7QUFB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Q0FBQyxRQUFELEVBQWN6RSxLQUFkLENBREQsZ0JBR0MsZ0NBQUMsU0FBRCxFQUFlQSxLQUFmLENBSkosQ0FMRjtBQURGLE1BUDhCLENBc0I5QjtBQUNELEdBdkJEOztBQXlCQWdELEVBQUFBLGNBQWMsQ0FBQ2lDLFNBQWYsR0FBMkI7QUFDekJyRSxJQUFBQSxNQUFNLEVBQUUrRCxzQkFBVUMsT0FBVixDQUFrQkQsc0JBQVVFLEdBQTVCLENBRGlCO0FBRXpCbEUsSUFBQUEsWUFBWSxFQUFFZ0Usc0JBQVVDLE9BQVYsQ0FBa0JELHNCQUFVRSxHQUE1QixDQUZXO0FBR3pCbEQsSUFBQUEsS0FBSyxFQUFFZ0Qsc0JBQVVHLE1BSFE7QUFJekJqRSxJQUFBQSxJQUFJLEVBQUU4RCxzQkFBVUksU0FBVixDQUFvQixDQUN4Qkosc0JBQVVDLE9BQVYsQ0FBa0JELHNCQUFVRSxHQUE1QixDQUR3QixFQUV4QkYsc0JBQVVHLE1BRmMsQ0FBcEI7QUFKbUIsR0FBM0I7QUFTQSxTQUFPOUIsY0FBUDtBQUNELENBcENELEMsQ0FzQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtDZW50ZXJGbGV4Ym94fSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge0xheWVyc30gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7cGFyc2VGaWVsZFZhbHVlfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQge09OX1BSRU1FU0lTX1VSTH0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5leHBvcnQgY29uc3QgU3R5bGVkTGF5ZXJOYW1lID0gc3R5bGVkKENlbnRlckZsZXhib3gpYFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuNDNweDtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gIHBhZGRpbmctbGVmdDogMTRweDtcbiAgbWFyZ2luLXRvcDogMTJweDtcblxuICBzdmcge1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICB9XG5gO1xuXG5jb25zdCBSb3cgPSAoe25hbWUsIHZhbHVlLCB1cmx9KSA9PiB7XG4gIC8vIFNldCAndXJsJyB0byAndmFsdWUnIGlmIGl0IGxvb2tzIGxpa2UgYSB1cmxcbiAgaWYgKCF1cmwgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5tYXRjaCgvXmh0dHAvKSkge1xuICAgIHVybCA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgYXNJbWcgPSAvPGltZz4vLnRlc3QobmFtZSk7XG4gIHJldHVybiAoXG4gICAgPHRyIGNsYXNzTmFtZT1cInJvd1wiIGtleT17bmFtZX0+XG4gICAgICA8dGQgY2xhc3NOYW1lPVwicm93X19uYW1lXCI+e25hbWV9PC90ZD5cbiAgICAgIDx0ZCBjbGFzc05hbWU9XCJyb3dfX3ZhbHVlXCI+XG4gICAgICAgIHthc0ltZyA/IChcbiAgICAgICAgICA8aW1nIHNyYz17dmFsdWV9IC8+XG4gICAgICAgICkgOiB1cmwgPyAoXG4gICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIGhyZWY9e3VybH0+XG4gICAgICAgICAgICB7dmFsdWV9XG4gICAgICAgICAgPC9hPlxuICAgICAgICApIDogKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICl9XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICk7XG59O1xuXG5jb25zdCBFbnRyeUluZm8gPSAoe2ZpZWxkc1RvU2hvdyA9IFtdLCBmaWVsZHMsIGRhdGF9KSA9PiB7XG4gIC8vIGNvbnN0IHtwcm9wZXJ0aWVzfSA9IGRhdGE7XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgICdwcm9wZXJ0aWVzLGZpZWxkc1RPc2hvdyAsIGZpZWxkcyBhbmQgZGF0YSBpbnNpZGUgRW50cnlJbmZvICcsXG4gIC8vICAgcHJvcGVydGllcyxcbiAgLy8gICBmaWVsZHNUb1Nob3csXG4gIC8vICAgZmllbGRzLFxuICAvLyAgIGRhdGFcbiAgLy8gKTtcbiAgcmV0dXJuIChcbiAgICA8dGJvZHk+XG4gICAgICB7ZmllbGRzVG9TaG93Lm1hcChuYW1lID0+IChcbiAgICAgICAgPEVudHJ5SW5mb1Jvd1xuICAgICAgICAgIGtleT17bmFtZX1cbiAgICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICAgIGZpZWxkcz17ZmllbGRzfVxuICAgICAgICAgIGRhdGE9e0FycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogZGF0YS5wcm9wZXJ0aWVzW25hbWVdfVxuICAgICAgICAvPlxuICAgICAgKSl9XG4gICAgPC90Ym9keT5cbiAgKTtcbn07XG5cbmNvbnN0IEVudHJ5SW5mb1JvdyA9ICh7bmFtZSwgZmllbGRzLCBkYXRhfSkgPT4ge1xuICBjb25zdCBmaWVsZCA9IGZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgaWYgKCFmaWVsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgY29uc3QgdmFsdWVJZHggPSBmaWVsZC50YWJsZUZpZWxkSW5kZXggLSAxO1xuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHBhcnNlRmllbGRWYWx1ZShkYXRhW3ZhbHVlSWR4XSwgZmllbGQudHlwZSk7XG4gICAgcmV0dXJuIDxSb3cgbmFtZT17bmFtZX0gdmFsdWU9e2Rpc3BsYXlWYWx1ZX0gLz47XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGlzcGxheVZhbHVlID0gZGF0YTtcblxuICAgIHJldHVybiA8Um93IG5hbWU9e25hbWV9IHZhbHVlPXtkaXNwbGF5VmFsdWV9IC8+O1xuICB9XG59O1xuXG5jb25zdCBDZWxsSW5mbyA9ICh7ZGF0YSwgbGF5ZXJ9KSA9PiB7XG4gIGNvbnN0IHtjb2xvckZpZWxkLCBzaXplRmllbGQsIGhlaWdodEZpZWxkLCB2aXNDb25maWd9ID0gbGF5ZXIuY29uZmlnO1xuICBjb25zdCB7cHJvcGVydGllc30gPSBkYXRhO1xuICBjb25zdCB7Y29sb3JBZ2dyZWdhdGlvbn0gPSB2aXNDb25maWc7XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgICdwcm9wZXJ0aWVzLCBkYXRhLCBjb2xvckZpZWxkIGFuZCBzaXplRmllbGQgaW5zaWRlIGNlbGxJbmZvJyxcbiAgLy8gICBkYXRhLFxuICAvLyAgIHByb3BlcnRpZXMsXG4gIC8vICAgY29sb3JGaWVsZCxcbiAgLy8gICBzaXplRmllbGRcbiAgLy8gKTtcblxuICByZXR1cm4gKFxuICAgIDx0Ym9keT5cbiAgICAgIHtwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMubmFtZSA/IChcbiAgICAgICAgPFJvdyBuYW1lPXsnbmFtZSd9IGtleT1cIm5hbWVcIiB2YWx1ZT17cHJvcGVydGllcy5uYW1lfSAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICA8Um93XG4gICAgICAgIG5hbWU9eyd0b3RhbCBwb2ludHMnfVxuICAgICAgICBrZXk9XCJjb3VudFwiXG4gICAgICAgIHZhbHVlPXtcbiAgICAgICAgICBwcm9wZXJ0aWVzID8gcHJvcGVydGllcy50b3RhbENvdW50IDogZGF0YS5wb2ludHMgJiYgZGF0YS5wb2ludHMubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIC8+XG4gICAgICB7Y29sb3JGaWVsZCAmJiBsYXllci52aXN1YWxDaGFubmVscy5jb2xvciA/IChcbiAgICAgICAgPFJvd1xuICAgICAgICAgIG5hbWU9e2xheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbignY29sb3InKS5tZWFzdXJlfVxuICAgICAgICAgIGtleT1cImNvbG9yXCJcbiAgICAgICAgICB2YWx1ZT17XG4gICAgICAgICAgICBwcm9wZXJ0aWVzID8gcHJvcGVydGllcy5hZ2dyZWdhdGVkRGF0YSA6IGRhdGEuY29sb3JWYWx1ZSB8fCAnTi9BJ1xuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAge3NpemVGaWVsZCAmJiBsYXllci52aXN1YWxDaGFubmVscy5zaXplID8gKFxuICAgICAgICA8Um93XG4gICAgICAgICAgbmFtZT17bGF5ZXIuZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uKCdzaXplJykubWVhc3VyZX1cbiAgICAgICAgICBrZXk9XCJzaXplXCJcbiAgICAgICAgICB2YWx1ZT17XG4gICAgICAgICAgICBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgID8gcHJvcGVydGllcy5oZWlnaHRBZ2dyZWdhdGVkRGF0YVxuICAgICAgICAgICAgICA6IGRhdGEuZWxldmF0aW9uVmFsdWUgfHwgJ04vQSdcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtoZWlnaHRGaWVsZCAmJiBsYXllci52aXN1YWxDaGFubmVscy5oZWlnaHQgPyAoXG4gICAgICAgIDxSb3dcbiAgICAgICAgICBuYW1lPXtsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oJ2hlaWdodCcpLm1lYXN1cmV9XG4gICAgICAgICAga2V5PVwic2l6ZVwiXG4gICAgICAgICAgdmFsdWU9e1xuICAgICAgICAgICAgcHJvcGVydGllc1xuICAgICAgICAgICAgICA/IHByb3BlcnRpZXMuaGVpZ2h0QWdncmVnYXRlZERhdGFcbiAgICAgICAgICAgICAgOiBkYXRhLmVsZXZhdGlvblZhbHVlIHx8ICdOL0EnXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgPC90Ym9keT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIExheWVySG92ZXJJbmZvRmFjdG9yeSgpIHtcbiAgY2xhc3MgTGF5ZXJIb3ZlckluZm8gZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBmaWVsZHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgZmllbGRzVG9TaG93OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSxcbiAgICAgIGxheWVyOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgZGF0YTogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgICBQcm9wVHlwZXMub2JqZWN0XG4gICAgICBdKVxuICAgIH07XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgIGZpZWxkc1RvU2hvdzogW10sXG4gICAgICAgIGZpZWxkczoge30sXG4gICAgICAgIGRhdGE6IHt9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHN0YXRlID0ge1xuICAgIC8vICAgZmllbGRzVG9TaG93OiBbXSxcbiAgICAvLyAgIGZpZWxkczoge30sXG4gICAgLy8gICBkYXRhOiB7fVxuICAgIC8vIH07XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgY29uc3Qge2RhdGEsIGxheWVyLCBmaWVsZHMsIGZpZWxkc1RvU2hvdywgZGF0YXNldHMsIGF1dGh9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKFxuICAgICAgICBsYXllci50eXBlID09PSAnYmFja2VuZFBvaW50JyB8fFxuICAgICAgICBsYXllci50eXBlID09PSAnYmFja2VuZEdlb2pzb24nIHx8XG4gICAgICAgIGxheWVyLnR5cGUgPT09ICdnZW9qc29uJ1xuICAgICAgKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcHMuZGF0YS5kb2NJZCAhPT0gZGF0YS5kb2NJZCkge1xuICAgICAgICAgIGNvbnN0IHt1aWR9ID0gYXV0aDtcbiAgICAgICAgICBjb25zdCB7aW5kZXhOYW1lLCBmaWVsZHN9ID0gZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gICAgICAgICAgY29uc3QgbGF5ZXJIb3ZlckFwaURhdGEgPSB7XG4gICAgICAgICAgICBkb2NJZDogbmV4dFByb3BzLmRhdGEuZG9jSWQsXG4gICAgICAgICAgICBmaWVsZHNUb1Nob3c6IEpTT04uc3RyaW5naWZ5KGZpZWxkc1RvU2hvdyksXG4gICAgICAgICAgICB1c2VySWQ6IHVpZCxcbiAgICAgICAgICAgIGluZGV4TmFtZVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBheGlvc1xuICAgICAgICAgICAgLnBvc3QoXG4gICAgICAgICAgICAgIGAke09OX1BSRU1FU0lTX1VSTH0vZ2VvaXF1dGlsaXRpZXMvaG92ZXIvdjEuMC9mZXRjaGAsXG4gICAgICAgICAgICAgIGxheWVySG92ZXJBcGlEYXRhLFxuICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UuZGF0YS5kYXRhXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmxvZygnZXJyb3IgaW4gaG92ZXJBUEknLCBlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGNvbnN0IHtkYXRhLCBsYXllciwgZmllbGRzLCBmaWVsZHNUb1Nob3csIGRhdGFzZXRzLCBhdXRofSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2JhY2tlbmRQb2ludCcgfHxcbiAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2JhY2tlbmRHZW9qc29uJyB8fFxuICAgICAgICBsYXllci50eXBlID09PSAnZ2VvanNvbidcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7dWlkfSA9IGF1dGg7XG4gICAgICAgIGNvbnN0IHtpbmRleE5hbWUsIGZpZWxkc30gPSBkYXRhc2V0c1tsYXllci5jb25maWcuZGF0YUlkXTtcbiAgICAgICAgY29uc3QgbGF5ZXJIb3ZlckFwaURhdGEgPSB7XG4gICAgICAgICAgZG9jSWQ6IGRhdGEuZG9jSWQsXG4gICAgICAgICAgZmllbGRzVG9TaG93OiBKU09OLnN0cmluZ2lmeShmaWVsZHNUb1Nob3cpLFxuICAgICAgICAgIHVzZXJJZDogdWlkLFxuICAgICAgICAgIGluZGV4TmFtZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXhpb3NcbiAgICAgICAgICAucG9zdChcbiAgICAgICAgICAgIGAke09OX1BSRU1FU0lTX1VSTH0vZ2VvaXF1dGlsaXRpZXMvaG92ZXIvdjEuMC9mZXRjaGAsXG4gICAgICAgICAgICBsYXllckhvdmVyQXBpRGF0YSxcbiAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PlxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZS5kYXRhLmRhdGFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUubG9nKCdlcnJvciBpbnNpZGUgY29tcG9uZW50RGlkTW91bnQnLCBlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgLy8gICB0aGlzLnNldFN0YXRlKHsuLi50aGlzLnN0YXRlLCAuLi50aGlzLnByb3BzfSk7XG4gICAgLy8gfVxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtkYXRhLCBsYXllciwgZmllbGRzLCBmaWVsZHNUb1Nob3csIGRhdGFzZXRzLCBhdXRofSA9IHRoaXMucHJvcHM7XG4gICAgICBpZiAoIWRhdGEgfHwgIWxheWVyIHx8ICFmaWVsZHNUb1Nob3cubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGV0IHByb3AgPSB7XG4gICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgIC4uLnRoaXMucHJvcHNcbiAgICAgIH07XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxTdHlsZWRMYXllck5hbWUgY2xhc3NOYW1lPVwibWFwLXBvcG92ZXJfX2xheWVyLW5hbWVcIj5cbiAgICAgICAgICAgIDxMYXllcnMgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICAgICAgICB7bGF5ZXIuY29uZmlnLmxhYmVsfVxuICAgICAgICAgIDwvU3R5bGVkTGF5ZXJOYW1lPlxuICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fdGFibGVcIj5cbiAgICAgICAgICAgIHtsYXllci5pc0FnZ3JlZ2F0ZWQgJiYgIWRhdGEuZG9jSWQgPyAoXG4gICAgICAgICAgICAgIDxDZWxsSW5mbyB7Li4udGhpcy5wcm9wc30gLz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxFbnRyeUluZm8gey4uLnByb3B9IC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIExheWVySG92ZXJJbmZvO1xufVxuXG5jb25zdCBMYXllckhvdmVySW5mb0ZhY3RvcnlzID0gKCkgPT4ge1xuICBjb25zdCBMYXllckhvdmVySW5mbyA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7ZGF0YSwgbGF5ZXIsIGZpZWxkcywgZmllbGRzVG9TaG93LCBkYXRhc2V0cywgYXV0aH0gPSBwcm9wcztcblxuICAgIGlmICghZGF0YSB8fCAhbGF5ZXIgfHwgIWZpZWxkc1RvU2hvdy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8U3R5bGVkTGF5ZXJOYW1lIGNsYXNzTmFtZT1cIm1hcC1wb3BvdmVyX19sYXllci1uYW1lXCI+XG4gICAgICAgICAgPExheWVycyBoZWlnaHQ9XCIxMnB4XCIgLz5cbiAgICAgICAgICB7cHJvcHMubGF5ZXIuY29uZmlnLmxhYmVsfVxuICAgICAgICA8L1N0eWxlZExheWVyTmFtZT5cbiAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cIm1hcC1wb3BvdmVyX190YWJsZVwiPlxuICAgICAgICAgIHtwcm9wcy5sYXllci5pc0FnZ3JlZ2F0ZWQgPyAoXG4gICAgICAgICAgICA8Q2VsbEluZm8gey4uLnByb3BzfSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8RW50cnlJbmZvIHsuLi5wcm9wc30gLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgICAvLyB9XG4gIH07XG5cbiAgTGF5ZXJIb3ZlckluZm8ucHJvcFR5cGVzID0ge1xuICAgIGZpZWxkczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgZmllbGRzVG9TaG93OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSxcbiAgICBsYXllcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkYXRhOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgUHJvcFR5cGVzLm9iamVjdFxuICAgIF0pXG4gIH07XG4gIHJldHVybiBMYXllckhvdmVySW5mbztcbn07XG5cbi8vIGV4cG9ydCBkZWZhdWx0IExheWVySG92ZXJJbmZvRmFjdG9yeTtcbiJdfQ==