@pie-lib/math-input-mathlive 1.1.5-beta.1 → 1.1.5-beta.11

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 (55) hide show
  1. package/lib/__tests__/composites.test.js +255 -0
  2. package/lib/__tests__/drop-in-compat.test.js +133 -0
  3. package/lib/__tests__/embedded-fonts.test.js +121 -0
  4. package/lib/__tests__/index.test.js +118 -0
  5. package/lib/__tests__/input-imperative.test.js +155 -0
  6. package/lib/__tests__/keypad-label.test.js +231 -0
  7. package/lib/__tests__/keypad-render.test.js +206 -0
  8. package/lib/__tests__/latex-bridge.test.js +386 -0
  9. package/lib/__tests__/mathlive-instance.test.js +419 -0
  10. package/lib/__tests__/mount-race.test.js +218 -0
  11. package/lib/__tests__/static-prompts.test.js +405 -0
  12. package/lib/__tests__/tmp-markup.test.js +26 -0
  13. package/lib/keypad/index.js +36 -12
  14. package/lib/keypad/index.js.map +1 -1
  15. package/lib/latex-bridge.js +159 -4
  16. package/lib/latex-bridge.js.map +1 -1
  17. package/lib/mathlive-instance.js +21 -28
  18. package/lib/mathlive-instance.js.map +1 -1
  19. package/lib/mf/common-styles.js +17 -2
  20. package/lib/mf/common-styles.js.map +1 -1
  21. package/lib/mf/index.js +6 -0
  22. package/lib/mf/index.js.map +1 -1
  23. package/lib/mf/input.js +13 -0
  24. package/lib/mf/input.js.map +1 -1
  25. package/lib/mf/static.js +4 -2
  26. package/lib/mf/static.js.map +1 -1
  27. package/lib/selection.js +148 -0
  28. package/lib/selection.js.map +1 -0
  29. package/package.json +1 -1
  30. package/src/__tests__/composites.test.jsx +220 -0
  31. package/src/__tests__/drop-in-compat.test.jsx +112 -0
  32. package/src/__tests__/index.test.jsx +109 -0
  33. package/src/__tests__/input-imperative.test.jsx +144 -0
  34. package/src/__tests__/input-selection.test.jsx +64 -0
  35. package/src/__tests__/keypad-label.test.jsx +284 -0
  36. package/src/__tests__/keypad-render.test.jsx +123 -0
  37. package/src/__tests__/latex-bridge.test.js +389 -0
  38. package/src/__tests__/mathlive-instance.test.js +418 -0
  39. package/src/__tests__/mount-race.test.jsx +142 -0
  40. package/src/__tests__/selection.test.js +212 -0
  41. package/src/__tests__/static-prompts.test.jsx +364 -0
  42. package/src/keypad/index.jsx +18 -3
  43. package/src/latex-bridge.js +171 -4
  44. package/src/mathlive-instance.js +27 -29
  45. package/src/mf/common-styles.js +19 -0
  46. package/src/mf/index.js +2 -0
  47. package/src/mf/input.jsx +14 -0
  48. package/src/mf/static.jsx +4 -1
  49. package/src/selection.js +146 -0
  50. package/lib/fonts/embedded.js +0 -120
  51. package/lib/fonts/index.js +0 -81
  52. package/lib/fonts/index.js.map +0 -1
  53. package/scripts/generate-embedded-fonts.js +0 -94
  54. package/src/fonts/embedded.js +0 -116
  55. package/src/fonts/index.js +0 -71
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _static = _interopRequireDefault(require("../mf/static"));
6
+ 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; }
7
+ 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; }
8
+ /**
9
+ * The answer-block contract: `\MathQuillMathField[id]{}` in stored latex becomes
10
+ * a MathLive prompt, and sub-field values/focus are surfaced through the same
11
+ * callbacks @pie-lib/math-input exposed (`onSubFieldChange`, `onSubFieldFocus`,
12
+ * `getFieldName`, `setInput`).
13
+ *
14
+ * Driven against a stub mathfield: a real <math-field> needs a browser, and what
15
+ * matters here is the mapping, not MathLive's rendering.
16
+ */
17
+ var stubField = function stubField() {
18
+ var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
19
+ var selection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
20
+ return {
21
+ values: _objectSpread({}, values),
22
+ getPrompts: function getPrompts() {
23
+ return Object.keys(this.values);
24
+ },
25
+ getPromptValue: function getPromptValue(id) {
26
+ return this.values[id];
27
+ },
28
+ setPromptValue: function setPromptValue(id, v) {
29
+ this.values[id] = v;
30
+ },
31
+ getPromptRange: function getPromptRange(id) {
32
+ var i = Object.keys(this.values).indexOf(id);
33
+ return [i * 10, i * 10 + 5];
34
+ },
35
+ selection: selection,
36
+ // Caret bookkeeping: MathLive exposes the caret offset as `position`, and any
37
+ // executeCommand triggers the render that reveals the caret.
38
+ position: undefined,
39
+ commands: [],
40
+ executeCommand: function executeCommand(name) {
41
+ this.commands.push(name);
42
+ },
43
+ addEventListener: function addEventListener() {},
44
+ removeEventListener: function removeEventListener() {},
45
+ focus: function focus() {
46
+ this.focused = true;
47
+ },
48
+ blur: function blur() {
49
+ this.blurred = true;
50
+ },
51
+ remove: function remove() {}
52
+ };
53
+ };
54
+ var make = function make() {
55
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
56
+ return new _static["default"](_objectSpread({
57
+ latex: 'x=\\MathQuillMathField[r1]{}',
58
+ getFieldName: function getFieldName() {}
59
+ }, props));
60
+ };
61
+ describe('Static: answer blocks / prompts', function () {
62
+ describe('isInteractive', function () {
63
+ it('is interactive when the latex has answer blocks', function () {
64
+ expect(make({
65
+ latex: 'x=\\MathQuillMathField[r1]{}'
66
+ }).isInteractive()).toBe(true);
67
+ expect(make({
68
+ latex: 'x=\\placeholder[r1]{}'
69
+ }).isInteractive()).toBe(true);
70
+ });
71
+ it('is display-only for plain latex', function () {
72
+ expect(make({
73
+ latex: '\\frac{1}{2}'
74
+ }).isInteractive()).toBe(false);
75
+ expect(make({
76
+ latex: ''
77
+ }).isInteractive()).toBe(false);
78
+ });
79
+ });
80
+ describe('values', function () {
81
+ it('returns {} before the field exists', function () {
82
+ expect(make().values()).toEqual({});
83
+ });
84
+ it('maps each prompt id to its stored-form latex', function () {
85
+ var s = make();
86
+ s.mathField = stubField({
87
+ r1: '7',
88
+ r2: '\\placeholder{}'
89
+ });
90
+
91
+ // \placeholder must not leak into stored values
92
+ expect(s.values()).toEqual({
93
+ r1: '7',
94
+ r2: ''
95
+ });
96
+ });
97
+ });
98
+ describe('promptHandle / innerFields', function () {
99
+ it('exposes a MathQuill-field-like handle with get/set latex', function () {
100
+ var s = make();
101
+ s.mathField = stubField({
102
+ r1: '7'
103
+ });
104
+ var h = s.promptHandle('r1');
105
+ expect(h.id).toEqual('r1');
106
+ expect(h.latex()).toEqual('7');
107
+ h.latex('9');
108
+ expect(s.mathField.values.r1).toEqual('9');
109
+ });
110
+ it('handle latex() is safe with no field', function () {
111
+ expect(make().promptHandle('r1').latex()).toEqual('');
112
+ });
113
+ it('innerFields returns one handle per prompt', function () {
114
+ var s = make();
115
+ s.mathField = stubField({
116
+ r1: '1',
117
+ r2: '2'
118
+ });
119
+ expect(s.innerFields.map(function (f) {
120
+ return f.id;
121
+ })).toEqual(['r1', 'r2']);
122
+ expect(make().innerFields).toEqual([]);
123
+ });
124
+ });
125
+ describe('onSubFieldChange', function () {
126
+ it('fires only for prompts whose value changed', function () {
127
+ var onSubFieldChange = jest.fn();
128
+ var s = make({
129
+ onSubFieldChange: onSubFieldChange
130
+ });
131
+ s.mathField = stubField({
132
+ r1: '1',
133
+ r2: '2'
134
+ });
135
+ s.promptValues = {
136
+ r1: '1',
137
+ r2: '2'
138
+ };
139
+ s.mathField.values.r2 = '5';
140
+ s.onPromptInput();
141
+ expect(onSubFieldChange).toHaveBeenCalledTimes(1);
142
+ expect(onSubFieldChange).toHaveBeenCalledWith('r2', '5');
143
+ });
144
+ it('uses getFieldName when it returns a name', function () {
145
+ var onSubFieldChange = jest.fn();
146
+ var s = make({
147
+ onSubFieldChange: onSubFieldChange,
148
+ getFieldName: function getFieldName(handle) {
149
+ return 'named-' + handle.id;
150
+ }
151
+ });
152
+ s.mathField = stubField({
153
+ r1: '1'
154
+ });
155
+ s.promptValues = {};
156
+ s.onPromptInput();
157
+ expect(onSubFieldChange).toHaveBeenCalledWith('named-r1', '1');
158
+ });
159
+ it('still tracks values when no callback is supplied', function () {
160
+ var s = make();
161
+ s.mathField = stubField({
162
+ r1: '3'
163
+ });
164
+ s.onPromptInput();
165
+ expect(s.promptValues).toEqual({
166
+ r1: '3'
167
+ });
168
+ });
169
+ });
170
+ describe('onSubFieldFocus', function () {
171
+ it('reports the prompt containing the selection, plus setInput', function () {
172
+ var onSubFieldFocus = jest.fn();
173
+ var setInput = jest.fn();
174
+ var s = make({
175
+ onSubFieldFocus: onSubFieldFocus,
176
+ setInput: setInput
177
+ });
178
+
179
+ // r2 occupies offsets 10..15
180
+ s.mathField = stubField({
181
+ r1: '',
182
+ r2: ''
183
+ }, {
184
+ ranges: [[11, 11]]
185
+ });
186
+ s.onPromptFocus();
187
+ expect(onSubFieldFocus).toHaveBeenCalledTimes(1);
188
+ expect(onSubFieldFocus.mock.calls[0][0]).toEqual('r2');
189
+ expect(onSubFieldFocus.mock.calls[0][1].id).toEqual('r2');
190
+ expect(setInput).toHaveBeenCalled();
191
+ });
192
+ it('does nothing without a selection', function () {
193
+ var onSubFieldFocus = jest.fn();
194
+ var s = make({
195
+ onSubFieldFocus: onSubFieldFocus
196
+ });
197
+ s.mathField = stubField({
198
+ r1: ''
199
+ }, null);
200
+ s.onPromptFocus();
201
+ expect(onSubFieldFocus).not.toHaveBeenCalled();
202
+ });
203
+ it('does not throw when the field is missing', function () {
204
+ var s = make({
205
+ onSubFieldFocus: jest.fn()
206
+ });
207
+ expect(function () {
208
+ return s.onPromptFocus();
209
+ }).not.toThrow();
210
+ });
211
+ });
212
+ describe('accessibility announcements', function () {
213
+ afterEach(function () {
214
+ document.body.innerHTML = '';
215
+ });
216
+ it('creates a polite off-screen live region', function () {
217
+ var s = make();
218
+ s.createLiveRegion();
219
+ expect(s.liveRegion.getAttribute('aria-live')).toEqual('polite');
220
+ expect(s.liveRegion.getAttribute('aria-atomic')).toEqual('true');
221
+ expect(document.body.contains(s.liveRegion)).toBe(true);
222
+ s.removeLiveRegion();
223
+ expect(s.liveRegion).toBeUndefined();
224
+ });
225
+ it('does not create a second region', function () {
226
+ var s = make();
227
+ s.createLiveRegion();
228
+ var first = s.liveRegion;
229
+ s.createLiveRegion();
230
+ expect(s.liveRegion).toBe(first);
231
+ s.removeLiveRegion();
232
+ });
233
+ it('announces when typed input expands into a command', function () {
234
+ var s = make();
235
+ s.createLiveRegion();
236
+ s.promptValues = {
237
+ r1: 'x'
238
+ };
239
+ // grew by more than one char AND gained a backslash => a conversion
240
+ s.announceConversion({
241
+ r1: 'x\\frac{}{}'
242
+ });
243
+ expect(s.liveRegion.textContent).toEqual('Converted to math symbol');
244
+ s.removeLiveRegion();
245
+ });
246
+ it('does not announce ordinary typing', function () {
247
+ var s = make();
248
+ s.createLiveRegion();
249
+ s.promptValues = {
250
+ r1: 'x'
251
+ };
252
+ s.announceConversion({
253
+ r1: 'xy'
254
+ });
255
+ expect(s.liveRegion.textContent).toEqual('');
256
+ s.removeLiveRegion();
257
+ });
258
+ it('does not announce a deletion', function () {
259
+ var s = make();
260
+ s.createLiveRegion();
261
+ s.promptValues = {
262
+ r1: 'x\\frac{}{}'
263
+ };
264
+ s.onKeyDown({
265
+ key: 'Backspace'
266
+ });
267
+ s.announceConversion({
268
+ r1: 'x'
269
+ });
270
+ expect(s.liveRegion.textContent).toEqual('');
271
+ s.removeLiveRegion();
272
+ });
273
+ });
274
+ describe('focus / blur', function () {
275
+ it('delegates to the field and is safe without one', function () {
276
+ var s = make();
277
+ expect(function () {
278
+ s.focus();
279
+ s.blur();
280
+ }).not.toThrow();
281
+ s.mathField = stubField();
282
+ s.focus();
283
+ s.blur();
284
+ expect(s.mathField.focused).toBe(true);
285
+ expect(s.mathField.blurred).toBe(true);
286
+ });
287
+ });
288
+
289
+ /**
290
+ * MathLive shows the caret only while the field carries `ML__focused`, which
291
+ * it adds during a render gated on `isSelectionEditable && hasFocus()`. In a
292
+ * read-only field only prompt interiors are editable, so after a bare
293
+ * `focus()` - whose selection sits outside every prompt - the answer block
294
+ * looked focused but had no blinking cursor. Verified in Chromium: the caret
295
+ * span goes from visibility:hidden to visible once the selection is inside a
296
+ * prompt AND a render has run.
297
+ */
298
+ describe('caret placement', function () {
299
+ it('puts a collapsed caret in the first prompt on focus', function () {
300
+ var s = make();
301
+ s.mathField = stubField({
302
+ r1: '',
303
+ r2: ''
304
+ });
305
+ s.focus();
306
+
307
+ // stub ranges are [0,5] for r1, [10,15] for r2
308
+ expect(s.mathField.selection).toEqual({
309
+ ranges: [[0, 0]]
310
+ });
311
+ });
312
+ it('forces the render that makes the caret visible', function () {
313
+ var s = make();
314
+ s.mathField = stubField({
315
+ r1: ''
316
+ });
317
+ s.focus();
318
+
319
+ // assigning `selection` alone updates the model without re-rendering, so
320
+ // ML__focused would never be added
321
+ expect(s.mathField.commands).toEqual(['scrollIntoView']);
322
+ });
323
+ it('does not move a caret that is already inside a prompt', function () {
324
+ var s = make();
325
+ s.mathField = stubField({
326
+ r1: '',
327
+ r2: ''
328
+ });
329
+ s.mathField.position = 12; // inside r2
330
+ s.focus();
331
+ expect(s.mathField.selection).toBe(null);
332
+ expect(s.mathField.commands).toEqual([]);
333
+ });
334
+ it('targets a specific prompt', function () {
335
+ var s = make();
336
+ s.mathField = stubField({
337
+ r1: '',
338
+ r2: ''
339
+ });
340
+ s.focusPrompt('r2');
341
+ expect(s.mathField.selection).toEqual({
342
+ ranges: [[10, 10]]
343
+ });
344
+ });
345
+ it('falls back to the first prompt for an unknown id', function () {
346
+ var s = make();
347
+ s.mathField = stubField({
348
+ r1: '',
349
+ r2: ''
350
+ });
351
+ s.focusPrompt('nope');
352
+ expect(s.mathField.selection).toEqual({
353
+ ranges: [[0, 0]]
354
+ });
355
+ });
356
+ it('is a no-op when there are no prompts', function () {
357
+ var s = make();
358
+ s.mathField = stubField({});
359
+ expect(function () {
360
+ return s.focusPrompt();
361
+ }).not.toThrow();
362
+ expect(s.mathField.selection).toBe(null);
363
+ });
364
+ it('is safe without a field', function () {
365
+ expect(function () {
366
+ return make().focusPrompt('r1');
367
+ }).not.toThrow();
368
+ });
369
+ describe('promptContaining', function () {
370
+ it('finds the prompt whose range holds the offset, inclusive', function () {
371
+ var s = make();
372
+ s.mathField = stubField({
373
+ r1: '',
374
+ r2: ''
375
+ });
376
+ expect(s.promptContaining(0)).toEqual('r1');
377
+ expect(s.promptContaining(5)).toEqual('r1');
378
+ expect(s.promptContaining(10)).toEqual('r2');
379
+ expect(s.promptContaining(7)).toBeUndefined();
380
+ });
381
+ it('treats a missing position as outside', function () {
382
+ var s = make();
383
+ s.mathField = stubField({
384
+ r1: ''
385
+ });
386
+ expect(s.promptContaining(undefined)).toBeUndefined();
387
+ });
388
+ });
389
+
390
+ // MathQuill's inner fields could be focused directly.
391
+ it('promptHandle exposes focus() for its own prompt', function () {
392
+ var s = make();
393
+ s.mathField = stubField({
394
+ r1: '',
395
+ r2: ''
396
+ });
397
+ s.promptHandle('r2').focus();
398
+ expect(s.mathField.focused).toBe(true);
399
+ expect(s.mathField.selection).toEqual({
400
+ ranges: [[10, 10]]
401
+ });
402
+ });
403
+ });
404
+ });
405
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3RhdGljIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsInN0dWJGaWVsZCIsInZhbHVlcyIsInVuZGVmaW5lZCIsInNlbGVjdGlvbiIsImdldFByb21wdHMiLCJnZXRQcm9tcHRWYWx1ZSIsImlkIiwic2V0UHJvbXB0VmFsdWUiLCJ2IiwiZ2V0UHJvbXB0UmFuZ2UiLCJpIiwiaW5kZXhPZiIsInBvc2l0aW9uIiwiY29tbWFuZHMiLCJleGVjdXRlQ29tbWFuZCIsIm5hbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZvY3VzIiwiZm9jdXNlZCIsImJsdXIiLCJibHVycmVkIiwicmVtb3ZlIiwibWFrZSIsInByb3BzIiwiU3RhdGljIiwibGF0ZXgiLCJnZXRGaWVsZE5hbWUiLCJkZXNjcmliZSIsIml0IiwiZXhwZWN0IiwiaXNJbnRlcmFjdGl2ZSIsInRvQmUiLCJ0b0VxdWFsIiwicyIsIm1hdGhGaWVsZCIsInIxIiwicjIiLCJoIiwicHJvbXB0SGFuZGxlIiwiaW5uZXJGaWVsZHMiLCJtYXAiLCJmIiwib25TdWJGaWVsZENoYW5nZSIsImplc3QiLCJmbiIsInByb21wdFZhbHVlcyIsIm9uUHJvbXB0SW5wdXQiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsImhhbmRsZSIsIm9uU3ViRmllbGRGb2N1cyIsInNldElucHV0IiwicmFuZ2VzIiwib25Qcm9tcHRGb2N1cyIsIm1vY2siLCJjYWxscyIsInRvSGF2ZUJlZW5DYWxsZWQiLCJub3QiLCJ0b1Rocm93IiwiYWZ0ZXJFYWNoIiwiZG9jdW1lbnQiLCJib2R5IiwiaW5uZXJIVE1MIiwiY3JlYXRlTGl2ZVJlZ2lvbiIsImxpdmVSZWdpb24iLCJnZXRBdHRyaWJ1dGUiLCJjb250YWlucyIsInJlbW92ZUxpdmVSZWdpb24iLCJ0b0JlVW5kZWZpbmVkIiwiZmlyc3QiLCJhbm5vdW5jZUNvbnZlcnNpb24iLCJ0ZXh0Q29udGVudCIsIm9uS2V5RG93biIsImtleSIsImZvY3VzUHJvbXB0IiwicHJvbXB0Q29udGFpbmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vc3RhdGljLXByb21wdHMudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFN0YXRpYyBmcm9tICcuLi9tZi9zdGF0aWMnO1xuXG4vKipcbiAqIFRoZSBhbnN3ZXItYmxvY2sgY29udHJhY3Q6IGBcXE1hdGhRdWlsbE1hdGhGaWVsZFtpZF17fWAgaW4gc3RvcmVkIGxhdGV4IGJlY29tZXNcbiAqIGEgTWF0aExpdmUgcHJvbXB0LCBhbmQgc3ViLWZpZWxkIHZhbHVlcy9mb2N1cyBhcmUgc3VyZmFjZWQgdGhyb3VnaCB0aGUgc2FtZVxuICogY2FsbGJhY2tzIEBwaWUtbGliL21hdGgtaW5wdXQgZXhwb3NlZCAoYG9uU3ViRmllbGRDaGFuZ2VgLCBgb25TdWJGaWVsZEZvY3VzYCxcbiAqIGBnZXRGaWVsZE5hbWVgLCBgc2V0SW5wdXRgKS5cbiAqXG4gKiBEcml2ZW4gYWdhaW5zdCBhIHN0dWIgbWF0aGZpZWxkOiBhIHJlYWwgPG1hdGgtZmllbGQ+IG5lZWRzIGEgYnJvd3NlciwgYW5kIHdoYXRcbiAqIG1hdHRlcnMgaGVyZSBpcyB0aGUgbWFwcGluZywgbm90IE1hdGhMaXZlJ3MgcmVuZGVyaW5nLlxuICovXG5jb25zdCBzdHViRmllbGQgPSAodmFsdWVzID0ge30sIHNlbGVjdGlvbiA9IG51bGwpID0+ICh7XG4gIHZhbHVlczogeyAuLi52YWx1ZXMgfSxcbiAgZ2V0UHJvbXB0cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuICB9LFxuICBnZXRQcm9tcHRWYWx1ZShpZCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc1tpZF07XG4gIH0sXG4gIHNldFByb21wdFZhbHVlKGlkLCB2KSB7XG4gICAgdGhpcy52YWx1ZXNbaWRdID0gdjtcbiAgfSxcbiAgZ2V0UHJvbXB0UmFuZ2UoaWQpIHtcbiAgICBjb25zdCBpID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpLmluZGV4T2YoaWQpO1xuXG4gICAgcmV0dXJuIFtpICogMTAsIGkgKiAxMCArIDVdO1xuICB9LFxuICBzZWxlY3Rpb24sXG4gIC8vIENhcmV0IGJvb2trZWVwaW5nOiBNYXRoTGl2ZSBleHBvc2VzIHRoZSBjYXJldCBvZmZzZXQgYXMgYHBvc2l0aW9uYCwgYW5kIGFueVxuICAvLyBleGVjdXRlQ29tbWFuZCB0cmlnZ2VycyB0aGUgcmVuZGVyIHRoYXQgcmV2ZWFscyB0aGUgY2FyZXQuXG4gIHBvc2l0aW9uOiB1bmRlZmluZWQsXG4gIGNvbW1hbmRzOiBbXSxcbiAgZXhlY3V0ZUNvbW1hbmQobmFtZSkge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaChuYW1lKTtcbiAgfSxcbiAgYWRkRXZlbnRMaXN0ZW5lcigpIHt9LFxuICByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gIH0sXG4gIGJsdXIoKSB7XG4gICAgdGhpcy5ibHVycmVkID0gdHJ1ZTtcbiAgfSxcbiAgcmVtb3ZlKCkge30sXG59KTtcblxuY29uc3QgbWFrZSA9IChwcm9wcyA9IHt9KSA9PiBuZXcgU3RhdGljKHsgbGF0ZXg6ICd4PVxcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjFde30nLCBnZXRGaWVsZE5hbWU6ICgpID0+IHt9LCAuLi5wcm9wcyB9KTtcblxuZGVzY3JpYmUoJ1N0YXRpYzogYW5zd2VyIGJsb2NrcyAvIHByb21wdHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdpc0ludGVyYWN0aXZlJywgKCkgPT4ge1xuICAgIGl0KCdpcyBpbnRlcmFjdGl2ZSB3aGVuIHRoZSBsYXRleCBoYXMgYW5zd2VyIGJsb2NrcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChtYWtlKHsgbGF0ZXg6ICd4PVxcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjFde30nIH0pLmlzSW50ZXJhY3RpdmUoKSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChtYWtlKHsgbGF0ZXg6ICd4PVxcXFxwbGFjZWhvbGRlcltyMV17fScgfSkuaXNJbnRlcmFjdGl2ZSgpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGRpc3BsYXktb25seSBmb3IgcGxhaW4gbGF0ZXgnLCAoKSA9PiB7XG4gICAgICBleHBlY3QobWFrZSh7IGxhdGV4OiAnXFxcXGZyYWN7MX17Mn0nIH0pLmlzSW50ZXJhY3RpdmUoKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QobWFrZSh7IGxhdGV4OiAnJyB9KS5pc0ludGVyYWN0aXZlKCkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsdWVzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHt9IGJlZm9yZSB0aGUgZmllbGQgZXhpc3RzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1ha2UoKS52YWx1ZXMoKSkudG9FcXVhbCh7fSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWFwcyBlYWNoIHByb21wdCBpZCB0byBpdHMgc3RvcmVkLWZvcm0gbGF0ZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzID0gbWFrZSgpO1xuXG4gICAgICBzLm1hdGhGaWVsZCA9IHN0dWJGaWVsZCh7IHIxOiAnNycsIHIyOiAnXFxcXHBsYWNlaG9sZGVye30nIH0pO1xuXG4gICAgICAvLyBcXHBsYWNlaG9sZGVyIG11c3Qgbm90IGxlYWsgaW50byBzdG9yZWQgdmFsdWVzXG4gICAgICBleHBlY3Qocy52YWx1ZXMoKSkudG9FcXVhbCh7IHIxOiAnNycsIHIyOiAnJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Byb21wdEhhbmRsZSAvIGlubmVyRmllbGRzJywgKCkgPT4ge1xuICAgIGl0KCdleHBvc2VzIGEgTWF0aFF1aWxsLWZpZWxkLWxpa2UgaGFuZGxlIHdpdGggZ2V0L3NldCBsYXRleCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHMgPSBtYWtlKCk7XG5cbiAgICAgIHMubWF0aEZpZWxkID0gc3R1YkZpZWxkKHsgcjE6ICc3JyB9KTtcblxuICAgICAgY29uc3QgaCA9IHMucHJvbXB0SGFuZGxlKCdyMScpO1xuXG4gICAgICBleHBlY3QoaC5pZCkudG9FcXVhbCgncjEnKTtcbiAgICAgIGV4cGVjdChoLmxhdGV4KCkpLnRvRXF1YWwoJzcnKTtcblxuICAgICAgaC5sYXRleCgnOScpO1xuICAgICAgZXhwZWN0KHMubWF0aEZpZWxkLnZhbHVlcy5yMSkudG9FcXVhbCgnOScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZSBsYXRleCgpIGlzIHNhZmUgd2l0aCBubyBmaWVsZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChtYWtlKCkucHJvbXB0SGFuZGxlKCdyMScpLmxhdGV4KCkpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lubmVyRmllbGRzIHJldHVybnMgb25lIGhhbmRsZSBwZXIgcHJvbXB0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoeyByMTogJzEnLCByMjogJzInIH0pO1xuXG4gICAgICBleHBlY3Qocy5pbm5lckZpZWxkcy5tYXAoKGYpID0+IGYuaWQpKS50b0VxdWFsKFsncjEnLCAncjInXSk7XG4gICAgICBleHBlY3QobWFrZSgpLmlubmVyRmllbGRzKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ29uU3ViRmllbGRDaGFuZ2UnLCAoKSA9PiB7XG4gICAgaXQoJ2ZpcmVzIG9ubHkgZm9yIHByb21wdHMgd2hvc2UgdmFsdWUgY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uU3ViRmllbGRDaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBzID0gbWFrZSh7IG9uU3ViRmllbGRDaGFuZ2UgfSk7XG5cbiAgICAgIHMubWF0aEZpZWxkID0gc3R1YkZpZWxkKHsgcjE6ICcxJywgcjI6ICcyJyB9KTtcbiAgICAgIHMucHJvbXB0VmFsdWVzID0geyByMTogJzEnLCByMjogJzInIH07XG5cbiAgICAgIHMubWF0aEZpZWxkLnZhbHVlcy5yMiA9ICc1JztcbiAgICAgIHMub25Qcm9tcHRJbnB1dCgpO1xuXG4gICAgICBleHBlY3Qob25TdWJGaWVsZENoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KG9uU3ViRmllbGRDaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdyMicsICc1Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBnZXRGaWVsZE5hbWUgd2hlbiBpdCByZXR1cm5zIGEgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uU3ViRmllbGRDaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBzID0gbWFrZSh7IG9uU3ViRmllbGRDaGFuZ2UsIGdldEZpZWxkTmFtZTogKGhhbmRsZSkgPT4gJ25hbWVkLScgKyBoYW5kbGUuaWQgfSk7XG5cbiAgICAgIHMubWF0aEZpZWxkID0gc3R1YkZpZWxkKHsgcjE6ICcxJyB9KTtcbiAgICAgIHMucHJvbXB0VmFsdWVzID0ge307XG5cbiAgICAgIHMub25Qcm9tcHRJbnB1dCgpO1xuXG4gICAgICBleHBlY3Qob25TdWJGaWVsZENoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ25hbWVkLXIxJywgJzEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdGlsbCB0cmFja3MgdmFsdWVzIHdoZW4gbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzID0gbWFrZSgpO1xuXG4gICAgICBzLm1hdGhGaWVsZCA9IHN0dWJGaWVsZCh7IHIxOiAnMycgfSk7XG4gICAgICBzLm9uUHJvbXB0SW5wdXQoKTtcblxuICAgICAgZXhwZWN0KHMucHJvbXB0VmFsdWVzKS50b0VxdWFsKHsgcjE6ICczJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ29uU3ViRmllbGRGb2N1cycsICgpID0+IHtcbiAgICBpdCgncmVwb3J0cyB0aGUgcHJvbXB0IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGlvbiwgcGx1cyBzZXRJbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uU3ViRmllbGRGb2N1cyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHNldElucHV0ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgcyA9IG1ha2UoeyBvblN1YkZpZWxkRm9jdXMsIHNldElucHV0IH0pO1xuXG4gICAgICAvLyByMiBvY2N1cGllcyBvZmZzZXRzIDEwLi4xNVxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoeyByMTogJycsIHIyOiAnJyB9LCB7IHJhbmdlczogW1sxMSwgMTFdXSB9KTtcbiAgICAgIHMub25Qcm9tcHRGb2N1cygpO1xuXG4gICAgICBleHBlY3Qob25TdWJGaWVsZEZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBleHBlY3Qob25TdWJGaWVsZEZvY3VzLm1vY2suY2FsbHNbMF1bMF0pLnRvRXF1YWwoJ3IyJyk7XG4gICAgICBleHBlY3Qob25TdWJGaWVsZEZvY3VzLm1vY2suY2FsbHNbMF1bMV0uaWQpLnRvRXF1YWwoJ3IyJyk7XG4gICAgICBleHBlY3Qoc2V0SW5wdXQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdGhpbmcgd2l0aG91dCBhIHNlbGVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uU3ViRmllbGRGb2N1cyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHMgPSBtYWtlKHsgb25TdWJGaWVsZEZvY3VzIH0pO1xuXG4gICAgICBzLm1hdGhGaWVsZCA9IHN0dWJGaWVsZCh7IHIxOiAnJyB9LCBudWxsKTtcbiAgICAgIHMub25Qcm9tcHRGb2N1cygpO1xuXG4gICAgICBleHBlY3Qob25TdWJGaWVsZEZvY3VzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHRocm93IHdoZW4gdGhlIGZpZWxkIGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzID0gbWFrZSh7IG9uU3ViRmllbGRGb2N1czogamVzdC5mbigpIH0pO1xuXG4gICAgICBleHBlY3QoKCkgPT4gcy5vblByb21wdEZvY3VzKCkpLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY2Nlc3NpYmlsaXR5IGFubm91bmNlbWVudHMnLCAoKSA9PiB7XG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gJyc7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBhIHBvbGl0ZSBvZmYtc2NyZWVuIGxpdmUgcmVnaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5jcmVhdGVMaXZlUmVnaW9uKCk7XG5cbiAgICAgIGV4cGVjdChzLmxpdmVSZWdpb24uZ2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnKSkudG9FcXVhbCgncG9saXRlJyk7XG4gICAgICBleHBlY3Qocy5saXZlUmVnaW9uLmdldEF0dHJpYnV0ZSgnYXJpYS1hdG9taWMnKSkudG9FcXVhbCgndHJ1ZScpO1xuICAgICAgZXhwZWN0KGRvY3VtZW50LmJvZHkuY29udGFpbnMocy5saXZlUmVnaW9uKSkudG9CZSh0cnVlKTtcblxuICAgICAgcy5yZW1vdmVMaXZlUmVnaW9uKCk7XG4gICAgICBleHBlY3Qocy5saXZlUmVnaW9uKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgY3JlYXRlIGEgc2Vjb25kIHJlZ2lvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHMgPSBtYWtlKCk7XG5cbiAgICAgIHMuY3JlYXRlTGl2ZVJlZ2lvbigpO1xuICAgICAgY29uc3QgZmlyc3QgPSBzLmxpdmVSZWdpb247XG5cbiAgICAgIHMuY3JlYXRlTGl2ZVJlZ2lvbigpO1xuICAgICAgZXhwZWN0KHMubGl2ZVJlZ2lvbikudG9CZShmaXJzdCk7XG4gICAgICBzLnJlbW92ZUxpdmVSZWdpb24oKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbm5vdW5jZXMgd2hlbiB0eXBlZCBpbnB1dCBleHBhbmRzIGludG8gYSBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5jcmVhdGVMaXZlUmVnaW9uKCk7XG4gICAgICBzLnByb21wdFZhbHVlcyA9IHsgcjE6ICd4JyB9O1xuICAgICAgLy8gZ3JldyBieSBtb3JlIHRoYW4gb25lIGNoYXIgQU5EIGdhaW5lZCBhIGJhY2tzbGFzaCA9PiBhIGNvbnZlcnNpb25cbiAgICAgIHMuYW5ub3VuY2VDb252ZXJzaW9uKHsgcjE6ICd4XFxcXGZyYWN7fXt9JyB9KTtcblxuICAgICAgZXhwZWN0KHMubGl2ZVJlZ2lvbi50ZXh0Q29udGVudCkudG9FcXVhbCgnQ29udmVydGVkIHRvIG1hdGggc3ltYm9sJyk7XG4gICAgICBzLnJlbW92ZUxpdmVSZWdpb24oKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBhbm5vdW5jZSBvcmRpbmFyeSB0eXBpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzID0gbWFrZSgpO1xuXG4gICAgICBzLmNyZWF0ZUxpdmVSZWdpb24oKTtcbiAgICAgIHMucHJvbXB0VmFsdWVzID0geyByMTogJ3gnIH07XG4gICAgICBzLmFubm91bmNlQ29udmVyc2lvbih7IHIxOiAneHknIH0pO1xuXG4gICAgICBleHBlY3Qocy5saXZlUmVnaW9uLnRleHRDb250ZW50KS50b0VxdWFsKCcnKTtcbiAgICAgIHMucmVtb3ZlTGl2ZVJlZ2lvbigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGFubm91bmNlIGEgZGVsZXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBzID0gbWFrZSgpO1xuXG4gICAgICBzLmNyZWF0ZUxpdmVSZWdpb24oKTtcbiAgICAgIHMucHJvbXB0VmFsdWVzID0geyByMTogJ3hcXFxcZnJhY3t9e30nIH07XG4gICAgICBzLm9uS2V5RG93bih7IGtleTogJ0JhY2tzcGFjZScgfSk7XG4gICAgICBzLmFubm91bmNlQ29udmVyc2lvbih7IHIxOiAneCcgfSk7XG5cbiAgICAgIGV4cGVjdChzLmxpdmVSZWdpb24udGV4dENvbnRlbnQpLnRvRXF1YWwoJycpO1xuICAgICAgcy5yZW1vdmVMaXZlUmVnaW9uKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmb2N1cyAvIGJsdXInLCAoKSA9PiB7XG4gICAgaXQoJ2RlbGVnYXRlcyB0byB0aGUgZmllbGQgYW5kIGlzIHNhZmUgd2l0aG91dCBvbmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzID0gbWFrZSgpO1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBzLmZvY3VzKCk7XG4gICAgICAgIHMuYmx1cigpO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoKTtcbiAgICAgIHMuZm9jdXMoKTtcbiAgICAgIHMuYmx1cigpO1xuXG4gICAgICBleHBlY3Qocy5tYXRoRmllbGQuZm9jdXNlZCkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChzLm1hdGhGaWVsZC5ibHVycmVkKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogTWF0aExpdmUgc2hvd3MgdGhlIGNhcmV0IG9ubHkgd2hpbGUgdGhlIGZpZWxkIGNhcnJpZXMgYE1MX19mb2N1c2VkYCwgd2hpY2hcbiAgICogaXQgYWRkcyBkdXJpbmcgYSByZW5kZXIgZ2F0ZWQgb24gYGlzU2VsZWN0aW9uRWRpdGFibGUgJiYgaGFzRm9jdXMoKWAuIEluIGFcbiAgICogcmVhZC1vbmx5IGZpZWxkIG9ubHkgcHJvbXB0IGludGVyaW9ycyBhcmUgZWRpdGFibGUsIHNvIGFmdGVyIGEgYmFyZVxuICAgKiBgZm9jdXMoKWAgLSB3aG9zZSBzZWxlY3Rpb24gc2l0cyBvdXRzaWRlIGV2ZXJ5IHByb21wdCAtIHRoZSBhbnN3ZXIgYmxvY2tcbiAgICogbG9va2VkIGZvY3VzZWQgYnV0IGhhZCBubyBibGlua2luZyBjdXJzb3IuIFZlcmlmaWVkIGluIENocm9taXVtOiB0aGUgY2FyZXRcbiAgICogc3BhbiBnb2VzIGZyb20gdmlzaWJpbGl0eTpoaWRkZW4gdG8gdmlzaWJsZSBvbmNlIHRoZSBzZWxlY3Rpb24gaXMgaW5zaWRlIGFcbiAgICogcHJvbXB0IEFORCBhIHJlbmRlciBoYXMgcnVuLlxuICAgKi9cbiAgZGVzY3JpYmUoJ2NhcmV0IHBsYWNlbWVudCcsICgpID0+IHtcbiAgICBpdCgncHV0cyBhIGNvbGxhcHNlZCBjYXJldCBpbiB0aGUgZmlyc3QgcHJvbXB0IG9uIGZvY3VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoeyByMTogJycsIHIyOiAnJyB9KTtcbiAgICAgIHMuZm9jdXMoKTtcblxuICAgICAgLy8gc3R1YiByYW5nZXMgYXJlIFswLDVdIGZvciByMSwgWzEwLDE1XSBmb3IgcjJcbiAgICAgIGV4cGVjdChzLm1hdGhGaWVsZC5zZWxlY3Rpb24pLnRvRXF1YWwoeyByYW5nZXM6IFtbMCwgMF1dIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvcmNlcyB0aGUgcmVuZGVyIHRoYXQgbWFrZXMgdGhlIGNhcmV0IHZpc2libGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzID0gbWFrZSgpO1xuXG4gICAgICBzLm1hdGhGaWVsZCA9IHN0dWJGaWVsZCh7IHIxOiAnJyB9KTtcbiAgICAgIHMuZm9jdXMoKTtcblxuICAgICAgLy8gYXNzaWduaW5nIGBzZWxlY3Rpb25gIGFsb25lIHVwZGF0ZXMgdGhlIG1vZGVsIHdpdGhvdXQgcmUtcmVuZGVyaW5nLCBzb1xuICAgICAgLy8gTUxfX2ZvY3VzZWQgd291bGQgbmV2ZXIgYmUgYWRkZWRcbiAgICAgIGV4cGVjdChzLm1hdGhGaWVsZC5jb21tYW5kcykudG9FcXVhbChbJ3Njcm9sbEludG9WaWV3J10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IG1vdmUgYSBjYXJldCB0aGF0IGlzIGFscmVhZHkgaW5zaWRlIGEgcHJvbXB0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoeyByMTogJycsIHIyOiAnJyB9KTtcbiAgICAgIHMubWF0aEZpZWxkLnBvc2l0aW9uID0gMTI7IC8vIGluc2lkZSByMlxuICAgICAgcy5mb2N1cygpO1xuXG4gICAgICBleHBlY3Qocy5tYXRoRmllbGQuc2VsZWN0aW9uKS50b0JlKG51bGwpO1xuICAgICAgZXhwZWN0KHMubWF0aEZpZWxkLmNvbW1hbmRzKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd0YXJnZXRzIGEgc3BlY2lmaWMgcHJvbXB0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoeyByMTogJycsIHIyOiAnJyB9KTtcbiAgICAgIHMuZm9jdXNQcm9tcHQoJ3IyJyk7XG5cbiAgICAgIGV4cGVjdChzLm1hdGhGaWVsZC5zZWxlY3Rpb24pLnRvRXF1YWwoeyByYW5nZXM6IFtbMTAsIDEwXV0gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmFsbHMgYmFjayB0byB0aGUgZmlyc3QgcHJvbXB0IGZvciBhbiB1bmtub3duIGlkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoeyByMTogJycsIHIyOiAnJyB9KTtcbiAgICAgIHMuZm9jdXNQcm9tcHQoJ25vcGUnKTtcblxuICAgICAgZXhwZWN0KHMubWF0aEZpZWxkLnNlbGVjdGlvbikudG9FcXVhbCh7IHJhbmdlczogW1swLCAwXV0gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgYSBuby1vcCB3aGVuIHRoZXJlIGFyZSBubyBwcm9tcHRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoe30pO1xuXG4gICAgICBleHBlY3QoKCkgPT4gcy5mb2N1c1Byb21wdCgpKS5ub3QudG9UaHJvdygpO1xuICAgICAgZXhwZWN0KHMubWF0aEZpZWxkLnNlbGVjdGlvbikudG9CZShudWxsKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBzYWZlIHdpdGhvdXQgYSBmaWVsZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiBtYWtlKCkuZm9jdXNQcm9tcHQoJ3IxJykpLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncHJvbXB0Q29udGFpbmluZycsICgpID0+IHtcbiAgICAgIGl0KCdmaW5kcyB0aGUgcHJvbXB0IHdob3NlIHJhbmdlIGhvbGRzIHRoZSBvZmZzZXQsIGluY2x1c2l2ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgICBzLm1hdGhGaWVsZCA9IHN0dWJGaWVsZCh7IHIxOiAnJywgcjI6ICcnIH0pO1xuXG4gICAgICAgIGV4cGVjdChzLnByb21wdENvbnRhaW5pbmcoMCkpLnRvRXF1YWwoJ3IxJyk7XG4gICAgICAgIGV4cGVjdChzLnByb21wdENvbnRhaW5pbmcoNSkpLnRvRXF1YWwoJ3IxJyk7XG4gICAgICAgIGV4cGVjdChzLnByb21wdENvbnRhaW5pbmcoMTApKS50b0VxdWFsKCdyMicpO1xuICAgICAgICBleHBlY3Qocy5wcm9tcHRDb250YWluaW5nKDcpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3RyZWF0cyBhIG1pc3NpbmcgcG9zaXRpb24gYXMgb3V0c2lkZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgICBzLm1hdGhGaWVsZCA9IHN0dWJGaWVsZCh7IHIxOiAnJyB9KTtcblxuICAgICAgICBleHBlY3Qocy5wcm9tcHRDb250YWluaW5nKHVuZGVmaW5lZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gTWF0aFF1aWxsJ3MgaW5uZXIgZmllbGRzIGNvdWxkIGJlIGZvY3VzZWQgZGlyZWN0bHkuXG4gICAgaXQoJ3Byb21wdEhhbmRsZSBleHBvc2VzIGZvY3VzKCkgZm9yIGl0cyBvd24gcHJvbXB0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcyA9IG1ha2UoKTtcblxuICAgICAgcy5tYXRoRmllbGQgPSBzdHViRmllbGQoeyByMTogJycsIHIyOiAnJyB9KTtcbiAgICAgIHMucHJvbXB0SGFuZGxlKCdyMicpLmZvY3VzKCk7XG5cbiAgICAgIGV4cGVjdChzLm1hdGhGaWVsZC5mb2N1c2VkKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHMubWF0aEZpZWxkLnNlbGVjdGlvbikudG9FcXVhbCh7IHJhbmdlczogW1sxMCwgMTBdXSB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUFrQyxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUss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
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _mathliveInstance = require("../mathlive-instance");
7
+ describe('tmp', function () {
8
+ it('prints markup', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
9
+ return _regenerator["default"].wrap(function (_context) {
10
+ while (1) switch (_context.prev = _context.next) {
11
+ case 0:
12
+ _context.next = 1;
13
+ return (0, _mathliveInstance.loadMathLive)();
14
+ case 1:
15
+ // eslint-disable-next-line no-console
16
+ console.log('SQRT1:', (0, _mathliveInstance.latexToMarkup)('\\sqrt[1]{2}'));
17
+ // eslint-disable-next-line no-console
18
+ console.log('NTHROOT:', (0, _mathliveInstance.latexToMarkup)('\\sqrt[{}]{}'));
19
+ case 2:
20
+ case "end":
21
+ return _context.stop();
22
+ }
23
+ }, _callee);
24
+ })));
25
+ });
26
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0aGxpdmVJbnN0YW5jZSIsInJlcXVpcmUiLCJkZXNjcmliZSIsIml0IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImxvYWRNYXRoTGl2ZSIsImNvbnNvbGUiLCJsb2ciLCJsYXRleFRvTWFya3VwIiwic3RvcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vdG1wLW1hcmt1cC50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvYWRNYXRoTGl2ZSwgbGF0ZXhUb01hcmt1cCB9IGZyb20gJy4uL21hdGhsaXZlLWluc3RhbmNlJztcblxuZGVzY3JpYmUoJ3RtcCcsICgpID0+IHtcbiAgaXQoJ3ByaW50cyBtYXJrdXAnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgbG9hZE1hdGhMaXZlKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnU1FSVDE6JywgbGF0ZXhUb01hcmt1cCgnXFxcXHNxcnRbMV17Mn0nKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnTlRIUk9PVDonLCBsYXRleFRvTWFya3VwKCdcXFxcc3FydFt7fV17fScpKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxJQUFBQSxpQkFBQSxHQUFBQyxPQUFBO0FBRUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBTTtFQUNwQkMsRUFBRSxDQUFDLGVBQWUsbUJBQUFDLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBQyxRQUFBO0lBQUEsT0FBQUYsWUFBQSxZQUFBRyxJQUFBLFdBQUFDLFFBQUE7TUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BQ1osSUFBQUMsOEJBQVksRUFBQyxDQUFDO1FBQUE7VUFDcEI7VUFDQUMsT0FBTyxDQUFDQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUFDLCtCQUFhLEVBQUMsY0FBYyxDQUFDLENBQUM7VUFDcEQ7VUFDQUYsT0FBTyxDQUFDQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUFDLCtCQUFhLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQU4sUUFBQSxDQUFBTyxJQUFBO01BQUE7SUFBQSxHQUFBVCxPQUFBO0VBQUEsQ0FDeEQsR0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -41,11 +41,32 @@ var log = (0, _debug["default"])('pie-lib:math-input-mathlive:keypad');
41
41
  * `convertLatexToMarkup`, so a 40-key keypad no longer creates 40 live math
