@pie-lib/editable-html-tip-tap 2.1.20-beta.6 → 2.1.20-beta.8

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 (94) hide show
  1. package/lib/__tests__/EditableHtml.test.js +831 -0
  2. package/lib/__tests__/constants.test.js +21 -0
  3. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  4. package/lib/__tests__/extensions.test.js +209 -0
  5. package/lib/__tests__/index.test.js +250 -0
  6. package/lib/__tests__/size-utils.test.js +57 -0
  7. package/lib/__tests__/spellcheck.test.js +142 -0
  8. package/lib/__tests__/theme.test.js +17 -0
  9. package/lib/components/__tests__/AltDialog.test.js +201 -0
  10. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  11. package/lib/components/__tests__/CssIcon.test.js +58 -0
  12. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  13. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  14. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  15. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  16. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  17. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  18. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  19. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  20. package/lib/components/__tests__/MenuBar.test.js +502 -0
  21. package/lib/components/__tests__/RespArea.test.js +171 -0
  22. package/lib/components/__tests__/TableIcons.test.js +153 -0
  23. package/lib/components/__tests__/TextAlign.test.js +209 -0
  24. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  25. package/lib/components/__tests__/characterUtils.test.js +178 -0
  26. package/lib/components/__tests__/choice.test.js +213 -0
  27. package/lib/components/__tests__/custom-popper.test.js +108 -0
  28. package/lib/components/__tests__/done-button.test.js +72 -0
  29. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  30. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  31. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  32. package/lib/extensions/__tests__/css.test.js +214 -0
  33. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  34. package/lib/extensions/__tests__/divNode.test.js +108 -0
  35. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  36. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  37. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  38. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  39. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  40. package/lib/extensions/__tests__/image-component.test.js +432 -0
  41. package/lib/extensions/__tests__/image.test.js +313 -0
  42. package/lib/extensions/__tests__/math.test.js +1411 -0
  43. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  44. package/lib/extensions/__tests__/media.test.js +292 -0
  45. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  46. package/lib/utils/__tests__/helper.test.js +107 -0
  47. package/lib/utils/__tests__/toolbar.test.js +38 -0
  48. package/package.json +3 -3
  49. package/src/__tests__/EditableHtml.test.jsx +588 -0
  50. package/src/__tests__/constants.test.js +19 -0
  51. package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
  52. package/src/__tests__/extensions.test.js +208 -0
  53. package/src/__tests__/index.test.jsx +154 -0
  54. package/src/__tests__/size-utils.test.js +64 -0
  55. package/src/__tests__/theme.test.js +17 -0
  56. package/src/components/__tests__/AltDialog.test.jsx +147 -0
  57. package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
  58. package/src/components/__tests__/CssIcon.test.jsx +46 -0
  59. package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
  60. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
  61. package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
  62. package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
  63. package/src/components/__tests__/InsertImageHandler.test.js +161 -0
  64. package/src/components/__tests__/MediaDialog.test.jsx +293 -0
  65. package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
  66. package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
  67. package/src/components/__tests__/MenuBar.test.jsx +250 -0
  68. package/src/components/__tests__/RespArea.test.jsx +122 -0
  69. package/src/components/__tests__/TableIcons.test.jsx +149 -0
  70. package/src/components/__tests__/TextAlign.test.jsx +167 -0
  71. package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
  72. package/src/components/__tests__/characterUtils.test.js +166 -0
  73. package/src/components/__tests__/choice.test.jsx +171 -0
  74. package/src/components/__tests__/custom-popper.test.jsx +82 -0
  75. package/src/components/__tests__/done-button.test.jsx +54 -0
  76. package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
  77. package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
  78. package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
  79. package/src/extensions/__tests__/css.test.js +196 -0
  80. package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
  81. package/src/extensions/__tests__/divNode.test.js +87 -0
  82. package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
  83. package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
  84. package/src/extensions/__tests__/extended-list-item.test.js +13 -0
  85. package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
  86. package/src/extensions/__tests__/extended-table.test.js +183 -0
  87. package/src/extensions/__tests__/image-component.test.jsx +346 -0
  88. package/src/extensions/__tests__/image.test.js +237 -0
  89. package/src/extensions/__tests__/math.test.js +900 -0
  90. package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
  91. package/src/extensions/__tests__/media.test.js +271 -0
  92. package/src/extensions/__tests__/responseArea.test.js +655 -0
  93. package/src/utils/__tests__/helper.test.js +126 -0
  94. package/src/utils/__tests__/toolbar.test.js +43 -0
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
7
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _react2 = require("@testing-library/react");
10
+ var _DragInTheBlank = _interopRequireWildcard(require("../respArea/DragInTheBlank/DragInTheBlank"));
11
+ var _excluded = ["children"];
12
+ 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); }
13
+ 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; }
14
+ 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; }
15
+ jest.mock('@tiptap/react', function () {
16
+ return {
17
+ NodeViewWrapper: function NodeViewWrapper(_ref) {
18
+ var children = _ref.children,
19
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
20
+ return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
21
+ "data-testid": "node-view-wrapper"
22
+ }, props), children);
23
+ }
24
+ };
25
+ });
26
+ jest.mock('../respArea/DragInTheBlank/choice', function () {
27
+ return {
28
+ __esModule: true,
29
+ "default": function _default(_ref2) {
30
+ var n = _ref2.n,
31
+ dragKey = _ref2.dragKey,
32
+ targetId = _ref2.targetId,
33
+ pos = _ref2.pos,
34
+ value = _ref2.value,
35
+ onChange = _ref2.onChange,
36
+ removeResponse = _ref2.removeResponse;
37
+ return /*#__PURE__*/_react["default"].createElement("div", {
38
+ "data-testid": "drag-drop-tile",
39
+ "data-drag-key": dragKey,
40
+ "data-target-id": targetId,
41
+ "data-pos": pos
42
+ }, "Tile");
43
+ }
44
+ };
45
+ });
46
+ describe('onValueChange', function () {
47
+ it('dispatches transaction with updated attributes', function () {
48
+ var mockEditor = {
49
+ state: {
50
+ tr: {
51
+ setNodeMarkup: jest.fn(function () {
52
+ return this;
53
+ }),
54
+ isDone: false
55
+ }
56
+ },
57
+ view: {
58
+ dispatch: jest.fn()
59
+ }
60
+ };
61
+ var mockNode = {
62
+ attrs: {
63
+ id: '1',
64
+ value: 'old'
65
+ }
66
+ };
67
+ var choice = {
68
+ value: {
69
+ id: '2',
70
+ value: 'new'
71
+ }
72
+ };
73
+ (0, _DragInTheBlank.onValueChange)(mockEditor, mockNode, 5, choice);
74
+ expect(mockEditor.state.tr.setNodeMarkup).toHaveBeenCalledWith(5, undefined, _objectSpread({
75
+ id: '1',
76
+ value: 'old'
77
+ }, choice.value));
78
+ expect(mockEditor.view.dispatch).toHaveBeenCalled();
79
+ });
80
+ it('sets isDone flag on transaction', function () {
81
+ var mockEditor = {
82
+ state: {
83
+ tr: {
84
+ setNodeMarkup: jest.fn(function () {
85
+ return this;
86
+ }),
87
+ isDone: false
88
+ }
89
+ },
90
+ view: {
91
+ dispatch: jest.fn()
92
+ }
93
+ };
94
+ var mockNode = {
95
+ attrs: {}
96
+ };
97
+ var choice = {
98
+ value: {}
99
+ };
100
+ (0, _DragInTheBlank.onValueChange)(mockEditor, mockNode, 0, choice);
101
+ expect(mockEditor.state.tr.isDone).toBe(true);
102
+ });
103
+ });
104
+ describe('onRemoveResponse', function () {
105
+ it('dispatches transaction removing value and id', function () {
106
+ var mockEditor = {
107
+ state: {
108
+ tr: {
109
+ setNodeMarkup: jest.fn(function () {
110
+ return this;
111
+ }),
112
+ isDone: false
113
+ }
114
+ },
115
+ view: {
116
+ dispatch: jest.fn()
117
+ }
118
+ };
119
+ var mockNode = {
120
+ attrs: {
121
+ id: '1',
122
+ value: 'test',
123
+ other: 'keep'
124
+ }
125
+ };
126
+ var choice = {
127
+ pos: 5
128
+ };
129
+ (0, _DragInTheBlank.onRemoveResponse)(mockEditor, mockNode, choice);
130
+ expect(mockEditor.state.tr.setNodeMarkup).toHaveBeenCalledWith(5, undefined, {
131
+ other: 'keep'
132
+ });
133
+ expect(mockEditor.view.dispatch).toHaveBeenCalled();
134
+ });
135
+ it('sets isDone flag on transaction', function () {
136
+ var mockEditor = {
137
+ state: {
138
+ tr: {
139
+ setNodeMarkup: jest.fn(function () {
140
+ return this;
141
+ }),
142
+ isDone: false
143
+ }
144
+ },
145
+ view: {
146
+ dispatch: jest.fn()
147
+ }
148
+ };
149
+ var mockNode = {
150
+ attrs: {
151
+ id: '1',
152
+ value: 'test'
153
+ }
154
+ };
155
+ var choice = {
156
+ pos: 0
157
+ };
158
+ (0, _DragInTheBlank.onRemoveResponse)(mockEditor, mockNode, choice);
159
+ expect(mockEditor.state.tr.isDone).toBe(true);
160
+ });
161
+ });
162
+ describe('DragDrop', function () {
163
+ var mockEditor = {
164
+ state: {
165
+ tr: {
166
+ setNodeMarkup: jest.fn(function () {
167
+ return this;
168
+ })
169
+ }
170
+ },
171
+ view: {
172
+ dispatch: jest.fn()
173
+ }
174
+ };
175
+ var mockNode = {
176
+ attrs: {
177
+ id: '1',
178
+ value: 'Test',
179
+ index: '0',
180
+ inTable: false
181
+ },
182
+ nodeSize: 1
183
+ };
184
+ var mockOptions = {
185
+ duplicates: false
186
+ };
187
+ var defaultProps = {
188
+ editor: mockEditor,
189
+ node: mockNode,
190
+ getPos: function getPos() {
191
+ return 5;
192
+ },
193
+ options: mockOptions,
194
+ selected: false
195
+ };
196
+ beforeEach(function () {
197
+ jest.clearAllMocks();
198
+ });
199
+ it('renders without crashing', function () {
200
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
201
+ container = _render.container;
202
+ expect(container).toBeInTheDocument();
203
+ });
204
+ it('renders NodeViewWrapper', function () {
205
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
206
+ getByTestId = _render2.getByTestId;
207
+ expect(getByTestId('node-view-wrapper')).toBeInTheDocument();
208
+ });
209
+ it('renders DragDropTile', function () {
210
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
211
+ getByTestId = _render3.getByTestId;
212
+ expect(getByTestId('drag-drop-tile')).toBeInTheDocument();
213
+ });
214
+ it('passes attributes to DragDropTile', function () {
215
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
216
+ getByTestId = _render4.getByTestId;
217
+ var tile = getByTestId('drag-drop-tile');
218
+ expect(tile).toHaveAttribute('data-drag-key', '1');
219
+ expect(tile).toHaveAttribute('data-target-id', '0');
220
+ expect(tile).toHaveAttribute('data-pos', '5');
221
+ });
222
+ it('applies correct margin when not in table', function () {
223
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
224
+ container = _render5.container;
225
+ var span = container.querySelector('span[style*="margin"]');
226
+ expect(span).toHaveStyle({
227
+ margin: '0 10px'
228
+ });
229
+ });
230
+ it('applies correct margin when in table', function () {
231
+ var nodeInTable = _objectSpread(_objectSpread({}, mockNode), {}, {
232
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
233
+ inTable: true
234
+ })
235
+ });
236
+ var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], (0, _extends2["default"])({}, defaultProps, {
237
+ node: nodeInTable
238
+ }))),
239
+ container = _render6.container;
240
+ var span = container.querySelector('span[style*="margin"]');
241
+ expect(span).toHaveStyle({
242
+ margin: '10px'
243
+ });
244
+ });
245
+ it('has inline-flex display', function () {
246
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
247
+ container = _render7.container;
248
+ var span = container.querySelector('span[style*="display"]');
249
+ expect(span).toHaveStyle({
250
+ display: 'inline-flex'
251
+ });
252
+ });
253
+ it('has correct minimum height', function () {
254
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
255
+ container = _render8.container;
256
+ var span = container.querySelector('span[style*="display"]');
257
+ expect(span).toHaveStyle({
258
+ minHeight: '50px'
259
+ });
260
+ });
261
+ it('has correct minimum width', function () {
262
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
263
+ container = _render9.container;
264
+ var span = container.querySelector('span[style*="display"]');
265
+ expect(span).toHaveStyle({
266
+ minWidth: '178px'
267
+ });
268
+ });
269
+ it('has cursor pointer style', function () {
270
+ var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], defaultProps)),
271
+ container = _render0.container;
272
+ var span = container.querySelector('span[style*="cursor"]');
273
+ expect(span).toHaveStyle({
274
+ cursor: 'pointer'
275
+ });
276
+ });
277
+ it('passes duplicates option to DragDropTile', function () {
278
+ var optionsWithDuplicates = _objectSpread(_objectSpread({}, mockOptions), {}, {
279
+ duplicates: true
280
+ });
281
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], (0, _extends2["default"])({}, defaultProps, {
282
+ options: optionsWithDuplicates
283
+ })));
284
+ expect(true).toBe(true); // DragDropTile is mocked, so we just verify it renders
285
+ });
286
+ it('sets data-selected attribute on NodeViewWrapper', function () {
287
+ var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_DragInTheBlank["default"], (0, _extends2["default"])({}, defaultProps, {
288
+ selected: true
289
+ }))),
290
+ getByTestId = _render1.getByTestId;
291
+ var wrapper = getByTestId('node-view-wrapper');
292
+ expect(wrapper).toHaveAttribute('data-selected', 'true');
293
+ });
294
+ });
295
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfRHJhZ0luVGhlQmxhbmsiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9leGNsdWRlZCIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJqZXN0IiwibW9jayIsIk5vZGVWaWV3V3JhcHBlciIsIl9yZWYiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJkZWZhdWx0IiwiX3JlZjIiLCJkcmFnS2V5IiwidGFyZ2V0SWQiLCJwb3MiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwicmVtb3ZlUmVzcG9uc2UiLCJkZXNjcmliZSIsIml0IiwibW9ja0VkaXRvciIsInN0YXRlIiwidHIiLCJzZXROb2RlTWFya3VwIiwiZm4iLCJpc0RvbmUiLCJ2aWV3IiwiZGlzcGF0Y2giLCJtb2NrTm9kZSIsImF0dHJzIiwiaWQiLCJjaG9pY2UiLCJvblZhbHVlQ2hhbmdlIiwiZXhwZWN0IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJ1bmRlZmluZWQiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwidG9CZSIsIm90aGVyIiwib25SZW1vdmVSZXNwb25zZSIsImluZGV4IiwiaW5UYWJsZSIsIm5vZGVTaXplIiwibW9ja09wdGlvbnMiLCJkdXBsaWNhdGVzIiwiZGVmYXVsdFByb3BzIiwiZWRpdG9yIiwibm9kZSIsImdldFBvcyIsIm9wdGlvbnMiLCJzZWxlY3RlZCIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwiX3JlbmRlciIsInJlbmRlciIsImNvbnRhaW5lciIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlcjIiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXIzIiwiX3JlbmRlcjQiLCJ0aWxlIiwidG9IYXZlQXR0cmlidXRlIiwiX3JlbmRlcjUiLCJzcGFuIiwicXVlcnlTZWxlY3RvciIsInRvSGF2ZVN0eWxlIiwibWFyZ2luIiwibm9kZUluVGFibGUiLCJfcmVuZGVyNiIsIl9yZW5kZXI3IiwiZGlzcGxheSIsIl9yZW5kZXI4IiwibWluSGVpZ2h0IiwiX3JlbmRlcjkiLCJtaW5XaWR0aCIsIl9yZW5kZXIwIiwiY3Vyc29yIiwib3B0aW9uc1dpdGhEdXBsaWNhdGVzIiwiX3JlbmRlcjEiLCJ3cmFwcGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL0RyYWdJblRoZUJsYW5rLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBEcmFnRHJvcCwgeyBvblJlbW92ZVJlc3BvbnNlLCBvblZhbHVlQ2hhbmdlIH0gZnJvbSAnLi4vcmVzcEFyZWEvRHJhZ0luVGhlQmxhbmsvRHJhZ0luVGhlQmxhbmsnO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCIgey4uLnByb3BzfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9yZXNwQXJlYS9EcmFnSW5UaGVCbGFuay9jaG9pY2UnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiAoeyBuLCBkcmFnS2V5LCB0YXJnZXRJZCwgcG9zLCB2YWx1ZSwgb25DaGFuZ2UsIHJlbW92ZVJlc3BvbnNlIH0pID0+IChcbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiZHJhZy1kcm9wLXRpbGVcIiBkYXRhLWRyYWcta2V5PXtkcmFnS2V5fSBkYXRhLXRhcmdldC1pZD17dGFyZ2V0SWR9IGRhdGEtcG9zPXtwb3N9PlxuICAgICAgVGlsZVxuICAgIDwvZGl2PlxuICApLFxufSkpO1xuXG5kZXNjcmliZSgnb25WYWx1ZUNoYW5nZScsICgpID0+IHtcbiAgaXQoJ2Rpc3BhdGNoZXMgdHJhbnNhY3Rpb24gd2l0aCB1cGRhdGVkIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja0VkaXRvciA9IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIHRyOiB7XG4gICAgICAgICAgc2V0Tm9kZU1hcmt1cDogamVzdC5mbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBpc0RvbmU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHZpZXc6IHtcbiAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tOb2RlID0ge1xuICAgICAgYXR0cnM6IHsgaWQ6ICcxJywgdmFsdWU6ICdvbGQnIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGNob2ljZSA9IHtcbiAgICAgIHZhbHVlOiB7IGlkOiAnMicsIHZhbHVlOiAnbmV3JyB9LFxuICAgIH07XG5cbiAgICBvblZhbHVlQ2hhbmdlKG1vY2tFZGl0b3IsIG1vY2tOb2RlLCA1LCBjaG9pY2UpO1xuXG4gICAgZXhwZWN0KG1vY2tFZGl0b3Iuc3RhdGUudHIuc2V0Tm9kZU1hcmt1cCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSwgdW5kZWZpbmVkLCB7XG4gICAgICBpZDogJzEnLFxuICAgICAgdmFsdWU6ICdvbGQnLFxuICAgICAgLi4uY2hvaWNlLnZhbHVlLFxuICAgIH0pO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3NldHMgaXNEb25lIGZsYWcgb24gdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja0VkaXRvciA9IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIHRyOiB7XG4gICAgICAgICAgc2V0Tm9kZU1hcmt1cDogamVzdC5mbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBpc0RvbmU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHZpZXc6IHtcbiAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tOb2RlID0ge1xuICAgICAgYXR0cnM6IHt9LFxuICAgIH07XG5cbiAgICBjb25zdCBjaG9pY2UgPSB7XG4gICAgICB2YWx1ZToge30sXG4gICAgfTtcblxuICAgIG9uVmFsdWVDaGFuZ2UobW9ja0VkaXRvciwgbW9ja05vZGUsIDAsIGNob2ljZSk7XG5cbiAgICBleHBlY3QobW9ja0VkaXRvci5zdGF0ZS50ci5pc0RvbmUpLnRvQmUodHJ1ZSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdvblJlbW92ZVJlc3BvbnNlJywgKCkgPT4ge1xuICBpdCgnZGlzcGF0Y2hlcyB0cmFuc2FjdGlvbiByZW1vdmluZyB2YWx1ZSBhbmQgaWQnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja0VkaXRvciA9IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIHRyOiB7XG4gICAgICAgICAgc2V0Tm9kZU1hcmt1cDogamVzdC5mbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBpc0RvbmU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHZpZXc6IHtcbiAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tOb2RlID0ge1xuICAgICAgYXR0cnM6IHsgaWQ6ICcxJywgdmFsdWU6ICd0ZXN0Jywgb3RoZXI6ICdrZWVwJyB9LFxuICAgIH07XG5cbiAgICBjb25zdCBjaG9pY2UgPSB7XG4gICAgICBwb3M6IDUsXG4gICAgfTtcblxuICAgIG9uUmVtb3ZlUmVzcG9uc2UobW9ja0VkaXRvciwgbW9ja05vZGUsIGNob2ljZSk7XG5cbiAgICBleHBlY3QobW9ja0VkaXRvci5zdGF0ZS50ci5zZXROb2RlTWFya3VwKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg1LCB1bmRlZmluZWQsIHsgb3RoZXI6ICdrZWVwJyB9KTtcbiAgICBleHBlY3QobW9ja0VkaXRvci52aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdzZXRzIGlzRG9uZSBmbGFnIG9uIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tFZGl0b3IgPSB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICB0cjoge1xuICAgICAgICAgIHNldE5vZGVNYXJrdXA6IGplc3QuZm4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgaXNEb25lOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB2aWV3OiB7XG4gICAgICAgIGRpc3BhdGNoOiBqZXN0LmZuKCksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrTm9kZSA9IHtcbiAgICAgIGF0dHJzOiB7IGlkOiAnMScsIHZhbHVlOiAndGVzdCcgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2hvaWNlID0ge1xuICAgICAgcG9zOiAwLFxuICAgIH07XG5cbiAgICBvblJlbW92ZVJlc3BvbnNlKG1vY2tFZGl0b3IsIG1vY2tOb2RlLCBjaG9pY2UpO1xuXG4gICAgZXhwZWN0KG1vY2tFZGl0b3Iuc3RhdGUudHIuaXNEb25lKS50b0JlKHRydWUpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRHJhZ0Ryb3AnLCAoKSA9PiB7XG4gIGNvbnN0IG1vY2tFZGl0b3IgPSB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHRyOiB7XG4gICAgICAgIHNldE5vZGVNYXJrdXA6IGplc3QuZm4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB2aWV3OiB7XG4gICAgICBkaXNwYXRjaDogamVzdC5mbigpLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgbW9ja05vZGUgPSB7XG4gICAgYXR0cnM6IHtcbiAgICAgIGlkOiAnMScsXG4gICAgICB2YWx1ZTogJ1Rlc3QnLFxuICAgICAgaW5kZXg6ICcwJyxcbiAgICAgIGluVGFibGU6IGZhbHNlLFxuICAgIH0sXG4gICAgbm9kZVNpemU6IDEsXG4gIH07XG5cbiAgY29uc3QgbW9ja09wdGlvbnMgPSB7XG4gICAgZHVwbGljYXRlczogZmFsc2UsXG4gIH07XG5cbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIGVkaXRvcjogbW9ja0VkaXRvcixcbiAgICBub2RlOiBtb2NrTm9kZSxcbiAgICBnZXRQb3M6ICgpID0+IDUsXG4gICAgb3B0aW9uczogbW9ja09wdGlvbnMsXG4gICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPERyYWdEcm9wIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyBOb2RlVmlld1dyYXBwZXInLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxEcmFnRHJvcCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgZXhwZWN0KGdldEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyBEcmFnRHJvcFRpbGUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxEcmFnRHJvcCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgZXhwZWN0KGdldEJ5VGVzdElkKCdkcmFnLWRyb3AtdGlsZScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgncGFzc2VzIGF0dHJpYnV0ZXMgdG8gRHJhZ0Ryb3BUaWxlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcig8RHJhZ0Ryb3Agey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IHRpbGUgPSBnZXRCeVRlc3RJZCgnZHJhZy1kcm9wLXRpbGUnKTtcbiAgICBleHBlY3QodGlsZSkudG9IYXZlQXR0cmlidXRlKCdkYXRhLWRyYWcta2V5JywgJzEnKTtcbiAgICBleHBlY3QodGlsZSkudG9IYXZlQXR0cmlidXRlKCdkYXRhLXRhcmdldC1pZCcsICcwJyk7XG4gICAgZXhwZWN0KHRpbGUpLnRvSGF2ZUF0dHJpYnV0ZSgnZGF0YS1wb3MnLCAnNScpO1xuICB9KTtcblxuICBpdCgnYXBwbGllcyBjb3JyZWN0IG1hcmdpbiB3aGVuIG5vdCBpbiB0YWJsZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEcmFnRHJvcCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3Qgc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzcGFuW3N0eWxlKj1cIm1hcmdpblwiXScpO1xuICAgIGV4cGVjdChzcGFuKS50b0hhdmVTdHlsZSh7IG1hcmdpbjogJzAgMTBweCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGNvcnJlY3QgbWFyZ2luIHdoZW4gaW4gdGFibGUnLCAoKSA9PiB7XG4gICAgY29uc3Qgbm9kZUluVGFibGUgPSB7IC4uLm1vY2tOb2RlLCBhdHRyczogeyAuLi5tb2NrTm9kZS5hdHRycywgaW5UYWJsZTogdHJ1ZSB9IH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8RHJhZ0Ryb3Agey4uLmRlZmF1bHRQcm9wc30gbm9kZT17bm9kZUluVGFibGV9IC8+KTtcbiAgICBjb25zdCBzcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwibWFyZ2luXCJdJyk7XG4gICAgZXhwZWN0KHNwYW4pLnRvSGF2ZVN0eWxlKHsgbWFyZ2luOiAnMTBweCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdoYXMgaW5saW5lLWZsZXggZGlzcGxheScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEcmFnRHJvcCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3Qgc3BhbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzcGFuW3N0eWxlKj1cImRpc3BsYXlcIl0nKTtcbiAgICBleHBlY3Qoc3BhbikudG9IYXZlU3R5bGUoeyBkaXNwbGF5OiAnaW5saW5lLWZsZXgnIH0pO1xuICB9KTtcblxuICBpdCgnaGFzIGNvcnJlY3QgbWluaW11bSBoZWlnaHQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8RHJhZ0Ryb3Agey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IHNwYW4gPSBjb250YWluZXIucXVlcnlTZWxlY3Rvcignc3BhbltzdHlsZSo9XCJkaXNwbGF5XCJdJyk7XG4gICAgZXhwZWN0KHNwYW4pLnRvSGF2ZVN0eWxlKHsgbWluSGVpZ2h0OiAnNTBweCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdoYXMgY29ycmVjdCBtaW5pbXVtIHdpZHRoJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPERyYWdEcm9wIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCBzcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiZGlzcGxheVwiXScpO1xuICAgIGV4cGVjdChzcGFuKS50b0hhdmVTdHlsZSh7IG1pbldpZHRoOiAnMTc4cHgnIH0pO1xuICB9KTtcblxuICBpdCgnaGFzIGN1cnNvciBwb2ludGVyIHN0eWxlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPERyYWdEcm9wIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCBzcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bc3R5bGUqPVwiY3Vyc29yXCJdJyk7XG4gICAgZXhwZWN0KHNwYW4pLnRvSGF2ZVN0eWxlKHsgY3Vyc29yOiAncG9pbnRlcicgfSk7XG4gIH0pO1xuXG4gIGl0KCdwYXNzZXMgZHVwbGljYXRlcyBvcHRpb24gdG8gRHJhZ0Ryb3BUaWxlJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoRHVwbGljYXRlcyA9IHsgLi4ubW9ja09wdGlvbnMsIGR1cGxpY2F0ZXM6IHRydWUgfTtcbiAgICByZW5kZXIoPERyYWdEcm9wIHsuLi5kZWZhdWx0UHJvcHN9IG9wdGlvbnM9e29wdGlvbnNXaXRoRHVwbGljYXRlc30gLz4pO1xuICAgIGV4cGVjdCh0cnVlKS50b0JlKHRydWUpOyAvLyBEcmFnRHJvcFRpbGUgaXMgbW9ja2VkLCBzbyB3ZSBqdXN0IHZlcmlmeSBpdCByZW5kZXJzXG4gIH0pO1xuXG4gIGl0KCdzZXRzIGRhdGEtc2VsZWN0ZWQgYXR0cmlidXRlIG9uIE5vZGVWaWV3V3JhcHBlcicsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPERyYWdEcm9wIHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpO1xuICAgIGV4cGVjdCh3cmFwcGVyKS50b0hhdmVBdHRyaWJ1dGUoJ2RhdGEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsZUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQXNHLElBQUFJLFNBQUE7QUFBQSxTQUFBRCx3QkFBQUUsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUosdUJBQUEsWUFBQUEsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxtQkFBQVQsQ0FBQSxpQkFBQUEsQ0FBQSxnQkFBQVUsT0FBQSxDQUFBVixDQUFBLDBCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENB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