kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
351 lines (342 loc) • 47.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.WGS84ToPseudoMercator = WGS84ToPseudoMercator;
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _webMercator = require("@math.gl/web-mercator");
var _typed = require("@deck.gl/core/typed");
var _typed2 = require("@deck.gl/layers/typed");
var _wms = require("@loaders.gl/wms");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _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 _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// TODO: This is a modified copy of WMSLayer from deck.gl. Remove this once we upgrade deck.gl and loaders.gl.
/** All props supported by the TileLayer */
/** Props added by the TileLayer */
var defaultProps = {
id: 'imagery-layer',
data: '',
serviceType: 'auto',
srs: 'auto',
layers: {
type: 'array',
compare: true,
value: []
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
onMetadataLoad: {
type: 'function',
value: function value() {}
},
// eslint-disable-next-line
onMetadataLoadError: {
type: 'function',
value: console.error
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
onImageLoadStart: {
type: 'function',
value: function value() {}
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
onImageLoad: {
type: 'function',
value: function value() {}
},
onImageLoadError: {
type: 'function',
compare: false,
// eslint-disable-next-line
value: function value(requestId, error) {
return console.error(error, requestId);
}
}
};
var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
function WMSLayer() {
(0, _classCallCheck2["default"])(this, WMSLayer);
return _callSuper(this, WMSLayer, arguments);
}
(0, _inherits2["default"])(WMSLayer, _CompositeLayer);
return (0, _createClass2["default"])(WMSLayer, [{
key: "isLoaded",
get: /** Returns true if all async resources are loaded */
function get() {
// Track the explicit loading done by this layer
return Boolean(this.state) && this.state.loadCounter === 0 && _superPropGet(WMSLayer, "isLoaded", this, 1);
}
/** Lets deck.gl know that we want viewport change events */
}, {
key: "shouldUpdateState",
value: function shouldUpdateState() {
return true;
}
}, {
key: "initializeState",
value: function initializeState() {
// intentionally empty, initialization is done in updateState
this.state._nextRequestId = 0;
this.state.lastRequestId = -1;
this.state.loadCounter = 0;
}
}, {
key: "updateState",
value: function updateState(_ref) {
var _this = this;
var changeFlags = _ref.changeFlags,
props = _ref.props,
oldProps = _ref.oldProps;
var viewport = this.context.viewport;
// Check if data source has changed
if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {
this.state.imageSource = this._createImageSource(props);
this._loadMetadata();
this.debounce(function () {
return _this.loadImage(viewport, 'image source changed');
}, 0);
} else if (!(0, _typed._deepEqual)(props.layers, oldProps.layers, 1)) {
this.debounce(function () {
return _this.loadImage(viewport, 'layers changed');
}, 0);
} else if (changeFlags.viewportChanged) {
this.debounce(function () {
return _this.loadImage(viewport, 'viewport changed');
});
}
}
}, {
key: "renderLayers",
value: function renderLayers() {
var _this$state = this.state,
bounds = _this$state.bounds,
image = _this$state.image,
lastRequestParameters = _this$state.lastRequestParameters;
return image && new _typed2.BitmapLayer(_objectSpread(_objectSpread({}, this.getSubLayerProps({
id: 'bitmap'
})), {}, {
_imageCoordinateSystem: lastRequestParameters.srs === 'EPSG:4326' ? _typed.COORDINATE_SYSTEM.LNGLAT : _typed.COORDINATE_SYSTEM.CARTESIAN,
bounds: bounds,
image: image,
pickable: this.props.pickable
}));
}
}, {
key: "getFeatureInfoText",
value: function () {
var _getFeatureInfoText = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(x, y) {
var lastRequestParameters, _this$state$imageSour, _this$state$imageSour2, featureInfo;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
lastRequestParameters = this.state.lastRequestParameters;
if (!lastRequestParameters) {
_context.next = 6;
break;
}
_context.next = 4;
return (_this$state$imageSour = (_this$state$imageSour2 = this.state.imageSource).getFeatureInfoText) === null || _this$state$imageSour === void 0 ? void 0 : _this$state$imageSour.call(_this$state$imageSour2, _objectSpread(_objectSpread({}, lastRequestParameters), {}, {
query_layers: lastRequestParameters.layers,
x: x,
y: y,
info_format: 'application/vnd.ogc.gml'
}));
case 4:
featureInfo = _context.sent;
return _context.abrupt("return", featureInfo);
case 6:
return _context.abrupt("return", '');
case 7:
case "end":
return _context.stop();
}
}, _callee, this);
}));
function getFeatureInfoText(_x, _x2) {
return _getFeatureInfoText.apply(this, arguments);
}
return getFeatureInfoText;
}()
}, {
key: "_createImageSource",
value: function _createImageSource(props) {
if (props.data instanceof _wms.ImageSource) {
return props.data;
}
if (typeof props.data === 'string') {
return (0, _wms.createImageSource)({
url: props.data,
loadOptions: props.loadOptions,
type: props.serviceType
});
}
throw new Error('invalid image source in props.data');
}
/** Run a getMetadata on the image service */
}, {
key: "_loadMetadata",
value: (function () {
var _loadMetadata2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
var imageSource, metadata, _this$getCurrentLayer, _this$getCurrentLayer2;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
imageSource = this.state.imageSource;
_context2.prev = 1;
this.state.loadCounter++;
_context2.next = 5;
return imageSource.getMetadata();
case 5:
metadata = _context2.sent;
// If a request takes a long time, it may no longer be expected
if (this.state.imageSource === imageSource) {
(_this$getCurrentLayer = this.getCurrentLayer()) === null || _this$getCurrentLayer === void 0 || _this$getCurrentLayer.props.onMetadataLoad(metadata);
}
_context2.next = 12;
break;
case 9:
_context2.prev = 9;
_context2.t0 = _context2["catch"](1);
(_this$getCurrentLayer2 = this.getCurrentLayer()) === null || _this$getCurrentLayer2 === void 0 || _this$getCurrentLayer2.props.onMetadataLoadError(_context2.t0);
case 12:
_context2.prev = 12;
this.state.loadCounter--;
return _context2.finish(12);
case 15:
case "end":
return _context2.stop();
}
}, _callee2, this, [[1, 9, 12, 15]]);
}));
function _loadMetadata() {
return _loadMetadata2.apply(this, arguments);
}
return _loadMetadata;
}() /** Load an image */)
}, {
key: "loadImage",
value: (function () {
var _loadImage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(viewport, _reason) {
var _this$props, layers, serviceType, transparent, bounds, width, height, requestId, srs, requestParams, _WGS84ToPseudoMercato, _WGS84ToPseudoMercato2, minX, minY, _WGS84ToPseudoMercato3, _WGS84ToPseudoMercato4, maxX, maxY, image, _this$getCurrentLayer3, _this$context$onError, _this$context, _this$getCurrentLayer4;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_this$props = this.props, layers = _this$props.layers, serviceType = _this$props.serviceType, transparent = _this$props.transparent; // TODO - move to ImageSource?
if (!(serviceType === 'wms' && layers.length === 0)) {
_context3.next = 3;
break;
}
return _context3.abrupt("return");
case 3:
bounds = viewport.getBounds();
width = viewport.width, height = viewport.height;
requestId = this.getRequestId();
srs = this.props.srs;
if (srs === 'auto') {
// BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)
srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';
}
requestParams = {
width: width,
height: height,
// TODO: remove bbox once deck.gl is upgraded to ^8.10 with loaders.gl ^4
bbox: bounds,
boundingBox: [[bounds[0], bounds[1]], [bounds[2], bounds[3]]],
layers: layers,
srs: srs,
transparent: transparent
};
if (srs === 'EPSG:3857') {
_WGS84ToPseudoMercato = WGS84ToPseudoMercator([bounds[0], bounds[1]]), _WGS84ToPseudoMercato2 = (0, _slicedToArray2["default"])(_WGS84ToPseudoMercato, 2), minX = _WGS84ToPseudoMercato2[0], minY = _WGS84ToPseudoMercato2[1];
_WGS84ToPseudoMercato3 = WGS84ToPseudoMercator([bounds[2], bounds[3]]), _WGS84ToPseudoMercato4 = (0, _slicedToArray2["default"])(_WGS84ToPseudoMercato3, 2), maxX = _WGS84ToPseudoMercato4[0], maxY = _WGS84ToPseudoMercato4[1];
requestParams.boundingBox = [[minX, minY], [maxX, maxY]];
// TODO: remove bbox once deck.gl is upgraded to ^8.10 with loaders.gl ^4
requestParams.bbox = [minX, minY, maxX, maxY];
}
_context3.prev = 10;
this.state.loadCounter++;
this.props.onImageLoadStart(requestId);
_context3.next = 15;
return this.state.imageSource.getImage(requestParams);
case 15:
image = _context3.sent;
// If a request takes a long time, later requests may have already loaded.
if (this.state.lastRequestId < requestId) {
(_this$getCurrentLayer3 = this.getCurrentLayer()) === null || _this$getCurrentLayer3 === void 0 || _this$getCurrentLayer3.props.onImageLoad(requestId);
// Not type safe...
this.setState({
image: image,
bounds: bounds,
lastRequestParameters: requestParams,
lastRequestId: requestId
});
}
_context3.next = 23;
break;
case 19:
_context3.prev = 19;
_context3.t0 = _context3["catch"](10);
(_this$context$onError = (_this$context = this.context).onError) === null || _this$context$onError === void 0 || _this$context$onError.call(_this$context, _context3.t0, this);
(_this$getCurrentLayer4 = this.getCurrentLayer()) === null || _this$getCurrentLayer4 === void 0 || _this$getCurrentLayer4.props.onImageLoadError(requestId, _context3.t0);
case 23:
_context3.prev = 23;
this.state.loadCounter--;
return _context3.finish(23);
case 26:
case "end":
return _context3.stop();
}
}, _callee3, this, [[10, 19, 23, 26]]);
}));
function loadImage(_x3, _x4) {
return _loadImage.apply(this, arguments);
}
return loadImage;
}() // HELPERS
/** Global counter for issuing unique request ids */
)
}, {
key: "getRequestId",
value: function getRequestId() {
return this.state._nextRequestId++;
}
/** Runs an action in the future, cancels it if the new action is issued before it executes */
}, {
key: "debounce",
value: function debounce(fn) {
var ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;
clearTimeout(this.state._timeoutId);
this.state._timeoutId = setTimeout(function () {
return fn();
}, ms);
}
}]);
}(_typed.CompositeLayer); // https://epsg.io/3857
// +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs
(0, _defineProperty2["default"])(WMSLayer, "layerName", 'WMSLayer');
(0, _defineProperty2["default"])(WMSLayer, "defaultProps", defaultProps);
var HALF_EARTH_CIRCUMFERENCE = 6378137 * Math.PI;
/** Projects EPSG:4326 to EPSG:3857
* This is a lightweight replacement of proj4. Use tests to ensure conformance.
*/
function WGS84ToPseudoMercator(coord) {
var mercator = (0, _webMercator.lngLatToWorld)(coord);
mercator[0] = (mercator[0] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
mercator[1] = (mercator[1] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
return mercator;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViTWVyY2F0b3IiLCJyZXF1aXJlIiwiX3R5cGVkIiwiX3R5cGVkMiIsIl93bXMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsIl9zdXBlclByb3BHZXQiLCJwIiwiX2dldDIiLCJkZWZhdWx0UHJvcHMiLCJpZCIsImRhdGEiLCJzZXJ2aWNlVHlwZSIsInNycyIsImxheWVycyIsInR5cGUiLCJjb21wYXJlIiwidmFsdWUiLCJvbk1ldGFkYXRhTG9hZCIsIm9uTWV0YWRhdGFMb2FkRXJyb3IiLCJjb25zb2xlIiwiZXJyb3IiLCJvbkltYWdlTG9hZFN0YXJ0Iiwib25JbWFnZUxvYWQiLCJvbkltYWdlTG9hZEVycm9yIiwicmVxdWVzdElkIiwiV01TTGF5ZXIiLCJleHBvcnRzIiwiX0NvbXBvc2l0ZUxheWVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiZ2V0Iiwic3RhdGUiLCJsb2FkQ291bnRlciIsInNob3VsZFVwZGF0ZVN0YXRlIiwiaW5pdGlhbGl6ZVN0YXRlIiwiX25leHRSZXF1ZXN0SWQiLCJsYXN0UmVxdWVzdElkIiwidXBkYXRlU3RhdGUiLCJfcmVmIiwiX3RoaXMiLCJjaGFuZ2VGbGFncyIsInByb3BzIiwib2xkUHJvcHMiLCJ2aWV3cG9ydCIsImNvbnRleHQiLCJkYXRhQ2hhbmdlZCIsImltYWdlU291cmNlIiwiX2NyZWF0ZUltYWdlU291cmNlIiwiX2xvYWRNZXRhZGF0YSIsImRlYm91bmNlIiwibG9hZEltYWdlIiwiZGVlcEVxdWFsIiwidmlld3BvcnRDaGFuZ2VkIiwicmVuZGVyTGF5ZXJzIiwiX3RoaXMkc3RhdGUiLCJib3VuZHMiLCJpbWFnZSIsImxhc3RSZXF1ZXN0UGFyYW1ldGVycyIsIkJpdG1hcExheWVyIiwiZ2V0U3ViTGF5ZXJQcm9wcyIsIl9pbWFnZUNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkxOR0xBVCIsIkNBUlRFU0lBTiIsInBpY2thYmxlIiwiX2dldEZlYXR1cmVJbmZvVGV4dCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwieCIsInkiLCJfdGhpcyRzdGF0ZSRpbWFnZVNvdXIiLCJfdGhpcyRzdGF0ZSRpbWFnZVNvdXIyIiwiZmVhdHVyZUluZm8iLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0RmVhdHVyZUluZm9UZXh0IiwicXVlcnlfbGF5ZXJzIiwiaW5mb19mb3JtYXQiLCJzZW50IiwiYWJydXB0Iiwic3RvcCIsIl94IiwiX3gyIiwiSW1hZ2VTb3VyY2UiLCJjcmVhdGVJbWFnZVNvdXJjZSIsInVybCIsImxvYWRPcHRpb25zIiwiRXJyb3IiLCJfbG9hZE1ldGFkYXRhMiIsIl9jYWxsZWUyIiwibWV0YWRhdGEiLCJfdGhpcyRnZXRDdXJyZW50TGF5ZXIiLCJfdGhpcyRnZXRDdXJyZW50TGF5ZXIyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZ2V0TWV0YWRhdGEiLCJnZXRDdXJyZW50TGF5ZXIiLCJ0MCIsImZpbmlzaCIsIl9sb2FkSW1hZ2UiLCJfY2FsbGVlMyIsIl9yZWFzb24iLCJfdGhpcyRwcm9wcyIsInRyYW5zcGFyZW50Iiwid2lkdGgiLCJoZWlnaHQiLCJyZXF1ZXN0UGFyYW1zIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvMiIsIm1pblgiLCJtaW5ZIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvMyIsIl9XR1M4NFRvUHNldWRvTWVyY2F0bzQiLCJtYXhYIiwibWF4WSIsIl90aGlzJGdldEN1cnJlbnRMYXllcjMiLCJfdGhpcyRjb250ZXh0JG9uRXJyb3IiLCJfdGhpcyRjb250ZXh0IiwiX3RoaXMkZ2V0Q3VycmVudExheWVyNCIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsImdldEJvdW5kcyIsImdldFJlcXVlc3RJZCIsInJlc29sdXRpb24iLCJiYm94IiwiYm91bmRpbmdCb3giLCJXR1M4NFRvUHNldWRvTWVyY2F0b3IiLCJfc2xpY2VkVG9BcnJheTIiLCJnZXRJbWFnZSIsInNldFN0YXRlIiwib25FcnJvciIsIl94MyIsIl94NCIsImZuIiwibXMiLCJ1bmRlZmluZWQiLCJjbGVhclRpbWVvdXQiLCJfdGltZW91dElkIiwic2V0VGltZW91dCIsIkNvbXBvc2l0ZUxheWVyIiwiSEFMRl9FQVJUSF9DSVJDVU1GRVJFTkNFIiwiTWF0aCIsIlBJIiwiY29vcmQiLCJtZXJjYXRvciIsImxuZ0xhdFRvV29ybGQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvd21zL3dtcy1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge2xuZ0xhdFRvV29ybGR9IGZyb20gJ0BtYXRoLmdsL3dlYi1tZXJjYXRvcic7XG5cbmltcG9ydCB7XG4gIExheWVyLFxuICBDb21wb3NpdGVMYXllcixcbiAgQ29tcG9zaXRlTGF5ZXJQcm9wcyxcbiAgVXBkYXRlUGFyYW1ldGVycyxcbiAgRGVmYXVsdFByb3BzLFxuICBWaWV3cG9ydCxcbiAgQ09PUkRJTkFURV9TWVNURU0sXG4gIF9kZWVwRXF1YWwgYXMgZGVlcEVxdWFsXG59IGZyb20gJ0BkZWNrLmdsL2NvcmUvdHlwZWQnO1xuaW1wb3J0IHtCaXRtYXBMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzL3R5cGVkJztcbmltcG9ydCB7SW1hZ2VTb3VyY2UsIGNyZWF0ZUltYWdlU291cmNlfSBmcm9tICdAbG9hZGVycy5nbC93bXMnO1xuXG5pbXBvcnQgdHlwZSB7SW1hZ2VTb3VyY2VNZXRhZGF0YX0gZnJvbSAnQGxvYWRlcnMuZ2wvbG9hZGVyLXV0aWxzJztcbmltcG9ydCB0eXBlIHtJbWFnZVR5cGUsIEltYWdlU2VydmljZVR5cGV9IGZyb20gJ0Bsb2FkZXJzLmdsL3dtcyc7XG5cbi8vIFRPRE86IFRoaXMgaXMgYSBtb2RpZmllZCBjb3B5IG9mIFdNU0xheWVyIGZyb20gZGVjay5nbC4gUmVtb3ZlIHRoaXMgb25jZSB3ZSB1cGdyYWRlIGRlY2suZ2wgYW5kIGxvYWRlcnMuZ2wuXG5cbi8qKiBBbGwgcHJvcHMgc3VwcG9ydGVkIGJ5IHRoZSBUaWxlTGF5ZXIgKi9cbmV4cG9ydCB0eXBlIFdNU0xheWVyUHJvcHMgPSBDb21wb3NpdGVMYXllclByb3BzICYgX1dNU0xheWVyUHJvcHM7XG5cbi8qKiBQcm9wcyBhZGRlZCBieSB0aGUgVGlsZUxheWVyICovXG50eXBlIF9XTVNMYXllclByb3BzID0ge1xuICBkYXRhOiBzdHJpbmcgfCBJbWFnZVNvdXJjZTtcbiAgc2VydmljZVR5cGU/OiBJbWFnZVNlcnZpY2VUeXBlIHwgJ2F1dG8nO1xuICBsYXllcnM/OiBzdHJpbmdbXTtcbiAgc3JzPzogJ0VQU0c6NDMyNicgfCAnRVBTRzozODU3JyB8ICdhdXRvJztcbiAgdHJhbnNwYXJlbnQ/OiBib29sZWFuO1xuICBvbk1ldGFkYXRhTG9hZD86IChtZXRhZGF0YTogSW1hZ2VTb3VyY2VNZXRhZGF0YSkgPT4gdm9pZDtcbiAgb25NZXRhZGF0YUxvYWRFcnJvcj86IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIG9uSW1hZ2VMb2FkU3RhcnQ/OiAocmVxdWVzdElkOiB1bmtub3duKSA9PiB2b2lkO1xuICBvbkltYWdlTG9hZD86IChyZXF1ZXN0SWQ6IHVua25vd24pID0+IHZvaWQ7XG4gIG9uSW1hZ2VMb2FkRXJyb3I/OiAocmVxdWVzdElkOiB1bmtub3duLCBlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBkZWZhdWx0UHJvcHM6IERlZmF1bHRQcm9wczxXTVNMYXllclByb3BzPiA9IHtcbiAgaWQ6ICdpbWFnZXJ5LWxheWVyJyxcbiAgZGF0YTogJycsXG4gIHNlcnZpY2VUeXBlOiAnYXV0bycsXG4gIHNyczogJ2F1dG8nLFxuICBsYXllcnM6IHt0eXBlOiAnYXJyYXknLCBjb21wYXJlOiB0cnVlLCB2YWx1ZTogW119LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uTWV0YWRhdGFMb2FkOiB7dHlwZTogJ2Z1bmN0aW9uJywgdmFsdWU6ICgpID0+IHt9fSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIG9uTWV0YWRhdGFMb2FkRXJyb3I6IHt0eXBlOiAnZnVuY3Rpb24nLCB2YWx1ZTogY29uc29sZS5lcnJvcn0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25JbWFnZUxvYWRTdGFydDoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiAoKSA9PiB7fX0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25JbWFnZUxvYWQ6IHt0eXBlOiAnZnVuY3Rpb24nLCB2YWx1ZTogKCkgPT4ge319LFxuICBvbkltYWdlTG9hZEVycm9yOiB7XG4gICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICBjb21wYXJlOiBmYWxzZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB2YWx1ZTogKHJlcXVlc3RJZDogdW5rbm93biwgZXJyb3I6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yLCByZXF1ZXN0SWQpXG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdNU0xheWVyIGV4dGVuZHMgQ29tcG9zaXRlTGF5ZXI8UmVxdWlyZWQ8X1dNU0xheWVyUHJvcHM+PiB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnV01TTGF5ZXInO1xuICBzdGF0aWMgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbiAgZGVjbGFyZSBzdGF0ZToge1xuICAgIGltYWdlU291cmNlOiBJbWFnZVNvdXJjZTtcbiAgICBpbWFnZTogSW1hZ2VUeXBlO1xuICAgIGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgbGFzdFJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICBiYm94OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICAgIGJvdW5kaW5nQm94OiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07XG4gICAgICBsYXllcnM6IHN0cmluZ1tdO1xuICAgICAgc3JzOiAnRVBTRzo0MzI2JyB8ICdFUFNHOjM4NTcnO1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgIH07XG4gICAgbGFzdFJlcXVlc3RJZDogbnVtYmVyO1xuICAgIF9uZXh0UmVxdWVzdElkOiBudW1iZXI7XG4gICAgLyoqIFRPRE86IENoYW5nZSBhbnkgPT4gc2V0VGltZW91dCByZXR1cm4gdHlwZS4gRGlmZmVyZW50IGJldHdlZW4gTm9kZSBhbmQgYnJvd3Nlci4uLiAqL1xuICAgIF90aW1lb3V0SWQ6IGFueTtcbiAgICBsb2FkQ291bnRlcjogbnVtYmVyO1xuICB9O1xuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgYWxsIGFzeW5jIHJlc291cmNlcyBhcmUgbG9hZGVkICovXG4gIGdldCBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICAvLyBUcmFjayB0aGUgZXhwbGljaXQgbG9hZGluZyBkb25lIGJ5IHRoaXMgbGF5ZXJcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnN0YXRlKSAmJiB0aGlzLnN0YXRlLmxvYWRDb3VudGVyID09PSAwICYmIHN1cGVyLmlzTG9hZGVkO1xuICB9XG5cbiAgLyoqIExldHMgZGVjay5nbCBrbm93IHRoYXQgd2Ugd2FudCB2aWV3cG9ydCBjaGFuZ2UgZXZlbnRzICovXG4gIG92ZXJyaWRlIHNob3VsZFVwZGF0ZVN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5pdGlhbGl6ZVN0YXRlKCk6IHZvaWQge1xuICAgIC8vIGludGVudGlvbmFsbHkgZW1wdHksIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdXBkYXRlU3RhdGVcbiAgICB0aGlzLnN0YXRlLl9uZXh0UmVxdWVzdElkID0gMDtcbiAgICB0aGlzLnN0YXRlLmxhc3RSZXF1ZXN0SWQgPSAtMTtcbiAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyID0gMDtcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZVN0YXRlKHtjaGFuZ2VGbGFncywgcHJvcHMsIG9sZFByb3BzfTogVXBkYXRlUGFyYW1ldGVyczx0aGlzPik6IHZvaWQge1xuICAgIGNvbnN0IHt2aWV3cG9ydH0gPSB0aGlzLmNvbnRleHQ7XG5cbiAgICAvLyBDaGVjayBpZiBkYXRhIHNvdXJjZSBoYXMgY2hhbmdlZFxuICAgIGlmIChjaGFuZ2VGbGFncy5kYXRhQ2hhbmdlZCB8fCBwcm9wcy5zZXJ2aWNlVHlwZSAhPT0gb2xkUHJvcHMuc2VydmljZVR5cGUpIHtcbiAgICAgIHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UgPSB0aGlzLl9jcmVhdGVJbWFnZVNvdXJjZShwcm9wcyk7XG5cbiAgICAgIHRoaXMuX2xvYWRNZXRhZGF0YSgpO1xuICAgICAgdGhpcy5kZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRJbWFnZSh2aWV3cG9ydCwgJ2ltYWdlIHNvdXJjZSBjaGFuZ2VkJyksIDApO1xuICAgIH0gZWxzZSBpZiAoIWRlZXBFcXVhbChwcm9wcy5sYXllcnMsIG9sZFByb3BzLmxheWVycywgMSkpIHtcbiAgICAgIHRoaXMuZGVib3VuY2UoKCkgPT4gdGhpcy5sb2FkSW1hZ2Uodmlld3BvcnQsICdsYXllcnMgY2hhbmdlZCcpLCAwKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZUZsYWdzLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgdGhpcy5kZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRJbWFnZSh2aWV3cG9ydCwgJ3ZpZXdwb3J0IGNoYW5nZWQnKSk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyTGF5ZXJzKCk6IExheWVyPGFueT4ge1xuICAgIGNvbnN0IHtib3VuZHMsIGltYWdlLCBsYXN0UmVxdWVzdFBhcmFtZXRlcnN9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHJldHVybiAoXG4gICAgICBpbWFnZSAmJlxuICAgICAgbmV3IEJpdG1hcExheWVyKHtcbiAgICAgICAgLi4udGhpcy5nZXRTdWJMYXllclByb3BzKHtpZDogJ2JpdG1hcCd9KSxcbiAgICAgICAgX2ltYWdlQ29vcmRpbmF0ZVN5c3RlbTpcbiAgICAgICAgICBsYXN0UmVxdWVzdFBhcmFtZXRlcnMuc3JzID09PSAnRVBTRzo0MzI2J1xuICAgICAgICAgICAgPyBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVRcbiAgICAgICAgICAgIDogQ09PUkRJTkFURV9TWVNURU0uQ0FSVEVTSUFOLFxuICAgICAgICBib3VuZHMsXG4gICAgICAgIGltYWdlLFxuICAgICAgICBwaWNrYWJsZTogdGhpcy5wcm9wcy5waWNrYWJsZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0RmVhdHVyZUluZm9UZXh0KHg6IG51bWJlciwgeTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3Qge2xhc3RSZXF1ZXN0UGFyYW1ldGVyc30gPSB0aGlzLnN0YXRlO1xuICAgIGlmIChsYXN0UmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVW5kb2N1bWVudGVkIG1ldGhvZFxuICAgICAgY29uc3QgZmVhdHVyZUluZm8gPSBhd2FpdCB0aGlzLnN0YXRlLmltYWdlU291cmNlLmdldEZlYXR1cmVJbmZvVGV4dD8uKHtcbiAgICAgICAgLi4ubGFzdFJlcXVlc3RQYXJhbWV0ZXJzLFxuICAgICAgICBxdWVyeV9sYXllcnM6IGxhc3RSZXF1ZXN0UGFyYW1ldGVycy5sYXllcnMsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIGluZm9fZm9ybWF0OiAnYXBwbGljYXRpb24vdm5kLm9nYy5nbWwnXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmZWF0dXJlSW5mbztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgX2NyZWF0ZUltYWdlU291cmNlKHByb3BzOiBXTVNMYXllclByb3BzKTogSW1hZ2VTb3VyY2Uge1xuICAgIGlmIChwcm9wcy5kYXRhIGluc3RhbmNlb2YgSW1hZ2VTb3VyY2UpIHtcbiAgICAgIHJldHVybiBwcm9wcy5kYXRhO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcHMuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZVNvdXJjZSh7XG4gICAgICAgIHVybDogcHJvcHMuZGF0YSxcbiAgICAgICAgbG9hZE9wdGlvbnM6IHByb3BzLmxvYWRPcHRpb25zLFxuICAgICAgICB0eXBlOiBwcm9wcy5zZXJ2aWNlVHlwZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGltYWdlIHNvdXJjZSBpbiBwcm9wcy5kYXRhJyk7XG4gIH1cblxuICAvKiogUnVuIGEgZ2V0TWV0YWRhdGEgb24gdGhlIGltYWdlIHNlcnZpY2UgKi9cbiAgYXN5bmMgX2xvYWRNZXRhZGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7aW1hZ2VTb3VyY2V9ID0gdGhpcy5zdGF0ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zdGF0ZS5sb2FkQ291bnRlcisrO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBpbWFnZVNvdXJjZS5nZXRNZXRhZGF0YSgpO1xuXG4gICAgICAvLyBJZiBhIHJlcXVlc3QgdGFrZXMgYSBsb25nIHRpbWUsIGl0IG1heSBubyBsb25nZXIgYmUgZXhwZWN0ZWRcbiAgICAgIGlmICh0aGlzLnN0YXRlLmltYWdlU291cmNlID09PSBpbWFnZVNvdXJjZSkge1xuICAgICAgICB0aGlzLmdldEN1cnJlbnRMYXllcigpPy5wcm9wcy5vbk1ldGFkYXRhTG9hZChtZXRhZGF0YSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uTWV0YWRhdGFMb2FkRXJyb3IoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyLS07XG4gICAgfVxuICB9XG5cbiAgLyoqIExvYWQgYW4gaW1hZ2UgKi9cbiAgYXN5bmMgbG9hZEltYWdlKHZpZXdwb3J0OiBWaWV3cG9ydCwgX3JlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge2xheWVycywgc2VydmljZVR5cGUsIHRyYW5zcGFyZW50fSA9IHRoaXMucHJvcHM7XG5cbiAgICAvLyBUT0RPIC0gbW92ZSB0byBJbWFnZVNvdXJjZT9cbiAgICBpZiAoc2VydmljZVR5cGUgPT09ICd3bXMnICYmIGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZHMgPSB2aWV3cG9ydC5nZXRCb3VuZHMoKTtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB2aWV3cG9ydDtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmdldFJlcXVlc3RJZCgpO1xuICAgIGxldCB7c3JzfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHNycyA9PT0gJ2F1dG8nKSB7XG4gICAgICAvLyBCaXRtYXBMYXllciBvbmx5IHN1cHBvcnRzIExOR0xBVCBvciBDQVJURVNJQU4gKFdlYi1NZXJjYXRvcilcbiAgICAgIHNycyA9IHZpZXdwb3J0LnJlc29sdXRpb24gPyAnRVBTRzo0MzI2JyA6ICdFUFNHOjM4NTcnO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICBiYm94OiBib3VuZHMsXG4gICAgICBib3VuZGluZ0JveDogW1xuICAgICAgICBbYm91bmRzWzBdLCBib3VuZHNbMV1dLFxuICAgICAgICBbYm91bmRzWzJdLCBib3VuZHNbM11dXG4gICAgICBdIGFzIFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICAgIGxheWVycyxcbiAgICAgIHNycyxcbiAgICAgIHRyYW5zcGFyZW50XG4gICAgfTtcbiAgICBpZiAoc3JzID09PSAnRVBTRzozODU3Jykge1xuICAgICAgY29uc3QgW21pblgsIG1pblldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMF0sIGJvdW5kc1sxXV0pO1xuICAgICAgY29uc3QgW21heFgsIG1heFldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMl0sIGJvdW5kc1szXV0pO1xuICAgICAgcmVxdWVzdFBhcmFtcy5ib3VuZGluZ0JveCA9IFtcbiAgICAgICAgW21pblgsIG1pblldLFxuICAgICAgICBbbWF4WCwgbWF4WV1cbiAgICAgIF07XG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICByZXF1ZXN0UGFyYW1zLmJib3ggPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXIrKztcbiAgICAgIHRoaXMucHJvcHMub25JbWFnZUxvYWRTdGFydChyZXF1ZXN0SWQpO1xuXG4gICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UuZ2V0SW1hZ2UocmVxdWVzdFBhcmFtcyk7XG5cbiAgICAgIC8vIElmIGEgcmVxdWVzdCB0YWtlcyBhIGxvbmcgdGltZSwgbGF0ZXIgcmVxdWVzdHMgbWF5IGhhdmUgYWxyZWFkeSBsb2FkZWQuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5sYXN0UmVxdWVzdElkIDwgcmVxdWVzdElkKSB7XG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uSW1hZ2VMb2FkKHJlcXVlc3RJZCk7XG4gICAgICAgIC8vIE5vdCB0eXBlIHNhZmUuLi5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgYm91bmRzLFxuICAgICAgICAgIGxhc3RSZXF1ZXN0UGFyYW1ldGVyczogcmVxdWVzdFBhcmFtcyxcbiAgICAgICAgICBsYXN0UmVxdWVzdElkOiByZXF1ZXN0SWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkVycm9yPy4oZXJyb3IgYXMgRXJyb3IsIHRoaXMpO1xuICAgICAgdGhpcy5nZXRDdXJyZW50TGF5ZXIoKT8ucHJvcHMub25JbWFnZUxvYWRFcnJvcihyZXF1ZXN0SWQsIGVycm9yIGFzIEVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGF0ZS5sb2FkQ291bnRlci0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhFTFBFUlNcblxuICAvKiogR2xvYmFsIGNvdW50ZXIgZm9yIGlzc3VpbmcgdW5pcXVlIHJlcXVlc3QgaWRzICovXG4gIHByaXZhdGUgZ2V0UmVxdWVzdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuX25leHRSZXF1ZXN0SWQrKztcbiAgfVxuXG4gIC8qKiBSdW5zIGFuIGFjdGlvbiBpbiB0aGUgZnV0dXJlLCBjYW5jZWxzIGl0IGlmIHRoZSBuZXcgYWN0aW9uIGlzIGlzc3VlZCBiZWZvcmUgaXQgZXhlY3V0ZXMgKi9cbiAgcHJpdmF0ZSBkZWJvdW5jZShmbjogKCkgPT4gdm9pZCwgbXMgPSA1MDApOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5zdGF0ZS5fdGltZW91dElkKTtcbiAgICB0aGlzLnN0YXRlLl90aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGZuKCksIG1zKTtcbiAgfVxufVxuXG4vLyBodHRwczovL2Vwc2cuaW8vMzg1N1xuLy8gK3Byb2o9bWVyYyArYT02Mzc4MTM3ICtiPTYzNzgxMzcgK2xhdF90cz0wICtsb25fMD0wICt4XzA9MCAreV8wPTAgK2s9MSArdW5pdHM9bSArbmFkZ3JpZHM9QG51bGwgK3drdGV4dCArbm9fZGVmcyArdHlwZT1jcnNcbmNvbnN0IEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRSA9IDYzNzgxMzcgKiBNYXRoLlBJO1xuXG4vKiogUHJvamVjdHMgRVBTRzo0MzI2IHRvIEVQU0c6Mzg1N1xuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IHJlcGxhY2VtZW50IG9mIHByb2o0LiBVc2UgdGVzdHMgdG8gZW5zdXJlIGNvbmZvcm1hbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gV0dTODRUb1BzZXVkb01lcmNhdG9yKGNvb3JkOiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IG1lcmNhdG9yID0gbG5nTGF0VG9Xb3JsZChjb29yZCk7XG4gIG1lcmNhdG9yWzBdID0gKG1lcmNhdG9yWzBdIC8gMjU2IC0gMSkgKiBIQUxGX0VBUlRIX0NJUkNVTUZFUkVOQ0U7XG4gIG1lcmNhdG9yWzFdID0gKG1lcmNhdG9yWzFdIC8gMjU2IC0gMSkgKiBIQUxGX0VBUlRIX0NJUkNVTUZFUkVOQ0U7XG4gIHJldHVybiBtZXJjYXRvcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBVUEsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsSUFBQSxHQUFBSCxPQUFBO0FBQStELFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFB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