@pie-lib/math-input-mathlive 1.1.4 → 1.1.5-beta.10
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.
- package/README.md +14 -5
- package/lib/__tests__/composites.test.js +255 -0
- package/lib/__tests__/drop-in-compat.test.js +133 -0
- package/lib/__tests__/embedded-fonts.test.js +121 -0
- package/lib/__tests__/index.test.js +118 -0
- package/lib/__tests__/input-imperative.test.js +155 -0
- package/lib/__tests__/keypad-label.test.js +231 -0
- package/lib/__tests__/keypad-render.test.js +206 -0
- package/lib/__tests__/latex-bridge.test.js +386 -0
- package/lib/__tests__/mathlive-instance.test.js +419 -0
- package/lib/__tests__/mount-race.test.js +218 -0
- package/lib/__tests__/static-prompts.test.js +405 -0
- package/lib/__tests__/tmp-markup.test.js +26 -0
- package/lib/keypad/index.js +50 -28
- package/lib/keypad/index.js.map +1 -1
- package/lib/keys/geometry.js +7 -4
- package/lib/keys/geometry.js.map +1 -1
- package/lib/keys/misc.js +9 -2
- package/lib/keys/misc.js.map +1 -1
- package/lib/latex-bridge.js +207 -7
- package/lib/latex-bridge.js.map +1 -1
- package/lib/mathlive-instance.js +176 -12
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/common-styles.js +89 -10
- package/lib/mf/common-styles.js.map +1 -1
- package/lib/mf/index.js +12 -0
- package/lib/mf/index.js.map +1 -1
- package/lib/mf/input.js +34 -5
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +107 -7
- package/lib/mf/static.js.map +1 -1
- package/package.json +3 -4
- package/src/__tests__/composites.test.jsx +220 -0
- package/src/__tests__/keypad-label.test.jsx +229 -2
- package/src/__tests__/keypad-render.test.jsx +123 -0
- package/src/__tests__/latex-bridge.test.js +159 -0
- package/src/__tests__/mathlive-instance.test.js +237 -0
- package/src/__tests__/mount-race.test.jsx +142 -0
- package/src/__tests__/static-prompts.test.jsx +364 -0
- package/src/keypad/index.jsx +33 -17
- package/src/keys/geometry.js +7 -2
- package/src/keys/misc.js +8 -2
- package/src/latex-bridge.js +223 -7
- package/src/mathlive-instance.js +196 -11
- package/src/mf/common-styles.js +97 -8
- package/src/mf/index.js +4 -0
- package/src/mf/input.jsx +42 -5
- package/src/mf/static.jsx +124 -6
- package/CHANGELOG.md +0 -30
- package/LICENSE.md +0 -5
package/README.md
CHANGED
|
@@ -108,19 +108,28 @@ widget do not port and need a redesign (`mf.getElementInfo()` exposes per-elemen
|
|
|
108
108
|
corrupt these fonts (it emits a JS module under a `.woff2` name). Exclude
|
|
109
109
|
mathlive from such rules - see `packages/demo/next.config.js`.
|
|
110
110
|
|
|
111
|
+
**Fonts are required, not cosmetic.** Some symbols are composed from Private
|
|
112
|
+
Use Area glyphs that exist only in the KaTeX fonts: `\neq` is U+E020 (a
|
|
113
|
+
negation slash) overlapped on `=`, and `\nsim` / `\ncong` are the same. With
|
|
114
|
+
no fonts the browser substitutes an arbitrary glyph for U+E020, so those keys
|
|
115
|
+
render as garbage rather than in a plainer face.
|
|
116
|
+
|
|
111
117
|
**Alternative** - serve the fonts yourself (a static path, or a CDN):
|
|
112
118
|
|
|
113
119
|
```js
|
|
114
120
|
import { configureFonts } from '@pie-lib/math-input-mathlive';
|
|
115
121
|
|
|
116
122
|
configureFonts('/mathlive-fonts'); // before loadMathLive()
|
|
117
|
-
configureFonts('https://unpkg.com/mathlive@0.110.0/
|
|
118
|
-
configureFonts(null); //
|
|
123
|
+
configureFonts('https://unpkg.com/mathlive@0.110.0/fonts'); // note: /fonts, /dist/fonts 404s
|
|
124
|
+
configureFonts(null); // opt out; \neq and friends will render incorrectly
|
|
119
125
|
```
|
|
120
126
|
|
|
121
|
-
Paths are resolved to absolute URLs against `document.baseURI`.
|
|
122
|
-
|
|
123
|
-
|
|
127
|
+
Paths are resolved to absolute URLs against `document.baseURI`.
|
|
128
|
+
|
|
129
|
+
If you neither import the stylesheet nor call `configureFonts`, the package
|
|
130
|
+
falls back to a **version-pinned CDN** - `https://unpkg.com/mathlive@<engine
|
|
131
|
+
version>/fonts` - so those glyph-dependent symbols still render. Serve the
|
|
132
|
+
fonts yourself to avoid the third-party request.
|
|
124
133
|
|
|
125
134
|
- **Custom macros.** `PIE_MACROS` covers the pie-specific commands the MathQuill
|
|
126
135
|
fork understood (`\parallelogram`, `\longdiv`, `\napprox`, …) and is kept in
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _react = _interopRequireDefault(require("react"));
|
|
5
|
+
var _react2 = require("@testing-library/react");
|
|
6
|
+
var _mathInput = _interopRequireDefault(require("../math-input"));
|
|
7
|
+
var _horizontalKeypad = _interopRequireDefault(require("../horizontal-keypad"));
|
|
8
|
+
var _input = _interopRequireDefault(require("../mf/input"));
|
|
9
|
+
/**
|
|
10
|
+
* The pieces that sit between the keypad and the field: how a pressed key is
|
|
11
|
+
* routed into the field, and the legacy `{value,type}` shape math-toolbar
|
|
12
|
+
* consumes.
|
|
13
|
+
*/
|
|
14
|
+
describe('MathInput.keypadPress routing', function () {
|
|
15
|
+
var withInput = function withInput() {
|
|
16
|
+
var mi = new _mathInput["default"]({});
|
|
17
|
+
var calls = {
|
|
18
|
+
write: [],
|
|
19
|
+
keystroke: []
|
|
20
|
+
};
|
|
21
|
+
mi.input = {
|
|
22
|
+
write: function write(v) {
|
|
23
|
+
return calls.write.push(v);
|
|
24
|
+
},
|
|
25
|
+
keystroke: function keystroke(v) {
|
|
26
|
+
return calls.keystroke.push(v);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
mi: mi,
|
|
31
|
+
calls: calls
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
it('routes an insert action to write()', function () {
|
|
35
|
+
var _withInput = withInput(),
|
|
36
|
+
mi = _withInput.mi,
|
|
37
|
+
calls = _withInput.calls;
|
|
38
|
+
mi.keypadPress({
|
|
39
|
+
latex: '\\pi'
|
|
40
|
+
});
|
|
41
|
+
expect(calls.write).toEqual(['\\pi']);
|
|
42
|
+
expect(calls.keystroke).toEqual([]);
|
|
43
|
+
});
|
|
44
|
+
it('expands an argument-taking command before writing', function () {
|
|
45
|
+
var _withInput2 = withInput(),
|
|
46
|
+
mi = _withInput2.mi,
|
|
47
|
+
calls = _withInput2.calls;
|
|
48
|
+
mi.keypadPress({
|
|
49
|
+
command: '\\frac'
|
|
50
|
+
});
|
|
51
|
+
expect(calls.write).toEqual(['\\frac{#?}{#?}']);
|
|
52
|
+
});
|
|
53
|
+
it('routes a cursor keystroke to keystroke()', function () {
|
|
54
|
+
var _withInput3 = withInput(),
|
|
55
|
+
mi = _withInput3.mi,
|
|
56
|
+
calls = _withInput3.calls;
|
|
57
|
+
mi.keypadPress({
|
|
58
|
+
keystroke: 'Left'
|
|
59
|
+
});
|
|
60
|
+
expect(calls.keystroke).toEqual(['moveToPreviousChar']);
|
|
61
|
+
expect(calls.write).toEqual([]);
|
|
62
|
+
});
|
|
63
|
+
it('ignores keys with no action', function () {
|
|
64
|
+
var _withInput4 = withInput(),
|
|
65
|
+
mi = _withInput4.mi,
|
|
66
|
+
calls = _withInput4.calls;
|
|
67
|
+
mi.keypadPress({});
|
|
68
|
+
mi.keypadPress({
|
|
69
|
+
keystroke: 'Nonsense'
|
|
70
|
+
});
|
|
71
|
+
expect(calls.write).toEqual([]);
|
|
72
|
+
expect(calls.keystroke).toEqual([]);
|
|
73
|
+
});
|
|
74
|
+
it('is a no-op before the field ref exists', function () {
|
|
75
|
+
var mi = new _mathInput["default"]({});
|
|
76
|
+
expect(function () {
|
|
77
|
+
return mi.keypadPress({
|
|
78
|
+
latex: '\\pi'
|
|
79
|
+
});
|
|
80
|
+
}).not.toThrow();
|
|
81
|
+
});
|
|
82
|
+
it('changeLatex only fires onChange when the value differs', function () {
|
|
83
|
+
var onChange = jest.fn();
|
|
84
|
+
var mi = new _mathInput["default"]({
|
|
85
|
+
latex: 'x',
|
|
86
|
+
onChange: onChange
|
|
87
|
+
});
|
|
88
|
+
mi.changeLatex('x');
|
|
89
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
90
|
+
mi.changeLatex('y');
|
|
91
|
+
expect(onChange).toHaveBeenCalledWith('y');
|
|
92
|
+
});
|
|
93
|
+
it('tracks focus state', function () {
|
|
94
|
+
var mi = new _mathInput["default"]({});
|
|
95
|
+
mi.setState = function (s) {
|
|
96
|
+
return Object.assign(mi.state, s);
|
|
97
|
+
};
|
|
98
|
+
mi.inputFocus();
|
|
99
|
+
expect(mi.state.focused).toBe(true);
|
|
100
|
+
mi.inputBlur();
|
|
101
|
+
expect(mi.state.focused).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('HorizontalKeypad legacy {value,type} model', function () {
|
|
105
|
+
var pressed = function pressed(key) {
|
|
106
|
+
var onClick = jest.fn();
|
|
107
|
+
var hk = new _horizontalKeypad["default"]({
|
|
108
|
+
onClick: onClick
|
|
109
|
+
});
|
|
110
|
+
hk.keypadPress(key);
|
|
111
|
+
return onClick.mock.calls[0][0];
|
|
112
|
+
};
|
|
113
|
+
it('maps a command to {value, type: command}', function () {
|
|
114
|
+
expect(pressed({
|
|
115
|
+
command: '\\frac'
|
|
116
|
+
})).toEqual({
|
|
117
|
+
value: '\\frac',
|
|
118
|
+
type: 'command'
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
it('maps a write to {value}', function () {
|
|
122
|
+
expect(pressed({
|
|
123
|
+
write: 'x'
|
|
124
|
+
})).toEqual({
|
|
125
|
+
value: 'x'
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
it('maps a keystroke to {type: cursor}', function () {
|
|
129
|
+
expect(pressed({
|
|
130
|
+
keystroke: 'Left'
|
|
131
|
+
})).toEqual({
|
|
132
|
+
type: 'cursor',
|
|
133
|
+
value: 'Left'
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
it('renders without throwing', function () {
|
|
137
|
+
expect(function () {
|
|
138
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_horizontalKeypad["default"], {
|
|
139
|
+
onClick: function onClick() {}
|
|
140
|
+
}));
|
|
141
|
+
}).not.toThrow();
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('Input: controlled-value sync and events', function () {
|
|
145
|
+
var withField = function withField() {
|
|
146
|
+
var input = new _input["default"]({});
|
|
147
|
+
input.mathField = {
|
|
148
|
+
value: '',
|
|
149
|
+
getValue: function getValue() {
|
|
150
|
+
return input.mathField.value;
|
|
151
|
+
},
|
|
152
|
+
insert: function insert(v) {
|
|
153
|
+
input.mathField.value += v;
|
|
154
|
+
},
|
|
155
|
+
executeCommand: function executeCommand() {},
|
|
156
|
+
focus: function focus() {},
|
|
157
|
+
blur: function blur() {},
|
|
158
|
+
addEventListener: function addEventListener() {},
|
|
159
|
+
removeEventListener: function removeEventListener() {},
|
|
160
|
+
remove: function remove() {}
|
|
161
|
+
};
|
|
162
|
+
return input;
|
|
163
|
+
};
|
|
164
|
+
it('emits stored-form latex on edit', function () {
|
|
165
|
+
var onChange = jest.fn();
|
|
166
|
+
var input = withField();
|
|
167
|
+
input.props = {
|
|
168
|
+
onChange: onChange
|
|
169
|
+
};
|
|
170
|
+
input.mathField.value = '\\longdiv{\\placeholder{}}';
|
|
171
|
+
input.onInputEdit();
|
|
172
|
+
|
|
173
|
+
// \placeholder is MathLive-internal and must not reach the model
|
|
174
|
+
expect(onChange).toHaveBeenCalledWith('\\longdiv{}');
|
|
175
|
+
expect(input.lastEmitted).toEqual('\\longdiv{}');
|
|
176
|
+
});
|
|
177
|
+
it('does not push a prop echo back into the field', function () {
|
|
178
|
+
var input = withField();
|
|
179
|
+
input.mathField.value = 'x';
|
|
180
|
+
input.lastEmitted = 'x';
|
|
181
|
+
input.props = {
|
|
182
|
+
latex: 'x'
|
|
183
|
+
};
|
|
184
|
+
input.componentDidUpdate({
|
|
185
|
+
latex: ''
|
|
186
|
+
});
|
|
187
|
+
expect(input.mathField.value).toEqual('x');
|
|
188
|
+
});
|
|
189
|
+
it('pushes a genuinely new latex prop into the field', function () {
|
|
190
|
+
var input = withField();
|
|
191
|
+
input.mathField.value = 'x';
|
|
192
|
+
input.lastEmitted = 'x';
|
|
193
|
+
input.props = {
|
|
194
|
+
latex: 'y'
|
|
195
|
+
};
|
|
196
|
+
input.componentDidUpdate({
|
|
197
|
+
latex: 'x'
|
|
198
|
+
});
|
|
199
|
+
expect(input.mathField.value).toEqual('y');
|
|
200
|
+
});
|
|
201
|
+
it('bridges stored latex on the way in', function () {
|
|
202
|
+
var input = withField();
|
|
203
|
+
input.props = {
|
|
204
|
+
latex: '\\longdiv{5}'
|
|
205
|
+
};
|
|
206
|
+
input.componentDidUpdate({
|
|
207
|
+
latex: ''
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// must become native \enclose so the content stays editable
|
|
211
|
+
expect(input.mathField.value).toEqual('\\enclose{longdiv}{5}');
|
|
212
|
+
});
|
|
213
|
+
it('toggles readOnly', function () {
|
|
214
|
+
var input = withField();
|
|
215
|
+
input.props = {
|
|
216
|
+
readOnly: true
|
|
217
|
+
};
|
|
218
|
+
input.componentDidUpdate({
|
|
219
|
+
readOnly: false
|
|
220
|
+
});
|
|
221
|
+
expect(input.mathField.readOnly).toBe(true);
|
|
222
|
+
});
|
|
223
|
+
it('clear() empties the field', function () {
|
|
224
|
+
var input = withField();
|
|
225
|
+
input.mathField.value = 'abc';
|
|
226
|
+
expect(input.clear()).toEqual('');
|
|
227
|
+
expect(input.mathField.value).toEqual('');
|
|
228
|
+
});
|
|
229
|
+
it('suppresses Enter so it cannot insert a line break', function () {
|
|
230
|
+
var input = withField();
|
|
231
|
+
var preventDefault = jest.fn();
|
|
232
|
+
input.onKeyDown({
|
|
233
|
+
key: 'Enter',
|
|
234
|
+
preventDefault: preventDefault
|
|
235
|
+
});
|
|
236
|
+
expect(preventDefault).toHaveBeenCalled();
|
|
237
|
+
preventDefault.mockClear();
|
|
238
|
+
input.onKeyDown({
|
|
239
|
+
key: 'a',
|
|
240
|
+
preventDefault: preventDefault
|
|
241
|
+
});
|
|
242
|
+
expect(preventDefault).not.toHaveBeenCalled();
|
|
243
|
+
});
|
|
244
|
+
it('componentDidUpdate is safe before the field exists', function () {
|
|
245
|
+
var input = new _input["default"]({
|
|
246
|
+
latex: 'x'
|
|
247
|
+
});
|
|
248
|
+
expect(function () {
|
|
249
|
+
return input.componentDidUpdate({
|
|
250
|
+
latex: ''
|
|
251
|
+
});
|
|
252
|
+
}).not.toThrow();
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWF0aElucHV0IiwiX2hvcml6b250YWxLZXlwYWQiLCJfaW5wdXQiLCJkZXNjcmliZSIsIndpdGhJbnB1dCIsIm1pIiwiTWF0aElucHV0IiwiY2FsbHMiLCJ3cml0ZSIsImtleXN0cm9rZSIsImlucHV0IiwidiIsInB1c2giLCJpdCIsIl93aXRoSW5wdXQiLCJrZXlwYWRQcmVzcyIsImxhdGV4IiwiZXhwZWN0IiwidG9FcXVhbCIsIl93aXRoSW5wdXQyIiwiY29tbWFuZCIsIl93aXRoSW5wdXQzIiwiX3dpdGhJbnB1dDQiLCJub3QiLCJ0b1Rocm93Iiwib25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJjaGFuZ2VMYXRleCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInNldFN0YXRlIiwicyIsIk9iamVjdCIsImFzc2lnbiIsInN0YXRlIiwiaW5wdXRGb2N1cyIsImZvY3VzZWQiLCJ0b0JlIiwiaW5wdXRCbHVyIiwicHJlc3NlZCIsImtleSIsIm9uQ2xpY2siLCJoayIsIkhvcml6b250YWxLZXlwYWQiLCJtb2NrIiwidmFsdWUiLCJ0eXBlIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIndpdGhGaWVsZCIsIklucHV0IiwibWF0aEZpZWxkIiwiZ2V0VmFsdWUiLCJpbnNlcnQiLCJleGVjdXRlQ29tbWFuZCIsImZvY3VzIiwiYmx1ciIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicmVtb3ZlIiwicHJvcHMiLCJvbklucHV0RWRpdCIsImxhc3RFbWl0dGVkIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVhZE9ubHkiLCJjbGVhciIsInByZXZlbnREZWZhdWx0Iiwib25LZXlEb3duIiwibW9ja0NsZWFyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9jb21wb3NpdGVzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcblxuaW1wb3J0IE1hdGhJbnB1dCBmcm9tICcuLi9tYXRoLWlucHV0JztcbmltcG9ydCBIb3Jpem9udGFsS2V5cGFkIGZyb20gJy4uL2hvcml6b250YWwta2V5cGFkJztcbmltcG9ydCBJbnB1dCBmcm9tICcuLi9tZi9pbnB1dCc7XG5cbi8qKlxuICogVGhlIHBpZWNlcyB0aGF0IHNpdCBiZXR3ZWVuIHRoZSBrZXlwYWQgYW5kIHRoZSBmaWVsZDogaG93IGEgcHJlc3NlZCBrZXkgaXNcbiAqIHJvdXRlZCBpbnRvIHRoZSBmaWVsZCwgYW5kIHRoZSBsZWdhY3kgYHt2YWx1ZSx0eXBlfWAgc2hhcGUgbWF0aC10b29sYmFyXG4gKiBjb25zdW1lcy5cbiAqL1xuZGVzY3JpYmUoJ01hdGhJbnB1dC5rZXlwYWRQcmVzcyByb3V0aW5nJywgKCkgPT4ge1xuICBjb25zdCB3aXRoSW5wdXQgPSAoKSA9PiB7XG4gICAgY29uc3QgbWkgPSBuZXcgTWF0aElucHV0KHt9KTtcbiAgICBjb25zdCBjYWxscyA9IHsgd3JpdGU6IFtdLCBrZXlzdHJva2U6IFtdIH07XG5cbiAgICBtaS5pbnB1dCA9IHtcbiAgICAgIHdyaXRlOiAodikgPT4gY2FsbHMud3JpdGUucHVzaCh2KSxcbiAgICAgIGtleXN0cm9rZTogKHYpID0+IGNhbGxzLmtleXN0cm9rZS5wdXNoKHYpLFxuICAgIH07XG5cbiAgICByZXR1cm4geyBtaSwgY2FsbHMgfTtcbiAgfTtcblxuICBpdCgncm91dGVzIGFuIGluc2VydCBhY3Rpb24gdG8gd3JpdGUoKScsICgpID0+IHtcbiAgICBjb25zdCB7IG1pLCBjYWxscyB9ID0gd2l0aElucHV0KCk7XG5cbiAgICBtaS5rZXlwYWRQcmVzcyh7IGxhdGV4OiAnXFxcXHBpJyB9KTtcblxuICAgIGV4cGVjdChjYWxscy53cml0ZSkudG9FcXVhbChbJ1xcXFxwaSddKTtcbiAgICBleHBlY3QoY2FsbHMua2V5c3Ryb2tlKS50b0VxdWFsKFtdKTtcbiAgfSk7XG5cbiAgaXQoJ2V4cGFuZHMgYW4gYXJndW1lbnQtdGFraW5nIGNvbW1hbmQgYmVmb3JlIHdyaXRpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBtaSwgY2FsbHMgfSA9IHdpdGhJbnB1dCgpO1xuXG4gICAgbWkua2V5cGFkUHJlc3MoeyBjb21tYW5kOiAnXFxcXGZyYWMnIH0pO1xuXG4gICAgZXhwZWN0KGNhbGxzLndyaXRlKS50b0VxdWFsKFsnXFxcXGZyYWN7Iz99eyM/fSddKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdXRlcyBhIGN1cnNvciBrZXlzdHJva2UgdG8ga2V5c3Ryb2tlKCknLCAoKSA9PiB7XG4gICAgY29uc3QgeyBtaSwgY2FsbHMgfSA9IHdpdGhJbnB1dCgpO1xuXG4gICAgbWkua2V5cGFkUHJlc3MoeyBrZXlzdHJva2U6ICdMZWZ0JyB9KTtcblxuICAgIGV4cGVjdChjYWxscy5rZXlzdHJva2UpLnRvRXF1YWwoWydtb3ZlVG9QcmV2aW91c0NoYXInXSk7XG4gICAgZXhwZWN0KGNhbGxzLndyaXRlKS50b0VxdWFsKFtdKTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMga2V5cyB3aXRoIG5vIGFjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCB7IG1pLCBjYWxscyB9ID0gd2l0aElucHV0KCk7XG5cbiAgICBtaS5rZXlwYWRQcmVzcyh7fSk7XG4gICAgbWkua2V5cGFkUHJlc3MoeyBrZXlzdHJva2U6ICdOb25zZW5zZScgfSk7XG5cbiAgICBleHBlY3QoY2FsbHMud3JpdGUpLnRvRXF1YWwoW10pO1xuICAgIGV4cGVjdChjYWxscy5rZXlzdHJva2UpLnRvRXF1YWwoW10pO1xuICB9KTtcblxuICBpdCgnaXMgYSBuby1vcCBiZWZvcmUgdGhlIGZpZWxkIHJlZiBleGlzdHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWkgPSBuZXcgTWF0aElucHV0KHt9KTtcblxuICAgIGV4cGVjdCgoKSA9PiBtaS5rZXlwYWRQcmVzcyh7IGxhdGV4OiAnXFxcXHBpJyB9KSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoJ2NoYW5nZUxhdGV4IG9ubHkgZmlyZXMgb25DaGFuZ2Ugd2hlbiB0aGUgdmFsdWUgZGlmZmVycycsICgpID0+IHtcbiAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBtaSA9IG5ldyBNYXRoSW5wdXQoeyBsYXRleDogJ3gnLCBvbkNoYW5nZSB9KTtcblxuICAgIG1pLmNoYW5nZUxhdGV4KCd4Jyk7XG4gICAgZXhwZWN0KG9uQ2hhbmdlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgbWkuY2hhbmdlTGF0ZXgoJ3knKTtcbiAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd5Jyk7XG4gIH0pO1xuXG4gIGl0KCd0cmFja3MgZm9jdXMgc3RhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgbWkgPSBuZXcgTWF0aElucHV0KHt9KTtcblxuICAgIG1pLnNldFN0YXRlID0gKHMpID0+IE9iamVjdC5hc3NpZ24obWkuc3RhdGUsIHMpO1xuICAgIG1pLmlucHV0Rm9jdXMoKTtcbiAgICBleHBlY3QobWkuc3RhdGUuZm9jdXNlZCkudG9CZSh0cnVlKTtcblxuICAgIG1pLmlucHV0Qmx1cigpO1xuICAgIGV4cGVjdChtaS5zdGF0ZS5mb2N1c2VkKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0hvcml6b250YWxLZXlwYWQgbGVnYWN5IHt2YWx1ZSx0eXBlfSBtb2RlbCcsICgpID0+IHtcbiAgY29uc3QgcHJlc3NlZCA9IChrZXkpID0+IHtcbiAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIGNvbnN0IGhrID0gbmV3IEhvcml6b250YWxLZXlwYWQoeyBvbkNsaWNrIH0pO1xuXG4gICAgaGsua2V5cGFkUHJlc3Moa2V5KTtcblxuICAgIHJldHVybiBvbkNsaWNrLm1vY2suY2FsbHNbMF1bMF07XG4gIH07XG5cbiAgaXQoJ21hcHMgYSBjb21tYW5kIHRvIHt2YWx1ZSwgdHlwZTogY29tbWFuZH0nLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZXNzZWQoeyBjb21tYW5kOiAnXFxcXGZyYWMnIH0pKS50b0VxdWFsKHsgdmFsdWU6ICdcXFxcZnJhYycsIHR5cGU6ICdjb21tYW5kJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ21hcHMgYSB3cml0ZSB0byB7dmFsdWV9JywgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVzc2VkKHsgd3JpdGU6ICd4JyB9KSkudG9FcXVhbCh7IHZhbHVlOiAneCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdtYXBzIGEga2V5c3Ryb2tlIHRvIHt0eXBlOiBjdXJzb3J9JywgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVzc2VkKHsga2V5c3Ryb2tlOiAnTGVmdCcgfSkpLnRvRXF1YWwoeyB0eXBlOiAnY3Vyc29yJywgdmFsdWU6ICdMZWZ0JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgd2l0aG91dCB0aHJvd2luZycsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gcmVuZGVyKDxIb3Jpem9udGFsS2V5cGFkIG9uQ2xpY2s9eygpID0+IHt9fSAvPikpLm5vdC50b1Rocm93KCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdJbnB1dDogY29udHJvbGxlZC12YWx1ZSBzeW5jIGFuZCBldmVudHMnLCAoKSA9PiB7XG4gIGNvbnN0IHdpdGhGaWVsZCA9ICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG5cbiAgICBpbnB1dC5tYXRoRmllbGQgPSB7XG4gICAgICB2YWx1ZTogJycsXG4gICAgICBnZXRWYWx1ZTogKCkgPT4gaW5wdXQubWF0aEZpZWxkLnZhbHVlLFxuICAgICAgaW5zZXJ0KHYpIHtcbiAgICAgICAgaW5wdXQubWF0aEZpZWxkLnZhbHVlICs9IHY7XG4gICAgICB9LFxuICAgICAgZXhlY3V0ZUNvbW1hbmQoKSB7fSxcbiAgICAgIGZvY3VzKCkge30sXG4gICAgICBibHVyKCkge30sXG4gICAgICBhZGRFdmVudExpc3RlbmVyKCkge30sXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gICAgICByZW1vdmUoKSB7fSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGlucHV0O1xuICB9O1xuXG4gIGl0KCdlbWl0cyBzdG9yZWQtZm9ybSBsYXRleCBvbiBlZGl0JywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IGlucHV0ID0gd2l0aEZpZWxkKCk7XG5cbiAgICBpbnB1dC5wcm9wcyA9IHsgb25DaGFuZ2UgfTtcbiAgICBpbnB1dC5tYXRoRmllbGQudmFsdWUgPSAnXFxcXGxvbmdkaXZ7XFxcXHBsYWNlaG9sZGVye319JztcbiAgICBpbnB1dC5vbklucHV0RWRpdCgpO1xuXG4gICAgLy8gXFxwbGFjZWhvbGRlciBpcyBNYXRoTGl2ZS1pbnRlcm5hbCBhbmQgbXVzdCBub3QgcmVhY2ggdGhlIG1vZGVsXG4gICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnXFxcXGxvbmdkaXZ7fScpO1xuICAgIGV4cGVjdChpbnB1dC5sYXN0RW1pdHRlZCkudG9FcXVhbCgnXFxcXGxvbmdkaXZ7fScpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgcHVzaCBhIHByb3AgZWNobyBiYWNrIGludG8gdGhlIGZpZWxkJywgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gd2l0aEZpZWxkKCk7XG5cbiAgICBpbnB1dC5tYXRoRmllbGQudmFsdWUgPSAneCc7XG4gICAgaW5wdXQubGFzdEVtaXR0ZWQgPSAneCc7XG4gICAgaW5wdXQucHJvcHMgPSB7IGxhdGV4OiAneCcgfTtcblxuICAgIGlucHV0LmNvbXBvbmVudERpZFVwZGF0ZSh7IGxhdGV4OiAnJyB9KTtcblxuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQudmFsdWUpLnRvRXF1YWwoJ3gnKTtcbiAgfSk7XG5cbiAgaXQoJ3B1c2hlcyBhIGdlbnVpbmVseSBuZXcgbGF0ZXggcHJvcCBpbnRvIHRoZSBmaWVsZCcsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHdpdGhGaWVsZCgpO1xuXG4gICAgaW5wdXQubWF0aEZpZWxkLnZhbHVlID0gJ3gnO1xuICAgIGlucHV0Lmxhc3RFbWl0dGVkID0gJ3gnO1xuICAgIGlucHV0LnByb3BzID0geyBsYXRleDogJ3knIH07XG5cbiAgICBpbnB1dC5jb21wb25lbnREaWRVcGRhdGUoeyBsYXRleDogJ3gnIH0pO1xuXG4gICAgZXhwZWN0KGlucHV0Lm1hdGhGaWVsZC52YWx1ZSkudG9FcXVhbCgneScpO1xuICB9KTtcblxuICBpdCgnYnJpZGdlcyBzdG9yZWQgbGF0ZXggb24gdGhlIHdheSBpbicsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHdpdGhGaWVsZCgpO1xuXG4gICAgaW5wdXQucHJvcHMgPSB7IGxhdGV4OiAnXFxcXGxvbmdkaXZ7NX0nIH07XG4gICAgaW5wdXQuY29tcG9uZW50RGlkVXBkYXRlKHsgbGF0ZXg6ICcnIH0pO1xuXG4gICAgLy8gbXVzdCBiZWNvbWUgbmF0aXZlIFxcZW5jbG9zZSBzbyB0aGUgY29udGVudCBzdGF5cyBlZGl0YWJsZVxuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQudmFsdWUpLnRvRXF1YWwoJ1xcXFxlbmNsb3Nle2xvbmdkaXZ9ezV9Jyk7XG4gIH0pO1xuXG4gIGl0KCd0b2dnbGVzIHJlYWRPbmx5JywgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gd2l0aEZpZWxkKCk7XG5cbiAgICBpbnB1dC5wcm9wcyA9IHsgcmVhZE9ubHk6IHRydWUgfTtcbiAgICBpbnB1dC5jb21wb25lbnREaWRVcGRhdGUoeyByZWFkT25seTogZmFsc2UgfSk7XG5cbiAgICBleHBlY3QoaW5wdXQubWF0aEZpZWxkLnJlYWRPbmx5KS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnY2xlYXIoKSBlbXB0aWVzIHRoZSBmaWVsZCcsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHdpdGhGaWVsZCgpO1xuXG4gICAgaW5wdXQubWF0aEZpZWxkLnZhbHVlID0gJ2FiYyc7XG4gICAgZXhwZWN0KGlucHV0LmNsZWFyKCkpLnRvRXF1YWwoJycpO1xuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQudmFsdWUpLnRvRXF1YWwoJycpO1xuICB9KTtcblxuICBpdCgnc3VwcHJlc3NlcyBFbnRlciBzbyBpdCBjYW5ub3QgaW5zZXJ0IGEgbGluZSBicmVhaycsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHdpdGhGaWVsZCgpO1xuICAgIGNvbnN0IHByZXZlbnREZWZhdWx0ID0gamVzdC5mbigpO1xuXG4gICAgaW5wdXQub25LZXlEb3duKHsga2V5OiAnRW50ZXInLCBwcmV2ZW50RGVmYXVsdCB9KTtcbiAgICBleHBlY3QocHJldmVudERlZmF1bHQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcblxuICAgIHByZXZlbnREZWZhdWx0Lm1vY2tDbGVhcigpO1xuICAgIGlucHV0Lm9uS2V5RG93bih7IGtleTogJ2EnLCBwcmV2ZW50RGVmYXVsdCB9KTtcbiAgICBleHBlY3QocHJldmVudERlZmF1bHQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjb21wb25lbnREaWRVcGRhdGUgaXMgc2FmZSBiZWZvcmUgdGhlIGZpZWxkIGV4aXN0cycsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7IGxhdGV4OiAneCcgfSk7XG5cbiAgICBleHBlY3QoKCkgPT4gaW5wdXQuY29tcG9uZW50RGlkVXBkYXRlKHsgbGF0ZXg6ICcnIH0pKS5ub3QudG9UaHJvdygpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxpQkFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFB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
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
var _react2 = require("@testing-library/react");
|
|
7
|
+
var _styles = require("@mui/material/styles");
|
|
8
|
+
var _index = require("../index");
|
|
9
|
+
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; }
|
|
10
|
+
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; }
|
|
11
|
+
/**
|
|
12
|
+
* Exercises the exact call patterns real consumers use against
|
|
13
|
+
* @pie-lib/math-input, to catch drop-in incompatibilities.
|
|
14
|
+
*
|
|
15
|
+
* Sources:
|
|
16
|
+
* - packages/math-toolbar/src/editor-and-pad.jsx:16,185
|
|
17
|
+
* - packages/math-toolbar/src/math-preview.jsx:8,156
|
|
18
|
+
* - packages/editable-html/src/plugins/respArea/math-templated/index.jsx:92
|
|
19
|
+
* - packages/editable-html-tip-tap/src/components/respArea/MathTemplated.jsx:111
|
|
20
|
+
*/
|
|
21
|
+
describe('drop-in compatibility with @pie-lib/math-input consumers', function () {
|
|
22
|
+
describe('mq.CommonMqStyles destructuring', function () {
|
|
23
|
+
it('math-preview.jsx: { commonMqFontStyles, longdivStyles, supsubStyles }', function () {
|
|
24
|
+
var _mq$CommonMqStyles = _index.mq.CommonMqStyles,
|
|
25
|
+
commonMqFontStyles = _mq$CommonMqStyles.commonMqFontStyles,
|
|
26
|
+
longdivStyles = _mq$CommonMqStyles.longdivStyles,
|
|
27
|
+
supsubStyles = _mq$CommonMqStyles.supsubStyles;
|
|
28
|
+
expect(commonMqFontStyles).toBeDefined();
|
|
29
|
+
expect(longdivStyles).toBeDefined();
|
|
30
|
+
expect(supsubStyles).toBeDefined();
|
|
31
|
+
});
|
|
32
|
+
it('editor-and-pad.jsx: also { commonMqKeyboardStyles }', function () {
|
|
33
|
+
var _mq$CommonMqStyles2 = _index.mq.CommonMqStyles,
|
|
34
|
+
commonMqFontStyles = _mq$CommonMqStyles2.commonMqFontStyles,
|
|
35
|
+
commonMqKeyboardStyles = _mq$CommonMqStyles2.commonMqKeyboardStyles,
|
|
36
|
+
longdivStyles = _mq$CommonMqStyles2.longdivStyles,
|
|
37
|
+
supsubStyles = _mq$CommonMqStyles2.supsubStyles;
|
|
38
|
+
expect(commonMqKeyboardStyles).toBeDefined();
|
|
39
|
+
// All four must be spreadable into an emotion style object.
|
|
40
|
+
expect(function () {
|
|
41
|
+
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, commonMqFontStyles), commonMqKeyboardStyles), longdivStyles), supsubStyles);
|
|
42
|
+
}).not.toThrow();
|
|
43
|
+
});
|
|
44
|
+
it('the destructured groups survive being spread into a styled component', function () {
|
|
45
|
+
var _mq$CommonMqStyles3 = _index.mq.CommonMqStyles,
|
|
46
|
+
commonMqFontStyles = _mq$CommonMqStyles3.commonMqFontStyles,
|
|
47
|
+
longdivStyles = _mq$CommonMqStyles3.longdivStyles,
|
|
48
|
+
supsubStyles = _mq$CommonMqStyles3.supsubStyles;
|
|
49
|
+
var Styled = (0, _styles.styled)('div')(_objectSpread(_objectSpread(_objectSpread({}, commonMqFontStyles), longdivStyles), supsubStyles));
|
|
50
|
+
expect(function () {
|
|
51
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, null));
|
|
52
|
+
}).not.toThrow();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('mq.Input', function () {
|
|
56
|
+
it('editor-and-pad.jsx: styled(mq.Input) renders', function () {
|
|
57
|
+
var MathEditor = (0, _styles.styled)(_index.mq.Input)(function () {
|
|
58
|
+
return {
|
|
59
|
+
width: '100%'
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
expect(function () {
|
|
63
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(MathEditor, {
|
|
64
|
+
latex: "\\\\frac{1}{2}",
|
|
65
|
+
onChange: function onChange() {}
|
|
66
|
+
}));
|
|
67
|
+
}).not.toThrow();
|
|
68
|
+
});
|
|
69
|
+
it('accepts the className that styled() injects', function () {
|
|
70
|
+
var Styled = (0, _styles.styled)(_index.mq.Input)({
|
|
71
|
+
padding: 4
|
|
72
|
+
});
|
|
73
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, {
|
|
74
|
+
latex: "x",
|
|
75
|
+
onChange: function onChange() {}
|
|
76
|
+
})),
|
|
77
|
+
container = _render.container;
|
|
78
|
+
expect(container.firstChild).toBeTruthy();
|
|
79
|
+
expect(container.firstChild.className).toBeTruthy();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('mq.Static', function () {
|
|
83
|
+
it('math-preview.jsx: <mq.Static latex onFocus onBlur />', function () {
|
|
84
|
+
expect(function () {
|
|
85
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
86
|
+
latex: '\\frac{1}{2}',
|
|
87
|
+
onFocus: function onFocus() {},
|
|
88
|
+
onBlur: function onBlur() {}
|
|
89
|
+
}));
|
|
90
|
+
}).not.toThrow();
|
|
91
|
+
});
|
|
92
|
+
it('math-templated respArea: <mq.Static latex={value} />', function () {
|
|
93
|
+
expect(function () {
|
|
94
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
95
|
+
latex: 'x=1'
|
|
96
|
+
}));
|
|
97
|
+
}).not.toThrow();
|
|
98
|
+
});
|
|
99
|
+
it('renders answer-block latex (the templated-math case) without throwing', function () {
|
|
100
|
+
expect(function () {
|
|
101
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
102
|
+
latex: 'x=\\MathQuillMathField[r1]{}',
|
|
103
|
+
onSubFieldChange: function onSubFieldChange() {}
|
|
104
|
+
}));
|
|
105
|
+
}).not.toThrow();
|
|
106
|
+
});
|
|
107
|
+
it('is styleable, as keypad labels were in math-input', function () {
|
|
108
|
+
var Styled = (0, _styles.styled)(_index.mq.Static)({
|
|
109
|
+
pointerEvents: 'none'
|
|
110
|
+
});
|
|
111
|
+
expect(function () {
|
|
112
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, {
|
|
113
|
+
latex: '\\pi'
|
|
114
|
+
}));
|
|
115
|
+
}).not.toThrow();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('surface parity', function () {
|
|
119
|
+
it('exposes exactly the names math-input exported', function () {
|
|
120
|
+
// eslint-disable-next-line global-require
|
|
121
|
+
var pkg = require('../index');
|
|
122
|
+
['keysForGrade', 'addBrackets', 'removeBrackets', 'keys', 'HorizontalKeypad', 'mq', 'updateSpans', 'registerEmbed', 'applyStaticMath'].forEach(function (name) {
|
|
123
|
+
expect(pkg[name]).toBeDefined();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
it('mq exposes Input, Static and CommonMqStyles', function () {
|
|
127
|
+
['Input', 'Static', 'CommonMqStyles'].forEach(function (name) {
|
|
128
|
+
expect(_index.mq[name]).toBeDefined();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfc3R5bGVzIiwiX2luZGV4Iiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIml0IiwiX21xJENvbW1vbk1xU3R5bGVzIiwibXEiLCJDb21tb25NcVN0eWxlcyIsImNvbW1vbk1xRm9udFN0eWxlcyIsImxvbmdkaXZTdHlsZXMiLCJzdXBzdWJTdHlsZXMiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsIl9tcSRDb21tb25NcVN0eWxlczIiLCJjb21tb25NcUtleWJvYXJkU3R5bGVzIiwibm90IiwidG9UaHJvdyIsIl9tcSRDb21tb25NcVN0eWxlczMiLCJTdHlsZWQiLCJzdHlsZWQiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiTWF0aEVkaXRvciIsIklucHV0Iiwid2lkdGgiLCJsYXRleCIsIm9uQ2hhbmdlIiwicGFkZGluZyIsIl9yZW5kZXIiLCJjb250YWluZXIiLCJmaXJzdENoaWxkIiwidG9CZVRydXRoeSIsImNsYXNzTmFtZSIsIlN0YXRpYyIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvblN1YkZpZWxkQ2hhbmdlIiwicG9pbnRlckV2ZW50cyIsInBrZyIsIm5hbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2Ryb3AtaW4tY29tcGF0LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcblxuaW1wb3J0IHsgbXEgfSBmcm9tICcuLi9pbmRleCc7XG5cbi8qKlxuICogRXhlcmNpc2VzIHRoZSBleGFjdCBjYWxsIHBhdHRlcm5zIHJlYWwgY29uc3VtZXJzIHVzZSBhZ2FpbnN0XG4gKiBAcGllLWxpYi9tYXRoLWlucHV0LCB0byBjYXRjaCBkcm9wLWluIGluY29tcGF0aWJpbGl0aWVzLlxuICpcbiAqIFNvdXJjZXM6XG4gKiAgLSBwYWNrYWdlcy9tYXRoLXRvb2xiYXIvc3JjL2VkaXRvci1hbmQtcGFkLmpzeDoxNiwxODVcbiAqICAtIHBhY2thZ2VzL21hdGgtdG9vbGJhci9zcmMvbWF0aC1wcmV2aWV3LmpzeDo4LDE1NlxuICogIC0gcGFja2FnZXMvZWRpdGFibGUtaHRtbC9zcmMvcGx1Z2lucy9yZXNwQXJlYS9tYXRoLXRlbXBsYXRlZC9pbmRleC5qc3g6OTJcbiAqICAtIHBhY2thZ2VzL2VkaXRhYmxlLWh0bWwtdGlwLXRhcC9zcmMvY29tcG9uZW50cy9yZXNwQXJlYS9NYXRoVGVtcGxhdGVkLmpzeDoxMTFcbiAqL1xuZGVzY3JpYmUoJ2Ryb3AtaW4gY29tcGF0aWJpbGl0eSB3aXRoIEBwaWUtbGliL21hdGgtaW5wdXQgY29uc3VtZXJzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbXEuQ29tbW9uTXFTdHlsZXMgZGVzdHJ1Y3R1cmluZycsICgpID0+IHtcbiAgICBpdCgnbWF0aC1wcmV2aWV3LmpzeDogeyBjb21tb25NcUZvbnRTdHlsZXMsIGxvbmdkaXZTdHlsZXMsIHN1cHN1YlN0eWxlcyB9JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb21tb25NcUZvbnRTdHlsZXMsIGxvbmdkaXZTdHlsZXMsIHN1cHN1YlN0eWxlcyB9ID0gbXEuQ29tbW9uTXFTdHlsZXM7XG5cbiAgICAgIGV4cGVjdChjb21tb25NcUZvbnRTdHlsZXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QobG9uZ2RpdlN0eWxlcykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChzdXBzdWJTdHlsZXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZWRpdG9yLWFuZC1wYWQuanN4OiBhbHNvIHsgY29tbW9uTXFLZXlib2FyZFN0eWxlcyB9JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb21tb25NcUZvbnRTdHlsZXMsIGNvbW1vbk1xS2V5Ym9hcmRTdHlsZXMsIGxvbmdkaXZTdHlsZXMsIHN1cHN1YlN0eWxlcyB9ID0gbXEuQ29tbW9uTXFTdHlsZXM7XG5cbiAgICAgIGV4cGVjdChjb21tb25NcUtleWJvYXJkU3R5bGVzKS50b0JlRGVmaW5lZCgpO1xuICAgICAgLy8gQWxsIGZvdXIgbXVzdCBiZSBzcHJlYWRhYmxlIGludG8gYW4gZW1vdGlvbiBzdHlsZSBvYmplY3QuXG4gICAgICBleHBlY3QoKCkgPT4gKHtcbiAgICAgICAgLi4uY29tbW9uTXFGb250U3R5bGVzLFxuICAgICAgICAuLi5jb21tb25NcUtleWJvYXJkU3R5bGVzLFxuICAgICAgICAuLi5sb25nZGl2U3R5bGVzLFxuICAgICAgICAuLi5zdXBzdWJTdHlsZXMsXG4gICAgICB9KSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aGUgZGVzdHJ1Y3R1cmVkIGdyb3VwcyBzdXJ2aXZlIGJlaW5nIHNwcmVhZCBpbnRvIGEgc3R5bGVkIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29tbW9uTXFGb250U3R5bGVzLCBsb25nZGl2U3R5bGVzLCBzdXBzdWJTdHlsZXMgfSA9IG1xLkNvbW1vbk1xU3R5bGVzO1xuICAgICAgY29uc3QgU3R5bGVkID0gc3R5bGVkKCdkaXYnKSh7IC4uLmNvbW1vbk1xRm9udFN0eWxlcywgLi4ubG9uZ2RpdlN0eWxlcywgLi4uc3Vwc3ViU3R5bGVzIH0pO1xuXG4gICAgICBleHBlY3QoKCkgPT4gcmVuZGVyKDxTdHlsZWQgLz4pKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbXEuSW5wdXQnLCAoKSA9PiB7XG4gICAgaXQoJ2VkaXRvci1hbmQtcGFkLmpzeDogc3R5bGVkKG1xLklucHV0KSByZW5kZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aEVkaXRvciA9IHN0eWxlZChtcS5JbnB1dCkoKCkgPT4gKHsgd2lkdGg6ICcxMDAlJyB9KSk7XG5cbiAgICAgIGV4cGVjdCgoKSA9PiByZW5kZXIoPE1hdGhFZGl0b3IgbGF0ZXg9XCJcXFxcZnJhY3sxfXsyfVwiIG9uQ2hhbmdlPXsoKSA9PiB7fX0gLz4pKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FjY2VwdHMgdGhlIGNsYXNzTmFtZSB0aGF0IHN0eWxlZCgpIGluamVjdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBTdHlsZWQgPSBzdHlsZWQobXEuSW5wdXQpKHsgcGFkZGluZzogNCB9KTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFN0eWxlZCBsYXRleD1cInhcIiBvbkNoYW5nZT17KCkgPT4ge319IC8+KTtcblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlVHJ1dGh5KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2xhc3NOYW1lKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdtcS5TdGF0aWMnLCAoKSA9PiB7XG4gICAgaXQoJ21hdGgtcHJldmlldy5qc3g6IDxtcS5TdGF0aWMgbGF0ZXggb25Gb2N1cyBvbkJsdXIgLz4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVuZGVyKDxtcS5TdGF0aWMgbGF0ZXg9eydcXFxcZnJhY3sxfXsyfSd9IG9uRm9jdXM9eygpID0+IHt9fSBvbkJsdXI9eygpID0+IHt9fSAvPikpLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWF0aC10ZW1wbGF0ZWQgcmVzcEFyZWE6IDxtcS5TdGF0aWMgbGF0ZXg9e3ZhbHVlfSAvPicsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZW5kZXIoPG1xLlN0YXRpYyBsYXRleD17J3g9MSd9IC8+KSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGFuc3dlci1ibG9jayBsYXRleCAodGhlIHRlbXBsYXRlZC1tYXRoIGNhc2UpIHdpdGhvdXQgdGhyb3dpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVuZGVyKDxtcS5TdGF0aWMgbGF0ZXg9eyd4PVxcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjFde30nfSBvblN1YkZpZWxkQ2hhbmdlPXsoKSA9PiB7fX0gLz4pLFxuICAgICAgKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIHN0eWxlYWJsZSwgYXMga2V5cGFkIGxhYmVscyB3ZXJlIGluIG1hdGgtaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBTdHlsZWQgPSBzdHlsZWQobXEuU3RhdGljKSh7IHBvaW50ZXJFdmVudHM6ICdub25lJyB9KTtcblxuICAgICAgZXhwZWN0KCgpID0+IHJlbmRlcig8U3R5bGVkIGxhdGV4PXsnXFxcXHBpJ30gLz4pKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3VyZmFjZSBwYXJpdHknLCAoKSA9PiB7XG4gICAgaXQoJ2V4cG9zZXMgZXhhY3RseSB0aGUgbmFtZXMgbWF0aC1pbnB1dCBleHBvcnRlZCcsICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgICAgY29uc3QgcGtnID0gcmVxdWlyZSgnLi4vaW5kZXgnKTtcblxuICAgICAgW1xuICAgICAgICAna2V5c0ZvckdyYWRlJyxcbiAgICAgICAgJ2FkZEJyYWNrZXRzJyxcbiAgICAgICAgJ3JlbW92ZUJyYWNrZXRzJyxcbiAgICAgICAgJ2tleXMnLFxuICAgICAgICAnSG9yaXpvbnRhbEtleXBhZCcsXG4gICAgICAgICdtcScsXG4gICAgICAgICd1cGRhdGVTcGFucycsXG4gICAgICAgICdyZWdpc3RlckVtYmVkJyxcbiAgICAgICAgJ2FwcGx5U3RhdGljTWF0aCcsXG4gICAgICBdLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgZXhwZWN0KHBrZ1tuYW1lXSkudG9CZURlZmluZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ21xIGV4cG9zZXMgSW5wdXQsIFN0YXRpYyBhbmQgQ29tbW9uTXFTdHlsZXMnLCAoKSA9PiB7XG4gICAgICBbJ0lucHV0JywgJ1N0YXRpYycsICdDb21tb25NcVN0eWxlcyddLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgZXhwZWN0KG1xW25hbWVdKS50b0JlRGVmaW5lZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFBOEIsU0FBQUksUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxD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
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _embedded = require("../fonts/embedded");
|
|
6
|
+
var _fonts = require("../fonts");
|
|
7
|
+
/**
|
|
8
|
+
* MathLive composes some glyphs from Private Use Area codepoints that only the
|
|
9
|
+
* KaTeX fonts carry (`\ne` is U+E020 overlapped on `=`), so a missing font file
|
|
10
|
+
* renders tofu rather than a plainer glyph. The faces therefore ship in the
|
|
11
|
+
* bundle - pie-elements has no stylesheet to carry `@font-face` and no asset
|
|
12
|
+
* path to serve woff2 files from.
|
|
13
|
+
*/
|
|
14
|
+
describe('embedded fonts', function () {
|
|
15
|
+
var originalFonts = document.fonts;
|
|
16
|
+
var fakeFontSet = function fakeFontSet() {
|
|
17
|
+
var existing = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
18
|
+
var added = [];
|
|
19
|
+
var set = (0, _defineProperty2["default"])({
|
|
20
|
+
add: function add(f) {
|
|
21
|
+
return added.push(f);
|
|
22
|
+
}
|
|
23
|
+
}, Symbol.iterator, function () {
|
|
24
|
+
return existing[Symbol.iterator]();
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(document, 'fonts', {
|
|
27
|
+
value: set,
|
|
28
|
+
configurable: true
|
|
29
|
+
});
|
|
30
|
+
return added;
|
|
31
|
+
};
|
|
32
|
+
beforeEach(function () {
|
|
33
|
+
(0, _fonts.resetEmbeddedFontsForTests)();
|
|
34
|
+
global.FontFace = jest.fn(function FontFace(family, src, descriptors) {
|
|
35
|
+
Object.assign(this, {
|
|
36
|
+
family: family,
|
|
37
|
+
src: src,
|
|
38
|
+
descriptors: descriptors
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
afterEach(function () {
|
|
43
|
+
Object.defineProperty(document, 'fonts', {
|
|
44
|
+
value: originalFonts,
|
|
45
|
+
configurable: true
|
|
46
|
+
});
|
|
47
|
+
delete global.FontFace;
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// The 12 families MathLive's own loadFonts() looks for; if every one is in
|
|
51
|
+
// document.fonts it short-circuits to "ready" and issues no network request.
|
|
52
|
+
it('covers every family MathLive requires', function () {
|
|
53
|
+
expect(_fonts.EMBEDDED_FONT_FAMILIES.sort()).toEqual(['KaTeX_AMS', 'KaTeX_Caligraphic', 'KaTeX_Fraktur', 'KaTeX_Main', 'KaTeX_Math', 'KaTeX_SansSerif', 'KaTeX_Script', 'KaTeX_Size1', 'KaTeX_Size2', 'KaTeX_Size3', 'KaTeX_Size4', 'KaTeX_Typewriter'].sort());
|
|
54
|
+
});
|
|
55
|
+
it('carries all 20 faces as self-contained data URIs', function () {
|
|
56
|
+
expect(_embedded.EMBEDDED_FONTS).toHaveLength(20);
|
|
57
|
+
_embedded.EMBEDDED_FONTS.forEach(function (_ref) {
|
|
58
|
+
var family = _ref.family,
|
|
59
|
+
src = _ref.src;
|
|
60
|
+
expect(family).toMatch(/^KaTeX_/);
|
|
61
|
+
// No network: a data URI, not a path or a CDN URL.
|
|
62
|
+
expect(src).toMatch(/^url\(data:font\/woff2;base64,[A-Za-z0-9+/=]+\) format\('woff2'\)$/);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it('is generated from the installed mathlive, so glyph metrics match the engine', function () {
|
|
66
|
+
/* eslint-disable global-require */
|
|
67
|
+
var fs = require('fs');
|
|
68
|
+
var path = require('path');
|
|
69
|
+
/* eslint-enable global-require */
|
|
70
|
+
|
|
71
|
+
// Read the file rather than require('mathlive/package.json'): MathLive's
|
|
72
|
+
// exports map does not expose that subpath.
|
|
73
|
+
var manifest = [path.resolve(__dirname, '../../../../node_modules/mathlive/package.json'), path.resolve(__dirname, '../../node_modules/mathlive/package.json')].find(function (p) {
|
|
74
|
+
return fs.existsSync(p);
|
|
75
|
+
});
|
|
76
|
+
expect(manifest).toBeDefined();
|
|
77
|
+
expect(_embedded.MATHLIVE_VERSION).toEqual(JSON.parse(fs.readFileSync(manifest, 'utf8')).version);
|
|
78
|
+
});
|
|
79
|
+
it('registers every face with the document', function () {
|
|
80
|
+
var added = fakeFontSet();
|
|
81
|
+
expect((0, _fonts.registerEmbeddedFonts)()).toBe(true);
|
|
82
|
+
expect(added).toHaveLength(20);
|
|
83
|
+
expect(added.map(function (f) {
|
|
84
|
+
return f.family;
|
|
85
|
+
})).toContain('KaTeX_Main');
|
|
86
|
+
// Descriptors ride along, or bold/italic math would synthesise from regular.
|
|
87
|
+
expect(added.find(function (f) {
|
|
88
|
+
return f.src.startsWith('url(data:') && f.descriptors.weight === 'bold';
|
|
89
|
+
})).toBeDefined();
|
|
90
|
+
});
|
|
91
|
+
it('does not register twice', function () {
|
|
92
|
+
var added = fakeFontSet();
|
|
93
|
+
(0, _fonts.registerEmbeddedFonts)();
|
|
94
|
+
(0, _fonts.registerEmbeddedFonts)();
|
|
95
|
+
expect(added).toHaveLength(20);
|
|
96
|
+
});
|
|
97
|
+
it('leaves the document alone when it already provides every family', function () {
|
|
98
|
+
// A host that serves the fonts itself - configureFonts, or importing
|
|
99
|
+
// mathlive/fonts.css - wins.
|
|
100
|
+
var added = fakeFontSet(_fonts.EMBEDDED_FONT_FAMILIES.map(function (family) {
|
|
101
|
+
return {
|
|
102
|
+
family: family
|
|
103
|
+
};
|
|
104
|
+
}));
|
|
105
|
+
expect((0, _fonts.registerEmbeddedFonts)()).toBe(true);
|
|
106
|
+
expect(added).toHaveLength(0);
|
|
107
|
+
});
|
|
108
|
+
it('reports failure instead of throwing when the FontFace API is missing', function () {
|
|
109
|
+
fakeFontSet();
|
|
110
|
+
delete global.FontFace;
|
|
111
|
+
expect((0, _fonts.registerEmbeddedFonts)()).toBe(false);
|
|
112
|
+
});
|
|
113
|
+
it('reports failure instead of throwing when a face cannot be constructed', function () {
|
|
114
|
+
fakeFontSet();
|
|
115
|
+
global.FontFace = jest.fn(function () {
|
|
116
|
+
throw new Error('bad font');
|
|
117
|
+
});
|
|
118
|
+
expect((0, _fonts.registerEmbeddedFonts)()).toBe(false);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZW1iZWRkZWQiLCJyZXF1aXJlIiwiX2ZvbnRzIiwiZGVzY3JpYmUiLCJvcmlnaW5hbEZvbnRzIiwiZG9jdW1lbnQiLCJmb250cyIsImZha2VGb250U2V0IiwiZXhpc3RpbmciLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJhZGRlZCIsInNldCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJhZGQiLCJmIiwicHVzaCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsImJlZm9yZUVhY2giLCJyZXNldEVtYmVkZGVkRm9udHNGb3JUZXN0cyIsImdsb2JhbCIsIkZvbnRGYWNlIiwiamVzdCIsImZuIiwiZmFtaWx5Iiwic3JjIiwiZGVzY3JpcHRvcnMiLCJhc3NpZ24iLCJhZnRlckVhY2giLCJpdCIsImV4cGVjdCIsIkVNQkVEREVEX0ZPTlRfRkFNSUxJRVMiLCJzb3J0IiwidG9FcXVhbCIsIkVNQkVEREVEX0ZPTlRTIiwidG9IYXZlTGVuZ3RoIiwiZm9yRWFjaCIsIl9yZWYiLCJ0b01hdGNoIiwiZnMiLCJwYXRoIiwibWFuaWZlc3QiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwidG9CZURlZmluZWQiLCJNQVRITElWRV9WRVJTSU9OIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwidmVyc2lvbiIsInJlZ2lzdGVyRW1iZWRkZWRGb250cyIsInRvQmUiLCJtYXAiLCJ0b0NvbnRhaW4iLCJzdGFydHNXaXRoIiwid2VpZ2h0IiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2VtYmVkZGVkLWZvbnRzLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU1CRURERURfRk9OVFMsIE1BVEhMSVZFX1ZFUlNJT04gfSBmcm9tICcuLi9mb250cy9lbWJlZGRlZCc7XG5pbXBvcnQgeyBFTUJFRERFRF9GT05UX0ZBTUlMSUVTLCByZWdpc3RlckVtYmVkZGVkRm9udHMsIHJlc2V0RW1iZWRkZWRGb250c0ZvclRlc3RzIH0gZnJvbSAnLi4vZm9udHMnO1xuXG4vKipcbiAqIE1hdGhMaXZlIGNvbXBvc2VzIHNvbWUgZ2x5cGhzIGZyb20gUHJpdmF0ZSBVc2UgQXJlYSBjb2RlcG9pbnRzIHRoYXQgb25seSB0aGVcbiAqIEthVGVYIGZvbnRzIGNhcnJ5IChgXFxuZWAgaXMgVStFMDIwIG92ZXJsYXBwZWQgb24gYD1gKSwgc28gYSBtaXNzaW5nIGZvbnQgZmlsZVxuICogcmVuZGVycyB0b2Z1IHJhdGhlciB0aGFuIGEgcGxhaW5lciBnbHlwaC4gVGhlIGZhY2VzIHRoZXJlZm9yZSBzaGlwIGluIHRoZVxuICogYnVuZGxlIC0gcGllLWVsZW1lbnRzIGhhcyBubyBzdHlsZXNoZWV0IHRvIGNhcnJ5IGBAZm9udC1mYWNlYCBhbmQgbm8gYXNzZXRcbiAqIHBhdGggdG8gc2VydmUgd29mZjIgZmlsZXMgZnJvbS5cbiAqL1xuZGVzY3JpYmUoJ2VtYmVkZGVkIGZvbnRzJywgKCkgPT4ge1xuICBjb25zdCBvcmlnaW5hbEZvbnRzID0gZG9jdW1lbnQuZm9udHM7XG5cbiAgY29uc3QgZmFrZUZvbnRTZXQgPSAoZXhpc3RpbmcgPSBbXSkgPT4ge1xuICAgIGNvbnN0IGFkZGVkID0gW107XG4gICAgY29uc3Qgc2V0ID0ge1xuICAgICAgYWRkOiAoZikgPT4gYWRkZWQucHVzaChmKSxcbiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBleGlzdGluZ1tTeW1ib2wuaXRlcmF0b3JdKCksXG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2ZvbnRzJywgeyB2YWx1ZTogc2V0LCBjb25maWd1cmFibGU6IHRydWUgfSk7XG5cbiAgICByZXR1cm4gYWRkZWQ7XG4gIH07XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgcmVzZXRFbWJlZGRlZEZvbnRzRm9yVGVzdHMoKTtcbiAgICBnbG9iYWwuRm9udEZhY2UgPSBqZXN0LmZuKGZ1bmN0aW9uIEZvbnRGYWNlKGZhbWlseSwgc3JjLCBkZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7IGZhbWlseSwgc3JjLCBkZXNjcmlwdG9ycyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdmb250cycsIHsgdmFsdWU6IG9yaWdpbmFsRm9udHMsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICBkZWxldGUgZ2xvYmFsLkZvbnRGYWNlO1xuICB9KTtcblxuICAvLyBUaGUgMTIgZmFtaWxpZXMgTWF0aExpdmUncyBvd24gbG9hZEZvbnRzKCkgbG9va3MgZm9yOyBpZiBldmVyeSBvbmUgaXMgaW5cbiAgLy8gZG9jdW1lbnQuZm9udHMgaXQgc2hvcnQtY2lyY3VpdHMgdG8gXCJyZWFkeVwiIGFuZCBpc3N1ZXMgbm8gbmV0d29yayByZXF1ZXN0LlxuICBpdCgnY292ZXJzIGV2ZXJ5IGZhbWlseSBNYXRoTGl2ZSByZXF1aXJlcycsICgpID0+IHtcbiAgICBleHBlY3QoRU1CRURERURfRk9OVF9GQU1JTElFUy5zb3J0KCkpLnRvRXF1YWwoXG4gICAgICBbXG4gICAgICAgICdLYVRlWF9BTVMnLFxuICAgICAgICAnS2FUZVhfQ2FsaWdyYXBoaWMnLFxuICAgICAgICAnS2FUZVhfRnJha3R1cicsXG4gICAgICAgICdLYVRlWF9NYWluJyxcbiAgICAgICAgJ0thVGVYX01hdGgnLFxuICAgICAgICAnS2FUZVhfU2Fuc1NlcmlmJyxcbiAgICAgICAgJ0thVGVYX1NjcmlwdCcsXG4gICAgICAgICdLYVRlWF9TaXplMScsXG4gICAgICAgICdLYVRlWF9TaXplMicsXG4gICAgICAgICdLYVRlWF9TaXplMycsXG4gICAgICAgICdLYVRlWF9TaXplNCcsXG4gICAgICAgICdLYVRlWF9UeXBld3JpdGVyJyxcbiAgICAgIF0uc29ydCgpLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdjYXJyaWVzIGFsbCAyMCBmYWNlcyBhcyBzZWxmLWNvbnRhaW5lZCBkYXRhIFVSSXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KEVNQkVEREVEX0ZPTlRTKS50b0hhdmVMZW5ndGgoMjApO1xuXG4gICAgRU1CRURERURfRk9OVFMuZm9yRWFjaCgoeyBmYW1pbHksIHNyYyB9KSA9PiB7XG4gICAgICBleHBlY3QoZmFtaWx5KS50b01hdGNoKC9eS2FUZVhfLyk7XG4gICAgICAvLyBObyBuZXR3b3JrOiBhIGRhdGEgVVJJLCBub3QgYSBwYXRoIG9yIGEgQ0ROIFVSTC5cbiAgICAgIGV4cGVjdChzcmMpLnRvTWF0Y2goL151cmxcXChkYXRhOmZvbnRcXC93b2ZmMjtiYXNlNjQsW0EtWmEtejAtOSsvPV0rXFwpIGZvcm1hdFxcKCd3b2ZmMidcXCkkLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgaW5zdGFsbGVkIG1hdGhsaXZlLCBzbyBnbHlwaCBtZXRyaWNzIG1hdGNoIHRoZSBlbmdpbmUnLCAoKSA9PiB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgZ2xvYmFsLXJlcXVpcmUgKi9cbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIGdsb2JhbC1yZXF1aXJlICovXG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIHJhdGhlciB0aGFuIHJlcXVpcmUoJ21hdGhsaXZlL3BhY2thZ2UuanNvbicpOiBNYXRoTGl2ZSdzXG4gICAgLy8gZXhwb3J0cyBtYXAgZG9lcyBub3QgZXhwb3NlIHRoYXQgc3VicGF0aC5cbiAgICBjb25zdCBtYW5pZmVzdCA9IFtcbiAgICAgIHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbWF0aGxpdmUvcGFja2FnZS5qc29uJyksXG4gICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4vbm9kZV9tb2R1bGVzL21hdGhsaXZlL3BhY2thZ2UuanNvbicpLFxuICAgIF0uZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG5cbiAgICBleHBlY3QobWFuaWZlc3QpLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KE1BVEhMSVZFX1ZFUlNJT04pLnRvRXF1YWwoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3QsICd1dGY4JykpLnZlcnNpb24pO1xuICB9KTtcblxuICBpdCgncmVnaXN0ZXJzIGV2ZXJ5IGZhY2Ugd2l0aCB0aGUgZG9jdW1lbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkZWQgPSBmYWtlRm9udFNldCgpO1xuXG4gICAgZXhwZWN0KHJlZ2lzdGVyRW1iZWRkZWRGb250cygpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChhZGRlZCkudG9IYXZlTGVuZ3RoKDIwKTtcbiAgICBleHBlY3QoYWRkZWQubWFwKChmKSA9PiBmLmZhbWlseSkpLnRvQ29udGFpbignS2FUZVhfTWFpbicpO1xuICAgIC8vIERlc2NyaXB0b3JzIHJpZGUgYWxvbmcsIG9yIGJvbGQvaXRhbGljIG1hdGggd291bGQgc3ludGhlc2lzZSBmcm9tIHJlZ3VsYXIuXG4gICAgZXhwZWN0KGFkZGVkLmZpbmQoKGYpID0+IGYuc3JjLnN0YXJ0c1dpdGgoJ3VybChkYXRhOicpICYmIGYuZGVzY3JpcHRvcnMud2VpZ2h0ID09PSAnYm9sZCcpKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgcmVnaXN0ZXIgdHdpY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkZWQgPSBmYWtlRm9udFNldCgpO1xuXG4gICAgcmVnaXN0ZXJFbWJlZGRlZEZvbnRzKCk7XG4gICAgcmVnaXN0ZXJFbWJlZGRlZEZvbnRzKCk7XG5cbiAgICBleHBlY3QoYWRkZWQpLnRvSGF2ZUxlbmd0aCgyMCk7XG4gIH0pO1xuXG4gIGl0KCdsZWF2ZXMgdGhlIGRvY3VtZW50IGFsb25lIHdoZW4gaXQgYWxyZWFkeSBwcm92aWRlcyBldmVyeSBmYW1pbHknLCAoKSA9PiB7XG4gICAgLy8gQSBob3N0IHRoYXQgc2VydmVzIHRoZSBmb250cyBpdHNlbGYgLSBjb25maWd1cmVGb250cywgb3IgaW1wb3J0aW5nXG4gICAgLy8gbWF0aGxpdmUvZm9udHMuY3NzIC0gd2lucy5cbiAgICBjb25zdCBhZGRlZCA9IGZha2VGb250U2V0KEVNQkVEREVEX0ZPTlRfRkFNSUxJRVMubWFwKChmYW1pbHkpID0+ICh7IGZhbWlseSB9KSkpO1xuXG4gICAgZXhwZWN0KHJlZ2lzdGVyRW1iZWRkZWRGb250cygpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChhZGRlZCkudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICBpdCgncmVwb3J0cyBmYWlsdXJlIGluc3RlYWQgb2YgdGhyb3dpbmcgd2hlbiB0aGUgRm9udEZhY2UgQVBJIGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgZmFrZUZvbnRTZXQoKTtcbiAgICBkZWxldGUgZ2xvYmFsLkZvbnRGYWNlO1xuXG4gICAgZXhwZWN0KHJlZ2lzdGVyRW1iZWRkZWRGb250cygpKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlcG9ydHMgZmFpbHVyZSBpbnN0ZWFkIG9mIHRocm93aW5nIHdoZW4gYSBmYWNlIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCcsICgpID0+IHtcbiAgICBmYWtlRm9udFNldCgpO1xuICAgIGdsb2JhbC5Gb250RmFjZSA9IGplc3QuZm4oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgZm9udCcpO1xuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlZ2lzdGVyRW1iZWRkZWRGb250cygpKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLFNBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFNO0VBQy9CLElBQU1DLGFBQWEsR0FBR0MsUUFBUSxDQUFDQyxLQUFLO0VBRXBDLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBQXNCO0lBQUEsSUFBbEJDLFFBQVEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsRUFBRTtJQUNoQyxJQUFNRyxLQUFLLEdBQUcsRUFBRTtJQUNoQixJQUFNQyxHQUFHLE9BQUFDLGdCQUFBO01BQ1BDLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFHQyxDQUFDO1FBQUEsT0FBS0osS0FBSyxDQUFDSyxJQUFJLENBQUNELENBQUMsQ0FBQztNQUFBO0lBQUEsR0FDeEJFLE1BQU0sQ0FBQ0MsUUFBUSxFQUFHO01BQUEsT0FBTVgsUUFBUSxDQUFDVSxNQUFNLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFBQSxFQUNyRDtJQUVEQyxNQUFNLENBQUNDLGNBQWMsQ0FBQ2hCLFFBQVEsRUFBRSxPQUFPLEVBQUU7TUFBRWlCLEtBQUssRUFBRVQsR0FBRztNQUFFVSxZQUFZLEVBQUU7SUFBSyxDQUFDLENBQUM7SUFFNUUsT0FBT1gsS0FBSztFQUNkLENBQUM7RUFFRFksVUFBVSxDQUFDLFlBQU07SUFDZixJQUFBQyxpQ0FBMEIsRUFBQyxDQUFDO0lBQzVCQyxNQUFNLENBQUNDLFFBQVEsR0FBR0MsSUFBSSxDQUFDQyxFQUFFLENBQUMsU0FBU0YsUUFBUUEsQ0FBQ0csTUFBTSxFQUFFQyxHQUFHLEVBQUVDLFdBQVcsRUFBRTtNQUNwRVosTUFBTSxDQUFDYSxNQUFNLENBQUMsSUFBSSxFQUFFO1FBQUVILE1BQU0sRUFBTkEsTUFBTTtRQUFFQyxHQUFHLEVBQUhBLEdBQUc7UUFBRUMsV0FBVyxFQUFYQTtNQUFZLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRkUsU0FBUyxDQUFDLFlBQU07SUFDZGQsTUFBTSxDQUFDQyxjQUFjLENBQUNoQixRQUFRLEVBQUUsT0FBTyxFQUFFO01BQUVpQixLQUFLLEVBQUVsQixhQUFhO01BQUVtQixZQUFZLEVBQUU7SUFBSyxDQUFDLENBQUM7SUFDdEYsT0FBT0csTUFBTSxDQUFDQyxRQUFRO0VBQ3hCLENBQUMsQ0FBQzs7RUFFRjtFQUNBO0VBQ0FRLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO0lBQ2hEQyxNQUFNLENBQUNDLDZCQUFzQixDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FDM0MsQ0FDRSxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixZQUFZLEVBQ1osWUFBWSxFQUNaLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsYUFBYSxFQUNiLGtCQUFrQixDQUNuQixDQUFDRCxJQUFJLENBQUMsQ0FDVCxDQUFDO0VBQ0gsQ0FBQyxDQUFDO0VBRUZILEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxZQUFNO0lBQzNEQyxNQUFNLENBQUNJLHdCQUFjLENBQUMsQ0FBQ0MsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUV2Q0Qsd0JBQWMsQ0FBQ0UsT0FBTyxDQUFDLFVBQUFDLElBQUEsRUFBcUI7TUFBQSxJQUFsQmIsTUFBTSxHQUFBYSxJQUFBLENBQU5iLE1BQU07UUFBRUMsR0FBRyxHQUFBWSxJQUFBLENBQUhaLEdBQUc7TUFDbkNLLE1BQU0sQ0FBQ04sTUFBTSxDQUFDLENBQUNjLE9BQU8sQ0FBQyxTQUFTLENBQUM7TUFDakM7TUFDQVIsTUFBTSxDQUFDTCxHQUFHLENBQUMsQ0FBQ2EsT0FBTyxDQUFDLG9FQUFvRSxDQUFDO0lBQzNGLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGVCxFQUFFLENBQUMsNkVBQTZFLEVBQUUsWUFBTTtJQUN0RjtJQUNBLElBQU1VLEVBQUUsR0FBRzVDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDeEIsSUFBTTZDLElBQUksR0FBRzdDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDNUI7O0lBRUE7SUFDQTtJQUNBLElBQU04QyxRQUFRLEdBQUcsQ0FDZkQsSUFBSSxDQUFDRSxPQUFPLENBQUNDLFNBQVMsRUFBRSxnREFBZ0QsQ0FBQyxFQUN6RUgsSUFBSSxDQUFDRSxPQUFPLENBQUNDLFNBQVMsRUFBRSwwQ0FBMEMsQ0FBQyxDQUNwRSxDQUFDQyxJQUFJLENBQUMsVUFBQ0MsQ0FBQztNQUFBLE9BQUtOLEVBQUUsQ0FBQ08sVUFBVSxDQUFDRCxDQUFDLENBQUM7SUFBQSxFQUFDO0lBRS9CZixNQUFNLENBQUNXLFFBQVEsQ0FBQyxDQUFDTSxXQUFXLENBQUMsQ0FBQztJQUM5QmpCLE1BQU0sQ0FBQ2tCLDBCQUFnQixDQUFDLENBQUNmLE9BQU8sQ0FBQ2dCLElBQUksQ0FBQ0MsS0FBSyxDQUFDWCxFQUFFLENBQUNZLFlBQVksQ0FBQ1YsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUNXLE9BQU8sQ0FBQztFQUN6RixDQUFDLENBQUM7RUFFRnZCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxZQUFNO0lBQ2pELElBQU12QixLQUFLLEdBQUdMLFdBQVcsQ0FBQyxDQUFDO0lBRTNCNkIsTUFBTSxDQUFDLElBQUF1Qiw0QkFBcUIsRUFBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMxQ3hCLE1BQU0sQ0FBQ3hCLEtBQUssQ0FBQyxDQUFDNkIsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUM5QkwsTUFBTSxDQUFDeEIsS0FBSyxDQUFDaUQsR0FBRyxDQUFDLFVBQUM3QyxDQUFDO01BQUEsT0FBS0EsQ0FBQyxDQUFDYyxNQUFNO0lBQUEsRUFBQyxDQUFDLENBQUNnQyxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQzFEO0lBQ0ExQixNQUFNLENBQUN4QixLQUFLLENBQUNzQyxJQUFJLENBQUMsVUFBQ2xDLENBQUM7TUFBQSxPQUFLQSxDQUFDLENBQUNlLEdBQUcsQ0FBQ2dDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSS9DLENBQUMsQ0FBQ2dCLFdBQVcsQ0FBQ2dDLE1BQU0sS0FBSyxNQUFNO0lBQUEsRUFBQyxDQUFDLENBQUNYLFdBQVcsQ0FBQyxDQUFDO0VBQzNHLENBQUMsQ0FBQztFQUVGbEIsRUFBRSxDQUFDLHlCQUF5QixFQUFFLFlBQU07SUFDbEMsSUFBTXZCLEtBQUssR0FBR0wsV0FBVyxDQUFDLENBQUM7SUFFM0IsSUFBQW9ELDRCQUFxQixFQUFDLENBQUM7SUFDdkIsSUFBQUEsNEJBQXFCLEVBQUMsQ0FBQztJQUV2QnZCLE1BQU0sQ0FBQ3hCLEtBQUssQ0FBQyxDQUFDNkIsWUFBWSxDQUFDLEVBQUUsQ0FBQztFQUNoQyxDQUFDLENBQUM7RUFFRk4sRUFBRSxDQUFDLGlFQUFpRSxFQUFFLFlBQU07SUFDMUU7SUFDQTtJQUNBLElBQU12QixLQUFLLEdBQUdMLFdBQVcsQ0FBQzhCLDZCQUFzQixDQUFDd0IsR0FBRyxDQUFDLFVBQUMvQixNQUFNO01BQUEsT0FBTTtRQUFFQSxNQUFNLEVBQU5BO01BQU8sQ0FBQztJQUFBLENBQUMsQ0FBQyxDQUFDO0lBRS9FTSxNQUFNLENBQUMsSUFBQXVCLDRCQUFxQixFQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzFDeEIsTUFBTSxDQUFDeEIsS0FBSyxDQUFDLENBQUM2QixZQUFZLENBQUMsQ0FBQyxDQUFDO0VBQy9CLENBQUMsQ0FBQztFQUVGTixFQUFFLENBQUMsc0VBQXNFLEVBQUUsWUFBTTtJQUMvRTVCLFdBQVcsQ0FBQyxDQUFDO0lBQ2IsT0FBT21CLE1BQU0sQ0FBQ0MsUUFBUTtJQUV0QlMsTUFBTSxDQUFDLElBQUF1Qiw0QkFBcUIsRUFBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUM3QyxDQUFDLENBQUM7RUFFRnpCLEVBQUUsQ0FBQyx1RUFBdUUsRUFBRSxZQUFNO0lBQ2hGNUIsV0FBVyxDQUFDLENBQUM7SUFDYm1CLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxZQUFNO01BQzlCLE1BQU0sSUFBSW9DLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0lBRUY3QixNQUFNLENBQUMsSUFBQXVCLDRCQUFxQixFQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsS0FBSyxDQUFDO0VBQzdDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|