UNPKG

kepler.gl.geoiq

Version:

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

637 lines (590 loc) 64.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.SaveMapFactory = exports.SaveExportDropdownFactory = exports.PanelAction = exports.ExportMapFactory = exports.ExportImageFactory = exports.ExportDataFactory = void 0; 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 _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents2 = require("../common/styled-components"); var _logo = _interopRequireDefault(require("../common/logo")); var _icons = require("../common/icons"); var _panelDropdown = _interopRequireDefault(require("./panel-dropdown")); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; 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; } } var StyledPanelHeader = _styledComponents["default"].div.attrs({ className: 'side-side-panel__header' })(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px 16px 0 16px;\n"])), function (props) { return props.theme.sidePanelHeaderBg; }); var StyledPanelHeaderTop = _styledComponents["default"].div.attrs({ className: 'side-panel__header__top' })(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n width: 100%;\n"]))); var StyledPanelTopActions = _styledComponents["default"].div.attrs({ className: 'side-panel__header__actions' })(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"]))); var StyledPanelAction = _styledComponents["default"].div.attrs({ className: 'side-panel__header__actions' })(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-radius: 2px;\n color: ", ";\n display: flex;\n height: 26px;\n justify-content: space-between;\n margin-left: 4px;\n padding: 5px;\n font-weight: bold;\n p {\n display: inline-block;\n margin-right: 6px;\n }\n a {\n height: 20px;\n }\n :hover {\n cursor: pointer;\n background-color: ", ";\n color: ", ";\n a {\n color: ", ";\n }\n }\n"])), function (props) { return props.active ? props.theme.textColorHl : props.theme.subtextColor; }, function (props) { return props.theme.secondaryBtnActBgd; }, function (props) { return props.theme.textColorHl; }, function (props) { return props.theme.textColorHl; }); var StyledPanelDropdown = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n box-shadow: ", ";\n font-size: 11px;\n padding: 16px 0;\n position: absolute;\n left: 64px;\n transition: ", ";\n display: flex;\n margin-top: ", ";\n opacity: ", ";\n transform: translateX(calc(-50% + 20px));\n pointer-events: ", ";\n z-index: 1000;\n .save-export-dropdown__inner {\n box-shadow: none;\n background-color: transparent;\n display: flex;\n }\n .save-export-dropdown__item {\n align-items: center;\n border-right: 1px solid ", ";\n color: ", ";\n display: flex;\n flex-direction: column;\n padding: 0 22px;\n :hover {\n cursor: pointer;\n color: ", ";\n }\n &:last-child {\n border-right: 0;\n }\n }\n .save-export-dropdown__title {\n white-space: nowrap;\n margin-top: 4px;\n }\n"])), function (props) { return props.theme.dropdownListBgd; }, function (props) { return props.theme.dropdownListShadow; }, function (props) { return props.theme.transitionSlow; }, function (props) { return props.show ? '6px' : '20px'; }, function (props) { return props.show ? 1 : 0; }, function (props) { return props.show ? 'all' : 'none'; }, function (props) { return props.theme.panelHeaderIcon; }, function (props) { return props.theme.textColor; }, function (props) { return props.theme.textColorHl; }); var PanelAction = exports.PanelAction = function PanelAction(_ref) { var item = _ref.item, onClick = _ref.onClick; return (/*#__PURE__*/_react["default"].createElement(StyledPanelAction, { className: "side-panel__panel-header__action", "data-tip": true, "data-for": "".concat(item.id, "-action"), onClick: onClick }, item.label ? /*#__PURE__*/_react["default"].createElement("p", null, item.label) : null, /*#__PURE__*/_react["default"].createElement("a", { target: item.blank ? '_blank' : '', href: item.href }, /*#__PURE__*/_react["default"].createElement(item.iconComponent, { height: "20px" })), item.tooltip ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, { id: "".concat(item.id, "-action"), place: "bottom", delayShow: 500, effect: "solid" }, /*#__PURE__*/_react["default"].createElement("span", null, item.tooltip)) : null) ); }; var PanelItem = function PanelItem(_ref2) { var onClose = _ref2.onClose, onClickHandler = _ref2.onClickHandler, label = _ref2.label, icon = _ref2.icon; return (/*#__PURE__*/_react["default"].createElement("div", { className: "save-export-dropdown__item", onClick: function onClick(e) { e.stopPropagation(); onClose(); onClickHandler(); } }, icon, /*#__PURE__*/_react["default"].createElement("div", { className: "save-export-dropdown__title" }, label)) ); }; var ExportImageFactory = exports.ExportImageFactory = function ExportImageFactory() { var ExportImage = function ExportImage(props) { return (/*#__PURE__*/_react["default"].createElement(PanelItem, props) ); }; ExportImage.defaultProps = { label: 'Export Image', icon: /*#__PURE__*/_react["default"].createElement(_icons.Picture, null) }; return ExportImage; }; var ExportDataFactory = exports.ExportDataFactory = function ExportDataFactory() { var ExportData = function ExportData(props) { return (/*#__PURE__*/_react["default"].createElement(PanelItem, props) ); }; ExportData.defaultProps = { label: 'Export Data', icon: /*#__PURE__*/_react["default"].createElement(_icons.Files, null) }; return ExportData; }; var ExportMapFactory = exports.ExportMapFactory = function ExportMapFactory() { var ExportMap = function ExportMap(props) { return (/*#__PURE__*/_react["default"].createElement(PanelItem, props) ); }; ExportMap.defaultProps = { label: 'Export Map', icon: /*#__PURE__*/_react["default"].createElement(_icons.Map, null) }; return ExportMap; }; var SaveMapFactory = exports.SaveMapFactory = function SaveMapFactory() { var SaveMap = function SaveMap(props) { return (/*#__PURE__*/_react["default"].createElement(PanelItem, props) ); }; SaveMap.defaultProps = { label: 'Save Map', icon: /*#__PURE__*/_react["default"].createElement(_icons.Share, null) }; return SaveMap; }; var SaveExportDropdownFactory = exports.SaveExportDropdownFactory = function SaveExportDropdownFactory(ExportImage, ExportData, ExportMap, SaveMap) { var SaveExportDropdown = function SaveExportDropdown(_ref3) { var onExportImage = _ref3.onExportImage, onExportData = _ref3.onExportData, onExportConfig = _ref3.onExportConfig, onExportMap = _ref3.onExportMap, onSaveMap = _ref3.onSaveMap, show = _ref3.show, onClose = _ref3.onClose; return (/*#__PURE__*/_react["default"].createElement(StyledPanelDropdown, { show: show, className: "save-export-dropdown" }, /*#__PURE__*/_react["default"].createElement(_panelDropdown["default"], { className: "save-export-dropdown__inner", show: show, onClose: onClose }, /*#__PURE__*/_react["default"].createElement(ExportImage, { onClickHandler: onExportImage, onClose: onClose }), /*#__PURE__*/_react["default"].createElement(ExportData, { onClickHandler: onExportData, onClose: onClose }), /*#__PURE__*/_react["default"].createElement(ExportMap, { onClickHandler: onExportMap, onClose: onClose }), onSaveMap ? /*#__PURE__*/_react["default"].createElement(SaveMap, { onClickHandler: onSaveMap, onClose: onClose }) : null)) ); }; return SaveExportDropdown; }; SaveExportDropdownFactory.deps = [ExportImageFactory, ExportDataFactory, ExportMapFactory, SaveMapFactory]; PanelHeaderFactory.deps = [SaveExportDropdownFactory]; function PanelHeaderFactory(SaveExportDropdown) { var _class, _temp; return _temp = _class = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(PanelHeader, _Component); var _super = _createSuper(PanelHeader); function PanelHeader() { (0, _classCallCheck2["default"])(this, PanelHeader); return _super.apply(this, arguments); } (0, _createClass2["default"])(PanelHeader, [{ key: "render", value: function render() { var _this$props = this.props, appName = _this$props.appName, version = _this$props.version, actionItems = _this$props.actionItems, onSaveMap = _this$props.onSaveMap, onExportImage = _this$props.onExportImage, onExportData = _this$props.onExportData, onExportConfig = _this$props.onExportConfig, onExportMap = _this$props.onExportMap, visibleDropdown = _this$props.visibleDropdown, showExportDropdown = _this$props.showExportDropdown, hideExportDropdown = _this$props.hideExportDropdown; return (/*#__PURE__*/_react["default"].createElement(StyledPanelHeader, { className: "side-panel__panel-header" }, /*#__PURE__*/_react["default"].createElement(StyledPanelHeaderTop, { className: "side-panel__panel-header__top" }, /*#__PURE__*/_react["default"].createElement(this.props.logoComponent, { appName: appName, version: version }), /*#__PURE__*/_react["default"].createElement(StyledPanelTopActions, null, actionItems.map(function (item) { return (/*#__PURE__*/_react["default"].createElement("div", { className: "side-panel__panel-header__right", key: item.id, style: { position: 'relative' } }, /*#__PURE__*/_react["default"].createElement(PanelAction, { item: item, onClick: function onClick() { if (item.dropdownComponent) { showExportDropdown(item.id); } item.onClick(); } }), item.dropdownComponent ? /*#__PURE__*/_react["default"].createElement(item.dropdownComponent, { onClose: hideExportDropdown, show: visibleDropdown === item.id, onSaveMap: onSaveMap, onExportData: onExportData, onExportImage: onExportImage, onExportConfig: onExportConfig, onExportMap: onExportMap }) : null) ); })))) ); } }]); return PanelHeader; }(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", { appName: _propTypes["default"].string, version: _propTypes["default"].string, uiState: _propTypes["default"].object, uiStateActions: _propTypes["default"].object, logoComponent: _propTypes["default"].oneOfType([_propTypes["default"].element, _propTypes["default"].func]), actionItems: _propTypes["default"].arrayOf(_propTypes["default"].any) }), (0, _defineProperty2["default"])(_class, "defaultProps", { logoComponent: _logo["default"], actionItems: [{ id: 'save', iconComponent: _icons.Save, onClick: function onClick() {}, label: 'Share', dropdownComponent: SaveExportDropdown }] }), _temp; } var _default = exports["default"] = PanelHeaderFactory; // import React, {Component} from 'react'; // import styled from 'styled-components'; // import PropTypes from 'prop-types'; // import {Tooltip} from 'components/common/styled-components'; // import KeplerGlLogo from 'components/common/logo'; // import {Save, Files, Share, Picture, Map} from 'components/common/icons'; // import ClickOutsideCloseDropdown from 'components/side-panel/panel-dropdown'; // import Toolbar from 'components/common/toolbar'; // import ToolbarItem from 'components/common/toolbar-item'; // const StyledPanelHeader = styled.div.attrs({ // className: 'side-side-panel__header' // })` // background-color: ${props => props.theme.sidePanelHeaderBg}; // padding: 12px 16px 0 16px; // `; // const StyledPanelHeaderTop = styled.div.attrs({ // className: 'side-panel__header__top' // })` // display: flex; // justify-content: space-between; // margin-bottom: 16px; // width: 100%; // `; // const StyledPanelTopActions = styled.div.attrs({ // className: 'side-panel__header__actions' // })` // display: flex; // `; // const StyledPanelAction = styled.div.attrs({ // className: 'side-panel__header__actions' // })` // align-items: center; // border-radius: 2px; // color: ${props => // props.active ? props.theme.textColorHl : props.theme.subtextColor}; // display: flex; // height: 26px; // justify-content: space-between; // margin-left: 4px; // padding: 5px; // font-weight: bold; // p { // display: inline-block; // margin-right: 6px; // } // a { // height: 20px; // } // :hover { // cursor: pointer; // background-color: ${props => props.theme.secondaryBtnActBgd}; // color: ${props => props.theme.textColorHl}; // a { // color: ${props => props.theme.textColorHl}; // } // } // `; // // By assigning this style we can position the toolbar in the right place on the screen // const StyledToolbar = styled(Toolbar)` // position: absolute; // left: 64px; // `; // // transition: ${props => props.theme.transitionSlow}; // // display: flex; // // margin-top: ${props => (props.show ? '6px' : '20px')}; // // opacity: ${props => (props.show ? 1 : 0)}; // // transform: translateX(calc(-50% + 20px)); // // pointer-events: ${props => (props.show ? 'all' : 'none')}; // // z-index: 1000; // // .save-export-dropdown__inner { // // box-shadow: none; // // background-color: transparent; // // display: flex; // // } // // .save-export-dropdown__item { // // align-items: center; // // border-right: 1px solid ${props => props.theme.panelHeaderIcon}; // // color: ${props => props.theme.textColor}; // // display: flex; // // flex-direction: column; // // padding: 0 22px; // // :hover { // // cursor: pointer; // // color: ${props => props.theme.textColorHl}; // // } // // &:last-child { // // border-right: 0; // // } // // } // // .save-export-dropdown__title { // // white-space: nowrap; // // margin-top: 4px; // // } // export const PanelAction = ({item, onClick}) => ( // <StyledPanelAction // className="side-panel__panel-header__action" // data-tip // data-for={`${item.id}-action`} // onClick={onClick} // > // {item.label ? <p>{item.label}</p> : null} // <a target={item.blank ? '_blank' : ''} href={item.href}> // <item.iconComponent height="20px" /> // </a> // {item.tooltip ? ( // <Tooltip // id={`${item.id}-action`} // place="bottom" // delayShow={500} // effect="solid" // > // <span>{item.tooltip}</span> // </Tooltip> // ) : null} // </StyledPanelAction> // ); // // const PanelItem = ({onClose, onClickHandler, label, icon}) => ( // // <div // // className="save-export-dropdown__item" // // onClick={e => { // // e.stopPropagation(); // // onClose(); // // onClickHandler(); // // }} // // > // // {icon} // // <div className="save-export-dropdown__title">{label}</div> // // </div> // // ); // // export const ExportImageFactory = () => { // // const ExportImage = props => <PanelItem {...props} />; // export const ExportImageFactory = () => { // const ExportImage = props => <ToolbarItem {...props} />; // ExportImage.defaultProps = { // label: 'Export Image', // icon: <Picture /> // }; // return ExportImage; // }; // export const ExportDataFactory = () => { // // const ExportData = props => <PanelItem {...props} />; // const ExportData = props => <ToolbarItem {...props} />; // ExportData.defaultProps = { // label: 'Export Data', // icon: <Files /> // }; // return ExportData; // }; // export const ExportMapFactory = () => { // // const ExportMap = props => <PanelItem {...props} />; // const ExportMap = props => <ToolbarItem {...props} />; // ExportMap.defaultProps = { // label: 'Export Map', // icon: <Map /> // }; // return ExportMap; // }; // export const SaveMapFactory = () => { // // const SaveMap = props => <PanelItem {...props} />; // const SaveMap = props => <ToolbarItem {...props} />; // SaveMap.defaultProps = { // label: 'Save Map', // icon: <Share /> // }; // return SaveMap; // }; // SaveExportDropdownFactory.deps = [ // ExportImageFactory, // ExportDataFactory, // ExportMapFactory, // SaveMapFactory // ]; // export function SaveExportDropdownFactory( // ExportImage, // ExportData, // ExportMap, // // SaveMap // // ) => { // SaveMap // ) { // const SaveExportDropdown = ({ // onExportImage, // onExportData, // onExportConfig, // onExportMap, // onSaveMap, // show, // onClose // }) => { // return ( // // <StyledPanelDropdown show={show} className="save-export-dropdown"> // // <ClickOutsideCloseDropdown // // className="save-export-dropdown__inner" // // show={show} // // onClose={onClose} // // > // // <ExportImage onClickHandler={onExportImage} onClose={onClose} /> // // <ExportData onClickHandler={onExportData} onClose={onClose} /> // // <ExportMap onClickHandler={onExportMap} onClose={onClose} /> // // {onSaveMap ? ( // // <SaveMap onClickHandler={onSaveMap} onClose={onClose} /> // // ) : null} // <StyledToolbar // show={show} // onClose={onClose} // className="save-export-dropdown" // > // <ClickOutsideCloseDropdown // className="save-export-dropdown__inner" // show={show} // onClose={onClose} // > // <ExportImage // className="export-image" // onClick={() => { // onExportImage(); // onClose(); // }} // /> // <ExportData // className="export-data" // onClick={() => { // onExportData(); // onClose(); // }} // /> // <ExportMap // className="export-map" // onClick={() => { // onExportMap(); // onClose(); // }} // /> // {onSaveMap ? ( // <SaveMap // className="save-map" // onClick={() => { // onSaveMap(); // onClose(); // }} // /> // ) : null} // </ClickOutsideCloseDropdown> // </StyledToolbar> // ); // }; // return SaveExportDropdown; // } // PanelHeaderFactory.deps = [SaveExportDropdownFactory]; // function PanelHeaderFactory(SaveExportDropdown) { // return class PanelHeader extends Component { // static propTypes = { // appName: PropTypes.string, // version: PropTypes.string, // uiState: PropTypes.object, // uiStateActions: PropTypes.object, // logoComponent: PropTypes.oneOfType([PropTypes.element, PropTypes.func]), // actionItems: PropTypes.arrayOf(PropTypes.any) // }; // static defaultProps = { // logoComponent: KeplerGlLogo, // actionItems: [ // { // id: 'save', // iconComponent: Save, // onClick: () => {}, // label: 'Share', // dropdownComponent: SaveExportDropdown // } // ] // }; // render() { // const { // appName, // version, // actionItems, // onSaveMap, // onExportImage, // onExportData, // onExportConfig, // onExportMap, // visibleDropdown, // showExportDropdown, // hideExportDropdown // } = this.props; // return ( // <StyledPanelHeader className="side-panel__panel-header"> // <StyledPanelHeaderTop className="side-panel__panel-header__top"> // <this.props.logoComponent appName={appName} version={version} /> // <StyledPanelTopActions> // {actionItems.map(item => ( // <div // className="side-panel__panel-header__right" // key={item.id} // style={{position: 'relative'}} // > // <PanelAction // item={item} // onClick={() => { // if (item.dropdownComponent) { // showExportDropdown(item.id); // } // item.onClick(); // }} // /> // {item.dropdownComponent ? ( // <item.dropdownComponent // onClose={hideExportDropdown} // show={visibleDropdown === item.id} // onSaveMap={onSaveMap} // onExportData={onExportData} // onExportImage={onExportImage} // onExportConfig={onExportConfig} // onExportMap={onExportMap} // /> // ) : null} // </div> // ))} // </StyledPanelTopActions> // </StyledPanelHeaderTop> // </StyledPanelHeader> // ); // } // }; // } // export default PanelHeaderFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLmpzIl0sIm5hbWVzIjpbIlN0eWxlZFBhbmVsSGVhZGVyIiwic3R5bGVkIiwiZGl2IiwiYXR0cnMiLCJjbGFzc05hbWUiLCJwcm9wcyIsInRoZW1lIiwic2lkZVBhbmVsSGVhZGVyQmciLCJTdHlsZWRQYW5lbEhlYWRlclRvcCIsIlN0eWxlZFBhbmVsVG9wQWN0aW9ucyIsIlN0eWxlZFBhbmVsQWN0aW9uIiwiYWN0aXZlIiwidGV4dENvbG9ySGwiLCJzdWJ0ZXh0Q29sb3IiLCJzZWNvbmRhcnlCdG5BY3RCZ2QiLCJTdHlsZWRQYW5lbERyb3Bkb3duIiwiZHJvcGRvd25MaXN0QmdkIiwiZHJvcGRvd25MaXN0U2hhZG93IiwidHJhbnNpdGlvblNsb3ciLCJzaG93IiwicGFuZWxIZWFkZXJJY29uIiwidGV4dENvbG9yIiwiUGFuZWxBY3Rpb24iLCJpdGVtIiwib25DbGljayIsImlkIiwibGFiZWwiLCJibGFuayIsImhyZWYiLCJ0b29sdGlwIiwiUGFuZWxJdGVtIiwib25DbG9zZSIsIm9uQ2xpY2tIYW5kbGVyIiwiaWNvbiIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJFeHBvcnRJbWFnZUZhY3RvcnkiLCJFeHBvcnRJbWFnZSIsImRlZmF1bHRQcm9wcyIsIkV4cG9ydERhdGFGYWN0b3J5IiwiRXhwb3J0RGF0YSIsIkV4cG9ydE1hcEZhY3RvcnkiLCJFeHBvcnRNYXAiLCJTYXZlTWFwRmFjdG9yeSIsIlNhdmVNYXAiLCJTYXZlRXhwb3J0RHJvcGRvd25GYWN0b3J5IiwiU2F2ZUV4cG9ydERyb3Bkb3duIiwib25FeHBvcnRJbWFnZSIsIm9uRXhwb3J0RGF0YSIsIm9uRXhwb3J0Q29uZmlnIiwib25FeHBvcnRNYXAiLCJvblNhdmVNYXAiLCJkZXBzIiwiUGFuZWxIZWFkZXJGYWN0b3J5IiwiYXBwTmFtZSIsInZlcnNpb24iLCJhY3Rpb25JdGVtcyIsInZpc2libGVEcm9wZG93biIsInNob3dFeHBvcnREcm9wZG93biIsImhpZGVFeHBvcnREcm9wZG93biIsIm1hcCIsInBvc2l0aW9uIiwiZHJvcGRvd25Db21wb25lbnQiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJ1aVN0YXRlIiwib2JqZWN0IiwidWlTdGF0ZUFjdGlvbnMiLCJsb2dvQ29tcG9uZW50Iiwib25lT2ZUeXBlIiwiZWxlbWVudCIsImZ1bmMiLCJhcnJheU9mIiwiYW55IiwiS2VwbGVyR2xMb2dvIiwiaWNvbkNvbXBvbmVudCIsIlNhdmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGlCQUFpQixHQUFHQyw2QkFBT0MsR0FBUCxDQUFXQyxLQUFYLENBQWlCO0FBQ3pDQyxFQUFBQSxTQUFTLEVBQUU7QUFEOEIsQ0FBakIsQ0FBSCxrSkFHRCxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGlCQUFoQjtBQUFBLENBSEosQ0FBdkI7O0FBT0EsSUFBTUMsb0JBQW9CLEdBQUdQLDZCQUFPQyxHQUFQLENBQVdDLEtBQVgsQ0FBaUI7QUFDNUNDLEVBQUFBLFNBQVMsRUFBRTtBQURpQyxDQUFqQixDQUFILHVMQUExQjs7QUFTQSxJQUFNSyxxQkFBcUIsR0FBR1IsNkJBQU9DLEdBQVAsQ0FBV0MsS0FBWCxDQUFpQjtBQUM3Q0MsRUFBQUEsU0FBUyxFQUFFO0FBRGtDLENBQWpCLENBQUgsNEdBQTNCOztBQU1BLElBQU1NLGlCQUFpQixHQUFHVCw2QkFBT0MsR0FBUCxDQUFXQyxLQUFYLENBQWlCO0FBQ3pDQyxFQUFBQSxTQUFTLEVBQUU7QUFEOEIsQ0FBakIsQ0FBSCxxZkFLWixVQUFBQyxLQUFLO0FBQUEsU0FDWkEsS0FBSyxDQUFDTSxNQUFOLEdBQWVOLEtBQUssQ0FBQ0MsS0FBTixDQUFZTSxXQUEzQixHQUF5Q1AsS0FBSyxDQUFDQyxLQUFO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QTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7VG9vbHRpcH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEtlcGxlckdsTG9nbyBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9sb2dvJztcbmltcG9ydCB7U2F2ZSwgRmlsZXMsIFNoYXJlLCBQaWN0dXJlLCBNYXB9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCBDbGlja091dHNpZGVDbG9zZURyb3Bkb3duIGZyb20gJ2NvbXBvbmVudHMvc2lkZS1wYW5lbC9wYW5lbC1kcm9wZG93bic7XG5cbmNvbnN0IFN0eWxlZFBhbmVsSGVhZGVyID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3NpZGUtc2lkZS1wYW5lbF9faGVhZGVyJ1xufSlgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2lkZVBhbmVsSGVhZGVyQmd9O1xuICBwYWRkaW5nOiAxMnB4IDE2cHggMCAxNnB4O1xuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxIZWFkZXJUb3AgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2lkZS1wYW5lbF9faGVhZGVyX190b3AnXG59KWBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICB3aWR0aDogMTAwJTtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbmVsVG9wQWN0aW9ucyA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdzaWRlLXBhbmVsX19oZWFkZXJfX2FjdGlvbnMnXG59KWBcbiAgZGlzcGxheTogZmxleDtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbmVsQWN0aW9uID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3NpZGUtcGFuZWxfX2hlYWRlcl9fYWN0aW9ucydcbn0pYFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGNvbG9yOiAke3Byb3BzID0+XG4gICAgcHJvcHMuYWN0aXZlID8gcHJvcHMudGhlbWUudGV4dENvbG9ySGwgOiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDI2cHg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luLWxlZnQ6IDRweDtcbiAgcGFkZGluZzogNXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICB9XG4gIGEge1xuICAgIGhlaWdodDogMjBweDtcbiAgfVxuICA6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNlY29uZGFyeUJ0bkFjdEJnZH07XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIGEge1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxEcm9wZG93biA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0QmdkfTtcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RTaGFkb3d9O1xuICBmb250LXNpemU6IDExcHg7XG4gIHBhZGRpbmc6IDE2cHggMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiA2NHB4O1xuICB0cmFuc2l0aW9uOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRyYW5zaXRpb25TbG93fTtcbiAgZGlzcGxheTogZmxleDtcbiAgbWFyZ2luLXRvcDogJHtwcm9wcyA9PiAocHJvcHMuc2hvdyA/ICc2cHgnIDogJzIwcHgnKX07XG4gIG9wYWNpdHk6ICR7cHJvcHMgPT4gKHByb3BzLnNob3cgPyAxIDogMCl9O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNTAlICsgMjBweCkpO1xuICBwb2ludGVyLWV2ZW50czogJHtwcm9wcyA9PiAocHJvcHMuc2hvdyA/ICdhbGwnIDogJ25vbmUnKX07XG4gIHotaW5kZXg6IDEwMDA7XG4gIC5zYXZlLWV4cG9ydC1kcm9wZG93bl9faW5uZXIge1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuICAuc2F2ZS1leHBvcnQtZHJvcGRvd25fX2l0ZW0ge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEhlYWRlckljb259O1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBhZGRpbmc6IDAgMjJweDtcbiAgICA6aG92ZXIge1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxuICAuc2F2ZS1leHBvcnQtZHJvcGRvd25fX3RpdGxlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG1hcmdpbi10b3A6IDRweDtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IFBhbmVsQWN0aW9uID0gKHtpdGVtLCBvbkNsaWNrfSkgPT4gKFxuICA8U3R5bGVkUGFuZWxBY3Rpb25cbiAgICBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJfX2FjdGlvblwiXG4gICAgZGF0YS10aXBcbiAgICBkYXRhLWZvcj17YCR7aXRlbS5pZH0tYWN0aW9uYH1cbiAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICA+XG4gICAge2l0ZW0ubGFiZWwgPyA8cD57aXRlbS5sYWJlbH08L3A+IDogbnVsbH1cbiAgICA8YSB0YXJnZXQ9e2l0ZW0uYmxhbmsgPyAnX2JsYW5rJyA6ICcnfSBocmVmPXtpdGVtLmhyZWZ9PlxuICAgICAgPGl0ZW0uaWNvbkNvbXBvbmVudCBoZWlnaHQ9XCIyMHB4XCIgLz5cbiAgICA8L2E+XG4gICAge2l0ZW0udG9vbHRpcCA/IChcbiAgICAgIDxUb29sdGlwXG4gICAgICAgIGlkPXtgJHtpdGVtLmlkfS1hY3Rpb25gfVxuICAgICAgICBwbGFjZT1cImJvdHRvbVwiXG4gICAgICAgIGRlbGF5U2hvdz17NTAwfVxuICAgICAgICBlZmZlY3Q9XCJzb2xpZFwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPntpdGVtLnRvb2x0aXB9PC9zcGFuPlxuICAgICAgPC9Ub29sdGlwPlxuICAgICkgOiBudWxsfVxuICA8L1N0eWxlZFBhbmVsQWN0aW9uPlxuKTtcblxuY29uc3QgUGFuZWxJdGVtID0gKHtvbkNsb3NlLCBvbkNsaWNrSGFuZGxlciwgbGFiZWwsIGljb259KSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9XCJzYXZlLWV4cG9ydC1kcm9wZG93bl9faXRlbVwiXG4gICAgb25DbGljaz17ZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25DbG9zZSgpO1xuICAgICAgb25DbGlja0hhbmRsZXIoKTtcbiAgICB9fVxuICA+XG4gICAge2ljb259XG4gICAgPGRpdiBjbGFzc05hbWU9XCJzYXZlLWV4cG9ydC1kcm9wZG93bl9fdGl0bGVcIj57bGFiZWx9PC9kaXY+XG4gIDwvZGl2PlxuKTtcblxuZXhwb3J0IGNvbnN0IEV4cG9ydEltYWdlRmFjdG9yeSA9ICgpID0+IHtcbiAgY29uc3QgRXhwb3J0SW1hZ2UgPSBwcm9wcyA9PiA8UGFuZWxJdGVtIHsuLi5wcm9wc30gLz47XG4gIEV4cG9ydEltYWdlLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYWJlbDogJ0V4cG9ydCBJbWFnZScsXG4gICAgaWNvbjogPFBpY3R1cmUgLz5cbiAgfTtcblxuICByZXR1cm4gRXhwb3J0SW1hZ2U7XG59O1xuXG5leHBvcnQgY29uc3QgRXhwb3J0RGF0YUZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IEV4cG9ydERhdGEgPSBwcm9wcyA9PiA8UGFuZWxJdGVtIHsuLi5wcm9wc30gLz47XG4gIEV4cG9ydERhdGEuZGVmYXVsdFByb3BzID0ge1xuICAgIGxhYmVsOiAnRXhwb3J0IERhdGEnLFxuICAgIGljb246IDxGaWxlcyAvPlxuICB9O1xuXG4gIHJldHVybiBFeHBvcnREYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IEV4cG9ydE1hcEZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IEV4cG9ydE1hcCA9IHByb3BzID0+IDxQYW5lbEl0ZW0gey4uLnByb3BzfSAvPjtcbiAgRXhwb3J0TWFwLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYWJlbDogJ0V4cG9ydCBNYXAnLFxuICAgIGljb246IDxNYXAgLz5cbiAgfTtcblxuICByZXR1cm4gRXhwb3J0TWFwO1xufTtcblxuZXhwb3J0IGNvbnN0IFNhdmVNYXBGYWN0b3J5ID0gKCkgPT4ge1xuICBjb25zdCBTYXZlTWFwID0gcHJvcHMgPT4gPFBhbmVsSXRlbSB7Li4ucHJvcHN9IC8+O1xuICBTYXZlTWFwLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYWJlbDogJ1NhdmUgTWFwJyxcbiAgICBpY29uOiA8U2hhcmUgLz5cbiAgfTtcblxuICByZXR1cm4gU2F2ZU1hcDtcbn07XG5cbmV4cG9ydCBjb25zdCBTYXZlRXhwb3J0RHJvcGRvd25GYWN0b3J5ID0gKFxuICBFeHBvcnRJbWFnZSxcbiAgRXhwb3J0RGF0YSxcbiAgRXhwb3J0TWFwLFxuICBTYXZlTWFwXG4pID0+IHtcbiAgY29uc3QgU2F2ZUV4cG9ydERyb3Bkb3duID0gKHtcbiAgICBvbkV4cG9ydEltYWdlLFxuICAgIG9uRXhwb3J0RGF0YSxcbiAgICBvbkV4cG9ydENvbmZpZyxcbiAgICBvbkV4cG9ydE1hcCxcbiAgICBvblNhdmVNYXAsXG4gICAgc2hvdyxcbiAgICBvbkNsb3NlXG4gIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZFBhbmVsRHJvcGRvd24gc2hvdz17c2hvd30gY2xhc3NOYW1lPVwic2F2ZS1leHBvcnQtZHJvcGRvd25cIj5cbiAgICAgICAgPENsaWNrT3V0c2lkZUNsb3NlRHJvcGRvd25cbiAgICAgICAgICBjbGFzc05hbWU9XCJzYXZlLWV4cG9ydC1kcm9wZG93bl9faW5uZXJcIlxuICAgICAgICAgIHNob3c9e3Nob3d9XG4gICAgICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxFeHBvcnRJbWFnZSBvbkNsaWNrSGFuZGxlcj17b25FeHBvcnRJbWFnZX0gb25DbG9zZT17b25DbG9zZX0gLz5cbiAgICAgICAgICA8RXhwb3J0RGF0YSBvbkNsaWNrSGFuZGxlcj17b25FeHBvcnREYXRhfSBvbkNsb3NlPXtvbkNsb3NlfSAvPlxuICAgICAgICAgIDxFeHBvcnRNYXAgb25DbGlja0hhbmRsZXI9e29uRXhwb3J0TWFwfSBvbkNsb3NlPXtvbkNsb3NlfSAvPlxuICAgICAgICAgIHtvblNhdmVNYXAgPyAoXG4gICAgICAgICAgICA8U2F2ZU1hcCBvbkNsaWNrSGFuZGxlcj17b25TYXZlTWFwfSBvbkNsb3NlPXtvbkNsb3NlfSAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0NsaWNrT3V0c2lkZUNsb3NlRHJvcGRvd24+XG4gICAgICA8L1N0eWxlZFBhbmVsRHJvcGRvd24+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gU2F2ZUV4cG9ydERyb3Bkb3duO1xufTtcblxuU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeS5kZXBzID0gW1xuICBFeHBvcnRJbWFnZUZhY3RvcnksXG4gIEV4cG9ydERhdGFGYWN0b3J5LFxuICBFeHBvcnRNYXBGYWN0b3J5LFxuICBTYXZlTWFwRmFjdG9yeVxuXTtcblxuUGFuZWxIZWFkZXJGYWN0b3J5LmRlcHMgPSBbU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeV07XG5cbmZ1bmN0aW9uIFBhbmVsSGVhZGVyRmFjdG9yeShTYXZlRXhwb3J0RHJvcGRvd24pIHtcbiAgcmV0dXJuIGNsYXNzIFBhbmVsSGVhZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgYXBwTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHZlcnNpb246IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICB1aVN0YXRlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgdWlTdGF0ZUFjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBsb2dvQ29tcG9uZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZWxlbWVudCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICAgIGFjdGlvbkl0ZW1zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KVxuICAgIH07XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbG9nb0NvbXBvbmVudDogS2VwbGVyR2xMb2dvLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2F2ZScsXG4gICAgICAgICAgaWNvbkNvbXBvbmVudDogU2F2ZSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgICBsYWJlbDogJ1NoYXJlJyxcbiAgICAgICAgICBkcm9wZG93bkNvbXBvbmVudDogU2F2ZUV4cG9ydERyb3Bkb3duXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhcHBOYW1lLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBhY3Rpb25JdGVtcyxcbiAgICAgICAgb25TYXZlTWFwLFxuICAgICAgICBvbkV4cG9ydEltYWdlLFxuICAgICAgICBvbkV4cG9ydERhdGEsXG4gICAgICAgIG9uRXhwb3J0Q29uZmlnLFxuICAgICAgICBvbkV4cG9ydE1hcCxcbiAgICAgICAgdmlzaWJsZURyb3Bkb3duLFxuICAgICAgICBzaG93RXhwb3J0RHJvcGRvd24sXG4gICAgICAgIGhpZGVFeHBvcnREcm9wZG93blxuICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRQYW5lbEhlYWRlciBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJcIj5cbiAgICAgICAgICA8U3R5bGVkUGFuZWxIZWFkZXJUb3AgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fcGFuZWwtaGVhZGVyX190b3BcIj5cbiAgICAgICAgICAgIDx0aGlzLnByb3BzLmxvZ29Db21wb25lbnQgYXBwTmFtZT17YXBwTmFtZX0gdmVyc2lvbj17dmVyc2lvbn0gLz5cbiAgICAgICAgICAgIDxTdHlsZWRQYW5lbFRvcEFjdGlvbnM+XG4gICAgICAgICAgICAgIHthY3Rpb25JdGVtcy5tYXAoaXRlbSA9PiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fcGFuZWwtaGVhZGVyX19yaWdodFwiXG4gICAgICAgICAgICAgICAgICBrZXk9e2l0ZW0uaWR9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e3Bvc2l0aW9uOiAncmVsYXRpdmUnfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8UGFuZWxBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgaXRlbT17aXRlbX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmRyb3Bkb3duQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93RXhwb3J0RHJvcGRvd24oaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub25DbGljaygpO1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIHtpdGVtLmRyb3Bkb3duQ29tcG9uZW50ID8gKFxuICAgICAgICAgICAgICAgICAgICA8aXRlbS5kcm9wZG93bkNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U9e2hpZGVFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICAgICAgICAgICAgICBzaG93PXt2aXNpYmxlRHJvcGRvd24gPT09IGl0ZW0uaWR9XG4gICAgICAgICAgICAgICAgICAgICAgb25TYXZlTWFwPXtvblNhdmVNYXB9XG4gICAgICAgICAgICAgICAgICAgICAgb25FeHBvcnREYXRhPXtvbkV4cG9ydERhdGF9XG4gICAgICAgICAgICAgICAgICAgICAgb25FeHBvcnRJbWFnZT17b25FeHBvcnRJbWFnZX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkV4cG9ydENvbmZpZz17b25FeHB