42
42
  * instances.
43
43
  */
44
+ // Labels that the legacy keypad drew slanted. MathQuill styled `\parallel` as
45
+ // italic, which slants the two bars; MathLive draws it upright. A skew is used
46
+ // rather than `font-style: italic` so the slant does not depend on the font
47
+ // having an italic face for this glyph.
48
+ var SLANTED_LABELS = ['\\parallel'];
49
+ var SLANT = 'skewX(-15deg)';
50
+ // MathLive's `∥` has hairline bars next to the radical sign and the other keys, so
51
+ // they are thickened with a text stroke and stretched a little taller.
52
+ var SLANTED_STROKE = '0.03em currentColor';
53
+ var SLANTED_SCALE_Y = 1.25;
54
+
44
55
  // The `color.*()` helpers must be called lazily, inside the styled callback.
45
56
  // Evaluating them in a plain object literal runs them at module load, which
46
57
  // breaks any consumer that mocks a subset of @pie-lib/render-ui.
47
- var LabelHolder = (0, _styles.styled)('span')(function () {
48
- return _objectSpread({
58
+ var LabelHolder = (0, _styles.styled)('span', {
59
+ shouldForwardProp: function shouldForwardProp(prop) {
60
+ return prop !== 'slanted';
61
+ }
62
+ })(function (_ref) {
63
+ var slanted = _ref.slanted;
64
+ return _objectSpread(_objectSpread({}, slanted && {
65
+ transform: "".concat(SLANT, " scaleY(").concat(SLANTED_SCALE_Y, ")"),
66
+ '& *': {
67
+ WebkitTextStroke: SLANTED_STROKE
68
+ }
69
+ }), {}, {
49
70
  pointerEvents: 'none',
50
71
  textTransform: 'none',
51
72
  color: _renderUi.color.text(),
@@ -161,10 +182,13 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
161
182
  /*#__PURE__*/
162
183
  // eslint-disable-next-line react/no-danger
163
184
  _react["default"].createElement(LabelHolder, {
185
+ slanted: SLANTED_LABELS.includes(this.props.latex),
164
186
  dangerouslySetInnerHTML: {
165
187
  __html: markup
166
188
  }
167
- }) : /*#__PURE__*/_react["default"].createElement(LabelHolder, null, this.props.latex);
189
+ }) : /*#__PURE__*/_react["default"].createElement(LabelHolder, {
190
+ slanted: SLANTED_LABELS.includes(this.props.latex)
191
+ }, this.props.latex);
168
192
  }
169
193
  }]);
170
194
  }(_react["default"].Component);
@@ -209,11 +233,11 @@ var buttonBackground = function buttonBackground(category) {
209
233
  }
210
234
  };
