kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
174 lines (167 loc) • 32.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GeoArrowTextLayer = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _core = require("@deck.gl/core");
var _layers = require("@deck.gl/layers");
var ga = _interopRequireWildcard(require("@geoarrow/geoarrow-js"));
var _constants = require("@kepler.gl/constants");
var _utils = require("../utils/utils");
var _picking = require("../utils/picking");
var _validate = require("../utils/validate");
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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// deck.gl-community
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
/** All properties supported by GeoArrowTextLayer */
/** Properties added by GeoArrowTextLayer */
// Remove data and getPosition from the upstream default props
var _TextLayer$defaultPro = _layers.TextLayer.defaultProps,
_data = _TextLayer$defaultPro.data,
_getPosition = _TextLayer$defaultPro.getPosition,
_getText = _TextLayer$defaultPro.getText,
_getTextAnchor = _TextLayer$defaultPro.getTextAnchor,
_getAlignmentBaseline = _TextLayer$defaultPro.getAlignmentBaseline,
_getPixelOffset = _TextLayer$defaultPro.getPixelOffset,
_defaultProps = (0, _objectWithoutProperties2["default"])(_TextLayer$defaultPro, ["data", "getPosition", "getText", "getTextAnchor", "getAlignmentBaseline", "getPixelOffset"]);
// Default props added by us
var ourDefaultProps = {
getTextAnchor: 'middle',
getAlignmentBaseline: 'center',
getPixelOffset: [0, 0],
_validate: true
};
// @ts-expect-error Type 'Uint8Array' is not assignable to type 'RGBAColor'
var defaultProps = _objectSpread(_objectSpread({}, _defaultProps), ourDefaultProps);
var GeoArrowTextLayer = exports.GeoArrowTextLayer = /*#__PURE__*/function (_CompositeLayer) {
function GeoArrowTextLayer() {
(0, _classCallCheck2["default"])(this, GeoArrowTextLayer);
return _callSuper(this, GeoArrowTextLayer, arguments);
}
(0, _inherits2["default"])(GeoArrowTextLayer, _CompositeLayer);
return (0, _createClass2["default"])(GeoArrowTextLayer, [{
key: "getPickingInfo",
value: function getPickingInfo(params) {
return (0, _picking.getPickingInfo)(params, this.props.data);
}
}, {
key: "renderLayers",
value: function renderLayers() {
var table = this.props.data;
if (this.props.getPosition !== undefined) {
var geometryColumn = this.props.getPosition;
if (geometryColumn !== undefined && ga.vector.isPointVector(geometryColumn)) {
return this._renderLayersPoint(geometryColumn);
}
throw new Error('getPosition should pass in an arrow Vector of Point type');
} else {
var pointVector = (0, _utils.getGeometryVector)(table, _constants.GEOARROW_EXTENSIONS.POINT);
if (pointVector !== null) {
return this._renderLayersPoint(pointVector);
}
}
throw new Error('getPosition not GeoArrow point');
}
}, {
key: "_renderLayersPoint",
value: function _renderLayersPoint(geometryColumn) {
var table = this.props.data;
if (this.props._validate) {
(0, _utils.assert)(ga.vector.isPointVector(geometryColumn));
(0, _validate.validateAccessors)(this.props, table);
}
// Exclude manually-set accessors
var _extractAccessorsFrom = (0, _utils.extractAccessorsFromProps)(this.props, ['getPosition', 'getText']),
_extractAccessorsFrom2 = (0, _slicedToArray2["default"])(_extractAccessorsFrom, 2),
accessors = _extractAccessorsFrom2[0],
otherProps = _extractAccessorsFrom2[1];
var tableOffsets = (0, _picking.computeChunkOffsets)(table.data);
var layers = [];
for (var recordBatchIdx = 0; recordBatchIdx < table.batches.length; recordBatchIdx++) {
var geometryData = geometryColumn.data[recordBatchIdx];
var flatCoordsData = ga.child.getPointChild(geometryData);
var flatCoordinateArray = flatCoordsData.values;
var textData = this.props.getText.data[recordBatchIdx];
var numLabels = textData.length;
var textValues = textData.values;
var characterOffsets = textData.valueOffsets;
// @ts-expect-error how to properly retrieve batch offset?
var batchOffset = geometryColumn._offsets[recordBatchIdx];
var props = _objectSpread(_objectSpread(_objectSpread({}, ourDefaultProps), otherProps), {}, {
// used for picking purposes
recordBatchIdx: recordBatchIdx,
tableOffsets: tableOffsets,
id: "".concat(this.props.id, "-geoarrow-text-layer-").concat(recordBatchIdx),
data: {
data: table.batches[recordBatchIdx],
length: geometryData.length,
startIndices: characterOffsets,
attributes: {
// Positions need to be expanded to be one per character!
getPosition: {
value: (0, _utils.expandArrayToCoords)(flatCoordinateArray, geometryData.type.listSize, characterOffsets, numLabels),
size: geometryData.type.listSize
},
// TODO: support non-ascii characters
getText: {
value: textValues
// size: 1,
}
}
},
// TODO privide more robust data comparators
dataComparator: function dataComparator(d1, d2) {
return d1.data === d2.data;
},
_subLayerProps: {
characters: {
dataComparator: function dataComparator(d1, d2) {
return d1.data === d2.data;
}
}
}
});
for (var _i = 0, _Object$entries = Object.entries(accessors); _i < _Object$entries.length; _i++) {
var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
propName = _Object$entries$_i[0],
propInput = _Object$entries$_i[1];
(0, _utils.assignAccessor)({
props: props,
propName: propName,
propInput: propInput,
chunkIdx: recordBatchIdx,
geomCoordOffsets: characterOffsets,
batchOffset: batchOffset
});
}
var layer = new _layers.TextLayer(_objectSpread(_objectSpread({}, this.getSubLayerProps(props)), {}, {
// preserve binded accessors, as they are overwriten back by pass-through accessors from extensions
getFiltered: props.getFiltered,
getFilterValue: props.getFilterValue
}));
layers.push(layer);
}
return layers;
}
}]);
}(_core.CompositeLayer);
(0, _defineProperty2["default"])(GeoArrowTextLayer, "defaultProps", defaultProps);
(0, _defineProperty2["default"])(GeoArrowTextLayer, "layerName", 'GeoArrowTextLayer');
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbGF5ZXJzIiwiZ2EiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfcGlja2luZyIsIl92YWxpZGF0ZSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jYWxsU3VwZXIiLCJvIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX1RleHRMYXllciRkZWZhdWx0UHJvIiwiVGV4dExheWVyIiwiZGVmYXVsdFByb3BzIiwiX2RhdGEiLCJkYXRhIiwiX2dldFBvc2l0aW9uIiwiZ2V0UG9zaXRpb24iLCJfZ2V0VGV4dCIsImdldFRleHQiLCJfZ2V0VGV4dEFuY2hvciIsImdldFRleHRBbmNob3IiLCJfZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJnZXRBbGlnbm1lbnRCYXNlbGluZSIsIl9nZXRQaXhlbE9mZnNldCIsImdldFBpeGVsT2Zmc2V0IiwiX2RlZmF1bHRQcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJvdXJEZWZhdWx0UHJvcHMiLCJHZW9BcnJvd1RleHRMYXllciIsImV4cG9ydHMiLCJfQ29tcG9zaXRlTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImdldFBpY2tpbmdJbmZvIiwicGFyYW1zIiwicHJvcHMiLCJyZW5kZXJMYXllcnMiLCJ0YWJsZSIsInVuZGVmaW5lZCIsImdlb21ldHJ5Q29sdW1uIiwidmVjdG9yIiwiaXNQb2ludFZlY3RvciIsIl9yZW5kZXJMYXllcnNQb2ludCIsIkVycm9yIiwicG9pbnRWZWN0b3IiLCJnZXRHZW9tZXRyeVZlY3RvciIsIkdFT0FSUk9XX0VYVEVOU0lPTlMiLCJQT0lOVCIsImFzc2VydCIsInZhbGlkYXRlQWNjZXNzb3JzIiwiX2V4dHJhY3RBY2Nlc3NvcnNGcm9tIiwiZXh0cmFjdEFjY2Vzc29yc0Zyb21Qcm9wcyIsIl9leHRyYWN0QWNjZXNzb3JzRnJvbTIiLCJfc2xpY2VkVG9BcnJheTIiLCJhY2Nlc3NvcnMiLCJvdGhlclByb3BzIiwidGFibGVPZmZzZXRzIiwiY29tcHV0ZUNodW5rT2Zmc2V0cyIsImxheWVycyIsInJlY29yZEJhdGNoSWR4IiwiYmF0Y2hlcyIsImdlb21ldHJ5RGF0YSIsImZsYXRDb29yZHNEYXRhIiwiY2hpbGQiLCJnZXRQb2ludENoaWxkIiwiZmxhdENvb3JkaW5hdGVBcnJheSIsInZhbHVlcyIsInRleHREYXRhIiwibnVtTGFiZWxzIiwidGV4dFZhbHVlcyIsImNoYXJhY3Rlck9mZnNldHMiLCJ2YWx1ZU9mZnNldHMiLCJiYXRjaE9mZnNldCIsIl9vZmZzZXRzIiwiaWQiLCJjb25jYXQiLCJzdGFydEluZGljZXMiLCJhdHRyaWJ1dGVzIiwiZXhwYW5kQXJyYXlUb0Nvb3JkcyIsInR5cGUiLCJsaXN0U2l6ZSIsInNpemUiLCJkYXRhQ29tcGFyYXRvciIsImQxIiwiZDIiLCJfc3ViTGF5ZXJQcm9wcyIsImNoYXJhY3RlcnMiLCJfaSIsIl9PYmplY3QkZW50cmllcyIsImVudHJpZXMiLCJfT2JqZWN0JGVudHJpZXMkX2kiLCJwcm9wTmFtZSIsInByb3BJbnB1dCIsImFzc2lnbkFjY2Vzc29yIiwiY2h1bmtJZHgiLCJnZW9tQ29vcmRPZmZzZXRzIiwibGF5ZXIiLCJnZXRTdWJMYXllclByb3BzIiwiZ2V0RmlsdGVyZWQiLCJnZXRGaWx0ZXJWYWx1ZSIsIkNvbXBvc2l0ZUxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVycy9nZW8tYXJyb3ctdGV4dC1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBkZWNrLmdsLWNvbW11bml0eVxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IChjKSB2aXMuZ2wgY29udHJpYnV0b3JzXG5cbmltcG9ydCB7XG4gIENvbXBvc2l0ZUxheWVyLFxuICBDb21wb3NpdGVMYXllclByb3BzLFxuICBEZWZhdWx0UHJvcHMsXG4gIEdldFBpY2tpbmdJbmZvUGFyYW1zLFxuICBMYXllcixcbiAgTGF5ZXJzTGlzdFxufSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7VGV4dExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHR5cGUge1RleHRMYXllclByb3BzfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGdhIGZyb20gJ0BnZW9hcnJvdy9nZW9hcnJvdy1qcyc7XG5cbmltcG9ydCB7R0VPQVJST1dfRVhURU5TSU9OU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5pbXBvcnQge1xuICBhc3NpZ25BY2Nlc3NvcixcbiAgZXhwYW5kQXJyYXlUb0Nvb3JkcyxcbiAgZXh0cmFjdEFjY2Vzc29yc0Zyb21Qcm9wcyxcbiAgZ2V0R2VvbWV0cnlWZWN0b3Jcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtHZW9BcnJvd0V4dHJhUGlja2luZ1Byb3BzLCBjb21wdXRlQ2h1bmtPZmZzZXRzLCBnZXRQaWNraW5nSW5mb30gZnJvbSAnLi4vdXRpbHMvcGlja2luZyc7XG5pbXBvcnQge0NvbG9yQWNjZXNzb3IsIEZsb2F0QWNjZXNzb3IsIEdlb0Fycm93UGlja2luZ0luZm99IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQge3ZhbGlkYXRlQWNjZXNzb3JzfSBmcm9tICcuLi91dGlscy92YWxpZGF0ZSc7XG5cbi8qKiBBbGwgcHJvcGVydGllcyBzdXBwb3J0ZWQgYnkgR2VvQXJyb3dUZXh0TGF5ZXIgKi9cbmV4cG9ydCB0eXBlIEdlb0Fycm93VGV4dExheWVyUHJvcHMgPSBPbWl0PFxuICBUZXh0TGF5ZXJQcm9wczxhcnJvdy5UYWJsZT4sXG4gIC8vIFdlIHJlbW92ZSBiYWNrZ3JvdW5kIGZvciBub3cgYmVjYXVzZSB0aGVyZSBhcmUgc3BlY2lhbCByZXF1aXJlbWVudHMgZm9yXG4gIC8vIHVzaW5nIGJpbmFyeSBhdHRyaWJ1dGVzIHdpdGggYmFja2dyb3VuZFxuICAvLyBodHRwczovL2RlY2suZ2wvZG9jcy9hcGktcmVmZXJlbmNlL2xheWVycy90ZXh0LWxheWVyI3VzZS1iaW5hcnktYXR0cmlidXRlcy13aXRoLWJhY2tncm91bmRcbiAgfCAnYmFja2dyb3VuZCdcbiAgfCAnZGF0YSdcbiAgfCAnZ2V0QmFja2dyb3VuZENvbG9yJ1xuICB8ICdnZXRCb3JkZXJDb2xvcidcbiAgfCAnZ2V0Qm9yZGVyV2lkdGgnXG4gIHwgJ2dldFRleHQnXG4gIHwgJ2dldFBvc2l0aW9uJ1xuICB8ICdnZXRDb2xvcidcbiAgfCAnZ2V0U2l6ZSdcbiAgfCAnZ2V0QW5nbGUnXG4gIHwgJ2dldFRleHRBbmNob3InXG4gIHwgJ2dldEFsaWdubWVudEJhc2VsaW5lJ1xuICB8ICdnZXRQaXhlbE9mZnNldCdcbj4gJlxuICBfR2VvQXJyb3dUZXh0TGF5ZXJQcm9wcyAmXG4gIENvbXBvc2l0ZUxheWVyUHJvcHM7XG5cbi8qKiBQcm9wZXJ0aWVzIGFkZGVkIGJ5IEdlb0Fycm93VGV4dExheWVyICovXG50eXBlIF9HZW9BcnJvd1RleHRMYXllclByb3BzID0ge1xuICBkYXRhOiBhcnJvdy5UYWJsZTtcblxuICAvKiogQmFja2dyb3VuZCBjb2xvciBhY2Nlc3Nvci5cbiAgICogQGRlZmF1bHQgWzI1NSwgMjU1LCAyNTUsIDI1NV1cbiAgICovXG4gIGdldEJhY2tncm91bmRDb2xvcj86IENvbG9yQWNjZXNzb3I7XG4gIC8qKiBCb3JkZXIgY29sb3IgYWNjZXNzb3IuXG4gICAqIEBkZWZhdWx0IFswLCAwLCAwLCAyNTVdXG4gICAqL1xuICBnZXRCb3JkZXJDb2xvcj86IENvbG9yQWNjZXNzb3I7XG4gIC8qKiBCb3JkZXIgd2lkdGggYWNjZXNzb3IuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGdldEJvcmRlcldpZHRoPzogRmxvYXRBY2Nlc3NvcjtcbiAgLyoqXG4gICAqIExhYmVsIHRleHQgYWNjZXNzb3JcbiAgICovXG4gIGdldFRleHQ6IGFycm93LlZlY3RvcjxhcnJvdy5VdGY4PjtcbiAgLyoqXG4gICAqIEFuY2hvciBwb3NpdGlvbiBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0UG9zaXRpb24/OiBnYS52ZWN0b3IuUG9pbnRWZWN0b3I7XG4gIC8qKlxuICAgKiBMYWJlbCBjb2xvciBhY2Nlc3NvclxuICAgKiBAZGVmYXVsdCBbMCwgMCwgMCwgMjU1XVxuICAgKi9cbiAgZ2V0Q29sb3I/OiBDb2xvckFjY2Vzc29yO1xuICAvKipcbiAgICogTGFiZWwgc2l6ZSBhY2Nlc3NvclxuICAgKiBAZGVmYXVsdCAzMlxuICAgKi9cbiAgZ2V0U2l6ZT86IEZsb2F0QWNjZXNzb3I7XG4gIC8qKlxuICAgKiBMYWJlbCByb3RhdGlvbiBhY2Nlc3NvciwgaW4gZGVncmVlc1xuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBnZXRBbmdsZT86IEZsb2F0QWNjZXNzb3I7XG4gIC8qKlxuICAgKiBIb3Jpem9udGFsIGFsaWdubWVudCBhY2Nlc3NvclxuICAgKiBAZGVmYXVsdCAnbWlkZGxlJ1xuICAgKi9cbiAgZ2V0VGV4dEFuY2hvcj86IGFycm93LlZlY3RvcjxhcnJvdy5VdGY4PiB8ICdzdGFydCcgfCAnbWlkZGxlJyB8ICdlbmQnO1xuICAvKipcbiAgICogVmVydGljYWwgYWxpZ25tZW50IGFjY2Vzc29yXG4gICAqIEBkZWZhdWx0ICdjZW50ZXInXG4gICAqL1xuICBnZXRBbGlnbm1lbnRCYXNlbGluZT86IGFycm93LlZlY3RvcjxhcnJvdy5VdGY4PiB8ICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJztcbiAgLyoqXG4gICAqIExhYmVsIG9mZnNldCBmcm9tIHRoZSBhbmNob3IgcG9zaXRpb24sIFt4LCB5XSBpbiBwaXhlbHNcbiAgICogQGRlZmF1bHQgWzAsIDBdXG4gICAqL1xuICBnZXRQaXhlbE9mZnNldD86IGFycm93LlZlY3RvcjxhcnJvdy5GaXhlZFNpemVMaXN0PGFycm93LkludD4+IHwgW251bWJlciwgbnVtYmVyXTtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB2YWxpZGF0ZSB0aGUgYXJyYXlzIHByb3ZpZGVkIChlLmcuIGNodW5rIGxlbmd0aHMpXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIF92YWxpZGF0ZT86IGJvb2xlYW47XG59O1xuXG4vLyBSZW1vdmUgZGF0YSBhbmQgZ2V0UG9zaXRpb24gZnJvbSB0aGUgdXBzdHJlYW0gZGVmYXVsdCBwcm9wc1xuY29uc3Qge1xuICBkYXRhOiBfZGF0YSxcbiAgZ2V0UG9zaXRpb246IF9nZXRQb3NpdGlvbixcbiAgZ2V0VGV4dDogX2dldFRleHQsXG4gIGdldFRleHRBbmNob3I6IF9nZXRUZXh0QW5jaG9yLFxuICBnZXRBbGlnbm1lbnRCYXNlbGluZTogX2dldEFsaWdubWVudEJhc2VsaW5lLFxuICBnZXRQaXhlbE9mZnNldDogX2dldFBpeGVsT2Zmc2V0LFxuICAuLi5fZGVmYXVsdFByb3BzXG59ID0gVGV4dExheWVyLmRlZmF1bHRQcm9wcztcblxuLy8gRGVmYXVsdCBwcm9wcyBhZGRlZCBieSB1c1xuY29uc3Qgb3VyRGVmYXVsdFByb3BzOiBQaWNrPFxuICBHZW9BcnJvd1RleHRMYXllclByb3BzLFxuICAnZ2V0VGV4dEFuY2hvcicgfCAnZ2V0QWxpZ25tZW50QmFzZWxpbmUnIHwgJ2dldFBpeGVsT2Zmc2V0JyB8ICdfdmFsaWRhdGUnXG4+ID0ge1xuICBnZXRUZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6ICdjZW50ZXInLFxuICBnZXRQaXhlbE9mZnNldDogWzAsIDBdLFxuICBfdmFsaWRhdGU6IHRydWVcbn07XG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgVHlwZSAnVWludDhBcnJheScgaXMgbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnUkdCQUNvbG9yJ1xuY29uc3QgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHM8R2VvQXJyb3dUZXh0TGF5ZXJQcm9wcz4gPSB7XG4gIC4uLl9kZWZhdWx0UHJvcHMsXG4gIC4uLm91ckRlZmF1bHRQcm9wc1xufTtcblxuZXhwb3J0IGNsYXNzIEdlb0Fycm93VGV4dExheWVyPEV4dHJhUHJvcHMgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IGV4dGVuZHMgQ29tcG9zaXRlTGF5ZXI8XG4gIEdlb0Fycm93VGV4dExheWVyUHJvcHMgJiBFeHRyYVByb3BzXG4+IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdHZW9BcnJvd1RleHRMYXllcic7XG5cbiAgZ2V0UGlja2luZ0luZm8oXG4gICAgcGFyYW1zOiBHZXRQaWNraW5nSW5mb1BhcmFtcyAmIHtcbiAgICAgIHNvdXJjZUxheWVyOiB7cHJvcHM6IEdlb0Fycm93RXh0cmFQaWNraW5nUHJvcHN9O1xuICAgIH1cbiAgKTogR2VvQXJyb3dQaWNraW5nSW5mbyB7XG4gICAgcmV0dXJuIGdldFBpY2tpbmdJbmZvKHBhcmFtcywgdGhpcy5wcm9wcy5kYXRhKTtcbiAgfVxuXG4gIHJlbmRlckxheWVycygpOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhOiB0YWJsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZ2V0UG9zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZ2VvbWV0cnlDb2x1bW4gPSB0aGlzLnByb3BzLmdldFBvc2l0aW9uO1xuICAgICAgaWYgKGdlb21ldHJ5Q29sdW1uICE9PSB1bmRlZmluZWQgJiYgZ2EudmVjdG9yLmlzUG9pbnRWZWN0b3IoZ2VvbWV0cnlDb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJMYXllcnNQb2ludChnZW9tZXRyeUNvbHVtbik7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0UG9zaXRpb24gc2hvdWxkIHBhc3MgaW4gYW4gYXJyb3cgVmVjdG9yIG9mIFBvaW50IHR5cGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcG9pbnRWZWN0b3IgPSBnZXRHZW9tZXRyeVZlY3Rvcih0YWJsZSwgR0VPQVJST1dfRVhURU5TSU9OUy5QT0lOVCk7XG4gICAgICBpZiAocG9pbnRWZWN0b3IgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlckxheWVyc1BvaW50KHBvaW50VmVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFBvc2l0aW9uIG5vdCBHZW9BcnJvdyBwb2ludCcpO1xuICB9XG5cbiAgX3JlbmRlckxheWVyc1BvaW50KGdlb21ldHJ5Q29sdW1uOiBnYS52ZWN0b3IuUG9pbnRWZWN0b3IpOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhOiB0YWJsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuX3ZhbGlkYXRlKSB7XG4gICAgICBhc3NlcnQoZ2EudmVjdG9yLmlzUG9pbnRWZWN0b3IoZ2VvbWV0cnlDb2x1bW4pKTtcbiAgICAgIHZhbGlkYXRlQWNjZXNzb3JzKHRoaXMucHJvcHMsIHRhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBFeGNsdWRlIG1hbnVhbGx5LXNldCBhY2Nlc3NvcnNcbiAgICBjb25zdCBbYWNjZXNzb3JzLCBvdGhlclByb3BzXSA9IGV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHModGhpcy5wcm9wcywgW1xuICAgICAgJ2dldFBvc2l0aW9uJyxcbiAgICAgICdnZXRUZXh0J1xuICAgIF0pO1xuICAgIGNvbnN0IHRhYmxlT2Zmc2V0cyA9IGNvbXB1dGVDaHVua09mZnNldHModGFibGUuZGF0YSk7XG5cbiAgICBjb25zdCBsYXllcnM6IFRleHRMYXllcjxhbnk+W10gPSBbXTtcbiAgICBmb3IgKGxldCByZWNvcmRCYXRjaElkeCA9IDA7IHJlY29yZEJhdGNoSWR4IDwgdGFibGUuYmF0Y2hlcy5sZW5ndGg7IHJlY29yZEJhdGNoSWR4KyspIHtcbiAgICAgIGNvbnN0IGdlb21ldHJ5RGF0YSA9IGdlb21ldHJ5Q29sdW1uLmRhdGFbcmVjb3JkQmF0Y2hJZHhdO1xuICAgICAgY29uc3QgZmxhdENvb3Jkc0RhdGEgPSBnYS5jaGlsZC5nZXRQb2ludENoaWxkKGdlb21ldHJ5RGF0YSk7XG4gICAgICBjb25zdCBmbGF0Q29vcmRpbmF0ZUFycmF5ID0gZmxhdENvb3Jkc0RhdGEudmFsdWVzO1xuXG4gICAgICBjb25zdCB0ZXh0RGF0YSA9IHRoaXMucHJvcHMuZ2V0VGV4dC5kYXRhW3JlY29yZEJhdGNoSWR4XTtcbiAgICAgIGNvbnN0IG51bUxhYmVscyA9IHRleHREYXRhLmxlbmd0aDtcbiAgICAgIGNvbnN0IHRleHRWYWx1ZXMgPSB0ZXh0RGF0YS52YWx1ZXM7XG4gICAgICBjb25zdCBjaGFyYWN0ZXJPZmZzZXRzID0gdGV4dERhdGEudmFsdWVPZmZzZXRzO1xuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGhvdyB0byBwcm9wZXJseSByZXRyaWV2ZSBiYXRjaCBvZmZzZXQ/XG4gICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGdlb21ldHJ5Q29sdW1uLl9vZmZzZXRzW3JlY29yZEJhdGNoSWR4XTtcblxuICAgICAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgIC8vIE5vdGU6IGJlY2F1c2UgdGhpcyBpcyBhIGNvbXBvc2l0ZSBsYXllciBhbmQgbm90IGRvaW5nIHRoZSByZW5kZXJpbmdcbiAgICAgICAgLy8gaXRzZWxmLCB3ZSBzdGlsbCBoYXZlIHRvIHBhc3MgaW4gb3VyIGRlZmF1bHRQcm9wc1xuICAgICAgICAuLi5vdXJEZWZhdWx0UHJvcHMsXG4gICAgICAgIC4uLm90aGVyUHJvcHMsXG5cbiAgICAgICAgLy8gdXNlZCBmb3IgcGlja2luZyBwdXJwb3Nlc1xuICAgICAgICByZWNvcmRCYXRjaElkeCxcbiAgICAgICAgdGFibGVPZmZzZXRzLFxuXG4gICAgICAgIGlkOiBgJHt0aGlzLnByb3BzLmlkfS1nZW9hcnJvdy10ZXh0LWxheWVyLSR7cmVjb3JkQmF0Y2hJZHh9YCxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGRhdGE6IHRhYmxlLmJhdGNoZXNbcmVjb3JkQmF0Y2hJZHhdLFxuICAgICAgICAgIGxlbmd0aDogZ2VvbWV0cnlEYXRhLmxlbmd0aCxcbiAgICAgICAgICBzdGFydEluZGljZXM6IGNoYXJhY3Rlck9mZnNldHMsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgLy8gUG9zaXRpb25zIG5lZWQgdG8gYmUgZXhwYW5kZWQgdG8gYmUgb25lIHBlciBjaGFyYWN0ZXIhXG4gICAgICAgICAgICBnZXRQb3NpdGlvbjoge1xuICAgICAgICAgICAgICB2YWx1ZTogZXhwYW5kQXJyYXlUb0Nvb3JkcyhcbiAgICAgICAgICAgICAgICBmbGF0Q29vcmRpbmF0ZUFycmF5LFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5RGF0YS50eXBlLmxpc3RTaXplLFxuICAgICAgICAgICAgICAgIGNoYXJhY3Rlck9mZnNldHMsXG4gICAgICAgICAgICAgICAgbnVtTGFiZWxzXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHNpemU6IGdlb21ldHJ5RGF0YS50eXBlLmxpc3RTaXplXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBub24tYXNjaWkgY2hhcmFjdGVyc1xuICAgICAgICAgICAgZ2V0VGV4dDoge1xuICAgICAgICAgICAgICB2YWx1ZTogdGV4dFZhbHVlc1xuICAgICAgICAgICAgICAvLyBzaXplOiAxLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETyBwcml2aWRlIG1vcmUgcm9idXN0IGRhdGEgY29tcGFyYXRvcnNcbiAgICAgICAgZGF0YUNvbXBhcmF0b3I6IChkMToge2RhdGE6IHVua25vd259LCBkMjoge2RhdGE6IHVua25vd259KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGQxLmRhdGEgPT09IGQyLmRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIF9zdWJMYXllclByb3BzOiB7XG4gICAgICAgICAgY2hhcmFjdGVyczoge1xuICAgICAgICAgICAgZGF0YUNvbXBhcmF0b3I6IChkMToge2RhdGE6IHVua25vd259LCBkMjoge2RhdGE6IHVua25vd259KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBkMS5kYXRhID09PSBkMi5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BJbnB1dF0gb2YgT2JqZWN0LmVudHJpZXMoYWNjZXNzb3JzKSkge1xuICAgICAgICBhc3NpZ25BY2Nlc3Nvcih7XG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgcHJvcElucHV0LFxuICAgICAgICAgIGNodW5rSWR4OiByZWNvcmRCYXRjaElkeCxcbiAgICAgICAgICBnZW9tQ29vcmRPZmZzZXRzOiBjaGFyYWN0ZXJPZmZzZXRzLFxuICAgICAgICAgIGJhdGNoT2Zmc2V0XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYXllciA9IG5ldyBUZXh0TGF5ZXIoe1xuICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMocHJvcHMpLFxuICAgICAgICAvLyBwcmVzZXJ2ZSBiaW5kZWQgYWNjZXNzb3JzLCBhcyB0aGV5IGFyZSBvdmVyd3JpdGVuIGJhY2sgYnkgcGFzcy10aHJvdWdoIGFjY2Vzc29ycyBmcm9tIGV4dGVuc2lvbnNcbiAgICAgICAgZ2V0RmlsdGVyZWQ6IHByb3BzLmdldEZpbHRlcmVkLFxuICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogcHJvcHMuZ2V0RmlsdGVyVmFsdWVcbiAgICAgIH0pO1xuICAgICAgbGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQVFBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUdBLElBQUFFLEVBQUEsR0FBQUMsdUJBQUEsQ0FBQUgsT0FBQTtBQUVBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQU1BLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtBQUdBLElBQUFPLFNBQUEsR0FBQVAsT0FBQTtBQUFvRCxTQUFBUSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQU4sd0JBQUFNLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEsVUFBQUcsQ0FBQSxLQUFBQSxDQUFBLENBQUFWLEdBQUEsSUFBQVUsQ0FBQSxDQUFBQyxHQUFBLElBQUFQLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLEVBQUFNLENBQUEsRUFBQUcsQ0FBQSxJQUFBVCxDQUFBLENBQUFNLENBQUEsSUFBQWQsQ0FBQSxDQUFBYyxDQUFBLFlBQUFOLENBQUEsY0FBQVIsQ0FBQSxFQUFBRyxDQUFBLElBQUFBLENBQUEsQ0FBQWUsR0FBQSxDQUFBbEIsQ0FBQSxFQUFBUSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBVyxXQUFBaEIsQ0FBQSxFQUFBaUIsQ0FBQSxFQUFBcEIsQ0FBQSxXQUFBb0IsQ0FBQSxPQUFBQyxnQkFBQSxhQUFBRCxDQUFBLE9BQUFFLDJCQUFBLGFBQUFuQixDQUFBLEVBQUFvQix5QkFBQSxLQUFBQyxPQUFBLENBQUFDLFNBQUEsQ0FBQUwsQ0FBQSxFQUFBcEIsQ0FBQSxZQUFBcUIsZ0JBQUEsYUFBQWxCLENBQUEsRUFBQXVCLFdBQUEsSUFBQU4sQ0FBQSxDQUFBTyxLQUFBLENBQUF4QixDQUFBLEVBQUFILENBQUE7QUFBQSxTQUFBdUIsMEJBQUEsY0FBQXBCLENBQUEsSUFBQXlCLE9BQUEsQ0FBQUMsU0FBQSxDQUFBQyxPQUFBLENBQUFkLElBQUEsQ0FBQVEsT0FBQSxDQUFBQyxTQUFBLENBQUFHLE9BQUEsaUNBQUF6QixDQUFBLGFBQUFvQix5QkFBQSxZQUFBQSwwQkFBQSxhQUFBcEIsQ0FBQTtBQUFBLFNBQUE0QixRQUFBL0IsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQVEsTUFBQSxDQUFBcUIsSUFBQSxDQUFBaEMsQ0FBQSxPQUFBVyxNQUFBLENBQUFzQixxQkFBQSxRQUFBYixDQUFBLEdBQUFULE1BQUEsQ0FBQXNCLHFCQUFBLENBQUFqQyxDQUFBLEdBQUFFLENBQUEsS0FBQWtCLENBQUEsR0FBQUEsQ0FBQSxDQUFBYyxNQUFBLFdBQUFoQyxDQUFBLFdBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFpQyxVQUFBLE9BQUFoQyxDQUFBLENBQUFpQyxJQUFBLENBQUFULEtBQUEsQ0FBQXhCLENBQUEsRUFBQWlCLENBQUEsWUFBQWpCLENBQUE7QUFBQSxTQUFBa0MsY0FBQXJDLENBQUEsYUFBQUUsQ0FBQSxNQUFBQSxDQUFBLEdBQUFvQyxTQUFBLENBQUFDLE1BQUEsRUFBQXJDLENBQUEsVUFBQUMsQ0FBQSxXQUFBbUMsU0FBQSxDQUFBcEMsQ0FBQSxJQUFBb0MsU0FBQSxDQUFBcEMsQ0FBQSxRQUFBQSxDQUFBLE9BQUE2QixPQUFBLENBQUFwQixNQUFBLENBQUFSLENBQUEsT0FBQXFDLE9BQUEsV0FBQXRDLENBQUEsUUFBQXVDLGdCQUFBLGFBQUF6QyxDQUFBLEVBQUFFLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFTLE1BQUEsQ0FBQStCLHlCQUFBLEdBQUEvQixNQUFBLENBQUFnQyxnQkFBQSxDQUFBM0MsQ0FBQSxFQUFBVyxNQUFBLENBQUErQix5QkFBQSxDQUFBdkMsQ0FBQSxLQUFBNEIsT0FBQSxDQUFBcEIsTUFBQSxDQUFBUixDQUFBLEdBQUFxQyxPQUFBLFdBQUF0QyxDQUFBLElBQUFTLE1BQUEsQ0FBQUMsY0FBQSxDQUFBWixDQUFBLEVBQUFFLENBQUEsRUFBQVMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBVixDQUFBLEVBQUFELENBQUEsaUJBQUFGLENBQUEsSUEvQnBEO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUE0QkE7O0FBdUJBOztBQThEQTtBQUNBLElBQUE0QyxxQkFBQSxHQVFJQyxpQkFBUyxDQUFDQyxZQUFZO0VBUGxCQyxLQUFLLEdBQUFILHFCQUFBLENBQVhJLElBQUk7RUFDU0MsWUFBWSxHQUFBTCxxQkFBQSxDQUF6Qk0sV0FBVztFQUNGQyxRQUFRLEdBQUFQLHFCQUFBLENBQWpCUSxPQUFPO0VBQ1FDLGNBQWMsR0FBQVQscUJBQUEsQ0FBN0JVLGFBQWE7RUFDU0MscUJBQXFCLEdBQUFYLHFCQUFBLENBQTNDWSxvQkFBb0I7RUFDSkMsZUFBZSxHQUFBYixxQkFBQSxDQUEvQmMsY0FBYztFQUNYQyxhQUFhLE9BQUFDLHlCQUFBLGFBQUFoQixxQkFBQTs7QUFHbEI7QUFDQSxJQUFNaUIsZUFHTCxHQUFHO0VBQ0ZQLGFBQWEsRUFBRSxRQUFRO0VBQ3ZCRSxvQkFBb0IsRUFBRSxRQUFRO0VBQzlCRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ3RCNUQsU0FBUyxFQUFFO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBLElBQU1nRCxZQUFrRCxHQUFBVCxhQUFBLENBQUFBLGFBQUEsS0FDbkRzQixhQUFhLEdBQ2JFLGVBQWUsQ0FDbkI7QUFBQyxJQUVXQyxpQkFBaUIsR0FBQUMsT0FBQSxDQUFBRCxpQkFBQSwwQkFBQUUsZUFBQTtFQUFBLFNBQUFGLGtCQUFBO0lBQUEsSUFBQUcsZ0JBQUEsbUJBQUFILGlCQUFBO0lBQUEsT0FBQTNDLFVBQUEsT0FBQTJDLGlCQUFBLEVBQUF4QixTQUFBO0VBQUE7RUFBQSxJQUFBNEIsVUFBQSxhQUFBSixpQkFBQSxFQUFBRSxlQUFBO0VBQUEsV0FBQUcsYUFBQSxhQUFBTCxpQkFBQTtJQUFBTSxHQUFBO0lBQUFDLEtBQUEsRUFNNUIsU0FBQUMsY0FBY0EsQ0FDWkMsTUFFQyxFQUNvQjtNQUNyQixPQUFPLElBQUFELHVCQUFjLEVBQUNDLE1BQU0sRUFBRSxJQUFJLENBQUNDLEtBQUssQ0FBQ3hCLElBQUksQ0FBQztJQUNoRDtFQUFDO0lBQUFvQixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBSSxZQUFZQSxDQUFBLEVBQXNDO01BQ2hELElBQWFDLEtBQUssR0FBSSxJQUFJLENBQUNGLEtBQUssQ0FBekJ4QixJQUFJO01BRVgsSUFBSSxJQUFJLENBQUN3QixLQUFLLENBQUN0QixXQUFXLEtBQUt5QixTQUFTLEVBQUU7UUFDeEMsSUFBTUMsY0FBYyxHQUFHLElBQUksQ0FBQ0osS0FBSyxDQUFDdEIsV0FBVztRQUM3QyxJQUFJMEIsY0FBYyxLQUFLRCxTQUFTLElBQUlsRixFQUFFLENBQUNvRixNQUFNLENBQUNDLGFBQWEsQ0FBQ0YsY0FBYyxDQUFDLEVBQUU7VUFDM0UsT0FBTyxJQUFJLENBQUNHLGtCQUFrQixDQUFDSCxjQUFjLENBQUM7UUFDaEQ7UUFFQSxNQUFNLElBQUlJLEtBQUssQ0FBQywwREFBMEQsQ0FBQztNQUM3RSxDQUFDLE1BQU07UUFDTCxJQUFNQyxXQUFXLEdBQUcsSUFBQUMsd0JBQWlCLEVBQUNSLEtBQUssRUFBRVMsOEJBQW1CLENBQUNDLEtBQUssQ0FBQztRQUN2RSxJQUFJSCxXQUFXLEtBQUssSUFBSSxFQUFFO1VBQ3hCLE9BQU8sSUFBSSxDQUFDRixrQkFBa0IsQ0FBQ0UsV0FBVyxDQUFDO1FBQzdDO01BQ0Y7TUFFQSxNQUFNLElBQUlELEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztJQUNuRDtFQUFDO0lBQUFaLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFVLGtCQUFrQkEsQ0FBQ0gsY0FBcUMsRUFBcUM7TUFDM0YsSUFBYUYsS0FBSyxHQUFJLElBQUksQ0FBQ0YsS0FBSyxDQUF6QnhCLElBQUk7TUFFWCxJQUFJLElBQUksQ0FBQ3dCLEtBQUssQ0FBQzFFLFNBQVMsRUFBRTtRQUN4QixJQUFBdUYsYUFBTSxFQUFDNUYsRUFBRSxDQUFDb0YsTUFBTSxDQUFDQyxhQUFhLENBQUNGLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLElBQUFVLDJCQUFpQixFQUFDLElBQUksQ0FBQ2QsS0FBSyxFQUFFRSxLQUFLLENBQUM7TUFDdEM7O01BRUE7TUFDQSxJQUFBYSxxQkFBQSxHQUFnQyxJQUFBQyxnQ0FBeUIsRUFBQyxJQUFJLENBQUNoQixLQUFLLEVBQUUsQ0FDcEUsYUFBYSxFQUNiLFNBQVMsQ0FDVixDQUFDO1FBQUFpQixzQkFBQSxPQUFBQyxlQUFBLGFBQUFILHFCQUFBO1FBSEtJLFNBQVMsR0FBQUYsc0JBQUE7UUFBRUcsVUFBVSxHQUFBSCxzQkFBQTtNQUk1QixJQUFNSSxZQUFZLEdBQUcsSUFBQUMsNEJBQW1CLEVBQUNwQixLQUFLLENBQUMxQixJQUFJLENBQUM7TUFFcEQsSUFBTStDLE1BQXdCLEdBQUcsRUFBRTtNQUNuQyxLQUFLLElBQUlDLGNBQWMsR0FBRyxDQUFDLEVBQUVBLGNBQWMsR0FBR3RCLEtBQUssQ0FBQ3VCLE9BQU8sQ0FBQzFELE1BQU0sRUFBRXlELGNBQWMsRUFBRSxFQUFFO1FBQ3BGLElBQU1FLFlBQVksR0FBR3RCLGNBQWMsQ0FBQzVCLElBQUksQ0FBQ2dELGNBQWMsQ0FBQztRQUN4RCxJQUFNRyxjQUFjLEdBQUcxRyxFQUFFLENBQUMyRyxLQUFLLENBQUNDLGFBQWEsQ0FBQ0gsWUFBWSxDQUFDO1FBQzNELElBQU1JLG1CQUFtQixHQUFHSCxjQUFjLENBQUNJLE1BQU07UUFFakQsSUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ2hDLEtBQUssQ0FBQ3BCLE9BQU8sQ0FBQ0osSUFBSSxDQUFDZ0QsY0FBYyxDQUFDO1FBQ3hELElBQU1TLFNBQVMsR0FBR0QsUUFBUSxDQUFDakUsTUFBTTtRQUNqQyxJQUFNbUUsVUFBVSxHQUFHRixRQUFRLENBQUNELE1BQU07UUFDbEMsSUFBTUksZ0JBQWdCLEdBQUdILFFBQVEsQ0FBQ0ksWUFBWTs7UUFFOUM7UUFDQSxJQUFNQyxXQUFXLEdBQUdqQyxjQUFjLENBQUNrQyxRQUFRLENBQUNkLGNBQWMsQ0FBQztRQUUzRCxJQUFNeEIsS0FBMEIsR0FBQW5DLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLEtBRzNCd0IsZUFBZSxHQUNmK0IsVUFBVTtVQUViO1VBQ0FJLGNBQWMsRUFBZEEsY0FBYztVQUNkSCxZQUFZLEVBQVpBLFlBQVk7VUFFWmtCLEVBQUUsS0FBQUMsTUFBQSxDQUFLLElBQUksQ0FBQ3hDLEtBQUssQ0FBQ3VDLEVBQUUsMkJBQUFDLE1BQUEsQ0FBd0JoQixjQUFjLENBQUU7VUFDNURoRCxJQUFJLEVBQUU7WUFDSkEsSUFBSSxFQUFFMEIsS0FBSyxDQUFDdUIsT0FBTyxDQUFDRCxjQUFjLENBQUM7WUFDbkN6RCxNQUFNLEVBQUUyRCxZQUFZLENBQUMzRCxNQUFNO1lBQzNCMEUsWUFBWSxFQUFFTixnQkFBZ0I7WUFDOUJPLFVBQVUsRUFBRTtjQUNWO2NBQ0FoRSxXQUFXLEVBQUU7Z0JBQ1htQixLQUFLLEVBQUUsSUFBQThDLDBCQUFtQixFQUN4QmIsbUJBQW1CLEVBQ25CSixZQUFZLENBQUNrQixJQUFJLENBQUNDLFFBQVEsRUFDMUJWLGdCQUFnQixFQUNoQkYsU0FDRixDQUFDO2dCQUNEYSxJQUFJLEVBQUVwQixZQUFZLENBQUNrQixJQUFJLENBQUNDO2NBQzFCLENBQUM7Y0FDRDtjQUNBakUsT0FBTyxFQUFFO2dCQUNQaUIsS0FBSyxFQUFFcUM7Z0JBQ1A7Y0FDRjtZQUNGO1VBQ0YsQ0FBQztVQUNEO1VBQ0FhLGNBQWMsRUFBRSxTQUFoQkEsY0FBY0EsQ0FBR0MsRUFBbUIsRUFBRUMsRUFBbUIsRUFBSztZQUM1RCxPQUFPRCxFQUFFLENBQUN4RSxJQUFJLEtBQUt5RSxFQUFFLENBQUN6RSxJQUFJO1VBQzVCLENBQUM7VUFDRDBFLGNBQWMsRUFBRTtZQUNkQyxVQUFVLEVBQUU7Y0FDVkosY0FBYyxFQUFFLFNBQWhCQSxjQUFjQSxDQUFHQyxFQUFtQixFQUFFQyxFQUFtQixFQUFLO2dCQUM1RCxPQUFPRCxFQUFFLENBQUN4RSxJQUFJLEtBQUt5RSxFQUFFLENBQUN6RSxJQUFJO2NBQzVCO1lBQ0Y7VUFDRjtRQUFDLEVBQ0Y7UUFFRCxTQUFBNEUsRUFBQSxNQUFBQyxlQUFBLEdBQW9DbEgsTUFBTSxDQUFDbUgsT0FBTyxDQUFDbkMsU0FBUyxDQUFDLEVBQUFpQyxFQUFBLEdBQUFDLGVBQUEsQ0FBQXRGLE1BQUEsRUFBQXFGLEVBQUEsSUFBRTtVQUExRCxJQUFBRyxrQkFBQSxPQUFBckMsZUFBQSxhQUFBbUMsZUFBQSxDQUFBRCxFQUFBO1lBQU9JLFFBQVEsR0FBQUQsa0JBQUE7WUFBRUUsU0FBUyxHQUFBRixrQkFBQTtVQUM3QixJQUFBRyxxQkFBYyxFQUFDO1lBQ2IxRCxLQUFLLEVBQUxBLEtBQUs7WUFDTHdELFFBQVEsRUFBUkEsUUFBUTtZQUNSQyxTQUFTLEVBQVRBLFNBQVM7WUFDVEUsUUFBUSxFQUFFbkMsY0FBYztZQUN4Qm9DLGdCQUFnQixFQUFFekIsZ0JBQWdCO1lBQ2xDRSxXQUFXLEVBQVhBO1VBQ0YsQ0FBQyxDQUFDO1FBQ0o7UUFFQSxJQUFNd0IsS0FBSyxHQUFHLElBQUl4RixpQkFBUyxDQUFBUixhQUFBLENBQUFBLGFBQUEsS0FDdEIsSUFBSSxDQUFDaUcsZ0JBQWdCLENBQUM5RCxLQUFLLENBQUM7VUFDL0I7VUFDQStELFdBQVcsRUFBRS9ELEtBQUssQ0FBQytELFdBQVc7VUFDOUJDLGNBQWMsRUFBRWhFLEtBQUssQ0FBQ2dFO1FBQWMsRUFDckMsQ0FBQztRQUNGekMsTUFBTSxDQUFDM0QsSUFBSSxDQUFDaUcsS0FBSyxDQUFDO01BQ3BCO01BRUEsT0FBT3RDLE1BQU07SUFDZjtFQUFDO0FBQUEsRUFsSXdFMEMsb0JBQWM7QUFBQSxJQUFBaEcsZ0JBQUEsYUFBNUVxQixpQkFBaUIsa0JBR05oQixZQUFZO0FBQUEsSUFBQUwsZ0JBQUEsYUFIdkJxQixpQkFBaUIsZUFJVCxtQkFBbUIiLCJpZ25vcmVMaXN0IjpbXX0=