@pie-lib/editable-html 13.0.14-beta.6 → 13.0.14-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/lib/__tests__/editor-utils.test.js +164 -0
  2. package/lib/__tests__/serialization.test.js +241 -0
  3. package/lib/__tests__/utils.js +79 -0
  4. package/lib/plugins/image/__tests__/component.test.js +96 -0
  5. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +131 -0
  6. package/lib/plugins/image/__tests__/image-toolbar.test.js +21 -0
  7. package/lib/plugins/image/__tests__/index.test.js +86 -0
  8. package/lib/plugins/image/__tests__/insert-image-handler.test.js +112 -0
  9. package/lib/plugins/image/__tests__/mock-change.js +22 -0
  10. package/lib/plugins/list/__tests__/index.test.js +63 -0
  11. package/lib/plugins/math/__tests__/index.test.js +284 -0
  12. package/lib/plugins/media/__tests__/index.test.js +69 -0
  13. package/lib/plugins/respArea/drag-in-the-blank/__tests__/choice.test.js +93 -0
  14. package/lib/plugins/table/__tests__/index.test.js +416 -0
  15. package/lib/plugins/table/__tests__/table-toolbar.test.js +81 -0
  16. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +153 -0
  17. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +47 -0
  18. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +112 -0
  19. package/lib/plugins/toolbar/__tests__/toolbar.test.js +118 -0
  20. package/package.json +3 -3
  21. package/src/__tests__/editor-utils.test.js +162 -0
  22. package/src/__tests__/serialization.test.js +290 -0
  23. package/src/__tests__/utils.js +36 -0
  24. package/src/plugins/image/__tests__/component.test.jsx +73 -0
  25. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +90 -0
  26. package/src/plugins/image/__tests__/image-toolbar.test.jsx +12 -0
  27. package/src/plugins/image/__tests__/index.test.js +92 -0
  28. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  29. package/src/plugins/image/__tests__/mock-change.js +15 -0
  30. package/src/plugins/list/__tests__/index.test.js +52 -0
  31. package/src/plugins/math/__tests__/index.test.jsx +264 -0
  32. package/src/plugins/media/__tests__/index.test.js +75 -0
  33. package/src/plugins/respArea/drag-in-the-blank/__tests__/choice.test.js +71 -0
  34. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  35. package/src/plugins/table/__tests__/table-toolbar.test.jsx +75 -0
  36. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +123 -0
  37. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +40 -0
  38. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +97 -0
  39. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +112 -0