211
235
  };
212
- var StyledButton = (0, _styles.styled)(_Button["default"])(function (_ref) {
213
- var category = _ref.category,
214
- isDelete = _ref.isDelete,
215
- isComma = _ref.isComma,
216
- isDot = _ref.isDot;
236
+ var StyledButton = (0, _styles.styled)(_Button["default"])(function (_ref2) {
237
+ var category = _ref2.category,
238
+ isDelete = _ref2.isDelete,
239
+ isComma = _ref2.isComma,
240
+ isDot = _ref2.isDot;
217
241
  return _objectSpread(_objectSpread({
218
242
  minWidth: 'auto',
219
243
  textTransform: 'none',
@@ -226,8 +250,8 @@ var StyledButton = (0, _styles.styled)(_Button["default"])(function (_ref) {
226
250
  fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important'
227
251
  });
228
252
  });
229
- var StyledLatexButtonWrapper = (0, _styles.styled)(_Button["default"])(function (_ref2) {
230
- var category = _ref2.category;
253
+ var StyledLatexButtonWrapper = (0, _styles.styled)(_Button["default"])(function (_ref3) {
254
+ var category = _ref3.category;
231
255
  return _objectSpread({
232
256
  textTransform: 'none',
233
257
  padding: 0,
@@ -237,8 +261,8 @@ var StyledLatexButtonWrapper = (0, _styles.styled)(_Button["default"])(function
237
261
  borderRadius: 0
238
262
  }, buttonBackground(category));
239
263
  });
240
- var StyledIconButton = (0, _styles.styled)(_IconButton["default"])(function (_ref3) {
241
- var category = _ref3.category;
264
+ var StyledIconButton = (0, _styles.styled)(_IconButton["default"])(function (_ref4) {
265
+ var category = _ref4.category;
242
266
  return _objectSpread(_objectSpread({
243
267
  minWidth: 'auto'
244
268
  }, buttonBackground(category)), {}, {