@kepler.gl/deckgl-layers 3.3.0-alpha.5 → 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.
Files changed (189) hide show
  1. package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
  2. package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
  3. package/dist/cjs/3d-building-layer/types.js +6 -0
  4. package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
  5. package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
  6. package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
  7. package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
  8. package/dist/cjs/globe/atmosphere-layer.js +341 -0
  9. package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
  10. package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
  11. package/dist/cjs/globe/globe-layers.js +574 -0
  12. package/dist/cjs/globe/globe-stars-layer.js +99 -0
  13. package/dist/cjs/globe/globe-stars-layer.spec.js +42 -0
  14. package/dist/cjs/globe/globe-view.js +404 -0
  15. package/dist/{globe → cjs/globe}/index.js +19 -1
  16. package/dist/cjs/globe/mvt-label-layer.js +190 -0
  17. package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
  18. package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
  19. package/dist/{index.js → cjs/index.js} +1 -1
  20. package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
  21. package/dist/cjs/layer-utils/cluster-utils.js +93 -0
  22. package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
  23. package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
  24. package/dist/cjs/layer-utils/shader-utils.js +38 -0
  25. package/dist/cjs/line-layer/line-layer.js +95 -0
  26. package/dist/cjs/raster/images.js +271 -0
  27. package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
  28. package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
  29. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
  30. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
  31. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
  32. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
  33. package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
  34. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
  35. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
  36. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
  37. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
  38. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
  39. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
  40. package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
  41. package/dist/cjs/raster/types.js +6 -0
  42. package/dist/cjs/raster/util.js +139 -0
  43. package/dist/cjs/raster/webgl/color/colormap.js +45 -0
  44. package/dist/cjs/raster/webgl/color/filter.js +58 -0
  45. package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
  46. package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
  47. package/dist/cjs/raster/webgl/color/saturation.js +42 -0
  48. package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
  49. package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
  50. package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
  51. package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
  52. package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
  53. package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
  54. package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
  55. package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
  56. package/dist/cjs/raster/webgl/texture/mask.js +50 -0
  57. package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
  58. package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
  59. package/dist/cjs/raster/webgl/types.js +6 -0
  60. package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
  61. package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
  62. package/dist/cjs/wms/wms-layer.js +624 -0
  63. package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
  64. package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
  65. package/dist/esm/3d-building-layer/types.js +3 -0
  66. package/dist/esm/cluster-layer/cluster-layer.js +286 -0
  67. package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
  68. package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
  69. package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
  70. package/dist/esm/globe/atmosphere-layer.js +335 -0
  71. package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
  72. package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
  73. package/dist/esm/globe/globe-layers.js +566 -0
  74. package/dist/esm/globe/globe-stars-layer.js +92 -0
  75. package/dist/esm/globe/globe-stars-layer.spec.js +40 -0
  76. package/dist/esm/globe/globe-view.js +398 -0
  77. package/dist/esm/globe/index.js +26 -0
  78. package/dist/esm/globe/mvt-label-layer.js +187 -0
  79. package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
  80. package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
  81. package/dist/esm/index.js +22 -0
  82. package/dist/esm/layer-utils/aggregation-utils.js +172 -0
  83. package/dist/esm/layer-utils/cluster-utils.js +86 -0
  84. package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
  85. package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
  86. package/dist/esm/layer-utils/shader-utils.js +32 -0
  87. package/dist/esm/line-layer/line-layer.js +91 -0
  88. package/dist/esm/raster/images.js +267 -0
  89. package/dist/esm/raster/pipeline-validation-patch.js +94 -0
  90. package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
  91. package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
  92. package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
  93. package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
  94. package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
  95. package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
  96. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
  97. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
  98. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
  99. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
  100. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
  101. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
  102. package/dist/esm/raster/raster-processing-uniforms.js +118 -0
  103. package/dist/esm/raster/types.js +3 -0
  104. package/dist/esm/raster/util.js +134 -0
  105. package/dist/esm/raster/webgl/color/colormap.js +39 -0
  106. package/dist/esm/raster/webgl/color/filter.js +52 -0
  107. package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
  108. package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
  109. package/dist/esm/raster/webgl/color/saturation.js +36 -0
  110. package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
  111. package/dist/esm/raster/webgl/index.js +26 -0
  112. package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
  113. package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
  114. package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
  115. package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
  116. package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
  117. package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
  118. package/dist/esm/raster/webgl/texture/mask.js +44 -0
  119. package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
  120. package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
  121. package/dist/esm/raster/webgl/types.js +3 -0
  122. package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
  123. package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
  124. package/dist/esm/wms/wms-layer.js +619 -0
  125. package/dist/globe/atmosphere-layer.d.ts +22 -1
  126. package/dist/globe/globe-stars-layer.d.ts +5 -0
  127. package/dist/globe/globe-stars-layer.spec.d.ts +1 -0
  128. package/dist/globe/index.d.ts +2 -2
  129. package/dist/wms/wms-layer.d.ts +8 -0
  130. package/package.json +19 -10
  131. package/dist/3d-building-layer/3d-building-layer.js +0 -66
  132. package/dist/3d-building-layer/3d-building-utils.js +0 -166
  133. package/dist/3d-building-layer/types.js +0 -6
  134. package/dist/cluster-layer/cluster-layer.js +0 -292
  135. package/dist/column-layer/enhanced-column-layer.js +0 -160
  136. package/dist/deckgl-extensions/filter-shader-module.js +0 -26
  137. package/dist/globe/atmosphere-layer.js +0 -220
  138. package/dist/globe/enhanced-multi-icon-layer.js +0 -63
  139. package/dist/globe/globe-depth-disk-layer.js +0 -145
  140. package/dist/globe/globe-layers.js +0 -569
  141. package/dist/globe/globe-stars-layer.js +0 -69
  142. package/dist/globe/globe-view.js +0 -404
  143. package/dist/globe/mvt-label-layer.js +0 -190
  144. package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
  145. package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
  146. package/dist/layer-utils/aggregation-utils.js +0 -181
  147. package/dist/layer-utils/cluster-utils.js +0 -93
  148. package/dist/layer-utils/cpu-aggregator.js +0 -798
  149. package/dist/layer-utils/globe-cell-utils.js +0 -173
  150. package/dist/layer-utils/shader-utils.js +0 -38
  151. package/dist/line-layer/line-layer.js +0 -95
  152. package/dist/raster/images.js +0 -271
  153. package/dist/raster/pipeline-validation-patch.js +0 -101
  154. package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
  155. package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
  156. package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
  157. package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
  158. package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
  159. package/dist/raster/raster-layer/raster-layer.js +0 -287
  160. package/dist/raster/raster-mesh-layer/matrix.d.ts +0 -4
  161. package/dist/raster/raster-mesh-layer/matrix.js +0 -18
  162. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
  163. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
  164. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
  165. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
  166. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
  167. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -321
  168. package/dist/raster/raster-processing-uniforms.js +0 -124
  169. package/dist/raster/types.js +0 -6
  170. package/dist/raster/util.js +0 -139
  171. package/dist/raster/webgl/color/colormap.js +0 -45
  172. package/dist/raster/webgl/color/filter.js +0 -58
  173. package/dist/raster/webgl/color/gamma-contrast.js +0 -68
  174. package/dist/raster/webgl/color/linear-rescale.js +0 -35
  175. package/dist/raster/webgl/color/saturation.js +0 -42
  176. package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
  177. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
  178. package/dist/raster/webgl/spectral-indices/evi.js +0 -26
  179. package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
  180. package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
  181. package/dist/raster/webgl/spectral-indices/savi.js +0 -21
  182. package/dist/raster/webgl/texture/combine-bands.js +0 -65
  183. package/dist/raster/webgl/texture/mask.js +0 -50
  184. package/dist/raster/webgl/texture/reorder-bands.js +0 -72
  185. package/dist/raster/webgl/texture/rgba-image.js +0 -34
  186. package/dist/raster/webgl/types.js +0 -6
  187. package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
  188. package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
  189. package/dist/wms/wms-layer.js +0 -594
