@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.20

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 (73) hide show
  1. package/dist/cjs/commands/add-column-command.js +192 -0
  2. package/dist/cjs/commands/basemap-command.js +80 -0
  3. package/dist/cjs/commands/boundary-command.js +81 -0
  4. package/dist/cjs/commands/command-wrappers.js +122 -0
  5. package/dist/cjs/commands/dataset-context-command.js +87 -0
  6. package/dist/cjs/commands/index.js +230 -0
  7. package/dist/cjs/commands/layer-creation-command.js +534 -0
  8. package/dist/cjs/commands/layer-style-command.js +136 -0
  9. package/dist/cjs/commands/load-data-command.js +270 -0
  10. package/dist/cjs/commands/save-data-command.js +118 -0
  11. package/dist/cjs/commands/split-view-command.js +261 -0
  12. package/dist/cjs/commands/table-command.js +199 -0
  13. package/dist/cjs/commands/time-filter-command.js +289 -0
  14. package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
  15. package/dist/cjs/commands/types.js +6 -0
  16. package/dist/cjs/commands/utils.js +536 -0
  17. package/dist/cjs/commands/view-mode-command.js +94 -0
  18. package/dist/cjs/index.js +39 -0
  19. package/dist/cjs/map-contract.js +6 -0
  20. package/dist/cjs/server/bridge-server.js +435 -0
  21. package/dist/cjs/server/index.js +31 -0
  22. package/dist/cjs/server/stdio.js +201 -0
  23. package/dist/cjs/types.js +30 -0
  24. package/dist/commands/add-column-command.d.ts +4 -0
  25. package/dist/commands/basemap-command.d.ts +4 -0
  26. package/dist/commands/boundary-command.d.ts +4 -0
  27. package/dist/commands/command-wrappers.d.ts +52 -0
  28. package/dist/commands/dataset-context-command.d.ts +4 -0
  29. package/dist/commands/index.d.ts +31 -0
  30. package/dist/commands/layer-creation-command.d.ts +8 -0
  31. package/dist/commands/layer-style-command.d.ts +4 -0
  32. package/dist/commands/load-data-command.d.ts +4 -0
  33. package/dist/commands/save-data-command.d.ts +4 -0
  34. package/dist/commands/split-view-command.d.ts +4 -0
  35. package/dist/commands/table-command.d.ts +4 -0
  36. package/dist/commands/time-filter-command.d.ts +13 -0
  37. package/dist/commands/toggle-time-filter-command.d.ts +4 -0
  38. package/dist/commands/types.d.ts +132 -0
  39. package/dist/commands/utils.d.ts +138 -0
  40. package/dist/commands/view-mode-command.d.ts +4 -0
  41. package/dist/esm/commands/add-column-command.js +185 -0
  42. package/dist/esm/commands/basemap-command.js +72 -0
  43. package/dist/esm/commands/boundary-command.js +73 -0
  44. package/dist/esm/commands/command-wrappers.js +114 -0
  45. package/dist/esm/commands/dataset-context-command.js +79 -0
  46. package/dist/esm/commands/index.js +51 -0
  47. package/dist/esm/commands/layer-creation-command.js +527 -0
  48. package/dist/esm/commands/layer-style-command.js +130 -0
  49. package/dist/esm/commands/load-data-command.js +264 -0
  50. package/dist/esm/commands/save-data-command.js +112 -0
  51. package/dist/esm/commands/split-view-command.js +255 -0
  52. package/dist/esm/commands/table-command.js +194 -0
  53. package/dist/esm/commands/time-filter-command.js +280 -0
  54. package/dist/esm/commands/toggle-time-filter-command.js +147 -0
  55. package/dist/esm/commands/types.js +3 -0
  56. package/dist/esm/commands/utils.js +521 -0
  57. package/dist/esm/commands/view-mode-command.js +86 -0
  58. package/dist/esm/index.js +20 -0
  59. package/dist/esm/map-contract.js +3 -0
  60. package/dist/esm/server/bridge-server.js +428 -0
  61. package/dist/esm/server/index.js +13 -0
  62. package/dist/esm/server/stdio.js +198 -0
  63. package/dist/esm/types.js +24 -0
  64. package/dist/index.d.ts +15 -0
  65. package/dist/map-contract.d.ts +31 -0
  66. package/dist/server/bridge-server.d.ts +53 -0
  67. package/dist/server/index.d.ts +9 -0
  68. package/dist/server/stdio.d.ts +2 -0
  69. package/dist/types.d.ts +24 -0
  70. package/package.json +84 -4
  71. package/skill/kepler/SKILL.md +438 -0
  72. package/skill/kepler/skill.yaml +4 -0
  73. package/README.md +0 -3
