@pie-lib/math-input-mathlive 1.1.5-beta.9 → 2.0.1-next.20261109072207

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 (195) hide show
  1. package/README.md +84 -109
  2. package/dist/_virtual/_rolldown/runtime.js +11 -0
  3. package/dist/horizontal-keypad.d.ts +22 -0
  4. package/dist/horizontal-keypad.js +54 -0
  5. package/dist/index.d.ts +20 -0
  6. package/dist/index.js +12 -0
  7. package/dist/keypad/index.d.ts +40 -0
  8. package/dist/keypad/index.js +245 -0
  9. package/dist/keypad/keys-layout.d.ts +7 -0
  10. package/dist/keypad/keys-layout.js +5 -0
  11. package/dist/keys/basic-operators.d.ts +5 -0
  12. package/dist/keys/basic-operators.js +30 -0
  13. package/dist/keys/chars.d.ts +5 -0
  14. package/dist/keys/comparison.d.ts +4 -0
  15. package/dist/keys/comparison.js +32 -0
  16. package/dist/keys/constants.d.ts +4 -0
  17. package/dist/keys/constants.js +35 -0
  18. package/dist/keys/digits.d.ts +15 -0
  19. package/dist/keys/digits.js +34 -0
  20. package/dist/keys/edit.d.ts +6 -0
  21. package/dist/keys/edit.js +9 -0
  22. package/dist/keys/exponent.d.ts +4 -0
  23. package/dist/keys/exponent.js +28 -0
  24. package/dist/keys/fractions.d.ts +3 -0
  25. package/dist/keys/fractions.js +27 -0
  26. package/dist/keys/geometry.d.ts +23 -0
  27. package/dist/keys/geometry.js +127 -0
  28. package/dist/keys/grades.d.ts +9 -0
  29. package/dist/keys/grades.js +414 -0
  30. package/dist/keys/index.d.ts +6 -0
  31. package/dist/keys/index.js +50 -0
  32. package/dist/keys/log.d.ts +3 -0
  33. package/dist/keys/log.js +25 -0
  34. package/dist/keys/logic.d.ts +2 -0
  35. package/dist/keys/logic.js +13 -0
  36. package/dist/keys/matrices.d.ts +2 -0
  37. package/dist/keys/matrices.js +17 -0
  38. package/dist/keys/misc.d.ts +10 -0
  39. package/dist/keys/misc.js +60 -0
  40. package/dist/keys/navigation.d.ts +2 -0
  41. package/dist/keys/navigation.js +13 -0
  42. package/dist/keys/operators.d.ts +1 -0
  43. package/dist/keys/operators.js +11 -0
  44. package/dist/keys/statistics.d.ts +5 -0
  45. package/dist/keys/statistics.js +38 -0
  46. package/dist/keys/sub-sup.d.ts +2 -0
  47. package/dist/keys/sub-sup.js +17 -0
  48. package/dist/keys/trigonometry.d.ts +6 -0
  49. package/dist/keys/trigonometry.js +43 -0
  50. package/dist/keys/utils.d.ts +5 -0
  51. package/dist/keys/utils.js +24 -0
  52. package/dist/keys/vars.d.ts +3 -0
  53. package/dist/keys/vars.js +22 -0
  54. package/dist/latex-bridge.d.ts +197 -0
  55. package/dist/latex-bridge.js +210 -0
  56. package/dist/longdiv.d.ts +24 -0
  57. package/dist/longdiv.js +43 -0
  58. package/dist/math-input.d.ts +26 -0
  59. package/dist/math-input.js +74 -0
  60. package/dist/mathlive-instance.d.ts +221 -0
  61. package/dist/mathlive-instance.js +159 -0
  62. package/dist/mf/common-styles.d.ts +594 -0
  63. package/dist/mf/common-styles.js +80 -0
  64. package/dist/mf/field-label.d.ts +16 -0
  65. package/dist/mf/field-label.js +13 -0
  66. package/dist/mf/index.d.ts +4 -0
  67. package/dist/mf/index.js +21 -0
  68. package/dist/mf/input.d.ts +94 -0
  69. package/dist/mf/input.js +127 -0
  70. package/dist/mf/static.d.ts +143 -0
  71. package/dist/mf/static.js +230 -0
  72. package/dist/selection.d.ts +43 -0
  73. package/dist/selection.js +39 -0
  74. package/package.json +32 -18
  75. package/lib/__tests__/composites.test.js +0 -255
  76. package/lib/__tests__/drop-in-compat.test.js +0 -133
  77. package/lib/__tests__/embedded-fonts.test.js +0 -121
  78. package/lib/__tests__/index.test.js +0 -118
  79. package/lib/__tests__/input-imperative.test.js +0 -155
  80. package/lib/__tests__/keypad-label.test.js +0 -231
  81. package/lib/__tests__/keypad-render.test.js +0 -206
  82. package/lib/__tests__/latex-bridge.test.js +0 -386
  83. package/lib/__tests__/mathlive-instance.test.js +0 -419
  84. package/lib/__tests__/mount-race.test.js +0 -218
  85. package/lib/__tests__/static-prompts.test.js +0 -405
  86. package/lib/__tests__/tmp-markup.test.js +0 -26
  87. package/lib/horizontal-keypad.js +0 -101
  88. package/lib/horizontal-keypad.js.map +0 -1
  89. package/lib/index.js +0 -143
  90. package/lib/index.js.map +0 -1
  91. package/lib/keypad/index.js +0 -431
  92. package/lib/keypad/index.js.map +0 -1
  93. package/lib/keypad/keys-layout.js +0 -22
  94. package/lib/keypad/keys-layout.js.map +0 -1
  95. package/lib/keys/basic-operators.js +0 -33
  96. package/lib/keys/basic-operators.js.map +0 -1
  97. package/lib/keys/chars.js +0 -12
  98. package/lib/keys/chars.js.map +0 -1
  99. package/lib/keys/comparison.js +0 -39
  100. package/lib/keys/comparison.js.map +0 -1
  101. package/lib/keys/constants.js +0 -37
  102. package/lib/keys/constants.js.map +0 -1
  103. package/lib/keys/digits.js +0 -46
  104. package/lib/keys/digits.js.map +0 -1
  105. package/lib/keys/edit.js +0 -14
  106. package/lib/keys/edit.js.map +0 -1
  107. package/lib/keys/exponent.js +0 -30
  108. package/lib/keys/exponent.js.map +0 -1
  109. package/lib/keys/fractions.js +0 -29
  110. package/lib/keys/fractions.js.map +0 -1
  111. package/lib/keys/geometry.js +0 -143
  112. package/lib/keys/geometry.js.map +0 -1
  113. package/lib/keys/grades.js +0 -259
  114. package/lib/keys/grades.js.map +0 -1
  115. package/lib/keys/index.js +0 -35
  116. package/lib/keys/index.js.map +0 -1
  117. package/lib/keys/log.js +0 -27
  118. package/lib/keys/log.js.map +0 -1
  119. package/lib/keys/logic.js +0 -19
  120. package/lib/keys/logic.js.map +0 -1
  121. package/lib/keys/matrices.js +0 -19
  122. package/lib/keys/matrices.js.map +0 -1
  123. package/lib/keys/misc.js +0 -69
  124. package/lib/keys/misc.js.map +0 -1
  125. package/lib/keys/navigation.js +0 -20
  126. package/lib/keys/navigation.js.map +0 -1
  127. package/lib/keys/operators.js +0 -15
  128. package/lib/keys/operators.js.map +0 -1
  129. package/lib/keys/statistics.js +0 -40
  130. package/lib/keys/statistics.js.map +0 -1
  131. package/lib/keys/sub-sup.js +0 -19
  132. package/lib/keys/sub-sup.js.map +0 -1
  133. package/lib/keys/trigonometry.js +0 -45
  134. package/lib/keys/trigonometry.js.map +0 -1
  135. package/lib/keys/utils.js +0 -87
  136. package/lib/keys/utils.js.map +0 -1
  137. package/lib/keys/vars.js +0 -24
  138. package/lib/keys/vars.js.map +0 -1
  139. package/lib/latex-bridge.js +0 -508
  140. package/lib/latex-bridge.js.map +0 -1
  141. package/lib/math-input.js +0 -143
  142. package/lib/math-input.js.map +0 -1
  143. package/lib/mathlive-instance.js +0 -585
  144. package/lib/mathlive-instance.js.map +0 -1
  145. package/lib/mf/common-styles.js +0 -203
  146. package/lib/mf/common-styles.js.map +0 -1
  147. package/lib/mf/index.js +0 -84
  148. package/lib/mf/index.js.map +0 -1
  149. package/lib/mf/input.js +0 -364
  150. package/lib/mf/input.js.map +0 -1
  151. package/lib/mf/static.js +0 -500
  152. package/lib/mf/static.js.map +0 -1
  153. package/src/__tests__/composites.test.jsx +0 -220
  154. package/src/__tests__/drop-in-compat.test.jsx +0 -112
  155. package/src/__tests__/index.test.jsx +0 -109
  156. package/src/__tests__/input-imperative.test.jsx +0 -144
  157. package/src/__tests__/keypad-label.test.jsx +0 -283
  158. package/src/__tests__/keypad-render.test.jsx +0 -123
  159. package/src/__tests__/latex-bridge.test.js +0 -389
  160. package/src/__tests__/mathlive-instance.test.js +0 -418
  161. package/src/__tests__/mount-race.test.jsx +0 -142
  162. package/src/__tests__/static-prompts.test.jsx +0 -364
  163. package/src/horizontal-keypad.jsx +0 -73
  164. package/src/index.jsx +0 -63
  165. package/src/keypad/index.jsx +0 -386
  166. package/src/keypad/keys-layout.js +0 -16
  167. package/src/keys/basic-operators.js +0 -32
  168. package/src/keys/chars.js +0 -5
  169. package/src/keys/comparison.js +0 -28
  170. package/src/keys/constants.js +0 -35
  171. package/src/keys/digits.js +0 -40
  172. package/src/keys/edit.js +0 -3
  173. package/src/keys/exponent.js +0 -28
  174. package/src/keys/fractions.js +0 -26
  175. package/src/keys/geometry.js +0 -149
  176. package/src/keys/grades.js +0 -367
  177. package/src/keys/index.js +0 -20
  178. package/src/keys/log.js +0 -22
  179. package/src/keys/logic.js +0 -15
  180. package/src/keys/matrices.js +0 -15
  181. package/src/keys/misc.js +0 -71
  182. package/src/keys/navigation.js +0 -8
  183. package/src/keys/operators.js +0 -10
  184. package/src/keys/statistics.js +0 -38
  185. package/src/keys/sub-sup.js +0 -15
  186. package/src/keys/trigonometry.js +0 -15
  187. package/src/keys/utils.js +0 -66
  188. package/src/keys/vars.js +0 -19
  189. package/src/latex-bridge.js +0 -524
  190. package/src/math-input.jsx +0 -115
  191. package/src/mathlive-instance.js +0 -582
  192. package/src/mf/common-styles.js +0 -210
  193. package/src/mf/index.js +0 -30
  194. package/src/mf/input.jsx +0 -319
  195. package/src/mf/static.jsx +0 -479
