kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
193 lines (192 loc) • 37.6 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ColumnModeConfigFactory = ColumnModeConfigFactory;
exports["default"] = void 0;
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 _checkbox = _interopRequireDefault(require("../../common/checkbox"));
var _panelHeaderAction = _interopRequireDefault(require("../panel-header-action"));
var _layerColumnConfig = _interopRequireDefault(require("./layer-column-config"));
var _localization = require("@kepler.gl/localization");
var _icons = require("../../common/icons");
var _templateObject, _templateObject2, _templateObject3; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function 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; }
var TopRow = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n"])));
var Separator = (0, _styledComponents["default"])(function (_ref) {
var children = _ref.children,
className = _ref.className;
return /*#__PURE__*/_react["default"].createElement("div", {
className: className
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "separator-line-cell"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "separator-line"
})), /*#__PURE__*/_react["default"].createElement("div", {
className: "separator-content"
}, children), /*#__PURE__*/_react["default"].createElement("div", {
className: "separator-line-cell"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "separator-line"
})));
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: row;\n & > * + * {\n margin-left: 10px;\n }\n & > .separator-line-cell {\n display: flex;\n flex-grow: 1;\n align-items: center;\n }\n & > .separator-content {\n color: ", ";\n }\n & > .separator-line-cell > .separator-line {\n display: flex;\n border-bottom: 1px solid ", ";\n width: 100%;\n line-height: 1px;\n height: 1px;\n }\n"])), function (props) {
return props.theme.labelColor;
}, function (props) {
return props.theme.labelColor;
});
var ConfigPanesContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n & > * + * {\n margin-top: 10px;\n }\n fieldset {\n border: 1px solid ", ";\n margin: 0;\n }\n legend {\n display: flex;\n label {\n color: ", ";\n }\n }\n"])), function (props) {
return props.theme.labelColor;
}, function (props) {
return props.theme.labelColor;
});
ColumnModeConfigFactory.deps = [_panelHeaderAction["default"]];
function ColumnModeConfigFactory(PanelHeaderAction) {
var ColumnModeConfig = function ColumnModeConfig(_ref2) {
var id = _ref2.id,
supportedColumnModes = _ref2.supportedColumnModes,
selectedColumnMode = _ref2.selectedColumnMode,
columns = _ref2.columns,
renderColumnConfig = _ref2.renderColumnConfig,
selectColumnMode = _ref2.selectColumnMode,
_ref2$getHelpHandler = _ref2.getHelpHandler,
getHelpHandler = _ref2$getHelpHandler === void 0 ? function () {
return null;
} : _ref2$getHelpHandler;
var columnModes = (0, _react.useMemo)(function () {
return supportedColumnModes ? supportedColumnModes.map(function (_ref3) {
var key = _ref3.key,
label = _ref3.label,
requiredColumns = _ref3.requiredColumns,
optionalColumns = _ref3.optionalColumns;
var allColumns = (requiredColumns || []).concat(optionalColumns || []).reduce(function (acc, k) {
acc[k] = columns[k];
return acc;
}, {});
return {
key: key,
label: label,
columns: allColumns
};
}) : Object.keys(columns).length > 0 ? [{
key: 'default',
label: '',
columns: columns
}] : [];
}, [supportedColumnModes, columns]);
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, columnModes.length > 0 ? /*#__PURE__*/_react["default"].createElement(TopRow, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: 'columns.title'
})), /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: "layer.required"
}))) : null, /*#__PURE__*/_react["default"].createElement(ConfigPanesContainer, null, columnModes.map(function (modeConfig, i) {
var columnMode = modeConfig.key,
label = modeConfig.label;
var isSelected = selectedColumnMode === columnMode || columnModes.length === 1;
var columnPanel = renderColumnConfig(modeConfig, isSelected);
var helpHandler = getHelpHandler(modeConfig);
var selectColumnModeHandler = function selectColumnModeHandler() {
return selectColumnMode(modeConfig);
};
return /*#__PURE__*/_react["default"].createElement(_react.Fragment, {
key: columnMode
}, i > 0 ? /*#__PURE__*/_react["default"].createElement(Separator, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: "layer.columnModesSeparator"
})) : null, columnModes.length > 1 ? /*#__PURE__*/_react["default"].createElement("div", {
className: "layer-column-mode-panel"
}, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledPanelHeader, {
className: "interaction-panel__header"
}, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelHeaderContent, {
className: "interaction-panel__header__content"
}, /*#__PURE__*/_react["default"].createElement(_checkbox["default"], {
type: "radio",
name: "layer-".concat(id, "-input-modes"),
checked: isSelected,
id: "".concat(id, "-input-column-").concat(columnMode),
label: label,
onChange: selectColumnModeHandler
})), helpHandler ? /*#__PURE__*/_react["default"].createElement("div", {
className: "interaction-panel__header__actions"
}, /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, {
id: "".concat(id, "-help-button"),
className: "layer__help-button",
tooltip: 'layerConfiguration.howTo',
onClick: helpHandler,
IconComponent: _icons.Help
})) : null), /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelContent, {
className: "interaction-panel__content"
}, columnPanel)) : columnPanel);
})));
};
return ColumnModeConfig;
}
LayerColumnModeConfigFactory.deps = [_layerColumnConfig["default"], ColumnModeConfigFactory];
function LayerColumnModeConfigFactory(LayerColumnConfig, ColumnModeConfig) {
var LayerColumnModeConfig = function LayerColumnModeConfig(_ref4) {
var id = _ref4.id,
layer = _ref4.layer,
supportedColumnModes = _ref4.supportedColumnModes,
layerConfig = _ref4.layerConfig,
fields = _ref4.fields,
fieldPairs = _ref4.fieldPairs,
openModal = _ref4.openModal,
_updateLayerConfig = _ref4.updateLayerConfig;
var columns = layerConfig.columns;
var selectColumnMode = (0, _react.useCallback)(function (_ref5) {
var columnMode = _ref5.key;
_updateLayerConfig({
columnMode: columnMode
});
}, [_updateLayerConfig]);
var renderColumnConfig = (0, _react.useCallback)(function (_ref6, isSelected) {
var columnMode = _ref6.key,
cols = _ref6.columns;
return /*#__PURE__*/_react["default"].createElement(LayerColumnConfig, {
columnPairs: layer.columnPairs,
columns: cols,
assignColumnPairs: layer.assignColumnPairs.bind(layer),
assignColumn: layer.assignColumn.bind(layer),
columnLabels: layer.columnLabels,
fields: fields,
fieldPairs: fieldPairs,
updateLayerConfig: function updateLayerConfig(config) {
return _updateLayerConfig(_objectSpread(_objectSpread({}, config), !isSelected && columnMode !== 'defaut' ? {
columnMode: columnMode
} : {}));
},
isActive: isSelected
});
}, [layer, _updateLayerConfig, fieldPairs, fields]);
var getHelpHandler = (0, _react.useCallback)(function (_ref7) {
var _layer$layerInfoModal;
var columnMode = _ref7.key;
var modal = (_layer$layerInfoModal = layer.layerInfoModal) === null || _layer$layerInfoModal === void 0 ? void 0 : _layer$layerInfoModal[columnMode];
if (modal) {
return function () {
return openModal(modal);
};
}
return null;
}, [layer, openModal]);
return /*#__PURE__*/_react["default"].createElement(ColumnModeConfig, {
id: id,
supportedColumnModes: supportedColumnModes,
selectedColumnMode: layerConfig.columnMode,
columns: columns,
selectColumnMode: selectColumnMode,
renderColumnConfig: renderColumnConfig,
getHelpHandler: getHelpHandler
});
};
return LayerColumnModeConfig;
}
var _default = exports["default"] = LayerColumnModeConfigFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfY2hlY2tib3giLCJfcGFuZWxIZWFkZXJBY3Rpb24iLCJfbGF5ZXJDb2x1bW5Db25maWciLCJfbG9jYWxpemF0aW9uIiwiX2ljb25zIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJUb3BSb3ciLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlNlcGFyYXRvciIsIl9yZWYiLCJjaGlsZHJlbiIsImNsYXNzTmFtZSIsImNyZWF0ZUVsZW1lbnQiLCJwcm9wcyIsInRoZW1lIiwibGFiZWxDb2xvciIsIkNvbmZpZ1BhbmVzQ29udGFpbmVyIiwiQ29sdW1uTW9kZUNvbmZpZ0ZhY3RvcnkiLCJkZXBzIiwiUGFuZWxIZWFkZXJBY3Rpb25GYWN0b3J5IiwiUGFuZWxIZWFkZXJBY3Rpb24iLCJDb2x1bW5Nb2RlQ29uZmlnIiwiX3JlZjIiLCJpZCIsInN1cHBvcnRlZENvbHVtbk1vZGVzIiwic2VsZWN0ZWRDb2x1bW5Nb2RlIiwiY29sdW1ucyIsInJlbmRlckNvbHVtbkNvbmZpZyIsInNlbGVjdENvbHVtbk1vZGUiLCJfcmVmMiRnZXRIZWxwSGFuZGxlciIsImdldEhlbHBIYW5kbGVyIiwiY29sdW1uTW9kZXMiLCJ1c2VNZW1vIiwibWFwIiwiX3JlZjMiLCJrZXkiLCJsYWJlbCIsInJlcXVpcmVkQ29sdW1ucyIsIm9wdGlvbmFsQ29sdW1ucyIsImFsbENvbHVtbnMiLCJjb25jYXQiLCJyZWR1Y2UiLCJhY2MiLCJrIiwiRnJhZ21lbnQiLCJQYW5lbExhYmVsIiwiRm9ybWF0dGVkTWVzc2FnZSIsIm1vZGVDb25maWciLCJjb2x1bW5Nb2RlIiwiaXNTZWxlY3RlZCIsImNvbHVtblBhbmVsIiwiaGVscEhhbmRsZXIiLCJzZWxlY3RDb2x1bW5Nb2RlSGFuZGxlciIsIlN0eWxlZFBhbmVsSGVhZGVyIiwiUGFuZWxIZWFkZXJDb250ZW50IiwidHlwZSIsIm5hbWUiLCJjaGVja2VkIiwib25DaGFuZ2UiLCJ0b29sdGlwIiwib25DbGljayIsIkljb25Db21wb25lbnQiLCJIZWxwIiwiUGFuZWxDb250ZW50IiwiTGF5ZXJDb2x1bW5Nb2RlQ29uZmlnRmFjdG9yeSIsIkxheWVyQ29sdW1uQ29uZmlnRmFjdG9yeSIsIkxheWVyQ29sdW1uQ29uZmlnIiwiTGF5ZXJDb2x1bW5Nb2RlQ29uZmlnIiwiX3JlZjQiLCJsYXllciIsImxheWVyQ29uZmlnIiwiZmllbGRzIiwiZmllbGRQYWlycyIsIm9wZW5Nb2RhbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidXNlQ2FsbGJhY2siLCJfcmVmNSIsIl9yZWY2IiwiY29scyIsImNvbHVtblBhaXJzIiwiYXNzaWduQ29sdW1uUGFpcnMiLCJiaW5kIiwiYXNzaWduQ29sdW1uIiwiY29sdW1uTGFiZWxzIiwiY29uZmlnIiwiaXNBY3RpdmUiLCJfcmVmNyIsIl9sYXllciRsYXllckluZm9Nb2RhbCIsIm1vZGFsIiwibGF5ZXJJbmZvTW9kYWwiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2lkZS1wYW5lbC9sYXllci1wYW5lbC9sYXllci1jb2x1bW4tbW9kZS1jb25maWcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0ZyYWdtZW50LCB1c2VDYWxsYmFjaywgdXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7XG4gIFBhbmVsSGVhZGVyQ29udGVudCxcbiAgUGFuZWxMYWJlbCxcbiAgU3R5bGVkUGFuZWxIZWFkZXIsXG4gIFBhbmVsQ29udGVudFxufSBmcm9tICcuLi8uLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IENoZWNrYm94IGZyb20gJy4uLy4uL2NvbW1vbi9jaGVja2JveCc7XG5pbXBvcnQge01pbmltYWxGaWVsZH0gZnJvbSAnLi4vLi4vY29tbW9uL2ZpZWxkLXNlbGVjdG9yJztcbmltcG9ydCBQYW5lbEhlYWRlckFjdGlvbkZhY3RvcnkgZnJvbSAnLi4vcGFuZWwtaGVhZGVyLWFjdGlvbic7XG5pbXBvcnQgTGF5ZXJDb2x1bW5Db25maWdGYWN0b3J5IGZyb20gJy4vbGF5ZXItY29sdW1uLWNvbmZpZyc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7TGF5ZXIsIExheWVySW5mb01vZGFsLCBMYXllckJhc2VDb25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7U3VwcG9ydGVkQ29sdW1uTW9kZSwgRmllbGRQYWlyLCBMYXllckNvbHVtbnN9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtCYXNlQ29tcG9uZW50UHJvcHN9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHtIZWxwfSBmcm9tICcuLi8uLi9jb21tb24vaWNvbnMnO1xuXG5jb25zdCBUb3BSb3cgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5gO1xuXG5jb25zdCBTZXBhcmF0b3IgPSBzdHlsZWQoKHtjaGlsZHJlbiwgY2xhc3NOYW1lfTogQmFzZUNvbXBvbmVudFByb3BzKSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgIDxkaXYgY2xhc3NOYW1lPVwic2VwYXJhdG9yLWxpbmUtY2VsbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXBhcmF0b3ItbGluZVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJzZXBhcmF0b3ItY29udGVudFwiPntjaGlsZHJlbn08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cInNlcGFyYXRvci1saW5lLWNlbGxcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VwYXJhdG9yLWxpbmVcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbikpYFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAmID4gKiArICoge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICB9XG4gICYgPiAuc2VwYXJhdG9yLWxpbmUtY2VsbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWdyb3c6IDE7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuICAmID4gLnNlcGFyYXRvci1jb250ZW50IHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5sYWJlbENvbG9yfTtcbiAgfVxuICAmID4gLnNlcGFyYXRvci1saW5lLWNlbGwgPiAuc2VwYXJhdG9yLWxpbmUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGFiZWxDb2xvcn07XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbGluZS1oZWlnaHQ6IDFweDtcbiAgICBoZWlnaHQ6IDFweDtcbiAgfVxuYDtcblxuY29uc3QgQ29uZmlnUGFuZXNDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAmID4gKiArICoge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gIH1cbiAgZmllbGRzZXQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGFiZWxDb2xvcn07XG4gICAgbWFyZ2luOiAwO1xuICB9XG4gIGxlZ2VuZCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBsYWJlbCB7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5sYWJlbENvbG9yfTtcbiAgICB9XG4gIH1cbmA7XG5cbmludGVyZmFjZSBGaWVsZE9wdGlvbiBleHRlbmRzIE1pbmltYWxGaWVsZCB7XG4gIGZpZWxkSWR4OiBudW1iZXI7XG59XG5leHBvcnQgdHlwZSBTdXBwb3J0ZWRDb2x1bW5Nb2RlQ29uZmlnID0ge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sdW1uczogTGF5ZXJDb2x1bW5zO1xufTtcbmV4cG9ydCB0eXBlIENvbHVtbk1vZGVDb25maWdQcm9wcyA9IHtcbiAgc3VwcG9ydGVkQ29sdW1uTW9kZXM6IFN1cHBvcnRlZENvbHVtbk1vZGVbXSB8IG51bGw7XG4gIHNlbGVjdGVkQ29sdW1uTW9kZT86IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgY29sdW1uczogTGF5ZXJDb2x1bW5zO1xuICByZW5kZXJDb2x1bW5Db25maWc6IChcbiAgICBtb2RlOiB7a2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IGNvbHVtbnM6IGFueX0sXG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW5cbiAgKSA9PiBKU1guRWxlbWVudDtcbiAgc2VsZWN0Q29sdW1uTW9kZTogKG1vZGU6IFN1cHBvcnRlZENvbHVtbk1vZGVDb25maWcpID0+IHZvaWQ7XG4gIGdldEhlbHBIYW5kbGVyPzogKG1vZGU6IFN1cHBvcnRlZENvbHVtbk1vZGVDb25maWcpID0+ICgoKSA9PiB2b2lkKSB8IG51bGw7XG59O1xuXG5Db2x1bW5Nb2RlQ29uZmlnRmFjdG9yeS5kZXBzID0gW1BhbmVsSGVhZGVyQWN0aW9uRmFjdG9yeV07XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW5Nb2RlQ29uZmlnRmFjdG9yeShcbiAgUGFuZWxIZWFkZXJBY3Rpb246IFJldHVyblR5cGU8dHlwZW9mIFBhbmVsSGVhZGVyQWN0aW9uRmFjdG9yeT5cbikge1xuICBjb25zdCBDb2x1bW5Nb2RlQ29uZmlnOiBSZWFjdC5GQzxDb2x1bW5Nb2RlQ29uZmlnUHJvcHM+ID0gKHtcbiAgICBpZCxcbiAgICBzdXBwb3J0ZWRDb2x1bW5Nb2RlcyxcbiAgICBzZWxlY3RlZENvbHVtbk1vZGUsXG4gICAgY29sdW1ucyxcbiAgICByZW5kZXJDb2x1bW5Db25maWcsXG4gICAgc2VsZWN0Q29sdW1uTW9kZSxcbiAgICBnZXRIZWxwSGFuZGxlciA9ICgpID0+IG51bGxcbiAgfTogQ29sdW1uTW9kZUNvbmZpZ1Byb3BzKSA9PiB7XG4gICAgY29uc3QgY29sdW1uTW9kZXMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT5cbiAgICAgICAgc3VwcG9ydGVkQ29sdW1uTW9kZXNcbiAgICAgICAgICA/IHN1cHBvcnRlZENvbHVtbk1vZGVzLm1hcCgoe2tleSwgbGFiZWwsIHJlcXVpcmVkQ29sdW1ucywgb3B0aW9uYWxDb2x1bW5zfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhbGxDb2x1bW5zID0gKHJlcXVpcmVkQ29sdW1ucyB8fCBbXSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KG9wdGlvbmFsQ29sdW1ucyB8fCBbXSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIGspID0+IHtcbiAgICAgICAgICAgICAgICAgIGFjY1trXSA9IGNvbHVtbnNba107XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtrZXksIGxhYmVsLCBjb2x1bW5zOiBhbGxDb2x1bW5zfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBPYmplY3Qua2V5cyhjb2x1bW5zKS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbe2tleTogJ2RlZmF1bHQnLCBsYWJlbDogJycsIGNvbHVtbnN9XVxuICAgICAgICAgIDogW10sXG4gICAgICBbc3VwcG9ydGVkQ29sdW1uTW9kZXMsIGNvbHVtbnNdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7Y29sdW1uTW9kZXMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICA8VG9wUm93PlxuICAgICAgICAgICAgPFBhbmVsTGFiZWw+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnY29sdW1ucy50aXRsZSd9IC8+XG4gICAgICAgICAgICA8L1BhbmVsTGFiZWw+XG4gICAgICAgICAgICA8UGFuZWxMYWJlbD5cbiAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9XCJsYXllci5yZXF1aXJlZFwiIC8+XG4gICAgICAgICAgICA8L1BhbmVsTGFiZWw+XG4gICAgICAgICAgPC9Ub3BSb3c+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICA8Q29uZmlnUGFuZXNDb250YWluZXI+XG4gICAgICAgICAge2NvbHVtbk1vZGVzLm1hcCgobW9kZUNvbmZpZywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2tleTogY29sdW1uTW9kZSwgbGFiZWx9ID0gbW9kZUNvbmZpZztcblxuICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkQ29sdW1uTW9kZSA9PT0gY29sdW1uTW9kZSB8fCBjb2x1bW5Nb2Rlcy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5QYW5lbCA9IHJlbmRlckNvbHVtbkNvbmZpZyhtb2RlQ29uZmlnLCBpc1NlbGVjdGVkKTtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBIYW5kbGVyID0gZ2V0SGVscEhhbmRsZXIobW9kZUNvbmZpZyk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RDb2x1bW5Nb2RlSGFuZGxlciA9ICgpID0+IHNlbGVjdENvbHVtbk1vZGUobW9kZUNvbmZpZyk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxGcmFnbWVudCBrZXk9e2NvbHVtbk1vZGV9PlxuICAgICAgICAgICAgICAgIHtpID4gMCA/IChcbiAgICAgICAgICAgICAgICAgIDxTZXBhcmF0b3I+XG4gICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPVwibGF5ZXIuY29sdW1uTW9kZXNTZXBhcmF0b3JcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9TZXBhcmF0b3I+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAge2NvbHVtbk1vZGVzLmxlbmd0aCA+IDEgPyAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxheWVyLWNvbHVtbi1tb2RlLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRQYW5lbEhlYWRlciBjbGFzc05hbWU9XCJpbnRlcmFjdGlvbi1wYW5lbF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFBhbmVsSGVhZGVyQ29udGVudCBjbGFzc05hbWU9XCJpbnRlcmFjdGlvbi1wYW5lbF9faGVhZGVyX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT17YGxheWVyLSR7aWR9LWlucHV0LW1vZGVzYH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNTZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e2Ake2lkfS1pbnB1dC1jb2x1bW4tJHtjb2x1bW5Nb2RlfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3NlbGVjdENvbHVtbk1vZGVIYW5kbGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1BhbmVsSGVhZGVyQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICB7aGVscEhhbmRsZXIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImludGVyYWN0aW9uLXBhbmVsX19oZWFkZXJfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFBhbmVsSGVhZGVyQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e2Ake2lkfS1oZWxwLWJ1dHRvbmB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibGF5ZXJfX2hlbHAtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPXsnbGF5ZXJDb25maWd1cmF0aW9uLmhvd1RvJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoZWxwSGFuZGxlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJY29uQ29tcG9uZW50PXtIZWxwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkUGFuZWxIZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxQYW5lbENvbnRlbnQgY2xhc3NOYW1lPVwiaW50ZXJhY3Rpb24tcGFuZWxfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7Y29sdW1uUGFuZWx9XG4gICAgICAgICAgICAgICAgICAgIDwvUGFuZWxDb250ZW50PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgIGNvbHVtblBhbmVsXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvQ29uZmlnUGFuZXNDb250YWluZXI+XG4gICAgICA8Lz5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBDb2x1bW5Nb2RlQ29uZmlnO1xufVxuXG5leHBvcnQgdHlwZSBMYXllckNvbHVtbk1vZGVDb25maWdQcm9wcyA9IHtcbiAgbGF5ZXI6IExheWVyO1xuICBsYXllckNvbmZpZzogTGF5ZXJCYXNlQ29uZmlnO1xuICBzdXBwb3J0ZWRDb2x1bW5Nb2RlczogU3VwcG9ydGVkQ29sdW1uTW9kZVtdIHwgbnVsbDtcbiAgaWQ6IHN0cmluZztcbiAgZmllbGRzOiBGaWVsZE9wdGlvbltdO1xuICBmaWVsZFBhaXJzPzogRmllbGRQYWlyW107XG4gIG9wZW5Nb2RhbDogKGw6IExheWVySW5mb01vZGFsKSA9PiB2b2lkO1xuICB1cGRhdGVMYXllckNvbmZpZzogKGNvbmZpZzogUGFydGlhbDxMYXllckJhc2VDb25maWc+KSA9PiB2b2lkO1xuICB1cGRhdGVMYXllclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG5MYXllckNvbHVtbk1vZGVDb25maWdGYWN0b3J5LmRlcHMgPSBbTGF5ZXJDb2x1bW5Db25maWdGYWN0b3J5LCBDb2x1bW5Nb2RlQ29uZmlnRmFjdG9yeV07XG5cbmZ1bmN0aW9uIExheWVyQ29sdW1uTW9kZUNvbmZpZ0ZhY3RvcnkoXG4gIExheWVyQ29sdW1uQ29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBMYXllckNvbHVtbkNvbmZpZ0ZhY3Rvcnk+LFxuICBDb2x1bW5Nb2RlQ29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBDb2x1bW5Nb2RlQ29uZmlnRmFjdG9yeT5cbikge1xuICBjb25zdCBMYXllckNvbHVtbk1vZGVDb25maWcgPSAoe1xuICAgIGlkLFxuICAgIGxheWVyLFxuICAgIHN1cHBvcnRlZENvbHVtbk1vZGVzLFxuICAgIGxheWVyQ29uZmlnLFxuICAgIGZpZWxkcyxcbiAgICBmaWVsZFBhaXJzLFxuICAgIG9wZW5Nb2RhbCxcbiAgICB1cGRhdGVMYXllckNvbmZpZ1xuICB9OiBMYXllckNvbHVtbk1vZGVDb25maWdQcm9wcykgPT4ge1xuICAgIGNvbnN0IHtjb2x1bW5zfSA9IGxheWVyQ29uZmlnO1xuXG4gICAgY29uc3Qgc2VsZWN0Q29sdW1uTW9kZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKHtrZXk6IGNvbHVtbk1vZGV9KSA9PiB7XG4gICAgICAgIHVwZGF0ZUxheWVyQ29uZmlnKHtjb2x1bW5Nb2RlfSk7XG4gICAgICB9LFxuICAgICAgW3VwZGF0ZUxheWVyQ29uZmlnXVxuICAgICk7XG5cbiAgICBjb25zdCByZW5kZXJDb2x1bW5Db25maWcgPSB1c2VDYWxsYmFjayhcbiAgICAgICh7a2V5OiBjb2x1bW5Nb2RlLCBjb2x1bW5zOiBjb2xzfSwgaXNTZWxlY3RlZCkgPT4gKFxuICAgICAgICA8TGF5ZXJDb2x1bW5Db25maWdcbiAgICAgICAgICBjb2x1bW5QYWlycz17bGF5ZXIuY29sdW1uUGFpcnN9XG4gICAgICAgICAgY29sdW1ucz17Y29sc31cbiAgICAgICAgICBhc3NpZ25Db2x1bW5QYWlycz17bGF5ZXIuYXNzaWduQ29sdW1uUGFpcnMuYmluZChsYXllcil9XG4gICAgICAgICAgYXNzaWduQ29sdW1uPXtsYXllci5hc3NpZ25Db2x1bW4uYmluZChsYXllcil9XG4gICAgICAgICAgY29sdW1uTGFiZWxzPXtsYXllci5jb2x1bW5MYWJlbHN9XG4gICAgICAgICAgZmllbGRzPXtmaWVsZHN9XG4gICAgICAgICAgZmllbGRQYWlycz17ZmllbGRQYWlyc31cbiAgICAgICAgICB1cGRhdGVMYXllckNvbmZpZz17Y29uZmlnID0+XG4gICAgICAgICAgICB1cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgICAgLy8gaWYgY29sdW1uIG1vZGUgbm90IGN1cnJlbnRseSBzZWxlY3RlZFxuICAgICAgICAgICAgICAvLyBzZXQgY29sdW1uIG1vZGUgYWxvbmcgd2l0aCB0aGUgY29sdW1uc1xuICAgICAgICAgICAgICAuLi4oIWlzU2VsZWN0ZWQgJiYgY29sdW1uTW9kZSAhPT0gJ2RlZmF1dCcgPyB7Y29sdW1uTW9kZX0gOiB7fSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzQWN0aXZlPXtpc1NlbGVjdGVkfVxuICAgICAgICAvPlxuICAgICAgKSxcbiAgICAgIFtsYXllciwgdXBkYXRlTGF5ZXJDb25maWcsIGZpZWxkUGFpcnMsIGZpZWxkc11cbiAgICApO1xuXG4gICAgY29uc3QgZ2V0SGVscEhhbmRsZXIgPSB1c2VDYWxsYmFjayhcbiAgICAgICh7a2V5OiBjb2x1bW5Nb2RlfSkgPT4ge1xuICAgICAgICBjb25zdCBtb2RhbCA9IGxheWVyLmxheWVySW5mb01vZGFsPy5bY29sdW1uTW9kZV07XG4gICAgICAgIGlmIChtb2RhbCkge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBvcGVuTW9kYWwobW9kYWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcbiAgICAgIFtsYXllciwgb3Blbk1vZGFsXVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENvbHVtbk1vZGVDb25maWdcbiAgICAgICAgaWQ9e2lkfVxuICAgICAgICBzdXBwb3J0ZWRDb2x1bW5Nb2Rlcz17c3VwcG9ydGVkQ29sdW1uTW9kZXN9XG4gICAgICAgIHNlbGVjdGVkQ29sdW1uTW9kZT17bGF5ZXJDb25maWcuY29sdW1uTW9kZX1cbiAgICAgICAgY29sdW1ucz17Y29sdW1uc31cbiAgICAgICAgc2VsZWN0Q29sdW1uTW9kZT17c2VsZWN0Q29sdW1uTW9kZX1cbiAgICAgICAgcmVuZGVyQ29sdW1uQ29uZmlnPXtyZW5kZXJDb2x1bW5Db25maWd9XG4gICAgICAgIGdldEhlbHBIYW5kbGVyPXtnZXRIZWxwSGFuZGxlcn1cbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTGF5ZXJDb2x1bW5Nb2RlQ29uZmlnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBMYXllckNvbHVtbk1vZGVDb25maWdGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxrQkFBQSxHQUFBSCxPQUFBO0FBTUEsSUFBQUksU0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUssa0JBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLGtCQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxhQUFBLEdBQUFQLE9BQUE7QUFLQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFBd0MsSUFBQVMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQXJCeEM7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFB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
;