kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
355 lines (296 loc) • 39.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.geojsonVisConfigs = exports.geoJsonRequiredColumns = exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
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 _lodash = _interopRequireDefault(require("lodash.memoize"));
var _lodash2 = _interopRequireDefault(require("lodash.uniq"));
var _baseLayer = _interopRequireWildcard(require("../base-layer"));
var _mvtGeojsonLayer = _interopRequireDefault(require("../../deckgl-layers/mvt-geojson-layer/mvt-geojson-layer"));
var _deck = require("deck.gl");
var _mvtGeojsonLayerIcon = _interopRequireDefault(require("./mvt-geojson-layer-icon"));
var _defaultSettings = require("../../constants/default-settings");
var _colorUtils = require("../../utils/color-utils");
var _dataUtils = require("../../utils/data-utils");
var _dataScaleUtils = require("../../utils/data-scale-utils");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var geojsonVisConfigs = exports.geojsonVisConfigs = {
opacity: 'opacity',
thickness: {
type: 'number',
defaultValue: 0.5,
label: 'Stroke Width',
isRanged: false,
range: [0, 100],
step: 0.1,
group: 'stroke',
property: 'thickness'
},
strokeColor: 'strokeColor',
colorRange: 'colorRange',
strokeColorRange: 'strokeColorRange',
radius: 'radius',
sizeRange: 'strokeWidthRange',
radiusRange: 'radiusRange',
heightRange: 'elevationRange',
elevationScale: 'elevationScale',
stroked: 'stroked',
filled: 'filled',
enable3d: 'enable3d',
wireframe: 'wireframe',
featData: []
};
var geoJsonRequiredColumns = exports.geoJsonRequiredColumns = [''];
var defaultGetFieldValue = function defaultGetFieldValue(field, d) {
return d[field.tableFieldIndex - 1];
};
var MVTLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
(0, _inherits2["default"])(MVTLayer, _Layer);
var _super = _createSuper(MVTLayer);
function MVTLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, MVTLayer);
_this = _super.call(this, props);
_this.registerVisConfig(geojsonVisConfigs);
return _this;
}
(0, _createClass2["default"])(MVTLayer, [{
key: "visualChannels",
get: function get() {
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(MVTLayer.prototype), "visualChannels", this)), {}, {
strokeColor: {
property: 'strokeColor',
field: 'strokeColorField',
scale: 'strokeColorScale',
domain: 'strokeColorDomain',
range: 'strokeColorRange',
key: 'strokeColor',
channelScaleType: _defaultSettings.CHANNEL_SCALES.color,
condition: function condition(config) {
return config.visConfig.stroked;
}
},
size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(MVTLayer.prototype), "visualChannels", this).size), {}, {
property: 'stroke',
condition: function condition(config) {
return config.visConfig.stroked;
}
}),
height: {
property: 'height',
field: 'heightField',
scale: 'heightScale',
domain: 'heightDomain',
range: 'heightRange',
key: 'height',
channelScaleType: 'size',
condition: function condition(config) {
return config.visConfig.enable3d;
}
},
radius: {
property: 'radius',
field: 'radiusField',
scale: 'radiusScale',
domain: 'radiusDomain',
range: 'radiusRange',
key: 'radius',
channelScaleType: 'radius'
}
});
} // cScale =
// this.config.colorField &&
// this.getVisChannelScale(
// 'quantile',
// this.updateLayerDomain(this),
// colorRange.colors.map(hexToRgb)
// );
}, {
key: "type",
get: function get() {
return 'MVT';
}
}, {
key: "layerIcon",
get: function get() {
return _mvtGeojsonLayerIcon["default"];
}
}, {
key: "getDefaultLayerConfig",
value: function getDefaultLayerConfig() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(MVTLayer.prototype), "getDefaultLayerConfig", this).call(this, props)), {}, {
// add height visual channel
heightField: null,
heightDomain: [0, 1],
heightScale: 'linear',
// add radius visual channel
radiusField: null,
radiusDomain: [0, 1],
radiusScale: 'linear',
// add stroke color visual channel
strokeColorField: null,
strokeColorDomain: [0, 1],
strokeColorScale: 'quantile'
});
}
}, {
key: "shouldRenderLayer",
value: function shouldRenderLayer() {
return this.type && this.config.isVisible;
}
}, {
key: "calculateLayerDomain",
value: function calculateLayerDomain(dataset, visualChannel) {
var allData = dataset.allData,
filteredIndexForDomain = dataset.filteredIndexForDomain;
var defaultDomain = [0, 1];
var scale = visualChannel.scale;
var scaleType = this.config[scale];
if (!allData) {
return defaultDomain;
}
var field = this.config[visualChannel.field];
if (!field) {
// if colorField or sizeField were set back to null
return defaultDomain;
}
if (!_defaultSettings.SCALE_TYPES[scaleType]) {
Console.error("scale type ".concat(scaleType, " not supported"));
return defaultDomain;
} // TODO: refactor to add valueAccessor to field
var fieldIdx = field.tableFieldIndex - 1;
var isTime = field.type === _defaultSettings.ALL_FIELD_TYPES.timestamp;
var valueAccessor = _dataUtils.maybeToDate.bind(null, isTime, fieldIdx, field.format);
var indexValueAccessor = function indexValueAccessor(i) {
return valueAccessor(allData[i]);
};
var sortFunction = (0, _dataUtils.getSortingFunction)(field.type);
switch (scaleType) {
case _defaultSettings.SCALE_TYPES.ordinal:
case _defaultSettings.SCALE_TYPES.point:
// do not recalculate ordinal domain based on filtered data
// don't need to update ordinal domain every time
return (0, _dataScaleUtils.getOrdinalDomain)(allData, valueAccessor);
case _defaultSettings.SCALE_TYPES.quantile:
return (0, _dataScaleUtils.getQuantileDomain)(filteredIndexForDomain, indexValueAccessor, sortFunction);
case _defaultSettings.SCALE_TYPES.quantize:
case _defaultSettings.SCALE_TYPES.linear:
case _defaultSettings.SCALE_TYPES.sqrt:
default:
return (0, _dataScaleUtils.getLinearDomain)(filteredIndexForDomain, indexValueAccessor);
}
}
}, {
key: "getEncodedChannelValue",
value: function getEncodedChannelValue(scale, data, field) {
var nullValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _defaultSettings.NO_VALUE_COLOR;
var getValue = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : defaultGetFieldValue;
var type = field.type; // const value = getValue(field, data);
var value = data;
if (!(0, _dataUtils.notNullorUndefined)(value)) {
return nullValue;
}
var attributeValue;
if (type === _defaultSettings.ALL_FIELD_TYPES.timestamp) {
// shouldn't need to convert here
// scale Function should take care of it
attributeValue = scale(new Date(value));
} else {
attributeValue = scale(value);
}
if (!(0, _dataUtils.notNullorUndefined)(attributeValue)) {
attributeValue = nullValue;
}
return attributeValue;
}
}, {
key: "renderLayer",
value: function renderLayer(_ref) {
var _this2 = this;
var idx = _ref.idx,
objectHovered = _ref.objectHovered,
mapState = _ref.mapState,
datasets = _ref.datasets,
filters = _ref.filters,
loadEDLinkData = _ref.loadEDLinkData;
var config = this.config;
var zoomFactor = this.getZoomFactor(mapState);
this.updateLayerDomain(datasets[this.config.dataId]);
var _this$config = this.config,
colorField = _this$config.colorField,
strokeColorField = _this$config.strokeColorField,
strokeColorScale = _this$config.strokeColorScale,
strokeColorDomain = _this$config.strokeColorDomain,
sizeField = _this$config.sizeField,
sizeScale = _this$config.sizeScale,
sizeDomain = _this$config.sizeDomain,
color = _this$config.color,
visConfig = _this$config.visConfig;
var cScale = colorField && this.getVisChannelScale(this.config.colorScale, this.config.colorDomain, this.config.visConfig.colorRange.colors.map(_colorUtils.hexToRgb)); // stroke color
var scScale = strokeColorField && this.getVisChannelScale(strokeColorScale, strokeColorDomain, visConfig.strokeColorRange.colors.map(_colorUtils.hexToRgb)); // calculate stroke scale - if stroked = true
var sScale = sizeField && visConfig.stroked && this.getVisChannelScale(sizeScale, sizeDomain, visConfig.sizeRange); // const getFillColor = d => {
// console.log('d', d);
// cScale
// ? this.getEncodedChannelValue(cScale, d.properties[0], colorField)
// : [128, 128, 128];
// };
var tempLayr = new _mvtGeojsonLayer["default"]({
id: this.id,
idx: idx,
url: this.config.dataId,
dataset: datasets[this.config.dataId],
deckGLFilters: filters.filter(function (f) {
return f.dataId === config.dataId;
}),
cScale: cScale,
scScale: scScale,
sScale: sScale,
lineWidthScale: visConfig.thickness * zoomFactor * 8,
strokeColorField: strokeColorField,
strokeColor: visConfig.strokeColor,
strokeColorRange: visConfig.strokeColorRange,
sizeField: sizeField,
sizeRange: visConfig.sizeRange,
colorField: colorField,
filled: visConfig.filled,
stroked: visConfig.stroked,
opacity: visConfig.opacity,
getEncodedChannelValue: function getEncodedChannelValue(cScale, props, colorField) {
return _this2.getEncodedChannelValue(cScale, props, colorField);
},
color: color,
loadEDLinkData: loadEDLinkData
});
return [tempLayr].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) ? [new _deck.GeoJsonLayer({
id: "".concat(this.id, "-hovered"),
data: [objectHovered.object],
getLineWidth: 1,
getRadius: 23,
getElevation: 45,
getLineColor: [255, 255, 0],
getFillColor: [0, 255, 255],
stroked: true,
pickable: false,
filled: false
})] : []));
}
}]);
return MVTLayer;
}(_baseLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvbXZ0LWdlb2pzb24tbGF5ZXIvbXZ0LWdlb2pzb24tbGF5ZXIuanMiXSwibmFtZXMiOlsiZ2VvanNvblZpc0NvbmZpZ3MiLCJvcGFjaXR5IiwidGhpY2tuZXNzIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImxhYmVsIiwiaXNSYW5nZWQiLCJyYW5nZSIsInN0ZXAiLCJncm91cCIsInByb3BlcnR5Iiwic3Ryb2tlQ29sb3IiLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsInJhZGl1cyIsInNpemVSYW5nZSIsInJhZGl1c1JhbmdlIiwiaGVpZ2h0UmFuZ2UiLCJlbGV2YXRpb25TY2FsZSIsInN0cm9rZWQiLCJmaWxsZWQiLCJlbmFibGUzZCIsIndpcmVmcmFtZSIsImZlYXREYXRhIiwiZ2VvSnNvblJlcXVpcmVkQ29sdW1ucyIsImRlZmF1bHRHZXRGaWVsZFZhbHVlIiwiZmllbGQiLCJkIiwidGFibGVGaWVsZEluZGV4IiwiTVZUTGF5ZXIiLCJwcm9wcyIsInJlZ2lzdGVyVmlzQ29uZmlnIiwic2NhbGUiLCJkb21haW4iLCJrZXkiLCJjaGFubmVsU2NhbGVUeXBlIiwiQ0hBTk5FTF9TQ0FMRVMiLCJjb2xvciIsImNvbmRpdGlvbiIsImNvbmZpZyIsInZpc0NvbmZpZyIsInNpemUiLCJoZWlnaHQiLCJNVlRMYXllckljb24iLCJoZWlnaHRGaWVsZCIsImhlaWdodERvbWFpbiIsImhlaWdodFNjYWxlIiwicmFkaXVzRmllbGQiLCJyYWRpdXNEb21haW4iLCJyYWRpdXNTY2FsZSIsInN0cm9rZUNvbG9yRmllbGQiLCJzdHJva2VDb2xvckRvbWFpbiIsInN0cm9rZUNvbG9yU2NhbGUiLCJpc1Zpc2libGUiLCJkYXRhc2V0IiwidmlzdWFsQ2hhbm5lbCIsImFsbERhdGEiLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZGVmYXVsdERvbWFpbiIsInNjYWxlVHlwZSIsIlNDQUxFX1RZUEVTIiwiQ29uc29sZSIsImVycm9yIiwiZmllbGRJZHgiLCJpc1RpbWUiLCJBTExfRklFTERfVFlQRVMiLCJ0aW1lc3RhbXAiLCJ2YWx1ZUFjY2Vzc29yIiwibWF5YmVUb0RhdGUiLCJiaW5kIiwiZm9ybWF0IiwiaW5kZXhWYWx1ZUFjY2Vzc29yIiwiaSIsInNvcnRGdW5jdGlvbiIsIm9yZGluYWwiLCJwb2ludCIsInF1YW50aWxlIiwicXVhbnRpemUiLCJsaW5lYXIiLCJzcXJ0IiwiZGF0YSIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZ2V0VmFsdWUiLCJ2YWx1ZSIsImF0dHJpYnV0ZVZhbHVlIiwiRGF0ZSIsImlkeCIsIm9iamVjdEhvdmVyZWQiLCJtYXBTdGF0ZSIsImRhdGFzZXRzIiwiZmlsdGVycyIsImxvYWRFRExpbmtEYXRhIiwiem9vbUZhY3RvciIsImdldFpvb21GYWN0b3IiLCJ1cGRhdGVMYXllckRvbWFpbiIsImRhdGFJZCIsImNvbG9yRmllbGQiLCJzaXplRmllbGQiLCJzaXplU2NhbGUiLCJzaXplRG9tYWluIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwiY29sb3JTY2FsZSIsImNvbG9yRG9tYWluIiwiY29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJzY1NjYWxlIiwic1NjYWxlIiwidGVtcExheXIiLCJEZWNrR0xNVlRMYXllciIsImlkIiwidXJsIiwiZGVja0dMRmlsdGVycyIsImZpbHRlciIsImYiLCJsaW5lV2lkdGhTY2FsZSIsImdldEVuY29kZWRDaGFubmVsVmFsdWUiLCJpc0xheWVySG92ZXJlZCIsIkRlY2tHTEdlb0pzb25MYXllciIsIm9iamVjdCIsImdldExpbmVXaWR0aCIsImdldFJhZGl1cyIsImdldEVsZXZhdGlvbiIsImdldExpbmVDb2xvciIsImdldEZpbGxDb2xvciIsInBpY2thYmxlIiwiTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFTQTs7QUFFQTs7QUFR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TjtBQW1CRDs7O0VBM1FtQzRHLHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoLm1lbW9pemUnO1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuXG5pbXBvcnQgTGF5ZXIsIHtjb2xvck1ha2VyfSBmcm9tICcuLi9iYXNlLWxheWVyJztcbmltcG9ydCBEZWNrR0xNVlRMYXllciBmcm9tICdkZWNrZ2wtbGF5ZXJzL212dC1nZW9qc29uLWxheWVyL212dC1nZW9qc29uLWxheWVyJztcbmltcG9ydCB7R2VvSnNvbkxheWVyIGFzIERlY2tHTEdlb0pzb25MYXllcn0gZnJvbSAnZGVjay5nbCc7XG5pbXBvcnQgTVZUTGF5ZXJJY29uIGZyb20gJy4vbXZ0LWdlb2pzb24tbGF5ZXItaWNvbic7XG5pbXBvcnQge1xuICBHRU9KU09OX0ZJRUxEUyxcbiAgSElHSExJR0hfQ09MT1JfM0QsXG4gIE5PX1ZBTFVFX0NPTE9SLFxuICBDSEFOTkVMX1NDQUxFUyxcbiAgU0NBTEVfVFlQRVMsXG4gIEFMTF9GSUVMRF9UWVBFU1xufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmltcG9ydCB7aGV4VG9SZ2J9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcblxuaW1wb3J0IHtcbiAgZ2V0U2FtcGxlRGF0YSxcbiAgZ2V0TGF0TG5nQm91bmRzLFxuICBtYXliZVRvRGF0ZSxcbiAgZ2V0U29ydGluZ0Z1bmN0aW9uLFxuICBub3ROdWxsb3JVbmRlZmluZWRcbn0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5cbmltcG9ydCB7XG4gIGdldFF1YW50aWxlRG9tYWluLFxuICBnZXRPcmRpbmFsRG9tYWluLFxuICBnZXRMaW5lYXJEb21haW5cbn0gZnJvbSAndXRpbHMvZGF0YS1zY2FsZS11dGlscyc7XG5cbmV4cG9ydCBjb25zdCBnZW9qc29uVmlzQ29uZmlncyA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICB0aGlja25lc3M6IHtcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBkZWZhdWx0VmFsdWU6IDAuNSxcbiAgICBsYWJlbDogJ1N0cm9rZSBXaWR0aCcsXG4gICAgaXNSYW5nZWQ6IGZhbHNlLFxuICAgIHJhbmdlOiBbMCwgMTAwXSxcbiAgICBzdGVwOiAwLjEsXG4gICAgZ3JvdXA6ICdzdHJva2UnLFxuICAgIHByb3BlcnR5OiAndGhpY2tuZXNzJ1xuICB9LFxuICBzdHJva2VDb2xvcjogJ3N0cm9rZUNvbG9yJyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gIHJhZGl1czogJ3JhZGl1cycsXG5cbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZScsXG4gIHJhZGl1c1JhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICBoZWlnaHRSYW5nZTogJ2VsZXZhdGlvblJhbmdlJyxcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZScsXG4gIHN0cm9rZWQ6ICdzdHJva2VkJyxcbiAgZmlsbGVkOiAnZmlsbGVkJyxcbiAgZW5hYmxlM2Q6ICdlbmFibGUzZCcsXG4gIHdpcmVmcmFtZTogJ3dpcmVmcmFtZScsXG4gIGZlYXREYXRhOiBbXVxufTtcblxuZXhwb3J0IGNvbnN0IGdlb0pzb25SZXF1aXJlZENvbHVtbnMgPSBbJyddO1xuY29uc3QgZGVmYXVsdEdldEZpZWxkVmFsdWUgPSAoZmllbGQsIGQpID0+IGRbZmllbGQudGFibGVGaWVsZEluZGV4IC0gMV07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1WVExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMucmVnaXN0ZXJWaXNDb25maWcoZ2VvanNvblZpc0NvbmZpZ3MpO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscyxcbiAgICAgIHN0cm9rZUNvbG9yOiB7XG4gICAgICAgIHByb3BlcnR5OiAnc3Ryb2tlQ29sb3InLFxuICAgICAgICBmaWVsZDogJ3N0cm9rZUNvbG9yRmllbGQnLFxuICAgICAgICBzY2FsZTogJ3N0cm9rZUNvbG9yU2NhbGUnLFxuICAgICAgICBkb21haW46ICdzdHJva2VDb2xvckRvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gICAgICAgIGtleTogJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY29sb3IsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlZFxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSxcbiAgICAgICAgcHJvcGVydHk6ICdzdHJva2UnLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLnN0cm9rZWRcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgcHJvcGVydHk6ICdoZWlnaHQnLFxuICAgICAgICBmaWVsZDogJ2hlaWdodEZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdoZWlnaHRTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2hlaWdodERvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnaGVpZ2h0UmFuZ2UnLFxuICAgICAgICBrZXk6ICdoZWlnaHQnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiAnc2l6ZScsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuZW5hYmxlM2RcbiAgICAgIH0sXG4gICAgICByYWRpdXM6IHtcbiAgICAgICAgcHJvcGVydHk6ICdyYWRpdXMnLFxuICAgICAgICBmaWVsZDogJ3JhZGl1c0ZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdyYWRpdXNTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ3JhZGl1c0RvbWFpbicsXG4gICAgICAgIHJhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICAgICAgICBrZXk6ICdyYWRpdXMnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiAncmFkaXVzJ1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBjU2NhbGUgPVxuICAvLyB0aGlzLmNvbmZpZy5jb2xvckZpZWxkICYmXG4gIC8vIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKFxuICAvLyAgICdxdWFudGlsZScsXG4gIC8vICAgdGhpcy51cGRhdGVMYXllckRvbWFpbih0aGlzKSxcbiAgLy8gICBjb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpXG4gIC8vICk7XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdNVlQnO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gTVZUTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzKSxcblxuICAgICAgLy8gYWRkIGhlaWdodCB2aXN1YWwgY2hhbm5lbFxuICAgICAgaGVpZ2h0RmllbGQ6IG51bGwsXG4gICAgICBoZWlnaHREb21haW46IFswLCAxXSxcbiAgICAgIGhlaWdodFNjYWxlOiAnbGluZWFyJyxcblxuICAgICAgLy8gYWRkIHJhZGl1cyB2aXN1YWwgY2hhbm5lbFxuICAgICAgcmFkaXVzRmllbGQ6IG51bGwsXG4gICAgICByYWRpdXNEb21haW46IFswLCAxXSxcbiAgICAgIHJhZGl1c1NjYWxlOiAnbGluZWFyJyxcblxuICAgICAgLy8gYWRkIHN0cm9rZSBjb2xvciB2aXN1YWwgY2hhbm5lbFxuICAgICAgc3Ryb2tlQ29sb3JGaWVsZDogbnVsbCxcbiAgICAgIHN0cm9rZUNvbG9yRG9tYWluOiBbMCwgMV0sXG4gICAgICBzdHJva2VDb2xvclNjYWxlOiAncXVhbnRpbGUnXG4gICAgfTtcbiAgfVxuXG4gIHNob3VsZFJlbmRlckxheWVyKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgJiYgdGhpcy5jb25maWcuaXNWaXNpYmxlO1xuICB9XG5cbiAgY2FsY3VsYXRlTGF5ZXJEb21haW4oZGF0YXNldCwgdmlzdWFsQ2hhbm5lbCkge1xuICAgIGNvbnN0IHthbGxEYXRhLCBmaWx0ZXJlZEluZGV4Rm9yRG9tYWlufSA9IGRhdGFzZXQ7XG4gICAgY29uc3QgZGVmYXVsdERvbWFpbiA9IFswLCAxXTtcbiAgICBjb25zdCB7c2NhbGV9ID0gdmlzdWFsQ2hhbm5lbDtcbiAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG5cbiAgICBpZiAoIWFsbERhdGEpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0RG9tYWluO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF07XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgLy8gaWYgY29sb3JGaWVsZCBvciBzaXplRmllbGQgd2VyZSBzZXQgYmFjayB0byBudWxsXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICBpZiAoIVNDQUxFX1RZUEVTW3NjYWxlVHlwZV0pIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoYHNjYWxlIHR5cGUgJHtzY2FsZVR5cGV9IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgIHJldHVybiBkZWZhdWx0RG9tYWluO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGFkZCB2YWx1ZUFjY2Vzc29yIHRvIGZpZWxkXG4gICAgY29uc3QgZmllbGRJZHggPSBmaWVsZC50YWJsZUZpZWxkSW5kZXggLSAxO1xuICAgIGNvbnN0IGlzVGltZSA9IGZpZWxkLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXA7XG4gICAgY29uc3QgdmFsdWVBY2Nlc3NvciA9IG1heWJlVG9EYXRlLmJpbmQoXG4gICAgICBudWxsLFxuICAgICAgaXNUaW1lLFxuICAgICAgZmllbGRJZHgsXG4gICAgICBmaWVsZC5mb3JtYXRcbiAgICApO1xuICAgIGNvbnN0IGluZGV4VmFsdWVBY2Nlc3NvciA9IGkgPT4gdmFsdWVBY2Nlc3NvcihhbGxEYXRhW2ldKTtcblxuICAgIGNvbnN0IHNvcnRGdW5jdGlvbiA9IGdldFNvcnRpbmdGdW5jdGlvbihmaWVsZC50eXBlKTtcblxuICAgIHN3aXRjaCAoc2NhbGVUeXBlKSB7XG4gICAgICBjYXNlIFNDQUxFX1RZUEVTLm9yZGluYWw6XG4gICAgICBjYXNlIFNDQUxFX1RZUEVTLnBvaW50OlxuICAgICAgICAvLyBkbyBub3QgcmVjYWxjdWxhdGUgb3JkaW5hbCBkb21haW4gYmFzZWQgb24gZmlsdGVyZWQgZGF0YVxuICAgICAgICAvLyBkb24ndCBuZWVkIHRvIHVwZGF0ZSBvcmRpbmFsIGRvbWFpbiBldmVyeSB0aW1lXG4gICAgICAgIHJldHVybiBnZXRPcmRpbmFsRG9tYWluKGFsbERhdGEsIHZhbHVlQWNjZXNzb3IpO1xuXG4gICAgICBjYXNlIFNDQUxFX1RZUEVTLnF1YW50aWxlOlxuICAgICAgICByZXR1cm4gZ2V0UXVhbnRpbGVEb21haW4oXG4gICAgICAgICAgZmlsdGVyZWRJbmRleEZvckRvbWFpbixcbiAgICAgICAgICBpbmRleFZhbHVlQWNjZXNzb3IsXG4gICAgICAgICAgc29ydEZ1bmN0aW9uXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMucXVhbnRpemU6XG4gICAgICBjYXNlIFNDQUxFX1RZUEVTLmxpbmVhcjpcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMuc3FydDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBnZXRMaW5lYXJEb21haW4oZmlsdGVyZWRJbmRleEZvckRvbWFpbiwgaW5kZXhWYWx1ZUFjY2Vzc29yKTtcbiAgICB9XG4gIH1cbiAgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShcbiAgICBzY2FsZSxcbiAgICBkYXRhLFxuICAgIGZpZWxkLFxuICAgIG51bGxWYWx1ZSA9IE5PX1ZBTFVFX0NPTE9SLFxuICAgIGdldFZhbHVlID0gZGVmYXVsdEdldEZpZWxkVmFsdWVcbiAgKSB7XG4gICAgY29uc3Qge3R5cGV9ID0gZmllbGQ7XG4gICAgLy8gY29uc3QgdmFsdWUgPSBnZXRWYWx1ZShmaWVsZCwgZGF0YSk7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhO1xuICAgIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXR0cmlidXRlVmFsdWU7XG4gICAgaWYgKHR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXApIHtcbiAgICAgIC8vIHNob3VsZG4ndCBuZWVkIHRvIGNvbnZlcnQgaGVyZVxuICAgICAgLy8gc2NhbGUgRnVuY3Rpb24gc2hvdWxkIHRha2UgY2FyZSBvZiBpdFxuICAgICAgYXR0cmlidXRlVmFsdWUgPSBzY2FsZShuZXcgRGF0ZSh2YWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZChhdHRyaWJ1dGVWYWx1ZSkpIHtcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gbnVsbFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKHtcbiAgICBpZHgsXG4gICAgb2JqZWN0SG92ZXJlZCxcbiAgICBtYXBTdGF0ZSxcbiAgICBkYXRhc2V0cyxcbiAgICBmaWx0ZXJzLFxuICAgIGxvYWRFRExpbmtEYXRhXG4gIH0pIHtcbiAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qgem9vbUZhY3RvciA9IHRoaXMuZ2V0Wm9vbUZhY3RvcihtYXBTdGF0ZSk7XG5cbiAgICB0aGlzLnVwZGF0ZUxheWVyRG9tYWluKGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF0pO1xuXG4gICAgY29uc3Qge1xuICAgICAgY29sb3JGaWVsZCxcbiAgICAgIHN0cm9rZUNvbG9yRmllbGQsXG4gICAgICBzdHJva2VDb2xvclNjYWxlLFxuICAgICAgc3Ryb2tlQ29sb3JEb21haW4sXG4gICAgICBzaXplRmllbGQsXG4gICAgICBzaXplU2NhbGUsXG4gICAgICBzaXplRG9tYWluLFxuICAgICAgY29sb3IsXG4gICAgICB2aXNDb25maWdcbiAgICB9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgY1NjYWxlID1cbiAgICAgIGNvbG9yRmllbGQgJiZcbiAgICAgIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKFxuICAgICAgICB0aGlzLmNvbmZpZy5jb2xvclNjYWxlLFxuICAgICAgICB0aGlzLmNvbmZpZy5jb2xvckRvbWFpbixcbiAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnLmNvbG9yUmFuZ2UuY29sb3JzLm1hcChoZXhUb1JnYilcbiAgICAgICk7XG4gICAgLy8gc3Ryb2tlIGNvbG9yXG4gICAgY29uc3Qgc2NTY2FsZSA9XG4gICAgICBzdHJva2VDb2xvckZpZWxkICYmXG4gICAgICB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShcbiAgICAgICAgc3Ryb2tlQ29sb3JTY2FsZSxcbiAgICAgICAgc3Ryb2tlQ29sb3JEb21haW4sXG4gICAgICAgIHZpc0NvbmZpZy5zdHJva2VDb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpXG4gICAgICApO1xuICAgIC8vIGNhbGN1bGF0ZSBzdHJva2Ugc2NhbGUgLSBpZiBzdHJva2VkID0gdHJ1ZVxuICAgIGNvbnN0IHNTY2FsZSA9XG4gICAgICBzaXplRmllbGQgJiZcbiAgICAgIHZpc0NvbmZpZy5zdHJva2VkICYmXG4gICAgICB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShzaXplU2NhbGUsIHNpemVEb21haW4sIHZpc0NvbmZpZy5zaXplUmFuZ2UpO1xuICAgIC8vIGNvbnN0IGdldEZpbGxDb2xvciA9IGQgPT4ge1xuICAgIC8vICAgY29uc29sZS5sb2coJ2QnLCBkKTtcbiAgICAvLyAgIGNTY2FsZVxuICAgIC8vICAgICA/IHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIGQucHJvcGVydGllc1swXSwgY29sb3JGaWVsZClcbiAgICAvLyAgICAgOiBbMTI4LCAxMjgsIDEyOF07XG4gICAgLy8gfTtcbiAgICB2YXIgdGVtcExheXIgPSBuZXcgRGVja0dMTVZUTGF5ZXIoe1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpZHgsXG4gICAgICB1cmw6IHRoaXMuY29uZmlnLmRhdGFJZCxcbiAgICAgIGRhdGFzZXQ6IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF0sXG4gICAgICBkZWNrR0xGaWx0ZXJzOiBmaWx0ZXJzLmZpbHRlcihmID0+IGYuZGF0YUlkID09PSBjb25maWcuZGF0YUlkKSxcbiAgICAgIGNTY2FsZSxcbiAgICAgIHNjU2NhbGUsXG4gICAgICBzU2NhbGUsXG4gICAgICBsaW5lV2lkdGhTY2FsZTogdmlzQ29uZmlnLnRoaWNrbmVzcyAqIHpvb21GYWN0b3IgKiA4LFxuICAgICAgc3Ryb2tlQ29sb3JGaWVsZCxcbiAgICAgIHN0cm9rZUNvbG9yOiB2aXNDb25maWcuc3Ryb2tlQ29sb3IsXG4gICAgICBzdHJva2VDb2xvclJhbmdlOiB2aXNDb25maWcuc3Ryb2tlQ29sb3JSYW5nZSxcbiAgICAgIHNpemVGaWVsZCxcbiAgICAgIHNpemVSYW5nZTogdmlzQ29uZmlnLnNpemVSYW5nZSxcbiAgICAgIGNvbG9yRmllbGQsXG4gICAgICBmaWxsZWQ6IHZpc0NvbmZpZy5maWxsZWQsXG4gICAgICBzdHJva2VkOiB2aXNDb25maWcuc3Ryb2tlZCxcbiAgICAgIG9wYWNpdHk6IHZpc0NvbmZpZy5vcGFjaXR5LFxuICAgICAgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZTogKGNTY2FsZSwgcHJvcHMsIGNvbG9yRmllbGQpID0+XG4gICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIHByb3BzLCBjb2xvckZpZWxkKSxcbiAgICAgIGNvbG9yLFxuICAgICAgbG9hZEVETGlua0RhdGFcbiAgICB9KTtcblxuICAgIHJldHVybiBbXG4gICAgICB0ZW1wTGF5cixcbiAgICAgIC4uLih0aGlzLmlzTGF5ZXJIb3ZlcmVkKG9iamVjdEhvdmVyZWQpXG4gICAgICAgID8gW1xuICAgICAgICAgICAgbmV3IERlY2tHTEdlb0pzb25MYXllcih7XG4gICAgICAgICAgICAgIGlkOiBgJHt0aGlzLmlkfS1ob3ZlcmVkYCxcbiAgICAgICAgICAgICAgZGF0YTogW29iamVjdEhvdmVyZWQub2JqZWN0XSxcbiAgICAgICAgICAgICAgZ2V0TGluZVdpZHRoOiAxLFxuICAgICAgICAgICAgICBnZXRSYWRpdXM6IDIzLFxuICAgICAgICAgICAgICBnZXRFbGV2YXRpb246IDQ1LFxuICAgICAgICAgICAgICBnZXRMaW5lQ29sb3I6IFsyNTUsIDI1NSwgMF0sXG4gICAgICAgICAgICAgIGdldEZpbGxDb2xvcjogWzAsIDI1NSwgMjU1XSxcbiAgICAgICAgICAgICAgc3Ryb2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGlja2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBmaWxsZWQ6IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSlcbiAgICBdO1xuICB9XG59XG4iXX0=