@@ -1,419 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
- describe('mathlive-instance', function () {
6
- var instance;
7
- beforeEach(function () {
8
- jest.resetModules();
9
- // eslint-disable-next-line global-require
10
- instance = require('../mathlive-instance');
11
- instance.__resetEmbeds();
12
- });
13
- describe('registerEmbed', function () {
14
- it('registers a known embed and exposes it as a macro', function () {
15
- instance.registerEmbed('answerBlock', function () {
16
- return {
17
- htmlString: '<div class="answerBlock"></div>',
18
- latex: function latex() {
19
- return '\\embed{answerBlock}[]';
20
- }
21
- };
22
- });
23
- expect(instance.registeredEmbeds()).toEqual(['answerBlock']);
24
- // The macro tags output with data-embed so CSS can target it, replacing
25
- // MathQuill's htmlString hook.
26
- expect(instance.getMacros().answerBlock).toEqual('\\htmlData{embed=answerBlock}{\\placeholder{}}');
27
- });
28
- it('registers newLine as a harmless macro (it is handled by latex-bridge)', function () {
29
- instance.registerEmbed('newLine', function () {
30
- return {
31
- latex: function latex() {
32
- return '\\embed{newLine}[]';
33
- }
34
- };
35
- });
36
- expect(instance.getMacros().newLine).toEqual('\\htmlData{embed=newLine}{}');
37
- });
38
- it('falls back to a placeholder for an unknown embed', function () {
39
- instance.registerEmbed('somethingCustom', function () {
40
- return {
41
- htmlString: '<b>x</b>'
42
- };
43
- });
44
- expect(instance.getMacros().somethingCustom).toEqual('\\htmlData{embed=somethingCustom}{\\placeholder{}}');
45
- });
46
- it('honours an explicit mathliveLatex from the factory', function () {
47
- instance.registerEmbed('custom', function () {
48
- return {
49
- mathliveLatex: '\\alpha'
50
- };
51
- });
52
- expect(instance.getMacros().custom).toEqual('\\htmlData{embed=custom}{\\alpha}');
53
- });
54
- it('does not throw when the factory throws', function () {
55
- expect(function () {
56
- return instance.registerEmbed('bad', function () {
57
- throw new Error('boom');
58
- });
59
- }).not.toThrow();
60
- expect(instance.registeredEmbeds()).toEqual(['bad']);
61
- });
62
- it('ignores bad arguments', function () {
63
- instance.registerEmbed(undefined, function () {
64
- return {};
65
- });
66
- instance.registerEmbed('noFactory', undefined);
67
- expect(instance.registeredEmbeds()).toEqual([]);
68
- });
69
- it('always includes the pie macro set', function () {
70
- var macros = instance.getMacros();
71
- expect(macros.parallelogram).toBeDefined();
72
- expect(macros.longdiv).toBeDefined();
73
- expect(macros.napprox).toEqual('\\not\\approx');
74
- });
75
-
76
- // Argument-taking macros exist only so previously authored latex parses.
77
- // Editing never goes through them: MathLive serialises a macro from its
78
- // original arguments, so typed content never comes back out.
79
- it('argument-taking macros are plain parse-only definitions', function () {
80
- ['longdiv', 'overarc', 'abs'].forEach(function (name) {
81
- expect((0, _typeof2["default"])(instance.PIE_MACROS[name])).toBe('string');
82
- expect(instance.PIE_MACROS[name]).toContain('#1');
83
- });
84
- });
85
- it('argument-less symbols stay atomic', function () {
86
- ['perpendicular', 'square', 'degree', 'napprox', 'parallelogram'].forEach(function (name) {
87
- expect((0, _typeof2["default"])(instance.PIE_MACROS[name])).toBe('string');
88
- });
89
- });
90
- it('longdiv matches the MathJax macro used by math-rendering', function () {
91
- expect(instance.PIE_MACROS.longdiv).toEqual('\\enclose{longdiv}{#1}');
92
- });
93
- });
94
- describe('applyStaticMath', function () {
95
- it('returns undefined without an element', function () {
96
- expect(instance.applyStaticMath(null, 'x')).toBeUndefined();
97
- });
98
- it('defers (returns undefined) when MathLive has not loaded', function () {
99
- var el = document.createElement('div');
100
- expect(instance.applyStaticMath(el, 'x')).toBeUndefined();
101
- });
102
- it('renders synchronously once MathLive is available', function () {
103
- var el = document.createElement('div');
104
- instance.__setMathLiveForTest({
105
- convertLatexToMarkup: function convertLatexToMarkup(l) {
106
- return "<span>".concat(l, "</span>");
107
- }
108
- });
109
- expect(instance.applyStaticMath(el, '\\pi')).toBe(el);
110
- expect(el.innerHTML).toEqual('<span>\\pi</span>');
111
- });
112
- it('falls back to the element textContent when no latex is passed', function () {
113
- var el = document.createElement('div');
114
- el.textContent = '\\theta';
115
- instance.__setMathLiveForTest({
116
- convertLatexToMarkup: function convertLatexToMarkup(l) {
117
- return "<i>".concat(l, "</i>");
118
- }
119
- });
120
- instance.applyStaticMath(el);
121
- expect(el.innerHTML).toEqual('<i>\\theta</i>');
122
- });
123
- it('bridges stored latex (newLine embed) before rendering', function () {
124
- var el = document.createElement('div');
125
- instance.__setMathLiveForTest({
126
- convertLatexToMarkup: function convertLatexToMarkup(l) {
127
- return l;
128
- }
129
- });
130
- instance.applyStaticMath(el, 'a\\embed{newLine}[]b');
131
-
132
- // \embed{newLine}[] must become a multiline environment
133
- expect(el.innerHTML).toContain('displaylines');
134
- });
135
- });
136
- describe('configureFonts', function () {
137
- // MathLive's default fontsDirectory is the relative './fonts/', which it
138
- // resolves against its own (empty, when bundled) script url and throws
139
- // "Invalid base URL" from loadFonts. Paths must become absolute.
140
- it('is exported and callable before MathLive loads', function () {
141
- expect((0, _typeof2["default"])(instance.configureFonts)).toBe('function');
142
- expect(function () {
143
- return instance.configureFonts('/mathlive-fonts');
144
- }).not.toThrow();
145
- });
146
- it('accepts null to disable font loading', function () {
147
- expect(function () {
148
- return instance.configureFonts(null);
149
- }).not.toThrow();
150
- });
151
- it('applies an absolute url to an already-loaded MathfieldElement', function () {
152
- var MathfieldElement = {};
153
-
154
- // simulate a loaded instance
155
- instance.__setMathLiveForTest({
156
- MathfieldElement: MathfieldElement
157
- });
158
- instance.configureFonts('/mathlive-fonts');
159
- expect(MathfieldElement.fontsDirectory).toEqual("".concat(document.baseURI.replace(/\/$/, ''), "/mathlive-fonts"));
160
- expect(MathfieldElement.fontsDirectory.startsWith('http')).toBe(true);
161
- });
162
-
163
- // \neq, \nsim and \ncong are built from Private Use Area glyphs that only
164
- // the KaTeX fonts contain, so "no fonts" renders garbage rather than
165
- // degrading gracefully - hence a CDN fallback by default.
166
- it('falls back to a version-pinned CDN when nothing is configured', function () {
167
- var MathfieldElement = {};
168
- instance.__setMathLiveForTest({
169
- MathfieldElement: MathfieldElement,
170
- version: {
171
- mathlive: '9.9.9'
172
- }
173
- });
174
- instance.configureFonts(undefined);
175
- expect(MathfieldElement.fontsDirectory).toEqual('https://unpkg.com/mathlive@9.9.9/fonts');
176
- });
177
- it('uses /fonts, not /dist/fonts (the latter 404s on unpkg)', function () {
178
- var MathfieldElement = {};
179
- instance.__setMathLiveForTest({
180
- MathfieldElement: MathfieldElement,
181
- version: {
182
- mathlive: '0.110.0'
183
- }
184
- });
185
- instance.configureFonts(undefined);
186
- expect(MathfieldElement.fontsDirectory).toEqual('https://unpkg.com/mathlive@0.110.0/fonts');
187
- expect(MathfieldElement.fontsDirectory).not.toContain('/dist/');
188
- });
189
- it('a configured path wins over the CDN', function () {
190
- var MathfieldElement = {};
191
- instance.__setMathLiveForTest({
192
- MathfieldElement: MathfieldElement,
193
- version: {
194
- mathlive: '0.110.0'
195
- }
196
- });
197
- instance.configureFonts('/mathlive-fonts');
198
- expect(MathfieldElement.fontsDirectory).not.toContain('unpkg.com');
199
- });
200
- it('null still opts out entirely', function () {
201
- var MathfieldElement = {};
202
- instance.__setMathLiveForTest({
203
- MathfieldElement: MathfieldElement,
204
- version: {
205
- mathlive: '0.110.0'
206
- }
207
- });
208
- instance.configureFonts(null);
209
- expect(MathfieldElement.fontsDirectory).toBeNull();
210
- });
211
- it('leaves a fully-qualified url untouched', function () {
212
- var MathfieldElement = {};
213
- instance.__setMathLiveForTest({
214
- MathfieldElement: MathfieldElement
215
- });
216
- instance.configureFonts('https://cdn.example.com/fonts');
217
- expect(MathfieldElement.fontsDirectory).toEqual('https://cdn.example.com/fonts');
218
- });
219
- it('passes null through rather than resolving it', function () {
220
- var MathfieldElement = {};
221
- instance.__setMathLiveForTest({
222
- MathfieldElement: MathfieldElement
223
- });
224
- instance.configureFonts(null);
225
- expect(MathfieldElement.fontsDirectory).toBeNull();
226
- });
227
- });
228
-
229
- // A live <math-field> renders in shadow DOM, so nothing in the page's
230
- // stylesheets reaches it - the stretchy-accent fix has to be injected there.
231
- /**
232
- * A keypad key like \frac inserts `\frac{#?}{#?}`; MathLive turns each `#?`
233
- * into a `\placeholder{}` atom and *selects* the first one. Measured in
234
- * Chromium: that atom is a leaf (its offsets are before/after, there is no
235
- * position inside), so MathLive renders NO caret element and shows only the
236
- * selection highlight - the box read as focused-but-dead. The caret is drawn
237
- * by our own shadow CSS, gated on a class so it is placeholder-specific.
238
- */
239
- describe('trackPlaceholderCaret', function () {
240
- var fakeField = function fakeField(selection, latex) {
241
- var classes = new Set();
242
- return {
243
- listeners: {},
244
- selection: selection,
245
- selectionIsCollapsed: !selection,
246
- getValue: function getValue() {
247
- return latex;
248
- },
249
- classList: {
250
- toggle: function toggle(name, on) {
251
- return on ? classes.add(name) : classes["delete"](name);
252
- },
253
- contains: function contains(name) {
254
- return classes.has(name);
255
- }
256
- },
257
- addEventListener: function addEventListener(name, fn) {
258
- this.listeners[name] = fn;
259
- },
260
- removeEventListener: function removeEventListener(name) {
261
- delete this.listeners[name];
262
- }
263
- };
264
- };
265
- it('marks the host when a placeholder is selected', function () {
266
- var mf = fakeField({
267
- ranges: [[1, 2]]
268
- }, '\\placeholder{}');
269
- instance.trackPlaceholderCaret(mf);
270
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(true);
271
- });
272
- it('does not mark an ordinary selection', function () {
273
- var mf = fakeField({
274
- ranges: [[0, 3]]
275
- }, 'x+1');
276
- instance.trackPlaceholderCaret(mf);
277
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
278
- });
279
- it('does not mark a collapsed selection, which has a real caret already', function () {
280
- var mf = fakeField(null, '\\placeholder{}');
281
- instance.trackPlaceholderCaret(mf);
282
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
283
- });
284
- it('leaves a named prompt alone - it takes a real caret inside', function () {
285
- var mf = fakeField({
286
- ranges: [[1, 2]]
287
- }, '\\placeholder[r1]{}');
288
- instance.trackPlaceholderCaret(mf);
289
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
290
- });
291
- it('re-evaluates whenever the selection moves', function () {
292
- var mf = fakeField(null, '');
293
- instance.trackPlaceholderCaret(mf);
294
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
295
-
296
- // the caret lands on a placeholder
297
- mf.selection = {
298
- ranges: [[1, 2]]
299
- };
300
- mf.selectionIsCollapsed = false;
301
- mf.getValue = function () {
302
- return '\\placeholder{}';
303
- };
304
- mf.listeners['selection-change']();
305
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(true);
306
-
307
- // ...and moves off it again
308
- mf.selectionIsCollapsed = true;
309
- mf.listeners['selection-change']();
310
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
311
- });
312
- it('returns a teardown that detaches the listener', function () {
313
- var mf = fakeField(null, '');
314
- var off = instance.trackPlaceholderCaret(mf);
315
- expect((0, _typeof2["default"])(mf.listeners['selection-change'])).toEqual('function');
316
- off();
317
- expect(mf.listeners['selection-change']).toBeUndefined();
318
- });
319
- it('survives a field that throws while reading the selection', function () {
320
- var mf = fakeField({
321
- ranges: [[1, 2]]
322
- }, '');
323
- mf.getValue = function () {
324
- throw new Error('detached');
325
- };
326
- expect(function () {
327
- return instance.trackPlaceholderCaret(mf);
328
- }).not.toThrow();
329
- expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
330
- });
331
- it('is a no-op without a field', function () {
332
- expect(instance.trackPlaceholderCaret(undefined)).toBeUndefined();
333
- expect(instance.trackPlaceholderCaret({})).toBeUndefined();
334
- });
335
- });
336
- describe('applyShadowStyles', function () {
337
- var host = function host() {
338
- var el = document.createElement('div');
339
- el.attachShadow({
340
- mode: 'open'
341
- });
342
- return el;
343
- };
344
- it('is a no-op without a shadow root', function () {
345
- expect(function () {
346
- return instance.applyShadowStyles(undefined);
347
- }).not.toThrow();
348
- expect(function () {
349
- return instance.applyShadowStyles(document.createElement('div'));
350
- }).not.toThrow();
351
- });
352
- it('injects the accent fix into the shadow root', function () {
353
- var el = host();
354
- instance.applyShadowStyles(el);
355
- var viaSheet = el.shadowRoot.__pieAccentSheet;
356
- var viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
357
- var css = viaSheet ? 'adopted' : viaStyle && viaStyle.textContent || '';
358
- expect(viaSheet || viaStyle).toBeTruthy();
359
- if (viaStyle) {
360
- expect(css).toContain('margin-left:0 !important');
361
- // scoped so single-glyph accents keep their centring offset
362
- expect(css).toContain(':has(.ML__stretchy)');
363
- }
364
- });
365
- it('injects the placeholder caret rules', function () {
366
- var el = host();
367
- instance.applyShadowStyles(el);
368
- var viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
369
- if (viaStyle) {
370
- var css = viaStyle.textContent;
371
-
372
- // gated on the host class, so an ordinary selection gets no caret
373
- expect(css).toContain(":host(.".concat(instance.PLACEHOLDER_CARET_CLASS, ")"));
374
- // MathLive's own blink keyframes and caret colour, already in this root
375
- expect(css).toContain('ML__caret-blink');
376
- expect(css).toContain('--_caret-color');
377
- // the innermost selected element only: MathLive marks a wrapper AND the
378
- // glyph span, which would otherwise render two carets
379
- expect(css).toContain('.ML__selected:not(:has(.ML__selected))');
380
- }
381
- });
382
- it('injects the radical index size fix', function () {
383
- var el = host();
384
- instance.applyShadowStyles(el);
385
- var viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
386
- if (viaStyle) {
387
- var css = viaStyle.textContent;
388
-
389
- // MathLive's scriptscriptstyle index (an inline 50%) reads too small in
390
- // the authoring UI; a mathfield's shadow root needs its own copy of the
391
- // rule, since host styles do not cross the boundary. Compared against
392
- // the exported rule, so the size stays defined in one place.
393
- // eslint-disable-next-line global-require
394
- var _require = require('../mf/common-styles'),
395
- ROOT_INDEX_CSS = _require.ROOT_INDEX_CSS;
396
- expect(ROOT_INDEX_CSS).toContain('.ML__sqrt-index >');
397
- expect(css).toContain(ROOT_INDEX_CSS);
398
- }
399
- });
400
- it('does not inject twice', function () {
401
- var el = host();
402
- instance.applyShadowStyles(el);
403
- instance.applyShadowStyles(el);
404
- var styles = el.shadowRoot.querySelectorAll('style[data-pie-accent]');
405
-
406
- // either one adopted sheet, or exactly one style node
407
- expect(el.shadowRoot.__pieAccentSheet ? 1 : styles.length).toBe(1);
408
- });
409
- });
410
- describe('latexToMarkup', function () {
411
- it('returns empty string when MathLive is not loaded', function () {
412
- expect(instance.latexToMarkup('\\pi')).toEqual('');
413
- });
414
- it('returns empty string for empty latex', function () {
415
- expect(instance.latexToMarkup('')).toEqual('');
416
- });
417
- });
418
- });
419
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsImluc3RhbmNlIiwiYmVmb3JlRWFjaCIsImplc3QiLCJyZXNldE1vZHVsZXMiLCJyZXF1aXJlIiwiX19yZXNldEVtYmVkcyIsIml0IiwicmVnaXN0ZXJFbWJlZCIsImh0bWxTdHJpbmciLCJsYXRleCIsImV4cGVjdCIsInJlZ2lzdGVyZWRFbWJlZHMiLCJ0b0VxdWFsIiwiZ2V0TWFjcm9zIiwiYW5zd2VyQmxvY2siLCJuZXdMaW5lIiwic29tZXRoaW5nQ3VzdG9tIiwibWF0aGxpdmVMYXRleCIsImN1c3RvbSIsIkVycm9yIiwibm90IiwidG9UaHJvdyIsInVuZGVmaW5lZCIsIm1hY3JvcyIsInBhcmFsbGVsb2dyYW0iLCJ0b0JlRGVmaW5lZCIsImxvbmdkaXYiLCJuYXBwcm94IiwiZm9yRWFjaCIsIm5hbWUiLCJfdHlwZW9mMiIsIlBJRV9NQUNST1MiLCJ0b0JlIiwidG9Db250YWluIiwiYXBwbHlTdGF0aWNNYXRoIiwidG9CZVVuZGVmaW5lZCIsImVsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiX19zZXRNYXRoTGl2ZUZvclRlc3QiLCJjb252ZXJ0TGF0ZXhUb01hcmt1cCIsImwiLCJjb25jYXQiLCJpbm5lckhUTUwiLCJ0ZXh0Q29udGVudCIsImNvbmZpZ3VyZUZvbnRzIiwiTWF0aGZpZWxkRWxlbWVudCIsImZvbnRzRGlyZWN0b3J5IiwiYmFzZVVSSSIsInJlcGxhY2UiLCJzdGFydHNXaXRoIiwidmVyc2lvbiIsIm1hdGhsaXZlIiwidG9CZU51bGwiLCJmYWtlRmllbGQiLCJzZWxlY3Rpb24iLCJjbGFzc2VzIiwiU2V0IiwibGlzdGVuZXJzIiwic2VsZWN0aW9uSXNDb2xsYXBzZWQiLCJnZXRWYWx1ZSIsImNsYXNzTGlzdCIsInRvZ2dsZSIsIm9uIiwiYWRkIiwiY29udGFpbnMiLCJoYXMiLCJhZGRFdmVudExpc3RlbmVyIiwiZm4iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibWYiLCJyYW5nZXMiLCJ0cmFja1BsYWNlaG9sZGVyQ2FyZXQiLCJQTEFDRUhPTERFUl9DQVJFVF9DTEFTUyIsIm9mZiIsImhvc3QiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwiYXBwbHlTaGFkb3dTdHlsZXMiLCJ2aWFTaGVldCIsInNoYWRvd1Jvb3QiLCJfX3BpZUFjY2VudFNoZWV0IiwidmlhU3R5bGUiLCJxdWVyeVNlbGVjdG9yIiwiY3NzIiwidG9CZVRydXRoeSIsIl9yZXF1aXJlIiwiUk9PVF9JTkRFWF9DU1MiLCJzdHlsZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGVuZ3RoIiwibGF0ZXhUb01hcmt1cCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWF0aGxpdmUtaW5zdGFuY2UudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJkZXNjcmliZSgnbWF0aGxpdmUtaW5zdGFuY2UnLCAoKSA9PiB7XG4gIGxldCBpbnN0YW5jZTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LnJlc2V0TW9kdWxlcygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgIGluc3RhbmNlID0gcmVxdWlyZSgnLi4vbWF0aGxpdmUtaW5zdGFuY2UnKTtcbiAgICBpbnN0YW5jZS5fX3Jlc2V0RW1iZWRzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWdpc3RlckVtYmVkJywgKCkgPT4ge1xuICAgIGl0KCdyZWdpc3RlcnMgYSBrbm93biBlbWJlZCBhbmQgZXhwb3NlcyBpdCBhcyBhIG1hY3JvJywgKCkgPT4ge1xuICAgICAgaW5zdGFuY2UucmVnaXN0ZXJFbWJlZCgnYW5zd2VyQmxvY2snLCAoKSA9PiAoe1xuICAgICAgICBodG1sU3RyaW5nOiAnPGRpdiBjbGFzcz1cImFuc3dlckJsb2NrXCI+PC9kaXY+JyxcbiAgICAgICAgbGF0ZXg6ICgpID0+ICdcXFxcZW1iZWR7YW5zd2VyQmxvY2t9W10nLFxuICAgICAgfSkpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UucmVnaXN0ZXJlZEVtYmVkcygpKS50b0VxdWFsKFsnYW5zd2VyQmxvY2snXSk7XG4gICAgICAvLyBUaGUgbWFjcm8gdGFncyBvdXRwdXQgd2l0aCBkYXRhLWVtYmVkIHNvIENTUyBjYW4gdGFyZ2V0IGl0LCByZXBsYWNpbmdcbiAgICAgIC8vIE1hdGhRdWlsbCdzIGh0bWxTdHJpbmcgaG9vay5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5nZXRNYWNyb3MoKS5hbnN3ZXJCbG9jaykudG9FcXVhbCgnXFxcXGh0bWxEYXRhe2VtYmVkPWFuc3dlckJsb2NrfXtcXFxccGxhY2Vob2xkZXJ7fX0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWdpc3RlcnMgbmV3TGluZSBhcyBhIGhhcm1sZXNzIG1hY3JvIChpdCBpcyBoYW5kbGVkIGJ5IGxhdGV4LWJyaWRnZSknLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCduZXdMaW5lJywgKCkgPT4gKHsgbGF0ZXg6ICgpID0+ICdcXFxcZW1iZWR7bmV3TGluZX1bXScgfSkpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UuZ2V0TWFjcm9zKCkubmV3TGluZSkudG9FcXVhbCgnXFxcXGh0bWxEYXRhe2VtYmVkPW5ld0xpbmV9e30nKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVua25vd24gZW1iZWQnLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCdzb21ldGhpbmdDdXN0b20nLCAoKSA9PiAoeyBodG1sU3RyaW5nOiAnPGI+eDwvYj4nIH0pKTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLmdldE1hY3JvcygpLnNvbWV0aGluZ0N1c3RvbSkudG9FcXVhbCgnXFxcXGh0bWxEYXRhe2VtYmVkPXNvbWV0aGluZ0N1c3RvbX17XFxcXHBsYWNlaG9sZGVye319Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaG9ub3VycyBhbiBleHBsaWNpdCBtYXRobGl2ZUxhdGV4IGZyb20gdGhlIGZhY3RvcnknLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCdjdXN0b20nLCAoKSA9PiAoeyBtYXRobGl2ZUxhdGV4OiAnXFxcXGFscGhhJyB9KSk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5nZXRNYWNyb3MoKS5jdXN0b20pLnRvRXF1YWwoJ1xcXFxodG1sRGF0YXtlbWJlZD1jdXN0b219e1xcXFxhbHBoYX0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCB0aHJvdyB3aGVuIHRoZSBmYWN0b3J5IHRocm93cycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCdiYWQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdib29tJyk7XG4gICAgICAgIH0pLFxuICAgICAgKS5ub3QudG9UaHJvdygpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UucmVnaXN0ZXJlZEVtYmVkcygpKS50b0VxdWFsKFsnYmFkJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lnbm9yZXMgYmFkIGFyZ3VtZW50cycsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQodW5kZWZpbmVkLCAoKSA9PiAoe30pKTtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQoJ25vRmFjdG9yeScsIHVuZGVmaW5lZCk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5yZWdpc3RlcmVkRW1iZWRzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Fsd2F5cyBpbmNsdWRlcyB0aGUgcGllIG1hY3JvIHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hY3JvcyA9IGluc3RhbmNlLmdldE1hY3JvcygpO1xuXG4gICAgICBleHBlY3QobWFjcm9zLnBhcmFsbGVsb2dyYW0pLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QobWFjcm9zLmxvbmdkaXYpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QobWFjcm9zLm5hcHByb3gpLnRvRXF1YWwoJ1xcXFxub3RcXFxcYXBwcm94Jyk7XG4gICAgfSk7XG5cbiAgICAvLyBBcmd1bWVudC10YWtpbmcgbWFjcm9zIGV4aXN0IG9ubHkgc28gcHJldmlvdXNseSBhdXRob3JlZCBsYXRleCBwYXJzZXMuXG4gICAgLy8gRWRpdGluZyBuZXZlciBnb2VzIHRocm91Z2ggdGhlbTogTWF0aExpdmUgc2VyaWFsaXNlcyBhIG1hY3JvIGZyb20gaXRzXG4gICAgLy8gb3JpZ2luYWwgYXJndW1lbnRzLCBzbyB0eXBlZCBjb250ZW50IG5ldmVyIGNvbWVzIGJhY2sgb3V0LlxuICAgIGl0KCdhcmd1bWVudC10YWtpbmcgbWFjcm9zIGFyZSBwbGFpbiBwYXJzZS1vbmx5IGRlZmluaXRpb25zJywgKCkgPT4ge1xuICAgICAgWydsb25nZGl2JywgJ292ZXJhcmMnLCAnYWJzJ10uZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICBleHBlY3QodHlwZW9mIGluc3RhbmNlLlBJRV9NQUNST1NbbmFtZV0pLnRvQmUoJ3N0cmluZycpO1xuICAgICAgICBleHBlY3QoaW5zdGFuY2UuUElFX01BQ1JPU1tuYW1lXSkudG9Db250YWluKCcjMScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYXJndW1lbnQtbGVzcyBzeW1ib2xzIHN0YXkgYXRvbWljJywgKCkgPT4ge1xuICAgICAgWydwZXJwZW5kaWN1bGFyJywgJ3NxdWFyZScsICdkZWdyZWUnLCAnbmFwcHJveCcsICdwYXJhbGxlbG9ncmFtJ10uZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICBleHBlY3QodHlwZW9mIGluc3RhbmNlLlBJRV9NQUNST1NbbmFtZV0pLnRvQmUoJ3N0cmluZycpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbG9uZ2RpdiBtYXRjaGVzIHRoZSBNYXRoSmF4IG1hY3JvIHVzZWQgYnkgbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaW5zdGFuY2UuUElFX01BQ1JPUy5sb25nZGl2KS50b0VxdWFsKCdcXFxcZW5jbG9zZXtsb25nZGl2fXsjMX0nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FwcGx5U3RhdGljTWF0aCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyB1bmRlZmluZWQgd2l0aG91dCBhbiBlbGVtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGluc3RhbmNlLmFwcGx5U3RhdGljTWF0aChudWxsLCAneCcpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVmZXJzIChyZXR1cm5zIHVuZGVmaW5lZCkgd2hlbiBNYXRoTGl2ZSBoYXMgbm90IGxvYWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5hcHBseVN0YXRpY01hdGgoZWwsICd4JykpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHN5bmNocm9ub3VzbHkgb25jZSBNYXRoTGl2ZSBpcyBhdmFpbGFibGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IGNvbnZlcnRMYXRleFRvTWFya3VwOiAobCkgPT4gYDxzcGFuPiR7bH08L3NwYW4+YCB9KTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLmFwcGx5U3RhdGljTWF0aChlbCwgJ1xcXFxwaScpKS50b0JlKGVsKTtcbiAgICAgIGV4cGVjdChlbC5pbm5lckhUTUwpLnRvRXF1YWwoJzxzcGFuPlxcXFxwaTwvc3Bhbj4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIHRoZSBlbGVtZW50IHRleHRDb250ZW50IHdoZW4gbm8gbGF0ZXggaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZWwudGV4dENvbnRlbnQgPSAnXFxcXHRoZXRhJztcbiAgICAgIGluc3RhbmNlLl9fc2V0TWF0aExpdmVGb3JUZXN0KHsgY29udmVydExhdGV4VG9NYXJrdXA6IChsKSA9PiBgPGk+JHtsfTwvaT5gIH0pO1xuICAgICAgaW5zdGFuY2UuYXBwbHlTdGF0aWNNYXRoKGVsKTtcblxuICAgICAgZXhwZWN0KGVsLmlubmVySFRNTCkudG9FcXVhbCgnPGk+XFxcXHRoZXRhPC9pPicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2JyaWRnZXMgc3RvcmVkIGxhdGV4IChuZXdMaW5lIGVtYmVkKSBiZWZvcmUgcmVuZGVyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBjb252ZXJ0TGF0ZXhUb01hcmt1cDogKGwpID0+IGwgfSk7XG4gICAgICBpbnN0YW5jZS5hcHBseVN0YXRpY01hdGgoZWwsICdhXFxcXGVtYmVke25ld0xpbmV9W11iJyk7XG5cbiAgICAgIC8vIFxcZW1iZWR7bmV3TGluZX1bXSBtdXN0IGJlY29tZSBhIG11bHRpbGluZSBlbnZpcm9ubWVudFxuICAgICAgZXhwZWN0KGVsLmlubmVySFRNTCkudG9Db250YWluKCdkaXNwbGF5bGluZXMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvbmZpZ3VyZUZvbnRzJywgKCkgPT4ge1xuICAgIC8vIE1hdGhMaXZlJ3MgZGVmYXVsdCBmb250c0RpcmVjdG9yeSBpcyB0aGUgcmVsYXRpdmUgJy4vZm9udHMvJywgd2hpY2ggaXRcbiAgICAvLyByZXNvbHZlcyBhZ2FpbnN0IGl0cyBvd24gKGVtcHR5LCB3aGVuIGJ1bmRsZWQpIHNjcmlwdCB1cmwgYW5kIHRocm93c1xuICAgIC8vIFwiSW52YWxpZCBiYXNlIFVSTFwiIGZyb20gbG9hZEZvbnRzLiBQYXRocyBtdXN0IGJlY29tZSBhYnNvbHV0ZS5cbiAgICBpdCgnaXMgZXhwb3J0ZWQgYW5kIGNhbGxhYmxlIGJlZm9yZSBNYXRoTGl2ZSBsb2FkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0eXBlb2YgaW5zdGFuY2UuY29uZmlndXJlRm9udHMpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgICBleHBlY3QoKCkgPT4gaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJy9tYXRobGl2ZS1mb250cycpKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FjY2VwdHMgbnVsbCB0byBkaXNhYmxlIGZvbnQgbG9hZGluZycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiBpbnN0YW5jZS5jb25maWd1cmVGb250cyhudWxsKSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGFuIGFic29sdXRlIHVybCB0byBhbiBhbHJlYWR5LWxvYWRlZCBNYXRoZmllbGRFbGVtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICAvLyBzaW11bGF0ZSBhIGxvYWRlZCBpbnN0YW5jZVxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBNYXRoZmllbGRFbGVtZW50IH0pO1xuICAgICAgaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJy9tYXRobGl2ZS1mb250cycpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkudG9FcXVhbChgJHtkb2N1bWVudC5iYXNlVVJJLnJlcGxhY2UoL1xcLyQvLCAnJyl9L21hdGhsaXZlLWZvbnRzYCk7XG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeS5zdGFydHNXaXRoKCdodHRwJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBcXG5lcSwgXFxuc2ltIGFuZCBcXG5jb25nIGFyZSBidWlsdCBmcm9tIFByaXZhdGUgVXNlIEFyZWEgZ2x5cGhzIHRoYXQgb25seVxuICAgIC8vIHRoZSBLYVRlWCBmb250cyBjb250YWluLCBzbyBcIm5vIGZvbnRzXCIgcmVuZGVycyBnYXJiYWdlIHJhdGhlciB0aGFuXG4gICAgLy8gZGVncmFkaW5nIGdyYWNlZnVsbHkgLSBoZW5jZSBhIENETiBmYWxsYmFjayBieSBkZWZhdWx0LlxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGEgdmVyc2lvbi1waW5uZWQgQ0ROIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQsIHZlcnNpb246IHsgbWF0aGxpdmU6ICc5LjkuOScgfSB9KTtcbiAgICAgIGluc3RhbmNlLmNvbmZpZ3VyZUZvbnRzKHVuZGVmaW5lZCk7XG5cbiAgICAgIGV4cGVjdChNYXRoZmllbGRFbGVtZW50LmZvbnRzRGlyZWN0b3J5KS50b0VxdWFsKCdodHRwczovL3VucGtnLmNvbS9tYXRobGl2ZUA5LjkuOS9mb250cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VzZXMgL2ZvbnRzLCBub3QgL2Rpc3QvZm9udHMgKHRoZSBsYXR0ZXIgNDA0cyBvbiB1bnBrZyknLCAoKSA9PiB7XG4gICAgICBjb25zdCBNYXRoZmllbGRFbGVtZW50ID0ge307XG5cbiAgICAgIGluc3RhbmNlLl9fc2V0TWF0aExpdmVGb3JUZXN0KHsgTWF0aGZpZWxkRWxlbWVudCwgdmVyc2lvbjogeyBtYXRobGl2ZTogJzAuMTEwLjAnIH0gfSk7XG4gICAgICBpbnN0YW5jZS5jb25maWd1cmVGb250cyh1bmRlZmluZWQpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkudG9FcXVhbCgnaHR0cHM6Ly91bnBrZy5jb20vbWF0aGxpdmVAMC4xMTAuMC9mb250cycpO1xuICAgICAgZXhwZWN0KE1hdGhmaWVsZEVsZW1lbnQuZm9udHNEaXJlY3RvcnkpLm5vdC50b0NvbnRhaW4oJy9kaXN0LycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgY29uZmlndXJlZCBwYXRoIHdpbnMgb3ZlciB0aGUgQ0ROJywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQsIHZlcnNpb246IHsgbWF0aGxpdmU6ICcwLjExMC4wJyB9IH0pO1xuICAgICAgaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJy9tYXRobGl2ZS1mb250cycpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkubm90LnRvQ29udGFpbigndW5wa2cuY29tJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbnVsbCBzdGlsbCBvcHRzIG91dCBlbnRpcmVseScsICgpID0+IHtcbiAgICAgIGNvbnN0IE1hdGhmaWVsZEVsZW1lbnQgPSB7fTtcblxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBNYXRoZmllbGRFbGVtZW50LCB2ZXJzaW9uOiB7IG1hdGhsaXZlOiAnMC4xMTAuMCcgfSB9KTtcbiAgICAgIGluc3RhbmNlLmNvbmZpZ3VyZUZvbnRzKG51bGwpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgYSBmdWxseS1xdWFsaWZpZWQgdXJsIHVudG91Y2hlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IE1hdGhmaWVsZEVsZW1lbnQgPSB7fTtcblxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBNYXRoZmllbGRFbGVtZW50IH0pO1xuICAgICAgaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJ2h0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2ZvbnRzJyk7XG5cbiAgICAgIGV4cGVjdChNYXRoZmllbGRFbGVtZW50LmZvbnRzRGlyZWN0b3J5KS50b0VxdWFsKCdodHRwczovL2Nkbi5leGFtcGxlLmNvbS9mb250cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBudWxsIHRocm91Z2ggcmF0aGVyIHRoYW4gcmVzb2x2aW5nIGl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQgfSk7XG4gICAgICBpbnN0YW5jZS5jb25maWd1cmVGb250cyhudWxsKTtcblxuICAgICAgZXhwZWN0KE1hdGhmaWVsZEVsZW1lbnQuZm9udHNEaXJlY3RvcnkpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEEgbGl2ZSA8bWF0aC1maWVsZD4gcmVuZGVycyBpbiBzaGFkb3cgRE9NLCBzbyBub3RoaW5nIGluIHRoZSBwYWdlJ3NcbiAgLy8gc3R5bGVzaGVldHMgcmVhY2hlcyBpdCAtIHRoZSBzdHJldGNoeS1hY2NlbnQgZml4IGhhcyB0byBiZSBpbmplY3RlZCB0aGVyZS5cbiAgLyoqXG4gICAqIEEga2V5cGFkIGtleSBsaWtlIFxcZnJhYyBpbnNlcnRzIGBcXGZyYWN7Iz99eyM/fWA7IE1hdGhMaXZlIHR1cm5zIGVhY2ggYCM/YFxuICAgKiBpbnRvIGEgYFxccGxhY2Vob2xkZXJ7fWAgYXRvbSBhbmQgKnNlbGVjdHMqIHRoZSBmaXJzdCBvbmUuIE1lYXN1cmVkIGluXG4gICAqIENocm9taXVtOiB0aGF0IGF0b20gaXMgYSBsZWFmIChpdHMgb2Zmc2V0cyBhcmUgYmVmb3JlL2FmdGVyLCB0aGVyZSBpcyBub1xuICAgKiBwb3NpdGlvbiBpbnNpZGUpLCBzbyBNYXRoTGl2ZSByZW5kZXJzIE5PIGNhcmV0IGVsZW1lbnQgYW5kIHNob3dzIG9ubHkgdGhlXG4gICAqIHNlbGVjdGlvbiBoaWdobGlnaHQgLSB0aGUgYm94IHJlYWQgYXMgZm9jdXNlZC1idXQtZGVhZC4gVGhlIGNhcmV0IGlzIGRyYXduXG4gICAqIGJ5IG91ciBvd24gc2hhZG93IENTUywgZ2F0ZWQgb24gYSBjbGFzcyBzbyBpdCBpcyBwbGFjZWhvbGRlci1zcGVjaWZpYy5cbiAgICovXG4gIGRlc2NyaWJlKCd0cmFja1BsYWNlaG9sZGVyQ2FyZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmFrZUZpZWxkID0gKHNlbGVjdGlvbiwgbGF0ZXgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpc3RlbmVyczoge30sXG4gICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgc2VsZWN0aW9uSXNDb2xsYXBzZWQ6ICFzZWxlY3Rpb24sXG4gICAgICAgIGdldFZhbHVlOiAoKSA9PiBsYXRleCxcbiAgICAgICAgY2xhc3NMaXN0OiB7XG4gICAgICAgICAgdG9nZ2xlOiAobmFtZSwgb24pID0+IChvbiA/IGNsYXNzZXMuYWRkKG5hbWUpIDogY2xhc3Nlcy5kZWxldGUobmFtZSkpLFxuICAgICAgICAgIGNvbnRhaW5zOiAobmFtZSkgPT4gY2xhc3Nlcy5oYXMobmFtZSksXG4gICAgICAgIH0sXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZm4pIHtcbiAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lXSA9IGZuO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbbmFtZV07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBpdCgnbWFya3MgdGhlIGhvc3Qgd2hlbiBhIHBsYWNlaG9sZGVyIGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQoeyByYW5nZXM6IFtbMSwgMl1dIH0sICdcXFxccGxhY2Vob2xkZXJ7fScpO1xuXG4gICAgICBpbnN0YW5jZS50cmFja1BsYWNlaG9sZGVyQ2FyZXQobWYpO1xuXG4gICAgICBleHBlY3QobWYuY2xhc3NMaXN0LmNvbnRhaW5zKGluc3RhbmNlLlBMQUNFSE9MREVSX0NBUkVUX0NMQVNTKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBtYXJrIGFuIG9yZGluYXJ5IHNlbGVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1mID0gZmFrZUZpZWxkKHsgcmFuZ2VzOiBbWzAsIDNdXSB9LCAneCsxJyk7XG5cbiAgICAgIGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldChtZik7XG5cbiAgICAgIGV4cGVjdChtZi5jbGFzc0xpc3QuY29udGFpbnMoaW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1MpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBtYXJrIGEgY29sbGFwc2VkIHNlbGVjdGlvbiwgd2hpY2ggaGFzIGEgcmVhbCBjYXJldCBhbHJlYWR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQobnVsbCwgJ1xcXFxwbGFjZWhvbGRlcnt9Jyk7XG5cbiAgICAgIGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldChtZik7XG5cbiAgICAgIGV4cGVjdChtZi5jbGFzc0xpc3QuY29udGFpbnMoaW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1MpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgYSBuYW1lZCBwcm9tcHQgYWxvbmUgLSBpdCB0YWtlcyBhIHJlYWwgY2FyZXQgaW5zaWRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQoeyByYW5nZXM6IFtbMSwgMl1dIH0sICdcXFxccGxhY2Vob2xkZXJbcjFde30nKTtcblxuICAgICAgaW5zdGFuY2UudHJhY2tQbGFjZWhvbGRlckNhcmV0KG1mKTtcblxuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlLWV2YWx1YXRlcyB3aGVuZXZlciB0aGUgc2VsZWN0aW9uIG1vdmVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQobnVsbCwgJycpO1xuXG4gICAgICBpbnN0YW5jZS50cmFja1BsYWNlaG9sZGVyQ2FyZXQobWYpO1xuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuXG4gICAgICAvLyB0aGUgY2FyZXQgbGFuZHMgb24gYSBwbGFjZWhvbGRlclxuICAgICAgbWYuc2VsZWN0aW9uID0geyByYW5nZXM6IFtbMSwgMl1dIH07XG4gICAgICBtZi5zZWxlY3Rpb25Jc0NvbGxhcHNlZCA9IGZhbHNlO1xuICAgICAgbWYuZ2V0VmFsdWUgPSAoKSA9PiAnXFxcXHBsYWNlaG9sZGVye30nO1xuICAgICAgbWYubGlzdGVuZXJzWydzZWxlY3Rpb24tY2hhbmdlJ10oKTtcbiAgICAgIGV4cGVjdChtZi5jbGFzc0xpc3QuY29udGFpbnMoaW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1MpKS50b0JlKHRydWUpO1xuXG4gICAgICAvLyAuLi5hbmQgbW92ZXMgb2ZmIGl0IGFnYWluXG4gICAgICBtZi5zZWxlY3Rpb25Jc0NvbGxhcHNlZCA9IHRydWU7XG4gICAgICBtZi5saXN0ZW5lcnNbJ3NlbGVjdGlvbi1jaGFuZ2UnXSgpO1xuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYSB0ZWFyZG93biB0aGF0IGRldGFjaGVzIHRoZSBsaXN0ZW5lcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1mID0gZmFrZUZpZWxkKG51bGwsICcnKTtcbiAgICAgIGNvbnN0IG9mZiA9IGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldChtZik7XG5cbiAgICAgIGV4cGVjdCh0eXBlb2YgbWYubGlzdGVuZXJzWydzZWxlY3Rpb24tY2hhbmdlJ10pLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gICAgICBvZmYoKTtcbiAgICAgIGV4cGVjdChtZi5saXN0ZW5lcnNbJ3NlbGVjdGlvbi1jaGFuZ2UnXSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1cnZpdmVzIGEgZmllbGQgdGhhdCB0aHJvd3Mgd2hpbGUgcmVhZGluZyB0aGUgc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQoeyByYW5nZXM6IFtbMSwgMl1dIH0sICcnKTtcblxuICAgICAgbWYuZ2V0VmFsdWUgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGV0YWNoZWQnKTtcbiAgICAgIH07XG5cbiAgICAgIGV4cGVjdCgoKSA9PiBpbnN0YW5jZS50cmFja1BsYWNlaG9sZGVyQ2FyZXQobWYpKS5ub3QudG9UaHJvdygpO1xuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGEgbm8tb3Agd2l0aG91dCBhIGZpZWxkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldCh1bmRlZmluZWQpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5zdGFuY2UudHJhY2tQbGFjZWhvbGRlckNhcmV0KHt9KSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXBwbHlTaGFkb3dTdHlsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgaG9zdCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGVsLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcblxuICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG5cbiAgICBpdCgnaXMgYSBuby1vcCB3aXRob3V0IGEgc2hhZG93IHJvb3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gaW5zdGFuY2UuYXBwbHlTaGFkb3dTdHlsZXModW5kZWZpbmVkKSkubm90LnRvVGhyb3coKTtcbiAgICAgIGV4cGVjdCgoKSA9PiBpbnN0YW5jZS5hcHBseVNoYWRvd1N0eWxlcyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5qZWN0cyB0aGUgYWNjZW50IGZpeCBpbnRvIHRoZSBzaGFkb3cgcm9vdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gaG9zdCgpO1xuXG4gICAgICBpbnN0YW5jZS5hcHBseVNoYWRvd1N0eWxlcyhlbCk7XG5cbiAgICAgIGNvbnN0IHZpYVNoZWV0ID0gZWwuc2hhZG93Um9vdC5fX3BpZUFjY2VudFNoZWV0O1xuICAgICAgY29uc3QgdmlhU3R5bGUgPSBlbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlW2RhdGEtcGllLWFjY2VudF0nKTtcbiAgICAgIGNvbnN0IGNzcyA9IHZpYVNoZWV0ID8gJ2Fkb3B0ZWQnIDogKHZpYVN0eWxlICYmIHZpYVN0eWxlLnRleHRDb250ZW50KSB8fCAnJztcblxuICAgICAgZXhwZWN0KHZpYVNoZWV0IHx8IHZpYVN0eWxlKS50b0JlVHJ1dGh5KCk7XG5cbiAgICAgIGlmICh2aWFTdHlsZSkge1xuICAgICAgICBleHBlY3QoY3NzKS50b0NvbnRhaW4oJ21hcmdpbi1sZWZ0OjAgIWltcG9ydGFudCcpO1xuICAgICAgICAvLyBzY29wZWQgc28gc2luZ2xlLWdseXBoIGFjY2VudHMga2VlcCB0aGVpciBjZW50cmluZyBvZmZzZXRcbiAgICAgICAgZXhwZWN0KGNzcykudG9Db250YWluKCc6aGFzKC5NTF9fc3RyZXRjaHkpJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnaW5qZWN0cyB0aGUgcGxhY2Vob2xkZXIgY2FyZXQgcnVsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGhvc3QoKTtcblxuICAgICAgaW5zdGFuY2UuYXBwbHlTaGFkb3dTdHlsZXMoZWwpO1xuXG4gICAgICBjb25zdCB2aWFTdHlsZSA9IGVsLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc3R5bGVbZGF0YS1waWUtYWNjZW50XScpO1xuXG4gICAgICBpZiAodmlhU3R5bGUpIHtcbiAgICAgICAgY29uc3QgY3NzID0gdmlhU3R5bGUudGV4dENvbnRlbnQ7XG5cbiAgICAgICAgLy8gZ2F0ZWQgb24gdGhlIGhvc3QgY2xhc3MsIHNvIGFuIG9yZGluYXJ5IHNlbGVjdGlvbiBnZXRzIG5vIGNhcmV0XG4gICAgICAgIGV4cGVjdChjc3MpLnRvQ29udGFpbihgOmhvc3QoLiR7aW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1N9KWApO1xuICAgICAgICAvLyBNYXRoTGl2ZSdzIG93biBibGluayBrZXlmcmFtZXMgYW5kIGNhcmV0IGNvbG91ciwgYWxyZWFkeSBpbiB0aGlzIHJvb3RcbiAgICAgICAgZXhwZWN0KGNzcykudG9Db250YWluKCdNTF9fY2FyZXQtYmxpbmsnKTtcbiAgICAgICAgZXhwZWN0KGNzcykudG9Db250YWluKCctLV9jYXJldC1jb2xvcicpO1xuICAgICAgICAvLyB0aGUgaW5uZXJtb3N0IHNlbGVjdGVkIGVsZW1lbnQgb25seTogTWF0aExpdmUgbWFya3MgYSB3cmFwcGVyIEFORCB0aGVcbiAgICAgICAgLy8gZ2x5cGggc3Bhbiwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHJlbmRlciB0d28gY2FyZXRzXG4gICAgICAgIGV4cGVjdChjc3MpLnRvQ29udGFpbignLk1MX19zZWxlY3RlZDpub3QoOmhhcyguTUxfX3NlbGVjdGVkKSknKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdpbmplY3RzIHRoZSByYWRpY2FsIGluZGV4IHNpemUgZml4JywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBob3N0KCk7XG5cbiAgICAgIGluc3RhbmNlLmFwcGx5U2hhZG93U3R5bGVzKGVsKTtcblxuICAgICAgY29uc3QgdmlhU3R5bGUgPSBlbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlW2RhdGEtcGllLWFjY2VudF0nKTtcblxuICAgICAgaWYgKHZpYVN0eWxlKSB7XG4gICAgICAgIGNvbnN0IGNzcyA9IHZpYVN0eWxlLnRleHRDb250ZW50O1xuXG4gICAgICAgIC8vIE1hdGhMaXZlJ3Mgc2NyaXB0c2NyaXB0c3R5bGUgaW5kZXggKGFuIGlubGluZSA1MCUpIHJlYWRzIHRvbyBzbWFsbCBpblxuICAgICAgICAvLyB0aGUgYXV0aG9yaW5nIFVJOyBhIG1hdGhmaWVsZCdzIHNoYWRvdyByb290IG5lZWRzIGl0cyBvd24gY29weSBvZiB0aGVcbiAgICAgICAgLy8gcnVsZSwgc2luY2UgaG9zdCBzdHlsZXMgZG8gbm90IGNyb3NzIHRoZSBib3VuZGFyeS4gQ29tcGFyZWQgYWdhaW5zdFxuICAgICAgICAvLyB0aGUgZXhwb3J0ZWQgcnVsZSwgc28gdGhlIHNpemUgc3RheXMgZGVmaW5lZCBpbiBvbmUgcGxhY2UuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgICAgICBjb25zdCB7IFJPT1RfSU5ERVhfQ1NTIH0gPSByZXF1aXJlKCcuLi9tZi9jb21tb24tc3R5bGVzJyk7XG5cbiAgICAgICAgZXhwZWN0KFJPT1RfSU5ERVhfQ1NTKS50b0NvbnRhaW4oJy5NTF9fc3FydC1pbmRleCA+Jyk7XG4gICAgICAgIGV4cGVjdChjc3MpLnRvQ29udGFpbihST09UX0lOREVYX0NTUyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgaW5qZWN0IHR3aWNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBob3N0KCk7XG5cbiAgICAgIGluc3RhbmNlLmFwcGx5U2hhZG93U3R5bGVzKGVsKTtcbiAgICAgIGluc3RhbmNlLmFwcGx5U2hhZG93U3R5bGVzKGVsKTtcblxuICAgICAgY29uc3Qgc3R5bGVzID0gZWwuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZVtkYXRhLXBpZS1hY2NlbnRdJyk7XG5cbiAgICAgIC8vIGVpdGhlciBvbmUgYWRvcHRlZCBzaGVldCwgb3IgZXhhY3RseSBvbmUgc3R5bGUgbm9kZVxuICAgICAgZXhwZWN0KGVsLnNoYWRvd1Jvb3QuX19waWVBY2NlbnRTaGVldCA/IDEgOiBzdHlsZXMubGVuZ3RoKS50b0JlKDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGF0ZXhUb01hcmt1cCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBlbXB0eSBzdHJpbmcgd2hlbiBNYXRoTGl2ZSBpcyBub3QgbG9hZGVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGluc3RhbmNlLmxhdGV4VG9NYXJrdXAoJ1xcXFxwaScpKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGVtcHR5IHN0cmluZyBmb3IgZW1wdHkgbGF0ZXgnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaW5zdGFuY2UubGF0ZXhUb01hcmt1cCgnJykpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUFBLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxZQUFNO0VBQ2xDLElBQUlDLFFBQVE7RUFFWkMsVUFBVSxDQUFDLFlBQU07SUFDZkMsSUFBSSxDQUFDQyxZQUFZLENBQUMsQ0FBQztJQUNuQjtJQUNBSCxRQUFRLEdBQUdJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztJQUMxQ0osUUFBUSxDQUFDSyxhQUFhLENBQUMsQ0FBQztFQUMxQixDQUFDLENBQUM7RUFFRk4sUUFBUSxDQUFD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