@@ -0,0 +1,404 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.KeplerGlobeView = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError"));
11
+ var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
14
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
15
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
+ var DeckCore = _interopRequireWildcard(require("@deck.gl/core"));
18
+ var _core2 = require("@math.gl/core");
19
+ var _constants = require("@kepler.gl/constants");
20
+ var _globeDepthDiskLayer = require("./globe-depth-disk-layer");
21
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
22
+ 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; }
23
+ 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; }
24
+ function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
25
+ 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)); }
26
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // SPDX-License-Identifier: MIT
27
+ // Copyright contributors to the kepler.gl project
28
+ // deck.gl exposes GlobeView / GlobeController as experimental, underscore-prefixed
29
+ // members. Their named type bindings aren't reliably resolvable through the
30
+ // package barrel under this project's module resolution, so we pull them off the
31
+ // namespace with a loose type. Runtime behavior is unchanged.
32
+ var DeckGlobeView = DeckCore._GlobeView;
33
+ var GlobeController = DeckCore._GlobeController;
34
+ var DeckGlobeViewport = DeckCore._GlobeViewport;
35
+
36
+ /**
37
+ * Latitude-based zoom adjustment used by deck.gl's GlobeViewport, replicated
38
+ * here so our custom `_constrainZoom` matches deck.gl's coordinate math.
39
+ * See @deck.gl/core globe-viewport.js `zoomAdjust`.
40
+ */
41
+ function zoomAdjust(latitude) {
42
+ return Math.log2(Math.PI * Math.cos(latitude * Math.PI / 180));
43
+ }
44
+
45
+ /**
46
+ * Returns true if the screen pixel `pos` lies within the visible globe
47
+ * silhouette.
48
+ *
49
+ * GlobeViewport.unproject() clamps the ray–sphere discriminant with
50
+ * Math.max(0, r²−d²), so it always returns a valid lng/lat even for
51
+ * off-globe pixels (snapping to the limb). We replicate the same ray cast
52
+ * but check the discriminant before the clamp using the standard
53
+ * squared-distance-from-origin-to-ray formula: |P₀ × dir|² / |dir|².
54
+ */
55
+ function isPixelOnGlobe(viewport, pos) {
56
+ var m = viewport.pixelUnprojectionMatrix;
57
+ if (!m) return true; // conservative fallback if matrix unavailable
58
+
59
+ // Cast a ray through the pixel at the near and far planes.
60
+ var p0 = _core2.vec4.transformMat4([], [pos[0], pos[1], -1, 1], m);
61
+ var p1 = _core2.vec4.transformMat4([], [pos[0], pos[1], 1, 1], m);
62
+ if (p0[3] === 0 || p1[3] === 0) return true; // degenerate projection
63
+
64
+ // Perspective-divide to world space.
65
+ var ax = p0[0] / p0[3],
66
+ ay = p0[1] / p0[3],
67
+ az = p0[2] / p0[3];
68
+ var bx = p1[0] / p1[3],
69
+ by = p1[1] / p1[3],
70
+ bz = p1[2] / p1[3];
71
+
72
+ // Ray direction.
73
+ var dx = bx - ax,
74
+ dy = by - ay,
75
+ dz = bz - az;
76
+
77
+ // Squared distance from the origin (globe center) to the ray:
78
+ // d² = |P₀ × dir|² / |dir|²
79
+ var cx = ay * dz - az * dy;
80
+ var cy = az * dx - ax * dz;
81
+ var cz = ax * dy - ay * dx;
82
+ var dSqr = (cx * cx + cy * cy + cz * cz) / (dx * dx + dy * dy + dz * dz);
83
+ return dSqr <= _globeDepthDiskLayer.GLOBE_COMMON_RADIUS * _globeDepthDiskLayer.GLOBE_COMMON_RADIUS;
84
+ }
85
+
86
+ /**
87
+ * Custom GlobeController that restores zoom-to-cursor behavior.
88
+ *
89
+ * In deck.gl 9.x, the default GlobeController's GlobeState.zoom() ignores the
90
+ * cursor position and always zooms toward the center. This controller patches
91
+ * that behavior by overriding the ControllerState's zoom method to pan the
92
+ * globe under the cursor while zooming, so zoom-to-cursor works the same way it
93
+ * does for the 2D MapController.
94
+ */
95
+ var ZoomToCursorGlobeController = /*#__PURE__*/function (_GlobeController) {
96
+ function ZoomToCursorGlobeController() {
97
+ var _this;
98
+ (0, _classCallCheck2["default"])(this, ZoomToCursorGlobeController);
99
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
100
+ args[_key] = arguments[_key];
101
+ }
102
+ _this = _callSuper(this, ZoomToCursorGlobeController, [].concat(args));
103
+ var OriginalGlobeState = _this.ControllerState;
104
+
105
+ // Tracks when the most recent off-globe wheel-zoom tick fired.
106
+ // Stored as a controller-level closure variable rather than in ViewState
107
+ // because deck.gl's Controller never calls zoomEnd() for wheel events —
108
+ // only for pinch/touch — so there is no reliable hook to clear a
109
+ // ViewState-based sentinel after a wheel scroll session ends.
110
+ // A simple timestamp lets us detect when a new scroll burst has started
111
+ // (> BURST_TIMEOUT_MS since the last off-globe tick) so cursor-anchored
112
+ // zoom can resume naturally on the next independent scroll.
113
+ var offGlobeZoomAt = null;
114
+
115
+ // Create patched GlobeState that supports zoom-to-cursor
116
+ _this.ControllerState = /*#__PURE__*/function (_OriginalGlobeState) {
117
+ function PatchedGlobeState() {
118
+ (0, _classCallCheck2["default"])(this, PatchedGlobeState);
119
+ return _callSuper(this, PatchedGlobeState, arguments);
120
+ }
121
+ (0, _inherits2["default"])(PatchedGlobeState, _OriginalGlobeState);
122
+ return (0, _createClass2["default"])(PatchedGlobeState, [{
123
+ key: "applyConstraints",
124
+ value:
125
+ // Constrain the camera target to a latitude band around the equator so the
126
+ // view can't be centered on the poles. deck.gl's applyConstraints clamps
127
+ // latitude to ~85°, which still lets the camera look straight at a pole.
128
+ function applyConstraints(props) {
129
+ var result = _superPropGet(PatchedGlobeState, "applyConstraints", this, 3)([props]);
130
+ var clampedLatitude = (0, _core2.clamp)(result.latitude, -_constants.GLOBE_MAX_LATITUDE, _constants.GLOBE_MAX_LATITUDE);
131
+ if (clampedLatitude !== result.latitude) {
132
+ // deck.gl couples zoom to latitude via zoomAdjust; when we further
133
+ // clamp latitude, re-apply the same delta so zoom stays consistent.
134
+ result.zoom += zoomAdjust(clampedLatitude) - zoomAdjust(result.latitude);
135
+ result.latitude = clampedLatitude;
136
+ }
137
+ return result;
138
+ }
139
+
140
+ // deck.gl's GlobeState._constrainZoom derives a minimum zoom from `maxBounds`
141
+ // that forces the globe to fill the viewport. That bounds-based minimum
142
+ // (~3 for a typical window) overrides any configured `minZoom`, so the user
143
+ // can never zoom out far enough to see the whole globe small on screen.
144
+ // Override it to honor only the configured minZoom/maxZoom (plus the same
145
+ // latitude adjustment deck.gl uses), ignoring the bounds-based floor.
146
+ }, {
147
+ key: "_constrainZoom",
148
+ value: function _constrainZoom(zoom, props) {
149
+ props = props || this.getViewportProps();
150
+ var _props = props,
151
+ latitude = _props.latitude,
152
+ maxZoom = _props.maxZoom;
153
+ var _props2 = props,
154
+ minZoom = _props2.minZoom;
155
+ if (minZoom === undefined || minZoom === null) {
156
+ minZoom = 0;
157
+ }
158
+ var ZOOM0 = zoomAdjust(0);
159
+ var zoomAdjustment = zoomAdjust(latitude) - ZOOM0;
160
+ return (0, _core2.clamp)(zoom, minZoom + zoomAdjustment, maxZoom + zoomAdjustment);
161
+ }
162
+
163
+ // Exact zoom-to-cursor. deck.gl 9.x's GlobeController does not keep the point
164
+ // under the cursor fixed while zooming, in two ways we work around here:
165
+ // 1. Its GlobeState.zoom() ignores the cursor and zooms toward the center.
166
+ // 2. Its GlobeViewport.panByPosition is a lossy, *linearized* 3-arg
167
+ // rotation (longitude += (0.25/scale)*(startPixel-pixel), re-derives
168
+ // zoom). Using it per wheel tick accumulates error, so after a long
169
+ // continuous zoom the point ends up noticeably shifted from what was
170
+ // originally under the cursor.
171
+ // The recenter below is an *exact absolute* translation: unproject the
172
+ // cursor pixel in the zoomed viewport to get the geo point currently under it,
173
+ // then shift the center by (anchor - thatPoint). No zoom coupling, no
174
+ // rotationSpeed, and it applies to zoom-in and zoom-out symmetrically, so
175
+ // there is no per-tick accumulated drift.
176
+ }, {
177
+ key: "zoom",
178
+ value: function zoom(_ref) {
179
+ var pos = _ref.pos,
180
+ startPos = _ref.startPos,
181
+ scale = _ref.scale;
182
+ var _getState = this.getState(),
183
+ startZoom = _getState.startZoom,
184
+ startZoomLngLat = _getState.startZoomLngLat;
185
+ var currentProps = this.getViewportProps();
186
+ if (!startZoomLngLat) {
187
+ // Wheel zoom: re-derive anchor each tick (pinch sets it once in zoomStart).
188
+ startZoom = currentProps.zoom;
189
+
190
+ // Suppress cursor-anchoring when the cursor is off-globe or when a
191
+ // recent tick was off-globe (within BURST_TIMEOUT_MS). deck.gl never
192
+ // calls zoomEnd() for wheel events so we track the session with the
193
+ // closure variable `offGlobeZoomAt` rather than ViewState.
194
+ var BURST_TIMEOUT_MS = 200;
195
+ var now = Date.now();
196
+ var anchorViewport = this.makeViewport(currentProps);
197
+ var onGlobe = isPixelOnGlobe(anchorViewport, startPos || pos);
198
+ if (!onGlobe) offGlobeZoomAt = now;
199
+ if (!onGlobe || offGlobeZoomAt !== null && now - offGlobeZoomAt < BURST_TIMEOUT_MS) {
200
+ var _zoom = this._constrainZoom(startZoom + Math.log2(scale));
201
+ return this._getUpdatedState({
202
+ zoom: _zoom
203
+ });
204
+ }
205
+ offGlobeZoomAt = null;
206
+ startZoomLngLat = this._unproject(startPos) || this._unproject(pos);
207
+ }
208
+ var zoom = this._constrainZoom(startZoom + Math.log2(scale));
209
+ if (!startZoomLngLat) {
210
+ return this._getUpdatedState({
211
+ zoom: zoom
212
+ });
213
+ }
214
+
215
+ // Zoom-out (scale < 1): exact cursor anchoring is unstable near the limb
216
+ // (non-linear geo-to-pixel mapping pulls the view toward the poles).
217
+ // Instead, gently steer the center toward the cursor location per tick.
218
+ if (scale < 1) {
219
+ if (!Array.isArray(startZoomLngLat) || !Number.isFinite(startZoomLngLat[0]) || !Number.isFinite(startZoomLngLat[1])) {
220
+ return this._getUpdatedState({
221
+ zoom: zoom
222
+ });
223
+ }
224
+
225
+ // Per-tick lerp strength scales with zoom-out amount; clamped to avoid overshoot.
226
+ var t = Math.min(1, (1 - scale) * 0.11);
227
+
228
+ // Shortest-path longitude interpolation (handles antimeridian wrap).
229
+ var dLng = startZoomLngLat[0] - currentProps.longitude;
230
+ if (dLng > 180) dLng -= 360;
231
+ if (dLng < -180) dLng += 360;
232
+ return this._getUpdatedState({
233
+ zoom: zoom,
234
+ longitude: currentProps.longitude + dLng * t,
235
+ latitude: currentProps.latitude + (startZoomLngLat[1] - currentProps.latitude) * t
236
+ });
237
+ }
238
+ var zoomedViewport = this.makeViewport(_objectSpread(_objectSpread({}, currentProps), {}, {
239
+ zoom: zoom
240
+ }));
241
+
242
+ // Zoom-in: exact anchor — unproject the cursor in the post-zoom viewport and
243
+ // shift the center so the grabbed geo point lands back under the cursor.
244
+ // Guard with isPixelOnGlobe: if pos moved off-globe during a fast pinch,
245
+ // fall back to center zoom.
246
+ if (!isPixelOnGlobe(zoomedViewport, pos)) {
247
+ return this._getUpdatedState({
248
+ zoom: zoom
249
+ });
250
+ }
251
+ var fromPosition = zoomedViewport.unproject(pos);
252
+ return this._getUpdatedState({
253
+ zoom: zoom,
254
+ longitude: startZoomLngLat[0] - fromPosition[0] + zoomedViewport.longitude,
255
+ latitude: startZoomLngLat[1] - fromPosition[1] + zoomedViewport.latitude
256
+ });
257
+ }
258
+
259
+ // Clear the persisted pinch anchor at gesture end.
260
+ }, {
261
+ key: "zoomEnd",
262
+ value: function zoomEnd() {
263
+ return this._getUpdatedState({
264
+ startZoom: null,
265
+ startZoomLngLat: null
266
+ });
267
+ }
268
+
269
+ // Exact, cursor-anchored pan: the geo point grabbed on mousedown stays
270
+ // locked under the cursor for the whole drag.
271
+ //
272
+ // deck.gl 9.x's GlobeController pans with a *linearized, center-anchored*
273
+ // rotation (GlobeViewport.panByPosition([lng,lat,zoom], pixel, startPixel):
274
+ // longitude += (0.25/scale)*(startPixel-pixel)). Because the anchor is the
275
+ // view CENTER rather than the grabbed point, the first drag frame snaps the
276
+ // center to satisfy the linear approximation, producing the visible "jump to
277
+ // the side/up" at the start of a pan (most noticeable at high zoom), after
278
+ // which incremental deltas track fine. The exact anchor below removes that
279
+ // first-frame snap.
280
+ }, {
281
+ key: "panStart",
282
+ value: function panStart(_ref2) {
283
+ var pos = _ref2.pos;
284
+ var viewport = this.makeViewport(this.getViewportProps());
285
+ // If the mousedown pixel is outside the globe silhouette, store `false`
286
+ // as an explicit sentinel so that every subsequent `pan` call for this
287
+ // gesture is a no-op. We can't rely on `_unproject(pos)` returning
288
+ // undefined here because GlobeViewport.unproject clamps the
289
+ // ray–sphere discriminant to 0 via Math.max(0, …), which means it
290
+ // always returns a valid-looking lng/lat even for off-globe pixels.
291
+ if (!isPixelOnGlobe(viewport, pos)) {
292
+ return this._getUpdatedState({
293
+ startPanLngLat: false
294
+ });
295
+ }
296
+ return this._getUpdatedState({
297
+ startPanLngLat: this._unproject(pos)
298
+ });
299
+ }
300
+ }, {
301
+ key: "pan",
302
+ value: function pan(_ref3) {
303
+ var pos = _ref3.pos,
304
+ startPos = _ref3.startPos;
305
+ var storedStart = this.getState().startPanLngLat;
306
+ var props = this.getViewportProps();
307
+ var viewport = this.makeViewport(props);
308
+
309
+ // `false` means the drag started outside the globe. If the cursor has
310
+ // now moved onto the globe, latch the current position as the anchor
311
+ // so rotation begins from the entry point. Otherwise stay frozen.
312
+ if (storedStart === false) {
313
+ if (!isPixelOnGlobe(viewport, pos)) {
314
+ return this;
315
+ }
316
+ // Cursor just entered the globe — establish the anchor and return
317
+ // without moving; the next pan event will apply the first delta.
318
+ return this._getUpdatedState({
319
+ startPanLngLat: this._unproject(pos)
320
+ });
321
+ }
322
+ var startPanLngLat = storedStart || this._unproject(startPos);
323
+ if (!startPanLngLat) {
324
+ return this;
325
+ }
326
+
327
+ // Once the cursor leaves the globe silhouette mid-drag, freeze the view.
328
+ // viewport.unproject() snaps off-globe pixels to the nearest limb point
329
+ // (via Math.max(0, …) in its ray–sphere discriminant), so without this
330
+ // guard the globe would keep rotating toward the edge as the cursor moves
331
+ // further outside.
332
+ if (!isPixelOnGlobe(viewport, pos)) {
333
+ return this;
334
+ }
335
+ var fromPosition = viewport.unproject(pos);
336
+ var longitude = startPanLngLat[0] - fromPosition[0] + props.longitude;
337
+ var latitude = startPanLngLat[1] - fromPosition[1] + props.latitude;
338
+ latitude = (0, _core2.clamp)(latitude, -_constants.GLOBE_MAX_LATITUDE, _constants.GLOBE_MAX_LATITUDE);
339
+
340
+ // deck.gl 9's GlobeViewport scale = 2^(zoom - zoomAdjust(latitude)), so a
341
+ // constant zoom would make the globe grow on screen as the center moves
342
+ // toward the poles. Re-couple zoom to the new latitude (as deck.gl 9's own
343
+ // pan does) to keep the on-screen scale — and thus tile LOD — constant.
344
+ var visualZoom = props.zoom - zoomAdjust(props.latitude);
345
+ var zoom = visualZoom + zoomAdjust(latitude);
346
+ return this._getUpdatedState({
347
+ longitude: longitude,
348
+ latitude: latitude,
349
+ zoom: zoom
350
+ });
351
+ }
352
+ }, {
353
+ key: "panEnd",
354
+ value: function panEnd() {
355
+ return this._getUpdatedState({
356
+ startPanLngLat: null
357
+ });
358
+ }
359
+ }]);
360
+ }(OriginalGlobeState);
361
+ return _this;
362
+ }
363
+ (0, _inherits2["default"])(ZoomToCursorGlobeController, _GlobeController);
364
+ return (0, _createClass2["default"])(ZoomToCursorGlobeController);
365
+ }(GlobeController);
366
+ /**
367
+ * Custom GlobeView that uses zoom-to-cursor controller behavior.
368
+ */
369
+ var KeplerGlobeView = exports.KeplerGlobeView = /*#__PURE__*/function (_DeckGlobeView) {
370
+ // Forward constructor props to deck.gl's GlobeView. Declared explicitly because
371
+ // the base class is loosely typed (see DeckGlobeView above), which would
372
+ // otherwise surface a parameterless constructor to callers.
373
+ function KeplerGlobeView(props) {
374
+ (0, _classCallCheck2["default"])(this, KeplerGlobeView);
375
+ return _callSuper(this, KeplerGlobeView, [props]);
376
+ }
377
+ (0, _inherits2["default"])(KeplerGlobeView, _DeckGlobeView);
378
+ return (0, _createClass2["default"])(KeplerGlobeView, [{
379
+ key: "ControllerType",
380
+ get: function get() {
381
+ return ZoomToCursorGlobeController;
382
+ }
383
+
384
+ // deck.gl 9's GlobeView.getViewportType() swaps the viewport class based on zoom:
385
+ // `return viewState.zoom > 12 ? WebMercatorViewport : GlobeViewport;`
386
+ // Crossing zoom 12 therefore recomputes tile bounds with completely different
387
+ // projection math (globe vs flat mercator). That makes deck's TileLayer/MVTLayer
388
+ // reselect tiles inconsistently across the boundary — mixed LODs (e.g. a z4 tile
389
+ // next to z11), a visible "flicker" at 12, and tiles that get dropped and stick
390
+ // as black/empty quads (most often crossing 12 on the way *out*).
391
+ //
392
+ // Force GlobeViewport at every zoom to eliminate the z=12 viewport swap so tile
393
+ // selection stays consistent. The trade-off is that zoom > 12 now uses float32
394
+ // globe precision (deck's documented "no high-precision rendering > 12" limit)
395
+ // instead of switching to mercator — far preferable to the black quads.
396
+ }, {
397
+ key: "getViewportType",
398
+ value: function getViewportType() {
399
+ return DeckGlobeViewport;
400
+ }
401
+ }]);
402
+ }(DeckGlobeView);
403
+ KeplerGlobeView.displayName = 'KeplerGlobeView';
404
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWNrQ29yZSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9jb3JlMiIsIl9jb25zdGFudHMiLCJfZ2xvYmVEZXB0aERpc2tMYXllciIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwiX2dldFByb3RvdHlwZU9mMiIsInByb3RvdHlwZSIsIl9jYWxsU3VwZXIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInZhbHVlT2YiLCJEZWNrR2xvYmVWaWV3IiwiX0dsb2JlVmlldyIsIkdsb2JlQ29udHJvbGxlciIsIl9HbG9iZUNvbnRyb2xsZXIiLCJEZWNrR2xvYmVWaWV3cG9ydCIsIl9HbG9iZVZpZXdwb3J0Iiwiem9vbUFkanVzdCIsImxhdGl0dWRlIiwiTWF0aCIsImxvZzIiLCJQSSIsImNvcyIsImlzUGl4ZWxPbkdsb2JlIiwidmlld3BvcnQiLCJwb3MiLCJtIiwicGl4ZWxVbnByb2plY3Rpb25NYXRyaXgiLCJwMCIsInZlYzQiLCJ0cmFuc2Zvcm1NYXQ0IiwicDEiLCJheCIsImF5IiwiYXoiLCJieCIsImJ5IiwiYnoiLCJkeCIsImR5IiwiZHoiLCJjeCIsImN5IiwiY3oiLCJkU3FyIiwiR0xPQkVfQ09NTU9OX1JBRElVUyIsIlpvb21Ub0N1cnNvckdsb2JlQ29udHJvbGxlciIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0IiwiT3JpZ2luYWxHbG9iZVN0YXRlIiwiQ29udHJvbGxlclN0YXRlIiwib2ZmR2xvYmVab29tQXQiLCJfT3JpZ2luYWxHbG9iZVN0YXRlIiwiUGF0Y2hlZEdsb2JlU3RhdGUiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiYXBwbHlDb25zdHJhaW50cyIsInByb3BzIiwicmVzdWx0IiwiY2xhbXBlZExhdGl0dWRlIiwiY2xhbXAiLCJHTE9CRV9NQVhfTEFUSVRVREUiLCJ6b29tIiwiX2NvbnN0cmFpblpvb20iLCJnZXRWaWV3cG9ydFByb3BzIiwiX3Byb3BzIiwibWF4Wm9vbSIsIl9wcm9wczIiLCJtaW5ab29tIiwidW5kZWZpbmVkIiwiWk9PTTAiLCJ6b29tQWRqdXN0bWVudCIsIl9yZWYiLCJzdGFydFBvcyIsInNjYWxlIiwiX2dldFN0YXRlIiwiZ2V0U3RhdGUiLCJzdGFydFpvb20iLCJzdGFydFpvb21MbmdMYXQiLCJjdXJyZW50UHJvcHMiLCJCVVJTVF9USU1FT1VUX01TIiwibm93IiwiRGF0ZSIsImFuY2hvclZpZXdwb3J0IiwibWFrZVZpZXdwb3J0Iiwib25HbG9iZSIsIl9nZXRVcGRhdGVkU3RhdGUiLCJfdW5wcm9qZWN0IiwiaXNBcnJheSIsIk51bWJlciIsImlzRmluaXRlIiwibWluIiwiZExuZyIsImxvbmdpdHVkZSIsInpvb21lZFZpZXdwb3J0IiwiZnJvbVBvc2l0aW9uIiwidW5wcm9qZWN0Iiwiem9vbUVuZCIsInBhblN0YXJ0IiwiX3JlZjIiLCJzdGFydFBhbkxuZ0xhdCIsInBhbiIsIl9yZWYzIiwic3RvcmVkU3RhcnQiLCJ2aXN1YWxab29tIiwicGFuRW5kIiwiS2VwbGVyR2xvYmVWaWV3IiwiZXhwb3J0cyIsIl9EZWNrR2xvYmVWaWV3IiwiZ2V0Vmlld3BvcnRUeXBlIiwiZGlzcGxheU5hbWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2xvYmUvZ2xvYmUtdmlldy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgKiBhcyBEZWNrQ29yZSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7Y2xhbXAsIHZlYzR9IGZyb20gJ0BtYXRoLmdsL2NvcmUnO1xuaW1wb3J0IHtHTE9CRV9NQVhfTEFUSVRVREV9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7R0xPQkVfQ09NTU9OX1JBRElVU30gZnJvbSAnLi9nbG9iZS1kZXB0aC1kaXNrLWxheWVyJztcblxuLy8gZGVjay5nbCBleHBvc2VzIEdsb2JlVmlldyAvIEdsb2JlQ29udHJvbGxlciBhcyBleHBlcmltZW50YWwsIHVuZGVyc2NvcmUtcHJlZml4ZWRcbi8vIG1lbWJlcnMuIFRoZWlyIG5hbWVkIHR5cGUgYmluZGluZ3MgYXJlbid0IHJlbGlhYmx5IHJlc29sdmFibGUgdGhyb3VnaCB0aGVcbi8vIHBhY2thZ2UgYmFycmVsIHVuZGVyIHRoaXMgcHJvamVjdCdzIG1vZHVsZSByZXNvbHV0aW9uLCBzbyB3ZSBwdWxsIHRoZW0gb2ZmIHRoZVxuLy8gbmFtZXNwYWNlIHdpdGggYSBsb29zZSB0eXBlLiBSdW50aW1lIGJlaGF2aW9yIGlzIHVuY2hhbmdlZC5cbmNvbnN0IERlY2tHbG9iZVZpZXcgPSAoRGVja0NvcmUgYXMgYW55KS5fR2xvYmVWaWV3IGFzIGFueTtcbmNvbnN0IEdsb2JlQ29udHJvbGxlciA9IChEZWNrQ29yZSBhcyBhbnkpLl9HbG9iZUNvbnRyb2xsZXIgYXMgYW55O1xuY29uc3QgRGVja0dsb2JlVmlld3BvcnQgPSAoRGVja0NvcmUgYXMgYW55KS5fR2xvYmVWaWV3cG9ydCBhcyBhbnk7XG5cbi8qKlxuICogTGF0aXR1ZGUtYmFzZWQgem9vbSBhZGp1c3RtZW50IHVzZWQgYnkgZGVjay5nbCdzIEdsb2JlVmlld3BvcnQsIHJlcGxpY2F0ZWRcbiAqIGhlcmUgc28gb3VyIGN1c3RvbSBgX2NvbnN0cmFpblpvb21gIG1hdGNoZXMgZGVjay5nbCdzIGNvb3JkaW5hdGUgbWF0aC5cbiAqIFNlZSBAZGVjay5nbC9jb3JlIGdsb2JlLXZpZXdwb3J0LmpzIGB6b29tQWRqdXN0YC5cbiAqL1xuZnVuY3Rpb24gem9vbUFkanVzdChsYXRpdHVkZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubG9nMihNYXRoLlBJICogTWF0aC5jb3MoKGxhdGl0dWRlICogTWF0aC5QSSkgLyAxODApKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNjcmVlbiBwaXhlbCBgcG9zYCBsaWVzIHdpdGhpbiB0aGUgdmlzaWJsZSBnbG9iZVxuICogc2lsaG91ZXR0ZS5cbiAqXG4gKiBHbG9iZVZpZXdwb3J0LnVucHJvamVjdCgpIGNsYW1wcyB0aGUgcmF54oCTc3BoZXJlIGRpc2NyaW1pbmFudCB3aXRoXG4gKiBNYXRoLm1heCgwLCBywrLiiJJkwrIpLCBzbyBpdCBhbHdheXMgcmV0dXJucyBhIHZhbGlkIGxuZy9sYXQgZXZlbiBmb3JcbiAqIG9mZi1nbG9iZSBwaXhlbHMgKHNuYXBwaW5nIHRvIHRoZSBsaW1iKS4gIFdlIHJlcGxpY2F0ZSB0aGUgc2FtZSByYXkgY2FzdFxuICogYnV0IGNoZWNrIHRoZSBkaXNjcmltaW5hbnQgYmVmb3JlIHRoZSBjbGFtcCB1c2luZyB0aGUgc3RhbmRhcmRcbiAqIHNxdWFyZWQtZGlzdGFuY2UtZnJvbS1vcmlnaW4tdG8tcmF5IGZvcm11bGE6IHxQ4oKAIMOXIGRpcnzCsiAvIHxkaXJ8wrIuXG4gKi9cbmZ1bmN0aW9uIGlzUGl4ZWxPbkdsb2JlKHZpZXdwb3J0OiBhbnksIHBvczogW251bWJlciwgbnVtYmVyXSk6IGJvb2xlYW4ge1xuICBjb25zdCBtOiBudW1iZXJbXSA9IHZpZXdwb3J0LnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4O1xuICBpZiAoIW0pIHJldHVybiB0cnVlOyAvLyBjb25zZXJ2YXRpdmUgZmFsbGJhY2sgaWYgbWF0cml4IHVuYXZhaWxhYmxlXG5cbiAgLy8gQ2FzdCBhIHJheSB0aHJvdWdoIHRoZSBwaXhlbCBhdCB0aGUgbmVhciBhbmQgZmFyIHBsYW5lcy5cbiAgY29uc3QgcDAgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwb3NbMF0sIHBvc1sxXSwgLTEsIDFdLCBtKTtcbiAgY29uc3QgcDEgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwb3NbMF0sIHBvc1sxXSwgMSwgMV0sIG0pO1xuICBpZiAocDBbM10gPT09IDAgfHwgcDFbM10gPT09IDApIHJldHVybiB0cnVlOyAvLyBkZWdlbmVyYXRlIHByb2plY3Rpb25cblxuICAvLyBQZXJzcGVjdGl2ZS1kaXZpZGUgdG8gd29ybGQgc3BhY2UuXG4gIGNvbnN0IGF4ID0gcDBbMF0gLyBwMFszXSwgYXkgPSBwMFsxXSAvIHAwWzNdLCBheiA9IHAwWzJdIC8gcDBbM107XG4gIGNvbnN0IGJ4ID0gcDFbMF0gLyBwMVszXSwgYnkgPSBwMVsxXSAvIHAxWzNdLCBieiA9IHAxWzJdIC8gcDFbM107XG5cbiAgLy8gUmF5IGRpcmVjdGlvbi5cbiAgY29uc3QgZHggPSBieCAtIGF4LCBkeSA9IGJ5IC0gYXksIGR6ID0gYnogLSBhejtcblxuICAvLyBTcXVhcmVkIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiAoZ2xvYmUgY2VudGVyKSB0byB0aGUgcmF5OlxuICAvLyAgIGTCsiA9IHxQ4oKAIMOXIGRpcnzCsiAvIHxkaXJ8wrJcbiAgY29uc3QgY3ggPSBheSAqIGR6IC0gYXogKiBkeTtcbiAgY29uc3QgY3kgPSBheiAqIGR4IC0gYXggKiBkejtcbiAgY29uc3QgY3ogPSBheCAqIGR5IC0gYXkgKiBkeDtcbiAgY29uc3QgZFNxciA9IChjeCAqIGN4ICsgY3kgKiBjeSArIGN6ICogY3opIC8gKGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7XG5cbiAgcmV0dXJuIGRTcXIgPD0gR0xPQkVfQ09NTU9OX1JBRElVUyAqIEdMT0JFX0NPTU1PTl9SQURJVVM7XG59XG5cbi8qKlxuICogQ3VzdG9tIEdsb2JlQ29udHJvbGxlciB0aGF0IHJlc3RvcmVzIHpvb20tdG8tY3Vyc29yIGJlaGF2aW9yLlxuICpcbiAqIEluIGRlY2suZ2wgOS54LCB0aGUgZGVmYXVsdCBHbG9iZUNvbnRyb2xsZXIncyBHbG9iZVN0YXRlLnpvb20oKSBpZ25vcmVzIHRoZVxuICogY3Vyc29yIHBvc2l0aW9uIGFuZCBhbHdheXMgem9vbXMgdG93YXJkIHRoZSBjZW50ZXIuIFRoaXMgY29udHJvbGxlciBwYXRjaGVzXG4gKiB0aGF0IGJlaGF2aW9yIGJ5IG92ZXJyaWRpbmcgdGhlIENvbnRyb2xsZXJTdGF0ZSdzIHpvb20gbWV0aG9kIHRvIHBhbiB0aGVcbiAqIGdsb2JlIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgem9vbWluZywgc28gem9vbS10by1jdXJzb3Igd29ya3MgdGhlIHNhbWUgd2F5IGl0XG4gKiBkb2VzIGZvciB0aGUgMkQgTWFwQ29udHJvbGxlci5cbiAqL1xuY2xhc3MgWm9vbVRvQ3Vyc29yR2xvYmVDb250cm9sbGVyIGV4dGVuZHMgR2xvYmVDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICBzdXBlciguLi5hcmdzKTtcbiAgICBjb25zdCBPcmlnaW5hbEdsb2JlU3RhdGUgPSB0aGlzLkNvbnRyb2xsZXJTdGF0ZTtcblxuICAgIC8vIFRyYWNrcyB3aGVuIHRoZSBtb3N0IHJlY2VudCBvZmYtZ2xvYmUgd2hlZWwtem9vbSB0aWNrIGZpcmVkLlxuICAgIC8vIFN0b3JlZCBhcyBhIGNvbnRyb2xsZXItbGV2ZWwgY2xvc3VyZSB2YXJpYWJsZSByYXRoZXIgdGhhbiBpbiBWaWV3U3RhdGVcbiAgICAvLyBiZWNhdXNlIGRlY2suZ2wncyBDb250cm9sbGVyIG5ldmVyIGNhbGxzIHpvb21FbmQoKSBmb3Igd2hlZWwgZXZlbnRzIOKAlFxuICAgIC8vIG9ubHkgZm9yIHBpbmNoL3RvdWNoIOKAlCBzbyB0aGVyZSBpcyBubyByZWxpYWJsZSBob29rIHRvIGNsZWFyIGFcbiAgICAvLyBWaWV3U3RhdGUtYmFzZWQgc2VudGluZWwgYWZ0ZXIgYSB3aGVlbCBzY3JvbGwgc2Vzc2lvbiBlbmRzLlxuICAgIC8vIEEgc2ltcGxlIHRpbWVzdGFtcCBsZXRzIHVzIGRldGVjdCB3aGVuIGEgbmV3IHNjcm9sbCBidXJzdCBoYXMgc3RhcnRlZFxuICAgIC8vICg+IEJVUlNUX1RJTUVPVVRfTVMgc2luY2UgdGhlIGxhc3Qgb2ZmLWdsb2JlIHRpY2spIHNvIGN1cnNvci1hbmNob3JlZFxuICAgIC8vIHpvb20gY2FuIHJlc3VtZSBuYXR1cmFsbHkgb24gdGhlIG5leHQgaW5kZXBlbmRlbnQgc2Nyb2xsLlxuICAgIGxldCBvZmZHbG9iZVpvb21BdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBDcmVhdGUgcGF0Y2hlZCBHbG9iZVN0YXRlIHRoYXQgc3VwcG9ydHMgem9vbS10by1jdXJzb3JcbiAgICB0aGlzLkNvbnRyb2xsZXJTdGF0ZSA9IGNsYXNzIFBhdGNoZWRHbG9iZVN0YXRlIGV4dGVuZHMgT3JpZ2luYWxHbG9iZVN0YXRlIHtcbiAgICAgIC8vIENvbnN0cmFpbiB0aGUgY2FtZXJhIHRhcmdldCB0byBhIGxhdGl0dWRlIGJhbmQgYXJvdW5kIHRoZSBlcXVhdG9yIHNvIHRoZVxuICAgICAgLy8gdmlldyBjYW4ndCBiZSBjZW50ZXJlZCBvbiB0aGUgcG9sZXMuIGRlY2suZ2wncyBhcHBseUNvbnN0cmFpbnRzIGNsYW1wc1xuICAgICAgLy8gbGF0aXR1ZGUgdG8gfjg1wrAsIHdoaWNoIHN0aWxsIGxldHMgdGhlIGNhbWVyYSBsb29rIHN0cmFpZ2h0IGF0IGEgcG9sZS5cbiAgICAgIGFwcGx5Q29uc3RyYWludHMocHJvcHM6IGFueSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdXBlci5hcHBseUNvbnN0cmFpbnRzKHByb3BzKTtcbiAgICAgICAgY29uc3QgY2xhbXBlZExhdGl0dWRlID0gY2xhbXAocmVzdWx0LmxhdGl0dWRlLCAtR0xPQkVfTUFYX0xBVElUVURFLCBHTE9CRV9NQVhfTEFUSVRVREUpO1xuICAgICAgICBpZiAoY2xhbXBlZExhdGl0dWRlICE9PSByZXN1bHQubGF0aXR1ZGUpIHtcbiAgICAgICAgICAvLyBkZWNrLmdsIGNvdXBsZXMgem9vbSB0byBsYXRpdHVkZSB2aWEgem9vbUFkanVzdDsgd2hlbiB3ZSBmdXJ0aGVyXG4gICAgICAgICAgLy8gY2xhbXAgbGF0aXR1ZGUsIHJlLWFwcGx5IHRoZSBzYW1lIGRlbHRhIHNvIHpvb20gc3RheXMgY29uc2lzdGVudC5cbiAgICAgICAgICByZXN1bHQuem9vbSArPSB6b29tQWRqdXN0KGNsYW1wZWRMYXRpdHVkZSkgLSB6b29tQWRqdXN0KHJlc3VsdC5sYXRpdHVkZSk7XG4gICAgICAgICAgcmVzdWx0LmxhdGl0dWRlID0gY2xhbXBlZExhdGl0dWRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlY2suZ2wncyBHbG9iZVN0YXRlLl9jb25zdHJhaW5ab29tIGRlcml2ZXMgYSBtaW5pbXVtIHpvb20gZnJvbSBgbWF4Qm91bmRzYFxuICAgICAgLy8gdGhhdCBmb3JjZXMgdGhlIGdsb2JlIHRvIGZpbGwgdGhlIHZpZXdwb3J0LiBUaGF0IGJvdW5kcy1iYXNlZCBtaW5pbXVtXG4gICAgICAvLyAofjMgZm9yIGEgdHlwaWNhbCB3aW5kb3cpIG92ZXJyaWRlcyBhbnkgY29uZmlndXJlZCBgbWluWm9vbWAsIHNvIHRoZSB1c2VyXG4gICAgICAvLyBjYW4gbmV2ZXIgem9vbSBvdXQgZmFyIGVub3VnaCB0byBzZWUgdGhlIHdob2xlIGdsb2JlIHNtYWxsIG9uIHNjcmVlbi5cbiAgICAgIC8vIE92ZXJyaWRlIGl0IHRvIGhvbm9yIG9ubHkgdGhlIGNvbmZpZ3VyZWQgbWluWm9vbS9tYXhab29tIChwbHVzIHRoZSBzYW1lXG4gICAgICAvLyBsYXRpdHVkZSBhZGp1c3RtZW50IGRlY2suZ2wgdXNlcyksIGlnbm9yaW5nIHRoZSBib3VuZHMtYmFzZWQgZmxvb3IuXG4gICAgICBfY29uc3RyYWluWm9vbSh6b29tOiBudW1iZXIsIHByb3BzPzogYW55KSB7XG4gICAgICAgIHByb3BzID0gcHJvcHMgfHwgKHRoaXMgYXMgYW55KS5nZXRWaWV3cG9ydFByb3BzKCk7XG4gICAgICAgIGNvbnN0IHtsYXRpdHVkZSwgbWF4Wm9vbX0gPSBwcm9wcztcbiAgICAgICAgbGV0IHttaW5ab29tfSA9IHByb3BzO1xuICAgICAgICBpZiAobWluWm9vbSA9PT0gdW5kZWZpbmVkIHx8IG1pblpvb20gPT09IG51bGwpIHtcbiAgICAgICAgICBtaW5ab29tID0gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBaT09NMCA9IHpvb21BZGp1c3QoMCk7XG4gICAgICAgIGNvbnN0IHpvb21BZGp1c3RtZW50ID0gem9vbUFkanVzdChsYXRpdHVkZSkgLSBaT09NMDtcbiAgICAgICAgcmV0dXJuIGNsYW1wKHpvb20sIG1pblpvb20gKyB6b29tQWRqdXN0bWVudCwgbWF4Wm9vbSArIHpvb21BZGp1c3RtZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhhY3Qgem9vbS10by1jdXJzb3IuIGRlY2suZ2wgOS54J3MgR2xvYmVDb250cm9sbGVyIGRvZXMgbm90IGtlZXAgdGhlIHBvaW50XG4gICAgICAvLyB1bmRlciB0aGUgY3Vyc29yIGZpeGVkIHdoaWxlIHpvb21pbmcsIGluIHR3byB3YXlzIHdlIHdvcmsgYXJvdW5kIGhlcmU6XG4gICAgICAvLyAgIDEuIEl0cyBHbG9iZVN0YXRlLnpvb20oKSBpZ25vcmVzIHRoZSBjdXJzb3IgYW5kIHpvb21zIHRvd2FyZCB0aGUgY2VudGVyLlxuICAgICAgLy8gICAyLiBJdHMgR2xvYmVWaWV3cG9ydC5wYW5CeVBvc2l0aW9uIGlzIGEgbG9zc3ksICpsaW5lYXJpemVkKiAzLWFyZ1xuICAgICAgLy8gICAgICByb3RhdGlvbiAobG9uZ2l0dWRlICs9ICgwLjI1L3NjYWxlKSooc3RhcnRQaXhlbC1waXhlbCksIHJlLWRlcml2ZXNcbiAgICAgIC8vICAgICAgem9vbSkuIFVzaW5nIGl0IHBlciB3aGVlbCB0aWNrIGFjY3VtdWxhdGVzIGVycm9yLCBzbyBhZnRlciBhIGxvbmdcbiAgICAgIC8vICAgICAgY29udGludW91cyB6b29tIHRoZSBwb2ludCBlbmRzIHVwIG5vdGljZWFibHkgc2hpZnRlZCBmcm9tIHdoYXQgd2FzXG4gICAgICAvLyAgICAgIG9yaWdpbmFsbHkgdW5kZXIgdGhlIGN1cnNvci5cbiAgICAgIC8vIFRoZSByZWNlbnRlciBiZWxvdyBpcyBhbiAqZXhhY3QgYWJzb2x1dGUqIHRyYW5zbGF0aW9uOiB1bnByb2plY3QgdGhlXG4gICAgICAvLyBjdXJzb3IgcGl4ZWwgaW4gdGhlIHpvb21lZCB2aWV3cG9ydCB0byBnZXQgdGhlIGdlbyBwb2ludCBjdXJyZW50bHkgdW5kZXIgaXQsXG4gICAgICAvLyB0aGVuIHNoaWZ0IHRoZSBjZW50ZXIgYnkgKGFuY2hvciAtIHRoYXRQb2ludCkuIE5vIHpvb20gY291cGxpbmcsIG5vXG4gICAgICAvLyByb3RhdGlvblNwZWVkLCBhbmQgaXQgYXBwbGllcyB0byB6b29tLWluIGFuZCB6b29tLW91dCBzeW1tZXRyaWNhbGx5LCBzb1xuICAgICAgLy8gdGhlcmUgaXMgbm8gcGVyLXRpY2sgYWNjdW11bGF0ZWQgZHJpZnQuXG4gICAgICB6b29tKHtcbiAgICAgICAgcG9zLFxuICAgICAgICBzdGFydFBvcyxcbiAgICAgICAgc2NhbGVcbiAgICAgIH06IHtcbiAgICAgICAgcG9zOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICBzdGFydFBvcz86IFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgIHNjYWxlOiBudW1iZXI7XG4gICAgICB9KSB7XG4gICAgICAgIGxldCB7c3RhcnRab29tLCBzdGFydFpvb21MbmdMYXR9ID0gKHRoaXMgYXMgYW55KS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjdXJyZW50UHJvcHMgPSAodGhpcyBhcyBhbnkpLmdldFZpZXdwb3J0UHJvcHMoKTtcblxuICAgICAgICBpZiAoIXN0YXJ0Wm9vbUxuZ0xhdCkge1xuICAgICAgICAgIC8vIFdoZWVsIHpvb206IHJlLWRlcml2ZSBhbmNob3IgZWFjaCB0aWNrIChwaW5jaCBzZXRzIGl0IG9uY2UgaW4gem9vbVN0YXJ0KS5cbiAgICAgICAgICBzdGFydFpvb20gPSBjdXJyZW50UHJvcHMuem9vbTtcblxuICAgICAgICAgIC8vIFN1cHByZXNzIGN1cnNvci1hbmNob3Jpbmcgd2hlbiB0aGUgY3Vyc29yIGlzIG9mZi1nbG9iZSBvciB3aGVuIGFcbiAgICAgICAgICAvLyByZWNlbnQgdGljayB3YXMgb2ZmLWdsb2JlICh3aXRoaW4gQlVSU1RfVElNRU9VVF9NUykuICBkZWNrLmdsIG5ldmVyXG4gICAgICAgICAgLy8gY2FsbHMgem9vbUVuZCgpIGZvciB3aGVlbCBldmVudHMgc28gd2UgdHJhY2sgdGhlIHNlc3Npb24gd2l0aCB0aGVcbiAgICAgICAgICAvLyBjbG9zdXJlIHZhcmlhYmxlIGBvZmZHbG9iZVpvb21BdGAgcmF0aGVyIHRoYW4gVmlld1N0YXRlLlxuICAgICAgICAgIGNvbnN0IEJVUlNUX1RJTUVPVVRfTVMgPSAyMDA7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBhbmNob3JWaWV3cG9ydCA9ICh0aGlzIGFzIGFueSkubWFrZVZpZXdwb3J0KGN1cnJlbnRQcm9wcyk7XG4gICAgICAgICAgY29uc3Qgb25HbG9iZSA9IGlzUGl4ZWxPbkdsb2JlKGFuY2hvclZpZXdwb3J0LCBzdGFydFBvcyB8fCBwb3MpO1xuXG4gICAgICAgICAgaWYgKCFvbkdsb2JlKSBvZmZHbG9iZVpvb21BdCA9IG5vdztcblxuICAgICAgICAgIGlmICghb25HbG9iZSB8fCAob2ZmR2xvYmVab29tQXQgIT09IG51bGwgJiYgbm93IC0gb2ZmR2xvYmVab29tQXQgPCBCVVJTVF9USU1FT1VUX01TKSkge1xuICAgICAgICAgICAgY29uc3Qgem9vbSA9ICh0aGlzIGFzIGFueSkuX2NvbnN0cmFpblpvb20oc3RhcnRab29tICsgTWF0aC5sb2cyKHNjYWxlKSk7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMgYXMgYW55KS5fZ2V0VXBkYXRlZFN0YXRlKHt6b29tfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2ZmR2xvYmVab29tQXQgPSBudWxsO1xuICAgICAgICAgIHN0YXJ0Wm9vbUxuZ0xhdCA9ICh0aGlzIGFzIGFueSkuX3VucHJvamVjdChzdGFydFBvcykgfHwgKHRoaXMgYXMgYW55KS5fdW5wcm9qZWN0KHBvcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b29tID0gKHRoaXMgYXMgYW55KS5fY29uc3RyYWluWm9vbShzdGFydFpvb20gKyBNYXRoLmxvZzIoc2NhbGUpKTtcblxuICAgICAgICBpZiAoIXN0YXJ0Wm9vbUxuZ0xhdCkge1xuICAgICAgICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9nZXRVcGRhdGVkU3RhdGUoe3pvb219KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvb20tb3V0IChzY2FsZSA8IDEpOiBleGFjdCBjdXJzb3IgYW5jaG9yaW5nIGlzIHVuc3RhYmxlIG5lYXIgdGhlIGxpbWJcbiAgICAgICAgLy8gKG5vbi1saW5lYXIgZ2VvLXRvLXBpeGVsIG1hcHBpbmcgcHVsbHMgdGhlIHZpZXcgdG93YXJkIHRoZSBwb2xlcykuXG4gICAgICAgIC8vIEluc3RlYWQsIGdlbnRseSBzdGVlciB0aGUgY2VudGVyIHRvd2FyZCB0aGUgY3Vyc29yIGxvY2F0aW9uIHBlciB0aWNrLlxuICAgICAgICBpZiAoc2NhbGUgPCAxKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc3RhcnRab29tTG5nTGF0KSB8fFxuICAgICAgICAgICAgIU51bWJlci5pc0Zpbml0ZShzdGFydFpvb21MbmdMYXRbMF0pIHx8XG4gICAgICAgICAgICAhTnVtYmVyLmlzRmluaXRlKHN0YXJ0Wm9vbUxuZ0xhdFsxXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9nZXRVcGRhdGVkU3RhdGUoe3pvb219KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQZXItdGljayBsZXJwIHN0cmVuZ3RoIHNjYWxlcyB3aXRoIHpvb20tb3V0IGFtb3VudDsgY2xhbXBlZCB0byBhdm9pZCBvdmVyc2hvb3QuXG4gICAgICAgICAgY29uc3QgdCA9IE1hdGgubWluKDEsICgxIC0gc2NhbGUpICogMC4xMSk7XG5cbiAgICAgICAgICAvLyBTaG9ydGVzdC1wYXRoIGxvbmdpdHVkZSBpbnRlcnBvbGF0aW9uIChoYW5kbGVzIGFudGltZXJpZGlhbiB3cmFwKS5cbiAgICAgICAgICBsZXQgZExuZyA9IHN0YXJ0Wm9vbUxuZ0xhdFswXSAtIGN1cnJlbnRQcm9wcy5sb25naXR1ZGU7XG4gICAgICAgICAgaWYgKGRMbmcgPiAxODApIGRMbmcgLT0gMzYwO1xuICAgICAgICAgIGlmIChkTG5nIDwgLTE4MCkgZExuZyArPSAzNjA7XG5cbiAgICAgICAgICByZXR1cm4gKHRoaXMgYXMgYW55KS5fZ2V0VXBkYXRlZFN0YXRlKHtcbiAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICBsb25naXR1ZGU6IGN1cnJlbnRQcm9wcy5sb25naXR1ZGUgKyBkTG5nICogdCxcbiAgICAgICAgICAgIGxhdGl0dWRlOiBjdXJyZW50UHJvcHMubGF0aXR1ZGUgKyAoc3RhcnRab29tTG5nTGF0WzFdIC0gY3VycmVudFByb3BzLmxhdGl0dWRlKSAqIHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHpvb21lZFZpZXdwb3J0ID0gKHRoaXMgYXMgYW55KS5tYWtlVmlld3BvcnQoe1xuICAgICAgICAgIC4uLmN1cnJlbnRQcm9wcyxcbiAgICAgICAgICB6b29tXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFpvb20taW46IGV4YWN0IGFuY2hvciDigJQgdW5wcm9qZWN0IHRoZSBjdXJzb3IgaW4gdGhlIHBvc3Qtem9vbSB2aWV3cG9ydCBhbmRcbiAgICAgICAgLy8gc2hpZnQgdGhlIGNlbnRlciBzbyB0aGUgZ3JhYmJlZCBnZW8gcG9pbnQgbGFuZHMgYmFjayB1bmRlciB0aGUgY3Vyc29yLlxuICAgICAgICAvLyBHdWFyZCB3aXRoIGlzUGl4ZWxPbkdsb2JlOiBpZiBwb3MgbW92ZWQgb2ZmLWdsb2JlIGR1cmluZyBhIGZhc3QgcGluY2gsXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBjZW50ZXIgem9vbS5cbiAgICAgICAgaWYgKCFpc1BpeGVsT25HbG9iZSh6b29tZWRWaWV3cG9ydCwgcG9zKSkge1xuICAgICAgICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9nZXRVcGRhdGVkU3RhdGUoe3pvb219KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZyb21Qb3NpdGlvbiA9IHpvb21lZFZpZXdwb3J0LnVucHJvamVjdChwb3MpO1xuXG4gICAgICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9nZXRVcGRhdGVkU3RhdGUoe1xuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgbG9uZ2l0dWRlOiBzdGFydFpvb21MbmdMYXRbMF0gLSBmcm9tUG9zaXRpb25bMF0gKyB6b29tZWRWaWV3cG9ydC5sb25naXR1ZGUsXG4gICAgICAgICAgbGF0aXR1ZGU6IHN0YXJ0Wm9vbUxuZ0xhdFsxXSAtIGZyb21Qb3NpdGlvblsxXSArIHpvb21lZFZpZXdwb3J0LmxhdGl0dWRlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgcGVyc2lzdGVkIHBpbmNoIGFuY2hvciBhdCBnZXN0dXJlIGVuZC5cbiAgICAgIHpvb21FbmQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9nZXRVcGRhdGVkU3RhdGUoe1xuICAgICAgICAgIHN0YXJ0Wm9vbTogbnVsbCxcbiAgICAgICAgICBzdGFydFpvb21MbmdMYXQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4YWN0LCBjdXJzb3ItYW5jaG9yZWQgcGFuOiB0aGUgZ2VvIHBvaW50IGdyYWJiZWQgb24gbW91c2Vkb3duIHN0YXlzXG4gICAgICAvLyBsb2NrZWQgdW5kZXIgdGhlIGN1cnNvciBmb3IgdGhlIHdob2xlIGRyYWcuXG4gICAgICAvL1xuICAgICAgLy8gZGVjay5nbCA5LngncyBHbG9iZUNvbnRyb2xsZXIgcGFucyB3aXRoIGEgKmxpbmVhcml6ZWQsIGNlbnRlci1hbmNob3JlZCpcbiAgICAgIC8vIHJvdGF0aW9uIChHbG9iZVZpZXdwb3J0LnBhbkJ5UG9zaXRpb24oW2xuZyxsYXQsem9vbV0sIHBpeGVsLCBzdGFydFBpeGVsKTpcbiAgICAgIC8vIGxvbmdpdHVkZSArPSAoMC4yNS9zY2FsZSkqKHN0YXJ0UGl4ZWwtcGl4ZWwpKS4gQmVjYXVzZSB0aGUgYW5jaG9yIGlzIHRoZVxuICAgICAgLy8gdmlldyBDRU5URVIgcmF0aGVyIHRoYW4gdGhlIGdyYWJiZWQgcG9pbnQsIHRoZSBmaXJzdCBkcmFnIGZyYW1lIHNuYXBzIHRoZVxuICAgICAgLy8gY2VudGVyIHRvIHNhdGlzZnkgdGhlIGxpbmVhciBhcHByb3hpbWF0aW9uLCBwcm9kdWNpbmcgdGhlIHZpc2libGUgXCJqdW1wIHRvXG4gICAgICAvLyB0aGUgc2lkZS91cFwiIGF0IHRoZSBzdGFydCBvZiBhIHBhbiAobW9zdCBub3RpY2VhYmxlIGF0IGhpZ2ggem9vbSksIGFmdGVyXG4gICAgICAvLyB3aGljaCBpbmNyZW1lbnRhbCBkZWx0YXMgdHJhY2sgZmluZS4gVGhlIGV4YWN0IGFuY2hvciBiZWxvdyByZW1vdmVzIHRoYXRcbiAgICAgIC8vIGZpcnN0LWZyYW1lIHNuYXAuXG4gICAgICBwYW5TdGFydCh7cG9zfToge3BvczogW251bWJlciwgbnVtYmVyXX0pIHtcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSAodGhpcyBhcyBhbnkpLm1ha2VWaWV3cG9ydCgodGhpcyBhcyBhbnkpLmdldFZpZXdwb3J0UHJvcHMoKSk7XG4gICAgICAgIC8vIElmIHRoZSBtb3VzZWRvd24gcGl4ZWwgaXMgb3V0c2lkZSB0aGUgZ2xvYmUgc2lsaG91ZXR0ZSwgc3RvcmUgYGZhbHNlYFxuICAgICAgICAvLyBhcyBhbiBleHBsaWNpdCBzZW50aW5lbCBzbyB0aGF0IGV2ZXJ5IHN1YnNlcXVlbnQgYHBhbmAgY2FsbCBmb3IgdGhpc1xuICAgICAgICAvLyBnZXN0dXJlIGlzIGEgbm8tb3AuICBXZSBjYW4ndCByZWx5IG9uIGBfdW5wcm9qZWN0KHBvcylgIHJldHVybmluZ1xuICAgICAgICAvLyB1bmRlZmluZWQgaGVyZSBiZWNhdXNlIEdsb2JlVmlld3BvcnQudW5wcm9qZWN0IGNsYW1wcyB0aGVcbiAgICAgICAgLy8gcmF54oCTc3BoZXJlIGRpc2NyaW1pbmFudCB0byAwIHZpYSBNYXRoLm1heCgwLCDigKYpLCB3aGljaCBtZWFucyBpdFxuICAgICAgICAvLyBhbHdheXMgcmV0dXJucyBhIHZhbGlkLWxvb2tpbmcgbG5nL2xhdCBldmVuIGZvciBvZmYtZ2xvYmUgcGl4ZWxzLlxuICAgICAgICBpZiAoIWlzUGl4ZWxPbkdsb2JlKHZpZXdwb3J0LCBwb3MpKSB7XG4gICAgICAgICAgcmV0dXJuICh0aGlzIGFzIGFueSkuX2dldFVwZGF0ZWRTdGF0ZSh7c3RhcnRQYW5MbmdMYXQ6IGZhbHNlfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzIGFzIGFueSkuX2dldFVwZGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgc3RhcnRQYW5MbmdMYXQ6ICh0aGlzIGFzIGFueSkuX3VucHJvamVjdChwb3MpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwYW4oe3Bvcywgc3RhcnRQb3N9OiB7cG9zOiBbbnVtYmVyLCBudW1iZXJdOyBzdGFydFBvcz86IFtudW1iZXIsIG51bWJlcl19KSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZFN0YXJ0ID0gKHRoaXMgYXMgYW55KS5nZXRTdGF0ZSgpLnN0YXJ0UGFuTG5nTGF0O1xuXG4gICAgICAgIGNvbnN0IHByb3BzID0gKHRoaXMgYXMgYW55KS5nZXRWaWV3cG9ydFByb3BzKCk7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gKHRoaXMgYXMgYW55KS5tYWtlVmlld3BvcnQocHJvcHMpO1xuXG4gICAgICAgIC8vIGBmYWxzZWAgbWVhbnMgdGhlIGRyYWcgc3RhcnRlZCBvdXRzaWRlIHRoZSBnbG9iZS4gSWYgdGhlIGN1cnNvciBoYXNcbiAgICAgICAgLy8gbm93IG1vdmVkIG9udG8gdGhlIGdsb2JlLCBsYXRjaCB0aGUgY3VycmVudCBwb3NpdGlvbiBhcyB0aGUgYW5jaG9yXG4gICAgICAgIC8vIHNvIHJvdGF0aW9uIGJlZ2lucyBmcm9tIHRoZSBlbnRyeSBwb2ludC4gT3RoZXJ3aXNlIHN0YXkgZnJvemVuLlxuICAgICAgICBpZiAoc3RvcmVkU3RhcnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaWYgKCFpc1BpeGVsT25HbG9iZSh2aWV3cG9ydCwgcG9zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEN1cnNvciBqdXN0IGVudGVyZWQgdGhlIGdsb2JlIOKAlCBlc3RhYmxpc2ggdGhlIGFuY2hvciBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gd2l0aG91dCBtb3Zpbmc7IHRoZSBuZXh0IHBhbiBldmVudCB3aWxsIGFwcGx5IHRoZSBmaXJzdCBkZWx0YS5cbiAgICAgICAgICByZXR1cm4gKHRoaXMgYXMgYW55KS5fZ2V0VXBkYXRlZFN0YXRlKHtcbiAgICAgICAgICAgIHN0YXJ0UGFuTG5nTGF0OiAodGhpcyBhcyBhbnkpLl91bnByb2plY3QocG9zKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhcnRQYW5MbmdMYXQgPSBzdG9yZWRTdGFydCB8fCAodGhpcyBhcyBhbnkpLl91bnByb2plY3Qoc3RhcnRQb3MpO1xuICAgICAgICBpZiAoIXN0YXJ0UGFuTG5nTGF0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmNlIHRoZSBjdXJzb3IgbGVhdmVzIHRoZSBnbG9iZSBzaWxob3VldHRlIG1pZC1kcmFnLCBmcmVlemUgdGhlIHZpZXcuXG4gICAgICAgIC8vIHZpZXdwb3J0LnVucHJvamVjdCgpIHNuYXBzIG9mZi1nbG9iZSBwaXhlbHMgdG8gdGhlIG5lYXJlc3QgbGltYiBwb2ludFxuICAgICAgICAvLyAodmlhIE1hdGgubWF4KDAsIOKApikgaW4gaXRzIHJheeKAk3NwaGVyZSBkaXNjcmltaW5hbnQpLCBzbyB3aXRob3V0IHRoaXNcbiAgICAgICAgLy8gZ3VhcmQgdGhlIGdsb2JlIHdvdWxkIGtlZXAgcm90YXRpbmcgdG93YXJkIHRoZSBlZGdlIGFzIHRoZSBjdXJzb3IgbW92ZXNcbiAgICAgICAgLy8gZnVydGhlciBvdXRzaWRlLlxuICAgICAgICBpZiAoIWlzUGl4ZWxPbkdsb2JlKHZpZXdwb3J0LCBwb3MpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmcm9tUG9zaXRpb24gPSB2aWV3cG9ydC51bnByb2plY3QocG9zKTtcblxuICAgICAgICBjb25zdCBsb25naXR1ZGUgPSBzdGFydFBhbkxuZ0xhdFswXSAtIGZyb21Qb3NpdGlvblswXSArIHByb3BzLmxvbmdpdHVkZTtcbiAgICAgICAgbGV0IGxhdGl0dWRlID0gc3RhcnRQYW5MbmdMYXRbMV0gLSBmcm9tUG9zaXRpb25bMV0gKyBwcm9wcy5sYXRpdHVkZTtcbiAgICAgICAgbGF0aXR1ZGUgPSBjbGFtcChsYXRpdHVkZSwgLUdMT0JFX01BWF9MQVRJVFVERSwgR0xPQkVfTUFYX0xBVElUVURFKTtcblxuICAgICAgICAvLyBkZWNrLmdsIDkncyBHbG9iZVZpZXdwb3J0IHNjYWxlID0gMl4oem9vbSAtIHpvb21BZGp1c3QobGF0aXR1ZGUpKSwgc28gYVxuICAgICAgICAvLyBjb25zdGFudCB6b29tIHdvdWxkIG1ha2UgdGhlIGdsb2JlIGdyb3cgb24gc2NyZWVuIGFzIHRoZSBjZW50ZXIgbW92ZXNcbiAgICAgICAgLy8gdG93YXJkIHRoZSBwb2xlcy4gUmUtY291cGxlIHpvb20gdG8gdGhlIG5ldyBsYXRpdHVkZSAoYXMgZGVjay5nbCA5J3Mgb3duXG4gICAgICAgIC8vIHBhbiBkb2VzKSB0byBrZWVwIHRoZSBvbi1zY3JlZW4gc2NhbGUg4oCUIGFuZCB0aHVzIHRpbGUgTE9EIOKAlCBjb25zdGFudC5cbiAgICAgICAgY29uc3QgdmlzdWFsWm9vbSA9IHByb3BzLnpvb20gLSB6b29tQWRqdXN0KHByb3BzLmxhdGl0dWRlKTtcbiAgICAgICAgY29uc3Qgem9vbSA9IHZpc3VhbFpvb20gKyB6b29tQWRqdXN0KGxhdGl0dWRlKTtcblxuICAgICAgICByZXR1cm4gKHRoaXMgYXMgYW55KS5fZ2V0VXBkYXRlZFN0YXRlKHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSk7XG4gICAgICB9XG5cbiAgICAgIHBhbkVuZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzIGFzIGFueSkuX2dldFVwZGF0ZWRTdGF0ZSh7c3RhcnRQYW5MbmdMYXQ6IG51bGx9KTtcbiAgICAgIH1cbiAgICB9IGFzIGFueTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBHbG9iZVZpZXcgdGhhdCB1c2VzIHpvb20tdG8tY3Vyc29yIGNvbnRyb2xsZXIgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXBsZXJHbG9iZVZpZXcgZXh0ZW5kcyBEZWNrR2xvYmVWaWV3IHtcbiAgLy8gRm9yd2FyZCBjb25zdHJ1Y3RvciBwcm9wcyB0byBkZWNrLmdsJ3MgR2xvYmVWaWV3LiBEZWNsYXJlZCBleHBsaWNpdGx5IGJlY2F1c2VcbiAgLy8gdGhlIGJhc2UgY2xhc3MgaXMgbG9vc2VseSB0eXBlZCAoc2VlIERlY2tHbG9iZVZpZXcgYWJvdmUpLCB3aGljaCB3b3VsZFxuICAvLyBvdGhlcndpc2Ugc3VyZmFjZSBhIHBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IgdG8gY2FsbGVycy5cbiAgY29uc3RydWN0b3IocHJvcHM/OiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cblxuICBnZXQgQ29udHJvbGxlclR5cGUoKSB7XG4gICAgcmV0dXJuIFpvb21Ub0N1cnNvckdsb2JlQ29udHJvbGxlcjtcbiAgfVxuXG4gIC8vIGRlY2suZ2wgOSdzIEdsb2JlVmlldy5nZXRWaWV3cG9ydFR5cGUoKSBzd2FwcyB0aGUgdmlld3BvcnQgY2xhc3MgYmFzZWQgb24gem9vbTpcbiAgLy8gICBgcmV0dXJuIHZpZXdTdGF0ZS56b29tID4gMTIgPyBXZWJNZXJjYXRvclZpZXdwb3J0IDogR2xvYmVWaWV3cG9ydDtgXG4gIC8vIENyb3NzaW5nIHpvb20gMTIgdGhlcmVmb3JlIHJlY29tcHV0ZXMgdGlsZSBib3VuZHMgd2l0aCBjb21wbGV0ZWx5IGRpZmZlcmVudFxuICAvLyBwcm9qZWN0aW9uIG1hdGggKGdsb2JlIHZzIGZsYXQgbWVyY2F0b3IpLiBUaGF0IG1ha2VzIGRlY2sncyBUaWxlTGF5ZXIvTVZUTGF5ZXJcbiAgLy8gcmVzZWxlY3QgdGlsZXMgaW5jb25zaXN0ZW50bHkgYWNyb3NzIHRoZSBib3VuZGFyeSDigJQgbWl4ZWQgTE9EcyAoZS5nLiBhIHo0IHRpbGVcbiAgLy8gbmV4dCB0byB6MTEpLCBhIHZpc2libGUgXCJmbGlja2VyXCIgYXQgMTIsIGFuZCB0aWxlcyB0aGF0IGdldCBkcm9wcGVkIGFuZCBzdGlja1xuICAvLyBhcyBibGFjay9lbXB0eSBxdWFkcyAobW9zdCBvZnRlbiBjcm9zc2luZyAxMiBvbiB0aGUgd2F5ICpvdXQqKS5cbiAgLy9cbiAgLy8gRm9yY2UgR2xvYmVWaWV3cG9ydCBhdCBldmVyeSB6b29tIHRvIGVsaW1pbmF0ZSB0aGUgej0xMiB2aWV3cG9ydCBzd2FwIHNvIHRpbGVcbiAgLy8gc2VsZWN0aW9uIHN0YXlzIGNvbnNpc3RlbnQuIFRoZSB0cmFkZS1vZmYgaXMgdGhhdCB6b29tID4gMTIgbm93IHVzZXMgZmxvYXQzMlxuICAvLyBnbG9iZSBwcmVjaXNpb24gKGRlY2sncyBkb2N1bWVudGVkIFwibm8gaGlnaC1wcmVjaXNpb24gcmVuZGVyaW5nID4gMTJcIiBsaW1pdClcbiAgLy8gaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gbWVyY2F0b3Ig4oCUIGZhciBwcmVmZXJhYmxlIHRvIHRoZSBibGFjayBxdWFkcy5cbiAgZ2V0Vmlld3BvcnRUeXBlKCkge1xuICAgIHJldHVybiBEZWNrR2xvYmVWaWV3cG9ydDtcbiAgfVxufVxuXG5LZXBsZXJHbG9iZVZpZXcuZGlzcGxheU5hbWUgPSAnS2VwbGVyR2xvYmVWaWV3JztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFFBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLG9CQUFBLEdBQUFILE9BQUE7QUFBNkQsU0FBQUQsd0JBQUFLLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFQLHVCQUFBLFlBQUFBLHdCQUFBSyxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsbUJBQUFULENBQUEsaUJBQUFBLENBQUEsZ0JBQUFVLE9BQUEsQ0FBQVYsQ0FBQSwwQkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxH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a0QsNkJBQWtCLEVBQUVBLDZCQUFrQixDQUFDOztVQUVuRTtVQUNBO1VBQ0E7VUFDQTtVQUNBLElBQU0yQyxVQUFVLEdBQUcvQyxLQUFLLENBQUNLLElBQUksR0FBR3BELFVBQVUsQ0FBQytDLEtBQUssQ0FBQzlDLFFBQVEsQ0FBQztVQUMxRCxJQUFNbUQsSUFBSSxHQUFHMEMsVUFBVSxHQUFHOUYsVUFBVSxDQUFDQyxRQUFRLENBQUM7VUFFOUMsT0FBUSxJQUFJLENBQVMyRSxnQkFBZ0IsQ0FBQztZQUFDTyxTQUFTLEVBQVRBLFNBQVM7WUFBRWxGLFFBQVEsRUFBUkEsUUFBUTtZQUFFbUQsSUFBSSxFQUFKQTtVQUFJLENBQUMsQ0FBQztRQUNwRTtNQUFDO1FBQUFSLEdBQUE7UUFBQUMsS0FBQSxFQUVELFNBQUFrRCxNQUFNQSxDQUFBLEVBQUc7VUFDUCxPQUFRLElBQUksQ0FBU25CLGdCQUFnQixDQUFDO1lBQUNjLGNBQWMsRUFBRTtVQUFJLENBQUMsQ0FBQztRQUMvRDtNQUFDO0lBQUEsRUFqT29EckQsa0JBQWtCLENBa09qRTtJQUFDLE9BQUFQLEtBQUE7RUFDWDtFQUFDLElBQUFZLFVBQUEsYUFBQWIsMkJBQUEsRUFBQWhDLGdCQUFBO0VBQUEsV0FBQThDLGFBQUEsYUFBQWQsMkJBQUE7QUFBQSxFQW5QdUNqQyxlQUFlO0FBc1B6RDtBQUNBO0FBQ0E7QUFGQSxJQUdhb0csZUFBZSxHQUFBQyxPQUFBLENBQUFELGVBQUEsMEJBQUFFLGNBQUE7RUFDMUI7RUFDQTtFQUNBO0VBQ0EsU0FBQUYsZ0JBQVlqRCxLQUFXLEVBQUU7SUFBQSxJQUFBaEIsZ0JBQUEsbUJBQUFpRSxlQUFBO0lBQUEsT0FBQTlHLFVBQUEsT0FBQThHLGVBQUEsR0FDakJqRCxLQUFLO0VBQ2I7RUFBQyxJQUFBTCxVQUFBLGFBQUFzRCxlQUFBLEVBQUFFLGNBQUE7RUFBQSxXQUFBdkQsYUFBQSxhQUFBcUQsZUFBQTtJQUFBcEQsR0FBQTtJQUFBckYsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBcUI7TUFDbkIsT0FBT3NFLDJCQUEyQjtJQUNwQzs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7RUFBQTtJQUFBZSxHQUFBO0lBQUFDLEtBQUEsRUFDQSxTQUFBc0QsZUFBZUEsQ0FBQSxFQUFHO01BQ2hCLE9BQU9yRyxpQkFBaUI7SUFDMUI7RUFBQztBQUFBLEVBMUJrQ0osYUFBYTtBQTZCbERzRyxlQUFlLENBQUNJLFdBQVcsR0FBRyxpQkFBaUIiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -4,6 +4,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ Object.defineProperty(exports, "AtmosphereHugeHaloLayer", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _atmosphereLayer.AtmosphereHugeHaloLayer;
11
+ }
12
+ });
7
13
  Object.defineProperty(exports, "AtmosphereLayerRealistic", {
8
14
  enumerable: true,
9
15
  get: function get() {
@@ -46,6 +52,12 @@ Object.defineProperty(exports, "MVTLabelLayer", {
46
52
  return _mvtLabelLayer.MVTLabelLayer;
47
53
  }
48
54
  });
55
+ Object.defineProperty(exports, "drawStarsBackground", {
56
+ enumerable: true,
57
+ get: function get() {
58
+ return _globeStarsLayer.drawStarsBackground;
59
+ }
60
+ });
49
61
  Object.defineProperty(exports, "getBasemapColors", {
50
62
  enumerable: true,
51
63
  get: function get() {
@@ -94,6 +106,12 @@ Object.defineProperty(exports, "getGlobeDepthDiskLayer", {
94
106
  return _globeDepthDiskLayer.getGlobeDepthDiskLayer;
95
107
  }
96
108
  });
109
+ Object.defineProperty(exports, "getGlobeHugeHaloLayer", {
110
+ enumerable: true,
111
+ get: function get() {
112
+ return _atmosphereLayer.getGlobeHugeHaloLayer;
113
+ }
114
+ });
97
115
  Object.defineProperty(exports, "getGlobeTopLayers", {
98
116
  enumerable: true,
99
117
  get: function get() {
@@ -119,4 +137,4 @@ var _mvtLabelLayer = require("./mvt-label-layer");
119
137
  var _enhancedMultiIconLayer = _interopRequireDefault(require("./enhanced-multi-icon-layer"));
120
138
  var _globeView = require("./globe-view");
121
139
  var _globeStarsLayer = require("./globe-stars-layer");
122
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXRtb3NwaGVyZUxheWVyIiwicmVxdWlyZSIsIl9nbG9iZURlcHRoRGlza0xheWVyIiwiX2dsb2JlTGF5ZXJzIiwiX212dExhYmVsTGF5ZXIiLCJfZW5oYW5jZWRNdWx0aUljb25MYXllciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZ2xvYmVWaWV3IiwiX2dsb2JlU3RhcnNMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nbG9iZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBHbG9iZSBtb2RlIGxheWVyIGFkanVzdG1lbnRzLlxuLy9cbi8vIEdsb2JlLXNwZWNpZmljIGFkanVzdG1lbnRzIGhhbmRsZWQgaGVyZTpcbi8vIC0gR3JpZCAvIEhleGFnb24gYWdncmVnYXRpb24gY2VsbHMgb24gdGhlIGdsb2JlOiBkZWNrLmdsIDkueCdzIEdyaWRDZWxsTGF5ZXIgL1xuLy8gICBIZXhhZ29uQ2VsbExheWVyIHBvc2l0aW9uIGNlbGxzIGluIGZsYXQgbWVyY2F0b3IgY29tbW9uIHNwYWNlIGFuZCBkcmF3IHRoZW0gd2l0aFxuLy8gICBwcm9qZWN0X2NvbW1vbl9wb3NpdGlvbl90b19jbGlwc3BhY2UsIHdoaWNoIGxlYXZlcyB0aGVtIG9uIHRoZSBYWSBwbGFuZSB0aHJvdWdoIHRoZVxuLy8gICBnbG9iZSBjZW50ZXIgcmF0aGVyIHRoYW4gb24gaXRzIHN1cmZhY2UuIFNjYWxlRW5oYW5jZWRHcmlkTGF5ZXIgL1xuLy8gICBTY2FsZUVuaGFuY2VkSGV4YWdvbkxheWVyIHN3YXAgaW4gYSBnbG9iZS1hd2FyZSBjZWxsIHN1YmNsYXNzIChzZWVcbi8vICAgbGF5ZXItdXRpbHMvZ2xvYmUtY2VsbC11dGlscykgdGhhdCByZW1hcHMgZWFjaCBjZWxsIHZlcnRleCBmcm9tIGNvbW1vbiBzcGFjZSBiYWNrIHRvXG4vLyAgIGxuZy9sYXQgYW5kIG9udG8gdGhlIHNwaGVyZS5cbi8vIC0gVGV4dC9MYWJlbCByZW5kZXJpbmcgd2l0aCBiYWNrLWZhY2UgY3VsbGluZzogTVZUTGFiZWxMYXllciByZW5kZXJzIHBsYWNlIGxhYmVscyB2aWEgYVxuLy8gICBUZXh0TGF5ZXIgd2hvc2UgZ2x5cGggc3VibGF5ZXIgaXMgRW5oYW5jZWRNdWx0aUljb25MYXllciwgd2hpY2ggZGVnZW5lcmF0ZXMgZ2x5cGhcbi8vICAgdmVydGljZXMgb24gdGhlIGZhciBzaWRlIG9mIHRoZSBnbG9iZSAoZG90KHN1cmZhY2VOb3JtYWwsIHRvQ2FtZXJhKSA8IDAuMSkgc28gbGFiZWxzXG4vLyAgIGRvbid0IHNob3cgdGhyb3VnaCB0aGUgcGxhbmV0LiBJbXBsZW1lbnRlZCBhcyBhIEdMU0wgaW5qZWN0LlxuXG5leHBvcnQge1xuICBBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMsXG4gIEF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyxcbiAgZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIsXG4gIGdldEdsb2JlQXRtb3NwaGVyZVNreUxheWVyXG59IGZyb20gJy4vYXRtb3NwaGVyZS1sYXllcic7XG5leHBvcnQge0dsb2JlRGVwdGhEaXNrTGF5ZXIsIGdldEdsb2JlRGVwdGhEaXNrTGF5ZXJ9IGZyb20gJy4vZ2xvYmUtZGVwdGgtZGlzay1sYXllcic7XG5leHBvcnQge1xuICBnZXRHbG9iZUJhc2VMYXllcnMsXG4gIGdldEdsb2JlVG9wTGF5ZXJzLFxuICBnZXRHbG9iZUNsZWFyQ29sb3IsXG4gIGdldEdsb2JlQmFzZW1hcEF0dHJpYnV0aW9ucyxcbiAgcmVzb2x2ZUdsb2JlQmFzZW1hcFByb3ZpZGVyLFxuICBERUZBVUxUX0JBU0VNQVBfQ09MT1IsXG4gIGdldEJhc2VtYXBDb2xvcnMsXG4gIGdldEJhc2VtYXBDb2xvcnNGb3JTdHlsZVxufSBmcm9tICcuL2dsb2JlLWxheWVycyc7XG5leHBvcnQgdHlwZSB7R2xvYmVCYXNlbWFwUHJvdmlkZXIsIEdsb2JlQXR0cmlidXRpb259IGZyb20gJy4vZ2xvYmUtbGF5ZXJzJztcbmV4cG9ydCB7TVZUTGFiZWxMYXllcn0gZnJvbSAnLi9tdnQtbGFiZWwtbGF5ZXInO1xuZXhwb3J0IHtkZWZhdWx0IGFzIEVuaGFuY2VkTXVsdGlJY29uTGF5ZXJ9IGZyb20gJy4vZW5oYW5jZWQtbXVsdGktaWNvbi1sYXllcic7XG5leHBvcnQge0tlcGxlckdsb2JlVmlld30gZnJvbSAnLi9nbG9iZS12aWV3JztcbmV4cG9ydCB7Z2V0U3RhcnNCYWNrZ3JvdW5kSW1hZ2V9IGZyb20gJy4vZ2xvYmUtc3RhcnMtbGF5ZXInO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsSUFBQUEsZ0JBQUEsR0FBQUMsT0FBQTtBQU1BLElBQUFDLG9CQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFXQSxJQUFBRyxjQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQVAsT0FBQSIsImlnbm9yZUxpc3QiOltdfQ==
140
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXRtb3NwaGVyZUxheWVyIiwicmVxdWlyZSIsIl9nbG9iZURlcHRoRGlza0xheWVyIiwiX2dsb2JlTGF5ZXJzIiwiX212dExhYmVsTGF5ZXIiLCJfZW5oYW5jZWRNdWx0aUljb25MYXllciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZ2xvYmVWaWV3IiwiX2dsb2JlU3RhcnNMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nbG9iZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBHbG9iZSBtb2RlIGxheWVyIGFkanVzdG1lbnRzLlxuLy9cbi8vIEdsb2JlLXNwZWNpZmljIGFkanVzdG1lbnRzIGhhbmRsZWQgaGVyZTpcbi8vIC0gR3JpZCAvIEhleGFnb24gYWdncmVnYXRpb24gY2VsbHMgb24gdGhlIGdsb2JlOiBkZWNrLmdsIDkueCdzIEdyaWRDZWxsTGF5ZXIgL1xuLy8gICBIZXhhZ29uQ2VsbExheWVyIHBvc2l0aW9uIGNlbGxzIGluIGZsYXQgbWVyY2F0b3IgY29tbW9uIHNwYWNlIGFuZCBkcmF3IHRoZW0gd2l0aFxuLy8gICBwcm9qZWN0X2NvbW1vbl9wb3NpdGlvbl90b19jbGlwc3BhY2UsIHdoaWNoIGxlYXZlcyB0aGVtIG9uIHRoZSBYWSBwbGFuZSB0aHJvdWdoIHRoZVxuLy8gICBnbG9iZSBjZW50ZXIgcmF0aGVyIHRoYW4gb24gaXRzIHN1cmZhY2UuIFNjYWxlRW5oYW5jZWRHcmlkTGF5ZXIgL1xuLy8gICBTY2FsZUVuaGFuY2VkSGV4YWdvbkxheWVyIHN3YXAgaW4gYSBnbG9iZS1hd2FyZSBjZWxsIHN1YmNsYXNzIChzZWVcbi8vICAgbGF5ZXItdXRpbHMvZ2xvYmUtY2VsbC11dGlscykgdGhhdCByZW1hcHMgZWFjaCBjZWxsIHZlcnRleCBmcm9tIGNvbW1vbiBzcGFjZSBiYWNrIHRvXG4vLyAgIGxuZy9sYXQgYW5kIG9udG8gdGhlIHNwaGVyZS5cbi8vIC0gVGV4dC9MYWJlbCByZW5kZXJpbmcgd2l0aCBiYWNrLWZhY2UgY3VsbGluZzogTVZUTGFiZWxMYXllciByZW5kZXJzIHBsYWNlIGxhYmVscyB2aWEgYVxuLy8gICBUZXh0TGF5ZXIgd2hvc2UgZ2x5cGggc3VibGF5ZXIgaXMgRW5oYW5jZWRNdWx0aUljb25MYXllciwgd2hpY2ggZGVnZW5lcmF0ZXMgZ2x5cGhcbi8vICAgdmVydGljZXMgb24gdGhlIGZhciBzaWRlIG9mIHRoZSBnbG9iZSAoZG90KHN1cmZhY2VOb3JtYWwsIHRvQ2FtZXJhKSA8IDAuMSkgc28gbGFiZWxzXG4vLyAgIGRvbid0IHNob3cgdGhyb3VnaCB0aGUgcGxhbmV0LiBJbXBsZW1lbnRlZCBhcyBhIEdMU0wgaW5qZWN0LlxuXG5leHBvcnQge1xuICBBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMsXG4gIEF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyxcbiAgQXRtb3NwaGVyZUh1Z2VIYWxvTGF5ZXIsXG4gIGdldEdsb2JlQXRtb3NwaGVyZUxheWVyLFxuICBnZXRHbG9iZUF0bW9zcGhlcmVTa3lMYXllcixcbiAgZ2V0R2xvYmVIdWdlSGFsb0xheWVyXG59IGZyb20gJy4vYXRtb3NwaGVyZS1sYXllcic7XG5leHBvcnQge0dsb2JlRGVwdGhEaXNrTGF5ZXIsIGdldEdsb2JlRGVwdGhEaXNrTGF5ZXJ9IGZyb20gJy4vZ2xvYmUtZGVwdGgtZGlzay1sYXllcic7XG5leHBvcnQge1xuICBnZXRHbG9iZUJhc2VMYXllcnMsXG4gIGdldEdsb2JlVG9wTGF5ZXJzLFxuICBnZXRHbG9iZUNsZWFyQ29sb3IsXG4gIGdldEdsb2JlQmFzZW1hcEF0dHJpYnV0aW9ucyxcbiAgcmVzb2x2ZUdsb2JlQmFzZW1hcFByb3ZpZGVyLFxuICBERUZBVUxUX0JBU0VNQVBfQ09MT1IsXG4gIGdldEJhc2VtYXBDb2xvcnMsXG4gIGdldEJhc2VtYXBDb2xvcnNGb3JTdHlsZVxufSBmcm9tICcuL2dsb2JlLWxheWVycyc7XG5leHBvcnQgdHlwZSB7R2xvYmVCYXNlbWFwUHJvdmlkZXIsIEdsb2JlQXR0cmlidXRpb259IGZyb20gJy4vZ2xvYmUtbGF5ZXJzJztcbmV4cG9ydCB7TVZUTGFiZWxMYXllcn0gZnJvbSAnLi9tdnQtbGFiZWwtbGF5ZXInO1xuZXhwb3J0IHtkZWZhdWx0IGFzIEVuaGFuY2VkTXVsdGlJY29uTGF5ZXJ9IGZyb20gJy4vZW5oYW5jZWQtbXVsdGktaWNvbi1sYXllcic7XG5leHBvcnQge0tlcGxlckdsb2JlVmlld30gZnJvbSAnLi9nbG9iZS12aWV3JztcbmV4cG9ydCB7Z2V0U3RhcnNCYWNrZ3JvdW5kSW1hZ2UsIGRyYXdTdGFyc0JhY2tncm91bmR9IGZyb20gJy4vZ2xvYmUtc3RhcnMtbGF5ZXInO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsSUFBQUEsZ0JBQUEsR0FBQUMsT0FBQTtBQVFBLElBQUFDLG9CQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFXQSxJQUFBRyxjQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQVAsT0FBQSIsImlnbm9yZUxpc3QiOltdfQ==