@kepler.gl/deckgl-layers 3.3.0-alpha.6 → 3.3.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,6 +22,7 @@ import { SimpleMeshLayer } from '@deck.gl/mesh-layers';
22
22
  import { SphereGeometry } from '@luma.gl/engine';
23
23
  import { Vector3 } from '@math.gl/core';
24
24
  import { getSunPosition } from '@math.gl/sun';
25
+ import { DEFAULT_GLOBE_CONFIG } from '@kepler.gl/constants';
25
26
  var toRadians = function toRadians(degrees) {
26
27
  return degrees * Math.PI / 180;
27
28
  };
@@ -41,6 +42,13 @@ var GLOBE_MESH_OUTER = new SphereGeometry({
41
42
  nlat: 100,
42
43
  nlong: 100
43
44
  });
45
+
46
+ // ~14% larger than the globe surface mesh — yields a thick soft aura (~0.1–0.15R).
47
+ var GLOBE_MESH_HUGE_HALO = new SphereGeometry({
48
+ radius: 7.3e6,
49
+ nlat: 100,
50
+ nlong: 100
51
+ });
44
52
  var lon = 0,
45
53
  lat = 90;
46
54
  var sunPosNow = getSunPosition(Date.now(), lat, lon);
@@ -173,9 +181,89 @@ var ATMOSPHERE_SKY_PARAMETERS = {
173
181
  blendFunc: [0x0302, 0x0303, 1, 0x0303],
174
182
  blendEquation: [0x8006, 0x8006]
175
183
  };
