@kepler.gl/duckdb 3.1.0 → 3.1.2

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.
@@ -5,30 +5,28 @@ var _typeof3 = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.KeplerGlDuckDbTable = void 0;
8
+ exports.restoreGeoarrowMetadata = exports.KeplerGlDuckDbTable = void 0;
9
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
11
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
13
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
14
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
14
15
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
15
16
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16
17
  var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
17
18
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
18
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
19
19
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
20
  var arrow = _interopRequireWildcard(require("apache-arrow"));
21
21
  var _constants = require("@kepler.gl/constants");
22
- var _table = require("@kepler.gl/table");
23
22
  var _processors = require("@kepler.gl/processors");
24
- var _init = require("../init");
23
+ var _table = require("@kepler.gl/table");
24
+ var _utils = require("@kepler.gl/utils");
25
25
  var _dataProcessor = require("../processors/data-processor");
26
26
  var _duckdbTableUtils = require("./duckdb-table-utils");
27
+ var _duckdbTableUtils2 = require("../table/duckdb-table-utils");
27
28
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
28
29
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
29
- 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; } } }; }
30
- 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; } }
31
- 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; }
32
30
  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; }
33
31
  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; }
34
32
  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)); }
@@ -53,46 +51,7 @@ var KEPLER_GEOM_FROM_GEOJSON_COLUMN = '_geojson';
53
51
  /**
54
52
  * Names of columns that most likely contain binary wkb geometry
55
53
  */