@@ -0,0 +1,255 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
5
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
6
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7
+ // SPDX-License-Identifier: MIT
8
+ // Copyright contributors to the kepler.gl project
9
+
10
+ import { z } from 'zod';
11
+ import { toggleSplitMap, toggleLayerForMap } from '@kepler.gl/actions';
12
+ var sleep = function sleep(ms) {
13
+ return new Promise(function (resolve) {
14
+ return setTimeout(resolve, ms);
15
+ });
16
+ };
17
+ export var splitViewCommandId = 'map.split-view';
18
+ export function getSplitViewCommand(ctx) {
19
+ return {
20
+ id: splitViewCommandId,
21
+ name: 'Toggle split map view',
22
+ group: 'Map',
23
+ description: "Enable or disable the dual-map (split view) comparison mode.\n\nWhen enabled, the map splits into two panels for side-by-side comparison. Pass layerIdsForMap0 / layerIdsForMap1 to assign which layers show ONLY in the left / right panel; without these, all layers show on both panels (no comparison).\n\nWhen disabled, the map returns to a single panel.\n\nUse the SAME colorBy / colorType for the layers being compared, so the comparison is fair.",
24
+ metadata: {
25
+ readOnly: false,
26
+ riskLevel: 'low',
27
+ idempotent: true
28
+ },
29
+ inputSchema: z.object({
30
+ action: z["enum"](['enable', 'disable']).describe('"enable" activates dual map mode; "disable" returns to a single map.'),
31
+ layerIdsForMap0: z.array(z.string()).optional().describe('Layer IDs to show ONLY in the LEFT panel. Layers not listed are hidden from the left panel.'),
32
+ layerIdsForMap1: z.array(z.string()).optional().describe('Layer IDs to show ONLY in the RIGHT panel. Layers not listed are hidden from the right panel.')
33
+ }),
34
+ execute: function () {
35
+ var _execute = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_execCtx, input) {
36
+ var _ref, action, layerIdsForMap0, layerIdsForMap1, _iterator, _step, _step$value, name, _ids, visState, isSplit, hasLayerAssignment, updatedVis, splitMaps, allLayers, allLayerIds, allLayerIdSet, _iterator2, _step2, _step2$value, panel, ids, unknown, _splitMaps$, map0Layers, desiredSet0, _iterator3, _step3, layerId, isVisible, shouldBeVisible, _freshSplitMaps$, freshSplitMaps, map1Layers, desiredSet1, _iterator4, _step4, _layerId, _isVisible, _shouldBeVisible, finalVis, layers;
37
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
38
+ while (1) switch (_context.prev = _context.next) {
39
+ case 0:
40
+ _ref = input !== null && input !== void 0 ? input : {}, action = _ref.action, layerIdsForMap0 = _ref.layerIdsForMap0, layerIdsForMap1 = _ref.layerIdsForMap1;
41
+ _context.prev = 1;
42
+ if (!(action !== 'enable' && action !== 'disable')) {
43
+ _context.next = 4;
44
+ break;
45
+ }
46
+ return _context.abrupt("return", {
47
+ success: false,
48
+ commandId: splitViewCommandId,
49
+ error: "Invalid action \"".concat(String(action), "\". Must be \"enable\" or \"disable\"."),
50
+ data: {
51
+ instruction: 'Pass action: "enable" to activate dual map mode, or "disable" to return to a single map.'
52
+ }
53
+ });
54
+ case 4:
55
+ // Runtime guard: the bridge/webMCP call execute without zod parsing, so
56
+ // a string/object passed as layerIdsForMap0/1 must not be treated as
57
+ // iterable (`.length`, `.filter`) and produce surprising layer toggles.
58
+ // Reject non-array or non-string entries when these fields are provided.
59
+ _iterator = _createForOfIteratorHelper([['layerIdsForMap0', layerIdsForMap0], ['layerIdsForMap1', layerIdsForMap1]]);
60
+ _context.prev = 5;
61
+ _iterator.s();
62
+ case 7:
63
+ if ((_step = _iterator.n()).done) {
64
+ _context.next = 13;
65
+ break;
66
+ }
67
+ _step$value = _slicedToArray(_step.value, 2), name = _step$value[0], _ids = _step$value[1];
68
+ if (!(_ids !== undefined && (!Array.isArray(_ids) || _ids.some(function (id) {
69
+ return typeof id !== 'string' || id.length === 0;
70
+ })))) {
71
+ _context.next = 11;
72
+ break;
73
+ }
74
+ return _context.abrupt("return", {
75
+ success: false,
76
+ commandId: splitViewCommandId,
77
+ error: "Invalid ".concat(name, ". Must be an array of non-empty layer id strings."),
78
+ data: {
79
+ instruction: "Pass ".concat(name, " as an array of layer id strings, or omit it to show all layers on that panel.")
80
+ }
81
+ });
82
+ case 11:
83
+ _context.next = 7;
84
+ break;
85
+ case 13:
86
+ _context.next = 18;
87
+ break;
88
+ case 15:
89
+ _context.prev = 15;
90
+ _context.t0 = _context["catch"](5);
91
+ _iterator.e(_context.t0);
92
+ case 18:
93
+ _context.prev = 18;
94
+ _iterator.f();
95
+ return _context.finish(18);
96
+ case 21:
97
+ visState = ctx.getVisState();
98
+ isSplit = visState.splitMaps && visState.splitMaps.length > 1;
99
+ if (!(action === 'disable')) {
100
+ _context.next = 26;
101
+ break;
102
+ }
103
+ if (isSplit) {
104
+ // Close the RIGHT panel (index 1) so the LEFT panel (map0) survives:
105
+ // `closeSpecificMapAtIndex` keeps `1 - payload`, so closing 0 would
106
+ // keep the right panel and flip layer visibility to map1's config.
107
+ ctx.dispatch(toggleSplitMap(1));
108
+ }
109
+ return _context.abrupt("return", {
110
+ success: true,
111
+ commandId: splitViewCommandId,
112
+ data: {
113
+ details: 'Split map view disabled. Returned to single map view.'
114
+ }
115
+ });
116
+ case 26:
117
+ // enable
118
+ if (!isSplit) {
119
+ ctx.dispatch(toggleSplitMap(0));
120
+ }
121
+ hasLayerAssignment = layerIdsForMap0 && layerIdsForMap0.length > 0 || layerIdsForMap1 && layerIdsForMap1.length > 0;
122
+ if (!hasLayerAssignment) {
123
+ _context.next = 58;
124
+ break;
125
+ }
126
+ _context.next = 31;
127
+ return sleep(200);
128
+ case 31:
129
+ updatedVis = ctx.getVisState();
130
+ splitMaps = updatedVis.splitMaps;
131
+ if (!(splitMaps && splitMaps.length > 1)) {
132
+ _context.next = 58;
133
+ break;
134
+ }
135
+ allLayers = updatedVis.layers || [];
136
+ allLayerIds = allLayers.map(function (l) {
137
+ return l.id;
138
+ }); // Fail fast on unknown layer ids — silently ignoring them would
139
+ // hide every real layer not listed and produce an unexpected blank
140
+ // panel.
141
+ allLayerIdSet = new Set(allLayerIds);
142
+ _iterator2 = _createForOfIteratorHelper([['left (map0)', layerIdsForMap0], ['right (map1)', layerIdsForMap1]]);
143
+ _context.prev = 38;
144
+ _iterator2.s();
145
+ case 40:
146
+ if ((_step2 = _iterator2.n()).done) {
147
+ _context.next = 48;
148
+ break;
149
+ }
150
+ _step2$value = _slicedToArray(_step2.value, 2), panel = _step2$value[0], ids = _step2$value[1];
151
+ if (!(ids && ids.length > 0)) {
152
+ _context.next = 46;
153
+ break;
154
+ }
155
+ unknown = ids.filter(function (id) {
156
+ return !allLayerIdSet.has(id);
157
+ });
158
+ if (!(unknown.length > 0)) {
159
+ _context.next = 46;
160
+ break;
161
+ }
162
+ throw new Error("Unknown layer id(s) for the ".concat(panel, " panel: ").concat(unknown.join(', '), ". ") + "Available layer ids: ".concat(allLayerIds.join(', ')));
163
+ case 46:
164
+ _context.next = 40;
165
+ break;
166
+ case 48:
167
+ _context.next = 53;
168
+ break;
169
+ case 50:
170
+ _context.prev = 50;
171
+ _context.t1 = _context["catch"](38);
172
+ _iterator2.e(_context.t1);
173
+ case 53:
174
+ _context.prev = 53;
175
+ _iterator2.f();
176
+ return _context.finish(53);
177
+ case 56:
178
+ if (layerIdsForMap0 && layerIdsForMap0.length > 0) {
179
+ map0Layers = ((_splitMaps$ = splitMaps[0]) === null || _splitMaps$ === void 0 ? void 0 : _splitMaps$.layers) || {};
180
+ desiredSet0 = new Set(layerIdsForMap0);
181
+ _iterator3 = _createForOfIteratorHelper(allLayerIds);
182
+ try {
183
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
184
+ layerId = _step3.value;
185
+ // Coerce to boolean: a missing entry means "hidden", and
186
+ // `toggleLayerForMapUpdater` toggles missing entries to visible.
187
+ isVisible = Boolean(map0Layers[layerId]);
188
+ shouldBeVisible = desiredSet0.has(layerId);
189
+ if (isVisible !== shouldBeVisible) {
190
+ ctx.dispatch(toggleLayerForMap(0, layerId));
191
+ }
192
+ }
193
+ } catch (err) {
194
+ _iterator3.e(err);
195
+ } finally {
196
+ _iterator3.f();
197
+ }
198
+ }
199
+ if (layerIdsForMap1 && layerIdsForMap1.length > 0) {
200
+ freshSplitMaps = ctx.getVisState().splitMaps;
201
+ map1Layers = (freshSplitMaps === null || freshSplitMaps === void 0 || (_freshSplitMaps$ = freshSplitMaps[1]) === null || _freshSplitMaps$ === void 0 ? void 0 : _freshSplitMaps$.layers) || {};
202
+ desiredSet1 = new Set(layerIdsForMap1);
203
+ _iterator4 = _createForOfIteratorHelper(allLayerIds);
204
+ try {
205
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
206
+ _layerId = _step4.value;
207
+ // Coerce to boolean: a missing entry means "hidden", and
208
+ // `toggleLayerForMapUpdater` toggles missing entries to visible.
209
+ _isVisible = Boolean(map1Layers[_layerId]);
210
+ _shouldBeVisible = desiredSet1.has(_layerId);
211
+ if (_isVisible !== _shouldBeVisible) {
212
+ ctx.dispatch(toggleLayerForMap(1, _layerId));
213
+ }
214
+ }
215
+ } catch (err) {
216
+ _iterator4.e(err);
217
+ } finally {
218
+ _iterator4.f();
219
+ }
220
+ }
221
+ case 58:
222
+ finalVis = ctx.getVisState();
223
+ layers = finalVis.layers || [];
224
+ return _context.abrupt("return", {
225
+ success: true,
226
+ commandId: splitViewCommandId,
227
+ data: {
228
+ details: "Split map view enabled. ".concat(layers.length, " layer(s) available.").concat(hasLayerAssignment ? " Left panel: ".concat((layerIdsForMap0 || []).length, " layer(s), Right panel: ").concat((layerIdsForMap1 || []).length, " layer(s).") : ' All layers visible on both panels. Provide layerIdsForMap0/layerIdsForMap1 to assign layers to each panel.')
229
+ }
230
+ });
231
+ case 63:
232
+ _context.prev = 63;
233
+ _context.t2 = _context["catch"](1);
234
+ return _context.abrupt("return", {
235
+ success: false,
236
+ commandId: splitViewCommandId,
237
+ error: _context.t2 instanceof Error ? _context.t2.message : 'Unknown error',
238
+ data: {
239
+ instruction: 'Check that a map is loaded and layers exist. If the error persists, ask the user to try with different parameters.'
240
+ }
241
+ });
242
+ case 66:
243
+ case "end":
244
+ return _context.stop();
245
+ }
246
+ }, _callee, null, [[1, 63], [5, 15, 18, 21], [38, 50, 53, 56]]);
247
+ }));
248
+ function execute(_x, _x2) {
249
+ return _execute.apply(this, arguments);
250
+ }
251
+ return execute;
252
+ }()
253
+ };
254
+ }
255
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ6IiwidG9nZ2xlU3BsaXRNYXAiLCJ0b2dnbGVMYXllckZvck1hcCIsInNsZWVwIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJzcGxpdFZpZXdDb21tYW5kSWQiLCJnZXRTcGxpdFZpZXdDb21tYW5kIiwiY3R4IiwiaWQiLCJuYW1lIiwiZ3JvdXAiLCJkZXNjcmlwdGlvbiIsIm1ldGFkYXRhIiwicmVhZE9ubHkiLCJyaXNrTGV2ZWwiLCJpZGVtcG90ZW50IiwiaW5wdXRTY2hlbWEiLCJvYmplY3QiLCJhY3Rpb24iLCJkZXNjcmliZSIsImxheWVySWRzRm9yTWFwMCIsImFycmF5Iiwic3RyaW5nIiwib3B0aW9uYWwiLCJsYXllcklkc0Zvck1hcDEiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIl9leGVjQ3R4IiwiaW5wdXQiLCJfcmVmIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJfc3RlcCR2YWx1ZSIsIl9pZHMiLCJ2aXNTdGF0ZSIsImlzU3BsaXQiLCJoYXNMYXllckFzc2lnbm1lbnQiLCJ1cGRhdGVkVmlzIiwic3BsaXRNYXBzIiwiYWxsTGF5ZXJzIiwiYWxsTGF5ZXJJZHMiLCJhbGxMYXllcklkU2V0IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsIl9zdGVwMiR2YWx1ZSIsInBhbmVsIiwiaWRzIiwidW5rbm93biIsIl9zcGxpdE1hcHMkIiwibWFwMExheWVycyIsImRlc2lyZWRTZXQwIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsImxheWVySWQiLCJpc1Zpc2libGUiLCJzaG91bGRCZVZpc2libGUiLCJfZnJlc2hTcGxpdE1hcHMkIiwiZnJlc2hTcGxpdE1hcHMiLCJtYXAxTGF5ZXJzIiwiZGVzaXJlZFNldDEiLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwiX2xheWVySWQiLCJfaXNWaXNpYmxlIiwiX3Nob3VsZEJlVmlzaWJsZSIsImZpbmFsVmlzIiwibGF5ZXJzIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsInN1Y2Nlc3MiLCJjb21tYW5kSWQiLCJlcnJvciIsImNvbmNhdCIsIlN0cmluZyIsImRhdGEiLCJpbnN0cnVjdGlvbiIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJkb25lIiwiX3NsaWNlZFRvQXJyYXkiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIkFycmF5IiwiaXNBcnJheSIsInNvbWUiLCJsZW5ndGgiLCJ0MCIsImUiLCJmIiwiZmluaXNoIiwiZ2V0VmlzU3RhdGUiLCJkaXNwYXRjaCIsImRldGFpbHMiLCJtYXAiLCJsIiwiU2V0IiwiZmlsdGVyIiwiaGFzIiwiRXJyb3IiLCJqb2luIiwidDEiLCJCb29sZWFuIiwiZXJyIiwidDIiLCJtZXNzYWdlIiwic3RvcCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc3BsaXQtdmlldy1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3RvZ2dsZVNwbGl0TWFwLCB0b2dnbGVMYXllckZvck1hcH0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0fSBmcm9tICcuL3R5cGVzJztcblxuY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmV4cG9ydCBjb25zdCBzcGxpdFZpZXdDb21tYW5kSWQgPSAnbWFwLnNwbGl0LXZpZXcnIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXRWaWV3Q29tbWFuZChjdHg6IEtlcGxlckNvbnRleHQpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICBuYW1lOiAnVG9nZ2xlIHNwbGl0IG1hcCB2aWV3JyxcbiAgICBncm91cDogJ01hcCcsXG4gICAgZGVzY3JpcHRpb246IGBFbmFibGUgb3IgZGlzYWJsZSB0aGUgZHVhbC1tYXAgKHNwbGl0IHZpZXcpIGNvbXBhcmlzb24gbW9kZS5cblxuV2hlbiBlbmFibGVkLCB0aGUgbWFwIHNwbGl0cyBpbnRvIHR3byBwYW5lbHMgZm9yIHNpZGUtYnktc2lkZSBjb21wYXJpc29uLiBQYXNzIGxheWVySWRzRm9yTWFwMCAvIGxheWVySWRzRm9yTWFwMSB0byBhc3NpZ24gd2hpY2ggbGF5ZXJzIHNob3cgT05MWSBpbiB0aGUgbGVmdCAvIHJpZ2h0IHBhbmVsOyB3aXRob3V0IHRoZXNlLCBhbGwgbGF5ZXJzIHNob3cgb24gYm90aCBwYW5lbHMgKG5vIGNvbXBhcmlzb24pLlxuXG5XaGVuIGRpc2FibGVkLCB0aGUgbWFwIHJldHVybnMgdG8gYSBzaW5nbGUgcGFuZWwuXG5cblVzZSB0aGUgU0FNRSBjb2xvckJ5IC8gY29sb3JUeXBlIGZvciB0aGUgbGF5ZXJzIGJlaW5nIGNvbXBhcmVkLCBzbyB0aGUgY29tcGFyaXNvbiBpcyBmYWlyLmAsXG4gICAgbWV0YWRhdGE6IHtyZWFkT25seTogZmFsc2UsIHJpc2tMZXZlbDogJ2xvdycsIGlkZW1wb3RlbnQ6IHRydWV9LFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBhY3Rpb246IHpcbiAgICAgICAgLmVudW0oWydlbmFibGUnLCAnZGlzYWJsZSddKVxuICAgICAgICAuZGVzY3JpYmUoJ1wiZW5hYmxlXCIgYWN0aXZhdGVzIGR1YWwgbWFwIG1vZGU7IFwiZGlzYWJsZVwiIHJldHVybnMgdG8gYSBzaW5nbGUgbWFwLicpLFxuICAgICAgbGF5ZXJJZHNGb3JNYXAwOiB6XG4gICAgICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ0xheWVyIElEcyB0byBzaG93IE9OTFkgaW4gdGhlIExFRlQgcGFuZWwuIExheWVycyBub3QgbGlzdGVkIGFyZSBoaWRkZW4gZnJvbSB0aGUgbGVmdCBwYW5lbC4nXG4gICAgICAgICksXG4gICAgICBsYXllcklkc0Zvck1hcDE6IHpcbiAgICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAnTGF5ZXIgSURzIHRvIHNob3cgT05MWSBpbiB0aGUgUklHSFQgcGFuZWwuIExheWVycyBub3QgbGlzdGVkIGFyZSBoaWRkZW4gZnJvbSB0aGUgcmlnaHQgcGFuZWwuJ1xuICAgICAgICApXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHthY3Rpb24sIGxheWVySWRzRm9yTWFwMCwgbGF5ZXJJZHNGb3JNYXAxfSA9IChpbnB1dCA/PyB7fSkgYXMge1xuICAgICAgICBhY3Rpb246ICdlbmFibGUnIHwgJ2Rpc2FibGUnO1xuICAgICAgICBsYXllcklkc0Zvck1hcDA/OiBzdHJpbmdbXTtcbiAgICAgICAgbGF5ZXJJZHNGb3JNYXAxPzogc3RyaW5nW107XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIGEgbWlzc2luZy9pbnZhbGlkIGFjdGlvbiBtdXN0IG5vdCBmYWxsIHRocm91Z2ggdG8gdGhlIGVuYWJsZSBwYXRoIGFuZFxuICAgICAgICAvLyB0b2dnbGUgc3BsaXQgdmlldyB1bmV4cGVjdGVkbHkuXG4gICAgICAgIGlmIChhY3Rpb24gIT09ICdlbmFibGUnICYmIGFjdGlvbiAhPT0gJ2Rpc2FibGUnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgY29tbWFuZElkOiBzcGxpdFZpZXdDb21tYW5kSWQsXG4gICAgICAgICAgICBlcnJvcjogYEludmFsaWQgYWN0aW9uIFwiJHtTdHJpbmcoYWN0aW9uKX1cIi4gTXVzdCBiZSBcImVuYWJsZVwiIG9yIFwiZGlzYWJsZVwiLmAsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAgICdQYXNzIGFjdGlvbjogXCJlbmFibGVcIiB0byBhY3RpdmF0ZSBkdWFsIG1hcCBtb2RlLCBvciBcImRpc2FibGVcIiB0byByZXR1cm4gdG8gYSBzaW5nbGUgbWFwLidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIGEgc3RyaW5nL29iamVjdCBwYXNzZWQgYXMgbGF5ZXJJZHNGb3JNYXAwLzEgbXVzdCBub3QgYmUgdHJlYXRlZCBhc1xuICAgICAgICAvLyBpdGVyYWJsZSAoYC5sZW5ndGhgLCBgLmZpbHRlcmApIGFuZCBwcm9kdWNlIHN1cnByaXNpbmcgbGF5ZXIgdG9nZ2xlcy5cbiAgICAgICAgLy8gUmVqZWN0IG5vbi1hcnJheSBvciBub24tc3RyaW5nIGVudHJpZXMgd2hlbiB0aGVzZSBmaWVsZHMgYXJlIHByb3ZpZGVkLlxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBpZHNdIG9mIFtcbiAgICAgICAgICBbJ2xheWVySWRzRm9yTWFwMCcsIGxheWVySWRzRm9yTWFwMF0sXG4gICAgICAgICAgWydsYXllcklkc0Zvck1hcDEnLCBsYXllcklkc0Zvck1hcDFdXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpZHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKCFBcnJheS5pc0FycmF5KGlkcykgfHwgaWRzLnNvbWUoaWQgPT4gdHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIGNvbW1hbmRJZDogc3BsaXRWaWV3Q29tbWFuZElkLFxuICAgICAgICAgICAgICBlcnJvcjogYEludmFsaWQgJHtuYW1lfS4gTXVzdCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgbGF5ZXIgaWQgc3RyaW5ncy5gLFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb246IGBQYXNzICR7bmFtZX0gYXMgYW4gYXJyYXkgb2YgbGF5ZXIgaWQgc3RyaW5ncywgb3Igb21pdCBpdCB0byBzaG93IGFsbCBsYXllcnMgb24gdGhhdCBwYW5lbC5gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmlzU3RhdGUgPSBjdHguZ2V0VmlzU3RhdGUoKTtcbiAgICAgICAgY29uc3QgaXNTcGxpdCA9IHZpc1N0YXRlLnNwbGl0TWFwcyAmJiB2aXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID4gMTtcblxuICAgICAgICBpZiAoYWN0aW9uID09PSAnZGlzYWJsZScpIHtcbiAgICAgICAgICBpZiAoaXNTcGxpdCkge1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIFJJR0hUIHBhbmVsIChpbmRleCAxKSBzbyB0aGUgTEVGVCBwYW5lbCAobWFwMCkgc3Vydml2ZXM6XG4gICAgICAgICAgICAvLyBgY2xvc2VTcGVjaWZpY01hcEF0SW5kZXhgIGtlZXBzIGAxIC0gcGF5bG9hZGAsIHNvIGNsb3NpbmcgMCB3b3VsZFxuICAgICAgICAgICAgLy8ga2VlcCB0aGUgcmlnaHQgcGFuZWwgYW5kIGZsaXAgbGF5ZXIgdmlzaWJpbGl0eSB0byBtYXAxJ3MgY29uZmlnLlxuICAgICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZVNwbGl0TWFwKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBjb21tYW5kSWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICAgICAgICAgIGRhdGE6IHtkZXRhaWxzOiAnU3BsaXQgbWFwIHZpZXcgZGlzYWJsZWQuIFJldHVybmVkIHRvIHNpbmdsZSBtYXAgdmlldy4nfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmFibGVcbiAgICAgICAgaWYgKCFpc1NwbGl0KSB7XG4gICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZVNwbGl0TWFwKDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc0xheWVyQXNzaWdubWVudCA9XG4gICAgICAgICAgKGxheWVySWRzRm9yTWFwMCAmJiBsYXllcklkc0Zvck1hcDAubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAobGF5ZXJJZHNGb3JNYXAxICYmIGxheWVySWRzRm9yTWFwMS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoaGFzTGF5ZXJBc3NpZ25tZW50KSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoMjAwKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVmlzID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgICAgY29uc3Qgc3BsaXRNYXBzID0gdXBkYXRlZFZpcy5zcGxpdE1hcHM7XG5cbiAgICAgICAgICBpZiAoc3BsaXRNYXBzICYmIHNwbGl0TWFwcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxMYXllcnMgPSB1cGRhdGVkVmlzLmxheWVycyB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGFsbExheWVySWRzID0gYWxsTGF5ZXJzLm1hcCgobDogYW55KSA9PiBsLmlkKTtcblxuICAgICAgICAgICAgLy8gRmFpbCBmYXN0IG9uIHVua25vd24gbGF5ZXIgaWRzIOKAlCBzaWxlbnRseSBpZ25vcmluZyB0aGVtIHdvdWxkXG4gICAgICAgICAgICAvLyBoaWRlIGV2ZXJ5IHJlYWwgbGF5ZXIgbm90IGxpc3RlZCBhbmQgcHJvZHVjZSBhbiB1bmV4cGVjdGVkIGJsYW5rXG4gICAgICAgICAgICAvLyBwYW5lbC5cbiAgICAgICAgICAgIGNvbnN0IGFsbExheWVySWRTZXQgPSBuZXcgU2V0KGFsbExheWVySWRzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhbmVsLCBpZHNdIG9mIFtcbiAgICAgICAgICAgICAgWydsZWZ0IChtYXAwKScsIGxheWVySWRzRm9yTWFwMF0sXG4gICAgICAgICAgICAgIFsncmlnaHQgKG1hcDEpJywgbGF5ZXJJZHNGb3JNYXAxXVxuICAgICAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgICAgICBpZiAoaWRzICYmIGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5rbm93biA9IGlkcy5maWx0ZXIoaWQgPT4gIWFsbExheWVySWRTZXQuaGFzKGlkKSk7XG4gICAgICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5rbm93biBsYXllciBpZChzKSBmb3IgdGhlICR7cGFuZWx9IHBhbmVsOiAke3Vua25vd24uam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBBdmFpbGFibGUgbGF5ZXIgaWRzOiAke2FsbExheWVySWRzLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxheWVySWRzRm9yTWFwMCAmJiBsYXllcklkc0Zvck1hcDAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBtYXAwTGF5ZXJzID0gc3BsaXRNYXBzWzBdPy5sYXllcnMgfHwge307XG4gICAgICAgICAgICAgIGNvbnN0IGRlc2lyZWRTZXQwID0gbmV3IFNldChsYXllcklkc0Zvck1hcDApO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgYWxsTGF5ZXJJZHMpIHtcbiAgICAgICAgICAgICAgICAvLyBDb2VyY2UgdG8gYm9vbGVhbjogYSBtaXNzaW5nIGVudHJ5IG1lYW5zIFwiaGlkZGVuXCIsIGFuZFxuICAgICAgICAgICAgICAgIC8vIGB0b2dnbGVMYXllckZvck1hcFVwZGF0ZXJgIHRvZ2dsZXMgbWlzc2luZyBlbnRyaWVzIHRvIHZpc2libGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gQm9vbGVhbihtYXAwTGF5ZXJzW2xheWVySWRdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRCZVZpc2libGUgPSBkZXNpcmVkU2V0MC5oYXMobGF5ZXJJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzVmlzaWJsZSAhPT0gc2hvdWxkQmVWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICBjdHguZGlzcGF0Y2godG9nZ2xlTGF5ZXJGb3JNYXAoMCwgbGF5ZXJJZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJZHNGb3JNYXAxICYmIGxheWVySWRzRm9yTWFwMS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZyZXNoU3BsaXRNYXBzID0gY3R4LmdldFZpc1N0YXRlKCkuc3BsaXRNYXBzO1xuICAgICAgICAgICAgICBjb25zdCBtYXAxTGF5ZXJzID0gZnJlc2hTcGxpdE1hcHM/LlsxXT8ubGF5ZXJzIHx8IHt9O1xuICAgICAgICAgICAgICBjb25zdCBkZXNpcmVkU2V0MSA9IG5ldyBTZXQobGF5ZXJJZHNGb3JNYXAxKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIGFsbExheWVySWRzKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29lcmNlIHRvIGJvb2xlYW46IGEgbWlzc2luZyBlbnRyeSBtZWFucyBcImhpZGRlblwiLCBhbmRcbiAgICAgICAgICAgICAgICAvLyBgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyYCB0b2dnbGVzIG1pc3NpbmcgZW50cmllcyB0byB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4obWFwMUxheWVyc1tsYXllcklkXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQmVWaXNpYmxlID0gZGVzaXJlZFNldDEuaGFzKGxheWVySWQpO1xuICAgICAgICAgICAgICAgIGlmIChpc1Zpc2libGUgIT09IHNob3VsZEJlVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZUxheWVyRm9yTWFwKDEsIGxheWVySWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbFZpcyA9IGN0eC5nZXRWaXNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBsYXllcnMgPSBmaW5hbFZpcy5sYXllcnMgfHwgW107XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogc3BsaXRWaWV3Q29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRldGFpbHM6IGBTcGxpdCBtYXAgdmlldyBlbmFibGVkLiAke2xheWVycy5sZW5ndGh9IGxheWVyKHMpIGF2YWlsYWJsZS4ke1xuICAgICAgICAgICAgICBoYXNMYXllckFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICA/IGAgTGVmdCBwYW5lbDogJHsobGF5ZXJJZHNGb3JNYXAwIHx8IFtdKS5sZW5ndGh9IGxheWVyKHMpLCBSaWdodCBwYW5lbDogJHtcbiAgICAgICAgICAgICAgICAgICAgKGxheWVySWRzRm9yTWFwMSB8fCBbXSkubGVuZ3RoXG4gICAgICAgICAgICAgICAgICB9IGxheWVyKHMpLmBcbiAgICAgICAgICAgICAgICA6ICcgQWxsIGxheWVycyB2aXNpYmxlIG9uIGJvdGggcGFuZWxzLiBQcm92aWRlIGxheWVySWRzRm9yTWFwMC9sYXllcklkc0Zvck1hcDEgdG8gYXNzaWduIGxheWVycyB0byBlYWNoIHBhbmVsLidcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246XG4gICAgICAgICAgICAgICdDaGVjayB0aGF0IGEgbWFwIGlzIGxvYWRlZCBhbmQgbGF5ZXJzIGV4aXN0LiBJZiB0aGUgZXJyb3IgcGVyc2lzdHMsIGFzayB0aGUgdXNlciB0byB0cnkgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycy4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7QUFHQSxTQUFRQSxDQUFDLFFBQU8sS0FBSztBQUNy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
@@ -0,0 +1,194 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
5
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
6
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7
+ // SPDX-License-Identifier: MIT
8
+ // Copyright contributors to the kepler.gl project
9
+
10
+ import { z } from 'zod';
11
+ import { tableFromArrays } from 'apache-arrow';
12
+ import { addDataToMap } from '@kepler.gl/actions';
13
+ import { processFileData } from '@kepler.gl/processors';
14
+ import { datasetNameToTableName, arrowTableToObjects } from './utils';
15
+ import { isObjectColumn, stringifyObjectColumn, restoreObjectColumns } from './utils';
16
+ export var tableCommandId = 'map.create-table';
17
+ export function getTableCommand(ctx) {
18
+ return {
19
+ id: tableCommandId,
20
+ name: 'Create map dataset via SQL',
21
+ group: 'Map',
22
+ description: "Create a NEW dataset in kepler.gl from a SQL query. The result becomes a SEPARATE new dataset (resultDatasetName); the ORIGINAL dataset and its layers/filters are left untouched. Use it to build a new table with different columns \u2014 e.g. add, delete, or rename columns, or change a column's type (CAST(col AS <type>)) \u2014 inside the new dataset.\nNOTE: To modify an EXISTING dataset in place, do NOT use this command \u2014 use map.add-column instead (add a column that copies an existing one to \"rename\", or casts it via expression to change its type). Only reach for map.create-table when the user wants a NEW, separate dataset.\nPlease note:\n1. Do not use * to select all columns, instead use all the column names in dataset.\n2. List all column names the new table or dataset will have.\nIMPORTANT: Use __TABLE__ as the table name placeholder in SQL. It will be replaced with the actual DuckDB table name at runtime.",
23
+ metadata: {
24
+ readOnly: false,
25
+ riskLevel: 'high',
26
+ idempotent: false,
27
+ requiresConfirmation: true
28
+ },
29
+ inputSchema: z.object({
30
+ datasetName: z.string().describe('The name of the source dataset'),
31
+ variableNames: z.array(z.string()).describe('Only use variable names that already exist in the dataset.'),
32
+ sql: z.string().describe('The SQL query to execute. Use __TABLE__ as the table name placeholder.'),
33
+ resultDatasetName: z.string().describe('The name for the new dataset')
34
+ }),
35
+ execute: function () {
36
+ var _execute = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_execCtx, input) {
37
+ var _ref, datasetName, variableNames, sql, resultDatasetName, visState, datasets, dataId, dbTableName, resolvedSql, uniqueVariableNames, columnData, objectColumns, _iterator, _step, varName, values, arrowTable, db, arrowResult, jsonResult, parsedData, firstFiveRows;
38
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
39
+ while (1) switch (_context.prev = _context.next) {
40
+ case 0:
41
+ _ref = input !== null && input !== void 0 ? input : {}, datasetName = _ref.datasetName, variableNames = _ref.variableNames, sql = _ref.sql, resultDatasetName = _ref.resultDatasetName;
42
+ _context.prev = 1;
43
+ if (!(typeof datasetName !== 'string' || datasetName.length === 0)) {
44
+ _context.next = 4;
45
+ break;
46
+ }
47
+ throw new Error('datasetName must be a non-empty string.');
48
+ case 4:
49
+ if (!(!Array.isArray(variableNames) || variableNames.length === 0 || variableNames.some(function (v) {
50
+ return typeof v !== 'string' || v.length === 0;
51
+ }))) {
52
+ _context.next = 6;
53
+ break;
54
+ }
55
+ throw new Error('variableNames must be a non-empty array of non-empty strings.');
56
+ case 6:
57
+ if (!(typeof sql !== 'string' || sql.length === 0)) {
58
+ _context.next = 8;
59
+ break;
60
+ }
61
+ throw new Error('sql must be a non-empty string.');
62
+ case 8:
63
+ if (!(typeof resultDatasetName !== 'string' || resultDatasetName.length === 0)) {
64
+ _context.next = 10;
65
+ break;
66
+ }
67
+ throw new Error('resultDatasetName must be a non-empty string.');
68
+ case 10:
69
+ visState = ctx.getVisState();
70
+ datasets = visState.datasets;
71
+ dataId = Object.keys(datasets).find(function (id) {
72
+ return id === datasetName || datasets[id].label === datasetName;
73
+ });
74
+ if (dataId) {
75
+ _context.next = 15;
76
+ break;
77
+ }
78
+ throw new Error("Dataset \"".concat(datasetName, "\" not found."));
79
+ case 15:
80
+ // Derive the DuckDB table name from the resolved dataset id, not the
81
+ // user-provided label: different labels can sanitize to the same table
82
+ // name (e.g. "A-B" vs "A B"), which would clobber another dataset's
83
+ // temp table inside DuckDB and run the SQL against unintended data.
84
+ dbTableName = datasetNameToTableName(dataId); // The contract requires the __TABLE__ placeholder — without it the
85
+ // query would run against whatever table names appear in the SQL (or
86
+ // return unrelated results), which is especially risky for a
87
+ // high-risk, confirmation-gated command. Fail fast with an actionable
88
+ // error instead.
89
+ if (sql.includes('__TABLE__')) {
90
+ _context.next = 18;
91
+ break;
92
+ }
93
+ throw new Error('The SQL query must use the __TABLE__ placeholder as the table name, ' + 'e.g. `SELECT * FROM __TABLE__`.');
94
+ case 18:
95
+ resolvedSql = sql.replace(/__TABLE__/g, "\"".concat(dbTableName, "\"")); // Dedupe variableNames: duplicate names would silently overwrite
96
+ // earlier entries in columnData, producing an Arrow table that doesn't
97
+ // match the requested column list.
98
+ uniqueVariableNames = _toConsumableArray(new Set(variableNames));
99
+ columnData = {}; // Object-valued columns (the `_geojson` Feature objects) must not be
100
+ // round-tripped through Arrow raw: `tableFromArrays` infers ONE Arrow
101
+ // type per column from the first value, so a dataset mixing Polygon and
102
+ // MultiPolygon features gets the shallower (Polygon) coordinate nesting
103
+ // and the MultiPolygon coordinates come back as nulls. Stringify them
104
+ // for the DuckDB round-trip and restore the objects afterwards.
105
+ objectColumns = [];
106
+ _iterator = _createForOfIteratorHelper(uniqueVariableNames);
107
+ try {
108
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
109
+ varName = _step.value;
110
+ // Pass the user-provided datasetName (label or id) — the documented
111
+ // KeplerContext contract — not the resolved id; getValuesFromDataset
112
+ // matches by label or id either way.
113
+ values = ctx.getValuesFromDataset(datasetName, varName);
114
+ if (isObjectColumn(values)) objectColumns.push(varName);
115
+ columnData[varName] = stringifyObjectColumn(values);
116
+ }
117
+ } catch (err) {
118
+ _iterator.e(err);
119
+ } finally {
120
+ _iterator.f();
121
+ }
122
+ arrowTable = tableFromArrays(columnData);
123
+ _context.next = 27;
124
+ return ctx.getConnector();
125
+ case 27:
126
+ db = _context.sent;
127
+ _context.next = 30;
128
+ return db.execute("DROP TABLE IF EXISTS \"".concat(dbTableName, "\""));
129
+ case 30:
130
+ _context.next = 32;
131
+ return db.loadArrow(arrowTable, dbTableName);
132
+ case 32:
133
+ _context.next = 34;
134
+ return db.query(resolvedSql);
135
+ case 34:
136
+ arrowResult = _context.sent;
137
+ jsonResult = arrowTableToObjects(arrowResult);
138
+ restoreObjectColumns(jsonResult, objectColumns);
139
+ _context.next = 39;
140
+ return processFileData({
141
+ content: {
142
+ data: jsonResult,
143
+ fileName: resultDatasetName
144
+ },
145
+ fileCache: []
146
+ });
147
+ case 39:
148
+ parsedData = _context.sent;
149
+ ctx.dispatch(addDataToMap({
150
+ datasets: parsedData,
151
+ // No auto-create — the assistant creates the layer explicitly via
152
+ // `map.add-layer` to avoid duplicate default layers.
153
+ options: {
154
+ autoCreateLayers: false,
155
+ centerMap: true
156
+ }
157
+ }));
158
+
159
+ // Trimmed, model-facing subset (ported from the old `toModelOutput`).
160
+ firstFiveRows = jsonResult.slice(0, 5);
161
+ return _context.abrupt("return", {
162
+ success: true,
163
+ commandId: tableCommandId,
164
+ data: {
165
+ details: "Table created as ".concat(resultDatasetName, " (").concat(jsonResult.length, " rows) and added to kepler.gl."),
166
+ resultDatasetName: resultDatasetName,
167
+ firstFiveRows: firstFiveRows
168
+ }
169
+ });
170
+ case 45:
171
+ _context.prev = 45;
172
+ _context.t0 = _context["catch"](1);
173
+ return _context.abrupt("return", {
174
+ success: false,
175
+ commandId: tableCommandId,
176
+ error: _context.t0 instanceof Error ? _context.t0.message : String(_context.t0),
177
+ data: {
178
+ instruction: 'Please explain the error and give a plan to fix it. Then try again with a different query.'
179
+ }
180
+ });
181
+ case 48:
182
+ case "end":
183
+ return _context.stop();
184
+ }
185
+ }, _callee, null, [[1, 45]]);
186
+ }));
187
+ function execute(_x, _x2) {
188
+ return _execute.apply(this, arguments);
189
+ }
190
+ return execute;
191
+ }()
192
+ };
193
+ }
194
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ6IiwidGFibGVGcm9tQXJyYXlzIiwiYWRkRGF0YVRvTWFwIiwicHJvY2Vzc0ZpbGVEYXRhIiwiZGF0YXNldE5hbWVUb1RhYmxlTmFtZSIsImFycm93VGFibGVUb09iamVjdHMiLCJpc09iamVjdENvbHVtbiIsInN0cmluZ2lmeU9iamVjdENvbHVtbiIsInJlc3RvcmVPYmplY3RDb2x1bW5zIiwidGFibGVDb21tYW5kSWQiLCJnZXRUYWJsZUNvbW1hbmQiLCJjdHgiLCJpZCIsIm5hbWUiLCJncm91cCIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJyZWFkT25seSIsInJpc2tMZXZlbCIsImlkZW1wb3RlbnQiLCJyZXF1aXJlc0NvbmZpcm1hdGlvbiIsImlucHV0U2NoZW1hIiwib2JqZWN0IiwiZGF0YXNldE5hbWUiLCJzdHJpbmciLCJkZXNjcmliZSIsInZhcmlhYmxlTmFtZXMiLCJhcnJheSIsInNxbCIsInJlc3VsdERhdGFzZXROYW1lIiwiZXhlY3V0ZSIsIl9leGVjdXRlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfZXhlY0N0eCIsImlucHV0IiwiX3JlZiIsInZpc1N0YXRlIiwiZGF0YXNldHMiLCJkYXRhSWQiLCJkYlRhYmxlTmFtZSIsInJlc29sdmVkU3FsIiwidW5pcXVlVmFyaWFibGVOYW1lcyIsImNvbHVtbkRhdGEiLCJvYmplY3RDb2x1bW5zIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJ2YXJOYW1lIiwidmFsdWVzIiwiYXJyb3dUYWJsZSIsImRiIiwiYXJyb3dSZXN1bHQiLCJqc29uUmVzdWx0IiwicGFyc2VkRGF0YSIsImZpcnN0Rml2ZVJvd3MiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwibGVuZ3RoIiwiRXJyb3IiLCJBcnJheSIsImlzQXJyYXkiLCJzb21lIiwidiIsImdldFZpc1N0YXRlIiwiT2JqZWN0Iiwia2V5cyIsImZpbmQiLCJsYWJlbCIsImNvbmNhdCIsImluY2x1ZGVzIiwicmVwbGFjZSIsIl90b0NvbnN1bWFibGVBcnJheSIsIlNldCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJnZXRWYWx1ZXNGcm9tRGF0YXNldCIsInB1c2giLCJlcnIiLCJlIiwiZiIsImdldENvbm5lY3RvciIsInNlbnQiLCJsb2FkQXJyb3ciLCJxdWVyeSIsImNvbnRlbnQiLCJkYXRhIiwiZmlsZU5hbWUiLCJmaWxlQ2FjaGUiLCJkaXNwYXRjaCIsIm9wdGlvbnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiY2VudGVyTWFwIiwic2xpY2UiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZGV0YWlscyIsInQwIiwiZXJyb3IiLCJtZXNzYWdlIiwiU3RyaW5nIiwiaW5zdHJ1Y3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy90YWJsZS1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3RhYmxlRnJvbUFycmF5cywgVGFibGUgYXMgQXJyb3dUYWJsZX0gZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtwcm9jZXNzRmlsZURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQgdHlwZSB7S2VwbGVyQ29udGV4dH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2RhdGFzZXROYW1lVG9UYWJsZU5hbWUsIGFycm93VGFibGVUb09iamVjdHN9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtpc09iamVjdENvbHVtbiwgc3RyaW5naWZ5T2JqZWN0Q29sdW1uLCByZXN0b3JlT2JqZWN0Q29sdW1uc30gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCB0YWJsZUNvbW1hbmRJZCA9ICdtYXAuY3JlYXRlLXRhYmxlJyBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29tbWFuZChjdHg6IEtlcGxlckNvbnRleHQpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHRhYmxlQ29tbWFuZElkLFxuICAgIG5hbWU6ICdDcmVhdGUgbWFwIGRhdGFzZXQgdmlhIFNRTCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlIGEgTkVXIGRhdGFzZXQgaW4ga2VwbGVyLmdsIGZyb20gYSBTUUwgcXVlcnkuIFRoZSByZXN1bHQgYmVjb21lcyBhIFNFUEFSQVRFIG5ldyBkYXRhc2V0IChyZXN1bHREYXRhc2V0TmFtZSk7IHRoZSBPUklHSU5BTCBkYXRhc2V0IGFuZCBpdHMgbGF5ZXJzL2ZpbHRlcnMgYXJlIGxlZnQgdW50b3VjaGVkLiBVc2UgaXQgdG8gYnVpbGQgYSBuZXcgdGFibGUgd2l0aCBkaWZmZXJlbnQgY29sdW1ucyDigJQgZS5nLiBhZGQsIGRlbGV0ZSwgb3IgcmVuYW1lIGNvbHVtbnMsIG9yIGNoYW5nZSBhIGNvbHVtbidzIHR5cGUgKENBU1QoY29sIEFTIDx0eXBlPikpIOKAlCBpbnNpZGUgdGhlIG5ldyBkYXRhc2V0LlxuTk9URTogVG8gbW9kaWZ5IGFuIEVYSVNUSU5HIGRhdGFzZXQgaW4gcGxhY2UsIGRvIE5PVCB1c2UgdGhpcyBjb21tYW5kIOKAlCB1c2UgbWFwLmFkZC1jb2x1bW4gaW5zdGVhZCAoYWRkIGEgY29sdW1uIHRoYXQgY29waWVzIGFuIGV4aXN0aW5nIG9uZSB0byBcInJlbmFtZVwiLCBvciBjYXN0cyBpdCB2aWEgZXhwcmVzc2lvbiB0byBjaGFuZ2UgaXRzIHR5cGUpLiBPbmx5IHJlYWNoIGZvciBtYXAuY3JlYXRlLXRhYmxlIHdoZW4gdGhlIHVzZXIgd2FudHMgYSBORVcsIHNlcGFyYXRlIGRhdGFzZXQuXG5QbGVhc2Ugbm90ZTpcbjEuIERvIG5vdCB1c2UgKiB0byBzZWxlY3QgYWxsIGNvbHVtbnMsIGluc3RlYWQgdXNlIGFsbCB0aGUgY29sdW1uIG5hbWVzIGluIGRhdGFzZXQuXG4yLiBMaXN0IGFsbCBjb2x1bW4gbmFtZXMgdGhlIG5ldyB0YWJsZSBvciBkYXRhc2V0IHdpbGwgaGF2ZS5cbklNUE9SVEFOVDogVXNlIF9fVEFCTEVfXyBhcyB0aGUgdGFibGUgbmFtZSBwbGFjZWhvbGRlciBpbiBTUUwuIEl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIER1Y2tEQiB0YWJsZSBuYW1lIGF0IHJ1bnRpbWUuYCxcbiAgICBtZXRhZGF0YToge3JlYWRPbmx5OiBmYWxzZSwgcmlza0xldmVsOiAnaGlnaCcsIGlkZW1wb3RlbnQ6IGZhbHNlLCByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZX0sXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGRhdGFzZXROYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgbmFtZSBvZiB0aGUgc291cmNlIGRhdGFzZXQnKSxcbiAgICAgIHZhcmlhYmxlTmFtZXM6IHpcbiAgICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4gICAgICAgIC5kZXNjcmliZSgnT25seSB1c2UgdmFyaWFibGUgbmFtZXMgdGhhdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBkYXRhc2V0LicpLFxuICAgICAgc3FsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoJ1RoZSBTUUwgcXVlcnkgdG8gZXhlY3V0ZS4gVXNlIF9fVEFCTEVfXyBhcyB0aGUgdGFibGUgbmFtZSBwbGFjZWhvbGRlci4nKSxcbiAgICAgIHJlc3VsdERhdGFzZXROYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgbmFtZSBmb3IgdGhlIG5ldyBkYXRhc2V0JylcbiAgICB9KSBhcyBhbnksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9leGVjQ3R4LCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qge2RhdGFzZXROYW1lLCB2YXJpYWJsZU5hbWVzLCBzcWwsIHJlc3VsdERhdGFzZXROYW1lfSA9IChpbnB1dCA/PyB7fSkgYXMge1xuICAgICAgICBkYXRhc2V0TmFtZTogc3RyaW5nO1xuICAgICAgICB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXTtcbiAgICAgICAgc3FsOiBzdHJpbmc7XG4gICAgICAgIHJlc3VsdERhdGFzZXROYW1lOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIG1pc3Npbmcvd3JvbmctdHlwZWQgaW5wdXRzIG11c3Qgbm90IGZhbGwgdGhyb3VnaCB0byBUeXBlRXJyb3JzIChlLmcuXG4gICAgICAgIC8vIGBzcWwuaW5jbHVkZXNgIG9uIGEgbm9uLXN0cmluZykgdGhhdCBzdXJmYWNlIGFzIGNvbmZ1c2luZyBlcnJvcnMuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YXNldE5hbWUgIT09ICdzdHJpbmcnIHx8IGRhdGFzZXROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YXNldE5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhcmlhYmxlTmFtZXMpIHx8XG4gICAgICAgICAgdmFyaWFibGVOYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICB2YXJpYWJsZU5hbWVzLnNvbWUodiA9PiB0eXBlb2YgdiAhPT0gJ3N0cmluZycgfHwgdi5sZW5ndGggPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmFyaWFibGVOYW1lcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIG5vbi1lbXB0eSBzdHJpbmdzLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3FsICE9PSAnc3RyaW5nJyB8fCBzcWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcWwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHREYXRhc2V0TmFtZSAhPT0gJ3N0cmluZycgfHwgcmVzdWx0RGF0YXNldE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXN1bHREYXRhc2V0TmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc1N0YXRlID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRzID0gdmlzU3RhdGUuZGF0YXNldHM7XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKFxuICAgICAgICAgIGlkID0+IGlkID09PSBkYXRhc2V0TmFtZSB8fCBkYXRhc2V0c1tpZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZGF0YUlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhc2V0IFwiJHtkYXRhc2V0TmFtZX1cIiBub3QgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVyaXZlIHRoZSBEdWNrREIgdGFibGUgbmFtZSBmcm9tIHRoZSByZXNvbHZlZCBkYXRhc2V0IGlkLCBub3QgdGhlXG4gICAgICAgIC8vIHVzZXItcHJvdmlkZWQgbGFiZWw6IGRpZmZlcmVudCBsYWJlbHMgY2FuIHNhbml0aXplIHRvIHRoZSBzYW1lIHRhYmxlXG4gICAgICAgIC8vIG5hbWUgKGUuZy4gXCJBLUJcIiB2cyBcIkEgQlwiKSwgd2hpY2ggd291bGQgY2xvYmJlciBhbm90aGVyIGRhdGFzZXQnc1xuICAgICAgICAvLyB0ZW1wIHRhYmxlIGluc2lkZSBEdWNrREIgYW5kIHJ1biB0aGUgU1FMIGFnYWluc3QgdW5pbnRlbmRlZCBkYXRhLlxuICAgICAgICBjb25zdCBkYlRhYmxlTmFtZSA9IGRhdGFzZXROYW1lVG9UYWJsZU5hbWUoZGF0YUlkKTtcbiAgICAgICAgLy8gVGhlIGNvbnRyYWN0IHJlcXVpcmVzIHRoZSBfX1RBQkxFX18gcGxhY2Vob2xkZXIg4oCUIHdpdGhvdXQgaXQgdGhlXG4gICAgICAgIC8vIHF1ZXJ5IHdvdWxkIHJ1biBhZ2FpbnN0IHdoYXRldmVyIHRhYmxlIG5hbWVzIGFwcGVhciBpbiB0aGUgU1FMIChvclxuICAgICAgICAvLyByZXR1cm4gdW5yZWxhdGVkIHJlc3VsdHMpLCB3aGljaCBpcyBlc3BlY2lhbGx5IHJpc2t5IGZvciBhXG4gICAgICAgIC8vIGhpZ2gtcmlzaywgY29uZmlybWF0aW9uLWdhdGVkIGNvbW1hbmQuIEZhaWwgZmFzdCB3aXRoIGFuIGFjdGlvbmFibGVcbiAgICAgICAgLy8gZXJyb3IgaW5zdGVhZC5cbiAgICAgICAgaWYgKCFzcWwuaW5jbHVkZXMoJ19fVEFCTEVfXycpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSBTUUwgcXVlcnkgbXVzdCB1c2UgdGhlIF9fVEFCTEVfXyBwbGFjZWhvbGRlciBhcyB0aGUgdGFibGUgbmFtZSwgJyArXG4gICAgICAgICAgICAgICdlLmcuIGBTRUxFQ1QgKiBGUk9NIF9fVEFCTEVfX2AuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRTcWwgPSBzcWwucmVwbGFjZSgvX19UQUJMRV9fL2csIGBcIiR7ZGJUYWJsZU5hbWV9XCJgKTtcbiAgICAgICAgLy8gRGVkdXBlIHZhcmlhYmxlTmFtZXM6IGR1cGxpY2F0ZSBuYW1lcyB3b3VsZCBzaWxlbnRseSBvdmVyd3JpdGVcbiAgICAgICAgLy8gZWFybGllciBlbnRyaWVzIGluIGNvbHVtbkRhdGEsIHByb2R1Y2luZyBhbiBBcnJvdyB0YWJsZSB0aGF0IGRvZXNuJ3RcbiAgICAgICAgLy8gbWF0Y2ggdGhlIHJlcXVlc3RlZCBjb2x1bW4gbGlzdC5cbiAgICAgICAgY29uc3QgdW5pcXVlVmFyaWFibGVOYW1lcyA9IFsuLi5uZXcgU2V0KHZhcmlhYmxlTmFtZXMpXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPiA9IHt9O1xuICAgICAgICAvLyBPYmplY3QtdmFsdWVkIGNvbHVtbnMgKHRoZSBgX2dlb2pzb25gIEZlYXR1cmUgb2JqZWN0cykgbXVzdCBub3QgYmVcbiAgICAgICAgLy8gcm91bmQtdHJpcHBlZCB0aHJvdWdoIEFycm93IHJhdzogYHRhYmxlRnJvbUFycmF5c2AgaW5mZXJzIE9ORSBBcnJvd1xuICAgICAgICAvLyB0eXBlIHBlciBjb2x1bW4gZnJvbSB0aGUgZmlyc3QgdmFsdWUsIHNvIGEgZGF0YXNldCBtaXhpbmcgUG9seWdvbiBhbmRcbiAgICAgICAgLy8gTXVsdGlQb2x5Z29uIGZlYXR1cmVzIGdldHMgdGhlIHNoYWxsb3dlciAoUG9seWdvbikgY29vcmRpbmF0ZSBuZXN0aW5nXG4gICAgICAgIC8vIGFuZCB0aGUgTXVsdGlQb2x5Z29uIGNvb3JkaW5hdGVzIGNvbWUgYmFjayBhcyBudWxscy4gU3RyaW5naWZ5IHRoZW1cbiAgICAgICAgLy8gZm9yIHRoZSBEdWNrREIgcm91bmQtdHJpcCBhbmQgcmVzdG9yZSB0aGUgb2JqZWN0cyBhZnRlcndhcmRzLlxuICAgICAgICBjb25zdCBvYmplY3RDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHZhck5hbWUgb2YgdW5pcXVlVmFyaWFibGVOYW1lcykge1xuICAgICAgICAgIC8vIFBhc3MgdGhlIHVzZXItcHJvdmlkZWQgZGF0YXNldE5hbWUgKGxhYmVsIG9yIGlkKSDigJQgdGhlIGRvY3VtZW50ZWRcbiAgICAgICAgICAvLyBLZXBsZXJDb250ZXh0IGNvbnRyYWN0IOKAlCBub3QgdGhlIHJlc29sdmVkIGlkOyBnZXRWYWx1ZXNGcm9tRGF0YXNldFxuICAgICAgICAgIC8vIG1hdGNoZXMgYnkgbGFiZWwgb3IgaWQgZWl0aGVyIHdheS5cbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBjdHguZ2V0VmFsdWVzRnJvbURhdGFzZXQoZGF0YXNldE5hbWUsIHZhck5hbWUpO1xuICAgICAgICAgIGlmIChpc09iamVjdENvbHVtbih2YWx1ZXMpKSBvYmplY3RDb2x1bW5zLnB1c2godmFyTmFtZSk7XG4gICAgICAgICAgY29sdW1uRGF0YVt2YXJOYW1lXSA9IHN0cmluZ2lmeU9iamVjdENvbHVtbih2YWx1ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJyb3dUYWJsZTogQXJyb3dUYWJsZSA9IHRhYmxlRnJvbUFycmF5cyhjb2x1bW5EYXRhKTtcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBjdHguZ2V0Q29ubmVjdG9yKCk7XG5cbiAgICAgICAgYXdhaXQgZGIuZXhlY3V0ZShgRFJPUCBUQUJMRSBJRiBFWElTVFMgXCIke2RiVGFibGVOYW1lfVwiYCk7XG4gICAgICAgIGF3YWl0IGRiLmxvYWRBcnJvdyhhcnJvd1RhYmxlLCBkYlRhYmxlTmFtZSk7XG5cbiAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBkYi5xdWVyeShyZXNvbHZlZFNxbCk7XG5cbiAgICAgICAgY29uc3QganNvblJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IGFycm93VGFibGVUb09iamVjdHMoYXJyb3dSZXN1bHQpO1xuICAgICAgICByZXN0b3JlT2JqZWN0Q29sdW1ucyhqc29uUmVzdWx0LCBvYmplY3RDb2x1bW5zKTtcblxuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgICAgICBjb250ZW50OiB7ZGF0YToganNvblJlc3VsdCwgZmlsZU5hbWU6IHJlc3VsdERhdGFzZXROYW1lfSxcbiAgICAgICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN0eC5kaXNwYXRjaChcbiAgICAgICAgICBhZGREYXRhVG9NYXAoe1xuICAgICAgICAgICAgZGF0YXNldHM6IHBhcnNlZERhdGEsXG4gICAgICAgICAgICAvLyBObyBhdXRvLWNyZWF0ZSDigJQgdGhlIGFzc2lzdGFudCBjcmVhdGVzIHRoZSBsYXllciBleHBsaWNpdGx5IHZpYVxuICAgICAgICAgICAgLy8gYG1hcC5hZGQtbGF5ZXJgIHRvIGF2b2lkIGR1cGxpY2F0ZSBkZWZhdWx0IGxheWVycy5cbiAgICAgICAgICAgIG9wdGlvbnM6IHthdXRvQ3JlYXRlTGF5ZXJzOiBmYWxzZSwgY2VudGVyTWFwOiB0cnVlfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVHJpbW1lZCwgbW9kZWwtZmFjaW5nIHN1YnNldCAocG9ydGVkIGZyb20gdGhlIG9sZCBgdG9Nb2RlbE91dHB1dGApLlxuICAgICAgICBjb25zdCBmaXJzdEZpdmVSb3dzID0ganNvblJlc3VsdC5zbGljZSgwLCA1KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogdGFibGVDb21tYW5kSWQsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZGV0YWlsczogYFRhYmxlIGNyZWF0ZWQgYXMgJHtyZXN1bHREYXRhc2V0TmFtZX0gKCR7anNvblJlc3VsdC5sZW5ndGh9IHJvd3MpIGFuZCBhZGRlZCB0byBrZXBsZXIuZ2wuYCxcbiAgICAgICAgICAgIHJlc3VsdERhdGFzZXROYW1lLFxuICAgICAgICAgICAgZmlyc3RGaXZlUm93c1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiB0YWJsZUNvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAnUGxlYXNlIGV4cGxhaW4gdGhlIGVycm9yIGFuZCBnaXZlIGEgcGxhbiB0byBmaXggaXQuIFRoZW4gdHJ5IGFnYWluIHdpdGggYSBkaWZmZXJlbnQgcXVlcnkuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7O0FBR0EsU0FBUUEsQ0FBQyxRQUFPLEtBQUs7QUFDckIsU0FBUUMsZUFBZSxRQUE0QixjQUFjO0FBQ2pFLFNBQVFDLFlBQVksUUFBTyxvQkFBb0I7QUFDL0MsU0FBUUMsZUFBZSxRQUFPLHVCQUF1QjtBQUVyRCxTQUFRQyxzQkFBc0IsRUFBRUMsbUJBQW1CLFFBQU8sU0FBUztBQUNuRSxTQUFRQyxjQUFjLEVBQUVDLHFCQUFxQixFQUFFQyxvQkFBb0IsUUFBTyxTQUFTO0FBRW5GLE9BQU8sSUFBTUMsY0FBYyxHQUFHLGtCQUEyQjtBQUV6RCxPQUFPLFNBQVNDLGVBQWVBLENBQUNDLEdBQWtCLEVBQWU7RUFDL0QsT0FBTztJQUNMQyxFQUFFLEVBQUVILGNBQWM7SUFDbEJJLElBQUksRUFBRSw0QkFBNEI7SUFDbENDLEtBQUssRUFBRSxLQUFLO0lBQ1pDLFdBQVcsczZCQUtrSDtJQUM3SEMsUUFBUSxFQUFFO01BQUNDLFFBQVEsRUFBRSxLQUFLO01BQUVDLFNBQVMsRUFBRSxNQUFNO01BQUVDLFVBQVUsRUFBRSxLQUFLO01BQUVDLG9CQUFvQixFQUFFO0lBQUks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