@@ -0,0 +1,416 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _slateEditTable = _interopRequireDefault(require("slate-edit-table"));
6
+ var _index = _interopRequireWildcard(require("../index"));
7
+ var _slate = require("slate");
8
+ var _react = _interopRequireDefault(require("react"));
9
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
10
+ jest.mock('slate-edit-table', function () {
11
+ var mock = {
12
+ "default": jest.fn().mockReturnThis(),
13
+ utils: {
14
+ isSelectionInTable: jest.fn().mockReturnValue(true),
15
+ createTable: jest.fn(function (c) {
16
+ return {
17
+ toJSON: jest.fn().mockReturnValue({
18
+ object: 'block',
19
+ type: 'table'
20
+ })
21
+ };
22
+ })
23
+ },
24
+ changes: {
25
+ insertTable: jest.fn(function (c) {
26
+ return c;
27
+ })
28
+ }
29
+ };
30
+ return jest.fn().mockReturnValue(mock);
31
+ });
32
+ describe('table', function () {
33
+ describe('toolbar', function () {
34
+ describe('onClick', function () {
35
+ var plugin;
36
+ var onChange;
37
+ var findDescendant;
38
+ var insertBlock;
39
+ var changeMock;
40
+ beforeEach(function () {
41
+ plugin = (0, _index["default"])();
42
+ onChange = jest.fn();
43
+ insertBlock = jest.fn();
44
+ findDescendant = jest.fn();
45
+ changeMock = jest.fn().mockReturnValue({
46
+ insertBlock: insertBlock,
47
+ value: {
48
+ document: {
49
+ findDescendant: findDescendant
50
+ }
51
+ }
52
+ });
53
+ });
54
+ it('calls utils.createTable', function () {
55
+ plugin.toolbar.onClick({
56
+ change: changeMock
57
+ }, onChange);
58
+ expect((0, _slateEditTable["default"])().utils.createTable).toHaveBeenCalledWith(2, 2);
59
+ });
60
+ it('creates table with border: 1 as default', function () {
61
+ plugin.toolbar.onClick({
62
+ change: changeMock
63
+ }, onChange);
64
+ expect(insertBlock).toHaveBeenCalledWith(_slate.Block.create({
65
+ key: '2',
66
+ type: 'table',
67
+ data: {
68
+ border: '1',
69
+ newTable: true
70
+ }
71
+ }));
72
+ });
73
+ it('moves cursor to first cell of the table and removes the newTable property', function () {
74
+ var dataRemoveFn = jest.fn().mockReturnValue({
75
+ border: '1'
76
+ });
77
+ var setNodeByKey = jest.fn();
78
+ var newTableBlock = {
79
+ key: '2',
80
+ data: {
81
+ remove: dataRemoveFn
82
+ }
83
+ };
84
+ var collapseToStartOf = jest.fn();
85
+ changeMock = jest.fn().mockReturnValue({
86
+ insertBlock: insertBlock,
87
+ collapseToStartOf: collapseToStartOf,
88
+ setNodeByKey: setNodeByKey,
89
+ value: {
90
+ document: {
91
+ findDescendant: jest.fn().mockReturnValue(newTableBlock)
92
+ }
93
+ }
94
+ });
95
+ plugin.toolbar.onClick({
96
+ change: changeMock
97
+ }, onChange);
98
+ expect(collapseToStartOf).toHaveBeenCalledWith(newTableBlock);
99
+ expect(dataRemoveFn).toHaveBeenCalledWith('newTable');
100
+ expect(setNodeByKey).toHaveBeenCalledWith('2', {
101
+ data: {
102
+ border: '1'
103
+ }
104
+ });
105
+ });
106
+ });
107
+ describe('supports', function () {
108
+ var assertSupports = function assertSupports(inTable, object, expected) {
109
+ it("inTable: ".concat(inTable, ", type: ").concat(object, " => ").concat(expected), function () {
110
+ (0, _slateEditTable["default"])().utils.isSelectionInTable.mockReturnValue(inTable);
111
+ var plugin = (0, _index["default"])();
112
+ var supports = plugin.toolbar.supports({
113
+ object: object
114
+ });
115
+ expect(supports).toEqual(expected);
116
+ });
117
+ };
118
+ assertSupports(true, 'block', true);
119
+ assertSupports(false, 'block', false);
120
+ assertSupports(true, 'inline', false);
121
+ assertSupports(false, 'inline', false);
122
+ });
123
+ describe('customToolbar', function () {
124
+ describe('toggleBorder', function () {
125
+ var assertToggle = function assertToggle(border, expectedBorder) {
126
+ describe("with initial border of ".concat(border), function () {
127
+ var change;
128
+ var done;
129
+ beforeEach(function () {
130
+ var plugin = (0, _index["default"])();
131
+ change = {
132
+ setNodeByKey: jest.fn().mockReturnThis()
133
+ };
134
+ plugin.utils.getTableBlock = jest.fn().mockReturnValue({
135
+ key: 'tableKey',
136
+ data: _slate.Data.create({
137
+ border: border
138
+ })
139
+ });
140
+ var node = {
141
+ key: 'nodeKey'
142
+ };
143
+ var value = {
144
+ change: jest.fn().mockReturnValue(change)
145
+ };
146
+ done = jest.fn();
147
+ var Comp = plugin.toolbar.customToolbar(node, value, done);
148
+ var c = Comp();
149
+ c.props.onToggleBorder();
150
+ });
151
+ it("calls setNodeByKey with ".concat(expectedBorder), function () {
152
+ expect(change.setNodeByKey).toHaveBeenCalledWith('tableKey', {
153
+ data: _slate.Data.create({
154
+ border: expectedBorder
155
+ })
156
+ });
157
+ });
158
+ it('calls onToolbarDone', function () {
159
+ expect(done).toHaveBeenCalledWith(change, false);
160
+ });
161
+ });
162
+ };
163
+ assertToggle(null, '1');
164
+ assertToggle(undefined, '1');
165
+ assertToggle('0', '1');
166
+ assertToggle('1', '0');
167
+ assertToggle('2', '0');
168
+ });
169
+ });
170
+ describe('normalizeNode', function () {
171
+ it('should exit the function if the node is not of type document', function () {
172
+ var tablePlugin = (0, _index["default"])();
173
+ var returnValue = tablePlugin.normalizeNode({
174
+ object: 'table'
175
+ });
176
+ expect(returnValue).toEqual(undefined);
177
+ });
178
+ it('should exit there are no changes needed', function () {
179
+ var tablePlugin = (0, _index["default"])();
180
+ var nodes = {
181
+ size: 3,
182
+ findLastIndex: jest.fn().mockReturnValue(1)
183
+ };
184
+ var returnValue = tablePlugin.normalizeNode({
185
+ object: 'document',
186
+ nodes: nodes,
187
+ findDescendant: jest.fn().mockReturnValue({
188
+ object: 'block',
189
+ type: 'table'
190
+ }),
191
+ getParent: jest.fn().mockReturnValue(undefined)
192
+ });
193
+ expect(returnValue).toEqual(undefined);
194
+ });
195
+ it('should return a function if a table does not have a node before or after it', function () {
196
+ var tablePlugin = (0, _index["default"])();
197
+ var nodes = [{
198
+ object: 'block',
199
+ type: 'table',
200
+ key: '99',
201
+ data: _slate.Data.create({
202
+ newTable: true
203
+ })
204
+ }];
205
+ var findDescendant = jest.fn(function (callback) {
206
+ nodes.forEach(function (n) {
207
+ return callback(n);
208
+ });
209
+ });
210
+ var change = {
211
+ insertNodeByPath: jest.fn(),
212
+ value: {
213
+ document: {
214
+ getPath: jest.fn().mockReturnValue(_slate.PathUtils.create([0, 0]))
215
+ }
216
+ }
217
+ };
218
+ var returnValue = tablePlugin.normalizeNode({
219
+ object: 'document',
220
+ findDescendant: findDescendant,
221
+ getPath: jest.fn().mockReturnValue(_slate.PathUtils.create([0, 0])),
222
+ getPreviousNode: jest.fn().mockReturnValue(undefined),
223
+ getNextNode: jest.fn().mockReturnValue(undefined)
224
+ });
225
+ expect(returnValue).toEqual(expect.any(Function));
226
+ returnValue(change);
227
+ expect(change.insertNodeByPath).toHaveBeenCalledWith([0], 0, {
228
+ object: 'block',
229
+ type: 'div'
230
+ });
231
+ });
232
+ });
233
+ });
234
+ });
235
+ describe('parseStyleString', function () {
236
+ var parses = function parses(s, expected) {
237
+ it("parses ".concat(s, " -> ").concat(JSON.stringify(expected)), function () {
238
+ var result = (0, _index.parseStyleString)(s);
239
+ expect(result).toEqual(expected);
240
+ });
241
+ };
242
+ parses(' width: 10px ', {
243
+ width: '10px'
244
+ });
245
+ parses(' width: 10px; ', {
246
+ width: '10px'
247
+ });
248
+ parses(' border-width: 10px; ', {
249
+ 'border-width': '10px'
250
+ });
251
+ parses(' border: solid 1px red; height: 1px', {
252
+ border: 'solid 1px red',
253
+ height: '1px'
254
+ });
255
+ });
256
+ describe('toStyleString', function () {
257
+ var styleString = function styleString(o, expected) {
258
+ it("".concat(JSON.stringify(s), " -> ").concat(expected), function () {
259
+ var result = toStyleString(o);
260
+ expect(result).toEqual(expected);
261
+ });
262
+ };
263
+ });
264
+ describe('reactAttributes', function () {
265
+ var attributes = function attributes(o, expected) {
266
+ it("".concat(JSON.stringify(o), " -> ").concat(JSON.stringify(expected)), function () {
267
+ var result = (0, _index.reactAttributes)(o);
268
+ expect(result).toEqual(expected);
269
+ });
270
+ };
271
+ attributes({
272
+ 'border-width': '10px',
273
+ 'line-height': 1.56
274
+ }, {
275
+ borderWidth: '10px',
276
+ lineHeight: '1.56'
277
+ });
278
+ });
279
+ describe('serialization', function () {
280
+ describe('deserialize', function () {
281
+ var next;
282
+ beforeEach(function () {
283
+ next = jest.fn().mockReturnValue([]);
284
+ });
285
+ describe('table', function () {
286
+ var el;
287
+ var out;
288
+ beforeEach(function () {
289
+ el = {
290
+ tagName: 'table',
291
+ children: [],
292
+ getAttribute: jest.fn(function (name) {
293
+ switch (name) {
294
+ case 'border':
295
+ return '1';
296
+ case 'cellspacing':
297
+ return '2';
298
+ case 'cellpadding':
299
+ return '3';
300
+ case 'class':
301
+ return 'table-class';
302
+ case 'style':
303
+ return 'width: 10px';
304
+ }
305
+ })
306
+ };
307
+ out = _index.serialization.deserialize(el, next);
308
+ });
309
+ var assertData = function assertData(name, value) {
310
+ it("data.".concat(name, " should eql ").concat(value), function () {
311
+ expect(out.data[name]).toEqual(value);
312
+ });
313
+ };
314
+ assertData('border', '1');
315
+ assertData('cellspacing', '2');
316
+ assertData('cellpadding', '3');
317
+ assertData('class', 'table-class');
318
+ assertData('style', {
319
+ width: '10px'
320
+ });
321
+ it('returns a table block', function () {
322
+ expect(out).toMatchObject({
323
+ object: 'block',
324
+ type: 'table',
325
+ nodes: []
326
+ });
327
+ });
328
+ });
329
+ it('deserializes tr', function () {
330
+ var el = {
331
+ tagName: 'tr',
332
+ children: []
333
+ };
334
+ var out = _index.serialization.deserialize(el, next);
335
+ expect(out).toEqual({
336
+ object: 'block',
337
+ type: 'table_row',
338
+ nodes: []
339
+ });
340
+ });
341
+ it('deserializes td', function () {
342
+ var el = {
343
+ tagName: 'td',
344
+ childNodes: [],
345
+ getAttribute: jest.fn(function (name) {
346
+ var o = {
347
+ "class": 'class name',
348
+ colspan: '1',
349
+ rowspan: '1'
350
+ };
351
+ return o[name];
352
+ })
353
+ };
354
+ var out = _index.serialization.deserialize(el, next);
355
+ expect(out).toEqual({
356
+ object: 'block',
357
+ type: 'table_cell',
358
+ nodes: [],
359
+ data: {
360
+ colspan: '1',
361
+ rowspan: '1',
362
+ "class": 'class name',
363
+ header: false
364
+ }
365
+ });
366
+ });
367
+ });
368
+ describe('serialize', function () {
369
+ it('serializes table', function () {
370
+ var el = _index.serialization.serialize({
371
+ object: 'block',
372
+ type: 'table',
373
+ nodes: [],
374
+ data: _slate.Data.create({
375
+ border: '1',
376
+ cellpadding: '2',
377
+ cellspacing: '3'
378
+ })
379
+ });
380
+ expect(el).toEqual(/*#__PURE__*/_react["default"].createElement("table", {
381
+ border: "1",
382
+ cellPadding: "2",
383
+ cellSpacing: "3"
384
+ }, /*#__PURE__*/_react["default"].createElement("tbody", null)));
385
+ });
386
+ it('serializes table_row', function () {
387
+ var el = _index.serialization.serialize({
388
+ object: 'block',
389
+ type: 'table_row',
390
+ nodes: []
391
+ });
392
+ expect(el).toEqual(/*#__PURE__*/_react["default"].createElement("tr", null));
393
+ });
394
+ it('serializes table_cell', function () {
395
+ var el = _index.serialization.serialize({
396
+ object: 'block',
397
+ type: 'table_cell',
398
+ nodes: [],
399
+ data: _slate.Data.create({
400
+ header: false,
401
+ style: {
402
+ width: '10px'
403
+ },
404
+ "class": 'foo'
405
+ })
406
+ });
407
+ expect(el).toEqual(/*#__PURE__*/_react["default"].createElement("td", {
408
+ style: {
409
+ width: '10px'
410
+ },
411
+ className: 'foo'
412
+ }));
413
+ });
414
+ });
415
+ });
416
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2xhdGVFZGl0VGFibGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pbmRleCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3NsYXRlIiwiX3JlYWN0IiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJqZXN0IiwibW9jayIsImZuIiwibW9ja1JldHVyblRoaXMiLCJ1dGlscyIsImlzU2VsZWN0aW9uSW5UYWJsZSIsIm1vY2tSZXR1cm5WYWx1ZSIsImNyZWF0ZVRhYmxlIiwiYyIsInRvSlNPTiIsIm9iamVjdCIsInR5cGUiLCJjaGFuZ2VzIiwiaW5zZXJ0VGFibGUiLCJkZXNjcmliZSIsInBsdWdpbiIsIm9uQ2hhbmdlIiwiZmluZERlc2NlbmRhbnQiLCJpbnNlcnRCbG9jayIsImNoYW5nZU1vY2siLCJiZWZvcmVFYWNoIiwiVGFibGVQbHVnaW4iLCJ2YWx1ZSIsImRvY3VtZW50IiwiaXQiLCJ0b29sYmFyIiwib25DbGljayIsImNoYW5nZSIsImV4cGVjdCIsIkVkaXRUYWJsZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiQmxvY2siLCJjcmVhdGUiLCJrZXkiLCJkYXRhIiwiYm9yZGVyIiwibmV3VGFibGUiLCJkYXRhUmVtb3ZlRm4iLCJzZXROb2RlQnlLZXkiLCJuZXdUYWJsZUJsb2NrIiwicmVtb3ZlIiwiY29sbGFwc2VUb1N0YXJ0T2YiLCJhc3NlcnRTdXBwb3J0cyIsImluVGFibGUiLCJleHBlY3RlZCIsImNvbmNhdCIsInN1cHBvcnRzIiwidG9FcXVhbCIsImFzc2VydFRvZ2dsZSIsImV4cGVjdGVkQm9yZGVyIiwiZG9uZSIsImdldFRhYmxlQmxvY2siLCJEYXRhIiwibm9kZSIsIkNvbXAiLCJjdXN0b21Ub29sYmFyIiwicHJvcHMiLCJvblRvZ2dsZUJvcmRlciIsInVuZGVmaW5lZCIsInRhYmxlUGx1Z2luIiwicmV0dXJuVmFsdWUiLCJub3JtYWxpemVOb2RlIiwibm9kZXMiLCJzaXplIiwiZmluZExhc3RJbmRleCIsImdldFBhcmVudCIsImNhbGxiYWNrIiwiZm9yRWFjaCIsImluc2VydE5vZGVCeVBhdGgiLCJnZXRQYXRoIiwiUGF0aFV0aWxzIiwiZ2V0UHJldmlvdXNOb2RlIiwiZ2V0TmV4dE5vZGUiLCJhbnkiLCJGdW5jdGlvbiIsInBhcnNlcyIsInMiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzdWx0IiwicGFyc2VTdHlsZVN0cmluZyIsIndpZHRoIiwiaGVpZ2h0Iiwic3R5bGVTdHJpbmciLCJ0b1N0eWxlU3RyaW5nIiwiYXR0cmlidXRlcyIsInJlYWN0QXR0cmlidXRlcyIsImJvcmRlcldpZHRoIiwibGluZUhlaWdodCIsIm5leHQiLCJlbCIsIm91dCIsInRhZ05hbWUiLCJjaGlsZHJlbiIsImdldEF0dHJpYnV0ZSIsIm5hbWUiLCJzZXJpYWxpemF0aW9uIiwiZGVzZXJpYWxpemUiLCJhc3NlcnREYXRhIiwidG9NYXRjaE9iamVjdCIsImNoaWxkTm9kZXMiLCJjb2xzcGFuIiwicm93c3BhbiIsImhlYWRlciIsInNlcmlhbGl6ZSIsImNlbGxwYWRkaW5nIiwiY2VsbHNwYWNpbmciLCJjcmVhdGVFbGVtZW50IiwiY2VsbFBhZGRpbmciLCJjZWxsU3BhY2luZyIsInN0eWxlIiwiY2xhc3NOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvdGFibGUvX190ZXN0c19fL2luZGV4LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFZGl0VGFibGUgZnJvbSAnc2xhdGUtZWRpdC10YWJsZSc7XG5pbXBvcnQgVGFibGVQbHVnaW4sIHsgcGFyc2VTdHlsZVN0cmluZywgcmVhY3RBdHRyaWJ1dGVzLCBzZXJpYWxpemF0aW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQmxvY2ssIERhdGEsIFBhdGhVdGlscyB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmplc3QubW9jaygnc2xhdGUtZWRpdC10YWJsZScsICgpID0+IHtcbiAgY29uc3QgbW9jayA9IHtcbiAgICBkZWZhdWx0OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICB1dGlsczoge1xuICAgICAgaXNTZWxlY3Rpb25JblRhYmxlOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHRydWUpLFxuICAgICAgY3JlYXRlVGFibGU6IGplc3QuZm4oZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b0pTT046IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBvYmplY3Q6ICdibG9jaycsIHR5cGU6ICd0YWJsZScgfSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9LFxuICAgIGNoYW5nZXM6IHtcbiAgICAgIGluc2VydFRhYmxlOiBqZXN0LmZuKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSksXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShtb2NrKTtcbn0pO1xuXG5kZXNjcmliZSgndGFibGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCd0b29sYmFyJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdvbkNsaWNrJywgKCkgPT4ge1xuICAgICAgbGV0IHBsdWdpbjtcbiAgICAgIGxldCBvbkNoYW5nZTtcbiAgICAgIGxldCBmaW5kRGVzY2VuZGFudDtcbiAgICAgIGxldCBpbnNlcnRCbG9jaztcbiAgICAgIGxldCBjaGFuZ2VNb2NrO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgcGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICAgIGluc2VydEJsb2NrID0gamVzdC5mbigpO1xuICAgICAgICBmaW5kRGVzY2VuZGFudCA9IGplc3QuZm4oKTtcbiAgICAgICAgY2hhbmdlTW9jayA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuICAgICAgICAgIGluc2VydEJsb2NrLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBkb2N1bWVudDoge1xuICAgICAgICAgICAgICBmaW5kRGVzY2VuZGFudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NhbGxzIHV0aWxzLmNyZWF0ZVRhYmxlJywgKCkgPT4ge1xuICAgICAgICBwbHVnaW4udG9vbGJhci5vbkNsaWNrKHsgY2hhbmdlOiBjaGFuZ2VNb2NrIH0sIG9uQ2hhbmdlKTtcblxuICAgICAgICBleHBlY3QoRWRpdFRhYmxlKCkudXRpbHMuY3JlYXRlVGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDIsIDIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjcmVhdGVzIHRhYmxlIHdpdGggYm9yZGVyOiAxIGFzIGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICAgIHBsdWdpbi50b29sYmFyLm9uQ2xpY2soeyBjaGFuZ2U6IGNoYW5nZU1vY2sgfSwgb25DaGFuZ2UpO1xuXG4gICAgICAgIGV4cGVjdChpbnNlcnRCbG9jaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgQmxvY2suY3JlYXRlKHsga2V5OiAnMicsIHR5cGU6ICd0YWJsZScsIGRhdGE6IHsgYm9yZGVyOiAnMScsIG5ld1RhYmxlOiB0cnVlIH0gfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ21vdmVzIGN1cnNvciB0byBmaXJzdCBjZWxsIG9mIHRoZSB0YWJsZSBhbmQgcmVtb3ZlcyB0aGUgbmV3VGFibGUgcHJvcGVydHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFSZW1vdmVGbiA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBib3JkZXI6ICcxJyB9KTtcbiAgICAgICAgY29uc3Qgc2V0Tm9kZUJ5S2V5ID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBuZXdUYWJsZUJsb2NrID0ge1xuICAgICAgICAgIGtleTogJzInLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZTogZGF0YVJlbW92ZUZuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlVG9TdGFydE9mID0gamVzdC5mbigpO1xuXG4gICAgICAgIGNoYW5nZU1vY2sgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICBpbnNlcnRCbG9jayxcbiAgICAgICAgICBjb2xsYXBzZVRvU3RhcnRPZixcbiAgICAgICAgICBzZXROb2RlQnlLZXksXG4gICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIGRvY3VtZW50OiB7XG4gICAgICAgICAgICAgIGZpbmREZXNjZW5kYW50OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG5ld1RhYmxlQmxvY2spLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcGx1Z2luLnRvb2xiYXIub25DbGljayh7IGNoYW5nZTogY2hhbmdlTW9jayB9LCBvbkNoYW5nZSk7XG5cbiAgICAgICAgZXhwZWN0KGNvbGxhcHNlVG9TdGFydE9mKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChuZXdUYWJsZUJsb2NrKTtcbiAgICAgICAgZXhwZWN0KGRhdGFSZW1vdmVGbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ25ld1RhYmxlJyk7XG4gICAgICAgIGV4cGVjdChzZXROb2RlQnlLZXkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCcyJywgeyBkYXRhOiB7IGJvcmRlcjogJzEnIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzdXBwb3J0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydFN1cHBvcnRzID0gKGluVGFibGUsIG9iamVjdCwgZXhwZWN0ZWQpID0+IHtcbiAgICAgICAgaXQoYGluVGFibGU6ICR7aW5UYWJsZX0sIHR5cGU6ICR7b2JqZWN0fSA9PiAke2V4cGVjdGVkfWAsICgpID0+IHtcbiAgICAgICAgICBFZGl0VGFibGUoKS51dGlscy5pc1NlbGVjdGlvbkluVGFibGUubW9ja1JldHVyblZhbHVlKGluVGFibGUpO1xuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IFRhYmxlUGx1Z2luKCk7XG4gICAgICAgICAgY29uc3Qgc3VwcG9ydHMgPSBwbHVnaW4udG9vbGJhci5zdXBwb3J0cyh7IG9iamVjdCB9KTtcbiAgICAgICAgICBleHBlY3Qoc3VwcG9ydHMpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydFN1cHBvcnRzKHRydWUsICdibG9jaycsIHRydWUpO1xuICAgICAgYXNzZXJ0U3VwcG9ydHMoZmFsc2UsICdibG9jaycsIGZhbHNlKTtcbiAgICAgIGFzc2VydFN1cHBvcnRzKHRydWUsICdpbmxpbmUnLCBmYWxzZSk7XG4gICAgICBhc3NlcnRTdXBwb3J0cyhmYWxzZSwgJ2lubGluZScsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjdXN0b21Ub29sYmFyJywgKCkgPT4ge1xuICAgICAgZGVzY3JpYmUoJ3RvZ2dsZUJvcmRlcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgYXNzZXJ0VG9nZ2xlID0gKGJvcmRlciwgZXhwZWN0ZWRCb3JkZXIpID0+IHtcbiAgICAgICAgICBkZXNjcmliZShgd2l0aCBpbml0aWFsIGJvcmRlciBvZiAke2JvcmRlcn1gLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlO1xuICAgICAgICAgICAgbGV0IGRvbmU7XG5cbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwbHVnaW4gPSBUYWJsZVBsdWdpbigpO1xuICAgICAgICAgICAgICBjaGFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc2V0Tm9kZUJ5S2V5OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcGx1Z2luLnV0aWxzLmdldFRhYmxlQmxvY2sgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAgICAgICBrZXk6ICd0YWJsZUtleScsXG4gICAgICAgICAgICAgICAgZGF0YTogRGF0YS5jcmVhdGUoeyBib3JkZXIgfSksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBub2RlID0geyBrZXk6ICdub2RlS2V5JyB9O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoY2hhbmdlKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZG9uZSA9IGplc3QuZm4oKTtcbiAgICAgICAgICAgICAgY29uc3QgQ29tcCA9IHBsdWdpbi50b29sYmFyLmN1c3RvbVRvb2xiYXIobm9kZSwgdmFsdWUsIGRvbmUpO1xuICAgICAgICAgICAgICBjb25zdCBjID0gQ29tcCgpO1xuICAgICAgICAgICAgICBjLnByb3BzLm9uVG9nZ2xlQm9yZGVyKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoYGNhbGxzIHNldE5vZGVCeUtleSB3aXRoICR7ZXhwZWN0ZWRCb3JkZXJ9YCwgKCkgPT4ge1xuICAgICAgICAgICAgICBleHBlY3QoY2hhbmdlLnNldE5vZGVCeUtleSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3RhYmxlS2V5Jywge1xuICAgICAgICAgICAgICAgIGRhdGE6IERhdGEuY3JlYXRlKHsgYm9yZGVyOiBleHBlY3RlZEJvcmRlciB9KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2NhbGxzIG9uVG9vbGJhckRvbmUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGV4cGVjdChkb25lKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFzc2VydFRvZ2dsZShudWxsLCAnMScpO1xuICAgICAgICBhc3NlcnRUb2dnbGUodW5kZWZpbmVkLCAnMScpO1xuICAgICAgICBhc3NlcnRUb2dnbGUoJzAnLCAnMScpO1xuICAgICAgICBhc3NlcnRUb2dnbGUoJzEnLCAnMCcpO1xuICAgICAgICBhc3NlcnRUb2dnbGUoJzInLCAnMCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm9ybWFsaXplTm9kZScsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZXhpdCB0aGUgZnVuY3Rpb24gaWYgdGhlIG5vZGUgaXMgbm90IG9mIHR5cGUgZG9jdW1lbnQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB0YWJsZVBsdWdpbi5ub3JtYWxpemVOb2RlKHsgb2JqZWN0OiAndGFibGUnIH0pO1xuXG4gICAgICAgIGV4cGVjdChyZXR1cm5WYWx1ZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZXhpdCB0aGVyZSBhcmUgbm8gY2hhbmdlcyBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSB7XG4gICAgICAgICAgc2l6ZTogMyxcbiAgICAgICAgICBmaW5kTGFzdEluZGV4OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHRhYmxlUGx1Z2luLm5vcm1hbGl6ZU5vZGUoe1xuICAgICAgICAgIG9iamVjdDogJ2RvY3VtZW50JyxcbiAgICAgICAgICBub2RlcyxcbiAgICAgICAgICBmaW5kRGVzY2VuZGFudDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IG9iamVjdDogJ2Jsb2NrJywgdHlwZTogJ3RhYmxlJyB9KSxcbiAgICAgICAgICBnZXRQYXJlbnQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChyZXR1cm5WYWx1ZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZnVuY3Rpb24gaWYgYSB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgbm9kZSBiZWZvcmUgb3IgYWZ0ZXIgaXQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gVGFibGVQbHVnaW4oKTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgICAgICAgIGtleTogJzk5JyxcbiAgICAgICAgICAgIGRhdGE6IERhdGEuY3JlYXRlKHtcbiAgICAgICAgICAgICAgbmV3VGFibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBmaW5kRGVzY2VuZGFudCA9IGplc3QuZm4oKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgbm9kZXMuZm9yRWFjaCgobikgPT4gY2FsbGJhY2sobikpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2hhbmdlID0ge1xuICAgICAgICAgIGluc2VydE5vZGVCeVBhdGg6IGplc3QuZm4oKSxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgZ2V0UGF0aDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShQYXRoVXRpbHMuY3JlYXRlKFswLCAwXSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gdGFibGVQbHVnaW4ubm9ybWFsaXplTm9kZSh7XG4gICAgICAgICAgb2JqZWN0OiAnZG9jdW1lbnQnLFxuICAgICAgICAgIGZpbmREZXNjZW5kYW50LFxuICAgICAgICAgIGdldFBhdGg6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoUGF0aFV0aWxzLmNyZWF0ZShbMCwgMF0pKSxcbiAgICAgICAgICBnZXRQcmV2aW91c05vZGU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgICBnZXROZXh0Tm9kZTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh1bmRlZmluZWQpLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QocmV0dXJuVmFsdWUpLnRvRXF1YWwoZXhwZWN0LmFueShGdW5jdGlvbikpO1xuXG4gICAgICAgIHJldHVyblZhbHVlKGNoYW5nZSk7XG5cbiAgICAgICAgZXhwZWN0KGNoYW5nZS5pbnNlcnROb2RlQnlQYXRoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChbMF0sIDAsIHtcbiAgICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgICAgdHlwZTogJ2RpdicsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdwYXJzZVN0eWxlU3RyaW5nJywgKCkgPT4ge1xuICBjb25zdCBwYXJzZXMgPSAocywgZXhwZWN0ZWQpID0+IHtcbiAgICBpdChgcGFyc2VzICR7c30gLT4gJHtKU09OLnN0cmluZ2lmeShleHBlY3RlZCl9YCwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VTdHlsZVN0cmluZyhzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBwYXJzZXMoJyB3aWR0aDogMTBweCAnLCB7IHdpZHRoOiAnMTBweCcgfSk7XG4gIHBhcnNlcygnIHdpZHRoOiAxMHB4OyAnLCB7IHdpZHRoOiAnMTBweCcgfSk7XG4gIHBhcnNlcygnIGJvcmRlci13aWR0aDogMTBweDsgJywgeyAnYm9yZGVyLXdpZHRoJzogJzEwcHgnIH0pO1xuICBwYXJzZXMoJyBib3JkZXI6IHNvbGlkIDFweCByZWQ7IGhlaWdodDogMXB4Jywge1xuICAgIGJvcmRlcjogJ3NvbGlkIDFweCByZWQnLFxuICAgIGhlaWdodDogJzFweCcsXG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd0b1N0eWxlU3RyaW5nJywgKCkgPT4ge1xuICBjb25zdCBzdHlsZVN0cmluZyA9IChvLCBleHBlY3RlZCkgPT4ge1xuICAgIGl0KGAke0pTT04uc3RyaW5naWZ5KHMpfSAtPiAke2V4cGVjdGVkfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRvU3R5bGVTdHJpbmcobyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfTtcbn0pO1xuXG5kZXNjcmliZSgncmVhY3RBdHRyaWJ1dGVzJywgKCkgPT4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gKG8sIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7SlNPTi5zdHJpbmdpZnkobyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWQpfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlYWN0QXR0cmlidXRlcyhvKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBhdHRyaWJ1dGVzKHsgJ2JvcmRlci13aWR0aCc6ICcxMHB4JywgJ2xpbmUtaGVpZ2h0JzogMS41NiB9LCB7IGJvcmRlcldpZHRoOiAnMTBweCcsIGxpbmVIZWlnaHQ6ICcxLjU2JyB9KTtcbn0pO1xuXG5kZXNjcmliZSgnc2VyaWFsaXphdGlvbicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2Rlc2VyaWFsaXplJywgKCkgPT4ge1xuICAgIGxldCBuZXh0O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBuZXh0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShbXSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndGFibGUnLCAoKSA9PiB7XG4gICAgICBsZXQgZWw7XG4gICAgICBsZXQgb3V0O1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGVsID0ge1xuICAgICAgICAgIHRhZ05hbWU6ICd0YWJsZScsXG4gICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgIGdldEF0dHJpYnV0ZTogamVzdC5mbigobmFtZSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ2JvcmRlcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcxJztcbiAgICAgICAgICAgICAgY2FzZSAnY2VsbHNwYWNpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnMic7XG4gICAgICAgICAgICAgIGNhc2UgJ2NlbGxwYWRkaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzMnO1xuICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0YWJsZS1jbGFzcyc7XG4gICAgICAgICAgICAgIGNhc2UgJ3N0eWxlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dpZHRoOiAxMHB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgb3V0ID0gc2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShlbCwgbmV4dCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXNzZXJ0RGF0YSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpdChgZGF0YS4ke25hbWV9IHNob3VsZCBlcWwgJHt2YWx1ZX1gLCAoKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KG91dC5kYXRhW25hbWVdKS50b0VxdWFsKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhc3NlcnREYXRhKCdib3JkZXInLCAnMScpO1xuICAgICAgYXNzZXJ0RGF0YSgnY2VsbHNwYWNpbmcnLCAnMicpO1xuICAgICAgYXNzZXJ0RGF0YSgnY2VsbHBhZGRpbmcnLCAnMycpO1xuICAgICAgYXNzZXJ0RGF0YSgnY2xhc3MnLCAndGFibGUtY2xhc3MnKTtcbiAgICAgIGFzc2VydERhdGEoJ3N0eWxlJywgeyB3aWR0aDogJzEwcHgnIH0pO1xuICAgICAgaXQoJ3JldHVybnMgYSB0YWJsZSBibG9jaycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KG91dCkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rlc2VyaWFsaXplcyB0cicsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0ge1xuICAgICAgICB0YWdOYW1lOiAndHInLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdXQgPSBzZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKGVsLCBuZXh0KTtcblxuICAgICAgZXhwZWN0KG91dCkudG9FcXVhbCh7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ3RhYmxlX3JvdycsXG4gICAgICAgIG5vZGVzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rlc2VyaWFsaXplcyB0ZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0ge1xuICAgICAgICB0YWdOYW1lOiAndGQnLFxuICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgY29uc3QgbyA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAnY2xhc3MgbmFtZScsXG4gICAgICAgICAgICBjb2xzcGFuOiAnMScsXG4gICAgICAgICAgICByb3dzcGFuOiAnMScsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gb1tuYW1lXTtcbiAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdXQgPSBzZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKGVsLCBuZXh0KTtcblxuICAgICAgZXhwZWN0KG91dCkudG9FcXVhbCh7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ3RhYmxlX2NlbGwnLFxuICAgICAgICBub2RlczogW10sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBjb2xzcGFuOiAnMScsXG4gICAgICAgICAgcm93c3BhbjogJzEnLFxuICAgICAgICAgIGNsYXNzOiAnY2xhc3MgbmFtZScsXG4gICAgICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VyaWFsaXplJywgKCkgPT4ge1xuICAgIGl0KCdzZXJpYWxpemVzIHRhYmxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBzZXJpYWxpemF0aW9uLnNlcmlhbGl6ZSh7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICBkYXRhOiBEYXRhLmNyZWF0ZSh7XG4gICAgICAgICAgYm9yZGVyOiAnMScsXG4gICAgICAgICAgY2VsbHBhZGRpbmc6ICcyJyxcbiAgICAgICAgICBjZWxsc3BhY2luZzogJzMnLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZWwpLnRvRXF1YWwoXG4gICAgICAgIDx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbFBhZGRpbmc9XCIyXCIgY2VsbFNwYWNpbmc9XCIzXCI+XG4gICAgICAgICAgPHRib2R5IC8+XG4gICAgICAgIDwvdGFibGU+LFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXJpYWxpemVzIHRhYmxlX3JvdycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gc2VyaWFsaXphdGlvbi5zZXJpYWxpemUoe1xuICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgIHR5cGU6ICd0YWJsZV9yb3cnLFxuICAgICAgICBub2RlczogW10sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGVsKS50b0VxdWFsKDx0ciAvPik7XG4gICAgfSk7XG4gICAgaXQoJ3NlcmlhbGl6ZXMgdGFibGVfY2VsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gc2VyaWFsaXphdGlvbi5zZXJpYWxpemUoe1xuICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgIHR5cGU6ICd0YWJsZV9jZWxsJyxcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICBkYXRhOiBEYXRhLmNyZWF0ZSh7XG4gICAgICAgICAgaGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICBzdHlsZTogeyB3aWR0aDogJzEwcHgnIH0sXG4gICAgICAgICAgY2xhc3M6ICdmb28nLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZWwpLnRvRXF1YWwoPHRkIHN0eWxlPXt7IHdpZHRoOiAnMTBweCcgfX0gY2xhc3NOYW1lPXsnZm9vJ30gLz4pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsZUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFB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Ym1ELEtBQUssRUFBRSxFQUFFO1FBQ1Q1QixJQUFJLEVBQUVrQixXQUFJLENBQUNwQixNQUFNLENBQUM7VUFDaEJHLE1BQU0sRUFBRSxHQUFHO1VBQ1hzRSxXQUFXLEVBQUUsR0FBRztVQUNoQkMsV0FBVyxFQUFFO1FBQ2YsQ0FBQztNQUNILENBQUMsQ0FBQztNQUVGOUUsTUFBTSxDQUFDOEQsRUFBRSxDQUFDLENBQUMzQyxPQUFPLGNBQ2hCcEUsTUFBQSxZQUFBZ0ksYUFBQTtRQUFPeEUsTUFBTSxFQUFDLEdBQUc7UUFBQ3lFLFdBQVcsRUFBQyxHQUFHO1FBQUNDLFdBQVcsRUFBQztNQUFHLGdCQUMvQ2xJLE1BQUEsWUFBQWdJLGFBQUEsY0FBUSxDQUNILENBQ1QsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGbkYsRUFBRSxDQUFDLHNCQUFzQixFQUFFLFlBQU07TUFDL0IsSUFBTWtFLEVBQUUsR0FBR00sb0JBQWEsQ0FBQ1EsU0FBUyxDQUFDO1FBQ2pDOUYsTUFBTSxFQUFFLE9BQU87UUFDZkMsSUFBSSxFQUFFLFdBQVc7UUFDakJtRCxLQUFLLEVBQUU7TUFDVCxDQUFDLENBQUM7TUFFRmxDLE1BQU0sQ0FBQzhELEVBQUUsQ0FBQyxDQUFDM0MsT0FBTyxjQUFDcEUsTUFBQSxZQUFBZ0ksYUFBQSxXQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUM7SUFDRm5GLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxZQUFNO01BQ2hDLElBQU1rRSxFQUFFLEdBQUdNLG9CQUFhLENBQUNRLFNBQVMsQ0FBQztRQUNqQzlGLE1BQU0sRUFBRSxPQUFPO1FBQ2ZDLElBQUksRUFBRSxZQUFZO1FBQ2xCbUQsS0FBSyxFQUFFLEVBQUU7UUFDVDVCLElBQUksRUFBRWtCLFdBQUksQ0FBQ3BCLE1BQU0sQ0FBQztVQUNoQnVFLE1BQU0sRUFBRSxLQUFLO1VBQ2JPLEtBQUssRUFBRTtZQUFFN0IsS0FBSyxFQUFFO1VBQU8sQ0FBQztVQUN4QixTQUFPO1FBQ1QsQ0FBQztNQUNILENBQUMsQ0FBQztNQUVGckQsTUFBTSxDQUFDOEQsRUFBRSxDQUFDLENBQUMzQyxPQUFPLGNBQUNwRSxNQUFBLFlBQUFnSSxhQUFBO1FBQUlHLEtBQUssRUFBRTtVQUFFN0IsS0FBSyxFQUFFO1FBQU8sQ0FBRTtRQUFDOEIsU0FBUyxFQUFFO01BQU0sQ0FBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _react2 = require("@testing-library/react");
7
+ var _tableToolbar = require("../table-toolbar");
8
+ 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; }
9
+ 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; }
10
+ describe('table-toolbar', function () {
11
+ var onDone, onAddColumn, onAddRow, onRemoveColumn, onRemoveRow, onRemoveTable, onToggleBorder;
12
+ beforeEach(function () {
13
+ onAddColumn = jest.fn();
14
+ onAddRow = jest.fn();
15
+ onRemoveColumn = jest.fn();
16
+ onRemoveRow = jest.fn();
17
+ onRemoveTable = jest.fn();
18
+ onDone = jest.fn();
19
+ onToggleBorder = jest.fn();
20
+ });
21
+ var renderComponent = function renderComponent() {
22
+ var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
23
+ var props = _objectSpread({
24
+ onDone: onDone,
25
+ onAddRow: onAddRow,
26
+ onRemoveRow: onRemoveRow,
27
+ onAddColumn: onAddColumn,
28
+ onRemoveColumn: onRemoveColumn,
29
+ onRemoveTable: onRemoveTable,
30
+ hasBorder: true,
31
+ onToggleBorder: onToggleBorder,
32
+ classes: {
33
+ tableToolbar: 'table-toolbar'
34
+ },
35
+ plugins: [],
36
+ value: {},
37
+ onChange: jest.fn()
38
+ }, extras);
39
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_tableToolbar.TableToolbar, props));
40
+ };
41
+ describe('rendering', function () {
42
+ it('renders toolbar without crashing', function () {
43
+ var _renderComponent = renderComponent(),
44
+ container = _renderComponent.container;
45
+
46
+ // Check that the toolbar container is rendered
47
+ expect(container.firstChild).toBeInTheDocument();
48
+
49
+ // Check for Done button (only one with aria-label)
50
+ expect(_react2.screen.getByLabelText('Done')).toBeInTheDocument();
51
+
52
+ // Check that there are multiple buttons (table manipulation buttons)
53
+ var buttons = container.querySelectorAll('button');
54
+ expect(buttons.length).toBeGreaterThan(1);
55
+ });
56
+ it('renders with hasBorder prop', function () {
57
+ var _renderComponent2 = renderComponent({
58
+ hasBorder: false
59
+ }),
60
+ container = _renderComponent2.container;
61
+ expect(container.firstChild).toBeInTheDocument();
62
+
63
+ // Verify hasBorder affects rendering - button with aria-pressed attribute
64
+ var borderButton = container.querySelector('button[aria-pressed]');
65
+ expect(borderButton).toBeInTheDocument();
66
+ expect(borderButton).toHaveAttribute('aria-pressed', 'false');
67
+ });
68
+ it('renders with hasBorder true', function () {
69
+ var _renderComponent3 = renderComponent({
70
+ hasBorder: true
71
+ }),
72
+ container = _renderComponent3.container;
73
+
74
+ // Verify hasBorder affects rendering
75
+ var borderButton = container.querySelector('button[aria-pressed]');
76
+ expect(borderButton).toBeInTheDocument();
77
+ expect(borderButton).toHaveAttribute('aria-pressed', 'true');
78
+ });
79
+ });
80
+ });
81
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdGFibGVUb29sYmFyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uRG9uZSIsIm9uQWRkQ29sdW1uIiwib25BZGRSb3ciLCJvblJlbW92ZUNvbHVtbiIsIm9uUmVtb3ZlUm93Iiwib25SZW1vdmVUYWJsZSIsIm9uVG9nZ2xlQm9yZGVyIiwiYmVmb3JlRWFjaCIsImplc3QiLCJmbiIsInJlbmRlckNvbXBvbmVudCIsImV4dHJhcyIsInVuZGVmaW5lZCIsInByb3BzIiwiaGFzQm9yZGVyIiwiY2xhc3NlcyIsInRhYmxlVG9vbGJhciIsInBsdWdpbnMiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIlRhYmxlVG9vbGJhciIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsInNjcmVlbiIsImdldEJ5TGFiZWxUZXh0IiwiYnV0dG9ucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ0b0JlR3JlYXRlclRoYW4iLCJfcmVuZGVyQ29tcG9uZW50MiIsImJvcmRlckJ1dHRvbiIsInF1ZXJ5U2VsZWN0b3IiLCJ0b0hhdmVBdHRyaWJ1dGUiLCJfcmVuZGVyQ29tcG9uZW50MyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW5zL3RhYmxlL19fdGVzdHNfXy90YWJsZS10b29sYmFyLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIHNjcmVlbiB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IHsgVGFibGVUb29sYmFyIH0gZnJvbSAnLi4vdGFibGUtdG9vbGJhcic7XG5cbmRlc2NyaWJlKCd0YWJsZS10b29sYmFyJywgKCkgPT4ge1xuICBsZXQgb25Eb25lLCBvbkFkZENvbHVtbiwgb25BZGRSb3csIG9uUmVtb3ZlQ29sdW1uLCBvblJlbW92ZVJvdywgb25SZW1vdmVUYWJsZSwgb25Ub2dnbGVCb3JkZXI7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25BZGRDb2x1bW4gPSBqZXN0LmZuKCk7XG4gICAgb25BZGRSb3cgPSBqZXN0LmZuKCk7XG4gICAgb25SZW1vdmVDb2x1bW4gPSBqZXN0LmZuKCk7XG4gICAgb25SZW1vdmVSb3cgPSBqZXN0LmZuKCk7XG4gICAgb25SZW1vdmVUYWJsZSA9IGplc3QuZm4oKTtcbiAgICBvbkRvbmUgPSBqZXN0LmZuKCk7XG4gICAgb25Ub2dnbGVCb3JkZXIgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgb25Eb25lLFxuICAgICAgb25BZGRSb3csXG4gICAgICBvblJlbW92ZVJvdyxcbiAgICAgIG9uQWRkQ29sdW1uLFxuICAgICAgb25SZW1vdmVDb2x1bW4sXG4gICAgICBvblJlbW92ZVRhYmxlLFxuICAgICAgaGFzQm9yZGVyOiB0cnVlLFxuICAgICAgb25Ub2dnbGVCb3JkZXIsXG4gICAgICBjbGFzc2VzOiB7XG4gICAgICAgIHRhYmxlVG9vbGJhcjogJ3RhYmxlLXRvb2xiYXInLFxuICAgICAgfSxcbiAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgdmFsdWU6IHt9LFxuICAgICAgb25DaGFuZ2U6IGplc3QuZm4oKSxcbiAgICAgIC4uLmV4dHJhcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlbmRlcig8VGFibGVUb29sYmFyIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgdG9vbGJhciB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IHRoZSB0b29sYmFyIGNvbnRhaW5lciBpcyByZW5kZXJlZFxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgRG9uZSBidXR0b24gKG9ubHkgb25lIHdpdGggYXJpYS1sYWJlbClcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0RvbmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgYnV0dG9ucyAodGFibGUgbWFuaXB1bGF0aW9uIGJ1dHRvbnMpXG4gICAgICBjb25zdCBidXR0b25zID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgICAgZXhwZWN0KGJ1dHRvbnMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGhhc0JvcmRlciBwcm9wJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGhhc0JvcmRlcjogZmFsc2UgfSk7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgLy8gVmVyaWZ5IGhhc0JvcmRlciBhZmZlY3RzIHJlbmRlcmluZyAtIGJ1dHRvbiB3aXRoIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGJvcmRlckJ1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdidXR0b25bYXJpYS1wcmVzc2VkXScpO1xuICAgICAgZXhwZWN0KGJvcmRlckJ1dHRvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChib3JkZXJCdXR0b24pLnRvSGF2ZUF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGhhc0JvcmRlciB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGhhc0JvcmRlcjogdHJ1ZSB9KTtcblxuICAgICAgLy8gVmVyaWZ5IGhhc0JvcmRlciBhZmZlY3RzIHJlbmRlcmluZ1xuICAgICAgY29uc3QgYm9yZGVyQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvblthcmlhLXByZXNzZWRdJyk7XG4gICAgICBleHBlY3QoYm9yZGVyQnV0dG9uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGJvcmRlckJ1dHRvbikudG9IYXZlQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsYUFBQSxHQUFBRixPQUFBO0FBQWdELFNBQUFHLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFC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