56
- var SUGGESTED_GEOM_COLUMNS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, KEPLER_GEOM_FROM_GEOJSON_COLUMN, true), DUCKDB_GEOM_COLUMN, true), "geometry", true);
57
- /**
58
- * Creates an arrow table from arrow vectors and fields.
59
- * @param columns An array of arrow vectors.
60
- * @param fields An array of fields per arrow vector.
61
- * @returns An arrow table.
62
- */
63
- // TODO: consider using original drag&dropped arrow table, as it could contain extra metadata, not passed to the fields.
64
- var restoreArrowTable = function restoreArrowTable(columns, fields) {
65
- var creaOpts = {};
66
- fields.map(function (field, index) {
67
- creaOpts[field.name] = columns[index];
68
- });
69
- return new arrow.Table(creaOpts);
70
- };
71
- var dropIfTableExists = /*#__PURE__*/function () {
72
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(c, tableName) {
73
- return _regenerator["default"].wrap(function _callee$(_context) {
74
- while (1) switch (_context.prev = _context.next) {
75
- case 0:
76
- _context.prev = 0;
77
- _context.next = 3;
78
- return c.query("DROP TABLE IF EXISTS \"".concat(tableName, "\";"));
79
- case 3:
80
- _context.next = 8;
81
- break;
82
- case 5:
83
- _context.prev = 5;
84
- _context.t0 = _context["catch"](0);
85
- console.error('Dropping table failed', tableName, _context.t0);
86
- case 8:
87
- case "end":
88
- return _context.stop();
89
- }
90
- }, _callee, null, [[0, 5]]);
91
- }));
92
- return function dropIfTableExists(_x, _x2) {
93
- return _ref.apply(this, arguments);
94
- };
95
- }();
54
+ var SUGGESTED_GEOM_COLUMNS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, KEPLER_GEOM_FROM_GEOJSON_COLUMN, _constants.GEOARROW_EXTENSIONS.WKB), DUCKDB_GEOM_COLUMN, _constants.GEOARROW_EXTENSIONS.WKB), "geometry", _constants.GEOARROW_EXTENSIONS.WKB);
96
55
  var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_KeplerTable) {
97
56
  function KeplerGlDuckDbTable(props) {
98
57
  (0, _classCallCheck2["default"])(this, KeplerGlDuckDbTable);
@@ -102,13 +61,13 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
102
61
  return (0, _createClass2["default"])(KeplerGlDuckDbTable, [{
103
62
  key: "importRowData",
104
63
  value: function () {
105
- var _importRowData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref2) {
64
+ var _importRowData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref) {
106
65
  var data, db, c, fields, rows, rowsForDb, columns, createTableSql;
107
- return _regenerator["default"].wrap(function _callee2$(_context2) {
108
- while (1) switch (_context2.prev = _context2.next) {
66
+ return _regenerator["default"].wrap(function _callee$(_context) {
67
+ while (1) switch (_context.prev = _context.next) {
109
68
  case 0:
110
- data = _ref2.data, db = _ref2.db, c = _ref2.c;
111
- _context2.prev = 1;
69
+ data = _ref.data, db = _ref.db, c = _ref.c;
70
+ _context.prev = 1;
112
71
  fields = data.fields, rows = data.rows; // DATASET_FORMATS.keplergl loads data as any[][] instead of [{}]
113
72
  // TODO potential memory usage explosion: original data, new object and then DuckDb table
114
73
  rowsForDb = Array.isArray(rows[0]) ? rows.map(function (row) {
@@ -118,7 +77,7 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
118
77
  });
119
78
  return newRow;
120
79
  }) : rows;
121
- _context2.next = 6;
80
+ _context.next = 6;
122
81
  return db.registerFileText(this.id, JSON.stringify(rowsForDb));
123
82
  case 6:
124
83
  columns = fields.reduce(function (acc, field, index) {
@@ -126,22 +85,22 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
126
85
  return "".concat(acc).concat(index > 0 ? ',' : '', " '").concat(field.name, "': '").concat(field.duckDBColumnType, "'");
127
86
  }, '');
128
87
  createTableSql = "\n CREATE TABLE '".concat(this.label, "' AS\n SELECT *\n FROM read_json('").concat(this.id, "',\n columns = {").concat(columns, "});\n ");
129
- _context2.next = 10;
88
+ _context.next = 10;
130
89
  return c.query(createTableSql);
131
90
  case 10:
132
- _context2.next = 15;
91
+ _context.next = 15;
133
92
  break;
134
93
  case 12:
135
- _context2.prev = 12;
136
- _context2.t0 = _context2["catch"](1);
137
- console.log('importRowData', _context2.t0);
94
+ _context.prev = 12;
95
+ _context.t0 = _context["catch"](1);
96
+ console.log('importRowData', _context.t0);
138
97
  case 15:
139
98
  case "end":
140
- return _context2.stop();
99
+ return _context.stop();
141
100
  }
142
- }, _callee2, this, [[1, 12]]);
101
+ }, _callee, this, [[1, 12]]);
143
102
  }));
144
- function importRowData(_x3) {
103
+ function importRowData(_x) {
145
104
  return _importRowData.apply(this, arguments);
146
105
  }
147
106
  return importRowData;
@@ -149,38 +108,39 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
149
108
  }, {
150
109
  key: "importGeoJsonData",
151
110
  value: function () {
152
- var _importGeoJsonData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3) {
111
+ var _importGeoJsonData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref2) {
153
112
  var data, db, c, rows, createTableSql;
154
- return _regenerator["default"].wrap(function _callee3$(_context3) {
155
- while (1) switch (_context3.prev = _context3.next) {
113
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
114
+ while (1) switch (_context2.prev = _context2.next) {
156
115
  case 0:
157
- data = _ref3.data, db = _ref3.db, c = _ref3.c;
158
- _context3.prev = 1;
116
+ data = _ref2.data, db = _ref2.db, c = _ref2.c;
117
+ _context2.prev = 1;
159
118
  rows = data.rows;
160
- _context3.next = 5;
119
+ _context2.next = 5;
161
120
  return db.registerFileText(this.id, JSON.stringify(rows));
162
121
  case 5:
163
122
  createTableSql = "\n install spatial;\n load spatial;\n CREATE TABLE '".concat(this.label, "' AS \n SELECT *\n FROM ST_READ('").concat(this.id, "', keep_wkb = TRUE);\n ALTER TABLE '").concat(this.label, "' RENAME '").concat(DUCKDB_WKB_COLUMN, "' TO '").concat(KEPLER_GEOM_FROM_GEOJSON_COLUMN, "';\n ");
164
- _context3.next = 8;
123
+ _context2.next = 8;
165
124
  return c.query(createTableSql);
166
125
  case 8:
167
- _context3.next = 13;
126
+ _context2.next = 13;
168
127
  break;
169
128
  case 10:
170
- _context3.prev = 10;
171
- _context3.t0 = _context3["catch"](1);
172
- console.error('importGeoJsonData', _context3.t0);
129
+ _context2.prev = 10;
130
+ _context2.t0 = _context2["catch"](1);
131
+ console.error('importGeoJsonData', _context2.t0);
173
132
  case 13:
174
- return _context3.abrupt("return", {
175
- addWKBMetadata: (0, _defineProperty2["default"])({}, KEPLER_GEOM_FROM_GEOJSON_COLUMN, true)
133
+ return _context2.abrupt("return", {
134
+ // _geojson column is created from geometry with keep_wkb flag and contains valid WKB data.
135
+ geoarrowMetadata: (0, _defineProperty2["default"])({}, KEPLER_GEOM_FROM_GEOJSON_COLUMN, _constants.GEOARROW_EXTENSIONS.WKB)
176
136
  });
177
137
  case 14:
178
138
  case "end":
179
- return _context3.stop();
139
+ return _context2.stop();
180
140
  }
181
- }, _callee3, this, [[1, 10]]);
141
+ }, _callee2, this, [[1, 10]]);
182
142
  }));
183
- function importGeoJsonData(_x4) {
143
+ function importGeoJsonData(_x2) {
184
144
  return _importGeoJsonData.apply(this, arguments);
185
145
  }
186
146
  return importGeoJsonData;
@@ -188,46 +148,50 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
188
148
  }, {
189
149
  key: "importArrowData",
190
150
  value: function () {
191
- var _importArrowData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(_ref4) {
192
- var data, db, c, arrowTable, setupSql;
193
- return _regenerator["default"].wrap(function _callee4$(_context4) {
194
- while (1) switch (_context4.prev = _context4.next) {
151
+ var _importArrowData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3) {
152
+ var data, c, adjustedMetadata, arrowTable, setupSql;
153
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
154
+ while (1) switch (_context3.prev = _context3.next) {
195
155
  case 0:
196
- data = _ref4.data, db = _ref4.db, c = _ref4.c;
197
- _context4.prev = 1;
156
+ data = _ref3.data, c = _ref3.c;
157
+ adjustedMetadata = {};
158
+ _context3.prev = 2;
198
159
  // 1) data.rows contains an arrow table created by Add to Map data from DuckDb query.
199
160
  // 2) arrow table is in cols & fields when a file is dragged & dropped into Add Data To Map dialog.
200
- arrowTable = data.rows instanceof arrow.Table ? data.rows : restoreArrowTable(data.cols || [], data.fields);
161
+ arrowTable = data.rows instanceof arrow.Table ? data.rows : (0, _duckdbTableUtils2.restoreArrowTable)(data.cols || [], data.fields, data.arrowSchema); // remove unsupported extensions from an arrow table that throw exceptions in DuckDB.
162
+ adjustedMetadata = (0, _duckdbTableUtils2.removeUnsupportedExtensions)(arrowTable);
201
163
  setupSql = "\n install spatial;\n load spatial;\n ";
202
- _context4.next = 6;
164
+ _context3.next = 8;
203
165
  return c.query(setupSql);
204
- case 6:
205
- _context4.next = 8;
166
+ case 8:
167
+ _context3.next = 10;
206
168
  return c.insertArrowTable(arrowTable, {
207
169
  name: this.label
208
170
  });
209
- case 8:
210
- _context4.next = 13;
211
- break;
212
171
  case 10:
213
- _context4.prev = 10;
214
- _context4.t0 = _context4["catch"](1);
172
+ // restore unsupported extensions that throw exceptions in DuckDb
173
+ (0, _duckdbTableUtils2.restoreUnsupportedExtensions)(arrowTable, adjustedMetadata);
174
+ _context3.next = 16;
175
+ break;
176
+ case 13:
177
+ _context3.prev = 13;
178
+ _context3.t0 = _context3["catch"](2);
215
179
  // Known issues:
216
180
  // 1) Arrow Type with extension name: geoarrow.point and format: +w:2 is not currently supported in DuckDB.
217
- console.error('importArrowData', _context4.t0);
218
- case 13:
219
- return _context4.abrupt("return", {
220
- addWKBMetadata: _objectSpread({}, SUGGESTED_GEOM_COLUMNS),
221
- // use metadata from arrow table
181
+ console.error('importArrowData', _context3.t0);
182
+ case 16:
183
+ return _context3.abrupt("return", {
184
+ geoarrowMetadata: _objectSpread(_objectSpread({}, SUGGESTED_GEOM_COLUMNS), adjustedMetadata),
185
+ // use fields generated from the created arrow table
222
186
  useNewFields: true
223
187
  });
224
- case 14:
188
+ case 17:
225
189
  case "end":
226
- return _context4.stop();
190
+ return _context3.stop();
227
191
  }
228
- }, _callee4, this, [[1, 10]]);
192
+ }, _callee3, this, [[2, 13]]);
229
193
  }));
230
- function importArrowData(_x5) {
194
+ function importArrowData(_x3) {
231
195
  return _importArrowData.apply(this, arguments);
232
196
  }
233
197
  return importArrowData;
@@ -240,23 +204,33 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
240
204
  }, {
241
205
  key: "createTableAndGetArrow",
242
206
  value: (function () {
243
- var _createTableAndGetArrow = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(data) {
244
- var db, c, tableName, format, _data$rows, _data$rows2, _data$rows3, _data$cols, importDetails, fields, cols, _data$fields, _ref5, _ref5$addWKBMetadata, addWKBMetadata, _ref5$useNewFields, useNewFields, canCastST_asWKB, getArrowQuery, arrowResult;
245
- return _regenerator["default"].wrap(function _callee5$(_context5) {
246
- while (1) switch (_context5.prev = _context5.next) {
207
+ var _createTableAndGetArrow = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(data) {
208
+ var db, c, tableName, format, _data$rows, _data$rows2, _data$rows3, _data$cols, importDetails, fields, cols, _data$fields, _ref4, _ref4$geoarrowMetadat, geoarrowMetadata, _ref4$useNewFields, useNewFields, duckDbColumns, tableDuckDBTypes, columnsToConvertToWKB, adjustedQuery, arrowResult;
209
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
210
+ while (1) switch (_context4.prev = _context4.next) {
247
211
  case 0:
248
- _context5.next = 2;
249
- return (0, _init.getDuckDB)();
212
+ _context4.next = 2;
213
+ return (0, _utils.getApplicationConfig)().database;
250
214
  case 2:
251
- db = _context5.sent;
252
- _context5.next = 5;
215
+ db = _context4.sent;
216
+ if (db) {
217
+ _context4.next = 6;
218
+ break;
219
+ }
220
+ console.error('The database is not configured properly.');
221
+ return _context4.abrupt("return", {
222
+ fields: [],
223
+ cols: []
224
+ });
225
+ case 6:
226
+ _context4.next = 8;
253
227
  return db.connect();
254
- case 5:
255
- c = _context5.sent;
228
+ case 8:
229
+ c = _context4.sent;
256
230
  tableName = this.label;
257
- _context5.next = 9;
258
- return dropIfTableExists(c, tableName);
259
- case 9:
231
+ _context4.next = 12;
232
+ return (0, _duckdbTableUtils2.dropTableIfExists)(c, tableName);
233
+ case 12:
260
234
  format = this.metadata.format;
261
235
  if (!format) {
262
236
  // format is missing when we load Kepler.gl examples
@@ -269,98 +243,96 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
269
243
  }
270
244
  }
271
245
  if (!(format === _constants.DATASET_FORMATS.row)) {
272
- _context5.next = 16;
246
+ _context4.next = 19;
273
247
  break;
274
248
  }
275
- _context5.next = 14;
249
+ _context4.next = 17;
276
250
  return this.importRowData({
277
251
  data: data,
278
252
  db: db,
279
253
  c: c
280
254
  });
281
- case 14:
282
- _context5.next = 29;
255
+ case 17:
256
+ _context4.next = 32;
283
257
  break;
284
- case 16:
258
+ case 19:
285
259
  if (!(format === _constants.DATASET_FORMATS.geojson)) {
286
- _context5.next = 22;
260
+ _context4.next = 25;
287
261
  break;
288
262
  }
289
- _context5.next = 19;
263
+ _context4.next = 22;
290
264
  return this.importGeoJsonData({
291
265
  data: data,
292
266
  db: db,
293
267
  c: c
294
268
  });
295
- case 19:
296
- importDetails = _context5.sent;
297
- _context5.next = 29;
298
- break;
299
269
  case 22:
270
+ importDetails = _context4.sent;
271
+ _context4.next = 32;
272
+ break;
273
+ case 25:
300
274
  if (!(format === _constants.DATASET_FORMATS.arrow)) {
301
- _context5.next = 28;
275
+ _context4.next = 31;
302
276
  break;
303
277
  }
304
- _context5.next = 25;
278
+ _context4.next = 28;
305
279
  return this.importArrowData({
306
280
  data: data,
307
281
  db: db,
308
282
  c: c
309
283
  });
310
- case 25:
311
- importDetails = _context5.sent;
312
- _context5.next = 29;
313
- break;
314
284
  case 28:
285
+ importDetails = _context4.sent;
286
+ _context4.next = 32;
287
+ break;
288
+ case 31:
315
289
  console.error('Unrecognized format', format);
316
- case 29:
290
+ case 32:
317
291
  fields = [];
318
292
  cols = [];
319
- _context5.prev = 31;
320
- _ref5 = importDetails || {}, _ref5$addWKBMetadata = _ref5.addWKBMetadata, addWKBMetadata = _ref5$addWKBMetadata === void 0 ? {} : _ref5$addWKBMetadata, _ref5$useNewFields = _ref5.useNewFields, useNewFields = _ref5$useNewFields === void 0 ? false : _ref5$useNewFields; // Try to figure out whether geometry should be transformed by ST_AsWKB
321
- // TODO if canCastST_asWKB contains any keys then add ST_AsWKB to the following query
322
- _context5.next = 35;
323
- return tryST_AsWKB({
324
- tableName: tableName,
325
- c: c
326
- });
327
- case 35:
328
- canCastST_asWKB = _context5.sent;
329
- getArrowQuery = "SELECT * FROM '".concat(tableName, "';");
330
- _context5.next = 39;
331
- return c.query(getArrowQuery);
332
- case 39:
333
- arrowResult = _context5.sent;
334
- restoreGeoarrowMetadata(arrowResult, canCastST_asWKB, addWKBMetadata);
335
- fields = useNewFields ? (0, _processors.arrowSchemaToFields)(arrowResult.schema) : (_data$fields = data.fields) !== null && _data$fields !== void 0 ? _data$fields : (0, _processors.arrowSchemaToFields)(arrowResult.schema);
293
+ _context4.prev = 34;
294
+ _ref4 = importDetails || {}, _ref4$geoarrowMetadat = _ref4.geoarrowMetadata, geoarrowMetadata = _ref4$geoarrowMetadat === void 0 ? {} : _ref4$geoarrowMetadat, _ref4$useNewFields = _ref4.useNewFields, useNewFields = _ref4$useNewFields === void 0 ? false : _ref4$useNewFields;
295
+ _context4.next = 38;
296
+ return (0, _duckdbTableUtils2.getDuckDBColumnTypes)(c, tableName);
297
+ case 38:
298
+ duckDbColumns = _context4.sent;
299
+ tableDuckDBTypes = (0, _duckdbTableUtils2.getDuckDBColumnTypesMap)(duckDbColumns);
300
+ columnsToConvertToWKB = (0, _duckdbTableUtils2.getGeometryColumns)(duckDbColumns);
301
+ adjustedQuery = (0, _duckdbTableUtils2.constructST_asWKBQuery)(tableName, columnsToConvertToWKB);
302
+ _context4.next = 44;
303
+ return c.query(adjustedQuery);
304
+ case 44:
305
+ arrowResult = _context4.sent;
306
+ // TODO if format is an arrow table then just use the original one, instead of the new table from the query?
307
+
308
+ restoreGeoarrowMetadata(arrowResult, geoarrowMetadata);
309
+ fields = useNewFields ? (0, _processors.arrowSchemaToFields)(arrowResult, tableDuckDBTypes) : (_data$fields = data.fields) !== null && _data$fields !== void 0 ? _data$fields : (0, _processors.arrowSchemaToFields)(arrowResult, tableDuckDBTypes);
336
310
  cols = (0, _toConsumableArray2["default"])(Array(arrowResult.numCols).keys()).map(function (i) {
337
311
  return arrowResult.getChildAt(i);
338
312
  }).filter(function (col) {
339
313
  return col;
340
314
  });
341
- _context5.next = 48;
315
+ _context4.next = 53;
342
316
  break;
343
- case 45:
344
- _context5.prev = 45;
345
- _context5.t0 = _context5["catch"](31);
346
- // Known issues:
347
- // 1) ST_AsWKB binder error, no type match
348
- console.error('DuckDb table: binary geometry column to wkb', _context5.t0);
349
- case 48:
350
- _context5.next = 50;
351
- return c.close();
352
317
  case 50:
353
- return _context5.abrupt("return", {
318
+ _context4.prev = 50;
319
+ _context4.t0 = _context4["catch"](34);
320
+ console.error('DuckDB table: createTableAndGetArrow', _context4.t0);
321
+ case 53:
322
+ _context4.next = 55;
323
+ return c.close();
324
+ case 55:
325
+ return _context4.abrupt("return", {
354
326
  fields: fields,
355
327
  cols: cols
356
328
  });
357
- case 51:
329
+ case 56:
358
330
  case "end":
359
- return _context5.stop();
331
+ return _context4.stop();
360
332
  }
361
- }, _callee5, this, [[31, 45]]);
333
+ }, _callee4, this, [[34, 50]]);
362
334
  }));
363
- function createTableAndGetArrow(_x6) {
335
+ function createTableAndGetArrow(_x4) {
364
336
  return _createTableAndGetArrow.apply(this, arguments);
365
337
  }
366
338
  return createTableAndGetArrow;
@@ -368,14 +340,14 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
368
340
  }, {
369
341
  key: "importData",
370
342
  value: function () {
371
- var _importData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(_ref6) {
343
+ var _importData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_ref5) {
372
344
  var data, _yield$this$createTab, fields, cols;
373
- return _regenerator["default"].wrap(function _callee6$(_context6) {
374
- while (1) switch (_context6.prev = _context6.next) {
345
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
346
+ while (1) switch (_context5.prev = _context5.next) {
375
347
  case 0:
376
- data = _ref6.data;
348
+ data = _ref5.data;
377
349
  if (!(this.type === _constants.DatasetType.VECTOR_TILE)) {
378
- _context6.next = 4;
350
+ _context5.next = 4;
379
351
  break;
380
352
  }
381
353
  _superPropGet(KeplerGlDuckDbTable, "importData", this, 3)([{
@@ -383,12 +355,12 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
383
355
  rows: []
384
356
  })
385
357
  }]);
386
- return _context6.abrupt("return");
358
+ return _context5.abrupt("return");
387
359
  case 4:
388
- _context6.next = 6;
360
+ _context5.next = 6;
389
361
  return this.createTableAndGetArrow(data);
390
362
  case 6:
391
- _yield$this$createTab = _context6.sent;
363
+ _yield$this$createTab = _context5.sent;
392
364
  fields = _yield$this$createTab.fields;
393
365
  cols = _yield$this$createTab.cols;
394
366
  _superPropGet(KeplerGlDuckDbTable, "importData", this, 3)([{
@@ -400,11 +372,11 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
400
372
  }]);
401
373
  case 10:
402
374
  case "end":
403
- return _context6.stop();
375
+ return _context5.stop();
404
376
  }
405
- }, _callee6, this);
377
+ }, _callee5, this);
406
378
  }));
407
- function importData(_x7) {
379
+ function importData(_x5) {
408
380
  return _importData.apply(this, arguments);
409
381
  }
410
382
  return importData;
@@ -412,37 +384,37 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
412
384
  }, {
413
385
  key: "update",
414
386
  value: function () {
415
- var _update = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(data) {
387
+ var _update = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(data) {
416
388
  var _yield$this$createTab2, cols;
417
- return _regenerator["default"].wrap(function _callee7$(_context7) {
418
- while (1) switch (_context7.prev = _context7.next) {
389
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
390
+ while (1) switch (_context6.prev = _context6.next) {
419
391
  case 0:
420
392
  if (!(this.type === _constants.DatasetType.VECTOR_TILE)) {
421
- _context7.next = 3;
393
+ _context6.next = 3;
422
394
  break;
423
395
  }
424
396
  _superPropGet(KeplerGlDuckDbTable, "importData", this, 3)([{
425
397
  data: data
426
398
  }]);
427
- return _context7.abrupt("return", this);
399
+ return _context6.abrupt("return", this);
428
400
  case 3:
429
- _context7.next = 5;
401
+ _context6.next = 5;
430
402
  return this.createTableAndGetArrow(data);
431
403
  case 5:
432
- _yield$this$createTab2 = _context7.sent;
404
+ _yield$this$createTab2 = _context6.sent;
433
405
  cols = _yield$this$createTab2.cols;
434
- return _context7.abrupt("return", _superPropGet(KeplerGlDuckDbTable, "update", this, 3)([{
406
+ return _context6.abrupt("return", _superPropGet(KeplerGlDuckDbTable, "update", this, 3)([{
435
407
  cols: cols,
436
408
  rows: [],
437
409
  fields: []
438
410
  }]));
439
411
  case 8:
440
412
  case "end":
441
- return _context7.stop();
413
+ return _context6.stop();
442
414
  }
443
- }, _callee7, this);
415
+ }, _callee6, this);
444
416
  }));
445
- function update(_x8) {
417
+ function update(_x6) {
446
418
  return _update.apply(this, arguments);
447
419
  }
448
420
  return update;
@@ -453,15 +425,13 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
453
425
  * Try to restore geoarrow metadata lost during DuckDb ingestion.
454
426
  * Note that this function can generate wrong geometry types.
455
427
  * @param arrowTable Arrow table to update.
456
- * @param canCastST_asWKB A map with fields that are likely in DeckDB's internal WBK format.
457
- * @param addWKBMetadata A map with field names that usually used to store WKB geometry.
428
+ * @param geoarrowMetadata A map with field names that usually used to store geoarrow geometry.
458
429
  */
459
430
  (0, _defineProperty2["default"])(KeplerGlDuckDbTable, "getFileProcessor", function (data, inputFormat) {
460
431
  var processor;
461
432
  var format;
462
433
  if (inputFormat === _constants.DATASET_FORMATS.arrow || (0, _processors.isArrowData)(data)) {
463
434
  format = _constants.DATASET_FORMATS.arrow;
464
- // TODO injest arrow files from disk without loaders
465
435
  processor = _processors.processArrowBatches;
466
436
  } else if (inputFormat === _constants.DATASET_FORMATS.keplergl || (0, _processors.isKeplerGlMap)(data)) {
467
437
  format = _constants.DATASET_FORMATS.keplergl;
@@ -480,109 +450,28 @@ var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_
480
450
  };
481
451
  });
482
452
  (0, _defineProperty2["default"])(KeplerGlDuckDbTable, "getInputDataValidator", function () {
453
+ // In DuckDB mode data is validated later during import.
483
454
  return function (d) {
484
455
  return d;
485
456
  };
486
457
  });
487
- var restoreGeoarrowMetadata = /*#__PURE__*/function () {
488
- var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(arrowTable, canCastST_asWKB, addWKBMetadata) {
489
- return _regenerator["default"].wrap(function _callee8$(_context8) {
490
- while (1) switch (_context8.prev = _context8.next) {
491
- case 0:
492
- arrowTable.schema.fields.forEach(function (f) {
493
- if (arrow.DataType.isBinary(f.type) && (addWKBMetadata[f.name] || canCastST_asWKB[f.name])) {
494
- f.metadata.set('ARROW:extension:name', 'geoarrow.wkb');
495
- } else if ((0, _duckdbTableUtils.isGeoArrowPoint)(f.type)) {
496
- f.metadata.set('ARROW:extension:name', 'geoarrow.point');
497
- } else if ((0, _duckdbTableUtils.isGeoArrowLineString)(f.type)) {
498
- f.metadata.set('ARROW:extension:name', 'geoarrow.linestring');
499
- } else if ((0, _duckdbTableUtils.isGeoArrowPolygon)(f.type)) {
500
- f.metadata.set('ARROW:extension:name', 'geoarrow.polygon');
501
- } else if ((0, _duckdbTableUtils.isGeoArrowMultiPoint)(f.type)) {
502
- f.metadata.set('ARROW:extension:name', 'geoarrow.multipoint');
503
- } else if ((0, _duckdbTableUtils.isGeoArrowMultiLineString)(f.type)) {
504
- f.metadata.set('ARROW:extension:name', 'geoarrow.multilinestring');
505
- } else if ((0, _duckdbTableUtils.isGeoArrowMultiPolygon)(f.type)) {
506
- f.metadata.set('ARROW:extension:name', 'geoarrow.multipolygon');
507
- }
508
- });
509
- case 1:
510
- case "end":
511
- return _context8.stop();
512
- }
513
- }, _callee8);
514
- }));
515
- return function restoreGeoarrowMetadata(_x9, _x10, _x11) {
516
- return _ref7.apply(this, arguments);
517
- };
518
- }();
519
-
520
- /**
521
- * For all binary columns tries to transform geometry from DuckDB's internal format into proper WKB.
522
- * @param props
523
- * @returns A map of fields that should be transformed to valid WKB.
524
- */
525
- var tryST_AsWKB = /*#__PURE__*/function () {
526
- var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(props) {
527
- var c, tableName, resultWithSchema, binaryColumns, canCastST_asWKB, _iterator, _step, column, columnName, query;
528
- return _regenerator["default"].wrap(function _callee9$(_context9) {
529
- while (1) switch (_context9.prev = _context9.next) {
530
- case 0:
531
- c = props.c, tableName = props.tableName;
532
- _context9.next = 3;
533
- return c.query("\n SELECT * FROM '".concat(tableName, "' LIMIT 0;\n "));
534
- case 3:
535
- resultWithSchema = _context9.sent;
536
- binaryColumns = resultWithSchema.schema.fields.filter(function (f) {
537
- return arrow.DataType.isBinary(f.type);
538
- });
539
- canCastST_asWKB = {};
540
- _iterator = _createForOfIteratorHelper(binaryColumns);
541
- _context9.prev = 7;
542
- _iterator.s();
543
- case 9:
544
- if ((_step = _iterator.n()).done) {
545
- _context9.next = 24;
546
- break;
547
- }
548
- column = _step.value;
549
- _context9.prev = 11;
550
- columnName = column.name;
551
- query = "SELECT * EXCLUDE ".concat(columnName, ", ST_AsWKB(").concat(columnName, ") as ").concat(columnName, " FROM '").concat(tableName, "' LIMIT 1;");
552
- _context9.next = 16;
553
- return c.query(query);
554
- case 16:
555
- canCastST_asWKB[column.name] = true;
556
- _context9.next = 22;
557
- break;
558
- case 19:
559
- _context9.prev = 19;
560
- _context9.t0 = _context9["catch"](11);
561
- canCastST_asWKB[column.name] = false;
562
- case 22:
563
- _context9.next = 9;
564
- break;
565
- case 24:
566
- _context9.next = 29;
567
- break;
568
- case 26:
569
- _context9.prev = 26;
570
- _context9.t1 = _context9["catch"](7);
571
- _iterator.e(_context9.t1);
572
- case 29:
573
- _context9.prev = 29;
574
- _iterator.f();
575
- return _context9.finish(29);
576
- case 32:
577
- return _context9.abrupt("return", canCastST_asWKB);
578
- case 33:
579
- case "end":
580
- return _context9.stop();
581
- }
582
- }, _callee9, null, [[7, 26, 29, 32], [11, 19]]);
583
- }));
584
- return function tryST_AsWKB(_x12) {
585
- return _ref8.apply(this, arguments);
586
- };
587
- }();
588
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfdGFibGUiLCJfcHJvY2Vzc29ycyIsIl9pbml0IiwiX2RhdGFQcm9jZXNzb3IiLCJfZHVja2RiVGFibGVVdGlscyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZjMiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwiRFVDS0RCX0dFT01fQ09MVU1OIiwiRFVDS0RCX1dLQl9DT0xVTU4iLCJLRVBMRVJfR0VPTV9GUk9NX0dFT0pTT05fQ09MVU1OIiwiU1VHR0VTVEVEX0dFT01fQ09MVU1OUyIsInJlc3RvcmVBcnJvd1RhYmxlIiwiY29sdW1ucyIsImZpZWxkcyIsImNyZWFPcHRzIiwibWFwIiwiZmllbGQiLCJpbmRleCIsIlRhYmxlIiwiZHJvcElmVGFibGVFeGlzdHMiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJjIiwidGFibGVOYW1lIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwicXVlcnkiLCJjb25jYXQiLCJ0MCIsImNvbnNvbGUiLCJlcnJvciIsInN0b3AiLCJfeCIsIl94MiIsIktlcGxlckdsRHVja0RiVGFibGUiLCJleHBvcnRzIiwiX0tlcGxlclRhYmxlIiwicHJvcHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJfaW1wb3J0Um93RGF0YSIsIl9jYWxsZWUyIiwiX3JlZjIiLCJkYXRhIiwiZGIiLCJyb3dzIiwicm93c0ZvckRiIiwiY3JlYXRlVGFibGVTcWwiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJyb3ciLCJuZXdSb3ciLCJyZWdpc3RlckZpbGVUZXh0IiwiaWQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVkdWNlIiwiYWNjIiwiZHVja0RCQ29sdW1uVHlwZSIsImxhYmVsIiwibG9nIiwiaW1wb3J0Um93RGF0YSIsIl94MyIsIl9pbXBvcnRHZW9Kc29uRGF0YSIsIl9jYWxsZWUzIiwiX3JlZjMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJhYnJ1cHQiLCJhZGRXS0JNZXRhZGF0YSIsImltcG9ydEdlb0pzb25EYXRhIiwiX3g0IiwiX2ltcG9ydEFycm93RGF0YSIsIl9jYWxsZWU0IiwiX3JlZjQiLCJhcnJvd1RhYmxlIiwic2V0dXBTcWwiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJjb2xzIiwiaW5zZXJ0QXJyb3dUYWJsZSIsInVzZU5ld0ZpZWxkcyIsImltcG9ydEFycm93RGF0YSIsIl94NSIsIl9jcmVhdGVUYWJsZUFuZEdldEFycm93IiwiX2NhbGxlZTUiLCJmb3JtYXQiLCJfZGF0YSRyb3dzIiwiX2RhdGEkcm93czIiLCJfZGF0YSRyb3dzMyIsIl9kYXRhJGNvbHMiLCJpbXBvcnREZXRhaWxzIiwiX2RhdGEkZmllbGRzIiwiX3JlZjUiLCJfcmVmNSRhZGRXS0JNZXRhZGF0YSIsIl9yZWY1JHVzZU5ld0ZpZWxkcyIsImNhbkNhc3RTVF9hc1dLQiIsImdldEFycm93UXVlcnkiLCJhcnJvd1Jlc3VsdCIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsImdldER1Y2tEQiIsInNlbnQiLCJjb25uZWN0IiwibWV0YWRhdGEiLCJfdHlwZW9mMiIsIkRBVEFTRVRfRk9STUFUUyIsInR5cGUiLCJnZW9qc29uIiwiVmVjdG9yIiwidHJ5U1RfQXNXS0IiLCJyZXN0b3JlR2VvYXJyb3dNZXRhZGF0YSIsImFycm93U2NoZW1hVG9GaWVsZHMiLCJzY2hlbWEiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwibnVtQ29scyIsImdldENoaWxkQXQiLCJjb2wiLCJjbG9zZSIsImNyZWF0ZVRhYmxlQW5kR2V0QXJyb3ciLCJfeDYiLCJfaW1wb3J0RGF0YSIsIl9jYWxsZWU2IiwiX3JlZjYiLCJfeWllbGQkdGhpcyRjcmVhdGVUYWIiLCJfY2FsbGVlNiQiLCJfY29udGV4dDYiLCJEYXRhc2V0VHlwZSIsIlZFQ1RPUl9USUxFIiwiaW1wb3J0RGF0YSIsIl94NyIsIl91cGRhdGUiLCJfY2FsbGVlNyIsIl95aWVsZCR0aGlzJGNyZWF0ZVRhYjIiLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJ1cGRhdGUiLCJfeDgiLCJLZXBsZXJUYWJsZSIsImlucHV0Rm9ybWF0IiwicHJvY2Vzc29yIiwiaXNBcnJvd0RhdGEiLCJwcm9jZXNzQXJyb3dCYXRjaGVzIiwia2VwbGVyZ2wiLCJpc0tlcGxlckdsTWFwIiwicHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYiIsImlzUm93T2JqZWN0IiwicHJvY2Vzc0NzdlJvd09iamVjdCIsImlzR2VvSnNvbiIsInByb2Nlc3NHZW9qc29uIiwiZCIsIl9yZWY3IiwiX2NhbGxlZTgiLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJEYXRhVHlwZSIsImlzQmluYXJ5IiwiaXNHZW9BcnJvd1BvaW50IiwiaXNHZW9BcnJvd0xpbmVTdHJpbmciLCJpc0dlb0Fycm93UG9seWdvbiIsImlzR2VvQXJyb3dNdWx0aVBvaW50IiwiaXNHZW9BcnJvd011bHRpTGluZVN0cmluZyIsImlzR2VvQXJyb3dNdWx0aVBvbHlnb24iLCJfeDkiLCJfeDEwIiwiX3gxMSIsIl9yZWY4IiwiX2NhbGxlZTkiLCJyZXN1bHRXaXRoU2NoZW1hIiwiYmluYXJ5Q29sdW1ucyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiY29sdW1uIiwiY29sdW1uTmFtZSIsIl9jYWxsZWU5JCIsIl9jb250ZXh0OSIsInQxIiwiZmluaXNoIiwiX3gxMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS9kdWNrZGItdGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCB7QXN5bmNEdWNrREIsIEFzeW5jRHVja0RCQ29ubmVjdGlvbn0gZnJvbSAnQGR1Y2tkYi9kdWNrZGItd2FzbSc7XG5cbmltcG9ydCB7RGF0YXNldFR5cGUsIERBVEFTRVRfRk9STUFUU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge0ZpZWxkLCBQcm90b0RhdGFzZXRGaWVsZH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBhcnJvd1NjaGVtYVRvRmllbGRzLFxuICBpc0Fycm93RGF0YSxcbiAgaXNHZW9Kc29uLFxuICBpc0tlcGxlckdsTWFwLFxuICBpc1Jvd09iamVjdCxcbiAgcHJvY2Vzc0Fycm93QmF0Y2hlc1xufSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuXG5pbXBvcnQge2dldER1Y2tEQn0gZnJvbSAnLi4vaW5pdCc7XG5pbXBvcnQge1xuICBwcm9jZXNzQ3N2Um93T2JqZWN0LFxuICBwcm9jZXNzR2VvanNvbixcbiAgcHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYixcbiAgUHJvY2Vzc29yUmVzdWx0XG59IGZyb20gJy4uL3Byb2Nlc3NvcnMvZGF0YS1wcm9jZXNzb3InO1xuXG5pbXBvcnQge1xuICBpc0dlb0Fycm93UG9pbnQsXG4gIGlzR2VvQXJyb3dMaW5lU3RyaW5nLFxuICBpc0dlb0Fycm93UG9seWdvbixcbiAgaXNHZW9BcnJvd011bHRpUG9pbnQsXG4gIGlzR2VvQXJyb3dNdWx0aUxpbmVTdHJpbmcsXG4gIGlzR2VvQXJyb3dNdWx0aVBvbHlnb25cbn0gZnJvbSAnLi9kdWNrZGItdGFibGUtdXRpbHMnO1xuXG4vLyBUT0RPIHVzZSBmaWxlcyBmcm9tIGRpc2sgb3IgdXJsIGRpcmVjdGx5LCB3aXRob3V0IHBhcnNpbmcgYnkgbG9hZGVycyBhbmQgdGhlbiBpbmdlY3Rpb24gaW50byBEZWNrRGJcblxuLyoqXG4gKiBEZWZhdWx0IER1Y2tEYiBnZW9tZXRyeSBjb2x1bW5zIGNyZWF0ZWQgYnkgU1RfUkVBRFxuICovXG5jb25zdCBEVUNLREJfR0VPTV9DT0xVTU4gPSAnZ2VvbSc7XG5jb25zdCBEVUNLREJfV0tCX0NPTFVNTiA9ICd3a2JfZ2VvbWV0cnknO1xuXG4vKipcbiBEZWZhdWx0IGNvbHVtbiBuYW1lIGZvciBwcm9jZXNzZWQgZ2VvanNvbiBpbiBLZXBsZXIuXG4gVXNlIHRoaXMgbmFtZSB0byByZW5hbWUgZGVmYXVsdCAnZ2VvbScgY29sdW1uIGZyb20gRHVja0RiXG4gaW4gb3JkZXIgdG8gc3VwcG9ydCBLZXBsZXIgbWFwcyBzYXZlZCBiZWZvcmUgaW50cm9kdWN0aW9uIG9mIER1Y2tEYiBwbHVnaW4uXG4gKi9cbmNvbnN0IEtFUExFUl9HRU9NX0ZST01fR0VPSlNPTl9DT0xVTU4gPSAnX2dlb2pzb24nO1xuXG4vKipcbiAqIE5hbWVzIG9mIGNvbHVtbnMgdGhhdCBtb3N0IGxpa2VseSBjb250YWluIGJpbmFyeSB3a2IgZ2VvbWV0cnlcbiAqL1xuY29uc3QgU1VHR0VTVEVEX0dFT01fQ09MVU1OUyA9IHtcbiAgW0tFUExFUl9HRU9NX0ZST01fR0VPSlNPTl9DT0xVTU5dOiB0cnVlLFxuICBbRFVDS0RCX0dFT01fQ09MVU1OXTogdHJ1ZSxcbiAgZ2VvbWV0cnk6IHRydWVcbn07XG5cbnR5cGUgSW1wb3J0RGF0YVRvRHVja1Byb3BzID0ge1xuICBkYXRhOiBQcm9jZXNzb3JSZXN1bHQ7XG4gIGRiOiBBc3luY0R1Y2tEQjtcbiAgYzogQXN5bmNEdWNrREJDb25uZWN0aW9uO1xufTtcblxudHlwZSBJbXBvcnREYXRhVG9EdWNrUmVzdWx0ID0ge1xuICAvLyBEdWNrRGIgZHJvcHMgZ2VvYXJyb3cgbWV0YWRhdGEsIHNvIHRyeSB0byBwcmVzZXJ2ZSBzb21ldGluZ1xuICBhZGRXS0JNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICAvLyBVc2UgZmllbGRzIGZyb20gYXJyb3cgdGFibGUgZXZlbiBpZiBmaWVsZHMgYXJlIHByb3ZpZGVkXG4gIHVzZU5ld0ZpZWxkcz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyb3cgdGFibGUgZnJvbSBhcnJvdyB2ZWN0b3JzIGFuZCBmaWVsZHMuXG4gKiBAcGFyYW0gY29sdW1ucyBBbiBhcnJheSBvZiBhcnJvdyB2ZWN0b3JzLlxuICogQHBhcmFtIGZpZWxkcyBBbiBhcnJheSBvZiBmaWVsZHMgcGVyIGFycm93IHZlY3Rvci5cbiAqIEByZXR1cm5zIEFuIGFycm93IHRhYmxlLlxuICovXG4vLyBUT0RPOiBjb25zaWRlciB1c2luZyBvcmlnaW5hbCBkcmFnJmRyb3BwZWQgYXJyb3cgdGFibGUsIGFzIGl0IGNvdWxkIGNvbnRhaW4gZXh0cmEgbWV0YWRhdGEsIG5vdCBwYXNzZWQgdG8gdGhlIGZpZWxkcy5cbmNvbnN0IHJlc3RvcmVBcnJvd1RhYmxlID0gKGNvbHVtbnM6IGFycm93LlZlY3RvcltdLCBmaWVsZHM6IFByb3RvRGF0YXNldEZpZWxkW10pID0+IHtcbiAgY29uc3QgY3JlYU9wdHMgPSB7fTtcbiAgZmllbGRzLm1hcCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgY3JlYU9wdHNbZmllbGQubmFtZV0gPSBjb2x1bW5zW2luZGV4XTtcbiAgfSk7XG4gIHJldHVybiBuZXcgYXJyb3cuVGFibGUoY3JlYU9wdHMpO1xufTtcblxuY29uc3QgZHJvcElmVGFibGVFeGlzdHMgPSBhc3luYyAoYzogQXN5bmNEdWNrREJDb25uZWN0aW9uLCB0YWJsZU5hbWU6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGF3YWl0IGMucXVlcnkoYERST1AgVEFCTEUgSUYgRVhJU1RTIFwiJHt0YWJsZU5hbWV9XCI7YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRHJvcHBpbmcgdGFibGUgZmFpbGVkJywgdGFibGVOYW1lLCBlcnJvcik7XG4gIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBLZXBsZXJHbER1Y2tEYlRhYmxlIGV4dGVuZHMgS2VwbGVyVGFibGUge1xuICBkZWNsYXJlIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIGRlY2xhcmUgbGFiZWw6IHN0cmluZztcbiAgZGVjbGFyZSB0eXBlOiBzdHJpbmc7XG4gIGRlY2xhcmUgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cblxuICBhc3luYyBpbXBvcnRSb3dEYXRhKHtkYXRhLCBkYiwgY306IEltcG9ydERhdGFUb0R1Y2tQcm9wcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7ZmllbGRzLCByb3dzfSA9IGRhdGE7XG5cbiAgICAgIC8vIERBVEFTRVRfRk9STUFUUy5rZXBsZXJnbCBsb2FkcyBkYXRhIGFzIGFueVtdW10gaW5zdGVhZCBvZiBbe31dXG4gICAgICAvLyBUT0RPIHBvdGVudGlhbCBtZW1vcnkgdXNhZ2UgZXhwbG9zaW9uOiBvcmlnaW5hbCBkYXRhLCBuZXcgb2JqZWN0IGFuZCB0aGVuIER1Y2tEYiB0YWJsZVxuICAgICAgY29uc3Qgcm93c0ZvckRiID0gQXJyYXkuaXNBcnJheShyb3dzWzBdKVxuICAgICAgICA/IHJvd3MubWFwKHJvdyA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdSb3cgPSB7fTtcbiAgICAgICAgICAgIHJvdy5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgbmV3Um93W2ZpZWxkc1tpbmRleF0ubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1JvdztcbiAgICAgICAgICB9KVxuICAgICAgICA6IHJvd3M7XG5cbiAgICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZVRleHQodGhpcy5pZCwgSlNPTi5zdHJpbmdpZnkocm93c0ZvckRiKSk7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBmaWVsZHMucmVkdWNlKChhY2MsIGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE8gZXh0ZW5kIGZpZWxkcyB0byBjb250YWluIGR1Y2tEQkNvbHVtblR5cGVcbiAgICAgICAgcmV0dXJuIGAke2FjY30ke2luZGV4ID4gMCA/ICcsJyA6ICcnfSAnJHtmaWVsZC5uYW1lfSc6ICcke2ZpZWxkLmR1Y2tEQkNvbHVtblR5cGV9J2A7XG4gICAgICB9LCAnJyk7XG5cbiAgICAgIGNvbnN0IGNyZWF0ZVRhYmxlU3FsID0gYFxuICAgICAgICBDUkVBVEUgVEFCTEUgJyR7dGhpcy5sYWJlbH0nIEFTXG4gICAgICAgIFNFTEVDVCAqXG4gICAgICAgIEZST00gcmVhZF9qc29uKCcke3RoaXMuaWR9JyxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucyA9IHske2NvbHVtbnN9fSk7XG4gICAgICBgO1xuICAgICAgYXdhaXQgYy5xdWVyeShjcmVhdGVUYWJsZVNxbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdpbXBvcnRSb3dEYXRhJywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGltcG9ydEdlb0pzb25EYXRhKHtkYXRhLCBkYiwgY306IEltcG9ydERhdGFUb0R1Y2tQcm9wcyk6IFByb21pc2U8SW1wb3J0RGF0YVRvRHVja1Jlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7cm93c30gPSBkYXRhO1xuICAgICAgYXdhaXQgZGIucmVnaXN0ZXJGaWxlVGV4dCh0aGlzLmlkLCBKU09OLnN0cmluZ2lmeShyb3dzKSk7XG5cbiAgICAgIGNvbnN0IGNyZWF0ZVRhYmxlU3FsID0gYFxuICAgICAgICBpbnN0YWxsIHNwYXRpYWw7XG4gICAgICAgIGxvYWQgc3BhdGlhbDtcbiAgICAgICAgQ1JFQVRFIFRBQkxFICcke3RoaXMubGFiZWx9JyBBUyBcbiAgICAgICAgU0VMRUNUICpcbiAgICAgICAgRlJPTSBTVF9SRUFEKCcke3RoaXMuaWR9Jywga2VlcF93a2IgPSBUUlVFKTtcbiAgICAgICAgQUxURVIgVEFCTEUgJyR7dGhpcy5sYWJlbH0nIFJFTkFNRSAnJHtEVUNLREJfV0tCX0NPTFVNTn0nIFRPICcke0tFUExFUl9HRU9NX0ZST01fR0VPSlNPTl9DT0xVTU59JztcbiAgICAgIGA7XG4gICAgICBhd2FpdCBjLnF1ZXJ5KGNyZWF0ZVRhYmxlU3FsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignaW1wb3J0R2VvSnNvbkRhdGEnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZFdLQk1ldGFkYXRhOiB7W0tFUExFUl9HRU9NX0ZST01fR0VPSlNPTl9DT0xVTU5dOiB0cnVlfVxuICAgIH07XG4gIH1cblxuICBhc3luYyBpbXBvcnRBcnJvd0RhdGEoe2RhdGEsIGRiLCBjfTogSW1wb3J0RGF0YVRvRHVja1Byb3BzKTogUHJvbWlzZTxJbXBvcnREYXRhVG9EdWNrUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEpIGRhdGEucm93cyBjb250YWlucyBhbiBhcnJvdyB0YWJsZSBjcmVhdGVkIGJ5IEFkZCB0byBNYXAgZGF0YSBmcm9tIER1Y2tEYiBxdWVyeS5cbiAgICAgIC8vIDIpIGFycm93IHRhYmxlIGlzIGluIGNvbHMgJiBmaWVsZHMgd2hlbiBhIGZpbGUgaXMgZHJhZ2dlZCAmIGRyb3BwZWQgaW50byBBZGQgRGF0YSBUbyBNYXAgZGlhbG9nLlxuICAgICAgY29uc3QgYXJyb3dUYWJsZSA9XG4gICAgICAgIGRhdGEucm93cyBpbnN0YW5jZW9mIGFycm93LlRhYmxlXG4gICAgICAgICAgPyBkYXRhLnJvd3NcbiAgICAgICAgICA6IHJlc3RvcmVBcnJvd1RhYmxlKGRhdGEuY29scyB8fCBbXSwgZGF0YS5maWVsZHMpO1xuXG4gICAgICBjb25zdCBzZXR1cFNxbCA9IGBcbiAgICAgICAgaW5zdGFsbCBzcGF0aWFsO1xuICAgICAgICBsb2FkIHNwYXRpYWw7XG4gICAgICBgO1xuICAgICAgYXdhaXQgYy5xdWVyeShzZXR1cFNxbCk7XG4gICAgICBhd2FpdCBjLmluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZSwge25hbWU6IHRoaXMubGFiZWx9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gS25vd24gaXNzdWVzOlxuICAgICAgLy8gMSkgQXJyb3cgVHlwZSB3aXRoIGV4dGVuc2lvbiBuYW1lOiBnZW9hcnJvdy5wb2ludCBhbmQgZm9ybWF0OiArdzoyIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIER1Y2tEQi5cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ltcG9ydEFycm93RGF0YScsIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkV0tCTWV0YWRhdGE6IHsuLi5TVUdHRVNURURfR0VPTV9DT0xVTU5TfSxcbiAgICAgIC8vIHVzZSBtZXRhZGF0YSBmcm9tIGFycm93IHRhYmxlXG4gICAgICB1c2VOZXdGaWVsZHM6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSBmcm9tIGRhdGEsIHJldHVybnMgYW4gYXJyb3cgdGFibGUgd2l0aCB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7ZmllbGRzOiBGaWVsZFtdLCBjb2xzOiBhbnlbXX0+fVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVRhYmxlQW5kR2V0QXJyb3coZGF0YSk6IFByb21pc2U8e2ZpZWxkczogYW55W107IGNvbHM6IGFycm93LlZlY3RvcltdfT4ge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgZ2V0RHVja0RCKCk7XG4gICAgY29uc3QgYyA9IGF3YWl0IGRiLmNvbm5lY3QoKTtcblxuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMubGFiZWw7XG4gICAgYXdhaXQgZHJvcElmVGFibGVFeGlzdHMoYywgdGFibGVOYW1lKTtcblxuICAgIGxldCBmb3JtYXQgPSB0aGlzLm1ldGFkYXRhLmZvcm1hdDtcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgLy8gZm9ybWF0IGlzIG1pc3Npbmcgd2hlbiB3ZSBsb2FkIEtlcGxlci5nbCBleGFtcGxlc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5yb3dzPy5bMF0pIHx8IHR5cGVvZiBkYXRhLnJvd3M/LlswXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9ybWF0ID0gREFUQVNFVF9GT1JNQVRTLnJvdztcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5yb3dzPy50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvcm1hdCA9IERBVEFTRVRfRk9STUFUUy5nZW9qc29uO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmNvbHM/LlswXSBpbnN0YW5jZW9mIGFycm93LlZlY3Rvcikge1xuICAgICAgICBmb3JtYXQgPSBEQVRBU0VUX0ZPUk1BVFMuYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGltcG9ydERldGFpbHM6IEltcG9ydERhdGFUb0R1Y2tSZXN1bHQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLnJvdykge1xuICAgICAgYXdhaXQgdGhpcy5pbXBvcnRSb3dEYXRhKHtkYXRhLCBkYiwgY30pO1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMuZ2VvanNvbikge1xuICAgICAgaW1wb3J0RGV0YWlscyA9IGF3YWl0IHRoaXMuaW1wb3J0R2VvSnNvbkRhdGEoe2RhdGEsIGRiLCBjfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5hcnJvdykge1xuICAgICAgaW1wb3J0RGV0YWlscyA9IGF3YWl0IHRoaXMuaW1wb3J0QXJyb3dEYXRhKHtkYXRhLCBkYiwgY30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVbnJlY29nbml6ZWQgZm9ybWF0JywgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBsZXQgZmllbGRzOiBGaWVsZFtdID0gW107XG4gICAgbGV0IGNvbHM6IGFycm93LlZlY3RvcltdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge2FkZFdLQk1ldGFkYXRhID0ge30sIHVzZU5ld0ZpZWxkcyA9IGZhbHNlfSA9IGltcG9ydERldGFpbHMgfHwge307XG5cbiAgICAgIC8vIFRyeSB0byBmaWd1cmUgb3V0IHdoZXRoZXIgZ2VvbWV0cnkgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5IFNUX0FzV0tCXG4gICAgICAvLyBUT0RPIGlmIGNhbkNhc3RTVF9hc1dLQiBjb250YWlucyBhbnkga2V5cyB0aGVuIGFkZCBTVF9Bc1dLQiB0byB0aGUgZm9sbG93aW5nIHF1ZXJ5XG4gICAgICBjb25zdCBjYW5DYXN0U1RfYXNXS0IgPSBhd2FpdCB0cnlTVF9Bc1dLQih7dGFibGVOYW1lLCBjfSk7XG5cbiAgICAgIGNvbnN0IGdldEFycm93UXVlcnkgPSBgU0VMRUNUICogRlJPTSAnJHt0YWJsZU5hbWV9JztgO1xuICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBjLnF1ZXJ5KGdldEFycm93UXVlcnkpO1xuXG4gICAgICByZXN0b3JlR2VvYXJyb3dNZXRhZGF0YShhcnJvd1Jlc3VsdCwgY2FuQ2FzdFNUX2FzV0tCLCBhZGRXS0JNZXRhZGF0YSk7XG5cbiAgICAgIGZpZWxkcyA9IHVzZU5ld0ZpZWxkc1xuICAgICAgICA/IGFycm93U2NoZW1hVG9GaWVsZHMoYXJyb3dSZXN1bHQuc2NoZW1hKVxuICAgICAgICA6IGRhdGEuZmllbGRzID8/IGFycm93U2NoZW1hVG9GaWVsZHMoYXJyb3dSZXN1bHQuc2NoZW1hKTtcbiAgICAgIGNvbHMgPSBbLi4uQXJyYXkoYXJyb3dSZXN1bHQubnVtQ29scykua2V5cygpXVxuICAgICAgICAubWFwKGkgPT4gYXJyb3dSZXN1bHQuZ2V0Q2hpbGRBdChpKSlcbiAgICAgICAgLmZpbHRlcihjb2wgPT4gY29sKSBhcyBhcnJvdy5WZWN0b3JbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gS25vd24gaXNzdWVzOlxuICAgICAgLy8gMSkgU1RfQXNXS0IgYmluZGVyIGVycm9yLCBubyB0eXBlIG1hdGNoXG4gICAgICBjb25zb2xlLmVycm9yKCdEdWNrRGIgdGFibGU6IGJpbmFyeSBnZW9tZXRyeSBjb2x1bW4gdG8gd2tiJywgZXJyb3IpO1xuICAgIH1cblxuICAgIGF3YWl0IGMuY2xvc2UoKTtcblxuICAgIHJldHVybiB7ZmllbGRzLCBjb2xzfTtcbiAgfVxuXG4gIGFzeW5jIGltcG9ydERhdGEoe2RhdGF9OiB7ZGF0YTogUHJvY2Vzc29yUmVzdWx0fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFZlY3RvclRpbGUgaXMgYSBzcGVjaWFsIGNhc2UsIGlnbm9yZSBmb3Igbm93XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gRGF0YXNldFR5cGUuVkVDVE9SX1RJTEUpIHtcbiAgICAgIHN1cGVyLmltcG9ydERhdGEoe2RhdGE6IHsuLi5kYXRhLCByb3dzOiBbXX19KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7ZmllbGRzLCBjb2xzfSA9IGF3YWl0IHRoaXMuY3JlYXRlVGFibGVBbmRHZXRBcnJvdyhkYXRhKTtcblxuICAgIHN1cGVyLmltcG9ydERhdGEoe2RhdGE6IHtmaWVsZHMsIGNvbHMsIHJvd3M6IFtdfX0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlKGRhdGEpIHtcbiAgICAvLyBWZWN0b3JUaWxlIGlzIGEgc3BlY2lhbCBjYXNlLCBpZ25vcmUgZm9yIG5vd1xuICAgIGlmICh0aGlzLnR5cGUgPT09IERhdGFzZXRUeXBlLlZFQ1RPUl9USUxFKSB7XG4gICAgICBzdXBlci5pbXBvcnREYXRhKHtkYXRhfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCB7Y29sc30gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlQW5kR2V0QXJyb3coZGF0YSk7XG5cbiAgICByZXR1cm4gc3VwZXIudXBkYXRlKHtjb2xzLCByb3dzOiBbXSwgZmllbGRzOiBbXX0pO1xuICB9XG5cbiAgc3RhdGljIGdldEZpbGVQcm9jZXNzb3IgPSBmdW5jdGlvbiAoZGF0YTogYW55LCBpbnB1dEZvcm1hdD86IHN0cmluZykge1xuICAgIGxldCBwcm9jZXNzb3I7XG4gICAgbGV0IGZvcm1hdDtcbiAgICBpZiAoaW5wdXRGb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5hcnJvdyB8fCBpc0Fycm93RGF0YShkYXRhKSkge1xuICAgICAgZm9ybWF0ID0gREFUQVNFVF9GT1JNQVRTLmFycm93O1xuICAgICAgLy8gVE9ETyBpbmplc3QgYXJyb3cgZmlsZXMgZnJvbSBkaXNrIHdpdGhvdXQgbG9hZGVyc1xuICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc0Fycm93QmF0Y2hlcztcbiAgICB9IGVsc2UgaWYgKGlucHV0Rm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2wgfHwgaXNLZXBsZXJHbE1hcChkYXRhKSkge1xuICAgICAgZm9ybWF0ID0gREFUQVNFVF9GT1JNQVRTLmtlcGxlcmdsO1xuICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYjtcbiAgICB9IGVsc2UgaWYgKGlucHV0Rm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMucm93IHx8IGlzUm93T2JqZWN0KGRhdGEpKSB7XG4gICAgICAvLyBjc3YgZmlsZSBnb2VzIGhlcmVcbiAgICAgIGZvcm1hdCA9IERBVEFTRVRfRk9STUFUUy5yb3c7XG4gICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzQ3N2Um93T2JqZWN0OyAvLyBkaXJlY3RseSBpbXBvcnQganNvbiBvYmplY3QgaW50byBkdWNrZGItd2FzbVxuICAgIH0gZWxzZSBpZiAoaW5wdXRGb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5nZW9qc29uIHx8IGlzR2VvSnNvbihkYXRhKSkge1xuICAgICAgZm9ybWF0ID0gREFUQVNFVF9GT1JNQVRTLmdlb2pzb247XG4gICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzR2VvanNvbjtcbiAgICB9XG4gICAgcmV0dXJuIHtwcm9jZXNzb3IsIGZvcm1hdH07XG4gIH07XG5cbiAgc3RhdGljIGdldElucHV0RGF0YVZhbGlkYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZCA9PiBkO1xuICB9O1xufVxuXG4vKipcbiAqIFRyeSB0byByZXN0b3JlIGdlb2Fycm93IG1ldGFkYXRhIGxvc3QgZHVyaW5nIER1Y2tEYiBpbmdlc3Rpb24uXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gZ2VuZXJhdGUgd3JvbmcgZ2VvbWV0cnkgdHlwZXMuXG4gKiBAcGFyYW0gYXJyb3dUYWJsZSBBcnJvdyB0YWJsZSB0byB1cGRhdGUuXG4gKiBAcGFyYW0gY2FuQ2FzdFNUX2FzV0tCIEEgbWFwIHdpdGggZmllbGRzIHRoYXQgYXJlIGxpa2VseSBpbiBEZWNrREIncyBpbnRlcm5hbCBXQksgZm9ybWF0LlxuICogQHBhcmFtIGFkZFdLQk1ldGFkYXRhIEEgbWFwIHdpdGggZmllbGQgbmFtZXMgdGhhdCB1c3VhbGx5IHVzZWQgdG8gc3RvcmUgV0tCIGdlb21ldHJ5LlxuICovXG5jb25zdCByZXN0b3JlR2VvYXJyb3dNZXRhZGF0YSA9IGFzeW5jIChcbiAgYXJyb3dUYWJsZTogYXJyb3cuVGFibGUsXG4gIGNhbkNhc3RTVF9hc1dLQjogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sXG4gIGFkZFdLQk1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPlxuKSA9PiB7XG4gIGFycm93VGFibGUuc2NoZW1hLmZpZWxkcy5mb3JFYWNoKGYgPT4ge1xuICAgIGlmIChhcnJvdy5EYXRhVHlwZS5pc0JpbmFyeShmLnR5cGUpICYmIChhZGRXS0JNZXRhZGF0YVtmLm5hbWVdIHx8IGNhbkNhc3RTVF9hc1dLQltmLm5hbWVdKSkge1xuICAgICAgZi5tZXRhZGF0YS5zZXQoJ0FSUk9XOmV4dGVuc2lvbjpuYW1lJywgJ2dlb2Fycm93LndrYicpO1xuICAgIH0gZWxzZSBpZiAoaXNHZW9BcnJvd1BvaW50KGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KCdBUlJPVzpleHRlbnNpb246bmFtZScsICdnZW9hcnJvdy5wb2ludCcpO1xuICAgIH0gZWxzZSBpZiAoaXNHZW9BcnJvd0xpbmVTdHJpbmcoZi50eXBlKSkge1xuICAgICAgZi5tZXRhZGF0YS5zZXQoJ0FSUk9XOmV4dGVuc2lvbjpuYW1lJywgJ2dlb2Fycm93LmxpbmVzdHJpbmcnKTtcbiAgICB9IGVsc2UgaWYgKGlzR2VvQXJyb3dQb2x5Z29uKGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KCdBUlJPVzpleHRlbnNpb246bmFtZScsICdnZW9hcnJvdy5wb2x5Z29uJyk7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93TXVsdGlQb2ludChmLnR5cGUpKSB7XG4gICAgICBmLm1ldGFkYXRhLnNldCgnQVJST1c6ZXh0ZW5zaW9uOm5hbWUnLCAnZ2VvYXJyb3cubXVsdGlwb2ludCcpO1xuICAgIH0gZWxzZSBpZiAoaXNHZW9BcnJvd011bHRpTGluZVN0cmluZyhmLnR5cGUpKSB7XG4gICAgICBmLm1ldGFkYXRhLnNldCgnQVJST1c6ZXh0ZW5zaW9uOm5hbWUnLCAnZ2VvYXJyb3cubXVsdGlsaW5lc3RyaW5nJyk7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93TXVsdGlQb2x5Z29uKGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KCdBUlJPVzpleHRlbnNpb246bmFtZScsICdnZW9hcnJvdy5tdWx0aXBvbHlnb24nKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBGb3IgYWxsIGJpbmFyeSBjb2x1bW5zIHRyaWVzIHRvIHRyYW5zZm9ybSBnZW9tZXRyeSBmcm9tIER1Y2tEQidzIGludGVybmFsIGZvcm1hdCBpbnRvIHByb3BlciBXS0IuXG4gKiBAcGFyYW0gcHJvcHNcbiAqIEByZXR1cm5zIEEgbWFwIG9mIGZpZWxkcyB0aGF0IHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0byB2YWxpZCBXS0IuXG4gKi9cbmNvbnN0IHRyeVNUX0FzV0tCID0gYXN5bmMgKHByb3BzOiB7dGFibGVOYW1lOiBzdHJpbmc7IGM6IEFzeW5jRHVja0RCQ29ubmVjdGlvbn0pID0+IHtcbiAgY29uc3Qge2MsIHRhYmxlTmFtZX0gPSBwcm9wcztcblxuICBjb25zdCByZXN1bHRXaXRoU2NoZW1hID0gYXdhaXQgYy5xdWVyeShgXG4gICAgICAgIFNFTEVDVCAqIEZST00gJyR7dGFibGVOYW1lfScgTElNSVQgMDtcbiAgICAgIGApO1xuICBjb25zdCBiaW5hcnlDb2x1bW5zID0gcmVzdWx0V2l0aFNjaGVtYS5zY2hlbWEuZmllbGRzLmZpbHRlcihmID0+IGFycm93LkRhdGFUeXBlLmlzQmluYXJ5KGYudHlwZSkpO1xuXG4gIGNvbnN0IGNhbkNhc3RTVF9hc1dLQjogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgZm9yIChjb25zdCBjb2x1bW4gb2YgYmluYXJ5Q29sdW1ucykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gY29sdW1uLm5hbWU7XG4gICAgICBjb25zdCBxdWVyeSA9IGBTRUxFQ1QgKiBFWENMVURFICR7Y29sdW1uTmFtZX0sIFNUX0FzV0tCKCR7Y29sdW1uTmFtZX0pIGFzICR7Y29sdW1uTmFtZX0gRlJPTSAnJHt0YWJsZU5hbWV9JyBMSU1JVCAxO2A7XG4gICAgICBhd2FpdCBjLnF1ZXJ5KHF1ZXJ5KTtcblxuICAgICAgY2FuQ2FzdFNUX2FzV0tCW2NvbHVtbi5uYW1lXSA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhbkNhc3RTVF9hc1dLQltjb2x1bW4ubmFtZV0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2FuQ2FzdFNUX2FzV0tCO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFdBQUEsR0FBQUgsT0FBQTtBQVNBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGNBQUEsR0FBQUwsT0FBQTtBQU9BLElBQUFNLGlCQUFBLEdBQUFOLE9BQUE7QUFPOEIsU0FBQU8seUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFULHdCQUFBUyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLFFBQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBYyxDQUFBLFVBQUFHLENBQUEsS0FBQUEsQ0FBQSxDQUFBVixHQUFBLElBQUFVLENBQUEsQ0FBQUMsR0FBQSxJQUFBUCxNQUFBLENBQUFDLGNBQUEsQ0FBQUosQ0FBQSxFQUFBTSxDQUFBLEVBQUFHLENBQUEsSUFBQVQsQ0FBQSxDQUFBTSxDQUFBLElBQUFkLENBQUEsQ0FBQWMsQ0FBQSxZQUFBTixDQUFBLGNBQUFSLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQVcsMkJBQUFqQixDQUFBLEVBQUFGLENBQUEsUUFBQUcsQ0FBQSx5QkFBQWlCLE1BQUEsSUFBQWxCLENBQUEsQ0FBQWtCLE1BQUEsQ0FBQUMsUUFBQSxLQUFBbkIsQ0FBQSxxQkFBQUMsQ0FBQSxRQUFBbUIsS0FBQSxDQUFBQyxPQUFBLENBQUFyQixDQUFBLE1BQUFDLENBQUEsR0FBQXFCLDJCQUFBLENBQUF0QixDQUFBLE1BQUFGLENBQUEsSUFBQUUsQ0FBQSx1QkFBQUEsQ0FBQSxDQUFBdUIsTUFBQSxJQUFBdEIsQ0FBQSxLQUFBRCxDQUFBLEdBQUFDLENBQUEsT0FBQXVCLEVBQUEsTUFBQUMsQ0FBQSxZQUFBQSxFQUFBLGVBQUFDLENBQUEsRUFBQUQsQ0FBQSxFQUFBbkIsQ0FBQSxXQUFBQSxFQUFBLFdBQUFrQixFQUFBLElBQUF4QixDQUFBLENBQUF1QixNQUFBLEtBQUFJLElBQUEsV0FBQUEsSUFBQSxNQUFBQyxLQUFBLEVBQUE1QixDQUFBLENBQUF3QixFQUFBLFVBQUExQixDQUFBLFdBQUFBLEVBQUFFLENBQUEsVUFBQUEsQ0FBQSxLQUFBNkIsQ0FBQSxFQUFBSixDQUFBLGdCQUFBSyxTQUFBLGlKQUFBQyxDQUFBLEVBQUF2QixDQUFBLE9BQUFJLENBQUEsZ0JBQUFjLENBQUEsV0FBQUEsRUFBQSxJQUFBekIsQ0FBQSxHQUFBQSxDQUFBLENBQUFhLElBQUEsQ0FBQWQsQ0FBQSxNQUFBTSxDQUFBLFdBQUFBLEVBQUEsUUFBQU4sQ0FBQSxHQUFBQyxDQUFBLENBQUErQixJQUFBLFdBQUF4QixDQUFBLEdBQUFSLENBQUEsQ0FBQTJCLElBQUEsRUFBQTNCLENBQUEsS0FBQUYsQ0FBQSxXQUFBQSxFQUFBRSxDQUFBLElBQUFZLENBQUEsT0FBQW1CLENBQUEsR0FBQS9CLENBQUEsS0FBQTZCLENBQUEsV0FBQUEsRUFBQSxVQUFBckIsQ0FBQSxZQUFBUCxDQUFBLGNBQUFBLENBQUEsOEJBQUFXLENBQUEsUUFBQW1CLENBQUE7QUFBQSxTQUFBVCw0QkFBQXRCLENBQUEsRUFBQVEsQ0FBQSxRQUFBUixDQUFBLDJCQUFBQSxDQUFBLFNBQUFpQyxpQkFBQSxDQUFBakMsQ0FBQSxFQUFBUSxDQUFBLE9BQUFQLENBQUEsTUFBQWlDLFFBQUEsQ0FBQXBCLElBQUEsQ0FBQWQsQ0FBQSxFQUFBbUMsS0FBQSw2QkFBQWxDLENBQUEsSUFBQUQsQ0FBQSxDQUFBb0MsV0FBQSxLQUFBbkMsQ0FBQSxHQUFBRCxDQUFBLENBQUFvQyxXQUFBLENBQUFDLElBQUEsYUFBQXBDLENBQUEsY0FBQUEsQ0FBQSxHQUFBbUIsS0FBQSxDQUFBa0IsSUFBQSxDQUFBdEMsQ0FBQSxvQkFBQUMsQ0FBQSwrQ0FBQXNDLElBQUEsQ0FBQXRDLENBQUEsSUFBQWdDLGlCQUFBLENBQUFqQyxDQUFBLEVBQUFRLENBQUE7QUFBQSxTQUFBeUIsa0JBQUFqQyxDQUFBLEVBQUFRLENBQUEsYUFBQUEsQ0FBQSxJQUFBQSxDQUFBLEdBQUFSLENBQUEsQ0FBQXVCLE1BQUEsTUFBQWYsQ0FBQSxHQUFBUixDQUFBLENBQUF1QixNQUFBLFlBQUF6QixDQUFBLE1BQUFRLENBQUEsR0FBQWMsS0FBQSxDQUFBWixDQUFBLEdBQUFWLENBQUEsR0FBQVUsQ0FBQSxFQUFBVixDQUFBLElBQUFRLENBQUEsQ0FBQVIsQ0FBQSxJQUFBRSxDQUFBLENBQUFGLENBQUEsVUFBQVEsQ0FBQTtBQUFBLFNBQUFrQyxRQUFBMUMsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQVEsTUFBQSxDQUFBZ0MsSUFBQSxDQUFBM0MsQ0FBQSxPQUFBVyxNQUFBLENBQUFpQyxxQkFBQSxRQUFBWCxDQUFBLEdBQUF0QixNQUFBLENBQUFpQyxxQkFBQSxDQUFBNUMsQ0FBQSxHQUFBRSxDQUFBLEtBQUErQixDQUFBLEdBQUFBLENBQUEsQ0FBQVksTUFBQSxXQUFBM0MsQ0FBQSxXQUFBUyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQUUsQ0FBQSxFQUFBNEMsVUFBQSxPQUFBM0MsQ0FBQSxDQUFBNEMsSUFBQSxDQUFBQyxLQUFBLENBQUE3QyxDQUFBLEVBQUE4QixDQUFBLFlBQUE5QixDQUFBO0FBQUEsU0FBQThDLGNBQUFqRCxDQUFBLGFBQUFFLENBQUEsTUFBQUEsQ0FBQSxHQUFBZ0QsU0FBQSxDQUFBekIsTUFBQSxFQUFBdkIsQ0FBQSxVQUFBQyxDQUFBLFdBQUErQyxTQUFBLENBQUFoRCxDQUFBLElBQUFnRCxTQUFBLENBQUFoRCxDQUFBLFFBQUFBLENBQUEsT0FBQXdDLE9BQUEsQ0FBQS9CLE1BQUEsQ0FBQVIsQ0FBQSxPQUFBZ0QsT0FBQSxXQUFBakQsQ0FBQSxRQUFBa0QsZ0JBQUEsYUFBQXBELENBQUEsRUFBQUUsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQVMsTUFBQSxDQUFBMEMseUJBQUEsR0FBQTFDLE1BQUEsQ0FBQTJDLGdCQUFBLENBQUF0RCxDQUFBLEVBQUFXLE1BQUEsQ0FBQTBDLHlCQUFBLENBQUFsRCxDQUFBLEtBQUF1QyxPQUFBLENBQUEvQixNQUFBLENBQUFSLENBQUEsR0FBQWdELE9BQUEsV0FBQWpELENBQUEsSUFBQVMsTUFBQSxDQUFBQyxjQUFBLENBQUFaLENBQUEsRUFBQUUsQ0FBQSxFQUFBUyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLENBQUEsRUFBQUQsQ0FBQSxpQkFBQUYsQ0FBQTtBQUFBLFNBQUF1RCxXQUFBcEQsQ0FBQSxFQUFBOEIsQ0FBQSxFQUFBakMsQ0FBQSxXQUFBaUMsQ0FBQSxPQUFBdUIsZ0JBQUEsYUFBQXZCLENBQUEsT0FBQXdCLDJCQUFBLGFBQUF0RCxDQUFBLEVBQUF1RCx5QkFBQSxLQUFBQyxPQUFBLENBQUFDLFNBQUEsQ0FBQTNCLENBQUEsRUFBQWpDLENBQUEsWUFBQXdELGdCQUFBLGFBQUFyRCxDQUFBLEVBQUFtQyxXQUFBLElBQUFMLENBQUEsQ0FBQWUsS0FBQSxDQUFBN0MsQ0FBQSxFQUFBSCxDQUFBO0FBQUEsU0FBQTBELDBCQUFBLGNBQUF2RCxDQUFBLElBQUEwRCxPQUFBLENBQUFDLFNBQUEsQ0FBQUMsT0FBQSxDQUFBL0MsSUFBQSxDQUFBMkMsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsaUNBQUExRCxDQUFBLGFBQUF1RCx5QkFBQSxZQUFBQSwwQkFBQSxhQUFBdkQsQ0FBQTtBQUFBLFNBQUE2RCxjQUFBN0QsQ0FBQSxFQUFBSCxDQUFBLEVBQUFFLENBQUEsRUFBQStCLENBQUEsUUFBQWdDLENBQUEsT0FBQUMsS0FBQSxpQkFBQVYsZ0JBQUEsaUJBQUF2QixDQUFBLEdBQUE5QixDQUFBLENBQUEyRCxTQUFBLEdBQUEzRCxDQUFBLEdBQUFILENBQUEsRUFBQUUsQ0FBQSxjQUFBK0IsQ0FBQSxhQUFBOUIsQ0FBQSxXQUFBOEQsQ0FBQSxDQUFBakIsS0FBQSxDQUFBOUMsQ0FBQSxFQUFBQyxDQUFBLE9BQUE4RCxDQUFBLElBakM5QjtBQUNBO0FBa0NBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQU1FLGtCQUFrQixHQUFHLE1BQU07QUFDakMsSUFBTUMsaUJBQWlCLEdBQUcsY0FBYzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLCtCQUErQixHQUFHLFVBQVU7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBLElBQU1DLHNCQUFzQixPQUFBbEIsZ0JBQUEsaUJBQUFBLGdCQUFBLGlCQUFBQSxnQkFBQSxpQkFDekJpQiwrQkFBK0IsRUFBRyxJQUFJLEdBQ3RDRixrQkFBa0IsRUFBRyxJQUFJLGVBQ2hCLElBQUksQ0FDZjtBQWVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUksaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFpQkEsQ0FBSUMsT0FBdUIsRUFBRUMsTUFBMkIsRUFBSztFQUNsRixJQUFNQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQ25CRCxNQUFNLENBQUNFLEdBQUcsQ0FBQyxVQUFDQyxLQUFLLEVBQUVDLEtBQUssRUFBSztJQUMzQkgsUUFBUSxDQUFDRSxLQUFLLENBQUNyQyxJQUFJLENBQUMsR0FBR2lDLE9BQU8sQ0FBQ0ssS0FBSyxDQUFDO0VBQ3ZDLENBQUMsQ0FBQztFQUNGLE9BQU8sSUFBSXZGLEtBQUssQ0FBQ3dGLEtBQUssQ0FBQ0osUUFBUSxDQUFDO0FBQ2xDLENBQUM7QUFFRCxJQUFNSyxpQkFBaUI7RUFBQSxJQUFBQyxJQUFBLE9BQUFDLGtCQUFBLDJCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRyxTQUFBQyxRQUFPQyxDQUF3QixFQUFFQyxTQUFpQjtJQUFBLE9BQUFKLFlBQUEsWUFBQUssSUFBQSxVQUFBQyxTQUFBQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUF2RCxJQUFBO1FBQUE7VUFBQXVELFFBQUEsQ0FBQUMsSUFBQTtVQUFBRCxRQUFBLENBQUF2RCxJQUFBO1VBQUEsT0FFbEVtRCxDQUFDLENBQUNNLEtBQUssMkJBQUFDLE1BQUEsQ0FBMEJOLFNBQVMsUUFBSSxDQUFDO1FBQUE7VUFBQUcsUUFBQSxDQUFBdkQsSUFBQTtVQUFBO1FBQUE7VUFBQXVELFFBQUEsQ0FBQUMsSUFBQTtVQUFBRCxRQUFBLENBQUFJLEVBQUEsR0FBQUosUUFBQTtVQUVyREssT0FBTyxDQUFDQyxLQUFLLENBQUMsdUJBQXVCLEVBQUVULFNBQVMsRUFBQUcsUUFBQSxDQUFBSSxFQUFPLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQUosUUFBQSxDQUFBTyxJQUFBO01BQUE7SUFBQSxHQUFBWixPQUFBO0VBQUEsQ0FFNUQ7RUFBQSxnQkFOS0wsaUJBQWlCQSxDQUFBa0IsRUFBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQWxCLElBQUEsQ0FBQWhDLEtBQUEsT0FBQUUsU0FBQTtFQUFBO0FBQUEsR0FNdEI7QUFBQyxJQUVXaUQsbUJBQW1CLEdBQUFDLE9BQUEsQ0FBQUQsbUJBQUEsMEJBQUFFLFlBQUE7RUFNOUIsU0FBQUYsb0JBQVlHLEtBQUssRUFBRTtJQUFBLElBQUFDLGdCQUFBLG1CQUFBSixtQkFBQTtJQUFBLE9BQUE1QyxVQUFBLE9BQUE0QyxtQkFBQSxHQUNYRyxLQUFLO0VBQ2I7RUFBQyxJQUFBRSxVQUFBLGFBQUFMLG1CQUFBLEVBQUFFLFlBQUE7RUFBQSxXQUFBSSxhQUFBLGFBQUFOLG1CQUFBO0lBQUFPLEdBQUE7SUFBQTVFLEtBQUE7TUFBQSxJQUFBNkUsY0FBQSxPQUFBMUIsa0JBQUEsMkJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUVELFNBQUF5QixTQUFBQyxLQUFBO1FBQUEsSUFBQUMsSUFBQSxFQUFBQyxFQUFBLEVBQUExQixDQUFBLEVBQUFaLE1BQUEsRUFBQXVDLElBQUEsRUFBQUMsU0FBQSxFQUFBekMsT0FBQSxFQUFBMEMsY0FBQTtRQUFBLE9BQUFoQyxZQUFBLFlBQUFLLElBQUEsVUFBQTRCLFVBQUFDLFNBQUE7VUFBQSxrQkFBQUEsU0FBQSxDQUFBMUIsSUFBQSxHQUFBMEIsU0FBQSxDQUFBbEYsSUFBQTtZQUFBO2NBQXFCNEUsSUFBSSxHQUFBRCxLQUFBLENBQUpDLElBQUksRUFBRUMsRUFBRSxHQUFBRixLQUFBLENBQUZFLEVBQUUsRUFBRTFCLENBQUMsR0FBQXdCLEtBQUEsQ0FBRHhCLENBQUM7Y0FBQStCLFNBQUEsQ0FBQTFCLElBQUE7Y0FFckJqQixNQUFNLEdBQVVxQyxJQUFJLENBQXBCckMsTUFBTSxFQUFFdUMsSUFBSSxHQUFJRixJQUFJLENBQVpFLElBQUksRUFFbkI7Y0FDQTtjQUNNQyxTQUFTLEdBQUczRixLQUFLLENBQUNDLE9BQU8sQ0FBQ3lGLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUNwQ0EsSUFBSSxDQUFDckMsR0FBRyxDQUFDLFVBQUEwQyxHQUFHLEVBQUk7Z0JBQ2QsSUFBTUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDakJELEdBQUcsQ0FBQ2xFLE9BQU8sQ0FBQyxVQUFDckIsS0FBSyxFQUFFK0MsS0FBSyxFQUFLO2tCQUM1QnlDLE1BQU0sQ0FBQzdDLE1BQU0sQ0FBQ0ksS0FBSyxDQUFDLENBQUN0QyxJQUFJLENBQUMsR0FBR1QsS0FBSztnQkFDcEMsQ0FBQyxDQUFDO2dCQUNGLE9BQU93RixNQUFNO2NBQ2YsQ0FBQyxDQUFDLEdBQ0ZOLElBQUk7Y0FBQUksU0FBQSxDQUFBbEYsSUFBQTtjQUFBLE9BRUY2RSxFQUFFLENBQUNRLGdCQUFnQixDQUFDLElBQUksQ0FBQ0MsRUFBRSxFQUFFQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ1QsU0FBUyxDQUFDLENBQUM7WUFBQTtjQUV2RHpDLE9BQU8sR0FBR0MsTUFBTSxDQUFDa0QsTUFBTSxDQUFDLFVBQUNDLEdBQUcsRUFBRWhELEtBQUssRUFBRUMsS0FBSyxFQUFLO2dCQUNuRDtnQkFDQSxVQUFBZSxNQUFBLENBQVVnQyxHQUFHLEVBQUFoQyxNQUFBLENBQUdmLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsUUFBQWUsTUFBQSxDQUFLaEIsS0FBSyxDQUFDckMsSUFBSSxVQUFBcUQsTUFBQSxDQUFPaEIsS0FBSyxDQUFDaUQsZ0JBQWdCO2NBQ2xGLENBQUMsRUFBRSxFQUFFLENBQUM7Y0FFQVgsY0FBYyw4QkFBQXRCLE1BQUEsQ0FDRixJQUFJLENBQUNrQyxLQUFLLHNEQUFBbEMsTUFBQSxDQUVSLElBQUksQ0FBQzRCLEVBQUUsNENBQUE1QixNQUFBLENBQ0dwQixPQUFPO2NBQUE0QyxTQUFBLENBQUFsRixJQUFBO2NBQUEsT0FFL0JtRCxDQUFDLENBQUNNLEtBQUssQ0FBQ3VCLGNBQWMsQ0FBQztZQUFBO2NBQUFFLFNBQUEsQ0FBQWxGLElBQUE7Y0FBQTtZQUFBO2NBQUFrRixTQUFBLENBQUExQixJQUFBO2NBQUEwQixTQUFBLENBQUF2QixFQUFBLEdBQUF1QixTQUFBO2NBRTdCdEIsT0FBTyxDQUFDaUMsR0FBRyxDQUFDLGVBQWUsRUFBQVgsU0FBQSxDQUFBdkIsRUFBTyxDQUFDO1lBQUM7WUFBQTtjQUFBLE9BQUF1QixTQUFBLENBQUFwQixJQUFBO1VBQUE7UUFBQSxHQUFBWSxRQUFBO01BQUEsQ0FFdkM7TUFBQSxTQWpDS29CLGFBQWFBLENBQUFDLEdBQUE7UUFBQSxPQUFBdEIsY0FBQSxDQUFBM0QsS0FBQSxPQUFBRSxTQUFBO01BQUE7TUFBQSxPQUFiOEUsYUFBYTtJQUFBO0VBQUE7SUFBQXRCLEdBQUE7SUFBQTVFLEtBQUE7TUFBQSxJQUFBb0csa0JBQUEsT0FBQWpELGtCQUFBLDJCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FtQ25CLFNBQUFnRCxTQUFBQyxLQUFBO1FBQUEsSUFBQXRCLElBQUEsRUFBQUMsRUFBQSxFQUFBMUIsQ0FBQSxFQUFBMkIsSUFBQSxFQUFBRSxjQUFBO1FBQUEsT0FBQWhDLFlBQUEsWUFBQUssSUFBQSxVQUFBOEMsVUFBQUMsU0FBQTtVQUFBLGtCQUFBQSxTQUFBLENBQUE1QyxJQUFBLEdBQUE0QyxTQUFBLENBQUFwRyxJQUFBO1lBQUE7Y0FBeUI0RSxJQUFJLEdBQUFzQixLQUFBLENBQUp0QixJQUFJLEVBQUVDLEVBQUUsR0FBQXFCLEtBQUEsQ0FBRnJCLEVBQUUsRUFBRTFCLENBQUMsR0FBQStDLEtBQUEsQ0FBRC9DLENBQUM7Y0FBQWlELFNBQUEsQ0FBQTVDLElBQUE7Y0FFekJzQixJQUFJLEdBQUlGLElBQUksQ0FBWkUsSUFBSTtjQUFBc0IsU0FBQSxDQUFBcEcsSUFBQTtjQUFBLE9BQ0w2RSxFQUFFLENBQUNRLGdCQUFnQixDQUFDLElBQUksQ0FBQ0MsRUFBRSxFQUFFQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ1YsSUFBSSxDQUFDLENBQUM7WUFBQTtjQUVsREUsY0FBYywrRUFBQXRCLE1BQUEsQ0FHRixJQUFJLENBQUNrQyxLQUFLLHFEQUFBbEMsTUFBQSxDQUVWLElBQUksQ0FBQzRCLEVBQUUsaURBQUE1QixNQUFBLENBQ1IsSUFBSSxDQUFDa0MsS0FBSyxnQkFBQWxDLE1BQUEsQ0FBYXhCLGlCQUFpQixZQUFBd0IsTUFBQSxDQUFTdkIsK0JBQStCO2NBQUFpRSxTQUFBLENBQUFwRyxJQUFBO2NBQUEsT0FFM0ZtRCxDQUFDLENBQUNNLEtBQUssQ0FBQ3VCLGNBQWMsQ0FBQztZQUFBO2NBQUFvQixTQUFBLENBQUFwRyxJQUFBO2NBQUE7WUFBQTtjQUFBb0csU0FBQSxDQUFBNUMsSUFBQTtjQUFBNEMsU0FBQSxDQUFBekMsRUFBQSxHQUFBeUMsU0FBQTtjQUU3QnhDLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLG1CQUFtQixFQUFBdUMsU0FBQSxDQUFBekMsRUFBTyxDQUFDO1lBQUM7Y0FBQSxPQUFBeUMsU0FBQSxDQUFBQyxNQUFBLFdBR3JDO2dCQUNMQyxjQUFjLE1BQUFwRixnQkFBQSxpQkFBSWlCLCtCQUErQixFQUFHLElBQUk7Y0FDMUQsQ0FBQztZQUFBO1lBQUE7Y0FBQSxPQUFBaUUsU0FBQSxDQUFBdEMsSUFBQTtVQUFBO1FBQUEsR0FBQW1DLFFBQUE7TUFBQSxDQUNGO01BQUEsU0FyQktNLGlCQUFpQkEsQ0FBQUMsR0FBQTtRQUFBLE9BQUFSLGtCQUFBLENBQUFsRixLQUFBLE9BQUFFLFNBQUE7TUFBQTtNQUFBLE9BQWpCdUYsaUJBQWlCO0lBQUE7RUFBQTtJQUFBL0IsR0FBQTtJQUFBNUUsS0FBQTtNQUFBLElBQUE2RyxnQkFBQSxPQUFBMUQsa0JBQUEsMkJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQXVCdkIsU0FBQXlELFNBQUFDLEtBQUE7UUFBQSxJQUFBL0IsSUFBQSxFQUFBQyxFQUFBLEVBQUExQixDQUFBLEVBQUF5RCxVQUFBLEVBQUFDLFFBQUE7UUFBQSxPQUFBN0QsWUFBQSxZQUFBSyxJQUFBLFVBQUF5RCxVQUFBQyxTQUFBO1VBQUEsa0JBQUFBLFNBQUEsQ0FBQXZELElBQUEsR0FBQXVELFNBQUEsQ0FBQS9HLElBQUE7WUFBQTtjQUF1QjRFLElBQUksR0FBQStCLEtBQUEsQ0FBSi9CLElBQUksRUFBRUMsRUFBRSxHQUFBOEIsS0FBQSxDQUFGOUIsRUFBRSxFQUFFMUIsQ0FBQyxHQUFBd0QsS0FBQSxDQUFEeEQsQ0FBQztjQUFBNEQsU0FBQSxDQUFBdkQsSUFBQTtjQUU5QjtjQUNBO2NBQ01vRCxVQUFVLEdBQ2RoQyxJQUFJLENBQUNFLElBQUksWUFBWTFILEtBQUssQ0FBQ3dGLEtBQUssR0FDNUJnQyxJQUFJLENBQUNFLElBQUksR0FDVHpDLGlCQUFpQixDQUFDdUMsSUFBSSxDQUFDb0MsSUFBSSxJQUFJLEVBQUUsRUFBRXBDLElBQUksQ0FBQ3JDLE1BQU0sQ0FBQztjQUUvQ3NFLFFBQVE7Y0FBQUUsU0FBQSxDQUFBL0csSUFBQTtjQUFBLE9BSVJtRCxDQUFDLENBQUNNLEtBQUssQ0FBQ29ELFFBQVEsQ0FBQztZQUFBO2NBQUFFLFNBQUEsQ0FBQS9HLElBQUE7Y0FBQSxPQUNqQm1ELENBQUMsQ0FBQzhELGdCQUFnQixDQUFDTCxVQUFVLEVBQUU7Z0JBQUN2RyxJQUFJLEVBQUUsSUFBSSxDQUFDdUY7Y0FBSyxDQUFDLENBQUM7WUFBQTtjQUFBbUIsU0FBQSxDQUFBL0csSUFBQTtjQUFBO1lBQUE7Y0FBQStHLFNBQUEsQ0FBQXZELElBQUE7Y0FBQXVELFNBQUEsQ0FBQXBELEVBQUEsR0FBQW9ELFNBQUE7Y0FFeEQ7Y0FDQTtjQUNBbkQsT0FBTyxDQUFDQyxLQUFLLENBQUMsaUJBQWlCLEVBQUFrRCxTQUFBLENBQUFwRCxFQUFPLENBQUM7WUFBQztjQUFBLE9BQUFvRCxTQUFBLENBQUFWLE1BQUEsV0FHbkM7Z0JBQ0xDLGNBQWMsRUFBQXZGLGFBQUEsS0FBTXFCLHNCQUFzQixDQUFDO2dCQUMzQztnQkFDQThFLFlBQVksRUFBRTtjQUNoQixDQUFDO1lBQUE7WUFBQTtjQUFBLE9BQUFILFNBQUEsQ0FBQWpELElBQUE7VUFBQTtRQUFBLEdBQUE0QyxRQUFBO01BQUEsQ0FDRjtNQUFBLFNBMUJLUyxlQUFlQSxDQUFBQyxHQUFBO1FBQUEsT0FBQVgsZ0JBQUEsQ0FBQTNGLEtBQUEsT0FBQUUsU0FBQTtNQUFBO01BQUEsT0FBZm1HLGVBQWU7SUFBQTtJQTRCckI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUpFO0lBQUEzQyxHQUFBO0lBQUE1RSxLQUFBO01BQUEsSUFBQXlILHVCQUFBLE9BQUF0RSxrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBS0EsU0FBQXFFLFNBQXVDMUMsSUFBSTtRQUFBLElBQUFDLEVBQUEsRUFBQTFCLENBQUEsRUFBQUMsU0FBQSxFQUFBbUUsTUFBQSxFQUFBQyxVQUFBLEVBQUFDLFdBQUEsRUFBQUMsV0FBQSxFQUFBQyxVQUFBLEVBQUFDLGFBQUEsRUFBQXJGLE1BQUEsRUFBQXlFLElBQUEsRUFBQWEsWUFBQSxFQUFBQyxLQUFBLEVBQUFDLG9CQUFBLEVBQUF6QixjQUFBLEVBQUEwQixrQkFBQSxFQUFBZCxZQUFBLEVBQUFlLGVBQUEsRUFBQUMsYUFBQSxFQUFBQyxXQUFBO1FBQUEsT0FBQW5GLFlBQUEsWUFBQUssSUFBQSxVQUFBK0UsVUFBQUMsU0FBQTtVQUFBLGtCQUFBQSxTQUFBLENBQUE3RSxJQUFBLEdBQUE2RSxTQUFBLENBQUFySSxJQUFBO1lBQUE7Y0FBQXFJLFNBQUEsQ0FBQXJJLElBQUE7Y0FBQSxPQUN4QixJQUFBc0ksZUFBUyxFQUFDLENBQUM7WUFBQTtjQUF0QnpELEVBQUUsR0FBQXdELFNBQUEsQ0FBQUUsSUFBQTtjQUFBRixTQUFBLENBQUFySSxJQUFBO2NBQUEsT0FDUTZFLEVBQUUsQ0FBQzJELE9BQU8sQ0FBQyxDQUFDO1lBQUE7Y0FBdEJyRixDQUFDLEdBQUFrRixTQUFBLENBQUFFLElBQUE7Y0FFRG5GLFNBQVMsR0FBRyxJQUFJLENBQUN3QyxLQUFLO2NBQUF5QyxTQUFBLENBQUFySSxJQUFBO2NBQUEsT0FDdEI2QyxpQkFBaUIsQ0FBQ00sQ0FBQyxFQUFFQyxTQUFTLENBQUM7WUFBQTtjQUVqQ21FLE1BQU0sR0FBRyxJQUFJLENBQUNrQixRQUFRLENBQUNsQixNQUFNO2NBQ2pDLElBQUksQ0FBQ0EsTUFBTSxFQUFFO2dCQUNYO2dCQUNBLElBQUluSSxLQUFLLENBQUNDLE9BQU8sRUFBQW1JLFVBQUEsR0FBQzVDLElBQUksQ0FBQ0UsSUFBSSxjQUFBMEMsVUFBQSx1QkFBVEEsVUFBQSxDQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBQWtCLFFBQUEsY0FBQWpCLFdBQUEsR0FBTzdDLElBQUksQ0FBQ0UsSUFBSSxjQUFBMkMsV0FBQSx1QkFBVEEsV0FBQSxDQUFZLENBQUMsQ0FBQyxNQUFLLFFBQVEsRUFBRTtrQkFDdkVGLE1BQU0sR0FBR29CLDBCQUFlLENBQUN4RCxHQUFHO2dCQUM5QixDQUFDLE1BQU0sSUFBSSxFQUFBdUMsV0FBQSxHQUFBOUMsSUFBSSxDQUFDRSxJQUFJLGNBQUE0QyxXQUFBLHVCQUFUQSxXQUFBLENBQVdrQixJQUFJLE1BQUssbUJBQW1CLEVBQUU7a0JBQ2xEckIsTUFBTSxHQUFHb0IsMEJBQWUsQ0FBQ0UsT0FBTztnQkFDbEMsQ0FBQyxNQUFNLElBQUksRUFBQWxCLFVBQUEsR0FBQS9DLElBQUksQ0FBQ29DLElBQUksY0FBQVcsVUFBQSx1QkFBVEEsVUFBQSxDQUFZLENBQUMsQ0FBQyxhQUFZdkssS0FBSyxDQUFDMEwsTUFBTSxFQUFFO2tCQUNqRHZCLE1BQU0sR0FBR29CLDBCQUFlLENBQUN2TCxLQUFLO2dCQUNoQztjQUNGO2NBQUMsTUFHR21LLE1BQU0sS0FBS29CLDBCQUFlLENBQUN4RCxHQUFHO2dCQUFBa0QsU0FBQSxDQUFBckksSUFBQTtnQkFBQTtjQUFBO2NBQUFxSSxTQUFBLENBQUFySSxJQUFBO2NBQUEsT0FDMUIsSUFBSSxDQUFDOEYsYUFBYSxDQUFDO2dCQUFDbEIsSUFBSSxFQUFKQSxJQUFJO2dCQUFFQyxFQUFFLEVBQUZBLEVBQUU7Z0JBQUUxQixDQUFDLEVBQURBO2NBQUMsQ0FBQyxDQUFDO1lBQUE7Y0FBQWtGLFNBQUEsQ0FBQXJJLElBQUE7Y0FBQTtZQUFBO2NBQUEsTUFDOUJ1SCxNQUFNLEtBQUtvQiwwQkFBZSxDQUFDRSxPQUFPO2dCQUFBUixTQUFBLENBQUFySSxJQUFBO2dCQUFBO2NBQUE7Y0FBQXFJLFNBQUEsQ0FBQXJJLElBQUE7Y0FBQSxPQUNyQixJQUFJLENBQUN1RyxpQkFBaUIsQ0FBQztnQkFBQzNCLElBQUksRUFBSkEsSUFBSTtnQkFBRUMsRUFBRSxFQUFGQSxFQUFFO2dCQUFFMUIsQ0FBQyxFQUFEQTtjQUFDLENBQUMsQ0FBQztZQUFBO2NBQTNEeUUsYUFBYSxHQUFBUyxTQUFBLENBQUFFLElBQUE7Y0FBQUYsU0FBQSxDQUFBckksSUFBQTtjQUFBO1lBQUE7Y0FBQSxNQUNKdUgsTUFBTSxLQUFLb0IsMEJBQWUsQ0FBQ3ZMLEtBQUs7Z0JBQUFpTCxTQUFBLENBQUFySSxJQUFBO2dCQUFBO2NBQUE7Y0FBQXFJLFNBQUEsQ0FBQXJJLElBQUE7Y0FBQSxPQUNuQixJQUFJLENBQUNtSCxlQUFlLENBQUM7Z0JBQUN2QyxJQUFJLEVBQUpBLElBQUk7Z0JBQUVDLEVBQUUsRUFBRkEsRUFBRTtnQkFBRTFCLENBQUMsRUFBREE7Y0FBQyxDQUFDLENBQUM7WUFBQTtjQUF6RHlFLGFBQWEsR0FBQVMsU0FBQSxDQUFBRSxJQUFBO2NBQUFGLFNBQUEsQ0FBQXJJLElBQUE7Y0FBQTtZQUFBO2NBRWI0RCxPQUFPLENBQUNDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRTBELE1BQU0sQ0FBQztZQUFDO2NBRzNDaEYsTUFBZSxHQUFHLEVBQUU7Y0FDcEJ5RSxJQUFvQixHQUFHLEVBQUU7Y0FBQXFCLFNBQUEsQ0FBQTdFLElBQUE7Y0FBQXNFLEtBQUEsR0FHeUJGLGFBQWEsSUFBSSxDQUFDLENBQUMsRUFBQUcsb0JBQUEsR0FBQUQsS0FBQSxDQUFoRXhCLGNBQWMsRUFBZEEsY0FBYyxHQUFBeUIsb0JBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEsb0JBQUEsRUFBQUMsa0JBQUEsR0FBQUYsS0FBQSxDQUFFWixZQUFZLEVBQVpBLFlBQVksR0FBQWMsa0JBQUEsY0FBRyxLQUFLLEdBQUFBLGtCQUFBLEVBRWhEO2NBQ0E7Y0FBQUssU0FBQSxDQUFBckksSUFBQTtjQUFBLE9BQzhCK0ksV0FBVyxDQUFDO2dCQUFDM0YsU0FBUyxFQUFUQSxTQUFTO2dCQUFFRCxDQUFDLEVBQURBO2NBQUMsQ0FBQyxDQUFDO1lBQUE7Y0FBbkQ4RSxlQUFlLEdBQUFJLFNBQUEsQ0FBQUUsSUFBQTtjQUVmTCxhQUFhLHFCQUFBeEUsTUFBQSxDQUFxQk4sU0FBUztjQUFBaUYsU0FBQSxDQUFBckksSUFBQTtjQUFBLE9BQ3ZCbUQsQ0FBQyxDQUFDTSxLQUFLLENBQUN5RSxhQUFhLENBQUM7WUFBQTtjQUExQ0MsV0FBVyxHQUFBRSxTQUFBLENBQUFFLElBQUE7Y0FFakJTLHVCQUF1QixDQUFDYixXQUFXLEVBQUVGLGVBQWUsRUFBRTNCLGNBQWMsQ0FBQztjQUVyRS9ELE1BQU0sR0FBRzJFLFlBQVksR0FDakIsSUFBQStCLCtCQUFtQixFQUFDZCxXQUFXLENBQUNlLE1BQU0sQ0FBQyxJQUFBckIsWUFBQSxHQUN2Q2pELElBQUksQ0FBQ3JDLE1BQU0sY0FBQXNGLFlBQUEsY0FBQUEsWUFBQSxHQUFJLElBQUFvQiwrQkFBbUIsRUFBQ2QsV0FBVyxDQUFDZSxNQUFNLENBQUM7Y0FDMURsQyxJQUFJLEdBQUcsSUFBQW1DLG1CQUFBLGFBQUkvSixLQUFLLENBQUMrSSxXQUFXLENBQUNpQixPQUFPLENBQUMsQ0FBQzNJLElBQUksQ0FBQyxDQUFDLEVBQ3pDZ0MsR0FBRyxDQUFDLFVBQUExRCxDQUFDO2dCQUFBLE9BQUlvSixXQUFXLENBQUNrQixVQUFVLENBQUN0SyxDQUFDLENBQUM7Y0FBQSxFQUFDLENBQ25DNEIsTUFBTSxDQUFDLFVBQUEySSxHQUFHO2dCQUFBLE9BQUlBLEdBQUc7Y0FBQSxFQUFtQjtjQUFDakIsU0FBQSxDQUFBckksSUFBQTtjQUFBO1lBQUE7Y0FBQXFJLFNBQUEsQ0FBQTdFLElBQUE7Y0FBQTZFLFNBQUEsQ0FBQTFFLEVBQUEsR0FBQTBFLFNBQUE7Y0FFeEM7Y0FDQTtjQUNBekUsT0FBTyxDQUFDQyxLQUFLLENBQUMsNkNBQTZDLEVBQUF3RSxTQUFBLENBQUExRSxFQUFPLENBQUM7WUFBQztjQUFBMEUsU0FBQSxDQUFBckksSUFBQTtjQUFBLE9BR2hFbUQsQ0FBQyxDQUFDb0csS0FBSyxDQUFDLENBQUM7WUFBQTtjQUFBLE9BQUFsQixTQUFBLENBQUFoQyxNQUFBLFdBRVI7Z0JBQUM5RCxNQUFNLEVBQU5BLE1BQU07Z0JBQUV5RSxJQUFJLEVBQUpBO2NBQUksQ0FBQztZQUFBO1lBQUE7Y0FBQSxPQUFBcUIsU0FBQSxDQUFBdkUsSUFBQTtVQUFBO1FBQUEsR0FBQXdELFFBQUE7TUFBQSxDQUN0QjtNQUFBLFNBNURla0Msc0JBQXNCQSxDQUFBQyxHQUFBO1FBQUEsT0FBQXBDLHVCQUFBLENBQUF2RyxLQUFBLE9BQUFFLFNBQUE7TUFBQTtNQUFBLE9BQXRCd0ksc0JBQXNCO0lBQUE7RUFBQTtJQUFBaEYsR0FBQTtJQUFBNUUsS0FBQTtNQUFBLElBQUE4SixXQUFBLE9BQUEzRyxrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBOER0QyxTQUFBMEcsU0FBQUMsS0FBQTtRQUFBLElBQUFoRixJQUFBLEVBQUFpRixxQkFBQSxFQUFBdEgsTUFBQSxFQUFBeUUsSUFBQTtRQUFBLE9BQUFoRSxZQUFBLFlBQUFLLElBQUEsVUFBQXlHLFVBQUFDLFNBQUE7VUFBQSxrQkFBQUEsU0FBQSxDQUFBdkcsSUFBQSxHQUFBdUcsU0FBQSxDQUFBL0osSUFBQTtZQUFBO2NBQWtCNEUsSUFBSSxHQUFBZ0YsS0FBQSxDQUFKaEYsSUFBSTtjQUFBLE1BRWhCLElBQUksQ0FBQ2dFLElBQUksS0FBS29CLHNCQUFXLENBQUNDLFdBQVc7Z0JBQUFGLFNBQUEsQ0FBQS9KLElBQUE7Z0JBQUE7Y0FBQTtjQUN2QzhCLGFBQUEsQ0FBQW1DLG1CQUFBLDBCQUFpQjtnQkFBQ1csSUFBSSxFQUFBN0QsYUFBQSxDQUFBQSxhQUFBLEtBQU02RCxJQUFJO2tCQUFFRSxJQUFJLEVBQUU7Z0JBQUU7Y0FBQyxDQUFDO2NBQUUsT0FBQWlGLFNBQUEsQ0FBQTFELE1BQUE7WUFBQTtjQUFBMEQsU0FBQSxDQUFBL0osSUFBQTtjQUFBLE9BSW5CLElBQUksQ0FBQ3dKLHNCQUFzQixDQUFDNUUsSUFBSSxDQUFDO1lBQUE7Y0FBQWlGLHFCQUFBLEdBQUFFLFNBQUEsQ0FBQXhCLElBQUE7Y0FBdkRoRyxNQUFNLEdBQUFzSCxxQkFBQSxDQUFOdEgsTUFBTTtjQUFFeUUsSUFBSSxHQUFBNkMscUJBQUEsQ0FBSjdDLElBQUk7Y0FFbkJsRixhQUFBLENBQUFtQyxtQkFBQSwwQkFBaUI7Z0JBQUNXLElBQUksRUFBRTtrQkFBQ3JDLE1BQU0sRUFBTkEsTUFBTTtrQkFBRXlFLElBQUksRUFBSkEsSUFBSTtrQkFBRWxDLElBQUksRUFBRTtnQkFBRTtjQUFDLENBQUM7WUFBRTtZQUFBO2NBQUEsT0FBQWlGLFNBQUEsQ0FBQWpHLElBQUE7VUFBQTtRQUFBLEdBQUE2RixRQUFBO01BQUEsQ0FDcEQ7TUFBQSxTQVZLTyxVQUFVQSxDQUFBQyxHQUFBO1FBQUEsT0FBQVQsV0FBQSxDQUFBNUksS0FBQSxPQUFBRSxTQUFBO01BQUE7TUFBQSxPQUFWa0osVUFBVTtJQUFBO0VBQUE7SUFBQTFGLEdBQUE7SUFBQTVFLEtBQUE7TUFBQSxJQUFBd0ssT0FBQSxPQUFBckgsa0JBQUEsMkJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQVloQixTQUFBb0gsU0FBYXpGLElBQUk7UUFBQSxJQUFBMEYsc0JBQUEsRUFBQXRELElBQUE7UUFBQSxPQUFBaEUsWUFBQSxZQUFBSyxJQUFBLFVBQUFrSCxVQUFBQyxTQUFBO1VBQUEsa0JBQUFBLFNBQUEsQ0FBQWhILElBQUEsR0FBQWdILFNBQUEsQ0FBQXhLLElBQUE7WUFBQTtjQUFBLE1BRVgsSUFBSSxDQUFDNEksSUFBSSxLQUFLb0Isc0JBQVcsQ0FBQ0MsV0FBVztnQkFBQU8sU0FBQSxDQUFBeEssSUFBQTtnQkFBQTtjQUFBO2NBQ3ZDOEIsYUFBQSxDQUFBbUMsbUJBQUEsMEJBQWlCO2dCQUFDVyxJQUFJLEVBQUpBO2NBQUksQ0FBQztjQUFFLE9BQUE0RixTQUFBLENBQUFuRSxNQUFBLFdBQ2xCLElBQUk7WUFBQTtjQUFBbUUsU0FBQSxDQUFBeEssSUFBQTtjQUFBLE9BR1EsSUFBSSxDQUFDd0osc0JBQXNCLENBQUM1RSxJQUFJLENBQUM7WUFBQTtjQUFBMEYsc0JBQUEsR0FBQUUsU0FBQSxDQUFBakMsSUFBQTtjQUEvQ3ZCLElBQUksR0FBQXNELHNCQUFBLENBQUp0RCxJQUFJO2NBQUEsT0FBQXdELFNBQUEsQ0FBQW5FLE1BQUEsV0FBQXZFLGFBQUEsQ0FBQW1DLG1CQUFBLHNCQUVTO2dCQUFDK0MsSUFBSSxFQUFKQSxJQUFJO2dCQUFFbEMsSUFBSSxFQUFFLEVBQUU7Z0JBQUV2QyxNQUFNLEVBQUU7Y0FBRSxDQUFDO1lBQUE7WUFBQTtjQUFBLE9BQUFpSSxTQUFBLENBQUExRyxJQUFBO1VBQUE7UUFBQSxHQUFBdUcsUUFBQTtNQUFBLENBQ2pEO01BQUEsU0FWS0ksTUFBTUEsQ0FBQUMsR0FBQTtRQUFBLE9BQUFOLE9BQUEsQ0FBQXRKLEtBQUEsT0FBQUUsU0FBQTtNQUFBO01BQUEsT0FBTnlKLE1BQU07SUFBQTtFQUFBO0FBQUEsRUEvSzJCRSxrQkFBVztBQXFOcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQSxJQUFBekosZ0JBQUEsYUFyTmErQyxtQkFBbUIsc0JBMkxKLFVBQVVXLElBQVMsRUFBRWdHLFdBQW9CLEVBQUU7RUFDbkUsSUFBSUMsU0FBUztFQUNiLElBQUl0RCxNQUFNO0VBQ1YsSUFBSXFELFdBQVcsS0FBS2pDLDBCQUFlLENBQUN2TCxLQUFLLElBQUksSUFBQTBOLHVCQUFXLEVBQUNsRyxJQUFJLENBQUMsRUFBRTtJQUM5RDJDLE1BQU0sR0FBR29CLDBCQUFlLENBQUN2TCxLQUFLO0lBQzlCO0lBQ0F5TixTQUFTLEdBQUdFLCtCQUFtQjtFQUNqQyxDQUFDLE1BQU0sSUFBSUgsV0FBVyxLQUFLakMsMEJBQWUsQ0FBQ3FDLFFBQVEsSUFBSSxJQUFBQyx5QkFBYSxFQUFDckcsSUFBSSxDQUFDLEVBQUU7SUFDMUUyQyxNQUFNLEdBQUdvQiwwQkFBZSxDQUFDcUMsUUFBUTtJQUNqQ0gsU0FBUyxHQUFHSywyQ0FBNEI7RUFDMUMsQ0FBQyxNQUFNLElBQUlOLFdBQVcsS0FBS2pDLDBCQUFlLENBQUN4RCxHQUFHLElBQUksSUFBQWdHLHVCQUFXLEVBQUN2RyxJQUFJLENBQUMsRUFBRTtJQUNuRTtJQUNBMkMsTUFBTSxHQUFHb0IsMEJBQWUsQ0FBQ3hELEdBQUc7SUFDNUIwRixTQUFTLEdBQUdPLGtDQUFtQixDQUFDLENBQUM7RUFDbkMsQ0FBQyxNQUFNLElBQUlSLFdBQVcsS0FBS2pDLDBCQUFlLENBQUNFLE9BQU8sSUFBSSxJQUFBd0MscUJBQVMsRUFBQ3pHLElBQUksQ0FBQyxFQUFFO0lBQ3JFMkMsTUFBTSxHQUFHb0IsMEJBQWUsQ0FBQ0UsT0FBTztJQUNoQ2dDLFNBQVMsR0FBR1MsNkJBQWM7RUFDNUI7RUFDQSxPQUFPO0lBQUNULFNBQVMsRUFBVEEsU0FBUztJQUFFdEQsTUFBTSxFQUFOQTtFQUFNLENBQUM7QUFDNUIsQ0FBQztBQUFBLElBQUFyRyxnQkFBQSxhQTlNVStDLG1CQUFtQiwyQkFnTkMsWUFBWTtFQUN6QyxPQUFPLFVBQUFzSCxDQUFDO0lBQUEsT0FBSUEsQ0FBQztFQUFBO0FBQ2YsQ0FBQztBQVVILElBQU12Qyx1QkFBdUI7RUFBQSxJQUFBd0MsS0FBQSxPQUFBekksa0JBQUEsMkJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFHLFNBQUF3SSxTQUM5QjdFLFVBQXVCLEVBQ3ZCcUIsZUFBd0MsRUFDeEMzQixjQUF1QztJQUFBLE9BQUF0RCxZQUFBLFlBQUFLLElBQUEsVUFBQXFJLFVBQUFDLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBbkksSUFBQSxHQUFBbUksU0FBQSxDQUFBM0wsSUFBQTtRQUFBO1VBRXZDNEcsVUFBVSxDQUFDc0MsTUFBTSxDQUFDM0csTUFBTSxDQUFDdEIsT0FBTyxDQUFDLFVBQUFwQixDQUFDLEVBQUk7WUFDcEMsSUFBSXpDLEtBQUssQ0FBQ3dPLFFBQVEsQ0FBQ0MsUUFBUSxDQUFDaE0sQ0FBQyxDQUFDK0ksSUFBSSxDQUFDLEtBQUt0QyxjQUFjLENBQUN6RyxDQUFDLENBQUNRLElBQUksQ0FBQyxJQUFJNEgsZUFBZSxDQUFDcEksQ0FBQyxDQUFDUSxJQUFJLENBQUMsQ0FBQyxFQUFFO2NBQzFGUixDQUFDLENBQUM0SSxRQUFRLENBQUN6SixHQUFHLENBQUMsc0JBQXNCLEVBQUUsY0FBYyxDQUFDO1lBQ3hELENBQUMsTUFBTSxJQUFJLElBQUE4TSxpQ0FBZSxFQUFDak0sQ0FBQyxDQUFDK0ksSUFBSSxDQUFDLEVBQUU7Y0FDbEMvSSxDQUFDLENBQUM0SSxRQUFRLENBQUN6SixHQUFHLENBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUM7WUFDMUQsQ0FBQyxNQUFNLElBQUksSUFBQStNLHNDQUFvQixFQUFDbE0sQ0FBQyxDQUFDK0ksSUFBSSxDQUFDLEVBQUU7Y0FDdkMvSSxDQUFDLENBQUM0SSxRQUFRLENBQUN6SixHQUFHLENBQUMsc0JBQXNCLEVBQUUscUJBQXFCLENBQUM7WUFDL0QsQ0FBQyxNQUFNLElBQUksSUFBQWdOLG1DQUFpQixFQUFDbk0sQ0FBQyxDQUFDK0ksSUFBSSxDQUFDLEVBQUU7Y0FDcEMvSSxDQUFDLENBQUM0SSxRQUFRLENBQUN6SixHQUFHLENBQUMsc0JBQXNCLEVBQUUsa0JBQWtCLENBQUM7WUFDNUQsQ0FBQyxNQUFNLElBQUksSUFBQWlOLHNDQUFvQixFQUFDcE0sQ0FBQyxDQUFDK0ksSUFBSSxDQUFDLEVBQUU7Y0FDdkMvSSxDQUFDLENBQUM0SSxRQUFRLENBQUN6SixHQUFHLENBQUMsc0JBQXNCLEVBQUUscUJBQXFCLENBQUM7WUFDL0QsQ0FBQyxNQUFNLElBQUksSUFBQWtOLDJDQUF5QixFQUFDck0sQ0FBQyxDQUFDK0ksSUFBSSxDQUFDLEVBQUU7Y0FDNUMvSSxDQUFDLENBQUM0SSxRQUFRLENBQUN6SixHQUFHLENBQUMsc0JBQXNCLEVBQUUsMEJBQTBCLENBQUM7WUFDcEUsQ0FBQyxNQUFNLElBQUksSUFBQW1OLHdDQUFzQixFQUFDdE0sQ0FBQyxDQUFDK0ksSUFBSSxDQUFDLEVBQUU7Y0FDekMvSSxDQUFDLENBQUM0SSxRQUFRLENBQUN6SixHQUFHLENBQUMsc0JBQXNCLEVBQUUsdUJBQXVCLENBQUM7WUFDakU7VUFDRixDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQTJNLFNBQUEsQ0FBQTdILElBQUE7TUFBQTtJQUFBLEdBQUEySCxRQUFBO0VBQUEsQ0FDSjtFQUFBLGdCQXRCS3pDLHVCQUF1QkEsQ0FBQW9ELEdBQUEsRUFBQUMsSUFBQSxFQUFBQyxJQUFBO0lBQUEsT0FBQWQsS0FBQSxDQUFBMUssS0FBQSxPQUFBRSxTQUFBO0VBQUE7QUFBQSxHQXNCNUI7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU0rSCxXQUFXO0VBQUEsSUFBQXdELEtBQUEsT0FBQXhKLGtCQUFBLDJCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRyxTQUFBdUosU0FBT3BJLEtBQW9EO0lBQUEsSUFBQWpCLENBQUEsRUFBQUMsU0FBQSxFQUFBcUosZ0JBQUEsRUFBQUMsYUFBQSxFQUFBekUsZUFBQSxFQUFBMEUsU0FBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsRUFBQUMsVUFBQSxFQUFBckosS0FBQTtJQUFBLE9BQUFULFlBQUEsWUFBQUssSUFBQSxVQUFBMEosVUFBQUMsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUF4SixJQUFBLEdBQUF3SixTQUFBLENBQUFoTixJQUFBO1FBQUE7VUFDdEVtRCxDQUFDLEdBQWVpQixLQUFLLENBQXJCakIsQ0FBQyxFQUFFQyxTQUFTLEdBQUlnQixLQUFLLENBQWxCaEIsU0FBUztVQUFBNEosU0FBQSxDQUFBaE4sSUFBQTtVQUFBLE9BRVltRCxDQUFDLENBQUNNLEtBQUssNkJBQUFDLE1BQUEsQ0FDZk4sU0FBUyx1QkFDM0IsQ0FBQztRQUFBO1VBRkFxSixnQkFBZ0IsR0FBQU8sU0FBQSxDQUFBekUsSUFBQTtVQUdoQm1FLGFBQWEsR0FBR0QsZ0JBQWdCLENBQUN2RCxNQUFNLENBQUMzRyxNQUFNLENBQUM1QixNQUFNLENBQUMsVUFBQWQsQ0FBQztZQUFBLE9BQUl6QyxLQUFLLENBQUN3TyxRQUFRLENBQUNDLFFBQVEsQ0FBQ2hNLENBQUMsQ0FBQytJLElBQUksQ0FBQztVQUFBLEVBQUM7VUFFM0ZYLGVBQXdDLEdBQUcsQ0FBQyxDQUFDO1VBQUEwRSxTQUFBLEdBQUExTiwwQkFBQSxDQUM5QnlOLGFBQWE7VUFBQU0sU0FBQSxDQUFBeEosSUFBQTtVQUFBbUosU0FBQSxDQUFBak4sQ0FBQTtRQUFBO1VBQUEsS0FBQWtOLEtBQUEsR0FBQUQsU0FBQSxDQUFBck8sQ0FBQSxJQUFBcUIsSUFBQTtZQUFBcU4sU0FBQSxDQUFBaE4sSUFBQTtZQUFBO1VBQUE7VUFBdkI2TSxNQUFNLEdBQUFELEtBQUEsQ0FBQWhOLEtBQUE7VUFBQW9OLFNBQUEsQ0FBQXhKLElBQUE7VUFFUHNKLFVBQVUsR0FBR0QsTUFBTSxDQUFDeE0sSUFBSTtVQUN4Qm9ELEtBQUssdUJBQUFDLE1BQUEsQ0FBdUJvSixVQUFVLGlCQUFBcEosTUFBQSxDQUFjb0osVUFBVSxXQUFBcEosTUFBQSxDQUFRb0osVUFBVSxhQUFBcEosTUFBQSxDQUFVTixTQUFTO1VBQUE0SixTQUFBLENBQUFoTixJQUFBO1VBQUEsT0FDbkdtRCxDQUFDLENBQUNNLEtBQUssQ0FBQ0EsS0FBSyxDQUFDO1FBQUE7VUFFcEJ3RSxlQUFlLENBQUM0RSxNQUFNLENBQUN4TSxJQUFJLENBQUMsR0FBRyxJQUFJO1VBQUMyTSxTQUFBLENBQUFoTixJQUFBO1VBQUE7UUFBQTtVQUFBZ04sU0FBQSxDQUFBeEosSUFBQTtVQUFBd0osU0FBQSxDQUFBckosRUFBQSxHQUFBcUosU0FBQTtVQUVwQy9FLGVBQWUsQ0FBQzRFLE1BQU0sQ0FBQ3hNLElBQUksQ0FBQyxHQUFHLEtBQUs7UUFBQztVQUFBMk0sU0FBQSxDQUFBaE4sSUFBQTtVQUFBO1FBQUE7VUFBQWdOLFNBQUEsQ0FBQWhOLElBQUE7VUFBQTtRQUFBO1VBQUFnTixTQUFBLENBQUF4SixJQUFBO1VBQUF3SixTQUFBLENBQUFDLEVBQUEsR0FBQUQsU0FBQTtVQUFBTCxTQUFBLENBQUE3TyxDQUFBLENBQUFrUCxTQUFBLENBQUFDLEVBQUE7UUFBQTtVQUFBRCxTQUFBLENBQUF4SixJQUFBO1VBQUFtSixTQUFBLENBQUE5TSxDQUFBO1VBQUEsT0FBQW1OLFNBQUEsQ0FBQUUsTUFBQTtRQUFBO1VBQUEsT0FBQUYsU0FBQSxDQUFBM0csTUFBQSxXQUlsQzRCLGVBQWU7UUFBQTtRQUFBO1VBQUEsT0FBQStFLFNBQUEsQ0FBQWxKLElBQUE7TUFBQTtJQUFBLEdBQUEwSSxRQUFBO0VBQUEsQ0FDdkI7RUFBQSxnQkF0Qkt6RCxXQUFXQSxDQUFBb0UsSUFBQTtJQUFBLE9BQUFaLEtBQUEsQ0FBQXpMLEtBQUEsT0FBQUUsU0FBQTtFQUFBO0FBQUEsR0FzQmhCIiwiaWdub3JlTGlzdCI6W119
458
+ var restoreGeoarrowMetadata = exports.restoreGeoarrowMetadata = function restoreGeoarrowMetadata(arrowTable, geoarrowMetadata) {
459
+ arrowTable.schema.fields.forEach(function (f) {
460
+ if (arrow.DataType.isBinary(f.type) && geoarrowMetadata[f.name]) {
461
+ f.metadata.set(_constants.GEOARROW_METADATA_KEY, geoarrowMetadata[f.name]);
462
+ } else if ((0, _duckdbTableUtils.isGeoArrowPoint)(f.type)) {
463
+ f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.POINT);
464
+ } else if ((0, _duckdbTableUtils.isGeoArrowLineString)(f.type)) {
465
+ f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.LINESTRING);
466
+ } else if ((0, _duckdbTableUtils.isGeoArrowPolygon)(f.type)) {
467
+ f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.POLYGON);
468
+ } else if ((0, _duckdbTableUtils.isGeoArrowMultiPoint)(f.type)) {
469
+ f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.MULTIPOINT);
470
+ } else if ((0, _duckdbTableUtils.isGeoArrowMultiLineString)(f.type)) {
471
+ f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.MULTILINESTRING);
472
+ } else if ((0, _duckdbTableUtils.isGeoArrowMultiPolygon)(f.type)) {
473
+ f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.MULTIPOLYGON);
474
+ }
475
+ });
476
+ };
477
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfcHJvY2Vzc29ycyIsIl90YWJsZSIsIl91dGlscyIsIl9kYXRhUHJvY2Vzc29yIiwiX2R1Y2tkYlRhYmxlVXRpbHMiLCJfZHVja2RiVGFibGVVdGlsczIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YzIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwiRFVDS0RCX0dFT01fQ09MVU1OIiwiRFVDS0RCX1dLQl9DT0xVTU4iLCJLRVBMRVJfR0VPTV9GUk9NX0dFT0pTT05fQ09MVU1OIiwiU1VHR0VTVEVEX0dFT01fQ09MVU1OUyIsIkdFT0FSUk9XX0VYVEVOU0lPTlMiLCJXS0IiLCJLZXBsZXJHbER1Y2tEYlRhYmxlIiwiZXhwb3J0cyIsIl9LZXBsZXJUYWJsZSIsInByb3BzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJfaW1wb3J0Um93RGF0YSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZiIsImRhdGEiLCJkYiIsImMiLCJmaWVsZHMiLCJyb3dzIiwicm93c0ZvckRiIiwiY29sdW1ucyIsImNyZWF0ZVRhYmxlU3FsIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsInJvdyIsIm5ld1JvdyIsImluZGV4IiwibmFtZSIsInJlZ2lzdGVyRmlsZVRleHQiLCJpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZWR1Y2UiLCJhY2MiLCJmaWVsZCIsImNvbmNhdCIsImR1Y2tEQkNvbHVtblR5cGUiLCJsYWJlbCIsInF1ZXJ5IiwidDAiLCJjb25zb2xlIiwibG9nIiwic3RvcCIsImltcG9ydFJvd0RhdGEiLCJfeCIsIl9pbXBvcnRHZW9Kc29uRGF0YSIsIl9jYWxsZWUyIiwiX3JlZjIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJlcnJvciIsImFicnVwdCIsImdlb2Fycm93TWV0YWRhdGEiLCJpbXBvcnRHZW9Kc29uRGF0YSIsIl94MiIsIl9pbXBvcnRBcnJvd0RhdGEiLCJfY2FsbGVlMyIsIl9yZWYzIiwiYWRqdXN0ZWRNZXRhZGF0YSIsImFycm93VGFibGUiLCJzZXR1cFNxbCIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsIlRhYmxlIiwicmVzdG9yZUFycm93VGFibGUiLCJjb2xzIiwiYXJyb3dTY2hlbWEiLCJyZW1vdmVVbnN1cHBvcnRlZEV4dGVuc2lvbnMiLCJpbnNlcnRBcnJvd1RhYmxlIiwicmVzdG9yZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyIsInVzZU5ld0ZpZWxkcyIsImltcG9ydEFycm93RGF0YSIsIl94MyIsIl9jcmVhdGVUYWJsZUFuZEdldEFycm93IiwiX2NhbGxlZTQiLCJ0YWJsZU5hbWUiLCJmb3JtYXQiLCJfZGF0YSRyb3dzIiwiX2RhdGEkcm93czIiLCJfZGF0YSRyb3dzMyIsIl9kYXRhJGNvbHMiLCJpbXBvcnREZXRhaWxzIiwiX2RhdGEkZmllbGRzIiwiX3JlZjQiLCJfcmVmNCRnZW9hcnJvd01ldGFkYXQiLCJfcmVmNCR1c2VOZXdGaWVsZHMiLCJkdWNrRGJDb2x1bW5zIiwidGFibGVEdWNrREJUeXBlcyIsImNvbHVtbnNUb0NvbnZlcnRUb1dLQiIsImFkanVzdGVkUXVlcnkiLCJhcnJvd1Jlc3VsdCIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiZGF0YWJhc2UiLCJzZW50IiwiY29ubmVjdCIsImRyb3BUYWJsZUlmRXhpc3RzIiwibWV0YWRhdGEiLCJfdHlwZW9mMiIsIkRBVEFTRVRfRk9STUFUUyIsInR5cGUiLCJnZW9qc29uIiwiVmVjdG9yIiwiZ2V0RHVja0RCQ29sdW1uVHlwZXMiLCJnZXREdWNrREJDb2x1bW5UeXBlc01hcCIsImdldEdlb21ldHJ5Q29sdW1ucyIsImNvbnN0cnVjdFNUX2FzV0tCUXVlcnkiLCJyZXN0b3JlR2VvYXJyb3dNZXRhZGF0YSIsImFycm93U2NoZW1hVG9GaWVsZHMiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwibnVtQ29scyIsImdldENoaWxkQXQiLCJjb2wiLCJjbG9zZSIsImNyZWF0ZVRhYmxlQW5kR2V0QXJyb3ciLCJfeDQiLCJfaW1wb3J0RGF0YSIsIl9jYWxsZWU1IiwiX3JlZjUiLCJfeWllbGQkdGhpcyRjcmVhdGVUYWIiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJEYXRhc2V0VHlwZSIsIlZFQ1RPUl9USUxFIiwiaW1wb3J0RGF0YSIsIl94NSIsIl91cGRhdGUiLCJfY2FsbGVlNiIsIl95aWVsZCR0aGlzJGNyZWF0ZVRhYjIiLCJfY2FsbGVlNiQiLCJfY29udGV4dDYiLCJ1cGRhdGUiLCJfeDYiLCJLZXBsZXJUYWJsZSIsImlucHV0Rm9ybWF0IiwicHJvY2Vzc29yIiwiaXNBcnJvd0RhdGEiLCJwcm9jZXNzQXJyb3dCYXRjaGVzIiwia2VwbGVyZ2wiLCJpc0tlcGxlckdsTWFwIiwicHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYiIsImlzUm93T2JqZWN0IiwicHJvY2Vzc0NzdlJvd09iamVjdCIsImlzR2VvSnNvbiIsInByb2Nlc3NHZW9qc29uIiwiZCIsInNjaGVtYSIsImYiLCJEYXRhVHlwZSIsImlzQmluYXJ5IiwiR0VPQVJST1dfTUVUQURBVEFfS0VZIiwiaXNHZW9BcnJvd1BvaW50IiwiUE9JTlQiLCJpc0dlb0Fycm93TGluZVN0cmluZyIsIkxJTkVTVFJJTkciLCJpc0dlb0Fycm93UG9seWdvbiIsIlBPTFlHT04iLCJpc0dlb0Fycm93TXVsdGlQb2ludCIsIk1VTFRJUE9JTlQiLCJpc0dlb0Fycm93TXVsdGlMaW5lU3RyaW5nIiwiTVVMVElMSU5FU1RSSU5HIiwiaXNHZW9BcnJvd011bHRpUG9seWdvbiIsIk1VTFRJUE9MWUdPTiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS9kdWNrZGItdGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcblxuaW1wb3J0IHtcbiAgRGF0YXNldFR5cGUsXG4gIERBVEFTRVRfRk9STUFUUyxcbiAgR0VPQVJST1dfRVhURU5TSU9OUyxcbiAgR0VPQVJST1dfTUVUQURBVEFfS0VZXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGFycm93U2NoZW1hVG9GaWVsZHMsXG4gIGlzQXJyb3dEYXRhLFxuICBpc0dlb0pzb24sXG4gIGlzS2VwbGVyR2xNYXAsXG4gIGlzUm93T2JqZWN0LFxuICBwcm9jZXNzQXJyb3dCYXRjaGVzXG59IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7RmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtnZXRBcHBsaWNhdGlvbkNvbmZpZywgRGF0YWJhc2VBZGFwdGVyLCBEYXRhYmFzZUNvbm5lY3Rpb259IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBwcm9jZXNzQ3N2Um93T2JqZWN0LFxuICBwcm9jZXNzR2VvanNvbixcbiAgcHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYixcbiAgUHJvY2Vzc29yUmVzdWx0XG59IGZyb20gJy4uL3Byb2Nlc3NvcnMvZGF0YS1wcm9jZXNzb3InO1xuXG5pbXBvcnQge1xuICBpc0dlb0Fycm93UG9pbnQsXG4gIGlzR2VvQXJyb3dMaW5lU3RyaW5nLFxuICBpc0dlb0Fycm93UG9seWdvbixcbiAgaXNHZW9BcnJvd011bHRpUG9pbnQsXG4gIGlzR2VvQXJyb3dNdWx0aUxpbmVTdHJpbmcsXG4gIGlzR2VvQXJyb3dNdWx0aVBvbHlnb25cbn0gZnJvbSAnLi9kdWNrZGItdGFibGUtdXRpbHMnO1xuXG5pbXBvcnQge1xuICBjb25zdHJ1Y3RTVF9hc1dLQlF1ZXJ5LFxuICBkcm9wVGFibGVJZkV4aXN0cyxcbiAgZ2V0RHVja0RCQ29sdW1uVHlwZXMsXG4gIGdldER1Y2tEQkNvbHVtblR5cGVzTWFwLFxuICBnZXRHZW9tZXRyeUNvbHVtbnMsXG4gIHJlbW92ZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyxcbiAgcmVzdG9yZUFycm93VGFibGUsXG4gIHJlc3RvcmVVbnN1cHBvcnRlZEV4dGVuc2lvbnNcbn0gZnJvbSAnLi4vdGFibGUvZHVja2RiLXRhYmxlLXV0aWxzJztcblxuLy8gVE9ETyB1c2UgZmlsZXMgZnJvbSBkaXNrIG9yIHVybCBkaXJlY3RseSwgd2l0aG91dCBwYXJzaW5nIGJ5IGxvYWRlcnMgYW5kIHRoZW4gaW5nZWN0aW9uIGludG8gRGVja0RiXG5cbi8qKlxuICogRGVmYXVsdCBEdWNrRGIgZ2VvbWV0cnkgY29sdW1ucyBjcmVhdGVkIGJ5IFNUX1JFQURcbiAqL1xuY29uc3QgRFVDS0RCX0dFT01fQ09MVU1OID0gJ2dlb20nO1xuY29uc3QgRFVDS0RCX1dLQl9DT0xVTU4gPSAnd2tiX2dlb21ldHJ5JztcblxuLyoqXG4gRGVmYXVsdCBjb2x1bW4gbmFtZSBmb3IgcHJvY2Vzc2VkIGdlb2pzb24gaW4gS2VwbGVyLlxuIFVzZSB0aGlzIG5hbWUgdG8gcmVuYW1lIGRlZmF1bHQgJ2dlb20nIGNvbHVtbiBmcm9tIER1Y2tEYlxuIGluIG9yZGVyIHRvIHN1cHBvcnQgS2VwbGVyIG1hcHMgc2F2ZWQgYmVmb3JlIGludHJvZHVjdGlvbiBvZiBEdWNrRGIgcGx1Z2luLlxuICovXG5jb25zdCBLRVBMRVJfR0VPTV9GUk9NX0dFT0pTT05fQ09MVU1OID0gJ19nZW9qc29uJztcblxuLyoqXG4gKiBOYW1lcyBvZiBjb2x1bW5zIHRoYXQgbW9zdCBsaWtlbHkgY29udGFpbiBiaW5hcnkgd2tiIGdlb21ldHJ5XG4gKi9cbmNvbnN0IFNVR0dFU1RFRF9HRU9NX0NPTFVNTlMgPSB7XG4gIFtLRVBMRVJfR0VPTV9GUk9NX0dFT0pTT05fQ09MVU1OXTogR0VPQVJST1dfRVhURU5TSU9OUy5XS0IsXG4gIFtEVUNLREJfR0VPTV9DT0xVTU5dOiBHRU9BUlJPV19FWFRFTlNJT05TLldLQixcbiAgZ2VvbWV0cnk6IEdFT0FSUk9XX0VYVEVOU0lPTlMuV0tCXG59O1xuXG50eXBlIEltcG9ydERhdGFUb0R1Y2tQcm9wcyA9IHtcbiAgZGF0YTogUHJvY2Vzc29yUmVzdWx0ICYge2Fycm93U2NoZW1hOiBhcnJvdy5TY2hlbWF9O1xuICBkYjogRGF0YWJhc2VBZGFwdGVyO1xuICBjOiBEYXRhYmFzZUNvbm5lY3Rpb247XG59O1xuXG50eXBlIEltcG9ydERhdGFUb0R1Y2tSZXN1bHQgPSB7XG4gIC8vIER1Y2tEYiBkcm9wcyBnZW9hcnJvdyBtZXRhZGF0YSwgc28gdHJ5IHRvIHByZXNlcnZlIGFuZCB0aGVuIHJlc3RvcmUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gIGdlb2Fycm93TWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvLyBVc2UgZmllbGRzIGZyb20gYXJyb3cgdGFibGUgZXZlbiBpZiBmaWVsZHMgYXJlIHByb3ZpZGVkXG4gIHVzZU5ld0ZpZWxkcz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgS2VwbGVyR2xEdWNrRGJUYWJsZSBleHRlbmRzIEtlcGxlclRhYmxlIHtcbiAgZGVjbGFyZSByZWFkb25seSBpZDogc3RyaW5nO1xuICBkZWNsYXJlIGxhYmVsOiBzdHJpbmc7XG4gIGRlY2xhcmUgdHlwZTogc3RyaW5nO1xuICBkZWNsYXJlIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG5cbiAgYXN5bmMgaW1wb3J0Um93RGF0YSh7ZGF0YSwgZGIsIGN9OiBJbXBvcnREYXRhVG9EdWNrUHJvcHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge2ZpZWxkcywgcm93c30gPSBkYXRhO1xuXG4gICAgICAvLyBEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2wgbG9hZHMgZGF0YSBhcyBhbnlbXVtdIGluc3RlYWQgb2YgW3t9XVxuICAgICAgLy8gVE9ETyBwb3RlbnRpYWwgbWVtb3J5IHVzYWdlIGV4cGxvc2lvbjogb3JpZ2luYWwgZGF0YSwgbmV3IG9iamVjdCBhbmQgdGhlbiBEdWNrRGIgdGFibGVcbiAgICAgIGNvbnN0IHJvd3NGb3JEYiA9IEFycmF5LmlzQXJyYXkocm93c1swXSlcbiAgICAgICAgPyByb3dzLm1hcChyb3cgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0ge307XG4gICAgICAgICAgICByb3cuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIG5ld1Jvd1tmaWVsZHNbaW5kZXhdLm5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXdSb3c7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiByb3dzO1xuXG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVUZXh0KHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHJvd3NGb3JEYikpO1xuXG4gICAgICBjb25zdCBjb2x1bW5zID0gZmllbGRzLnJlZHVjZSgoYWNjLCBmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPIGV4dGVuZCBmaWVsZHMgdG8gY29udGFpbiBkdWNrREJDb2x1bW5UeXBlXG4gICAgICAgIHJldHVybiBgJHthY2N9JHtpbmRleCA+IDAgPyAnLCcgOiAnJ30gJyR7ZmllbGQubmFtZX0nOiAnJHtmaWVsZC5kdWNrREJDb2x1bW5UeXBlfSdgO1xuICAgICAgfSwgJycpO1xuXG4gICAgICBjb25zdCBjcmVhdGVUYWJsZVNxbCA9IGBcbiAgICAgICAgQ1JFQVRFIFRBQkxFICcke3RoaXMubGFiZWx9JyBBU1xuICAgICAgICBTRUxFQ1QgKlxuICAgICAgICBGUk9NIHJlYWRfanNvbignJHt0aGlzLmlkfScsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSB7JHtjb2x1bW5zfX0pO1xuICAgICAgYDtcbiAgICAgIGF3YWl0IGMucXVlcnkoY3JlYXRlVGFibGVTcWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygnaW1wb3J0Um93RGF0YScsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbXBvcnRHZW9Kc29uRGF0YSh7ZGF0YSwgZGIsIGN9OiBJbXBvcnREYXRhVG9EdWNrUHJvcHMpOiBQcm9taXNlPEltcG9ydERhdGFUb0R1Y2tSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge3Jvd3N9ID0gZGF0YTtcbiAgICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZVRleHQodGhpcy5pZCwgSlNPTi5zdHJpbmdpZnkocm93cykpO1xuXG4gICAgICBjb25zdCBjcmVhdGVUYWJsZVNxbCA9IGBcbiAgICAgICAgaW5zdGFsbCBzcGF0aWFsO1xuICAgICAgICBsb2FkIHNwYXRpYWw7XG4gICAgICAgIENSRUFURSBUQUJMRSAnJHt0aGlzLmxhYmVsfScgQVMgXG4gICAgICAgIFNFTEVDVCAqXG4gICAgICAgIEZST00gU1RfUkVBRCgnJHt0aGlzLmlkfScsIGtlZXBfd2tiID0gVFJVRSk7XG4gICAgICAgIEFMVEVSIFRBQkxFICcke3RoaXMubGFiZWx9JyBSRU5BTUUgJyR7RFVDS0RCX1dLQl9DT0xVTU59JyBUTyAnJHtLRVBMRVJfR0VPTV9GUk9NX0dFT0pTT05fQ09MVU1OfSc7XG4gICAgICBgO1xuICAgICAgYXdhaXQgYy5xdWVyeShjcmVhdGVUYWJsZVNxbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ltcG9ydEdlb0pzb25EYXRhJywgZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvLyBfZ2VvanNvbiBjb2x1bW4gaXMgY3JlYXRlZCBmcm9tIGdlb21ldHJ5IHdpdGgga2VlcF93a2IgZmxhZyBhbmQgY29udGFpbnMgdmFsaWQgV0tCIGRhdGEuXG4gICAgICBnZW9hcnJvd01ldGFkYXRhOiB7W0tFUExFUl9HRU9NX0ZST01fR0VPSlNPTl9DT0xVTU5dOiBHRU9BUlJPV19FWFRFTlNJT05TLldLQn1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaW1wb3J0QXJyb3dEYXRhKHtkYXRhLCBjfTogSW1wb3J0RGF0YVRvRHVja1Byb3BzKTogUHJvbWlzZTxJbXBvcnREYXRhVG9EdWNrUmVzdWx0PiB7XG4gICAgbGV0IGFkanVzdGVkTWV0YWRhdGEgPSB7fTtcbiAgICB0cnkge1xuICAgICAgLy8gMSkgZGF0YS5yb3dzIGNvbnRhaW5zIGFuIGFycm93IHRhYmxlIGNyZWF0ZWQgYnkgQWRkIHRvIE1hcCBkYXRhIGZyb20gRHVja0RiIHF1ZXJ5LlxuICAgICAgLy8gMikgYXJyb3cgdGFibGUgaXMgaW4gY29scyAmIGZpZWxkcyB3aGVuIGEgZmlsZSBpcyBkcmFnZ2VkICYgZHJvcHBlZCBpbnRvIEFkZCBEYXRhIFRvIE1hcCBkaWFsb2cuXG4gICAgICBjb25zdCBhcnJvd1RhYmxlID1cbiAgICAgICAgZGF0YS5yb3dzIGluc3RhbmNlb2YgYXJyb3cuVGFibGVcbiAgICAgICAgICA/IGRhdGEucm93c1xuICAgICAgICAgIDogcmVzdG9yZUFycm93VGFibGUoZGF0YS5jb2xzIHx8IFtdLCBkYXRhLmZpZWxkcywgZGF0YS5hcnJvd1NjaGVtYSk7XG5cbiAgICAgIC8vIHJlbW92ZSB1bnN1cHBvcnRlZCBleHRlbnNpb25zIGZyb20gYW4gYXJyb3cgdGFibGUgdGhhdCB0aHJvdyBleGNlcHRpb25zIGluIER1Y2tEQi5cbiAgICAgIGFkanVzdGVkTWV0YWRhdGEgPSByZW1vdmVVbnN1cHBvcnRlZEV4dGVuc2lvbnMoYXJyb3dUYWJsZSk7XG5cbiAgICAgIGNvbnN0IHNldHVwU3FsID0gYFxuICAgICAgICBpbnN0YWxsIHNwYXRpYWw7XG4gICAgICAgIGxvYWQgc3BhdGlhbDtcbiAgICAgIGA7XG4gICAgICBhd2FpdCBjLnF1ZXJ5KHNldHVwU3FsKTtcbiAgICAgIGF3YWl0IGMuaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlLCB7bmFtZTogdGhpcy5sYWJlbH0pO1xuXG4gICAgICAvLyByZXN0b3JlIHVuc3VwcG9ydGVkIGV4dGVuc2lvbnMgdGhhdCB0aHJvdyBleGNlcHRpb25zIGluIER1Y2tEYlxuICAgICAgcmVzdG9yZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyhhcnJvd1RhYmxlLCBhZGp1c3RlZE1ldGFkYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gS25vd24gaXNzdWVzOlxuICAgICAgLy8gMSkgQXJyb3cgVHlwZSB3aXRoIGV4dGVuc2lvbiBuYW1lOiBnZW9hcnJvdy5wb2ludCBhbmQgZm9ybWF0OiArdzoyIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIER1Y2tEQi5cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ltcG9ydEFycm93RGF0YScsIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2VvYXJyb3dNZXRhZGF0YTogey4uLlNVR0dFU1RFRF9HRU9NX0NPTFVNTlMsIC4uLmFkanVzdGVkTWV0YWRhdGF9LFxuICAgICAgLy8gdXNlIGZpZWxkcyBnZW5lcmF0ZWQgZnJvbSB0aGUgY3JlYXRlZCBhcnJvdyB0YWJsZVxuICAgICAgdXNlTmV3RmllbGRzOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGFibGUgZnJvbSBkYXRhLCByZXR1cm5zIGFuIGFycm93IHRhYmxlIHdpdGggdGhlIGRhdGFcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8e2ZpZWxkczogRmllbGRbXSwgY29sczogYW55W119Pn1cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVUYWJsZUFuZEdldEFycm93KGRhdGEpOiBQcm9taXNlPHtmaWVsZHM6IGFueVtdOyBjb2xzOiBhcnJvdy5WZWN0b3JbXX0+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkuZGF0YWJhc2U7XG4gICAgaWYgKCFkYikge1xuICAgICAgY29uc29sZS5lcnJvcignVGhlIGRhdGFiYXNlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LicpO1xuICAgICAgcmV0dXJuIHtmaWVsZHM6IFtdLCBjb2xzOiBbXX07XG4gICAgfVxuICAgIGNvbnN0IGMgPSBhd2FpdCBkYi5jb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmxhYmVsO1xuICAgIGF3YWl0IGRyb3BUYWJsZUlmRXhpc3RzKGMsIHRhYmxlTmFtZSk7XG5cbiAgICBsZXQgZm9ybWF0ID0gdGhpcy5tZXRhZGF0YS5mb3JtYXQ7XG4gICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgIC8vIGZvcm1hdCBpcyBtaXNzaW5nIHdoZW4gd2UgbG9hZCBLZXBsZXIuZ2wgZXhhbXBsZXNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEucm93cz8uWzBdKSB8fCB0eXBlb2YgZGF0YS5yb3dzPy5bMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvcm1hdCA9IERBVEFTRVRfRk9STUFUUy5yb3c7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEucm93cz8udHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3JtYXQgPSBEQVRBU0VUX0ZPUk1BVFMuZ2VvanNvbjtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5jb2xzPy5bMF0gaW5zdGFuY2VvZiBhcnJvdy5WZWN0b3IpIHtcbiAgICAgICAgZm9ybWF0ID0gREFUQVNFVF9GT1JNQVRTLmFycm93O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpbXBvcnREZXRhaWxzOiBJbXBvcnREYXRhVG9EdWNrUmVzdWx0IHwgdW5kZWZpbmVkO1xuICAgIGlmIChmb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5yb3cpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW1wb3J0Um93RGF0YSh7ZGF0YSwgZGIsIGN9KTtcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLmdlb2pzb24pIHtcbiAgICAgIGltcG9ydERldGFpbHMgPSBhd2FpdCB0aGlzLmltcG9ydEdlb0pzb25EYXRhKHtkYXRhLCBkYiwgY30pO1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMuYXJyb3cpIHtcbiAgICAgIGltcG9ydERldGFpbHMgPSBhd2FpdCB0aGlzLmltcG9ydEFycm93RGF0YSh7ZGF0YSwgZGIsIGN9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignVW5yZWNvZ25pemVkIGZvcm1hdCcsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgbGV0IGZpZWxkczogRmllbGRbXSA9IFtdO1xuICAgIGxldCBjb2xzOiBhcnJvdy5WZWN0b3JbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtnZW9hcnJvd01ldGFkYXRhID0ge30sIHVzZU5ld0ZpZWxkcyA9IGZhbHNlfSA9IGltcG9ydERldGFpbHMgfHwge307XG5cbiAgICAgIGNvbnN0IGR1Y2tEYkNvbHVtbnMgPSBhd2FpdCBnZXREdWNrREJDb2x1bW5UeXBlcyhjLCB0YWJsZU5hbWUpO1xuICAgICAgY29uc3QgdGFibGVEdWNrREJUeXBlcyA9IGdldER1Y2tEQkNvbHVtblR5cGVzTWFwKGR1Y2tEYkNvbHVtbnMpO1xuICAgICAgY29uc3QgY29sdW1uc1RvQ29udmVydFRvV0tCID0gZ2V0R2VvbWV0cnlDb2x1bW5zKGR1Y2tEYkNvbHVtbnMpO1xuICAgICAgY29uc3QgYWRqdXN0ZWRRdWVyeSA9IGNvbnN0cnVjdFNUX2FzV0tCUXVlcnkodGFibGVOYW1lLCBjb2x1bW5zVG9Db252ZXJ0VG9XS0IpO1xuICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBjLnF1ZXJ5KGFkanVzdGVkUXVlcnkpO1xuXG4gICAgICAvLyBUT0RPIGlmIGZvcm1hdCBpcyBhbiBhcnJvdyB0YWJsZSB0aGVuIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCBvbmUsIGluc3RlYWQgb2YgdGhlIG5ldyB0YWJsZSBmcm9tIHRoZSBxdWVyeT9cblxuICAgICAgcmVzdG9yZUdlb2Fycm93TWV0YWRhdGEoYXJyb3dSZXN1bHQsIGdlb2Fycm93TWV0YWRhdGEpO1xuXG4gICAgICBmaWVsZHMgPSB1c2VOZXdGaWVsZHNcbiAgICAgICAgPyBhcnJvd1NjaGVtYVRvRmllbGRzKGFycm93UmVzdWx0LCB0YWJsZUR1Y2tEQlR5cGVzKVxuICAgICAgICA6IGRhdGEuZmllbGRzID8/IGFycm93U2NoZW1hVG9GaWVsZHMoYXJyb3dSZXN1bHQsIHRhYmxlRHVja0RCVHlwZXMpO1xuICAgICAgY29scyA9IFsuLi5BcnJheShhcnJvd1Jlc3VsdC5udW1Db2xzKS5rZXlzKCldXG4gICAgICAgIC5tYXAoaSA9PiBhcnJvd1Jlc3VsdC5nZXRDaGlsZEF0KGkpKVxuICAgICAgICAuZmlsdGVyKGNvbCA9PiBjb2wpIGFzIGFycm93LlZlY3RvcltdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEdWNrREIgdGFibGU6IGNyZWF0ZVRhYmxlQW5kR2V0QXJyb3cnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgYXdhaXQgYy5jbG9zZSgpO1xuXG4gICAgcmV0dXJuIHtmaWVsZHMsIGNvbHN9O1xuICB9XG5cbiAgYXN5bmMgaW1wb3J0RGF0YSh7ZGF0YX06IHtkYXRhOiBQcm9jZXNzb3JSZXN1bHR9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVmVjdG9yVGlsZSBpcyBhIHNwZWNpYWwgY2FzZSwgaWdub3JlIGZvciBub3dcbiAgICBpZiAodGhpcy50eXBlID09PSBEYXRhc2V0VHlwZS5WRUNUT1JfVElMRSkge1xuICAgICAgc3VwZXIuaW1wb3J0RGF0YSh7ZGF0YTogey4uLmRhdGEsIHJvd3M6IFtdfX0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtmaWVsZHMsIGNvbHN9ID0gYXdhaXQgdGhpcy5jcmVhdGVUYWJsZUFuZEdldEFycm93KGRhdGEpO1xuXG4gICAgc3VwZXIuaW1wb3J0RGF0YSh7ZGF0YToge2ZpZWxkcywgY29scywgcm93czogW119fSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGUoZGF0YSkge1xuICAgIC8vIFZlY3RvclRpbGUgaXMgYSBzcGVjaWFsIGNhc2UsIGlnbm9yZSBmb3Igbm93XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gRGF0YXNldFR5cGUuVkVDVE9SX1RJTEUpIHtcbiAgICAgIHN1cGVyLmltcG9ydERhdGEoe2RhdGF9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNvbnN0IHtjb2xzfSA9IGF3YWl0IHRoaXMuY3JlYXRlVGFibGVBbmRHZXRBcnJvdyhkYXRhKTtcblxuICAgIHJldHVybiBzdXBlci51cGRhdGUoe2NvbHMsIHJvd3M6IFtdLCBmaWVsZHM6IFtdfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZVByb2Nlc3NvciA9IGZ1bmN0aW9uIChkYXRhOiBhbnksIGlucHV0Rm9ybWF0Pzogc3RyaW5nKSB7XG4gICAgbGV0IHByb2Nlc3NvcjtcbiAgICBsZXQgZm9ybWF0O1xuICAgIGlmIChpbnB1dEZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLmFycm93IHx8IGlzQXJyb3dEYXRhKGRhdGEpKSB7XG4gICAgICBmb3JtYXQgPSBEQVRBU0VUX0ZPUk1BVFMuYXJyb3c7XG4gICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzQXJyb3dCYXRjaGVzO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRGb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5rZXBsZXJnbCB8fCBpc0tlcGxlckdsTWFwKGRhdGEpKSB7XG4gICAgICBmb3JtYXQgPSBEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2w7XG4gICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzS2VwbGVyZ2xKU09OZm9yRHVja0RiO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRGb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5yb3cgfHwgaXNSb3dPYmplY3QoZGF0YSkpIHtcbiAgICAgIC8vIGNzdiBmaWxlIGdvZXMgaGVyZVxuICAgICAgZm9ybWF0ID0gREFUQVNFVF9GT1JNQVRTLnJvdztcbiAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NDc3ZSb3dPYmplY3Q7IC8vIGRpcmVjdGx5IGltcG9ydCBqc29uIG9iamVjdCBpbnRvIGR1Y2tkYi13YXNtXG4gICAgfSBlbHNlIGlmIChpbnB1dEZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLmdlb2pzb24gfHwgaXNHZW9Kc29uKGRhdGEpKSB7XG4gICAgICBmb3JtYXQgPSBEQVRBU0VUX0ZPUk1BVFMuZ2VvanNvbjtcbiAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NHZW9qc29uO1xuICAgIH1cbiAgICByZXR1cm4ge3Byb2Nlc3NvciwgZm9ybWF0fTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0SW5wdXREYXRhVmFsaWRhdG9yID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEluIER1Y2tEQiBtb2RlIGRhdGEgaXMgdmFsaWRhdGVkIGxhdGVyIGR1cmluZyBpbXBvcnQuXG4gICAgcmV0dXJuIGQgPT4gZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVzdG9yZSBnZW9hcnJvdyBtZXRhZGF0YSBsb3N0IGR1cmluZyBEdWNrRGIgaW5nZXN0aW9uLlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIGdlbmVyYXRlIHdyb25nIGdlb21ldHJ5IHR5cGVzLlxuICogQHBhcmFtIGFycm93VGFibGUgQXJyb3cgdGFibGUgdG8gdXBkYXRlLlxuICogQHBhcmFtIGdlb2Fycm93TWV0YWRhdGEgQSBtYXAgd2l0aCBmaWVsZCBuYW1lcyB0aGF0IHVzdWFsbHkgdXNlZCB0byBzdG9yZSBnZW9hcnJvdyBnZW9tZXRyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc3RvcmVHZW9hcnJvd01ldGFkYXRhID0gKFxuICBhcnJvd1RhYmxlOiBhcnJvdy5UYWJsZSxcbiAgZ2VvYXJyb3dNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKSA9PiB7XG4gIGFycm93VGFibGUuc2NoZW1hLmZpZWxkcy5mb3JFYWNoKGYgPT4ge1xuICAgIGlmIChhcnJvdy5EYXRhVHlwZS5pc0JpbmFyeShmLnR5cGUpICYmIGdlb2Fycm93TWV0YWRhdGFbZi5uYW1lXSkge1xuICAgICAgZi5tZXRhZGF0YS5zZXQoR0VPQVJST1dfTUVUQURBVEFfS0VZLCBnZW9hcnJvd01ldGFkYXRhW2YubmFtZV0pO1xuICAgIH0gZWxzZSBpZiAoaXNHZW9BcnJvd1BvaW50KGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5QT0lOVCk7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93TGluZVN0cmluZyhmLnR5cGUpKSB7XG4gICAgICBmLm1ldGFkYXRhLnNldChHRU9BUlJPV19NRVRBREFUQV9LRVksIEdFT0FSUk9XX0VYVEVOU0lPTlMuTElORVNUUklORyk7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93UG9seWdvbihmLnR5cGUpKSB7XG4gICAgICBmLm1ldGFkYXRhLnNldChHRU9BUlJPV19NRVRBREFUQV9LRVksIEdFT0FSUk9XX0VYVEVOU0lPTlMuUE9MWUdPTik7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93TXVsdGlQb2ludChmLnR5cGUpKSB7XG4gICAgICBmLm1ldGFkYXRhLnNldChHRU9BUlJPV19NRVRBREFUQV9LRVksIEdFT0FSUk9XX0VYVEVOU0lPTlMuTVVMVElQT0lOVCk7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93TXVsdGlMaW5lU3RyaW5nKGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5NVUxUSUxJTkVTVFJJTkcpO1xuICAgIH0gZWxzZSBpZiAoaXNHZW9BcnJvd011bHRpUG9seWdvbihmLnR5cGUpKSB7XG4gICAgICBmLm1ldGFkYXRhLnNldChHRU9BUlJPV19NRVRBREFUQV9LRVksIEdFT0FSUk9XX0VYVEVOU0lPTlMuTVVMVElQT0xZR09OKTtcbiAgICB9XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQU1BLElBQUFFLFdBQUEsR0FBQUYsT0FBQTtBQVFBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLGNBQUEsR0FBQUwsT0FBQTtBQU9BLElBQUFNLGlCQUFBLEdBQUFOLE9BQUE7QUFTQSxJQUFBTyxr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