@pie-lib/editable-html-tip-tap 1.1.0-next.6059 → 1.1.1-next.1

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 (152) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/lib/__tests__/EditableHtml.test.js +374 -0
  3. package/lib/__tests__/constants.test.js +28 -0
  4. package/lib/__tests__/extensions.test.js +214 -0
  5. package/lib/__tests__/index.test.js +246 -0
  6. package/lib/__tests__/size-utils.test.js +57 -0
  7. package/lib/__tests__/theme.test.js +17 -0
  8. package/lib/components/CharacterPicker.js +18 -0
  9. package/lib/components/CharacterPicker.js.map +1 -1
  10. package/lib/components/EditableHtml.js +22 -5
  11. package/lib/components/EditableHtml.js.map +1 -1
  12. package/lib/components/MenuBar.js +17 -0
  13. package/lib/components/MenuBar.js.map +1 -1
  14. package/lib/components/TiptapContainer.js +16 -0
  15. package/lib/components/TiptapContainer.js.map +1 -1
  16. package/lib/components/__tests__/AltDialog.test.js +201 -0
  17. package/lib/components/__tests__/CharacterPicker.test.js +313 -0
  18. package/lib/components/__tests__/CssIcon.test.js +58 -0
  19. package/lib/components/__tests__/DragInTheBlank.test.js +309 -0
  20. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +263 -0
  21. package/lib/components/__tests__/ImageToolbar.test.js +195 -0
  22. package/lib/components/__tests__/InlineDropdown.test.js +297 -0
  23. package/lib/components/__tests__/InsertImageHandler.test.js +162 -0
  24. package/lib/components/__tests__/MediaDialog.test.js +435 -0
  25. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  26. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  27. package/lib/components/__tests__/MenuBar.test.js +459 -0
  28. package/lib/components/__tests__/RespArea.test.js +171 -0
  29. package/lib/components/__tests__/TableIcons.test.js +153 -0
  30. package/lib/components/__tests__/TextAlign.test.js +216 -0
  31. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  32. package/lib/components/__tests__/characterUtils.test.js +189 -0
  33. package/lib/components/__tests__/choice.test.js +213 -0
  34. package/lib/components/__tests__/custom-popper.test.js +108 -0
  35. package/lib/components/__tests__/done-button.test.js +72 -0
  36. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  37. package/lib/components/characters/characterUtils.js +2 -0
  38. package/lib/components/characters/characterUtils.js.map +1 -1
  39. package/lib/components/characters/custom-popper.js +1 -0
  40. package/lib/components/characters/custom-popper.js.map +1 -1
  41. package/lib/components/common/done-button.js +1 -0
  42. package/lib/components/common/done-button.js.map +1 -1
  43. package/lib/components/common/toolbar-buttons.js +12 -0
  44. package/lib/components/common/toolbar-buttons.js.map +1 -1
  45. package/lib/components/icons/CssIcon.js +1 -0
  46. package/lib/components/icons/CssIcon.js.map +1 -1
  47. package/lib/components/icons/RespArea.js +10 -0
  48. package/lib/components/icons/RespArea.js.map +1 -1
  49. package/lib/components/icons/TableIcons.js +1 -0
  50. package/lib/components/icons/TableIcons.js.map +1 -1
  51. package/lib/components/icons/TextAlign.js +7 -0
  52. package/lib/components/icons/TextAlign.js.map +1 -1
  53. package/lib/components/image/AltDialog.js +5 -0
  54. package/lib/components/image/AltDialog.js.map +1 -1
  55. package/lib/components/image/ImageToolbar.js +13 -0
  56. package/lib/components/image/ImageToolbar.js.map +1 -1
  57. package/lib/components/image/InsertImageHandler.js +10 -0
  58. package/lib/components/image/InsertImageHandler.js.map +1 -1
  59. package/lib/components/media/MediaDialog.js +18 -0
  60. package/lib/components/media/MediaDialog.js.map +1 -1
  61. package/lib/components/media/MediaToolbar.js +2 -0
  62. package/lib/components/media/MediaToolbar.js.map +1 -1
  63. package/lib/components/media/MediaWrapper.js +11 -0
  64. package/lib/components/media/MediaWrapper.js.map +1 -1
  65. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +10 -0
  66. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -1
  67. package/lib/components/respArea/DragInTheBlank/choice.js +8 -0
  68. package/lib/components/respArea/DragInTheBlank/choice.js.map +1 -1
  69. package/lib/components/respArea/ExplicitConstructedResponse.js +8 -0
  70. package/lib/components/respArea/ExplicitConstructedResponse.js.map +1 -1
  71. package/lib/components/respArea/InlineDropdown.js +7 -0
  72. package/lib/components/respArea/InlineDropdown.js.map +1 -1
  73. package/lib/components/respArea/ToolbarIcon.js +10 -0
  74. package/lib/components/respArea/ToolbarIcon.js.map +1 -1
  75. package/lib/constants.js +1 -0
  76. package/lib/constants.js.map +1 -1
  77. package/lib/extensions/__tests__/component.test.js +314 -0
  78. package/lib/extensions/__tests__/css.test.js +218 -0
  79. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +185 -0
  80. package/lib/extensions/__tests__/extended-table.test.js +114 -0
  81. package/lib/extensions/__tests__/image.test.js +178 -0
  82. package/lib/extensions/__tests__/media.test.js +296 -0
  83. package/lib/extensions/__tests__/responseArea.test.js +332 -0
  84. package/lib/extensions/component.js +22 -2
  85. package/lib/extensions/css.js +11 -0
  86. package/lib/extensions/css.js.map +1 -1
  87. package/lib/extensions/custom-toolbar-wrapper.js +15 -0
  88. package/lib/extensions/custom-toolbar-wrapper.js.map +1 -1
  89. package/lib/extensions/extended-table.js +4 -0
  90. package/lib/extensions/extended-table.js.map +1 -1
  91. package/lib/extensions/image-component.js +314 -0
  92. package/lib/extensions/image-component.js.map +1 -0
  93. package/lib/extensions/image.js +13 -2
  94. package/lib/extensions/image.js.map +1 -1
  95. package/lib/extensions/index.js +12 -2
  96. package/lib/extensions/index.js.map +1 -1
  97. package/lib/extensions/math.js +16 -0
  98. package/lib/extensions/math.js.map +1 -1
  99. package/lib/extensions/media.js +15 -0
  100. package/lib/extensions/media.js.map +1 -1
  101. package/lib/extensions/responseArea.js +22 -0
  102. package/lib/extensions/responseArea.js.map +1 -1
  103. package/lib/index.js +7 -0
  104. package/lib/index.js.map +1 -1
  105. package/lib/styles/editorContainerStyles.js +1 -0
  106. package/lib/styles/editorContainerStyles.js.map +1 -1
  107. package/lib/theme.js +1 -0
  108. package/lib/theme.js.map +1 -1
  109. package/lib/utils/size.js +6 -0
  110. package/lib/utils/size.js.map +1 -1
  111. package/package.json +8 -8
  112. package/src/__tests__/EditableHtml.test.jsx +266 -0
  113. package/src/__tests__/constants.test.js +20 -0
  114. package/src/__tests__/extensions.test.js +208 -0
  115. package/src/__tests__/index.test.jsx +146 -0
  116. package/src/__tests__/size-utils.test.js +64 -0
  117. package/src/__tests__/theme.test.js +17 -0
  118. package/src/components/EditableHtml.jsx +8 -6
  119. package/src/components/__tests__/AltDialog.test.jsx +147 -0
  120. package/src/components/__tests__/CharacterPicker.test.jsx +195 -0
  121. package/src/components/__tests__/CssIcon.test.jsx +46 -0
  122. package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
  123. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +161 -0
  124. package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
  125. package/src/components/__tests__/InlineDropdown.test.jsx +187 -0
  126. package/src/components/__tests__/InsertImageHandler.test.js +154 -0
  127. package/src/components/__tests__/MediaDialog.test.jsx +293 -0
  128. package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
  129. package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
  130. package/src/components/__tests__/MenuBar.test.jsx +217 -0
  131. package/src/components/__tests__/RespArea.test.jsx +122 -0
  132. package/src/components/__tests__/TableIcons.test.jsx +149 -0
  133. package/src/components/__tests__/TextAlign.test.jsx +167 -0
  134. package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
  135. package/src/components/__tests__/characterUtils.test.js +166 -0
  136. package/src/components/__tests__/choice.test.jsx +171 -0
  137. package/src/components/__tests__/custom-popper.test.jsx +82 -0
  138. package/src/components/__tests__/done-button.test.jsx +54 -0
  139. package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
  140. package/src/extensions/__tests__/css.test.js +196 -0
  141. package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
  142. package/src/extensions/__tests__/extended-table.test.js +107 -0
  143. package/src/extensions/__tests__/image-component.test.jsx +249 -0
  144. package/src/extensions/__tests__/image.test.js +136 -0
  145. package/src/extensions/__tests__/media.test.js +270 -0
  146. package/src/extensions/__tests__/responseArea.test.js +310 -0
  147. package/src/extensions/{component.jsx → image-component.jsx} +11 -1
  148. package/src/extensions/image.js +1 -1
  149. package/src/extensions/index.js +5 -1
  150. package/LICENSE.md +0 -5
  151. package/NEXT.CHANGELOG.json +0 -1
  152. package/lib/extensions/component.js.map +0 -1
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ require("core-js/modules/es.array.concat.js");
6
+ require("core-js/modules/es.array.is-array.js");
7
+ require("core-js/modules/es.function.name.js");
8
+ require("core-js/modules/es.object.assign.js");
9
+ var _media = require("../media");
10
+ jest.mock('@tiptap/core', function () {
11
+ return {
12
+ Node: {
13
+ create: jest.fn(function (config) {
14
+ return config;
15
+ })
16
+ },
17
+ mergeAttributes: jest.fn(function () {
18
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
19
+ args[_key] = arguments[_key];
20
+ }
21
+ return Object.assign.apply(Object, [{}].concat(args));
22
+ })
23
+ };
24
+ });
25
+ jest.mock('@tiptap/react', function () {
26
+ return {
27
+ NodeViewWrapper: function NodeViewWrapper(_ref) {
28
+ var children = _ref.children;
29
+ return /*#__PURE__*/React.createElement("div", {
30
+ "data-testid": "node-view-wrapper"
31
+ }, children);
32
+ },
33
+ ReactNodeViewRenderer: jest.fn(function (component) {
34
+ return component;
35
+ })
36
+ };
37
+ });
38
+ jest.mock('react-dom', function () {
39
+ return {
40
+ render: jest.fn()
41
+ };
42
+ });
43
+ jest.mock('../../components/media/MediaDialog', function () {
44
+ return {
45
+ __esModule: true,
46
+ "default": jest.fn(function () {
47
+ return /*#__PURE__*/React.createElement("div", {
48
+ "data-testid": "media-dialog"
49
+ });
50
+ })
51
+ };
52
+ });
53
+ jest.mock('../../components/media/MediaToolbar', function () {
54
+ return {
55
+ __esModule: true,
56
+ "default": jest.fn(function () {
57
+ return /*#__PURE__*/React.createElement("div", {
58
+ "data-testid": "media-toolbar"
59
+ });
60
+ })
61
+ };
62
+ });
63
+ describe('Media', function () {
64
+ describe('configuration', function () {
65
+ it('has correct name', function () {
66
+ expect(_media.Media.name).toBe('media');
67
+ });
68
+ it('is inline', function () {
69
+ expect(_media.Media.inline).toBe(true);
70
+ });
71
+ it('is in inline group', function () {
72
+ expect(_media.Media.group).toBe('inline');
73
+ });
74
+ it('is atomic', function () {
75
+ expect(_media.Media.atom).toBe(true);
76
+ });
77
+ });
78
+ describe('addAttributes', function () {
79
+ it('returns all media attributes with defaults', function () {
80
+ var attributes = _media.Media.addAttributes();
81
+ expect(attributes).toHaveProperty('type');
82
+ expect(attributes).toHaveProperty('src');
83
+ expect(attributes).toHaveProperty('width');
84
+ expect(attributes).toHaveProperty('height');
85
+ expect(attributes).toHaveProperty('title');
86
+ expect(attributes).toHaveProperty('starts');
87
+ expect(attributes).toHaveProperty('ends');
88
+ expect(attributes).toHaveProperty('editing');
89
+ expect(attributes).toHaveProperty('tag');
90
+ expect(attributes).toHaveProperty('url');
91
+ expect(attributes.type["default"]).toBe('video');
92
+ expect(attributes.src["default"]).toBeNull();
93
+ expect(attributes.tag["default"]).toBe('iframe');
94
+ expect(attributes.editing["default"]).toBe(false);
95
+ });
96
+ });
97
+ describe('parseHTML', function () {
98
+ it('returns parsing rules for iframe and audio', function () {
99
+ var rules = _media.Media.parseHTML();
100
+ expect(Array.isArray(rules)).toBe(true);
101
+ expect(rules).toHaveLength(2);
102
+ expect(rules[0].tag).toBe('iframe[data-type="video"]');
103
+ expect(rules[1].tag).toBe('audio');
104
+ });
105
+ it('parses video iframe attributes', function () {
106
+ var rules = _media.Media.parseHTML();
107
+ var mockEl = {
108
+ getAttribute: jest.fn(function (attr) {
109
+ var attrs = {
110
+ src: 'https://video.com/embed',
111
+ width: '640',
112
+ height: '480'
113
+ };
114
+ return attrs[attr] || null;
115
+ }),
116
+ dataset: {
117
+ title: 'Test Video',
118
+ starts: '10',
119
+ ends: '60',
120
+ url: 'https://video.com/watch'
121
+ }
122
+ };
123
+ var result = rules[0].getAttrs(mockEl);
124
+ expect(result.type).toBe('video');
125
+ expect(result.tag).toBe('iframe');
126
+ expect(result.src).toBe('https://video.com/embed');
127
+ expect(result.width).toBe('640');
128
+ expect(result.height).toBe('480');
129
+ expect(result.title).toBe('Test Video');
130
+ });
131
+ it('parses audio element attributes', function () {
132
+ var rules = _media.Media.parseHTML();
133
+ var mockEl = {
134
+ querySelector: jest.fn(function () {
135
+ return {
136
+ getAttribute: jest.fn(function () {
137
+ return 'https://audio.com/file.mp3';
138
+ })
139
+ };
140
+ })
141
+ };
142
+ var result = rules[1].getAttrs(mockEl);
143
+ expect(result.type).toBe('audio');
144
+ expect(result.tag).toBe('audio');
145
+ expect(result.src).toBe('https://audio.com/file.mp3');
146
+ });
147
+ });
148
+ describe('renderHTML', function () {
149
+ it('renders audio element for audio type', function () {
150
+ var HTMLAttributes = {
151
+ tag: 'audio',
152
+ src: 'test.mp3'
153
+ };
154
+ var result = _media.Media.renderHTML({
155
+ HTMLAttributes: HTMLAttributes
156
+ });
157
+ expect(result[0]).toBe('audio');
158
+ expect(result[1]).toEqual({
159
+ controls: 'controls',
160
+ controlsList: 'nodownload'
161
+ });
162
+ expect(result[2][0]).toBe('source');
163
+ expect(result[2][1]).toEqual({
164
+ src: 'test.mp3',
165
+ type: 'audio/mp3'
166
+ });
167
+ });
168
+ it('renders iframe for video type', function () {
169
+ var HTMLAttributes = {
170
+ tag: 'iframe',
171
+ src: 'https://video.com/embed',
172
+ width: '640',
173
+ height: '480'
174
+ };
175
+ var result = _media.Media.renderHTML({
176
+ HTMLAttributes: HTMLAttributes
177
+ });
178
+ expect(result[0]).toBe('iframe');
179
+ expect(result[1]).toHaveProperty('data-type', 'video');
180
+ expect(result[1]).toHaveProperty('frameborder', '0');
181
+ expect(result[1]).toHaveProperty('src', 'https://video.com/embed');
182
+ expect(result[1]).toHaveProperty('width', '640');
183
+ expect(result[1]).toHaveProperty('height', '480');
184
+ });
185
+ it('renders iframe without dimensions if not provided', function () {
186
+ var HTMLAttributes = {
187
+ tag: 'iframe',
188
+ src: 'https://video.com/embed'
189
+ };
190
+ var result = _media.Media.renderHTML({
191
+ HTMLAttributes: HTMLAttributes
192
+ });
193
+ expect(result[1]).not.toHaveProperty('width');
194
+ expect(result[1]).not.toHaveProperty('height');
195
+ });
196
+ });
197
+ describe('addCommands', function () {
198
+ it('returns insertMedia and updateMedia commands', function () {
199
+ var commands = _media.Media.addCommands();
200
+ expect(commands).toHaveProperty('insertMedia');
201
+ expect(commands).toHaveProperty('updateMedia');
202
+ expect((0, _typeof2["default"])(commands.insertMedia)).toBe('function');
203
+ expect((0, _typeof2["default"])(commands.updateMedia)).toBe('function');
204
+ });
205
+ it('insertMedia inserts content with attributes', function () {
206
+ var context = {
207
+ name: 'media'
208
+ };
209
+ var commands = _media.Media.addCommands.call(context);
210
+ var mockCommands = {
211
+ insertContent: jest.fn(function () {
212
+ return true;
213
+ })
214
+ };
215
+ var attrs = {
216
+ type: 'video',
217
+ src: 'test.mp4'
218
+ };
219
+ var result = commands.insertMedia(attrs)({
220
+ commands: mockCommands
221
+ });
222
+ expect(mockCommands.insertContent).toHaveBeenCalledWith({
223
+ type: 'media',
224
+ attrs: attrs
225
+ });
226
+ expect(result).toBe(true);
227
+ });
228
+ it('updateMedia updates attributes', function () {
229
+ var context = {
230
+ name: 'media'
231
+ };
232
+ var commands = _media.Media.addCommands.call(context);
233
+ var mockCommands = {
234
+ updateAttributes: jest.fn(function () {
235
+ return true;
236
+ })
237
+ };
238
+ var attrs = {
239
+ width: '800'
240
+ };
241
+ var result = commands.updateMedia(attrs)({
242
+ commands: mockCommands
243
+ });
244
+ expect(mockCommands.updateAttributes).toHaveBeenCalledWith('media', attrs);
245
+ expect(result).toBe(true);
246
+ });
247
+ });
248
+ describe('addNodeView', function () {
249
+ it('returns ReactNodeViewRenderer result', function () {
250
+ var result = _media.Media.addNodeView();
251
+ expect(result).toBeDefined();
252
+ });
253
+ });
254
+ });
255
+ describe('insertDialog', function () {
256
+ beforeEach(function () {
257
+ document.body.innerHTML = '';
258
+ document.body.style.overflow = 'auto';
259
+ });
260
+ it('creates dialog element', function () {
261
+ var mockCallback = jest.fn();
262
+ var props = {
263
+ type: 'video',
264
+ callback: mockCallback,
265
+ options: {}
266
+ };
267
+ (0, _media.insertDialog)(props);
268
+ var dialog = document.querySelector('.insert-media-dialog');
269
+ expect(dialog).toBeTruthy();
270
+ });
271
+ it('sets body overflow to hidden', function () {
272
+ var mockCallback = jest.fn();
273
+ var props = {
274
+ type: 'video',
275
+ callback: mockCallback,
276
+ options: {}
277
+ };
278
+ (0, _media.insertDialog)(props);
279
+ expect(document.body.style.overflow).toBe('hidden');
280
+ });
281
+ it('removes previous dialogs', function () {
282
+ var existingDialog = document.createElement('div');
283
+ existingDialog.className = 'insert-media-dialog';
284
+ document.body.appendChild(existingDialog);
285
+ var mockCallback = jest.fn();
286
+ var props = {
287
+ type: 'video',
288
+ callback: mockCallback,
289
+ options: {}
290
+ };
291
+ (0, _media.insertDialog)(props);
292
+ var dialogs = document.querySelectorAll('.insert-media-dialog');
293
+ expect(dialogs).toHaveLength(1);
294
+ });
295
+ });
296
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWVkaWEiLCJyZXF1aXJlIiwiamVzdCIsIm1vY2siLCJOb2RlIiwiY3JlYXRlIiwiZm4iLCJjb25maWciLCJtZXJnZUF0dHJpYnV0ZXMiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsIk9iamVjdCIsImFzc2lnbiIsImFwcGx5IiwiY29uY2F0IiwiTm9kZVZpZXdXcmFwcGVyIiwiX3JlZiIsImNoaWxkcmVuIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50IiwiUmVhY3ROb2RlVmlld1JlbmRlcmVyIiwiY29tcG9uZW50IiwicmVuZGVyIiwiX19lc01vZHVsZSIsImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJNZWRpYSIsIm5hbWUiLCJ0b0JlIiwiaW5saW5lIiwiZ3JvdXAiLCJhdG9tIiwiYXR0cmlidXRlcyIsImFkZEF0dHJpYnV0ZXMiLCJ0b0hhdmVQcm9wZXJ0eSIsInR5cGUiLCJzcmMiLCJ0b0JlTnVsbCIsInRhZyIsImVkaXRpbmciLCJydWxlcyIsInBhcnNlSFRNTCIsImlzQXJyYXkiLCJ0b0hhdmVMZW5ndGgiLCJtb2NrRWwiLCJnZXRBdHRyaWJ1dGUiLCJhdHRyIiwiYXR0cnMiLCJ3aWR0aCIsImhlaWdodCIsImRhdGFzZXQiLCJ0aXRsZSIsInN0YXJ0cyIsImVuZHMiLCJ1cmwiLCJyZXN1bHQiLCJnZXRBdHRycyIsInF1ZXJ5U2VsZWN0b3IiLCJIVE1MQXR0cmlidXRlcyIsInJlbmRlckhUTUwiLCJ0b0VxdWFsIiwiY29udHJvbHMiLCJjb250cm9sc0xpc3QiLCJub3QiLCJjb21tYW5kcyIsImFkZENvbW1hbmRzIiwiX3R5cGVvZjIiLCJpbnNlcnRNZWRpYSIsInVwZGF0ZU1lZGlhIiwiY29udGV4dCIsImNhbGwiLCJtb2NrQ29tbWFuZHMiLCJpbnNlcnRDb250ZW50IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwiYWRkTm9kZVZpZXciLCJ0b0JlRGVmaW5lZCIsImJlZm9yZUVhY2giLCJkb2N1bWVudCIsImJvZHkiLCJpbm5lckhUTUwiLCJzdHlsZSIsIm92ZXJmbG93IiwibW9ja0NhbGxiYWNrIiwicHJvcHMiLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJpbnNlcnREaWFsb2ciLCJkaWFsb2ciLCJ0b0JlVHJ1dGh5IiwiZXhpc3RpbmdEaWFsb2ciLCJjbGFzc05hbWUiLCJhcHBlbmRDaGlsZCIsImRpYWxvZ3MiLCJxdWVyeVNlbGVjdG9yQWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL21lZGlhLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVkaWEsIGluc2VydERpYWxvZyB9IGZyb20gJy4uL21lZGlhJztcblxuamVzdC5tb2NrKCdAdGlwdGFwL2NvcmUnLCAoKSA9PiAoe1xuICBOb2RlOiB7IGNyZWF0ZTogamVzdC5mbigoY29uZmlnKSA9PiBjb25maWcpIH0sXG4gIG1lcmdlQXR0cmlidXRlczogamVzdC5mbigoLi4uYXJncykgPT4gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncykpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuIH0pID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiPntjaGlsZHJlbn08L2Rpdj4sXG4gIFJlYWN0Tm9kZVZpZXdSZW5kZXJlcjogamVzdC5mbigoY29tcG9uZW50KSA9PiBjb21wb25lbnQpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ3JlYWN0LWRvbScsICgpID0+ICh7XG4gIHJlbmRlcjogamVzdC5mbigpLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEvTWVkaWFEaWFsb2cnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS1kaWFsb2dcIiAvPiksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9tZWRpYS9NZWRpYVRvb2xiYXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS10b29sYmFyXCIgLz4pLFxufSkpO1xuXG5kZXNjcmliZSgnTWVkaWEnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdoYXMgY29ycmVjdCBuYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1lZGlhLm5hbWUpLnRvQmUoJ21lZGlhJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW5saW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1lZGlhLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoTWVkaWEuZ3JvdXApLnRvQmUoJ2lubGluZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGF0b21pYycsICgpID0+IHtcbiAgICAgIGV4cGVjdChNZWRpYS5hdG9tKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQXR0cmlidXRlcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBhbGwgbWVkaWEgYXR0cmlidXRlcyB3aXRoIGRlZmF1bHRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE1lZGlhLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd0eXBlJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3NyYycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd3aWR0aCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdoZWlnaHQnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndGl0bGUnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnc3RhcnRzJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2VuZHMnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnZWRpdGluZycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd0YWcnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgndXJsJyk7XG5cbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnR5cGUuZGVmYXVsdCkudG9CZSgndmlkZW8nKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnNyYy5kZWZhdWx0KS50b0JlTnVsbCgpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMudGFnLmRlZmF1bHQpLnRvQmUoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuZWRpdGluZy5kZWZhdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhcnNlSFRNTCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBwYXJzaW5nIHJ1bGVzIGZvciBpZnJhbWUgYW5kIGF1ZGlvJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBNZWRpYS5wYXJzZUhUTUwoKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocnVsZXMpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJ1bGVzKS50b0hhdmVMZW5ndGgoMik7XG4gICAgICBleHBlY3QocnVsZXNbMF0udGFnKS50b0JlKCdpZnJhbWVbZGF0YS10eXBlPVwidmlkZW9cIl0nKTtcbiAgICAgIGV4cGVjdChydWxlc1sxXS50YWcpLnRvQmUoJ2F1ZGlvJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFyc2VzIHZpZGVvIGlmcmFtZSBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBNZWRpYS5wYXJzZUhUTUwoKTtcbiAgICAgIGNvbnN0IG1vY2tFbCA9IHtcbiAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKChhdHRyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgICAgICBzcmM6ICdodHRwczovL3ZpZGVvLmNvbS9lbWJlZCcsXG4gICAgICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc0ODAnLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGF0dHJzW2F0dHJdIHx8IG51bGw7XG4gICAgICAgIH0pLFxuICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgdGl0bGU6ICdUZXN0IFZpZGVvJyxcbiAgICAgICAgICBzdGFydHM6ICcxMCcsXG4gICAgICAgICAgZW5kczogJzYwJyxcbiAgICAgICAgICB1cmw6ICdodHRwczovL3ZpZGVvLmNvbS93YXRjaCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBydWxlc1swXS5nZXRBdHRycyhtb2NrRWwpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ3ZpZGVvJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnRhZykudG9CZSgnaWZyYW1lJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnNyYykudG9CZSgnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQud2lkdGgpLnRvQmUoJzY0MCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5oZWlnaHQpLnRvQmUoJzQ4MCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC50aXRsZSkudG9CZSgnVGVzdCBWaWRlbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3BhcnNlcyBhdWRpbyBlbGVtZW50IGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IE1lZGlhLnBhcnNlSFRNTCgpO1xuICAgICAgY29uc3QgbW9ja0VsID0ge1xuICAgICAgICBxdWVyeVNlbGVjdG9yOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKCgpID0+ICdodHRwczovL2F1ZGlvLmNvbS9maWxlLm1wMycpLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBydWxlc1sxXS5nZXRBdHRycyhtb2NrRWwpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ2F1ZGlvJyk7XG4gICAgICBleHBlY3QocmVzdWx0LnRhZykudG9CZSgnYXVkaW8nKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc3JjKS50b0JlKCdodHRwczovL2F1ZGlvLmNvbS9maWxlLm1wMycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVySFRNTCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBhdWRpbyBlbGVtZW50IGZvciBhdWRpbyB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgSFRNTEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIHRhZzogJ2F1ZGlvJyxcbiAgICAgICAgc3JjOiAndGVzdC5tcDMnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gTWVkaWEucmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzBdKS50b0JlKCdhdWRpbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9FcXVhbCh7IGNvbnRyb2xzOiAnY29udHJvbHMnLCBjb250cm9sc0xpc3Q6ICdub2Rvd25sb2FkJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMl1bMF0pLnRvQmUoJ3NvdXJjZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsyXVsxXSkudG9FcXVhbCh7IHNyYzogJ3Rlc3QubXAzJywgdHlwZTogJ2F1ZGlvL21wMycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBpZnJhbWUgZm9yIHZpZGVvIHR5cGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBIVE1MQXR0cmlidXRlcyA9IHtcbiAgICAgICAgdGFnOiAnaWZyYW1lJyxcbiAgICAgICAgc3JjOiAnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnLFxuICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgIGhlaWdodDogJzQ4MCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBNZWRpYS5yZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2RhdGEtdHlwZScsICd2aWRlbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2ZyYW1lYm9yZGVyJywgJzAnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdzcmMnLCAnaHR0cHM6Ly92aWRlby5jb20vZW1iZWQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCd3aWR0aCcsICc2NDAnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdoZWlnaHQnLCAnNDgwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBpZnJhbWUgd2l0aG91dCBkaW1lbnNpb25zIGlmIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEhUTUxBdHRyaWJ1dGVzID0ge1xuICAgICAgICB0YWc6ICdpZnJhbWUnLFxuICAgICAgICBzcmM6ICdodHRwczovL3ZpZGVvLmNvbS9lbWJlZCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBNZWRpYS5yZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLm5vdC50b0hhdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLm5vdC50b0hhdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRDb21tYW5kcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBpbnNlcnRNZWRpYSBhbmQgdXBkYXRlTWVkaWEgY29tbWFuZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IE1lZGlhLmFkZENvbW1hbmRzKCk7XG5cbiAgICAgIGV4cGVjdChjb21tYW5kcykudG9IYXZlUHJvcGVydHkoJ2luc2VydE1lZGlhJyk7XG4gICAgICBleHBlY3QoY29tbWFuZHMpLnRvSGF2ZVByb3BlcnR5KCd1cGRhdGVNZWRpYScpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBjb21tYW5kcy5pbnNlcnRNZWRpYSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgY29tbWFuZHMudXBkYXRlTWVkaWEpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5zZXJ0TWVkaWEgaW5zZXJ0cyBjb250ZW50IHdpdGggYXR0cmlidXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IG5hbWU6ICdtZWRpYScgfTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gTWVkaWEuYWRkQ29tbWFuZHMuY2FsbChjb250ZXh0KTtcbiAgICAgIGNvbnN0IG1vY2tDb21tYW5kcyA9IHtcbiAgICAgICAgaW5zZXJ0Q29udGVudDogamVzdC5mbigoKSA9PiB0cnVlKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBhdHRycyA9IHsgdHlwZTogJ3ZpZGVvJywgc3JjOiAndGVzdC5tcDQnIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1hbmRzLmluc2VydE1lZGlhKGF0dHJzKSh7IGNvbW1hbmRzOiBtb2NrQ29tbWFuZHMgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrQ29tbWFuZHMuaW5zZXJ0Q29udGVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICB0eXBlOiAnbWVkaWEnLFxuICAgICAgICBhdHRycyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVNZWRpYSB1cGRhdGVzIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0geyBuYW1lOiAnbWVkaWEnIH07XG4gICAgICBjb25zdCBjb21tYW5kcyA9IE1lZGlhLmFkZENvbW1hbmRzLmNhbGwoY29udGV4dCk7XG4gICAgICBjb25zdCBtb2NrQ29tbWFuZHMgPSB7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM6IGplc3QuZm4oKCkgPT4gdHJ1ZSksXG4gICAgICB9O1xuICAgICAgY29uc3QgYXR0cnMgPSB7IHdpZHRoOiAnODAwJyB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb21tYW5kcy51cGRhdGVNZWRpYShhdHRycykoeyBjb21tYW5kczogbW9ja0NvbW1hbmRzIH0pO1xuXG4gICAgICBleHBlY3QobW9ja0NvbW1hbmRzLnVwZGF0ZUF0dHJpYnV0ZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtZWRpYScsIGF0dHJzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGROb2RlVmlldycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBSZWFjdE5vZGVWaWV3UmVuZGVyZXIgcmVzdWx0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gTWVkaWEuYWRkTm9kZVZpZXcoKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2luc2VydERpYWxvZycsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICB9KTtcblxuICBpdCgnY3JlYXRlcyBkaWFsb2cgZWxlbWVudCcsICgpID0+IHtcbiAgICBjb25zdCBtb2NrQ2FsbGJhY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgY2FsbGJhY2s6IG1vY2tDYWxsYmFjayxcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG5cbiAgICBpbnNlcnREaWFsb2cocHJvcHMpO1xuXG4gICAgY29uc3QgZGlhbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmluc2VydC1tZWRpYS1kaWFsb2cnKTtcbiAgICBleHBlY3QoZGlhbG9nKS50b0JlVHJ1dGh5KCk7XG4gIH0pO1xuXG4gIGl0KCdzZXRzIGJvZHkgb3ZlcmZsb3cgdG8gaGlkZGVuJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tDYWxsYmFjayA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICBjYWxsYmFjazogbW9ja0NhbGxiYWNrLFxuICAgICAgb3B0aW9uczoge30sXG4gICAgfTtcblxuICAgIGluc2VydERpYWxvZyhwcm9wcyk7XG5cbiAgICBleHBlY3QoZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdykudG9CZSgnaGlkZGVuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZW1vdmVzIHByZXZpb3VzIGRpYWxvZ3MnLCAoKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdEaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBleGlzdGluZ0RpYWxvZy5jbGFzc05hbWUgPSAnaW5zZXJ0LW1lZGlhLWRpYWxvZyc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChleGlzdGluZ0RpYWxvZyk7XG5cbiAgICBjb25zdCBtb2NrQ2FsbGJhY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgY2FsbGJhY2s6IG1vY2tDYWxsYmFjayxcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG5cbiAgICBpbnNlcnREaWFsb2cocHJvcHMpO1xuXG4gICAgY29uc3QgZGlhbG9ncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnNlcnQtbWVkaWEtZGlhbG9nJyk7XG4gICAgZXhwZWN0KGRpYWxvZ3MpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFFQUMsSUFBSSxDQUFDQyxJQUFJLENBQUMsY0FBYyxFQUFFO0VBQUEsT0FBTztJQUMvQkMsSUFBSSxFQUFFO01BQUVDLE1BQU0sRUFBRUgsSUFBSSxDQUFDSSxFQUFFLENBQUMsVUFBQ0MsTUFBTTtRQUFBLE9BQUtBLE1BQU07TUFBQTtJQUFFLENBQUM7SUFDN0NDLGVBQWUsRUFBRU4sSUFBSSxDQUFDSSxFQUFFLENBQUM7TUFBQSxTQUFBRyxJQUFBLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxFQUFJQyxJQUFJLE9BQUFDLEtBQUEsQ0FBQUosSUFBQSxHQUFBSyxJQUFBLE1BQUFBLElBQUEsR0FBQUwsSUFBQSxFQUFBSyxJQUFBO1FBQUpGLElBQUksQ0FBQUUsSUFBQSxJQUFBSixTQUFBLENBQUFJLElBQUE7TUFBQTtNQUFBLE9BQUtDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFBQyxLQUFBLENBQWJGLE1BQU0sR0FBUSxDQUFDLENBQUMsRUFBQUcsTUFBQSxDQUFLTixJQUFJLEVBQUM7SUFBQTtFQUNsRSxDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUhWLElBQUksQ0FBQ0MsSUFBSSxDQUFDLGVBQWUsRUFBRTtFQUFBLE9BQU87SUFDaENnQixlQUFlLEVBQUUsU0FBakJB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