176
- export var getGlobeAtmosphereLayer = function getGlobeAtmosphereLayer(_ref3) {
177
- var config = _ref3.config,
178
- zoom = _ref3.zoom;
184
+
185
+ /**
186
+ * Soft, sun-independent glow. Radii are in deck.gl common space
187
+ * (GLOBE_COMMON_RADIUS = 256; atmosphere uses ~258 as a slight fudge).
188
+ * Outer ≈ 14% larger than inner at radius multiplier = 1 (matches the base mesh).
189
+ */
190
+ var HUGE_HALO_INNER_RADIUS = 258;
191
+ var HUGE_HALO_BASE_OUTER_RADIUS = 294;
192
+ var HUGE_HALO_BASE_SHELL = HUGE_HALO_BASE_OUTER_RADIUS - HUGE_HALO_INNER_RADIUS;
193
+ /** Matches the Halo Radius slider max; higher values can produce a black-disc artifact. */
194
+ var HUGE_HALO_RADIUS_MAX = 3.5;
195
+ var HUGE_HALO_UNIFORMS = {
196
+ fInnerRadius: HUGE_HALO_INNER_RADIUS,
197
+ // Soft cyan matching the reference huge-halo look.
198
+ v3HaloColor: [0.45, 0.72, 1.0],
199
+ fHaloIntensity: 1.0
200
+ };
201
+ var HUGE_HALO_PARAMETERS = {
202
+ cullFace: 0x0404,
203
+ // GL.FRONT
204
+ depthMask: false,
205
+ // Large shells often enclose the camera; disable depth so the ring still draws.
206
+ depthTest: false,
207
+ blendFunc: [0x0302, 0x0303, 1, 0x0303],
208
+ // SRC_ALPHA, ONE_MINUS_SRC_ALPHA
209
+ blendEquation: [0x8006, 0x8006]
210
+ };
211
+ function resolveHugeHaloRadius(config) {
212
+ var multiplier = Number.isFinite(config.hugeHaloRadius) ? config.hugeHaloRadius : DEFAULT_GLOBE_CONFIG.hugeHaloRadius;
213
+ // Scale shell thickness; keep outer above the planet surface.
214
+ return HUGE_HALO_INNER_RADIUS + HUGE_HALO_BASE_SHELL * Math.max(Math.min(multiplier, HUGE_HALO_RADIUS_MAX), 0.05);
215
+ }
216
+ function resolveHugeHaloOpacity(config) {
217
+ var opacity = Number.isFinite(config.hugeHaloOpacity) ? config.hugeHaloOpacity : DEFAULT_GLOBE_CONFIG.hugeHaloOpacity;
218
+ return Math.max(0, Math.min(1, opacity));
219
+ }
220
+
221
+ /**
222
+ * View-independent atmosphere: a large uniform emissive aura around the globe.
223
+ * Unlike AtmosphereSkyLayerRealistic, this ignores sun direction and uses a
224
+ * linear radial falloff through a thick shell (max at the surface → 0 at outer radius).
225
+ */
226
+ export var AtmosphereHugeHaloLayer = /*#__PURE__*/function (_SimpleMeshLayer3) {
227
+ function AtmosphereHugeHaloLayer() {
228
+ _classCallCheck(this, AtmosphereHugeHaloLayer);
229
+ return _callSuper(this, AtmosphereHugeHaloLayer, arguments);
230
+ }
231
+ _inherits(AtmosphereHugeHaloLayer, _SimpleMeshLayer3);
232
+ return _createClass(AtmosphereHugeHaloLayer, [{
233
+ key: "draw",
234
+ value: function draw(_ref3) {
235
+ var uniforms = _ref3.uniforms;
236
+ var _this$props3 = this.props,
237
+ config = _this$props3.config,
238
+ zoomFade = _this$props3.zoomFade;
239
+ var model = this.state.model;
240
+ if (model) {
241
+ model.props.uniforms = _objectSpread(_objectSpread(_objectSpread({}, model.props.uniforms), HUGE_HALO_UNIFORMS), {}, {
242
+ fHaloOpacity: resolveHugeHaloOpacity(config),
243
+ fAtmosphereZoomFade: zoomFade
244
+ });
245
+ }
246
+ _superPropGet(AtmosphereHugeHaloLayer, "draw", this, 3)([{
247
+ uniforms: uniforms
248
+ }]);
249
+ }
250
+ }, {
251
+ key: "getShaders",
252
+ value: function getShaders() {
253
+ return _objectSpread(_objectSpread({}, _superPropGet(AtmosphereHugeHaloLayer, "getShaders", this, 3)([])), {}, {
254
+ inject: {
255
+ 'fs:#decl': "\n uniform float fInnerRadius;\n uniform vec3 v3HaloColor;\n uniform float fHaloIntensity;\n uniform float fHaloOpacity;\n uniform float fAtmosphereZoomFade;\n ",
256
+ 'fs:#main-end': "\n vec3 v3CameraPos = cameraPosition;\n vec3 v3Pos = position_commonspace.xyz;\n // Outer radius from the actual mesh vertex so sizeScale stays in sync.\n float fOuterRadius = length(v3Pos);\n vec3 v3Ray = normalize(v3Pos - v3CameraPos);\n\n // Impact parameter of the view ray (perpendicular distance from globe\n // center to the ray). Stable when the camera is inside the outer shell,\n // unlike near/far sphere-intersection math which breaks in that case\n // and produced a black disc at high radius multipliers.\n float fDMin = length(cross(v3CameraPos, v3Ray));\n\n // Linear falloff in the annulus only: max at the surface, zero at outer.\n float fShell = max(fOuterRadius - fInnerRadius, 0.0001);\n float fGlow = 0.0;\n if (fDMin >= fInnerRadius && fDMin < fOuterRadius) {\n float t = (fDMin - fInnerRadius) / fShell;\n fGlow = 1.0 - t;\n }\n\n fGlow *= fHaloIntensity;\n\n // Straight alpha (not premultiplied) for SRC_ALPHA blending.\n fragColor = vec4(v3HaloColor, fGlow * fHaloOpacity);\n fragColor.a *= fAtmosphereZoomFade;\n ",
257
+ 'fs:DECKGL_FILTER_COLOR': ""
258
+ }
259
+ });
260
+ }
261
+ }]);
262
+ }(SimpleMeshLayer);
263
+ _defineProperty(AtmosphereHugeHaloLayer, "layerName", 'AtmosphereHugeHaloLayer');
264
+ export var getGlobeAtmosphereLayer = function getGlobeAtmosphereLayer(_ref4) {
265
+ var config = _ref4.config,
266
+ zoom = _ref4.zoom;
179
267
  var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
180
268
  return new AtmosphereLayerRealistic({
181
269
  id: 'atmosphere',
@@ -192,9 +280,11 @@ export var getGlobeAtmosphereLayer = function getGlobeAtmosphereLayer(_ref3) {
192
280
  parameters: ATMOSPHERE_PARAMETERS
193
281
  });
194
282
  };
195
- export var getGlobeAtmosphereSkyLayer = function getGlobeAtmosphereSkyLayer(_ref4) {
196
- var config = _ref4.config,
197
- zoom = _ref4.zoom;
283
+
284
+ /** Realistic sun-lit scattering sky halo (thin limb glow). */
285
+ export var getGlobeAtmosphereSkyLayer = function getGlobeAtmosphereSkyLayer(_ref5) {
286
+ var config = _ref5.config,
287
+ zoom = _ref5.zoom;
198
288
  var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
199
289
  return new AtmosphereSkyLayerRealistic({
200
290
  id: 'atmosphere-sky',
@@ -211,4 +301,35 @@ export var getGlobeAtmosphereSkyLayer = function getGlobeAtmosphereSkyLayer(_ref
211
301
  parameters: ATMOSPHERE_SKY_PARAMETERS
212
302
  });
213
303
  };
214
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT09SRElOQVRFX1NZU1RFTSIsIlNpbXBsZU1lc2hMYXllciIsIlNwaGVyZUdlb21ldHJ5IiwiVmVjdG9yMyIsImdldFN1blBvc2l0aW9uIiwidG9SYWRpYW5zIiwiZGVncmVlcyIsIk1hdGgiLCJQSSIsImFuZ2xlVG9WZWMiLCJhbmdsZSIsInNpbiIsImNvcyIsImFuZ2xlVG9TdW5Qb3MiLCJub3JtYWxpemUiLCJHTE9CRV9NRVNIX0lOTkVSIiwicmFkaXVzIiwibmxhdCIsIm5sb25nIiwiR0xPQkVfTUVTSF9PVVRFUiIsImxvbiIsImxhdCIsInN1blBvc05vdyIsIkRhdGUiLCJub3ciLCJ2M1N1blBvc05vdyIsImF6aW11dGgiLCJOVU1fU0FNUExFX1JBWVMiLCJBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCIsIkFUTU9TUEhFUkVfRkFERV9aT09NX0VORCIsImF0bW9zcGhlcmVab29tRmFkZSIsInpvb20iLCJ0IiwiQVRNT1NQSEVSRV9VTklGT1JNUyIsInYzU3VuUG9zIiwiZXhwb3N1cmUiLCJmU2FtcGxlcyIsImciLCJmS3JFU3VuIiwiZkttRVN1biIsImZLcjRQSSIsImZLbTRQSSIsImZTY2FsZURlcHRoIiwiZklubmVyUmFkaXVzIiwiZk91dGVyUmFkaXVzIiwiZlRlcm1pbmF0b3JBdHRlbnVhdGVGYWN0b3IiLCJmVGVybWluYXRvck9wYWNpdHlGYWN0b3IiLCJBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMiLCJfU2ltcGxlTWVzaExheWVyIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NhbGxTdXBlciIsImFyZ3VtZW50cyIsIl9pbmhlcml0cyIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiZHJhdyIsIl9yZWYiLCJ1bmlmb3JtcyIsIl90aGlzJHByb3BzIiwicHJvcHMiLCJjb25maWciLCJ6b29tRmFkZSIsIm1vZGVsIiwic3RhdGUiLCJfb2JqZWN0U3ByZWFkIiwidGVybWluYXRvciIsInRlcm1pbmF0b3JPcGFjaXR5IiwiYXppbXV0aEFuZ2xlIiwiZkF0bW9zcGhlcmVab29tRmFkZSIsIl9zdXBlclByb3BHZXQiLCJnZXRTaGFkZXJzIiwiaW5qZWN0IiwiY29uY2F0IiwiX2RlZmluZVByb3BlcnR5IiwiQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljIiwiX1NpbXBsZU1lc2hMYXllcjIiLCJfcmVmMiIsIl90aGlzJHByb3BzMiIsIkFUTU9TUEhFUkVfUEFSQU1FVEVSUyIsImRlcHRoVGVzdCIsImJsZW5kRnVuYyIsImJsZW5kRXF1YXRpb24iLCJBVE1PU1BIRVJFX1NLWV9QQVJBTUVURVJTIiwiY3VsbEZhY2UiLCJkZXB0aE1hc2siLCJnZXRHbG9iZUF0bW9zcGhlcmVMYXllciIsIl9yZWYzIiwiaWQiLCJkYXRhIiwiY29vcmRpbmF0ZU9yaWdpbiIsImNvb3JkaW5hdGVTeXN0ZW0iLCJDQVJURVNJQU4iLCJnZXRQb3NpdGlvbiIsImQiLCJnZXRDb2xvciIsIm1lc2giLCJwYXJhbWV0ZXJzIiwiZ2V0R2xvYmVBdG1vc3BoZXJlU2t5TGF5ZXIiLCJfcmVmNCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nbG9iZS9hdG1vc3BoZXJlLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIFNoYWRlcnMgcG9ydGVkIGZyb20gaVRvd25zLCBiYXNlZCBvbiBTZWFuIE8nTmVpbCdzIGFwcHJvYWNoIGluIEdQVSBHZW1zIDJcbi8vIFNFRTogaHR0cHM6Ly9naXRodWIuY29tL2lUb3ducy9pdG93bnMvYmxvYi9tYXN0ZXIvc3JjL0NvcmUvUHJlZmFiL0dsb2JlL0F0bW9zcGhlcmUuanNcbi8vIFNFRTogaHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9ncHVnZW1zL2dwdWdlbXMyL3BhcnQtaWktc2hhZGluZy1saWdodGluZy1hbmQtc2hhZG93cy9jaGFwdGVyLTE2LWFjY3VyYXRlLWF0bW9zcGhlcmljLXNjYXR0ZXJpbmdcblxuaW1wb3J0IHtDT09SRElOQVRFX1NZU1RFTX0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NpbXBsZU1lc2hMYXllcn0gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtTcGhlcmVHZW9tZXRyeX0gZnJvbSAnQGx1bWEuZ2wvZW5naW5lJztcbmltcG9ydCB7VmVjdG9yM30gZnJvbSAnQG1hdGguZ2wvY29yZSc7XG5pbXBvcnQge2dldFN1blBvc2l0aW9ufSBmcm9tICdAbWF0aC5nbC9zdW4nO1xuXG5pbXBvcnQgdHlwZSB7R2xvYmVDb25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuY29uc3QgdG9SYWRpYW5zID0gKGRlZ3JlZXM6IG51bWJlcik6IG51bWJlciA9PiAoZGVncmVlcyAqIE1hdGguUEkpIC8gMTgwO1xuXG5jb25zdCBhbmdsZVRvVmVjID0gKGFuZ2xlOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICByZXR1cm4gW01hdGguc2luKGFuZ2xlKSwgTWF0aC5jb3MoYW5nbGUpLCAwXTtcbn07XG5cbmNvbnN0IGFuZ2xlVG9TdW5Qb3MgPSAoYW5nbGU6IG51bWJlcik6IG51bWJlcltdID0+IHtcbiAgcmV0dXJuIG5ldyBWZWN0b3IzKGFuZ2xlVG9WZWMoYW5nbGUpKS5ub3JtYWxpemUoKSBhcyB1bmtub3duIGFzIG51bWJlcltdO1xufTtcblxuY29uc3QgR0xPQkVfTUVTSF9JTk5FUiA9IG5ldyBTcGhlcmVHZW9tZXRyeSh7XG4gIHJhZGl1czogNi40ZTYsXG4gIG5sYXQ6IDEwMCxcbiAgbmxvbmc6IDEwMFxufSk7XG5cbmNvbnN0IEdMT0JFX01FU0hfT1VURVIgPSBuZXcgU3BoZXJlR2VvbWV0cnkoe1xuICByYWRpdXM6IDYuN2U2LFxuICBubGF0OiAxMDAsXG4gIG5sb25nOiAxMDBcbn0pO1xuXG5jb25zdCBbbG9uLCBsYXRdID0gWzAsIDkwXTtcbmNvbnN0IHN1blBvc05vdyA9IGdldFN1blBvc2l0aW9uKERhdGUubm93KCksIGxhdCwgbG9uKTtcbmNvbnN0IHYzU3VuUG9zTm93ID0gYW5nbGVUb1N1blBvcyhzdW5Qb3NOb3cuYXppbXV0aCArIE1hdGguUEkpO1xuXG5jb25zdCBOVU1fU0FNUExFX1JBWVMgPSAzO1xuXG4vKipcbiAqIFpvb20gcmFuZ2Ugb3ZlciB3aGljaCB0aGUgYXRtb3NwaGVyZSBlZmZlY3QgZmFkZXMgb3V0LlxuICogQmVsb3cgQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQgdGhlIGVmZmVjdCBpcyBmdWxseSB2aXNpYmxlLlxuICogQWJvdmUgQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIHRoZSBlZmZlY3QgaXMgY29tcGxldGVseSBoaWRkZW4uXG4gKi9cbmNvbnN0IEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUID0gMy41O1xuY29uc3QgQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EID0gNjtcblxuLyoqXG4gKiBDb252ZXJ0IGEgbWFwU3RhdGUgem9vbSBsZXZlbCB0byBhIFswLCAxXSBhdG1vc3BoZXJlIG9wYWNpdHkgbXVsdGlwbGllci5cbiAqIFJldHVybnMgMSAoZnVsbHkgdmlzaWJsZSkgYmVsb3cgQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQsIHNtb290aGx5XG4gKiBpbnRlcnBvbGF0ZXMgdG8gMCBiZXR3ZWVuIHRoZSB0d28gdGhyZXNob2xkcywgYW5kIHJldHVybnMgMCBhYm92ZVxuICogQVRNT1NQSEVSRV9GQURFX1pPT01fRU5ELlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXRtb3NwaGVyZVpvb21GYWRlKHpvb206IG51bWJlcik6IG51bWJlciB7XG4gIGlmICh6b29tIDw9IEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUKSByZXR1cm4gMTtcbiAgaWYgKHpvb20gPj0gQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EKSByZXR1cm4gMDtcbiAgY29uc3QgdCA9ICh6b29tIC0gQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQpIC8gKEFUTU9TUEhFUkVfRkFERV9aT09NX0VORCAtIEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUKTtcbiAgLy8gU21vb3RoLXN0ZXAgZm9yIGEgcGVyY2VwdHVhbGx5IGdlbnRsZSB0cmFuc2l0aW9uLlxuICByZXR1cm4gMSAtIHQgKiB0ICogKDMgLSAyICogdCk7XG59XG5cbmNvbnN0IEFUTU9TUEhFUkVfVU5JRk9STVMgPSB7XG4gIHYzU3VuUG9zOiB2M1N1blBvc05vdyxcbiAgZXhwb3N1cmU6IDIsXG4gIGZTYW1wbGVzOiAzLFxuICBnOiAtMC42NSxcbiAgZktyRVN1bjogMC4wMDAyNSAqIDIwLFxuICBmS21FU3VuOiAwLjAwMDEgKiAyMCxcbiAgZktyNFBJOiAwLjAwMDI1ICogNCAqIE1hdGguUEksXG4gIGZLbTRQSTogMC4wMDAxICogNCAqIE1hdGguUEksXG4gIGZTY2FsZURlcHRoOiAwLjI1LFxuICBmSW5uZXJSYWRpdXM6IDI1OCxcbiAgZk91dGVyUmFkaXVzOiAyNjUsXG4gIGZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yOiAwLjgsXG4gIGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjogMVxufTtcblxudHlwZSBBdG1vc3BoZXJlTGF5ZXJQcm9wcyA9IHtcbiAgY29uZmlnOiBHbG9iZUNvbmZpZztcbiAgLyoqIFByZS1jb21wdXRlZCBbMCwgMV0gem9vbS1mYWRlIG11bHRpcGxpZXI7IDEgPSBmdWxseSB2aXNpYmxlLCAwID0gaGlkZGVuLiAqL1xuICB6b29tRmFkZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIEF0bW9zcGhlcmVMYXllclJlYWxpc3RpYyBleHRlbmRzIFNpbXBsZU1lc2hMYXllcjxhbnksIEF0bW9zcGhlcmVMYXllclByb3BzPiB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljJztcblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWcsIHpvb21GYWRlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN0YXRlLm1vZGVsO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAuLi5BVE1PU1BIRVJFX1VOSUZPUk1TLFxuICAgICAgICBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I6IGNvbmZpZy50ZXJtaW5hdG9yID8gY29uZmlnLnRlcm1pbmF0b3JPcGFjaXR5IDogMCxcbiAgICAgICAgdjNTdW5Qb3M6IGNvbmZpZy5hemltdXRoID8gYW5nbGVUb1N1blBvcyh0b1JhZGlhbnMoY29uZmlnLmF6aW11dGhBbmdsZSkpIDogdjNTdW5Qb3NOb3csXG4gICAgICAgIGZBdG1vc3BoZXJlWm9vbUZhZGU6IHpvb21GYWRlXG4gICAgICB9O1xuICAgIH1cbiAgICBzdXBlci5kcmF3KHt1bmlmb3Jtc30pO1xuICB9XG5cbiAgZ2V0U2hhZGVycygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXRTaGFkZXJzKCksXG4gICAgICBpbmplY3Q6IHtcbiAgICAgICAgJ2ZzOiNkZWNsJzogYFxuICAgICAgICAgIHVuaWZvcm0gdmVjMyB2M1N1blBvcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2FtcGxlcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZklubmVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZk91dGVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZktyRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbUVTdW47XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3I0UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS200UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZlRlcm1pbmF0b3JBdHRlbnVhdGVGYWN0b3I7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmQXRtb3NwaGVyZVpvb21GYWRlO1xuXG4gICAgICAgICAgY29uc3QgaW50IG5TYW1wbGVzID0gJHtOVU1fU0FNUExFX1JBWVN9O1xuXG4gICAgICAgICAgZmxvYXQgc2NhbGUoZmxvYXQgZkNvcykge1xuICAgICAgICAgICAgZmxvYXQgeCA9IDEuMCAtIGZDb3M7XG4gICAgICAgICAgICByZXR1cm4gZlNjYWxlRGVwdGggKiBleHAoLTAuMDAyODcgKyB4KigwLjQ1OSArIHgqKDMuODMgKyB4KigtNi44ICsgeCo1LjI1KSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgICAgICdmczojbWFpbi1lbmQnOiBgXG4gICAgICAgICAgdmVjMyB2M0NhbWVyYVBvcyA9IGNhbWVyYVBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgdjNQb3MgPSBwb3NpdGlvbl9jb21tb25zcGFjZS54eXo7XG5cbiAgICAgICAgICBmbG9hdCBnMiA9IGcgKiBnO1xuXG4gICAgICAgICAgdmVjMyB2M0ludldhdmVsZW5ndGggPSB2ZWMzKDEuMCAvIHBvdygwLjY1MCwgNC4wKSwgMS4wIC8gcG93KDAuNTcwLCA0LjApLCAxLjAgLyBwb3coMC40NzUsIDQuMCkpO1xuXG4gICAgICAgICAgZmxvYXQgZklubmVyUmFkaXVzMiA9IGZJbm5lclJhZGl1cyAqIGZJbm5lclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmT3V0ZXJSYWRpdXMyID0gZk91dGVyUmFkaXVzICogZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZSA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZU92ZXJTY2FsZURlcHRoID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cykgLyBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIGZsb2F0IGNhbWVyYUhlaWdodDIgPSBsZW5ndGgodjNDYW1lcmFQb3MpICogbGVuZ3RoKHYzQ2FtZXJhUG9zKTtcblxuICAgICAgICAgIHZlYzMgdjNSYXkgPSB2M1BvcyAtIHYzQ2FtZXJhUG9zO1xuICAgICAgICAgIGZsb2F0IGZGYXIgPSBsZW5ndGgodjNSYXkpO1xuICAgICAgICAgIHYzUmF5IC89IGZGYXI7XG5cbiAgICAgICAgICBmbG9hdCBCID0gMi4wICogZG90KHYzQ2FtZXJhUG9zLCB2M1JheSk7XG4gICAgICAgICAgZmxvYXQgQyA9IGNhbWVyYUhlaWdodDIgLSBmT3V0ZXJSYWRpdXMyO1xuICAgICAgICAgIGZsb2F0IGZEZXQgPSBtYXgoMC4wLCBCKkIgLSA0LjAgKiBDKTtcbiAgICAgICAgICBmbG9hdCBmTmVhciA9IDAuNSAqICgtQiAtIHNxcnQoZkRldCkpO1xuXG4gICAgICAgICAgdmVjMyB2M1N0YXJ0ID0gdjNDYW1lcmFQb3MgKyB2M1JheSAqIGZOZWFyO1xuICAgICAgICAgIGZGYXIgLT0gZk5lYXI7XG5cbiAgICAgICAgICBmbG9hdCBmRGVwdGggPSBleHAoKGZJbm5lclJhZGl1cyAtIGZPdXRlclJhZGl1cykgLyBmU2NhbGVEZXB0aCk7XG4gICAgICAgICAgZmxvYXQgZkNhbWVyYUFuZ2xlID0gZG90KC12M1JheSwgdjNQb3MpIC8gbGVuZ3RoKHYzUG9zKTtcbiAgICAgICAgICBmbG9hdCBmTGlnaHRBbmdsZSA9IGRvdCh2M1N1blBvcywgdjNQb3MpIC8gbGVuZ3RoKHYzUG9zKTtcbiAgICAgICAgICBmbG9hdCBmQ2FtZXJhU2NhbGUgPSBzY2FsZShmQ2FtZXJhQW5nbGUpO1xuICAgICAgICAgIGZsb2F0IGZMaWdodFNjYWxlID0gc2NhbGUoZkxpZ2h0QW5nbGUpO1xuICAgICAgICAgIGZsb2F0IGZDYW1lcmFPZmZzZXQgPSBmRGVwdGgqZkNhbWVyYVNjYWxlO1xuICAgICAgICAgIGZsb2F0IGZUZW1wID0gKGZMaWdodFNjYWxlICsgZkNhbWVyYVNjYWxlKTtcblxuICAgICAgICAgIGZsb2F0IGZTYW1wbGVMZW5ndGggPSBmRmFyIC8gZlNhbXBsZXM7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlZExlbmd0aCA9IGZTYW1wbGVMZW5ndGggKiBmU2NhbGU7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVJheSA9IHYzUmF5ICogZlNhbXBsZUxlbmd0aDtcbiAgICAgICAgICB2ZWMzIHYzU2FtcGxlUG9pbnQgPSB2M1N0YXJ0ICsgdjNTYW1wbGVSYXkgKiAwLjU7XG5cbiAgICAgICAgICB2ZWMzIHYzRnJvbnRDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgICAgdmVjMyB2M0F0dGVudWF0ZSA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgICAgZm9yKGludCBpPTA7IGk8blNhbXBsZXM7IGkrKylcbiAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZsb2F0IGZIZWlnaHQgPSBsZW5ndGgodjNTYW1wbGVQb2ludCk7XG4gICAgICAgICAgICAgIGZsb2F0IGZEZXB0aCA9IGV4cChmU2NhbGVPdmVyU2NhbGVEZXB0aCAqIChmSW5uZXJSYWRpdXMgLSBmSGVpZ2h0KSk7XG4gICAgICAgICAgICAgIGZsb2F0IGZTY2F0dGVyID0gZkRlcHRoKmZUZW1wIC0gZkNhbWVyYU9mZnNldDtcbiAgICAgICAgICAgICAgdjNBdHRlbnVhdGUgPSBleHAoLWZTY2F0dGVyICogKHYzSW52V2F2ZWxlbmd0aCAqIGZLcjRQSSArIGZLbTRQSSkpO1xuICAgICAgICAgICAgICB2M0Zyb250Q29sb3IgKz0gdjNBdHRlbnVhdGUgKiAoZkRlcHRoICogZlNjYWxlZExlbmd0aCk7XG4gICAgICAgICAgICAgIHYzU2FtcGxlUG9pbnQgKz0gdjNTYW1wbGVSYXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmVjMyBjMCA9IHYzQXR0ZW51YXRlO1xuICAgICAgICAgIHZlYzMgYzEgPSB2M0Zyb250Q29sb3IgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyRVN1biArIGZLbUVTdW4pO1xuXG4gICAgICAgICAgZnJhZ0NvbG9yID0gdmVjNChjMSwgMS4wIC0gYzAgKiBmVGVybWluYXRvckF0dGVudWF0ZUZhY3Rvcik7XG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yO1xuXG4gICAgICAgICAgLy8gS2VlcCB0aGUgZGF5IGhlbWlzcGhlcmUgY29tcGxldGVseSB1bnNoYWRlZCDigJQgdGhlIGF0dGVudWF0aW9uLWJhc2VkXG4gICAgICAgICAgLy8gYWxwaGEgYWJvdmUgaXMgbm9uLXplcm8gZXZlbiBhdCBub29uLCB3aGljaCBzbGlnaHRseSBkYXJrZW5zIHRoZSBsaXRcbiAgICAgICAgICAvLyBzaWRlLiBHYXRlIGl0IHdpdGggYSBkYXkvbmlnaHQgbWFzayBzbyBkYXJrZW5pbmcgb25seSBhcHBlYXJzIGFjcm9zc1xuICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hdG9yIGFuZCBvbnRvIHRoZSBuaWdodCBzaWRlLlxuICAgICAgICAgIC8vIGZMaWdodEFuZ2xlID0gZG90KHN1bkRpciwgc3VyZmFjZU5vcm1hbCk6ICsxIGF0IHRoZSBzdWJzb2xhciBwb2ludFxuICAgICAgICAgIC8vIChub29uKSwgMCBhdCB0aGUgdGVybWluYXRvciwgLTEgYXQgbWlkbmlnaHQuIHNtb290aHN0ZXAgbWFwcyB0aGUgZGF5XG4gICAgICAgICAgLy8gc2lkZSAoPj0gMC4yKSB0byAwIChubyBkYXJrZW5pbmcpLCByYW1wcyB0aHJvdWdoIHRoZSB0ZXJtaW5hdG9yLCBhbmRcbiAgICAgICAgICAvLyByZWFjaGVzIGZ1bGwgZGFya2VuaW5nIG9uIHRoZSBuaWdodCBzaWRlICg8PSAtMC4yKS5cbiAgICAgICAgICBmbG9hdCBmTmlnaHRNYXNrID0gc21vb3Roc3RlcCgwLjIsIC0wLjIsIGZMaWdodEFuZ2xlKTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmTmlnaHRNYXNrO1xuXG4gICAgICAgICAgLy8gRmFkZSBvdXQgdGhlIGVudGlyZSBkYXkvbmlnaHQgc2hhZGluZyBlZmZlY3QgYXMgdGhlIHVzZXIgem9vbXMgaW4uXG4gICAgICAgICAgLy8gQXQgem9vbSBsZXZlbHMgYWJvdmUgQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIHRoZSBlZmZlY3QgaXMgaW52aXNpYmxlLFxuICAgICAgICAgIC8vIHNvIGl0IGRvZXNuJ3Qgb2JzY3VyZSBtYXAgZGV0YWlsIGF0IHN0cmVldC9jaXR5IHNjYWxlLlxuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG4gICAgICAgIGAsXG4gICAgICAgICdmczpERUNLR0xfRklMVEVSX0NPTE9SJzogYGBcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMgZXh0ZW5kcyBTaW1wbGVNZXNoTGF5ZXI8YW55LCBBdG1vc3BoZXJlTGF5ZXJQcm9wcz4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0F0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyc7XG5cbiAgZHJhdyh7dW5pZm9ybXN9OiB7dW5pZm9ybXM6IG9iamVjdH0pOiB2b2lkIHtcbiAgICBjb25zdCB7Y29uZmlnLCB6b29tRmFkZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zdGF0ZS5tb2RlbDtcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIChtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zID0ge1xuICAgICAgICAuLi4obW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyxcbiAgICAgICAgLi4uQVRNT1NQSEVSRV9VTklGT1JNUyxcbiAgICAgICAgdjNTdW5Qb3M6IGNvbmZpZy5hemltdXRoID8gYW5nbGVUb1N1blBvcyh0b1JhZGlhbnMoY29uZmlnLmF6aW11dGhBbmdsZSkpIDogdjNTdW5Qb3NOb3csXG4gICAgICAgIGZBdG1vc3BoZXJlWm9vbUZhZGU6IHpvb21GYWRlXG4gICAgICB9O1xuICAgIH1cbiAgICBzdXBlci5kcmF3KHt1bmlmb3Jtc30pO1xuICB9XG5cbiAgZ2V0U2hhZGVycygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXRTaGFkZXJzKCksXG4gICAgICBpbmplY3Q6IHtcbiAgICAgICAgJ2ZzOiNkZWNsJzogYFxuICAgICAgICAgIHVuaWZvcm0gdmVjMyB2M1N1blBvcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2FtcGxlcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZklubmVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZk91dGVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZktyRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbUVTdW47XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3I0UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS200UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2NhbGVEZXB0aDtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG5cbiAgICAgICAgICBjb25zdCBpbnQgblNhbXBsZXMgPSAke05VTV9TQU1QTEVfUkFZU307XG5cbiAgICAgICAgICBmbG9hdCBzY2FsZShmbG9hdCBmQ29zKSB7XG4gICAgICAgICAgICBmbG9hdCB4ID0gMS4wIC0gZkNvcztcbiAgICAgICAgICAgIHJldHVybiBmU2NhbGVEZXB0aCAqIGV4cCgtMC4wMDI4NyArIHgqKDAuNDU5ICsgeCooMy44MyArIHgqKC02LjggKyB4KjUuMjUpKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZsb2F0IGdldE1pZVBoYXNlKGZsb2F0IGZDb3MsIGZsb2F0IGZDb3MyLCBmbG9hdCBnLCBmbG9hdCBnMikge1xuICAgICAgICAgICAgcmV0dXJuIDEuNSAqICgoMS4wIC0gZzIpIC8gKDIuMCArIGcyKSkgKiAoMS4wICsgZkNvczIpIC8gcG93KDEuMCArIGcyIC0gMi4wICogZyAqIGZDb3MsIDEuNSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgZ2V0UmF5bGVpZ2hQaGFzZShmbG9hdCBmQ29zMikge1xuICAgICAgICAgICAgcmV0dXJuIDAuNzUgKyAwLjc1ICogZkNvczI7XG4gICAgICAgICAgfVxuICAgICAgICBgLFxuICAgICAgICAnZnM6I21haW4tZW5kJzogYFxuICAgICAgICAgIHZlYzMgdjNDYW1lcmFQb3MgPSBjYW1lcmFQb3NpdGlvbjtcbiAgICAgICAgICB2ZWMzIHYzUG9zID0gcG9zaXRpb25fY29tbW9uc3BhY2UueHl6O1xuXG4gICAgICAgICAgZmxvYXQgZzIgPSBnICogZztcblxuICAgICAgICAgIHZlYzMgdjNJbnZXYXZlbGVuZ3RoID0gdmVjMygxLjAgLyBwb3coMC42NTAsIDQuMCksIDEuMCAvIHBvdygwLjU3MCwgNC4wKSwgMS4wIC8gcG93KDAuNDc1LCA0LjApKTtcblxuICAgICAgICAgIGZsb2F0IGZJbm5lclJhZGl1czIgPSBmSW5uZXJSYWRpdXMgKiBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZk91dGVyUmFkaXVzMiA9IGZPdXRlclJhZGl1cyAqIGZPdXRlclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmU2NhbGUgPSAxLjAgLyAoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzKTtcbiAgICAgICAgICBmbG9hdCBmU2NhbGVPdmVyU2NhbGVEZXB0aCA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpIC8gZlNjYWxlRGVwdGg7XG5cbiAgICAgICAgICBmbG9hdCBjYW1lcmFIZWlnaHQyID0gbGVuZ3RoKHYzQ2FtZXJhUG9zKSAqIGxlbmd0aCh2M0NhbWVyYVBvcyk7XG5cbiAgICAgICAgICB2ZWMzIHYzUmF5ID0gdjNQb3MgLSB2M0NhbWVyYVBvcztcbiAgICAgICAgICBmbG9hdCBmRmFyID0gbGVuZ3RoKHYzUmF5KTtcbiAgICAgICAgICB2M1JheSAvPSBmRmFyO1xuXG4gICAgICAgICAgZmxvYXQgQiA9IDIuMCAqIGRvdCh2M0NhbWVyYVBvcywgdjNSYXkpO1xuICAgICAgICAgIGZsb2F0IEMgPSBjYW1lcmFIZWlnaHQyIC0gZk91dGVyUmFkaXVzMjtcbiAgICAgICAgICBmbG9hdCBmRGV0ID0gbWF4KDAuMCwgQipCIC0gNC4wICogQyk7XG4gICAgICAgICAgZmxvYXQgZk5lYXIgPSAwLjUgKiAoLUIgLSBzcXJ0KGZEZXQpKTtcblxuICAgICAgICAgIHZlYzMgdjNTdGFydCA9IHYzQ2FtZXJhUG9zICsgdjNSYXkgKiBmTmVhcjtcbiAgICAgICAgICBmRmFyIC09IGZOZWFyO1xuICAgICAgICAgIGZsb2F0IGZTdGFydEFuZ2xlID0gZG90KHYzUmF5LCB2M1N0YXJ0KSAvIGZPdXRlclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmU3RhcnREZXB0aCA9IGV4cCgtMS4wIC8gZlNjYWxlRGVwdGgpO1xuICAgICAgICAgIGZsb2F0IGZTdGFydE9mZnNldCA9IGZTdGFydERlcHRoICogc2NhbGUoZlN0YXJ0QW5nbGUpO1xuXG4gICAgICAgICAgZmxvYXQgZlNhbXBsZUxlbmd0aCA9IGZGYXIgLyBmU2FtcGxlcztcbiAgICAgICAgICBmbG9hdCBmU2NhbGVkTGVuZ3RoID0gZlNhbXBsZUxlbmd0aCAqIGZTY2FsZTtcbiAgICAgICAgICB2ZWMzIHYzU2FtcGxlUmF5ID0gdjNSYXkgKiBmU2FtcGxlTGVuZ3RoO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVQb2ludCA9IHYzU3RhcnQgKyB2M1NhbXBsZVJheSAqIDAuNTtcblxuICAgICAgICAgIHZlYzMgdjNGcm9udENvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaTxuU2FtcGxlczsgaSsrKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZsb2F0IGZIZWlnaHQgPSBsZW5ndGgodjNTYW1wbGVQb2ludCk7XG4gICAgICAgICAgICBmbG9hdCBmRGVwdGggPSBleHAoZlNjYWxlT3ZlclNjYWxlRGVwdGggKiAoZklubmVyUmFkaXVzIC0gZkhlaWdodCkpO1xuICAgICAgICAgICAgZmxvYXQgZkxpZ2h0QW5nbGUgPSBkb3QodjNTdW5Qb3MsIHYzU2FtcGxlUG9pbnQpIC8gZkhlaWdodDtcbiAgICAgICAgICAgIGZsb2F0IGZDYW1lcmFBbmdsZSA9IGRvdCh2M1JheSwgdjNTYW1wbGVQb2ludCkgLyBmSGVpZ2h0O1xuICAgICAgICAgICAgZmxvYXQgZlNjYXR0ZXIgPSAoZlN0YXJ0T2Zmc2V0ICsgZkRlcHRoICogKHNjYWxlKGZMaWdodEFuZ2xlKSAtIHNjYWxlKGZDYW1lcmFBbmdsZSkpKTtcbiAgICAgICAgICAgIHZlYzMgdjNBdHRlbnVhdGUgPSBleHAoLWZTY2F0dGVyICogKHYzSW52V2F2ZWxlbmd0aCAqIGZLcjRQSSArIGZLbTRQSSkpO1xuXG4gICAgICAgICAgICB2M0Zyb250Q29sb3IgKz0gdjNBdHRlbnVhdGUgKiAoZkRlcHRoICogZlNjYWxlZExlbmd0aCk7XG4gICAgICAgICAgICB2M1NhbXBsZVBvaW50ICs9IHYzU2FtcGxlUmF5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZlYzMgYzAgPSB2M0Zyb250Q29sb3IgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyRVN1bik7XG4gICAgICAgICAgdmVjMyBjMSA9IHYzRnJvbnRDb2xvciAqIGZLbUVTdW47XG5cbiAgICAgICAgICB2ZWMzIHYzRGlyZWN0aW9uID0gdjNDYW1lcmFQb3MgLSB2M1BvcztcblxuICAgICAgICAgIGZsb2F0IGZDb3MgPSBkb3QodjNTdW5Qb3MsIHYzRGlyZWN0aW9uKSAvIGxlbmd0aCh2M0RpcmVjdGlvbik7XG4gICAgICAgICAgZmxvYXQgZkNvczIgPSBmQ29zICogZkNvcztcblxuICAgICAgICAgIHZlYzMgc2t5Q29sb3IgPSBnZXRSYXlsZWlnaFBoYXNlKGZDb3MyKSAqIGMwICsgZ2V0TWllUGhhc2UoZkNvcywgZkNvczIsIGcsIGcyKSAqIGMxO1xuXG4gICAgICAgICAgZnJhZ0NvbG9yID0gdmVjNChza3lDb2xvciwgMS4wKTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSA9IGZyYWdDb2xvci5iO1xuXG4gICAgICAgICAgLy8gRmFkZSB0aGUgc2t5IGhhbG8gb3V0IGFzIHRoZSB1c2VyIHpvb21zIGluIHBhc3QgY29udGluZW50IHNjYWxlLlxuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG4gICAgICAgIGAsXG4gICAgICAgICdmczpERUNLR0xfRklMVEVSX0NPTE9SJzogYGBcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmNvbnN0IEFUTU9TUEhFUkVfUEFSQU1FVEVSUyA9IHtcbiAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgYmxlbmRGdW5jOiBbMHgwMzAyLCAweDAzMDMsIDEsIDB4MDMwM10sIC8vIFNSQ19BTFBIQSwgT05FX01JTlVTX1NSQ19BTFBIQSwgT05FLCBPTkVfTUlOVVNfU1JDX0FMUEhBXG4gIGJsZW5kRXF1YXRpb246IFsweDgwMDYsIDB4ODAwNl0gLy8gRlVOQ19BRERcbn07XG5cbmNvbnN0IEFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlMgPSB7XG4gIGN1bGxGYWNlOiAweDA0MDQsIC8vIEdMLkZST05UXG4gIGRlcHRoTWFzazogZmFsc2UsXG4gIGJsZW5kRnVuYzogWzB4MDMwMiwgMHgwMzAzLCAxLCAweDAzMDNdLFxuICBibGVuZEVxdWF0aW9uOiBbMHg4MDA2LCAweDgwMDZdXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIgPSAoe2NvbmZpZywgem9vbX06IHtjb25maWc6IEdsb2JlQ29uZmlnOyB6b29tPzogbnVtYmVyfSkgPT4ge1xuICBjb25zdCB6b29tRmFkZSA9IGF0bW9zcGhlcmVab29tRmFkZSh6b29tID8/IDApO1xuICByZXR1cm4gbmV3IEF0bW9zcGhlcmVMYXllclJlYWxpc3RpYyh7XG4gICAgaWQ6ICdhdG1vc3BoZXJlJyxcbiAgICBkYXRhOiBbWzAsIDAsIDBdXSxcbiAgICBjb25maWcsXG4gICAgem9vbUZhZGUsXG4gICAgY29vcmRpbmF0ZU9yaWdpbjogWzAsIDAsIDBdLFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICBnZXRQb3NpdGlvbjogKChkOiBudW1iZXJbXSkgPT4gZCkgYXMgYW55LFxuICAgIGdldENvbG9yOiBbMCwgMCwgMF0sXG4gICAgbWVzaDogR0xPQkVfTUVTSF9JTk5FUixcbiAgICBwYXJhbWV0ZXJzOiBBVE1PU1BIRVJFX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVBdG1vc3BoZXJlU2t5TGF5ZXIgPSAoe2NvbmZpZywgem9vbX06IHtjb25maWc6IEdsb2JlQ29uZmlnOyB6b29tPzogbnVtYmVyfSkgPT4ge1xuICBjb25zdCB6b29tRmFkZSA9IGF0bW9zcGhlcmVab29tRmFkZSh6b29tID8/IDApO1xuICByZXR1cm4gbmV3IEF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyh7XG4gICAgaWQ6ICdhdG1vc3BoZXJlLXNreScsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29uZmlnLFxuICAgIHpvb21GYWRlLFxuICAgIGNvb3JkaW5hdGVPcmlnaW46IFswLCAwLCAwXSxcbiAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgZ2V0UG9zaXRpb246ICgoZDogbnVtYmVyW10pID0+IGQpIGFzIGFueSxcbiAgICBnZXRDb2xvcjogWzAsIDAsIDBdLFxuICAgIG1lc2g6IEdMT0JFX01FU0hfT1VURVIsXG4gICAgcGFyYW1ldGVyczogQVRNT1NQSEVSRV9TS1lfUEFS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
304
+
305
+ /**
306
+ * Large uniform glow drawn in addition to the realistic sky halo when
307
+ * `config.hugeHalo` is enabled. Returns null when disabled.
308
+ */
309
+ export var getGlobeHugeHaloLayer = function getGlobeHugeHaloLayer(_ref6) {
310
+ var config = _ref6.config,
311
+ zoom = _ref6.zoom;
312
+ if (!config.hugeHalo) {
313
+ return null;
314
+ }
315
+ var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
316
+ var outerRadius = resolveHugeHaloRadius(config);
317
+ // Keep mesh extent in sync with the desired outer radius (base mesh = default outer).
318
+ var sizeScale = outerRadius / HUGE_HALO_BASE_OUTER_RADIUS;
319
+ return new AtmosphereHugeHaloLayer({
320
+ id: 'atmosphere-huge-halo',
321
+ data: [[0, 0, 0]],
322
+ config: config,
323
+ zoomFade: zoomFade,
324
+ coordinateOrigin: [0, 0, 0],
325
+ coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
326
+ getPosition: function (d) {
327
+ return d;
328
+ },
329
+ getColor: [0, 0, 0],
330
+ mesh: GLOBE_MESH_HUGE_HALO,
331
+ sizeScale: sizeScale,
332
+ parameters: HUGE_HALO_PARAMETERS
333
+ });
334
+ };
335
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT09SRElOQVRFX1NZU1RFTSIsIlNpbXBsZU1lc2hMYXllciIsIlNwaGVyZUdlb21ldHJ5IiwiVmVjdG9yMyIsImdldFN1blBvc2l0aW9uIiwiREVGQVVMVF9HTE9CRV9DT05GSUciLCJ0b1JhZGlhbnMiLCJkZWdyZWVzIiwiTWF0aCIsIlBJIiwiYW5nbGVUb1ZlYyIsImFuZ2xlIiwic2luIiwiY29zIiwiYW5nbGVUb1N1blBvcyIsIm5vcm1hbGl6ZSIsIkdMT0JFX01FU0hfSU5ORVIiLCJyYWRpdXMiLCJubGF0IiwibmxvbmciLCJHTE9CRV9NRVNIX09VVEVSIiwiR0xPQkVfTUVTSF9IVUdFX0hBTE8iLCJsb24iLCJsYXQiLCJzdW5Qb3NOb3ciLCJEYXRlIiwibm93IiwidjNTdW5Qb3NOb3ciLCJhemltdXRoIiwiTlVNX1NBTVBMRV9SQVlTIiwiQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQiLCJBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQiLCJhdG1vc3BoZXJlWm9vbUZhZGUiLCJ6b29tIiwidCIsIkFUTU9TUEhFUkVfVU5JRk9STVMiLCJ2M1N1blBvcyIsImV4cG9zdXJlIiwiZlNhbXBsZXMiLCJnIiwiZktyRVN1biIsImZLbUVTdW4iLCJmS3I0UEkiLCJmS200UEkiLCJmU2NhbGVEZXB0aCIsImZJbm5lclJhZGl1cyIsImZPdXRlclJhZGl1cyIsImZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yIiwiZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yIiwiQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljIiwiX1NpbXBsZU1lc2hMYXllciIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsImRyYXciLCJfcmVmIiwidW5pZm9ybXMiLCJfdGhpcyRwcm9wcyIsInByb3BzIiwiY29uZmlnIiwiem9vbUZhZGUiLCJtb2RlbCIsInN0YXRlIiwiX29iamVjdFNwcmVhZCIsInRlcm1pbmF0b3IiLCJ0ZXJtaW5hdG9yT3BhY2l0eSIsImF6aW11dGhBbmdsZSIsImZBdG1vc3BoZXJlWm9vbUZhZGUiLCJfc3VwZXJQcm9wR2V0IiwiZ2V0U2hhZGVycyIsImluamVjdCIsImNvbmNhdCIsIl9kZWZpbmVQcm9wZXJ0eSIsIkF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyIsIl9TaW1wbGVNZXNoTGF5ZXIyIiwiX3JlZjIiLCJfdGhpcyRwcm9wczIiLCJBVE1PU1BIRVJFX1BBUkFNRVRFUlMiLCJkZXB0aFRlc3QiLCJibGVuZEZ1bmMiLCJibGVuZEVxdWF0aW9uIiwiQVRNT1NQSEVSRV9TS1lfUEFSQU1FVEVSUyIsImN1bGxGYWNlIiwiZGVwdGhNYXNrIiwiSFVHRV9IQUxPX0lOTkVSX1JBRElVUyIsIkhVR0VfSEFMT19CQVNFX09VVEVSX1JBRElVUyIsIkhVR0VfSEFMT19CQVNFX1NIRUxMIiwiSFVHRV9IQUxPX1JBRElVU19NQVgiLCJIVUdFX0hBTE9fVU5JRk9STVMiLCJ2M0hhbG9Db2xvciIsImZIYWxvSW50ZW5zaXR5IiwiSFVHRV9IQUxPX1BBUkFNRVRFUlMiLCJyZXNvbHZlSHVnZUhhbG9SYWRpdXMiLCJtdWx0aXBsaWVyIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJodWdlSGFsb1JhZGl1cyIsIm1heCIsIm1pbiIsInJlc29sdmVIdWdlSGFsb09wYWNpdHkiLCJvcGFjaXR5IiwiaHVnZUhhbG9PcGFjaXR5IiwiQXRtb3NwaGVyZUh1Z2VIYWxvTGF5ZXIiLCJfU2ltcGxlTWVzaExheWVyMyIsIl9yZWYzIiwiX3RoaXMkcHJvcHMzIiwiZkhhbG9PcGFjaXR5IiwiZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIiLCJfcmVmNCIsImlkIiwiZGF0YSIsImNvb3JkaW5hdGVPcmlnaW4iLCJjb29yZGluYXRlU3lzdGVtIiwiQ0FSVEVTSUFOIiwiZ2V0UG9zaXRpb24iLCJkIiwiZ2V0Q29sb3IiLCJtZXNoIiwicGFyYW1ldGVycyIsImdldEdsb2JlQXRtb3NwaGVyZVNreUxheWVyIiwiX3JlZjUiLCJnZXRHbG9iZUh1Z2VIYWxvTGF5ZXIiLCJfcmVmNiIsImh1Z2VIYWxvIiwib3V0ZXJSYWRpdXMiLCJzaXplU2NhbGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2xvYmUvYXRtb3NwaGVyZS1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBTaGFkZXJzIHBvcnRlZCBmcm9tIGlUb3ducywgYmFzZWQgb24gU2VhbiBPJ05laWwncyBhcHByb2FjaCBpbiBHUFUgR2VtcyAyXG4vLyBTRUU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pVG93bnMvaXRvd25zL2Jsb2IvbWFzdGVyL3NyYy9Db3JlL1ByZWZhYi9HbG9iZS9BdG1vc3BoZXJlLmpzXG4vLyBTRUU6IGh0dHBzOi8vZGV2ZWxvcGVyLm52aWRpYS5jb20vZ3B1Z2Vtcy9ncHVnZW1zMi9wYXJ0LWlpLXNoYWRpbmctbGlnaHRpbmctYW5kLXNoYWRvd3MvY2hhcHRlci0xNi1hY2N1cmF0ZS1hdG1vc3BoZXJpYy1zY2F0dGVyaW5nXG5cbmltcG9ydCB7Q09PUkRJTkFURV9TWVNURU19IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtTaW1wbGVNZXNoTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL21lc2gtbGF5ZXJzJztcbmltcG9ydCB7U3BoZXJlR2VvbWV0cnl9IGZyb20gJ0BsdW1hLmdsL2VuZ2luZSc7XG5pbXBvcnQge1ZlY3RvcjN9IGZyb20gJ0BtYXRoLmdsL2NvcmUnO1xuaW1wb3J0IHtnZXRTdW5Qb3NpdGlvbn0gZnJvbSAnQG1hdGguZ2wvc3VuJztcblxuaW1wb3J0IHtERUZBVUxUX0dMT0JFX0NPTkZJRywgdHlwZSBHbG9iZUNvbmZpZ30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5jb25zdCB0b1JhZGlhbnMgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IChkZWdyZWVzICogTWF0aC5QSSkgLyAxODA7XG5cbmNvbnN0IGFuZ2xlVG9WZWMgPSAoYW5nbGU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIHJldHVybiBbTWF0aC5zaW4oYW5nbGUpLCBNYXRoLmNvcyhhbmdsZSksIDBdO1xufTtcblxuY29uc3QgYW5nbGVUb1N1blBvcyA9IChhbmdsZTogbnVtYmVyKTogbnVtYmVyW10gPT4ge1xuICByZXR1cm4gbmV3IFZlY3RvcjMoYW5nbGVUb1ZlYyhhbmdsZSkpLm5vcm1hbGl6ZSgpIGFzIHVua25vd24gYXMgbnVtYmVyW107XG59O1xuXG5jb25zdCBHTE9CRV9NRVNIX0lOTkVSID0gbmV3IFNwaGVyZUdlb21ldHJ5KHtcbiAgcmFkaXVzOiA2LjRlNixcbiAgbmxhdDogMTAwLFxuICBubG9uZzogMTAwXG59KTtcblxuY29uc3QgR0xPQkVfTUVTSF9PVVRFUiA9IG5ldyBTcGhlcmVHZW9tZXRyeSh7XG4gIHJhZGl1czogNi43ZTYsXG4gIG5sYXQ6IDEwMCxcbiAgbmxvbmc6IDEwMFxufSk7XG5cbi8vIH4xNCUgbGFyZ2VyIHRoYW4gdGhlIGdsb2JlIHN1cmZhY2UgbWVzaCDigJQgeWllbGRzIGEgdGhpY2sgc29mdCBhdXJhICh+MC4x4oCTMC4xNVIpLlxuY29uc3QgR0xPQkVfTUVTSF9IVUdFX0hBTE8gPSBuZXcgU3BoZXJlR2VvbWV0cnkoe1xuICByYWRpdXM6IDcuM2U2LFxuICBubGF0OiAxMDAsXG4gIG5sb25nOiAxMDBcbn0pO1xuXG5jb25zdCBbbG9uLCBsYXRdID0gWzAsIDkwXTtcbmNvbnN0IHN1blBvc05vdyA9IGdldFN1blBvc2l0aW9uKERhdGUubm93KCksIGxhdCwgbG9uKTtcbmNvbnN0IHYzU3VuUG9zTm93ID0gYW5nbGVUb1N1blBvcyhzdW5Qb3NOb3cuYXppbXV0aCArIE1hdGguUEkpO1xuXG5jb25zdCBOVU1fU0FNUExFX1JBWVMgPSAzO1xuXG4vKipcbiAqIFpvb20gcmFuZ2Ugb3ZlciB3aGljaCB0aGUgYXRtb3NwaGVyZSBlZmZlY3QgZmFkZXMgb3V0LlxuICogQmVsb3cgQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQgdGhlIGVmZmVjdCBpcyBmdWxseSB2aXNpYmxlLlxuICogQWJvdmUgQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIHRoZSBlZmZlY3QgaXMgY29tcGxldGVseSBoaWRkZW4uXG4gKi9cbmNvbnN0IEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUID0gMy41O1xuY29uc3QgQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EID0gNjtcblxuLyoqXG4gKiBDb252ZXJ0IGEgbWFwU3RhdGUgem9vbSBsZXZlbCB0byBhIFswLCAxXSBhdG1vc3BoZXJlIG9wYWNpdHkgbXVsdGlwbGllci5cbiAqIFJldHVybnMgMSAoZnVsbHkgdmlzaWJsZSkgYmVsb3cgQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQsIHNtb290aGx5XG4gKiBpbnRlcnBvbGF0ZXMgdG8gMCBiZXR3ZWVuIHRoZSB0d28gdGhyZXNob2xkcywgYW5kIHJldHVybnMgMCBhYm92ZVxuICogQVRNT1NQSEVSRV9GQURFX1pPT01fRU5ELlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXRtb3NwaGVyZVpvb21GYWRlKHpvb206IG51bWJlcik6IG51bWJlciB7XG4gIGlmICh6b29tIDw9IEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUKSByZXR1cm4gMTtcbiAgaWYgKHpvb20gPj0gQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EKSByZXR1cm4gMDtcbiAgY29uc3QgdCA9ICh6b29tIC0gQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQpIC8gKEFUTU9TUEhFUkVfRkFERV9aT09NX0VORCAtIEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUKTtcbiAgLy8gU21vb3RoLXN0ZXAgZm9yIGEgcGVyY2VwdHVhbGx5IGdlbnRsZSB0cmFuc2l0aW9uLlxuICByZXR1cm4gMSAtIHQgKiB0ICogKDMgLSAyICogdCk7XG59XG5cbmNvbnN0IEFUTU9TUEhFUkVfVU5JRk9STVMgPSB7XG4gIHYzU3VuUG9zOiB2M1N1blBvc05vdyxcbiAgZXhwb3N1cmU6IDIsXG4gIGZTYW1wbGVzOiAzLFxuICBnOiAtMC42NSxcbiAgZktyRVN1bjogMC4wMDAyNSAqIDIwLFxuICBmS21FU3VuOiAwLjAwMDEgKiAyMCxcbiAgZktyNFBJOiAwLjAwMDI1ICogNCAqIE1hdGguUEksXG4gIGZLbTRQSTogMC4wMDAxICogNCAqIE1hdGguUEksXG4gIGZTY2FsZURlcHRoOiAwLjI1LFxuICBmSW5uZXJSYWRpdXM6IDI1OCxcbiAgZk91dGVyUmFkaXVzOiAyNjUsXG4gIGZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yOiAwLjgsXG4gIGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjogMVxufTtcblxudHlwZSBBdG1vc3BoZXJlTGF5ZXJQcm9wcyA9IHtcbiAgY29uZmlnOiBHbG9iZUNvbmZpZztcbiAgLyoqIFByZS1jb21wdXRlZCBbMCwgMV0gem9vbS1mYWRlIG11bHRpcGxpZXI7IDEgPSBmdWxseSB2aXNpYmxlLCAwID0gaGlkZGVuLiAqL1xuICB6b29tRmFkZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIEF0bW9zcGhlcmVMYXllclJlYWxpc3RpYyBleHRlbmRzIFNpbXBsZU1lc2hMYXllcjxhbnksIEF0bW9zcGhlcmVMYXllclByb3BzPiB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljJztcblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWcsIHpvb21GYWRlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN0YXRlLm1vZGVsO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAuLi5BVE1PU1BIRVJFX1VOSUZPUk1TLFxuICAgICAgICBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I6IGNvbmZpZy50ZXJtaW5hdG9yID8gY29uZmlnLnRlcm1pbmF0b3JPcGFjaXR5IDogMCxcbiAgICAgICAgdjNTdW5Qb3M6IGNvbmZpZy5hemltdXRoID8gYW5nbGVUb1N1blBvcyh0b1JhZGlhbnMoY29uZmlnLmF6aW11dGhBbmdsZSkpIDogdjNTdW5Qb3NOb3csXG4gICAgICAgIGZBdG1vc3BoZXJlWm9vbUZhZGU6IHpvb21GYWRlXG4gICAgICB9O1xuICAgIH1cbiAgICBzdXBlci5kcmF3KHt1bmlmb3Jtc30pO1xuICB9XG5cbiAgZ2V0U2hhZGVycygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXRTaGFkZXJzKCksXG4gICAgICBpbmplY3Q6IHtcbiAgICAgICAgJ2ZzOiNkZWNsJzogYFxuICAgICAgICAgIHVuaWZvcm0gdmVjMyB2M1N1blBvcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2FtcGxlcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZklubmVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZk91dGVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZktyRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbUVTdW47XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3I0UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS200UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZlRlcm1pbmF0b3JBdHRlbnVhdGVGYWN0b3I7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmQXRtb3NwaGVyZVpvb21GYWRlO1xuXG4gICAgICAgICAgY29uc3QgaW50IG5TYW1wbGVzID0gJHtOVU1fU0FNUExFX1JBWVN9O1xuXG4gICAgICAgICAgZmxvYXQgc2NhbGUoZmxvYXQgZkNvcykge1xuICAgICAgICAgICAgZmxvYXQgeCA9IDEuMCAtIGZDb3M7XG4gICAgICAgICAgICByZXR1cm4gZlNjYWxlRGVwdGggKiBleHAoLTAuMDAyODcgKyB4KigwLjQ1OSArIHgqKDMuODMgKyB4KigtNi44ICsgeCo1LjI1KSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgICAgICdmczojbWFpbi1lbmQnOiBgXG4gICAgICAgICAgdmVjMyB2M0NhbWVyYVBvcyA9IGNhbWVyYVBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgdjNQb3MgPSBwb3NpdGlvbl9jb21tb25zcGFjZS54eXo7XG5cbiAgICAgICAgICBmbG9hdCBnMiA9IGcgKiBnO1xuXG4gICAgICAgICAgdmVjMyB2M0ludldhdmVsZW5ndGggPSB2ZWMzKDEuMCAvIHBvdygwLjY1MCwgNC4wKSwgMS4wIC8gcG93KDAuNTcwLCA0LjApLCAxLjAgLyBwb3coMC40NzUsIDQuMCkpO1xuXG4gICAgICAgICAgZmxvYXQgZklubmVyUmFkaXVzMiA9IGZJbm5lclJhZGl1cyAqIGZJbm5lclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmT3V0ZXJSYWRpdXMyID0gZk91dGVyUmFkaXVzICogZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZSA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZU92ZXJTY2FsZURlcHRoID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cykgLyBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIGZsb2F0IGNhbWVyYUhlaWdodDIgPSBsZW5ndGgodjNDYW1lcmFQb3MpICogbGVuZ3RoKHYzQ2FtZXJhUG9zKTtcblxuICAgICAgICAgIHZlYzMgdjNSYXkgPSB2M1BvcyAtIHYzQ2FtZXJhUG9zO1xuICAgICAgICAgIGZsb2F0IGZGYXIgPSBsZW5ndGgodjNSYXkpO1xuICAgICAgICAgIHYzUmF5IC89IGZGYXI7XG5cbiAgICAgICAgICBmbG9hdCBCID0gMi4wICogZG90KHYzQ2FtZXJhUG9zLCB2M1JheSk7XG4gICAgICAgICAgZmxvYXQgQyA9IGNhbWVyYUhlaWdodDIgLSBmT3V0ZXJSYWRpdXMyO1xuICAgICAgICAgIGZsb2F0IGZEZXQgPSBtYXgoMC4wLCBCKkIgLSA0LjAgKiBDKTtcbiAgICAgICAgICBmbG9hdCBmTmVhciA9IDAuNSAqICgtQiAtIHNxcnQoZkRldCkpO1xuXG4gICAgICAgICAgdmVjMyB2M1N0YXJ0ID0gdjNDYW1lcmFQb3MgKyB2M1JheSAqIGZOZWFyO1xuICAgICAgICAgIGZGYXIgLT0gZk5lYXI7XG5cbiAgICAgICAgICBmbG9hdCBmRGVwdGggPSBleHAoKGZJbm5lclJhZGl1cyAtIGZPdXRlclJhZGl1cykgLyBmU2NhbGVEZXB0aCk7XG4gICAgICAgICAgZmxvYXQgZkNhbWVyYUFuZ2xlID0gZG90KC12M1JheSwgdjNQb3MpIC8gbGVuZ3RoKHYzUG9zKTtcbiAgICAgICAgICBmbG9hdCBmTGlnaHRBbmdsZSA9IGRvdCh2M1N1blBvcywgdjNQb3MpIC8gbGVuZ3RoKHYzUG9zKTtcbiAgICAgICAgICBmbG9hdCBmQ2FtZXJhU2NhbGUgPSBzY2FsZShmQ2FtZXJhQW5nbGUpO1xuICAgICAgICAgIGZsb2F0IGZMaWdodFNjYWxlID0gc2NhbGUoZkxpZ2h0QW5nbGUpO1xuICAgICAgICAgIGZsb2F0IGZDYW1lcmFPZmZzZXQgPSBmRGVwdGgqZkNhbWVyYVNjYWxlO1xuICAgICAgICAgIGZsb2F0IGZUZW1wID0gKGZMaWdodFNjYWxlICsgZkNhbWVyYVNjYWxlKTtcblxuICAgICAgICAgIGZsb2F0IGZTYW1wbGVMZW5ndGggPSBmRmFyIC8gZlNhbXBsZXM7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlZExlbmd0aCA9IGZTYW1wbGVMZW5ndGggKiBmU2NhbGU7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVJheSA9IHYzUmF5ICogZlNhbXBsZUxlbmd0aDtcbiAgICAgICAgICB2ZWMzIHYzU2FtcGxlUG9pbnQgPSB2M1N0YXJ0ICsgdjNTYW1wbGVSYXkgKiAwLjU7XG5cbiAgICAgICAgICB2ZWMzIHYzRnJvbnRDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgICAgdmVjMyB2M0F0dGVudWF0ZSA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgICAgZm9yKGludCBpPTA7IGk8blNhbXBsZXM7IGkrKylcbiAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZsb2F0IGZIZWlnaHQgPSBsZW5ndGgodjNTYW1wbGVQb2ludCk7XG4gICAgICAgICAgICAgIGZsb2F0IGZEZXB0aCA9IGV4cChmU2NhbGVPdmVyU2NhbGVEZXB0aCAqIChmSW5uZXJSYWRpdXMgLSBmSGVpZ2h0KSk7XG4gICAgICAgICAgICAgIGZsb2F0IGZTY2F0dGVyID0gZkRlcHRoKmZUZW1wIC0gZkNhbWVyYU9mZnNldDtcbiAgICAgICAgICAgICAgdjNBdHRlbnVhdGUgPSBleHAoLWZTY2F0dGVyICogKHYzSW52V2F2ZWxlbmd0aCAqIGZLcjRQSSArIGZLbTRQSSkpO1xuICAgICAgICAgICAgICB2M0Zyb250Q29sb3IgKz0gdjNBdHRlbnVhdGUgKiAoZkRlcHRoICogZlNjYWxlZExlbmd0aCk7XG4gICAgICAgICAgICAgIHYzU2FtcGxlUG9pbnQgKz0gdjNTYW1wbGVSYXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmVjMyBjMCA9IHYzQXR0ZW51YXRlO1xuICAgICAgICAgIHZlYzMgYzEgPSB2M0Zyb250Q29sb3IgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyRVN1biArIGZLbUVTdW4pO1xuXG4gICAgICAgICAgZnJhZ0NvbG9yID0gdmVjNChjMSwgMS4wIC0gYzAgKiBmVGVybWluYXRvckF0dGVudWF0ZUZhY3Rvcik7XG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yO1xuXG4gICAgICAgICAgLy8gS2VlcCB0aGUgZGF5IGhlbWlzcGhlcmUgY29tcGxldGVseSB1bnNoYWRlZCDigJQgdGhlIGF0dGVudWF0aW9uLWJhc2VkXG4gICAgICAgICAgLy8gYWxwaGEgYWJvdmUgaXMgbm9uLXplcm8gZXZlbiBhdCBub29uLCB3aGljaCBzbGlnaHRseSBkYXJrZW5zIHRoZSBsaXRcbiAgICAgICAgICAvLyBzaWRlLiBHYXRlIGl0IHdpdGggYSBkYXkvbmlnaHQgbWFzayBzbyBkYXJrZW5pbmcgb25seSBhcHBlYXJzIGFjcm9zc1xuICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hdG9yIGFuZCBvbnRvIHRoZSBuaWdodCBzaWRlLlxuICAgICAgICAgIC8vIGZMaWdodEFuZ2xlID0gZG90KHN1bkRpciwgc3VyZmFjZU5vcm1hbCk6ICsxIGF0IHRoZSBzdWJzb2xhciBwb2ludFxuICAgICAgICAgIC8vIChub29uKSwgMCBhdCB0aGUgdGVybWluYXRvciwgLTEgYXQgbWlkbmlnaHQuIHNtb290aHN0ZXAgbWFwcyB0aGUgZGF5XG4gICAgICAgICAgLy8gc2lkZSAoPj0gMC4yKSB0byAwIChubyBkYXJrZW5pbmcpLCByYW1wcyB0aHJvdWdoIHRoZSB0ZXJtaW5hdG9yLCBhbmRcbiAgICAgICAgICAvLyByZWFjaGVzIGZ1bGwgZGFya2VuaW5nIG9uIHRoZSBuaWdodCBzaWRlICg8PSAtMC4yKS5cbiAgICAgICAgICBmbG9hdCBmTmlnaHRNYXNrID0gc21vb3Roc3RlcCgwLjIsIC0wLjIsIGZMaWdodEFuZ2xlKTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmTmlnaHRNYXNrO1xuXG4gICAgICAgICAgLy8gRmFkZSBvdXQgdGhlIGVudGlyZSBkYXkvbmlnaHQgc2hhZGluZyBlZmZlY3QgYXMgdGhlIHVzZXIgem9vbXMgaW4uXG4gICAgICAgICAgLy8gQXQgem9vbSBsZXZlbHMgYWJvdmUgQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIHRoZSBlZmZlY3QgaXMgaW52aXNpYmxlLFxuICAgICAgICAgIC8vIHNvIGl0IGRvZXNuJ3Qgb2JzY3VyZSBtYXAgZGV0YWlsIGF0IHN0cmVldC9jaXR5IHNjYWxlLlxuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG4gICAgICAgIGAsXG4gICAgICAgICdmczpERUNLR0xfRklMVEVSX0NPTE9SJzogYGBcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMgZXh0ZW5kcyBTaW1wbGVNZXNoTGF5ZXI8YW55LCBBdG1vc3BoZXJlTGF5ZXJQcm9wcz4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0F0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyc7XG5cbiAgZHJhdyh7dW5pZm9ybXN9OiB7dW5pZm9ybXM6IG9iamVjdH0pOiB2b2lkIHtcbiAgICBjb25zdCB7Y29uZmlnLCB6b29tRmFkZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zdGF0ZS5tb2RlbDtcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIChtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zID0ge1xuICAgICAgICAuLi4obW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyxcbiAgICAgICAgLi4uQVRNT1NQSEVSRV9VTklGT1JNUyxcbiAgICAgICAgdjNTdW5Qb3M6IGNvbmZpZy5hemltdXRoID8gYW5nbGVUb1N1blBvcyh0b1JhZGlhbnMoY29uZmlnLmF6aW11dGhBbmdsZSkpIDogdjNTdW5Qb3NOb3csXG4gICAgICAgIGZBdG1vc3BoZXJlWm9vbUZhZGU6IHpvb21GYWRlXG4gICAgICB9O1xuICAgIH1cbiAgICBzdXBlci5kcmF3KHt1bmlmb3Jtc30pO1xuICB9XG5cbiAgZ2V0U2hhZGVycygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXRTaGFkZXJzKCksXG4gICAgICBpbmplY3Q6IHtcbiAgICAgICAgJ2ZzOiNkZWNsJzogYFxuICAgICAgICAgIHVuaWZvcm0gdmVjMyB2M1N1blBvcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2FtcGxlcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZklubmVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZk91dGVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZktyRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbUVTdW47XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3I0UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS200UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2NhbGVEZXB0aDtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG5cbiAgICAgICAgICBjb25zdCBpbnQgblNhbXBsZXMgPSAke05VTV9TQU1QTEVfUkFZU307XG5cbiAgICAgICAgICBmbG9hdCBzY2FsZShmbG9hdCBmQ29zKSB7XG4gICAgICAgICAgICBmbG9hdCB4ID0gMS4wIC0gZkNvcztcbiAgICAgICAgICAgIHJldHVybiBmU2NhbGVEZXB0aCAqIGV4cCgtMC4wMDI4NyArIHgqKDAuNDU5ICsgeCooMy44MyArIHgqKC02LjggKyB4KjUuMjUpKSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZsb2F0IGdldE1pZVBoYXNlKGZsb2F0IGZDb3MsIGZsb2F0IGZDb3MyLCBmbG9hdCBnLCBmbG9hdCBnMikge1xuICAgICAgICAgICAgcmV0dXJuIDEuNSAqICgoMS4wIC0gZzIpIC8gKDIuMCArIGcyKSkgKiAoMS4wICsgZkNvczIpIC8gcG93KDEuMCArIGcyIC0gMi4wICogZyAqIGZDb3MsIDEuNSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgZ2V0UmF5bGVpZ2hQaGFzZShmbG9hdCBmQ29zMikge1xuICAgICAgICAgICAgcmV0dXJuIDAuNzUgKyAwLjc1ICogZkNvczI7XG4gICAgICAgICAgfVxuICAgICAgICBgLFxuICAgICAgICAnZnM6I21haW4tZW5kJzogYFxuICAgICAgICAgIHZlYzMgdjNDYW1lcmFQb3MgPSBjYW1lcmFQb3NpdGlvbjtcbiAgICAgICAgICB2ZWMzIHYzUG9zID0gcG9zaXRpb25fY29tbW9uc3BhY2UueHl6O1xuXG4gICAgICAgICAgZmxvYXQgZzIgPSBnICogZztcblxuICAgICAgICAgIHZlYzMgdjNJbnZXYXZlbGVuZ3RoID0gdmVjMygxLjAgLyBwb3coMC42NTAsIDQuMCksIDEuMCAvIHBvdygwLjU3MCwgNC4wKSwgMS4wIC8gcG93KDAuNDc1LCA0LjApKTtcblxuICAgICAgICAgIGZsb2F0IGZJbm5lclJhZGl1czIgPSBmSW5uZXJSYWRpdXMgKiBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZk91dGVyUmFkaXVzMiA9IGZPdXRlclJhZGl1cyAqIGZPdXRlclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmU2NhbGUgPSAxLjAgLyAoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzKTtcbiAgICAgICAgICBmbG9hdCBmU2NhbGVPdmVyU2NhbGVEZXB0aCA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpIC8gZlNjYWxlRGVwdGg7XG5cbiAgICAgICAgICBmbG9hdCBjYW1lcmFIZWlnaHQyID0gbGVuZ3RoKHYzQ2FtZXJhUG9zKSAqIGxlbmd0aCh2M0NhbWVyYVBvcyk7XG5cbiAgICAgICAgICB2ZWMzIHYzUmF5ID0gdjNQb3MgLSB2M0NhbWVyYVBvcztcbiAgICAgICAgICBmbG9hdCBmRmFyID0gbGVuZ3RoKHYzUmF5KTtcbiAgICAgICAgICB2M1JheSAvPSBmRmFyO1xuXG4gICAgICAgICAgZmxvYXQgQiA9IDIuMCAqIGRvdCh2M0NhbWVyYVBvcywgdjNSYXkpO1xuICAgICAgICAgIGZsb2F0IEMgPSBjYW1lcmFIZWlnaHQyIC0gZk91dGVyUmFkaXVzMjtcbiAgICAgICAgICBmbG9hdCBmRGV0ID0gbWF4KDAuMCwgQipCIC0gNC4wICogQyk7XG4gICAgICAgICAgZmxvYXQgZk5lYXIgPSAwLjUgKiAoLUIgLSBzcXJ0KGZEZXQpKTtcblxuICAgICAgICAgIHZlYzMgdjNTdGFydCA9IHYzQ2FtZXJhUG9zICsgdjNSYXkgKiBmTmVhcjtcbiAgICAgICAgICBmRmFyIC09IGZOZWFyO1xuICAgICAgICAgIGZsb2F0IGZTdGFydEFuZ2xlID0gZG90KHYzUmF5LCB2M1N0YXJ0KSAvIGZPdXRlclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmU3RhcnREZXB0aCA9IGV4cCgtMS4wIC8gZlNjYWxlRGVwdGgpO1xuICAgICAgICAgIGZsb2F0IGZTdGFydE9mZnNldCA9IGZTdGFydERlcHRoICogc2NhbGUoZlN0YXJ0QW5nbGUpO1xuXG4gICAgICAgICAgZmxvYXQgZlNhbXBsZUxlbmd0aCA9IGZGYXIgLyBmU2FtcGxlcztcbiAgICAgICAgICBmbG9hdCBmU2NhbGVkTGVuZ3RoID0gZlNhbXBsZUxlbmd0aCAqIGZTY2FsZTtcbiAgICAgICAgICB2ZWMzIHYzU2FtcGxlUmF5ID0gdjNSYXkgKiBmU2FtcGxlTGVuZ3RoO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVQb2ludCA9IHYzU3RhcnQgKyB2M1NhbXBsZVJheSAqIDAuNTtcblxuICAgICAgICAgIHZlYzMgdjNGcm9udENvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaTxuU2FtcGxlczsgaSsrKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZsb2F0IGZIZWlnaHQgPSBsZW5ndGgodjNTYW1wbGVQb2ludCk7XG4gICAgICAgICAgICBmbG9hdCBmRGVwdGggPSBleHAoZlNjYWxlT3ZlclNjYWxlRGVwdGggKiAoZklubmVyUmFkaXVzIC0gZkhlaWdodCkpO1xuICAgICAgICAgICAgZmxvYXQgZkxpZ2h0QW5nbGUgPSBkb3QodjNTdW5Qb3MsIHYzU2FtcGxlUG9pbnQpIC8gZkhlaWdodDtcbiAgICAgICAgICAgIGZsb2F0IGZDYW1lcmFBbmdsZSA9IGRvdCh2M1JheSwgdjNTYW1wbGVQb2ludCkgLyBmSGVpZ2h0O1xuICAgICAgICAgICAgZmxvYXQgZlNjYXR0ZXIgPSAoZlN0YXJ0T2Zmc2V0ICsgZkRlcHRoICogKHNjYWxlKGZMaWdodEFuZ2xlKSAtIHNjYWxlKGZDYW1lcmFBbmdsZSkpKTtcbiAgICAgICAgICAgIHZlYzMgdjNBdHRlbnVhdGUgPSBleHAoLWZTY2F0dGVyICogKHYzSW52V2F2ZWxlbmd0aCAqIGZLcjRQSSArIGZLbTRQSSkpO1xuXG4gICAgICAgICAgICB2M0Zyb250Q29sb3IgKz0gdjNBdHRlbnVhdGUgKiAoZkRlcHRoICogZlNjYWxlZExlbmd0aCk7XG4gICAgICAgICAgICB2M1NhbXBsZVBvaW50ICs9IHYzU2FtcGxlUmF5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZlYzMgYzAgPSB2M0Zyb250Q29sb3IgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyRVN1bik7XG4gICAgICAgICAgdmVjMyBjMSA9IHYzRnJvbnRDb2xvciAqIGZLbUVTdW47XG5cbiAgICAgICAgICB2ZWMzIHYzRGlyZWN0aW9uID0gdjNDYW1lcmFQb3MgLSB2M1BvcztcblxuICAgICAgICAgIGZsb2F0IGZDb3MgPSBkb3QodjNTdW5Qb3MsIHYzRGlyZWN0aW9uKSAvIGxlbmd0aCh2M0RpcmVjdGlvbik7XG4gICAgICAgICAgZmxvYXQgZkNvczIgPSBmQ29zICogZkNvcztcblxuICAgICAgICAgIHZlYzMgc2t5Q29sb3IgPSBnZXRSYXlsZWlnaFBoYXNlKGZDb3MyKSAqIGMwICsgZ2V0TWllUGhhc2UoZkNvcywgZkNvczIsIGcsIGcyKSAqIGMxO1xuXG4gICAgICAgICAgZnJhZ0NvbG9yID0gdmVjNChza3lDb2xvciwgMS4wKTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSA9IGZyYWdDb2xvci5iO1xuXG4gICAgICAgICAgLy8gRmFkZSB0aGUgc2t5IGhhbG8gb3V0IGFzIHRoZSB1c2VyIHpvb21zIGluIHBhc3QgY29udGluZW50IHNjYWxlLlxuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG4gICAgICAgIGAsXG4gICAgICAgICdmczpERUNLR0xfRklMVEVSX0NPTE9SJzogYGBcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmNvbnN0IEFUTU9TUEhFUkVfUEFSQU1FVEVSUyA9IHtcbiAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgYmxlbmRGdW5jOiBbMHgwMzAyLCAweDAzMDMsIDEsIDB4MDMwM10sIC8vIFNSQ19BTFBIQSwgT05FX01JTlVTX1NSQ19BTFBIQSwgT05FLCBPTkVfTUlOVVNfU1JDX0FMUEhBXG4gIGJsZW5kRXF1YXRpb246IFsweDgwMDYsIDB4ODAwNl0gLy8gRlVOQ19BRERcbn07XG5cbmNvbnN0IEFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlMgPSB7XG4gIGN1bGxGYWNlOiAweDA0MDQsIC8vIEdMLkZST05UXG4gIGRlcHRoTWFzazogZmFsc2UsXG4gIGJsZW5kRnVuYzogWzB4MDMwMiwgMHgwMzAzLCAxLCAweDAzMDNdLFxuICBibGVuZEVxdWF0aW9uOiBbMHg4MDA2LCAweDgwMDZdXG59O1xuXG4vKipcbiAqIFNvZnQsIHN1bi1pbmRlcGVuZGVudCBnbG93LiBSYWRpaSBhcmUgaW4gZGVjay5nbCBjb21tb24gc3BhY2VcbiAqIChHTE9CRV9DT01NT05fUkFESVVTID0gMjU2OyBhdG1vc3BoZXJlIHVzZXMgfjI1OCBhcyBhIHNsaWdodCBmdWRnZSkuXG4gKiBPdXRlciDiiYggMTQlIGxhcmdlciB0aGFuIGlubmVyIGF0IHJhZGl1cyBtdWx0aXBsaWVyID0gMSAobWF0Y2hlcyB0aGUgYmFzZSBtZXNoKS5cbiAqL1xuY29uc3QgSFVHRV9IQUxPX0lOTkVSX1JBRElVUyA9IDI1ODtcbmNvbnN0IEhVR0VfSEFMT19CQVNFX09VVEVSX1JBRElVUyA9IDI5NDtcbmNvbnN0IEhVR0VfSEFMT19CQVNFX1NIRUxMID0gSFVHRV9IQUxPX0JBU0VfT1VURVJfUkFESVVTIC0gSFVHRV9IQUxPX0lOTkVSX1JBRElVUztcbi8qKiBNYXRjaGVzIHRoZSBIYWxvIFJhZGl1cyBzbGlkZXIgbWF4OyBoaWdoZXIgdmFsdWVzIGNhbiBwcm9kdWNlIGEgYmxhY2stZGlzYyBhcnRpZmFjdC4gKi9cbmNvbnN0IEhVR0VfSEFMT19SQURJVVNfTUFYID0gMy41O1xuXG5jb25zdCBIVUdFX0hBTE9fVU5JRk9STVMgPSB7XG4gIGZJbm5lclJhZGl1czogSFVHRV9IQUxPX0lOTkVSX1JBRElVUyxcbiAgLy8gU29mdCBjeWFuIG1hdGNoaW5nIHRoZSByZWZlcmVuY2UgaHVnZS1oYWxvIGxvb2suXG4gIHYzSGFsb0NvbG9yOiBbMC40NSwgMC43MiwgMS4wXSxcbiAgZkhhbG9JbnRlbnNpdHk6IDEuMFxufTtcblxuY29uc3QgSFVHRV9IQUxPX1BBUkFNRVRFUlMgPSB7XG4gIGN1bGxGYWNlOiAweDA0MDQsIC8vIEdMLkZST05UXG4gIGRlcHRoTWFzazogZmFsc2UsXG4gIC8vIExhcmdlIHNoZWxscyBvZnRlbiBlbmNsb3NlIHRoZSBjYW1lcmE7IGRpc2FibGUgZGVwdGggc28gdGhlIHJpbmcgc3RpbGwgZHJhd3MuXG4gIGRlcHRoVGVzdDogZmFsc2UsXG4gIGJsZW5kRnVuYzogWzB4MDMwMiwgMHgwMzAzLCAxLCAweDAzMDNdLCAvLyBTUkNfQUxQSEEsIE9ORV9NSU5VU19TUkNfQUxQSEFcbiAgYmxlbmRFcXVhdGlvbjogWzB4ODAwNiwgMHg4MDA2XVxufTtcblxuZnVuY3Rpb24gcmVzb2x2ZUh1Z2VIYWxvUmFkaXVzKGNvbmZpZzogR2xvYmVDb25maWcpOiBudW1iZXIge1xuICBjb25zdCBtdWx0aXBsaWVyID0gTnVtYmVyLmlzRmluaXRlKGNvbmZpZy5odWdlSGFsb1JhZGl1cylcbiAgICA/IChjb25maWcuaHVnZUhhbG9SYWRpdXMgYXMgbnVtYmVyKVxuICAgIDogREVGQVVMVF9HTE9CRV9DT05GSUcuaHVnZUhhbG9SYWRpdXM7XG4gIC8vIFNjYWxlIHNoZWxsIHRoaWNrbmVzczsga2VlcCBvdXRlciBhYm92ZSB0aGUgcGxhbmV0IHN1cmZhY2UuXG4gIHJldHVybiAoXG4gICAgSFVHRV9IQUxPX0lOTkVSX1JBRElVUyArXG4gICAgSFVHRV9IQUxPX0JBU0VfU0hFTEwgKiBNYXRoLm1heChNYXRoLm1pbihtdWx0aXBsaWVyLCBIVUdFX0hBTE9fUkFESVVTX01BWCksIDAuMDUpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVIdWdlSGFsb09wYWNpdHkoY29uZmlnOiBHbG9iZUNvbmZpZyk6IG51bWJlciB7XG4gIGNvbnN0IG9wYWNpdHkgPSBOdW1iZXIuaXNGaW5pdGUoY29uZmlnLmh1Z2VIYWxvT3BhY2l0eSlcbiAgICA/IChjb25maWcuaHVnZUhhbG9PcGFjaXR5IGFzIG51bWJlcilcbiAgICA6IERFRkFVTFRfR0xPQkVfQ09ORklHLmh1Z2VIYWxvT3BhY2l0eTtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTtcbn1cblxuLyoqXG4gKiBWaWV3LWluZGVwZW5kZW50IGF0bW9zcGhlcmU6IGEgbGFyZ2UgdW5pZm9ybSBlbWlzc2l2ZSBhdXJhIGFyb3VuZCB0aGUgZ2xvYmUuXG4gKiBVbmxpa2UgQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljLCB0aGlzIGlnbm9yZXMgc3VuIGRpcmVjdGlvbiBhbmQgdXNlcyBhXG4gKiBsaW5lYXIgcmFkaWFsIGZhbGxvZmYgdGhyb3VnaCBhIHRoaWNrIHNoZWxsIChtYXggYXQgdGhlIHN1cmZhY2Ug4oaSIDAgYXQgb3V0ZXIgcmFkaXVzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0bW9zcGhlcmVIdWdlSGFsb0xheWVyIGV4dGVuZHMgU2ltcGxlTWVzaExheWVyPGFueSwgQXRtb3NwaGVyZUxheWVyUHJvcHM+IHtcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdBdG1vc3BoZXJlSHVnZUhhbG9MYXllcic7XG5cbiAgZHJhdyh7dW5pZm9ybXN9OiB7dW5pZm9ybXM6IG9iamVjdH0pOiB2b2lkIHtcbiAgICBjb25zdCB7Y29uZmlnLCB6b29tRmFkZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zdGF0ZS5tb2RlbDtcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIChtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zID0ge1xuICAgICAgICAuLi4obW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyxcbiAgICAgICAgLi4uSFVHRV9IQUxPX1VOSUZPUk1TLFxuICAgICAgICBmSGFsb09wYWNpdHk6IHJlc29sdmVIdWdlSGFsb09wYWNpdHkoY29uZmlnKSxcbiAgICAgICAgZkF0bW9zcGhlcmVab29tRmFkZTogem9vbUZhZGVcbiAgICAgIH07XG4gICAgfVxuICAgIHN1cGVyLmRyYXcoe3VuaWZvcm1zfSk7XG4gIH1cblxuICBnZXRTaGFkZXJzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmdldFNoYWRlcnMoKSxcbiAgICAgIGluamVjdDoge1xuICAgICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSB2ZWMzIHYzSGFsb0NvbG9yO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkhhbG9JbnRlbnNpdHk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSGFsb09wYWNpdHk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmQXRtb3NwaGVyZVpvb21GYWRlO1xuICAgICAgICBgLFxuICAgICAgICAnZnM6I21haW4tZW5kJzogYFxuICAgICAgICAgIHZlYzMgdjNDYW1lcmFQb3MgPSBjYW1lcmFQb3NpdGlvbjtcbiAgICAgICAgICB2ZWMzIHYzUG9zID0gcG9zaXRpb25fY29tbW9uc3BhY2UueHl6O1xuICAgICAgICAgIC8vIE91dGVyIHJhZGl1cyBmcm9tIHRoZSBhY3R1YWwgbWVzaCB2ZXJ0ZXggc28gc2l6ZVNjYWxlIHN0YXlzIGluIHN5bmMuXG4gICAgICAgICAgZmxvYXQgZk91dGVyUmFkaXVzID0gbGVuZ3RoKHYzUG9zKTtcbiAgICAgICAgICB2ZWMzIHYzUmF5ID0gbm9ybWFsaXplKHYzUG9zIC0gdjNDYW1lcmFQb3MpO1xuXG4gICAgICAgICAgLy8gSW1wYWN0IHBhcmFtZXRlciBvZiB0aGUgdmlldyByYXkgKHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSBnbG9iZVxuICAgICAgICAgIC8vIGNlbnRlciB0byB0aGUgcmF5KS4gU3RhYmxlIHdoZW4gdGhlIGNhbWVyYSBpcyBpbnNpZGUgdGhlIG91dGVyIHNoZWxsLFxuICAgICAgICAgIC8vIHVubGlrZSBuZWFyL2ZhciBzcGhlcmUtaW50ZXJzZWN0aW9uIG1hdGggd2hpY2ggYnJlYWtzIGluIHRoYXQgY2FzZVxuICAgICAgICAgIC8vIGFuZCBwcm9kdWNlZCBhIGJsYWNrIGRpc2MgYXQgaGlnaCByYWRpdXMgbXVsdGlwbGllcnMuXG4gICAgICAgICAgZmxvYXQgZkRNaW4gPSBsZW5ndGgoY3Jvc3ModjNDYW1lcmFQb3MsIHYzUmF5KSk7XG5cbiAgICAgICAgICAvLyBMaW5lYXIgZmFsbG9mZiBpbiB0aGUgYW5udWx1cyBvbmx5OiBtYXggYXQgdGhlIHN1cmZhY2UsIHplcm8gYXQgb3V0ZXIuXG4gICAgICAgICAgZmxvYXQgZlNoZWxsID0gbWF4KGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cywgMC4wMDAxKTtcbiAgICAgICAgICBmbG9hdCBmR2xvdyA9IDAuMDtcbiAgICAgICAgICBpZiAoZkRNaW4gPj0gZklubmVyUmFkaXVzICYmIGZETWluIDwgZk91dGVyUmFkaXVzKSB7XG4gICAgICAgICAgICBmbG9hdCB0ID0gKGZETWluIC0gZklubmVyUmFkaXVzKSAvIGZTaGVsbDtcbiAgICAgICAgICAgIGZHbG93ID0gMS4wIC0gdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmR2xvdyAqPSBmSGFsb0ludGVuc2l0eTtcblxuICAgICAgICAgIC8vIFN0cmFpZ2h0IGFscGhhIChub3QgcHJlbXVsdGlwbGllZCkgZm9yIFNSQ19BTFBIQSBibGVuZGluZy5cbiAgICAgICAgICBmcmFnQ29sb3IgPSB2ZWM0KHYzSGFsb0NvbG9yLCBmR2xvdyAqIGZIYWxvT3BhY2l0eSk7XG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZkF0bW9zcGhlcmVab29tRmFkZTtcbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOkRFQ0tHTF9GSUxURVJfQ09MT1InOiBgYFxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEdsb2JlQXRtb3NwaGVyZUxheWVyID0gKHtjb25maWcsIHpvb219OiB7Y29uZmlnOiBHbG9iZUNvbmZpZzsgem9vbT86IG51bWJlcn0pID0+IHtcbiAgY29uc3Qgem9vbUZhZGUgPSBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbSA/PyAwKTtcbiAgcmV0dXJuIG5ldyBBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMoe1xuICAgIGlkOiAnYXRtb3NwaGVyZScsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29uZmlnLFxuICAgIHpvb21GYWRlLFxuICAgIGNvb3JkaW5hdGVPcmlnaW46IFswLCAwLCAwXSxcbiAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgZ2V0UG9zaXRpb246ICgoZDogbnVtYmVyW10pID0+IGQpIGFzIGFueSxcbiAgICBnZXRDb2xvcjogWzAsIDAsIDBdLFxuICAgIG1lc2g6IEdMT0JFX01FU0hfSU5ORVIsXG4gICAgcGFyYW1ldGVyczogQVRNT1NQSEVSRV9QQVJBTUVURVJTXG4gIH0pO1xufTtcblxuLyoqIFJlYWxpc3RpYyBzdW4tbGl0IHNjYXR0ZXJpbmcgc2t5IGhhbG8gKHRoaW4gbGltYiBnbG93KS4gKi9cbmV4cG9ydCBjb25zdCBnZXRHbG9iZUF0bW9zcGhlcmVTa3lMYXllciA9ICh7Y29uZmlnLCB6b29tfToge2NvbmZpZzogR2xvYmVDb25maWc7IHpvb20/OiBudW1iZXJ9KSA9PiB7XG4gIGNvbnN0IHpvb21GYWRlID0gYXRtb3NwaGVyZVpvb21GYWRlKHpvb20gPz8gMCk7XG4gIHJldHVybiBuZXcgQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljKHtcbiAgICBpZDogJ2F0bW9zcGhlcmUtc2t5JyxcbiAgICBkYXRhOiBbWzAsIDAsIDBdXSxcbiAgICBjb25maWcsXG4gICAgem9vbUZhZGUsXG4gICAgY29vcmRpbmF0ZU9yaWdpbjogWzAsIDAsIDBdLFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICBnZXRQb3NpdGlvbjogKChkOiBudW1iZXJbXSkgPT4gZCkgYXMgYW55LFxuICAgIGdldENvbG9yOiBbMCwgMCwgMF0sXG4gICAgbWVzaDogR0xPQkVfTUVTSF9PVVRFUixcbiAgICBwYXJhbWV0ZXJzOiBBVE1PU1BIRVJFX1NLWV9QQVJBTUVURVJTXG4gIH0pO1xufTtcblxuLyoqXG4gKiBMYXJnZSB1bmlmb3JtIGdsb3cgZHJhd24gaW4gYWRkaXRpb24gdG8gdGhlIHJlYWxpc3RpYyBza3kgaGFsbyB3aGVuXG4gKiBgY29uZmlnLmh1Z2VIYWxvYCBpcyBlbmFibGVkLiBSZXR1cm5zIG51bGwgd2hlbiBkaXNhYmxlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEdsb2JlSHVnZUhhbG9MYXllciA9ICh7Y29uZmlnLCB6b29tfToge2NvbmZpZzogR2xvYmVDb25maWc7IHpvb20/OiBudW1iZXJ9KSA9PiB7XG4gIGlmICghY29uZmlnLmh1Z2VIYWxvKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgem9vbUZhZGUgPSBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbSA/PyAwKTtcbiAgY29uc3Qgb3V0ZXJSYWRpdXMgPSByZXNvbHZlSHVnZUhhbG9SYWRpdXMoY29uZmlnKTtcbiAgLy8gS2VlcCBtZXNoIGV4dGVudCBpbiBzeW5jIHdpdGggdGhlIGRlc2lyZWQgb3V0ZXIgcmFkaXVzIChiYXNlIG1lc2ggPSBkZWZhdWx0IG91dGVyKS5cbiAgY29uc3Qgc2l6ZVNjYWxlID0gb3V0ZXJSYWRpdXMgLyBIVUdFX0hBTE9fQkFTRV9PVVRFUl9SQURJVVM7XG4gIHJldHVybiBuZXcgQXRtb3NwaGVyZUh1Z2VIYWxvTGF5ZXIoe1xuICAgIGlkOiAnYXRtb3NwaGVyZS1odWdlLWhhbG8nLFxuICAgIGRhdGE6IFtbMCwgMCwgMF1dLFxuICAgIGNvbmZpZyxcbiAgICB6b29tRmFkZSxcbiAgICBjb29yZGluYXRlT3JpZ2luOiBbMCwgMCwgMF0sXG4gICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uQ0FSVEVTSUFOLFxuICAgIGdldFBvc2l0aW9uOiAoKGQ6IG51bWJlcltdKSA9PiBkKSBhcyBhbnksXG4gICAgZ2V0Q29sb3I6IFswLCAwLCAwXSxcbiAgICBtZXNoOiBHTE9CRV9NRVNIX0hVR0VfSEFMTyxcbiAgICBzaXplU2NhbGUsXG4gICAgcGFyYW1ldGVyczogSFVHRV9IQUxPX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxTQUFRQSxpQkFBaUIsUUFBTyxlQUFlO0FBQy9DLFNBQVFDLGVBQWUsUUFBTyxzQkFBc0I7QUFDcEQsU0FBUUMsY0FBYyxRQUFPLGlCQUFpQjtBQUM5QyxTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUNyQyxTQUFRQyxjQUFjLFFBQU8sY0FBYztBQUUzQyxTQUFRQyxvQkFBb0IsUUFBeUIsc0JBQXNCO0FBRTNFLElBQU1DLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFJQyxPQUFlO0VBQUEsT0FBY0EsT0FBTyxHQUFHQyxJQUFJLENBQUNDLEVBQUUsR0FBSSxHQUFHO0FBQUE7QUFFeEUsSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUlDLEtBQWEsRUFBK0I7RUFDOUQs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