@pie-lib/math-input-mathlive 1.1.5-beta.9 → 2.0.1-next.20261109072207
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -109
- package/dist/_virtual/_rolldown/runtime.js +11 -0
- package/dist/horizontal-keypad.d.ts +22 -0
- package/dist/horizontal-keypad.js +54 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +12 -0
- package/dist/keypad/index.d.ts +40 -0
- package/dist/keypad/index.js +245 -0
- package/dist/keypad/keys-layout.d.ts +7 -0
- package/dist/keypad/keys-layout.js +5 -0
- package/dist/keys/basic-operators.d.ts +5 -0
- package/dist/keys/basic-operators.js +30 -0
- package/dist/keys/chars.d.ts +5 -0
- package/dist/keys/comparison.d.ts +4 -0
- package/dist/keys/comparison.js +32 -0
- package/dist/keys/constants.d.ts +4 -0
- package/dist/keys/constants.js +35 -0
- package/dist/keys/digits.d.ts +15 -0
- package/dist/keys/digits.js +34 -0
- package/dist/keys/edit.d.ts +6 -0
- package/dist/keys/edit.js +9 -0
- package/dist/keys/exponent.d.ts +4 -0
- package/dist/keys/exponent.js +28 -0
- package/dist/keys/fractions.d.ts +3 -0
- package/dist/keys/fractions.js +27 -0
- package/dist/keys/geometry.d.ts +23 -0
- package/dist/keys/geometry.js +127 -0
- package/dist/keys/grades.d.ts +9 -0
- package/dist/keys/grades.js +414 -0
- package/dist/keys/index.d.ts +6 -0
- package/dist/keys/index.js +50 -0
- package/dist/keys/log.d.ts +3 -0
- package/dist/keys/log.js +25 -0
- package/dist/keys/logic.d.ts +2 -0
- package/dist/keys/logic.js +13 -0
- package/dist/keys/matrices.d.ts +2 -0
- package/dist/keys/matrices.js +17 -0
- package/dist/keys/misc.d.ts +10 -0
- package/dist/keys/misc.js +60 -0
- package/dist/keys/navigation.d.ts +2 -0
- package/dist/keys/navigation.js +13 -0
- package/dist/keys/operators.d.ts +1 -0
- package/dist/keys/operators.js +11 -0
- package/dist/keys/statistics.d.ts +5 -0
- package/dist/keys/statistics.js +38 -0
- package/dist/keys/sub-sup.d.ts +2 -0
- package/dist/keys/sub-sup.js +17 -0
- package/dist/keys/trigonometry.d.ts +6 -0
- package/dist/keys/trigonometry.js +43 -0
- package/dist/keys/utils.d.ts +5 -0
- package/dist/keys/utils.js +24 -0
- package/dist/keys/vars.d.ts +3 -0
- package/dist/keys/vars.js +22 -0
- package/dist/latex-bridge.d.ts +197 -0
- package/dist/latex-bridge.js +210 -0
- package/dist/longdiv.d.ts +24 -0
- package/dist/longdiv.js +43 -0
- package/dist/math-input.d.ts +26 -0
- package/dist/math-input.js +74 -0
- package/dist/mathlive-instance.d.ts +221 -0
- package/dist/mathlive-instance.js +159 -0
- package/dist/mf/common-styles.d.ts +594 -0
- package/dist/mf/common-styles.js +80 -0
- package/dist/mf/field-label.d.ts +16 -0
- package/dist/mf/field-label.js +13 -0
- package/dist/mf/index.d.ts +4 -0
- package/dist/mf/index.js +21 -0
- package/dist/mf/input.d.ts +94 -0
- package/dist/mf/input.js +127 -0
- package/dist/mf/static.d.ts +143 -0
- package/dist/mf/static.js +230 -0
- package/dist/selection.d.ts +43 -0
- package/dist/selection.js +39 -0
- package/package.json +32 -18
- package/lib/__tests__/composites.test.js +0 -255
- package/lib/__tests__/drop-in-compat.test.js +0 -133
- package/lib/__tests__/embedded-fonts.test.js +0 -121
- package/lib/__tests__/index.test.js +0 -118
- package/lib/__tests__/input-imperative.test.js +0 -155
- package/lib/__tests__/keypad-label.test.js +0 -231
- package/lib/__tests__/keypad-render.test.js +0 -206
- package/lib/__tests__/latex-bridge.test.js +0 -386
- package/lib/__tests__/mathlive-instance.test.js +0 -419
- package/lib/__tests__/mount-race.test.js +0 -218
- package/lib/__tests__/static-prompts.test.js +0 -405
- package/lib/__tests__/tmp-markup.test.js +0 -26
- package/lib/horizontal-keypad.js +0 -101
- package/lib/horizontal-keypad.js.map +0 -1
- package/lib/index.js +0 -143
- package/lib/index.js.map +0 -1
- package/lib/keypad/index.js +0 -431
- package/lib/keypad/index.js.map +0 -1
- package/lib/keypad/keys-layout.js +0 -22
- package/lib/keypad/keys-layout.js.map +0 -1
- package/lib/keys/basic-operators.js +0 -33
- package/lib/keys/basic-operators.js.map +0 -1
- package/lib/keys/chars.js +0 -12
- package/lib/keys/chars.js.map +0 -1
- package/lib/keys/comparison.js +0 -39
- package/lib/keys/comparison.js.map +0 -1
- package/lib/keys/constants.js +0 -37
- package/lib/keys/constants.js.map +0 -1
- package/lib/keys/digits.js +0 -46
- package/lib/keys/digits.js.map +0 -1
- package/lib/keys/edit.js +0 -14
- package/lib/keys/edit.js.map +0 -1
- package/lib/keys/exponent.js +0 -30
- package/lib/keys/exponent.js.map +0 -1
- package/lib/keys/fractions.js +0 -29
- package/lib/keys/fractions.js.map +0 -1
- package/lib/keys/geometry.js +0 -143
- package/lib/keys/geometry.js.map +0 -1
- package/lib/keys/grades.js +0 -259
- package/lib/keys/grades.js.map +0 -1
- package/lib/keys/index.js +0 -35
- package/lib/keys/index.js.map +0 -1
- package/lib/keys/log.js +0 -27
- package/lib/keys/log.js.map +0 -1
- package/lib/keys/logic.js +0 -19
- package/lib/keys/logic.js.map +0 -1
- package/lib/keys/matrices.js +0 -19
- package/lib/keys/matrices.js.map +0 -1
- package/lib/keys/misc.js +0 -69
- package/lib/keys/misc.js.map +0 -1
- package/lib/keys/navigation.js +0 -20
- package/lib/keys/navigation.js.map +0 -1
- package/lib/keys/operators.js +0 -15
- package/lib/keys/operators.js.map +0 -1
- package/lib/keys/statistics.js +0 -40
- package/lib/keys/statistics.js.map +0 -1
- package/lib/keys/sub-sup.js +0 -19
- package/lib/keys/sub-sup.js.map +0 -1
- package/lib/keys/trigonometry.js +0 -45
- package/lib/keys/trigonometry.js.map +0 -1
- package/lib/keys/utils.js +0 -87
- package/lib/keys/utils.js.map +0 -1
- package/lib/keys/vars.js +0 -24
- package/lib/keys/vars.js.map +0 -1
- package/lib/latex-bridge.js +0 -508
- package/lib/latex-bridge.js.map +0 -1
- package/lib/math-input.js +0 -143
- package/lib/math-input.js.map +0 -1
- package/lib/mathlive-instance.js +0 -585
- package/lib/mathlive-instance.js.map +0 -1
- package/lib/mf/common-styles.js +0 -203
- package/lib/mf/common-styles.js.map +0 -1
- package/lib/mf/index.js +0 -84
- package/lib/mf/index.js.map +0 -1
- package/lib/mf/input.js +0 -364
- package/lib/mf/input.js.map +0 -1
- package/lib/mf/static.js +0 -500
- package/lib/mf/static.js.map +0 -1
- package/src/__tests__/composites.test.jsx +0 -220
- package/src/__tests__/drop-in-compat.test.jsx +0 -112
- package/src/__tests__/index.test.jsx +0 -109
- package/src/__tests__/input-imperative.test.jsx +0 -144
- package/src/__tests__/keypad-label.test.jsx +0 -283
- package/src/__tests__/keypad-render.test.jsx +0 -123
- package/src/__tests__/latex-bridge.test.js +0 -389
- package/src/__tests__/mathlive-instance.test.js +0 -418
- package/src/__tests__/mount-race.test.jsx +0 -142
- package/src/__tests__/static-prompts.test.jsx +0 -364
- package/src/horizontal-keypad.jsx +0 -73
- package/src/index.jsx +0 -63
- package/src/keypad/index.jsx +0 -386
- package/src/keypad/keys-layout.js +0 -16
- package/src/keys/basic-operators.js +0 -32
- package/src/keys/chars.js +0 -5
- package/src/keys/comparison.js +0 -28
- package/src/keys/constants.js +0 -35
- package/src/keys/digits.js +0 -40
- package/src/keys/edit.js +0 -3
- package/src/keys/exponent.js +0 -28
- package/src/keys/fractions.js +0 -26
- package/src/keys/geometry.js +0 -149
- package/src/keys/grades.js +0 -367
- package/src/keys/index.js +0 -20
- package/src/keys/log.js +0 -22
- package/src/keys/logic.js +0 -15
- package/src/keys/matrices.js +0 -15
- package/src/keys/misc.js +0 -71
- package/src/keys/navigation.js +0 -8
- package/src/keys/operators.js +0 -10
- package/src/keys/statistics.js +0 -38
- package/src/keys/sub-sup.js +0 -15
- package/src/keys/trigonometry.js +0 -15
- package/src/keys/utils.js +0 -66
- package/src/keys/vars.js +0 -19
- package/src/latex-bridge.js +0 -524
- package/src/math-input.jsx +0 -115
- package/src/mathlive-instance.js +0 -582
- package/src/mf/common-styles.js +0 -210
- package/src/mf/index.js +0 -30
- package/src/mf/input.jsx +0 -319
- package/src/mf/static.jsx +0 -479
|
@@ -1,218 +0,0 @@
|
|
|
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 _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
7
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
8
|
-
var _input = _interopRequireDefault(require("../mf/input"));
|
|
9
|
-
/**
|
|
10
|
-
* MathLive loads asynchronously, so `componentDidMount` resumes after an await
|
|
11
|
-
* before appending a <math-field>. Two orderings must both hold:
|
|
12
|
-
*
|
|
13
|
-
* - StrictMode dev double-mount (mount -> unmount -> mount on the SAME
|
|
14
|
-
* instance) must end up with exactly ONE field. A boolean "unmounted" flag
|
|
15
|
-
* latches here and blocks the remount entirely - which is why this uses a
|
|
16
|
-
* generation counter.
|
|
17
|
-
* - A genuine unmount while the load is in flight must append nothing.
|
|
18
|
-
*
|
|
19
|
-
* MathLive cannot load under jsdom, so it is mocked with a minimal stub in
|
|
20
|
-
* order to actually count appended fields.
|
|
21
|
-
*/
|
|
22
|
-
jest.mock('../mathlive-instance', function () {
|
|
23
|
-
// Must be a real DOM node: the component uses replaceChildren(), which
|
|
24
|
-
// rejects anything that is not a Node. Returning an element from the
|
|
25
|
-
// constructor replaces `this`, so callers get a genuine <math-field>.
|
|
26
|
-
var FakeMathfieldElement = /*#__PURE__*/(0, _createClass2["default"])(function FakeMathfieldElement() {
|
|
27
|
-
(0, _classCallCheck2["default"])(this, FakeMathfieldElement);
|
|
28
|
-
// `global` rather than `document`: jest forbids out-of-scope variables in
|
|
29
|
-
// a mock factory, and `global` is on its allow-list.
|
|
30
|
-
var el = global.document.createElement('math-field');
|
|
31
|
-
el.value = '';
|
|
32
|
-
el.getValue = function () {
|
|
33
|
-
return el.value;
|
|
34
|
-
};
|
|
35
|
-
return el;
|
|
36
|
-
});
|
|
37
|
-
return {
|
|
38
|
-
loadMathLive: function loadMathLive() {
|
|
39
|
-
return Promise.resolve({
|
|
40
|
-
MathfieldElement: FakeMathfieldElement
|
|
41
|
-
});
|
|
42
|
-
},
|
|
43
|
-
getMacros: function getMacros() {
|
|
44
|
-
return {};
|
|
45
|
-
},
|
|
46
|
-
// must mirror the real export, otherwise the component sets `undefined`
|
|
47
|
-
MATH_MODE_SPACE: '\\ ',
|
|
48
|
-
applyShadowStyles: function applyShadowStyles() {},
|
|
49
|
-
trackPlaceholderCaret: function trackPlaceholderCaret() {
|
|
50
|
-
return function () {};
|
|
51
|
-
},
|
|
52
|
-
latexToMarkup: function latexToMarkup(l) {
|
|
53
|
-
return "<span>".concat(l, "</span>");
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// eslint-disable-next-line import/first
|
|
59
|
-
|
|
60
|
-
var holderFor = function holderFor(cmp) {
|
|
61
|
-
var el = document.createElement('span');
|
|
62
|
-
cmp.holderRef = {
|
|
63
|
-
current: el
|
|
64
|
-
};
|
|
65
|
-
return el;
|
|
66
|
-
};
|
|
67
|
-
var fieldCount = function fieldCount(el) {
|
|
68
|
-
return Array.from(el.childNodes).filter(function (n) {
|
|
69
|
-
return n.tagName === 'MATH-FIELD';
|
|
70
|
-
}).length;
|
|
71
|
-
};
|
|
72
|
-
describe('async mount race', function () {
|
|
73
|
-
it('StrictMode mount -> unmount -> mount yields exactly one field', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
74
|
-
var input, el, first, second;
|
|
75
|
-
return _regenerator["default"].wrap(function (_context) {
|
|
76
|
-
while (1) switch (_context.prev = _context.next) {
|
|
77
|
-
case 0:
|
|
78
|
-
input = new _input["default"]({});
|
|
79
|
-
el = holderFor(input);
|
|
80
|
-
first = input.componentDidMount();
|
|
81
|
-
input.componentWillUnmount();
|
|
82
|
-
second = input.componentDidMount();
|
|
83
|
-
_context.next = 1;
|
|
84
|
-
return Promise.all([first, second]);
|
|
85
|
-
case 1:
|
|
86
|
-
expect(fieldCount(el)).toBe(1);
|
|
87
|
-
expect(input.mathField).toBeDefined();
|
|
88
|
-
case 2:
|
|
89
|
-
case "end":
|
|
90
|
-
return _context.stop();
|
|
91
|
-
}
|
|
92
|
-
}, _callee);
|
|
93
|
-
})));
|
|
94
|
-
it('appends nothing when unmounted while the load is in flight', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
95
|
-
var input, el, pending;
|
|
96
|
-
return _regenerator["default"].wrap(function (_context2) {
|
|
97
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
98
|
-
case 0:
|
|
99
|
-
input = new _input["default"]({});
|
|
100
|
-
el = holderFor(input);
|
|
101
|
-
pending = input.componentDidMount();
|
|
102
|
-
input.componentWillUnmount();
|
|
103
|
-
_context2.next = 1;
|
|
104
|
-
return pending;
|
|
105
|
-
case 1:
|
|
106
|
-
expect(fieldCount(el)).toBe(0);
|
|
107
|
-
expect(input.mathField).toBeUndefined();
|
|
108
|
-
case 2:
|
|
109
|
-
case "end":
|
|
110
|
-
return _context2.stop();
|
|
111
|
-
}
|
|
112
|
-
}, _callee2);
|
|
113
|
-
})));
|
|
114
|
-
it('a normal single mount creates the field', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
115
|
-
var input, el;
|
|
116
|
-
return _regenerator["default"].wrap(function (_context3) {
|
|
117
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
118
|
-
case 0:
|
|
119
|
-
input = new _input["default"]({});
|
|
120
|
-
el = holderFor(input);
|
|
121
|
-
_context3.next = 1;
|
|
122
|
-
return input.componentDidMount();
|
|
123
|
-
case 1:
|
|
124
|
-
expect(fieldCount(el)).toBe(1);
|
|
125
|
-
case 2:
|
|
126
|
-
case "end":
|
|
127
|
-
return _context3.stop();
|
|
128
|
-
}
|
|
129
|
-
}, _callee3);
|
|
130
|
-
})));
|
|
131
|
-
it('repeated mounts never accumulate fields', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
132
|
-
var input, el;
|
|
133
|
-
return _regenerator["default"].wrap(function (_context4) {
|
|
134
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
135
|
-
case 0:
|
|
136
|
-
input = new _input["default"]({});
|
|
137
|
-
el = holderFor(input);
|
|
138
|
-
_context4.next = 1;
|
|
139
|
-
return input.componentDidMount();
|
|
140
|
-
case 1:
|
|
141
|
-
_context4.next = 2;
|
|
142
|
-
return input.componentDidMount();
|
|
143
|
-
case 2:
|
|
144
|
-
_context4.next = 3;
|
|
145
|
-
return input.componentDidMount();
|
|
146
|
-
case 3:
|
|
147
|
-
expect(fieldCount(el)).toBe(1);
|
|
148
|
-
case 4:
|
|
149
|
-
case "end":
|
|
150
|
-
return _context4.stop();
|
|
151
|
-
}
|
|
152
|
-
}, _callee4);
|
|
153
|
-
})));
|
|
154
|
-
|
|
155
|
-
// MathLive's mathModeSpace defaults to '', which makes the spacebar a no-op.
|
|
156
|
-
it('configures the spacebar so a space can be typed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
157
|
-
var input;
|
|
158
|
-
return _regenerator["default"].wrap(function (_context5) {
|
|
159
|
-
while (1) switch (_context5.prev = _context5.next) {
|
|
160
|
-
case 0:
|
|
161
|
-
input = new _input["default"]({});
|
|
162
|
-
holderFor(input);
|
|
163
|
-
_context5.next = 1;
|
|
164
|
-
return input.componentDidMount();
|
|
165
|
-
case 1:
|
|
166
|
-
// a LaTeX control space - what MathQuill produced, and MathJax understands
|
|
167
|
-
expect(input.mathField.mathModeSpace).toEqual('\\ ');
|
|
168
|
-
expect(input.mathField.mathModeSpace).not.toEqual('');
|
|
169
|
-
case 2:
|
|
170
|
-
case "end":
|
|
171
|
-
return _context5.stop();
|
|
172
|
-
}
|
|
173
|
-
}, _callee5);
|
|
174
|
-
})));
|
|
175
|
-
|
|
176
|
-
// MathLive leaves a superscript after one digit by default (`smartSuperscript`),
|
|
177
|
-
// so x^23 / 10^6 cannot be typed.
|
|
178
|
-
it('stays in the exponent after a digit instead of jumping out', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
179
|
-
var input;
|
|
180
|
-
return _regenerator["default"].wrap(function (_context6) {
|
|
181
|
-
while (1) switch (_context6.prev = _context6.next) {
|
|
182
|
-
case 0:
|
|
183
|
-
input = new _input["default"]({});
|
|
184
|
-
holderFor(input);
|
|
185
|
-
_context6.next = 1;
|
|
186
|
-
return input.componentDidMount();
|
|
187
|
-
case 1:
|
|
188
|
-
expect(input.mathField.smartSuperscript).toBe(false);
|
|
189
|
-
case 2:
|
|
190
|
-
case "end":
|
|
191
|
-
return _context6.stop();
|
|
192
|
-
}
|
|
193
|
-
}, _callee6);
|
|
194
|
-
})));
|
|
195
|
-
it('reports itself through innerRef on mount and clears it on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
196
|
-
var innerRef, input;
|
|
197
|
-
return _regenerator["default"].wrap(function (_context7) {
|
|
198
|
-
while (1) switch (_context7.prev = _context7.next) {
|
|
199
|
-
case 0:
|
|
200
|
-
innerRef = jest.fn();
|
|
201
|
-
input = new _input["default"]({
|
|
202
|
-
innerRef: innerRef
|
|
203
|
-
});
|
|
204
|
-
holderFor(input);
|
|
205
|
-
_context7.next = 1;
|
|
206
|
-
return input.componentDidMount();
|
|
207
|
-
case 1:
|
|
208
|
-
expect(innerRef).toHaveBeenCalledWith(input);
|
|
209
|
-
input.componentWillUnmount();
|
|
210
|
-
expect(innerRef).toHaveBeenLastCalledWith(null);
|
|
211
|
-
case 2:
|
|
212
|
-
case "end":
|
|
213
|
-
return _context7.stop();
|
|
214
|
-
}
|
|
215
|
-
}, _callee7);
|
|
216
|
-
})));
|
|
217
|
-
});
|
|
218
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5wdXQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImplc3QiLCJtb2NrIiwiRmFrZU1hdGhmaWVsZEVsZW1lbnQiLCJfY3JlYXRlQ2xhc3MyIiwiX2NsYXNzQ2FsbENoZWNrMiIsImVsIiwiZ2xvYmFsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidmFsdWUiLCJnZXRWYWx1ZSIsImxvYWRNYXRoTGl2ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiTWF0aGZpZWxkRWxlbWVudCIsImdldE1hY3JvcyIsIk1BVEhfTU9ERV9TUEFDRSIsImFwcGx5U2hhZG93U3R5bGVzIiwidHJhY2tQbGFjZWhvbGRlckNhcmV0IiwibGF0ZXhUb01hcmt1cCIsImwiLCJjb25jYXQiLCJob2xkZXJGb3IiLCJjbXAiLCJob2xkZXJSZWYiLCJjdXJyZW50IiwiZmllbGRDb3VudCIsIkFycmF5IiwiZnJvbSIsImNoaWxkTm9kZXMiLCJmaWx0ZXIiLCJuIiwidGFnTmFtZSIsImxlbmd0aCIsImRlc2NyaWJlIiwiaXQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImlucHV0IiwiZmlyc3QiLCJzZWNvbmQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIklucHV0IiwiY29tcG9uZW50RGlkTW91bnQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImFsbCIsImV4cGVjdCIsInRvQmUiLCJtYXRoRmllbGQiLCJ0b0JlRGVmaW5lZCIsInN0b3AiLCJfY2FsbGVlMiIsInBlbmRpbmciLCJfY29udGV4dDIiLCJ0b0JlVW5kZWZpbmVkIiwiX2NhbGxlZTMiLCJfY29udGV4dDMiLCJfY2FsbGVlNCIsIl9jb250ZXh0NCIsIl9jYWxsZWU1IiwiX2NvbnRleHQ1IiwibWF0aE1vZGVTcGFjZSIsInRvRXF1YWwiLCJub3QiLCJfY2FsbGVlNiIsIl9jb250ZXh0NiIsInNtYXJ0U3VwZXJzY3JpcHQiLCJfY2FsbGVlNyIsImlubmVyUmVmIiwiX2NvbnRleHQ3IiwiZm4iLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbW91bnQtcmFjZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hdGhMaXZlIGxvYWRzIGFzeW5jaHJvbm91c2x5LCBzbyBgY29tcG9uZW50RGlkTW91bnRgIHJlc3VtZXMgYWZ0ZXIgYW4gYXdhaXRcbiAqIGJlZm9yZSBhcHBlbmRpbmcgYSA8bWF0aC1maWVsZD4uIFR3byBvcmRlcmluZ3MgbXVzdCBib3RoIGhvbGQ6XG4gKlxuICogIC0gU3RyaWN0TW9kZSBkZXYgZG91YmxlLW1vdW50IChtb3VudCAtPiB1bm1vdW50IC0+IG1vdW50IG9uIHRoZSBTQU1FXG4gKiAgICBpbnN0YW5jZSkgbXVzdCBlbmQgdXAgd2l0aCBleGFjdGx5IE9ORSBmaWVsZC4gQSBib29sZWFuIFwidW5tb3VudGVkXCIgZmxhZ1xuICogICAgbGF0Y2hlcyBoZXJlIGFuZCBibG9ja3MgdGhlIHJlbW91bnQgZW50aXJlbHkgLSB3aGljaCBpcyB3aHkgdGhpcyB1c2VzIGFcbiAqICAgIGdlbmVyYXRpb24gY291bnRlci5cbiAqICAtIEEgZ2VudWluZSB1bm1vdW50IHdoaWxlIHRoZSBsb2FkIGlzIGluIGZsaWdodCBtdXN0IGFwcGVuZCBub3RoaW5nLlxuICpcbiAqIE1hdGhMaXZlIGNhbm5vdCBsb2FkIHVuZGVyIGpzZG9tLCBzbyBpdCBpcyBtb2NrZWQgd2l0aCBhIG1pbmltYWwgc3R1YiBpblxuICogb3JkZXIgdG8gYWN0dWFsbHkgY291bnQgYXBwZW5kZWQgZmllbGRzLlxuICovXG5qZXN0Lm1vY2soJy4uL21hdGhsaXZlLWluc3RhbmNlJywgKCkgPT4ge1xuICAvLyBNdXN0IGJlIGEgcmVhbCBET00gbm9kZTogdGhlIGNvbXBvbmVudCB1c2VzIHJlcGxhY2VDaGlsZHJlbigpLCB3aGljaFxuICAvLyByZWplY3RzIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgTm9kZS4gUmV0dXJuaW5nIGFuIGVsZW1lbnQgZnJvbSB0aGVcbiAgLy8gY29uc3RydWN0b3IgcmVwbGFjZXMgYHRoaXNgLCBzbyBjYWxsZXJzIGdldCBhIGdlbnVpbmUgPG1hdGgtZmllbGQ+LlxuICBjbGFzcyBGYWtlTWF0aGZpZWxkRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAvLyBgZ2xvYmFsYCByYXRoZXIgdGhhbiBgZG9jdW1lbnRgOiBqZXN0IGZvcmJpZHMgb3V0LW9mLXNjb3BlIHZhcmlhYmxlcyBpblxuICAgICAgLy8gYSBtb2NrIGZhY3RvcnksIGFuZCBgZ2xvYmFsYCBpcyBvbiBpdHMgYWxsb3ctbGlzdC5cbiAgICAgIGNvbnN0IGVsID0gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21hdGgtZmllbGQnKTtcblxuICAgICAgZWwudmFsdWUgPSAnJztcbiAgICAgIGVsLmdldFZhbHVlID0gKCkgPT4gZWwudmFsdWU7XG5cbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvYWRNYXRoTGl2ZTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgTWF0aGZpZWxkRWxlbWVudDogRmFrZU1hdGhmaWVsZEVsZW1lbnQgfSksXG4gICAgZ2V0TWFjcm9zOiAoKSA9PiAoe30pLFxuICAgIC8vIG11c3QgbWlycm9yIHRoZSByZWFsIGV4cG9ydCwgb3RoZXJ3aXNlIHRoZSBjb21wb25lbnQgc2V0cyBgdW5kZWZpbmVkYFxuICAgIE1BVEhfTU9ERV9TUEFDRTogJ1xcXFwgJyxcbiAgICBhcHBseVNoYWRvd1N0eWxlczogKCkgPT4ge30sXG4gICAgdHJhY2tQbGFjZWhvbGRlckNhcmV0OiAoKSA9PiAoKSA9PiB7fSxcbiAgICBsYXRleFRvTWFya3VwOiAobCkgPT4gYDxzcGFuPiR7bH08L3NwYW4+YCxcbiAgfTtcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2ZpcnN0XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vbWYvaW5wdXQnO1xuXG5jb25zdCBob2xkZXJGb3IgPSAoY21wKSA9PiB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXG4gIGNtcC5ob2xkZXJSZWYgPSB7IGN1cnJlbnQ6IGVsIH07XG5cbiAgcmV0dXJuIGVsO1xufTtcblxuY29uc3QgZmllbGRDb3VudCA9IChlbCkgPT4gQXJyYXkuZnJvbShlbC5jaGlsZE5vZGVzKS5maWx0ZXIoKG4pID0+IG4udGFnTmFtZSA9PT0gJ01BVEgtRklFTEQnKS5sZW5ndGg7XG5cbmRlc2NyaWJlKCdhc3luYyBtb3VudCByYWNlJywgKCkgPT4ge1xuICBpdCgnU3RyaWN0TW9kZSBtb3VudCAtPiB1bm1vdW50IC0+IG1vdW50IHlpZWxkcyBleGFjdGx5IG9uZSBmaWVsZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG4gICAgY29uc3QgZWwgPSBob2xkZXJGb3IoaW5wdXQpO1xuXG4gICAgY29uc3QgZmlyc3QgPSBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgaW5wdXQuY29tcG9uZW50V2lsbFVubW91bnQoKTtcblxuICAgIGNvbnN0IHNlY29uZCA9IGlucHV0LmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbZmlyc3QsIHNlY29uZF0pO1xuXG4gICAgZXhwZWN0KGZpZWxkQ291bnQoZWwpKS50b0JlKDEpO1xuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBlbmRzIG5vdGhpbmcgd2hlbiB1bm1vdW50ZWQgd2hpbGUgdGhlIGxvYWQgaXMgaW4gZmxpZ2h0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcbiAgICBjb25zdCBlbCA9IGhvbGRlckZvcihpbnB1dCk7XG5cbiAgICBjb25zdCBwZW5kaW5nID0gaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGlucHV0LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG5cbiAgICBhd2FpdCBwZW5kaW5nO1xuXG4gICAgZXhwZWN0KGZpZWxkQ291bnQoZWwpKS50b0JlKDApO1xuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2Egbm9ybWFsIHNpbmdsZSBtb3VudCBjcmVhdGVzIHRoZSBmaWVsZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG4gICAgY29uc3QgZWwgPSBob2xkZXJGb3IoaW5wdXQpO1xuXG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGV4cGVjdChmaWVsZENvdW50KGVsKSkudG9CZSgxKTtcbiAgfSk7XG5cbiAgaXQoJ3JlcGVhdGVkIG1vdW50cyBuZXZlciBhY2N1bXVsYXRlIGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG4gICAgY29uc3QgZWwgPSBob2xkZXJGb3IoaW5wdXQpO1xuXG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIGF3YWl0IGlucHV0LmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICBleHBlY3QoZmllbGRDb3VudChlbCkpLnRvQmUoMSk7XG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlJ3MgbWF0aE1vZGVTcGFjZSBkZWZhdWx0cyB0byAnJywgd2hpY2ggbWFrZXMgdGhlIHNwYWNlYmFyIGEgbm8tb3AuXG4gIGl0KCdjb25maWd1cmVzIHRoZSBzcGFjZWJhciBzbyBhIHNwYWNlIGNhbiBiZSB0eXBlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG5cbiAgICBob2xkZXJGb3IoaW5wdXQpO1xuICAgIGF3YWl0IGlucHV0LmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICAvLyBhIExhVGVYIGNvbnRyb2wgc3BhY2UgLSB3aGF0IE1hdGhRdWlsbCBwcm9kdWNlZCwgYW5kIE1hdGhKYXggdW5kZXJzdGFuZHNcbiAgICBleHBlY3QoaW5wdXQubWF0aEZpZWxkLm1hdGhNb2RlU3BhY2UpLnRvRXF1YWwoJ1xcXFwgJyk7XG4gICAgZXhwZWN0KGlucHV0Lm1hdGhGaWVsZC5tYXRoTW9kZVNwYWNlKS5ub3QudG9FcXVhbCgnJyk7XG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlIGxlYXZlcyBhIHN1cGVyc2NyaXB0IGFmdGVyIG9uZSBkaWdpdCBieSBkZWZhdWx0IChgc21hcnRTdXBlcnNjcmlwdGApLFxuICAvLyBzbyB4XjIzIC8gMTBeNiBjYW5ub3QgYmUgdHlwZWQuXG4gIGl0KCdzdGF5cyBpbiB0aGUgZXhwb25lbnQgYWZ0ZXIgYSBkaWdpdCBpbnN0ZWFkIG9mIGp1bXBpbmcgb3V0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcblxuICAgIGhvbGRlckZvcihpbnB1dCk7XG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQuc21hcnRTdXBlcnNjcmlwdCkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdyZXBvcnRzIGl0c2VsZiB0aHJvdWdoIGlubmVyUmVmIG9uIG1vdW50IGFuZCBjbGVhcnMgaXQgb24gdW5tb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbm5lclJlZiA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7IGlubmVyUmVmIH0pO1xuXG4gICAgaG9sZGVyRm9yKGlucHV0KTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KGlubmVyUmVmKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChpbnB1dCk7XG5cbiAgICBpbnB1dC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXG4gICAgZXhwZWN0KGlubmVyUmVmKS50b0hhdmVCZWVuTGFzdENhbGxlZFdpdGgobnVsbCk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUEwQ0EsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FDLElBQUksQ0FBQ0MsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFlBQU07RUFDdEM7RUFDQTtFQUNBO0VBQUEsSUFDTUMsb0JBQW9CLG9CQUFBQyxhQUFBLGFBQ3hCLFNBQUFELHFCQUFBLEVBQWM7SUFBQSxJQUFBRSxnQkFBQSxtQkFBQUYsb0JBQUE7SUFDWjtJQUNBO0lBQ0EsSUFBTUcsRUFBRSxHQUFHQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFlBQVksQ0FBQztJQUV0REgsRUFBRSxDQUFDSSxLQUFLLEdBQUcsRUFBRTtJQUNiSixFQUFFLENBQUNLLFFBQVEsR0FBRztNQUFBLE9BQU1MLEVBQUUsQ0FBQ0ksS0FBSztJQUFBO0lBRTVCLE9BQU9KLEVBQUU7RUFDWCxDQUFDO0VBR0gsT0FBTztJQUNMTSxZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBQTtNQUFBLE9BQVFDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDO1FBQUVDLGdCQUFnQixFQUFFWjtNQUFxQixDQUFDLENBQUM7SUFBQTtJQUMvRWEsU0FBUyxFQUFFLFNBQVhBLFNBQVNBLENBQUE7TUFBQSxPQUFTLENBQUMsQ0FBQztJQUFBLENBQUM7SUFDckI7SUFDQUMsZUFBZSxFQUFFLEtBQUs7SUFDdEJDLGlCQUFpQixFQUFFLFNBQW5CQSxpQkFBaUJBLENBQUEsRUFBUSxDQUFDLENBQUM7SUFDM0JDLHFCQUFxQixFQUFFLFNBQXZCQSxxQkFBcUJBLENBQUE7TUFBQSxPQUFRLFlBQU0sQ0FBQyxDQUFDO0lBQUE7SUFDckNDLGFBQWEsRUFBRSxTQUFmQSxhQUFhQSxDQUFHQyxDQUFDO01BQUEsZ0JBQUFDLE1BQUEsQ0FBY0QsQ0FBQztJQUFBO0VBQ2xDLENBQUM7QUFDSCxDQUFDLENBQUM7O0FBRUY7O0FBR0EsSUFBTUUsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUlDLEdBQUcsRUFBSztFQUN6QixJQUFNbEIsRUFBRSxHQUFHRSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxNQUFNLENBQUM7RUFFekNlLEdBQUcsQ0FBQ0MsU0FBUyxHQUFHO0lBQUVDLE9BQU8sRUFBRXBCO0VBQUcsQ0FBQztFQUUvQixPQUFPQSxFQUFFO0FBQ1gsQ0FBQztBQUVELElBQU1xQixVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBSXJCLEVBQUU7RUFBQSxPQUFLc0IsS0FBSyxDQUFDQyxJQUFJLENBQUN2QixFQUFFLENBQUN3QixVQUFVLENBQUMsQ0FBQ0MsTUFBTSxDQUFDLFVBQUNDLENBQUM7SUFBQSxPQUFLQSxDQUFDLENBQUNDLE9BQU8sS0FBSyxZQUFZO0VBQUEsRUFBQyxDQUFDQyxNQUFNO0FBQUE7QUFFckdDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxZQUFNO0VBQ2pDQyxFQUFFLENBQUMsK0RBQStELG1CQUFBQyxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQUMsUUFBQTtJQUFBLElBQUFDLEtBQUEsRUFBQW5DLEVBQUEsRUFBQW9DLEtBQUEsRUFBQUMsTUFBQTtJQUFBLE9BQUFMLFlBQUEsWUFBQU0sSUFBQSxXQUFBQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7UUFBQTtVQUM1RE4sS0FBSyxHQUFHLElBQUlPLGlCQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDckIxQyxFQUFFLEdBQUdpQixTQUFTLENBQUNrQixLQUFLLENBQUM7VUFFckJDLEtBQUssR0FBR0QsS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1VBRXZDUixLQUFLLENBQUNTLG9CQUFvQixDQUFDLENBQUM7VUFFdEJQLE1BQU0sR0FBR0YsS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1VBQUFKLFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BRWxDbEMsT0FBTyxDQUFDc0MsR0FBRyxDQUFDLENBQUNULEtBQUssRUFBRUMsTUFBTSxDQUFDLENBQUM7UUFBQTtVQUVsQ1MsTUFBTSxDQUFDekIsVUFBVSxDQUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQytDLElBQUksQ0FBQyxDQUFDLENBQUM7VUFDOUJELE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQVYsUUFBQSxDQUFBVyxJQUFBO01BQUE7SUFBQSxHQUFBaEIsT0FBQTtFQUFBLENBQ3ZDLEdBQUM7RUFFRkosRUFBRSxDQUFDLDREQUE0RCxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFrQixTQUFBO0lBQUEsSUFBQWhCLEtBQUEsRUFBQW5DLEVBQUEsRUFBQW9ELE9BQUE7SUFBQSxPQUFBcEIsWUFBQSxZQUFBTSxJQUFBLFdBQUFlLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBYixJQUFBLEdBQUFhLFNBQUEsQ0FBQVosSUFBQTtRQUFBO1VBQ3pETixLQUFLLEdBQUcsSUFBSU8saUJBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNyQjFDLEVBQUUsR0FBR2lCLFNBQVMsQ0FBQ2tCLEtBQUssQ0FBQztVQUVyQmlCLE9BQU8sR0FBR2pCLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQztVQUV6Q1IsS0FBSyxDQUFDUyxvQkFBb0IsQ0FBQyxDQUFDO1VBQUNTLFNBQUEsQ0FBQVosSUFBQTtVQUFBLE9BRXZCVyxPQUFPO1FBQUE7VUFFYk4sTUFBTSxDQUFDekIsVUFBVSxDQUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQytDLElBQUksQ0FBQyxDQUFDLENBQUM7VUFDOUJELE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUMsQ0FBQ00sYUFBYSxDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQUQsU0FBQSxDQUFBSCxJQUFBO01BQUE7SUFBQSxHQUFBQyxRQUFBO0VBQUEsQ0FDekMsR0FBQztFQUVGckIsRUFBRSxDQUFDLHlDQUF5QyxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFzQixTQUFBO0lBQUEsSUFBQXBCLEtBQUEsRUFBQW5DLEVBQUE7SUFBQSxPQUFBZ0MsWUFBQSxZQUFBTSxJQUFBLFdBQUFrQixTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQWhCLElBQUEsR0FBQWdCLFNBQUEsQ0FBQWYsSUFBQTtRQUFBO1VBQ3RDTixLQUFLLEdBQUcsSUFBSU8saUJBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNyQjFDLEVBQUUsR0FBR2lCLFNBQVMsQ0FBQ2tCLEtBQUssQ0FBQztVQUFBcUIsU0FBQSxDQUFBZixJQUFBO1VBQUEsT0FFckJOLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQztRQUFBO1VBRS9CRyxNQUFNLENBQUN6QixVQUFVLENBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDK0MsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFDO1FBQUE7VUFBQSxPQUFBUyxTQUFBLENBQUFOLElBQUE7TUFBQTtJQUFBLEdBQUFLLFFBQUE7RUFBQSxDQUNoQyxHQUFDO0VBRUZ6QixFQUFFLENBQUMseUNBQXlDLG1CQUFBQyxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQXdCLFNBQUE7SUFBQSxJQUFBdEIsS0FBQSxFQUFBbkMsRUFBQTtJQUFBLE9BQUFnQyxZQUFBLFlBQUFNLElBQUEsV0FBQW9CLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBbEIsSUFBQSxHQUFBa0IsU0FBQSxDQUFBakIsSUFBQTtRQUFBO1VBQ3RDTixLQUFLLEdBQUcsSUFBSU8saUJBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNyQjFDLEVBQUUsR0FBR2lCLFNBQVMsQ0FBQ2tCLEtBQUssQ0FBQztVQUFBdUIsU0FBQSxDQUFBakIsSUFBQTtVQUFBLE9BRXJCTixLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUM7UUFBQTtVQUFBZSxTQUFBLENBQUFqQixJQUFBO1VBQUEsT0FDekJOLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQztRQUFBO1VBQUFlLFNBQUEsQ0FBQWpCLElBQUE7VUFBQSxPQUN6Qk4sS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFL0JHLE1BQU0sQ0FBQ3pCLFVBQVUsQ0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMrQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUFXLFNBQUEsQ0FBQVIsSUFBQTtNQUFBO0lBQUEsR0FBQU8sUUFBQTtFQUFBLENBQ2hDLEdBQUM7O0VBRUY7RUFDQTNCLEVBQUUsQ0FBQyxpREFBaUQsbUJBQUFDLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBMEIsU0FBQTtJQUFBLElBQUF4QixLQUFBO0lBQUEsT0FBQUgsWUFBQSxZQUFBTSxJQUFBLFdBQUFzQixTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQXBCLElBQUEsR0FBQW9CLFNBQUEsQ0FBQW5CLElBQUE7UUFBQTtVQUM5Q04sS0FBSyxHQUFHLElBQUlPLGlCQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFFM0J6QixTQUFTLENBQUNrQixLQUFLLENBQUM7VUFBQ3lCLFNBQUEsQ0FBQW5CLElBQUE7VUFBQSxPQUNYTixLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUM7UUFBQTtVQUUvQjtVQUNBRyxNQUFNLENBQUNYLEtBQUssQ0FBQ2EsU0FBUyxDQUFDYSxhQUFhLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztVQUNwRGhCLE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUNhLGFBQWEsQ0FBQyxDQUFDRSxHQUFHLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQUYsU0FBQSxDQUFBVixJQUFBO01BQUE7SUFBQSxHQUFBUyxRQUFBO0VBQUEsQ0FDdkQsR0FBQzs7RUFFRjtFQUNBO0VBQ0E3QixFQUFFLENBQUMsNERBQTRELG1CQUFBQyxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQStCLFNBQUE7SUFBQSxJQUFBN0IsS0FBQTtJQUFBLE9BQUFILFlBQUEsWUFBQU0sSUFBQSxXQUFBMkIsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUF6QixJQUFBLEdBQUF5QixTQUFBLENBQUF4QixJQUFBO1FBQUE7VUFDekROLEtBQUssR0FBRyxJQUFJTyxpQkFBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBRTNCekIsU0FBUyxDQUFDa0IsS0FBSyxDQUFDO1VBQUM4QixTQUFBLENBQUF4QixJQUFBO1VBQUEsT0FDWE4sS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFL0JHLE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUNrQixnQkFBZ0IsQ0FBQyxDQUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFDO1FBQUE7VUFBQSxPQUFBa0IsU0FBQSxDQUFBZixJQUFBO01BQUE7SUFBQSxHQUFBYyxRQUFBO0VBQUEsQ0FDdEQsR0FBQztFQUVGbEMsRUFBRSxDQUFDLG1FQUFtRSxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFrQyxTQUFBO0lBQUEsSUFBQUMsUUFBQSxFQUFBakMsS0FBQTtJQUFBLE9BQUFILFlBQUEsWUFBQU0sSUFBQSxXQUFBK0IsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUE3QixJQUFBLEdBQUE2QixTQUFBLENBQUE1QixJQUFBO1FBQUE7VUFDaEUyQixRQUFRLEdBQUd6RSxJQUFJLENBQUMyRSxFQUFFLENBQUMsQ0FBQztVQUNwQm5DLEtBQUssR0FBRyxJQUFJTyxpQkFBSyxDQUFDO1lBQUUwQixRQUFRLEVBQVJBO1VBQVMsQ0FBQyxDQUFDO1VBRXJDbkQsU0FBUyxDQUFDa0IsS0FBSyxDQUFDO1VBQUNrQyxTQUFBLENBQUE1QixJQUFBO1VBQUEsT0FDWE4sS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFL0JHLE1BQU0sQ0FBQ3NCLFFBQVEsQ0FBQyxDQUFDRyxvQkFBb0IsQ0FBQ3BDLEtBQUssQ0FBQztVQUU1Q0EsS0FBSyxDQUFDUyxvQkFBb0IsQ0FBQyxDQUFDO1VBRTVCRSxNQUFNLENBQUNzQixRQUFRLENBQUMsQ0FBQ0ksd0JBQXdCLENBQUMsSUFBSSxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUFILFNBQUEsQ0FBQW5CLElBQUE7TUFBQTtJQUFBLEdBQUFpQixRQUFBO0VBQUEsQ0FDakQsR0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|