@pie-lib/math-input-mathlive 1.0.12 → 1.0.13

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.
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _react2 = require("@testing-library/react");
10
+ var _keypad = _interopRequireWildcard(require("../keypad"));
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
12
+ 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; }
13
+ 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; }
14
+ /**
15
+ * Keypad behaviour that is new in this package: labels are static markup from
16
+ * convertLatexToMarkup (the MathQuill version created a live StaticMath per
17
+ * button), with a raw-latex fallback when the engine is unavailable.
18
+ */
19
+ describe('LatexLabel', function () {
20
+ it('falls back to raw latex when MathLive is unavailable', function () {
21
+ // jsdom cannot load MathLive, so latexToMarkup returns '' - the button must
22
+ // still show something rather than render blank.
23
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
24
+ latex: '\\pi'
25
+ })),
26
+ container = _render.container;
27
+ expect(container.textContent).toContain('\\pi');
28
+ });
29
+ it('re-renders when the latex prop changes', function () {
30
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
31
+ latex: '\\pi'
32
+ })),
33
+ container = _render2.container,
34
+ rerender = _render2.rerender;
35
+ rerender(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
36
+ latex: '\\theta'
37
+ }));
38
+ expect(container.textContent).toContain('\\theta');
39
+ });
40
+ it('does not warn more than once about a missing engine', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
41
+ var a, b;
42
+ return _regenerator["default"].wrap(function (_context) {
43
+ while (1) switch (_context.prev = _context.next) {
44
+ case 0:
45
+ _keypad.LatexLabel.warned = false;
46
+ a = new _keypad.LatexLabel({
47
+ latex: '\\pi'
48
+ });
49
+ b = new _keypad.LatexLabel({
50
+ latex: '\\theta'
51
+ });
52
+ a.state = {
53
+ markup: ''
54
+ };
55
+ b.state = {
56
+ markup: ''
57
+ };
58
+ a.setState = function () {};
59
+ b.setState = function () {};
60
+ _context.next = 1;
61
+ return a.componentDidMount();
62
+ case 1:
63
+ _context.next = 2;
64
+ return b.componentDidMount();
65
+ case 2:
66
+ expect(_keypad.LatexLabel.warned).toBe(true);
67
+ case 3:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }, _callee);
72
+ })));
73
+ });
74
+ describe('KeyPad', function () {
75
+ var key = function key() {
76
+ var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
77
+ return _objectSpread({
78
+ name: 'x',
79
+ label: 'x',
80
+ write: 'x',
81
+ category: 'vars'
82
+ }, over);
83
+ };
84
+ it('renders a button per key', function () {
85
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
86
+ onPress: function onPress() {},
87
+ baseSet: [[key(), key({
88
+ name: 'y',
89
+ label: 'y'
90
+ })]]
91
+ })),
92
+ container = _render3.container;
93
+ expect(container.querySelectorAll('button').length).toBe(2);
94
+ });
95
+ it('calls onPress with the whole key definition', function () {
96
+ var onPress = jest.fn();
97
+ var k = key();
98
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
99
+ onPress: onPress,
100
+ baseSet: [[k]]
101
+ })),
102
+ container = _render4.container;
103
+ container.querySelector('button').click();
104
+ expect(onPress).toHaveBeenCalledWith(k);
105
+ });
106
+ it('renders a latex key through LatexLabel', function () {
107
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
108
+ onPress: function onPress() {},
109
+ baseSet: [[{
110
+ name: 'pi',
111
+ latex: '\\pi'
112
+ }]]
113
+ })),
114
+ container = _render5.container;
115
+ expect(container.textContent).toContain('\\pi');
116
+ });
117
+ it('disables the decimal separators when noDecimal is set', function () {
118
+ var dot = key({
119
+ name: '.',
120
+ label: '.',
121
+ write: '.'
122
+ });
123
+ var comma = key({
124
+ name: ',',
125
+ label: ',',
126
+ write: ','
127
+ });
128
+ var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
129
+ onPress: function onPress() {},
130
+ noDecimal: true,
131
+ baseSet: [[dot, comma]]
132
+ })),
133
+ container = _render6.container;
134
+ var disabled = Array.from(container.querySelectorAll('button')).filter(function (b) {
135
+ return b.disabled;
136
+ });
137
+ expect(disabled.length).toBe(2);
138
+ });
139
+ it('leaves the separators enabled otherwise', function () {
140
+ var dot = key({
141
+ name: '.',
142
+ label: '.',
143
+ write: '.'
144
+ });
145
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
146
+ onPress: function onPress() {},
147
+ baseSet: [[dot]]
148
+ })),
149
+ container = _render7.container;
150
+ expect(container.querySelector('button').disabled).toBe(false);
151
+ });
152
+ it('renders a placeholder for empty grid slots', function () {
153
+ expect(function () {
154
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
155
+ onPress: function onPress() {},
156
+ baseSet: [[null]]
157
+ }));
158
+ }).not.toThrow();
159
+ });
160
+ it('notifies setKeypadInteraction on pointer interaction', function () {
161
+ var setKeypadInteraction = jest.fn();
162
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
163
+ onPress: function onPress() {},
164
+ setKeypadInteraction: setKeypadInteraction,
165
+ baseSet: [[key()]]
166
+ })),
167
+ container = _render8.container;
168
+ container.firstChild.dispatchEvent(new MouseEvent('mousedown', {
169
+ bubbles: true
170
+ }));
171
+ expect(setKeypadInteraction).toHaveBeenCalledWith(true);
172
+ });
173
+ it('uses the mode as a class so mode-specific styling applies', function () {
174
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
175
+ onPress: function onPress() {},
176
+ mode: "language",
177
+ baseSet: [[key()]]
178
+ })),
179
+ container = _render9.container;
180
+ expect(container.firstChild.className).toContain('language');
181
+ });
182
+ it('drops the base set for the modes that supply their own keys', function () {
183
+ var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
184
+ onPress: function onPress() {},
185
+ mode: "language",
186
+ baseSet: [[key(), key()]],
187
+ additionalKeys: [[key()]]
188
+ })),
189
+ container = _render0.container;
190
+
191
+ // base set ignored, only the additional key renders
192
+ expect(container.querySelectorAll('button').length).toBe(1);
193
+ });
194
+ it('unmounts without throwing', function () {
195
+ var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
196
+ onPress: function onPress() {},
197
+ controlledKeypadMode: true,
198
+ baseSet: [[key()]]
199
+ })),
200
+ unmount = _render1.unmount;
201
+ expect(function () {
202
+ return unmount();
203
+ }).not.toThrow();
204
+ });
205
+ });
206
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfa2V5cGFkIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiaGFzIiwiZ2V0Iiwic2V0IiwiX3QiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVzY3JpYmUiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiTGF0ZXhMYWJlbCIsImxhdGV4IiwiY29udGFpbmVyIiwiZXhwZWN0IiwidGV4dENvbnRlbnQiLCJ0b0NvbnRhaW4iLCJfcmVuZGVyMiIsInJlcmVuZGVyIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJhIiwiYiIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0Iiwid2FybmVkIiwic3RhdGUiLCJtYXJrdXAiLCJzZXRTdGF0ZSIsImNvbXBvbmVudERpZE1vdW50IiwidG9CZSIsInN0b3AiLCJrZXkiLCJvdmVyIiwidW5kZWZpbmVkIiwibmFtZSIsImxhYmVsIiwid3JpdGUiLCJjYXRlZ29yeSIsIl9yZW5kZXIzIiwib25QcmVzcyIsImJhc2VTZXQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiamVzdCIsImZuIiwiayIsIl9yZW5kZXI0IiwicXVlcnlTZWxlY3RvciIsImNsaWNrIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfcmVuZGVyNSIsImRvdCIsImNvbW1hIiwiX3JlbmRlcjYiLCJub0RlY2ltYWwiLCJkaXNhYmxlZCIsIkFycmF5IiwiZnJvbSIsIl9yZW5kZXI3Iiwibm90IiwidG9UaHJvdyIsInNldEtleXBhZEludGVyYWN0aW9uIiwiX3JlbmRlcjgiLCJmaXJzdENoaWxkIiwiZGlzcGF0Y2hFdmVudCIsIk1vdXNlRXZlbnQiLCJidWJibGVzIiwiX3JlbmRlcjkiLCJtb2RlIiwiY2xhc3NOYW1lIiwiX3JlbmRlcjAiLCJhZGRpdGlvbmFsS2V5cyIsIl9yZW5kZXIxIiwiY29udHJvbGxlZEtleXBhZE1vZGUiLCJ1bm1vdW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9rZXlwYWQtcmVuZGVyLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcblxuaW1wb3J0IEtleVBhZCwgeyBMYXRleExhYmVsIH0gZnJvbSAnLi4va2V5cGFkJztcblxuLyoqXG4gKiBLZXlwYWQgYmVoYXZpb3VyIHRoYXQgaXMgbmV3IGluIHRoaXMgcGFja2FnZTogbGFiZWxzIGFyZSBzdGF0aWMgbWFya3VwIGZyb21cbiAqIGNvbnZlcnRMYXRleFRvTWFya3VwICh0aGUgTWF0aFF1aWxsIHZlcnNpb24gY3JlYXRlZCBhIGxpdmUgU3RhdGljTWF0aCBwZXJcbiAqIGJ1dHRvbiksIHdpdGggYSByYXctbGF0ZXggZmFsbGJhY2sgd2hlbiB0aGUgZW5naW5lIGlzIHVuYXZhaWxhYmxlLlxuICovXG5kZXNjcmliZSgnTGF0ZXhMYWJlbCcsICgpID0+IHtcbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gcmF3IGxhdGV4IHdoZW4gTWF0aExpdmUgaXMgdW5hdmFpbGFibGUnLCAoKSA9PiB7XG4gICAgLy8ganNkb20gY2Fubm90IGxvYWQgTWF0aExpdmUsIHNvIGxhdGV4VG9NYXJrdXAgcmV0dXJucyAnJyAtIHRoZSBidXR0b24gbXVzdFxuICAgIC8vIHN0aWxsIHNob3cgc29tZXRoaW5nIHJhdGhlciB0aGFuIHJlbmRlciBibGFuay5cbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxMYXRleExhYmVsIGxhdGV4PXsnXFxcXHBpJ30gLz4pO1xuXG4gICAgZXhwZWN0KGNvbnRhaW5lci50ZXh0Q29udGVudCkudG9Db250YWluKCdcXFxccGknKTtcbiAgfSk7XG5cbiAgaXQoJ3JlLXJlbmRlcnMgd2hlbiB0aGUgbGF0ZXggcHJvcCBjaGFuZ2VzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyLCByZXJlbmRlciB9ID0gcmVuZGVyKDxMYXRleExhYmVsIGxhdGV4PXsnXFxcXHBpJ30gLz4pO1xuXG4gICAgcmVyZW5kZXIoPExhdGV4TGFiZWwgbGF0ZXg9eydcXFxcdGhldGEnfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1xcXFx0aGV0YScpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3Qgd2FybiBtb3JlIHRoYW4gb25jZSBhYm91dCBhIG1pc3NpbmcgZW5naW5lJywgYXN5bmMgKCkgPT4ge1xuICAgIExhdGV4TGFiZWwud2FybmVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBhID0gbmV3IExhdGV4TGFiZWwoeyBsYXRleDogJ1xcXFxwaScgfSk7XG4gICAgY29uc3QgYiA9IG5ldyBMYXRleExhYmVsKHsgbGF0ZXg6ICdcXFxcdGhldGEnIH0pO1xuXG4gICAgYS5zdGF0ZSA9IHsgbWFya3VwOiAnJyB9O1xuICAgIGIuc3RhdGUgPSB7IG1hcmt1cDogJycgfTtcbiAgICBhLnNldFN0YXRlID0gKCkgPT4ge307XG4gICAgYi5zZXRTdGF0ZSA9ICgpID0+IHt9O1xuXG4gICAgYXdhaXQgYS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIGF3YWl0IGIuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGV4cGVjdChMYXRleExhYmVsLndhcm5lZCkudG9CZSh0cnVlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0tleVBhZCcsICgpID0+IHtcbiAgY29uc3Qga2V5ID0gKG92ZXIgPSB7fSkgPT4gKHsgbmFtZTogJ3gnLCBsYWJlbDogJ3gnLCB3cml0ZTogJ3gnLCBjYXRlZ29yeTogJ3ZhcnMnLCAuLi5vdmVyIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGEgYnV0dG9uIHBlciBrZXknLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSBiYXNlU2V0PXtbW2tleSgpLCBrZXkoeyBuYW1lOiAneScsIGxhYmVsOiAneScgfSldXX0gLz4pO1xuXG4gICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5sZW5ndGgpLnRvQmUoMik7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblByZXNzIHdpdGggdGhlIHdob2xlIGtleSBkZWZpbml0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uUHJlc3MgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgayA9IGtleSgpO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXtvblByZXNzfSBiYXNlU2V0PXtbW2tdXX0gLz4pO1xuXG4gICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLmNsaWNrKCk7XG5cbiAgICBleHBlY3Qob25QcmVzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoayk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGEgbGF0ZXgga2V5IHRocm91Z2ggTGF0ZXhMYWJlbCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxLZXlQYWQgb25QcmVzcz17KCkgPT4ge319IGJhc2VTZXQ9e1tbeyBuYW1lOiAncGknLCBsYXRleDogJ1xcXFxwaScgfV1dfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1xcXFxwaScpO1xuICB9KTtcblxuICBpdCgnZGlzYWJsZXMgdGhlIGRlY2ltYWwgc2VwYXJhdG9ycyB3aGVuIG5vRGVjaW1hbCBpcyBzZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgZG90ID0ga2V5KHsgbmFtZTogJy4nLCBsYWJlbDogJy4nLCB3cml0ZTogJy4nIH0pO1xuICAgIGNvbnN0IGNvbW1hID0ga2V5KHsgbmFtZTogJywnLCBsYWJlbDogJywnLCB3cml0ZTogJywnIH0pO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gbm9EZWNpbWFsIGJhc2VTZXQ9e1tbZG90LCBjb21tYV1dfSAvPik7XG5cbiAgICBjb25zdCBkaXNhYmxlZCA9IEFycmF5LmZyb20oY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpKS5maWx0ZXIoKGIpID0+IGIuZGlzYWJsZWQpO1xuXG4gICAgZXhwZWN0KGRpc2FibGVkLmxlbmd0aCkudG9CZSgyKTtcbiAgfSk7XG5cbiAgaXQoJ2xlYXZlcyB0aGUgc2VwYXJhdG9ycyBlbmFibGVkIG90aGVyd2lzZScsICgpID0+IHtcbiAgICBjb25zdCBkb3QgPSBrZXkoeyBuYW1lOiAnLicsIGxhYmVsOiAnLicsIHdyaXRlOiAnLicgfSk7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSBiYXNlU2V0PXtbW2RvdF1dfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLmRpc2FibGVkKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgYSBwbGFjZWhvbGRlciBmb3IgZW1wdHkgZ3JpZCBzbG90cycsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gcmVuZGVyKDxLZXlQYWQgb25QcmVzcz17KCkgPT4ge319IGJhc2VTZXQ9e1tbbnVsbF1dfSAvPikpLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KCdub3RpZmllcyBzZXRLZXlwYWRJbnRlcmFjdGlvbiBvbiBwb2ludGVyIGludGVyYWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHNldEtleXBhZEludGVyYWN0aW9uID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICA8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSBzZXRLZXlwYWRJbnRlcmFjdGlvbj17c2V0S2V5cGFkSW50ZXJhY3Rpb259IGJhc2VTZXQ9e1tba2V5KCldXX0gLz4sXG4gICAgKTtcblxuICAgIGNvbnRhaW5lci5maXJzdENoaWxkLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG5cbiAgICBleHBlY3Qoc2V0S2V5cGFkSW50ZXJhY3Rpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRydWUpO1xuICB9KTtcblxuICBpdCgndXNlcyB0aGUgbW9kZSBhcyBhIGNsYXNzIHNvIG1vZGUtc3BlY2lmaWMgc3R5bGluZyBhcHBsaWVzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gbW9kZT1cImxhbmd1YWdlXCIgYmFzZVNldD17W1trZXkoKV1dfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2xhc3NOYW1lKS50b0NvbnRhaW4oJ2xhbmd1YWdlJyk7XG4gIH0pO1xuXG4gIGl0KCdkcm9wcyB0aGUgYmFzZSBzZXQgZm9yIHRoZSBtb2RlcyB0aGF0IHN1cHBseSB0aGVpciBvd24ga2V5cycsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gbW9kZT1cImxhbmd1YWdlXCIgYmFzZVNldD17W1trZXkoKSwga2V5KCldXX0gYWRkaXRpb25hbEtleXM9e1tba2V5KCldXX0gLz4sXG4gICAgKTtcblxuICAgIC8vIGJhc2Ugc2V0IGlnbm9yZWQsIG9ubHkgdGhlIGFkZGl0aW9uYWwga2V5IHJlbmRlcnNcbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmxlbmd0aCkudG9CZSgxKTtcbiAgfSk7XG5cbiAgaXQoJ3VubW91bnRzIHdpdGhvdXQgdGhyb3dpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyB1bm1vdW50IH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gY29udHJvbGxlZEtleXBhZE1vZGUgYmFzZVNldD17W1trZXkoKV1dfSAvPik7XG5cbiAgICBleHBlY3QoKCkgPT4gdW5tb3VudCgpKS5ub3QudG9UaHJvdygpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsT0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQStDLFNBQUFHLHdCQUFBQyxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBSCx1QkFBQSxZQUFBQSx3QkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLG1CQUFBVCxDQUFBLGlCQUFBQSxDQUFBLGdCQUFBVSxPQUFBLENBQUFWLENBQUEsMEJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxH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
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ var _latexBridge = require("../latex-bridge");
6
+ describe('latex-bridge', function () {
7
+ describe('toMathLive', function () {
8
+ it('passes plain latex through', function () {
9
+ expect((0, _latexBridge.toMathLive)('\\frac{1}{2}')).toEqual('\\frac{1}{2}');
10
+ });
11
+ it('handles empty/nullish', function () {
12
+ expect((0, _latexBridge.toMathLive)('')).toEqual('');
13
+ expect((0, _latexBridge.toMathLive)(undefined)).toEqual('');
14
+ expect((0, _latexBridge.toMathLive)(null)).toEqual('');
15
+ });
16
+ it('converts a newLine embed to a multiline environment', function () {
17
+ expect((0, _latexBridge.toMathLive)("a".concat(_latexBridge.NEWLINE_EMBED, "b"))).toEqual('\\displaylines{a \\\\ b}');
18
+ });
19
+ it('converts multiple newLine embeds', function () {
20
+ expect((0, _latexBridge.toMathLive)("a".concat(_latexBridge.NEWLINE_EMBED, "b").concat(_latexBridge.NEWLINE_EMBED, "c"))).toEqual('\\displaylines{a \\\\ b \\\\ c}');
21
+ });
22
+ it('converts MathQuill answer blocks to placeholders', function () {
23
+ expect((0, _latexBridge.toMathLive)('x=\\MathQuillMathField[r1]{}')).toEqual('x=\\placeholder[r1]{}');
24
+ });
25
+ it('preserves answer block content', function () {
26
+ expect((0, _latexBridge.toMathLive)('\\MathQuillMathField[r2]{7}')).toEqual('\\placeholder[r2]{7}');
27
+ });
28
+ it('defaults an unnamed answer block id', function () {
29
+ expect((0, _latexBridge.toMathLive)('\\MathQuillMathField[]{}')).toEqual("\\placeholder[".concat(_latexBridge.DEFAULT_FIELD_ID, "]{}"));
30
+ });
31
+ it('handles answer blocks and newlines together', function () {
32
+ expect((0, _latexBridge.toMathLive)("\\MathQuillMathField[r1]{}".concat(_latexBridge.NEWLINE_EMBED, "x"))).toEqual('\\displaylines{\\placeholder[r1]{} \\\\ x}');
33
+ });
34
+ });
35
+ describe('fromMathLive', function () {
36
+ it('passes plain latex through', function () {
37
+ expect((0, _latexBridge.fromMathLive)('\\frac{1}{2}')).toEqual('\\frac{1}{2}');
38
+ });
39
+ it('unwraps displaylines back to newLine embeds', function () {
40
+ expect((0, _latexBridge.fromMathLive)('\\displaylines{a \\\\ b}')).toEqual("a".concat(_latexBridge.NEWLINE_EMBED, "b"));
41
+ });
42
+ it('converts placeholders back to MathQuill answer blocks', function () {
43
+ expect((0, _latexBridge.fromMathLive)('x=\\placeholder[r1]{}')).toEqual('x=\\MathQuillMathField[r1]{}');
44
+ });
45
+ it('round-trips a newline document', function () {
46
+ var stored = "a".concat(_latexBridge.NEWLINE_EMBED, "b").concat(_latexBridge.NEWLINE_EMBED, "c");
47
+ expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
48
+ });
49
+ it('round-trips an answer-block document', function () {
50
+ var stored = 'x=\\MathQuillMathField[r1]{}+\\MathQuillMathField[r2]{3}';
51
+ expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
52
+ });
53
+
54
+ // MathLive serialises empty slots as \placeholder{}, which MathJax (used by
55
+ // @pie-lib/math-rendering for prompts/previews) renders as red error text.
56
+ it('strips unnamed placeholders that MathLive adds', function () {
57
+ expect((0, _latexBridge.fromMathLive)('\\longdiv{\\placeholder{}}')).toEqual('\\longdiv{}');
58
+ expect((0, _latexBridge.fromMathLive)('\\frac{\\placeholder{}}{\\placeholder{}}')).toEqual('\\frac{}{}');
59
+ });
60
+ it('keeps content inside an unnamed placeholder', function () {
61
+ expect((0, _latexBridge.fromMathLive)('\\sqrt{\\placeholder{7}}')).toEqual('\\sqrt{7}');
62
+ });
63
+ it('handles a bare \\placeholder with no argument', function () {
64
+ expect((0, _latexBridge.fromMathLive)('\\longdiv{\\placeholder}')).toEqual('\\longdiv{}');
65
+ });
66
+ it('never leaks the token \\placeholder', function () {
67
+ ['\\longdiv{\\placeholder{}}', '\\frac{\\placeholder{}}{x}', '\\placeholder{}'].forEach(function (l) {
68
+ expect((0, _latexBridge.fromMathLive)(l)).not.toContain('\\placeholder');
69
+ });
70
+ });
71
+ it('still maps NAMED placeholders to answer blocks', function () {
72
+ // named ones are answer blocks and must survive
73
+ expect((0, _latexBridge.fromMathLive)('\\placeholder[r1]{}')).toEqual('\\MathQuillMathField[r1]{}');
74
+ });
75
+ it('round-trips answer blocks combined with newlines', function () {
76
+ var stored = "\\MathQuillMathField[r1]{}".concat(_latexBridge.NEWLINE_EMBED, "y");
77
+ expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
78
+ });
79
+ });
80
+
81
+ // A MathLive macro serialises from the arguments it was created with, so text
82
+ // typed inside its expansion never comes back out of getValue('latex').
83
+ // Argument-taking pie commands must therefore become native constructs before
84
+ // they reach a mathfield.
85
+ describe('toNativeCommands', function () {
86
+ it('expands \\longdiv to native \\enclose', function () {
87
+ expect((0, _latexBridge.toNativeCommands)('\\longdiv{1234}')).toEqual('\\enclose{longdiv}{1234}');
88
+ expect((0, _latexBridge.toNativeCommands)('\\longdiv{}')).toEqual('\\enclose{longdiv}{}');
89
+ });
90
+ it('expands \\overarc to native \\overparen', function () {
91
+ expect((0, _latexBridge.toNativeCommands)('\\overarc{AB}')).toEqual('\\overparen{AB}');
92
+ });
93
+ it('expands \\abs to native \\left|..\\right|', function () {
94
+ expect((0, _latexBridge.toNativeCommands)('\\abs{x}')).toEqual('\\left|x\\right|');
95
+ expect((0, _latexBridge.toNativeCommands)('\\abs{}')).toEqual('\\left|\\right|');
96
+ });
97
+ it('handles nested braces inside \\abs', function () {
98
+ expect((0, _latexBridge.toNativeCommands)('\\abs{\\frac{1}{2}}')).toEqual('\\left|\\frac{1}{2}\\right|');
99
+ });
100
+ it('handles several occurrences', function () {
101
+ expect((0, _latexBridge.toNativeCommands)('\\abs{a}+\\abs{b}')).toEqual('\\left|a\\right|+\\left|b\\right|');
102
+ expect((0, _latexBridge.toNativeCommands)('\\longdiv{1}\\longdiv{2}')).toEqual('\\enclose{longdiv}{1}\\enclose{longdiv}{2}');
103
+ });
104
+
105
+ // `%` starts a comment in real LaTeX, so MathLive drops it and everything
106
+ // after it. MathQuill had no comments, so latex authored under it - or by
107
+ // hand - can carry a bare `%` that would silently truncate the expression.
108
+ it('escapes a bare % so it cannot comment out the rest of the line', function () {
109
+ expect((0, _latexBridge.toNativeCommands)('%')).toEqual('\\%');
110
+ expect((0, _latexBridge.toNativeCommands)('50%')).toEqual('50\\%');
111
+ expect((0, _latexBridge.toNativeCommands)('x%y')).toEqual('x\\%y');
112
+ expect((0, _latexBridge.toNativeCommands)('a%b%c')).toEqual('a\\%b\\%c');
113
+ });
114
+ it('leaves an already-escaped % alone', function () {
115
+ expect((0, _latexBridge.toNativeCommands)('\\%')).toEqual('\\%');
116
+ expect((0, _latexBridge.toNativeCommands)('50\\%')).toEqual('50\\%');
117
+ // idempotent: toMathLive may run over latex that came back out of a field
118
+ expect((0, _latexBridge.toNativeCommands)((0, _latexBridge.toNativeCommands)('50%'))).toEqual('50\\%');
119
+ });
120
+
121
+ // `\\` is a line break, not an escape, so the `%` after it is still bare.
122
+ it('counts backslashes to decide whether a % is escaped', function () {
123
+ expect((0, _latexBridge.toNativeCommands)('a\\\\%b')).toEqual('a\\\\\\%b');
124
+ });
125
+ it('leaves other latex untouched', function () {
126
+ ['\\frac{1}{2}', '\\pi', '\\sqrt{x}', '\\overline{AB}'].forEach(function (l) {
127
+ expect((0, _latexBridge.toNativeCommands)(l)).toEqual(l);
128
+ });
129
+ });
130
+ it('handles nullish input', function () {
131
+ expect((0, _latexBridge.toNativeCommands)(undefined)).toEqual('');
132
+ expect((0, _latexBridge.toNativeCommands)('')).toEqual('');
133
+ });
134
+ it('is applied by toMathLive', function () {
135
+ expect((0, _latexBridge.toMathLive)('\\longdiv{5}')).toEqual('\\enclose{longdiv}{5}');
136
+ });
137
+ it('does not leave a pie macro in what reaches the field', function () {
138
+ ['\\longdiv{7}', '\\abs{7}', '\\overarc{7}'].forEach(function (l) {
139
+ var out = (0, _latexBridge.toMathLive)(l);
140
+ expect(out).not.toMatch(/\\longdiv|\\abs|\\overarc/);
141
+ });
142
+ });
143
+ });
144
+ describe('fieldIds', function () {
145
+ it('returns ids in document order', function () {
146
+ expect((0, _latexBridge.fieldIds)('\\MathQuillMathField[r1]{}+\\MathQuillMathField[r2]{}')).toEqual(['r1', 'r2']);
147
+ });
148
+ it('returns [] when there are none', function () {
149
+ expect((0, _latexBridge.fieldIds)('x+y')).toEqual([]);
150
+ expect((0, _latexBridge.fieldIds)(undefined)).toEqual([]);
151
+ });
152
+ it('is repeatable (regex lastIndex is reset)', function () {
153
+ var latex = '\\MathQuillMathField[r1]{}';
154
+ expect((0, _latexBridge.fieldIds)(latex)).toEqual(['r1']);
155
+ expect((0, _latexBridge.fieldIds)(latex)).toEqual(['r1']);
156
+ });
157
+ });
158
+ describe('keyToAction', function () {
159
+ it('prefers latex when there is no command', function () {
160
+ expect((0, _latexBridge.keyToAction)({
161
+ latex: '\\pi',
162
+ write: 'p'
163
+ })).toEqual({
164
+ type: 'insert',
165
+ value: '\\pi'
166
+ });
167
+ });
168
+ it('uses write', function () {
169
+ expect((0, _latexBridge.keyToAction)({
170
+ write: 'x'
171
+ })).toEqual({
172
+ type: 'insert',
173
+ value: 'x'
174
+ });
175
+ });
176
+ it('expands commands that take arguments into placeholders', function () {
177
+ expect((0, _latexBridge.keyToAction)({
178
+ command: '\\frac'
179
+ })).toEqual({
180
+ type: 'insert',
181
+ value: '\\frac{#?}{#?}'
182
+ });
183
+ expect((0, _latexBridge.keyToAction)({
184
+ command: '\\sqrt'
185
+ })).toEqual({
186
+ type: 'insert',
187
+ value: '\\sqrt{#?}'
188
+ });
189
+ expect((0, _latexBridge.keyToAction)({
190
+ command: '^'
191
+ })).toEqual({
192
+ type: 'insert',
193
+ value: '^{#?}'
194
+ });
195
+ });
196
+
197
+ // MathQuill's `/` turned the preceding expression into the numerator: type
198
+ // 5, press the key, get 5/_ with the caret in the denominator. `#@` is
199
+ // MathLive's "selection, or the item before the cursor" token, and is what
200
+ // MathLive binds to `/` itself.
201
+ it('division takes the preceding item as the numerator', function () {
202
+ expect((0, _latexBridge.keyToAction)({
203
+ command: '/'
204
+ })).toEqual({
205
+ type: 'insert',
206
+ value: '\\frac{#@}{#?}'
207
+ });
208
+ });
209
+ it('an explicit blank-over-blank fraction stays empty', function () {
210
+ // distinct from `/`: this key is meant to insert two empty slots
211
+ expect((0, _latexBridge.keyToAction)({
212
+ command: '\\frac'
213
+ })).toEqual({
214
+ type: 'insert',
215
+ value: '\\frac{#?}{#?}'
216
+ });
217
+ });
218
+ it('the x-over-blank key routes through division', function () {
219
+ // eslint-disable-next-line global-require
220
+ var _require = require('../keys/fractions'),
221
+ xOverBlank = _require.xOverBlank;
222
+ expect(xOverBlank.command).toEqual('/');
223
+ expect((0, _latexBridge.keyToAction)(xOverBlank).value).toEqual('\\frac{#@}{#?}');
224
+ });
225
+ it('passes argument-less commands through', function () {
226
+ expect((0, _latexBridge.keyToAction)({
227
+ command: '\\pi'
228
+ })).toEqual({
229
+ type: 'insert',
230
+ value: '\\pi'
231
+ });
232
+ });
233
+ it('concatenates array commands (MathQuill cmd() applied them in sequence)', function () {
234
+ // Measured Angle
235
+ expect((0, _latexBridge.keyToAction)({
236
+ command: ['m', '\\angle']
237
+ })).toEqual({
238
+ type: 'insert',
239
+ value: 'm\\angle'
240
+ });
241
+ // log base n - the `_` part must still expand to a placeholder
242
+ expect((0, _latexBridge.keyToAction)({
243
+ command: ['\\log', '_']
244
+ })).toEqual({
245
+ type: 'insert',
246
+ value: '\\log_{#?}'
247
+ });
248
+ });
249
+ it('always returns a string value for insert actions', function () {
250
+ [{
251
+ command: ['m', '\\angle']
252
+ }, {
253
+ command: '\\frac'
254
+ }, {
255
+ write: 'x'
256
+ }, {
257
+ latex: '\\pi'
258
+ }].forEach(function (k) {
259
+ expect((0, _typeof2["default"])((0, _latexBridge.keyToAction)(k).value)).toBe('string');
260
+ });
261
+ });
262
+ it('maps keystrokes to MathLive selectors', function () {
263
+ expect((0, _latexBridge.keyToAction)({
264
+ keystroke: 'Left'
265
+ })).toEqual({
266
+ type: 'command',
267
+ value: 'moveToPreviousChar'
268
+ });
269
+ expect((0, _latexBridge.keyToAction)({
270
+ keystroke: 'Right'
271
+ })).toEqual({
272
+ type: 'command',
273
+ value: 'moveToNextChar'
274
+ });
275
+ expect((0, _latexBridge.keyToAction)({
276
+ keystroke: 'Backspace'
277
+ })).toEqual({
278
+ type: 'command',
279
+ value: 'deleteBackward'
280
+ });
281
+ });
282
+ it('returns undefined for unknown/empty input', function () {
283
+ expect((0, _latexBridge.keyToAction)(undefined)).toBeUndefined();
284
+ expect((0, _latexBridge.keyToAction)({})).toBeUndefined();
285
+ expect((0, _latexBridge.keyToAction)({
286
+ keystroke: 'Nope'
287
+ })).toBeUndefined();
288
+ });
289
+ it('latex wins over command only when command is absent', function () {
290
+ // a key with both should use the command path (matches MathInput.keypadPress)
291
+ expect((0, _latexBridge.keyToAction)({
292
+ latex: '\\frac{}{}',
293
+ command: '\\frac'
294
+ })).toEqual({
295
+ type: 'insert',
296
+ value: '\\frac{#?}{#?}'
297
+ });
298
+ });
299
+ });
300
+ });
301
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsInRvTWF0aExpdmUiLCJ0b0VxdWFsIiwidW5kZWZpbmVkIiwiY29uY2F0IiwiTkVXTElORV9FTUJFRCIsIkRFRkFVTFRfRklFTERfSUQiLCJmcm9tTWF0aExpdmUiLCJzdG9yZWQiLCJmb3JFYWNoIiwibCIsIm5vdCIsInRvQ29udGFpbiIsInRvTmF0aXZlQ29tbWFuZHMiLCJvdXQiLCJ0b01hdGNoIiwiZmllbGRJZHMiLCJsYXRleCIsImtleVRvQWN0aW9uIiwid3JpdGUiLCJ0eXBlIiwidmFsdWUiLCJjb21tYW5kIiwiX3JlcXVpcmUiLCJ4T3ZlckJsYW5rIiwiayIsIl90eXBlb2YyIiwidG9CZSIsImtleXN0cm9rZSIsInRvQmVVbmRlZmluZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2xhdGV4LWJyaWRnZS50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHRvTWF0aExpdmUsXG4gIGZyb21NYXRoTGl2ZSxcbiAgZmllbGRJZHMsXG4gIGtleVRvQWN0aW9uLFxuICB0b05hdGl2ZUNvbW1hbmRzLFxuICBORVdMSU5FX0VNQkVELFxuICBERUZBVUxUX0ZJRUxEX0lELFxufSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuXG5kZXNjcmliZSgnbGF0ZXgtYnJpZGdlJywgKCkgPT4ge1xuICBkZXNjcmliZSgndG9NYXRoTGl2ZScsICgpID0+IHtcbiAgICBpdCgncGFzc2VzIHBsYWluIGxhdGV4IHRocm91Z2gnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZSgnXFxcXGZyYWN7MX17Mn0nKSkudG9FcXVhbCgnXFxcXGZyYWN7MX17Mn0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5L251bGxpc2gnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZSgnJykpLnRvRXF1YWwoJycpO1xuICAgICAgZXhwZWN0KHRvTWF0aExpdmUodW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZShudWxsKSkudG9FcXVhbCgnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29udmVydHMgYSBuZXdMaW5lIGVtYmVkIHRvIGEgbXVsdGlsaW5lIGVudmlyb25tZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTWF0aExpdmUoYGEke05FV0xJTkVfRU1CRUR9YmApKS50b0VxdWFsKCdcXFxcZGlzcGxheWxpbmVze2EgXFxcXFxcXFwgYn0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb252ZXJ0cyBtdWx0aXBsZSBuZXdMaW5lIGVtYmVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKGBhJHtORVdMSU5FX0VNQkVEfWIke05FV0xJTkVfRU1CRUR9Y2ApKS50b0VxdWFsKCdcXFxcZGlzcGxheWxpbmVze2EgXFxcXFxcXFwgYiBcXFxcXFxcXCBjfScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbnZlcnRzIE1hdGhRdWlsbCBhbnN3ZXIgYmxvY2tzIHRvIHBsYWNlaG9sZGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKCd4PVxcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjFde30nKSkudG9FcXVhbCgneD1cXFxccGxhY2Vob2xkZXJbcjFde30nKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgYW5zd2VyIGJsb2NrIGNvbnRlbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZSgnXFxcXE1hdGhRdWlsbE1hdGhGaWVsZFtyMl17N30nKSkudG9FcXVhbCgnXFxcXHBsYWNlaG9sZGVyW3IyXXs3fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlZmF1bHRzIGFuIHVubmFtZWQgYW5zd2VyIGJsb2NrIGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTWF0aExpdmUoJ1xcXFxNYXRoUXVpbGxNYXRoRmllbGRbXXt9JykpLnRvRXF1YWwoYFxcXFxwbGFjZWhvbGRlclske0RFRkFVTFRfRklFTERfSUR9XXt9YCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhbnN3ZXIgYmxvY2tzIGFuZCBuZXdsaW5lcyB0b2dldGhlcicsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKGBcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9JHtORVdMSU5FX0VNQkVEfXhgKSkudG9FcXVhbChcbiAgICAgICAgJ1xcXFxkaXNwbGF5bGluZXN7XFxcXHBsYWNlaG9sZGVyW3IxXXt9IFxcXFxcXFxcIHh9JyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmcm9tTWF0aExpdmUnLCAoKSA9PiB7XG4gICAgaXQoJ3Bhc3NlcyBwbGFpbiBsYXRleCB0aHJvdWdoJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSgnXFxcXGZyYWN7MX17Mn0nKSkudG9FcXVhbCgnXFxcXGZyYWN7MX17Mn0nKTtcbiAgICB9KTtcblxuICAgIGl0KCd1bndyYXBzIGRpc3BsYXlsaW5lcyBiYWNrIHRvIG5ld0xpbmUgZW1iZWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSgnXFxcXGRpc3BsYXlsaW5lc3thIFxcXFxcXFxcIGJ9JykpLnRvRXF1YWwoYGEke05FV0xJTkVfRU1CRUR9YmApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbnZlcnRzIHBsYWNlaG9sZGVycyBiYWNrIHRvIE1hdGhRdWlsbCBhbnN3ZXIgYmxvY2tzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSgneD1cXFxccGxhY2Vob2xkZXJbcjFde30nKSkudG9FcXVhbCgneD1cXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcHMgYSBuZXdsaW5lIGRvY3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVkID0gYGEke05FV0xJTkVfRU1CRUR9YiR7TkVXTElORV9FTUJFRH1jYDtcblxuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSh0b01hdGhMaXZlKHN0b3JlZCkpKS50b0VxdWFsKHN0b3JlZCk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcHMgYW4gYW5zd2VyLWJsb2NrIGRvY3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVkID0gJ3g9XFxcXE1hdGhRdWlsbE1hdGhGaWVsZFtyMV17fStcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IyXXszfSc7XG5cbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUodG9NYXRoTGl2ZShzdG9yZWQpKSkudG9FcXVhbChzdG9yZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gTWF0aExpdmUgc2VyaWFsaXNlcyBlbXB0eSBzbG90cyBhcyBcXHBsYWNlaG9sZGVye30sIHdoaWNoIE1hdGhKYXggKHVzZWQgYnlcbiAgICAvLyBAcGllLWxpYi9tYXRoLXJlbmRlcmluZyBmb3IgcHJvbXB0cy9wcmV2aWV3cykgcmVuZGVycyBhcyByZWQgZXJyb3IgdGV4dC5cbiAgICBpdCgnc3RyaXBzIHVubmFtZWQgcGxhY2Vob2xkZXJzIHRoYXQgTWF0aExpdmUgYWRkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUoJ1xcXFxsb25nZGl2e1xcXFxwbGFjZWhvbGRlcnt9fScpKS50b0VxdWFsKCdcXFxcbG9uZ2Rpdnt9Jyk7XG4gICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKCdcXFxcZnJhY3tcXFxccGxhY2Vob2xkZXJ7fX17XFxcXHBsYWNlaG9sZGVye319JykpLnRvRXF1YWwoJ1xcXFxmcmFje317fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2tlZXBzIGNvbnRlbnQgaW5zaWRlIGFuIHVubmFtZWQgcGxhY2Vob2xkZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKCdcXFxcc3FydHtcXFxccGxhY2Vob2xkZXJ7N319JykpLnRvRXF1YWwoJ1xcXFxzcXJ0ezd9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhIGJhcmUgXFxcXHBsYWNlaG9sZGVyIHdpdGggbm8gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKCdcXFxcbG9uZ2RpdntcXFxccGxhY2Vob2xkZXJ9JykpLnRvRXF1YWwoJ1xcXFxsb25nZGl2e30nKTtcbiAgICB9KTtcblxuICAgIGl0KCduZXZlciBsZWFrcyB0aGUgdG9rZW4gXFxcXHBsYWNlaG9sZGVyJywgKCkgPT4ge1xuICAgICAgWydcXFxcbG9uZ2RpdntcXFxccGxhY2Vob2xkZXJ7fX0nLCAnXFxcXGZyYWN7XFxcXHBsYWNlaG9sZGVye319e3h9JywgJ1xcXFxwbGFjZWhvbGRlcnt9J10uZm9yRWFjaCgobCkgPT4ge1xuICAgICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKGwpKS5ub3QudG9Db250YWluKCdcXFxccGxhY2Vob2xkZXInKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N0aWxsIG1hcHMgTkFNRUQgcGxhY2Vob2xkZXJzIHRvIGFuc3dlciBibG9ja3MnLCAoKSA9PiB7XG4gICAgICAvLyBuYW1lZCBvbmVzIGFyZSBhbnN3ZXIgYmxvY2tzIGFuZCBtdXN0IHN1cnZpdmVcbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUoJ1xcXFxwbGFjZWhvbGRlcltyMV17fScpKS50b0VxdWFsKCdcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcHMgYW5zd2VyIGJsb2NrcyBjb21iaW5lZCB3aXRoIG5ld2xpbmVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVkID0gYFxcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjFde30ke05FV0xJTkVfRU1CRUR9eWA7XG5cbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUodG9NYXRoTGl2ZShzdG9yZWQpKSkudG9FcXVhbChzdG9yZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIE1hdGhMaXZlIG1hY3JvIHNlcmlhbGlzZXMgZnJvbSB0aGUgYXJndW1lbnRzIGl0IHdhcyBjcmVhdGVkIHdpdGgsIHNvIHRleHRcbiAgLy8gdHlwZWQgaW5zaWRlIGl0cyBleHBhbnNpb24gbmV2ZXIgY29tZXMgYmFjayBvdXQgb2YgZ2V0VmFsdWUoJ2xhdGV4JykuXG4gIC8vIEFyZ3VtZW50LXRha2luZyBwaWUgY29tbWFuZHMgbXVzdCB0aGVyZWZvcmUgYmVjb21lIG5hdGl2ZSBjb25zdHJ1Y3RzIGJlZm9yZVxuICAvLyB0aGV5IHJlYWNoIGEgbWF0aGZpZWxkLlxuICBkZXNjcmliZSgndG9OYXRpdmVDb21tYW5kcycsICgpID0+IHtcbiAgICBpdCgnZXhwYW5kcyBcXFxcbG9uZ2RpdiB0byBuYXRpdmUgXFxcXGVuY2xvc2UnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnXFxcXGxvbmdkaXZ7MTIzNH0nKSkudG9FcXVhbCgnXFxcXGVuY2xvc2V7bG9uZ2Rpdn17MTIzNH0nKTtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcbG9uZ2Rpdnt9JykpLnRvRXF1YWwoJ1xcXFxlbmNsb3Nle2xvbmdkaXZ9e30nKTtcbiAgICB9KTtcblxuICAgIGl0KCdleHBhbmRzIFxcXFxvdmVyYXJjIHRvIG5hdGl2ZSBcXFxcb3ZlcnBhcmVuJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJ1xcXFxvdmVyYXJje0FCfScpKS50b0VxdWFsKCdcXFxcb3ZlcnBhcmVue0FCfScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2V4cGFuZHMgXFxcXGFicyB0byBuYXRpdmUgXFxcXGxlZnR8Li5cXFxccmlnaHR8JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJ1xcXFxhYnN7eH0nKSkudG9FcXVhbCgnXFxcXGxlZnR8eFxcXFxyaWdodHwnKTtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcYWJze30nKSkudG9FcXVhbCgnXFxcXGxlZnR8XFxcXHJpZ2h0fCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbmVzdGVkIGJyYWNlcyBpbnNpZGUgXFxcXGFicycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcYWJze1xcXFxmcmFjezF9ezJ9fScpKS50b0VxdWFsKCdcXFxcbGVmdHxcXFxcZnJhY3sxfXsyfVxcXFxyaWdodHwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHNldmVyYWwgb2NjdXJyZW5jZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnXFxcXGFic3thfStcXFxcYWJze2J9JykpLnRvRXF1YWwoJ1xcXFxsZWZ0fGFcXFxccmlnaHR8K1xcXFxsZWZ0fGJcXFxccmlnaHR8Jyk7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnXFxcXGxvbmdkaXZ7MX1cXFxcbG9uZ2RpdnsyfScpKS50b0VxdWFsKCdcXFxcZW5jbG9zZXtsb25nZGl2fXsxfVxcXFxlbmNsb3Nle2xvbmdkaXZ9ezJ9Jyk7XG4gICAgfSk7XG5cbiAgICAvLyBgJWAgc3RhcnRzIGEgY29tbWVudCBpbiByZWFsIExhVGVYLCBzbyBNYXRoTGl2ZSBkcm9wcyBpdCBhbmQgZXZlcnl0aGluZ1xuICAgIC8vIGFmdGVyIGl0LiBNYXRoUXVpbGwgaGFkIG5vIGNvbW1lbnRzLCBzbyBsYXRleCBhdXRob3JlZCB1bmRlciBpdCAtIG9yIGJ5XG4gICAgLy8gaGFuZCAtIGNhbiBjYXJyeSBhIGJhcmUgYCVgIHRoYXQgd291bGQgc2lsZW50bHkgdHJ1bmNhdGUgdGhlIGV4cHJlc3Npb24uXG4gICAgaXQoJ2VzY2FwZXMgYSBiYXJlICUgc28gaXQgY2Fubm90IGNvbW1lbnQgb3V0IHRoZSByZXN0IG9mIHRoZSBsaW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJyUnKSkudG9FcXVhbCgnXFxcXCUnKTtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCc1MCUnKSkudG9FcXVhbCgnNTBcXFxcJScpO1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJ3gleScpKS50b0VxdWFsKCd4XFxcXCV5Jyk7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnYSViJWMnKSkudG9FcXVhbCgnYVxcXFwlYlxcXFwlYycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlYXZlcyBhbiBhbHJlYWR5LWVzY2FwZWQgJSBhbG9uZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcJScpKS50b0VxdWFsKCdcXFxcJScpO1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJzUwXFxcXCUnKSkudG9FcXVhbCgnNTBcXFxcJScpO1xuICAgICAgLy8gaWRlbXBvdGVudDogdG9NYXRoTGl2ZSBtYXkgcnVuIG92ZXIgbGF0ZXggdGhhdCBjYW1lIGJhY2sgb3V0IG9mIGEgZmllbGRcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKHRvTmF0aXZlQ29tbWFuZHMoJzUwJScpKSkudG9FcXVhbCgnNTBcXFxcJScpO1xuICAgIH0pO1xuXG4gICAgLy8gYFxcXFxgIGlzIGEgbGluZSBicmVhaywgbm90IGFuIGVzY2FwZSwgc28gdGhlIGAlYCBhZnRlciBpdCBpcyBzdGlsbCBiYXJlLlxuICAgIGl0KCdjb3VudHMgYmFja3NsYXNoZXMgdG8gZGVjaWRlIHdoZXRoZXIgYSAlIGlzIGVzY2FwZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnYVxcXFxcXFxcJWInKSkudG9FcXVhbCgnYVxcXFxcXFxcXFxcXCViJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIG90aGVyIGxhdGV4IHVudG91Y2hlZCcsICgpID0+IHtcbiAgICAgIFsnXFxcXGZyYWN7MX17Mn0nLCAnXFxcXHBpJywgJ1xcXFxzcXJ0e3h9JywgJ1xcXFxvdmVybGluZXtBQn0nXS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKGwpKS50b0VxdWFsKGwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBudWxsaXNoIGlucHV0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHModW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnJykpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGFwcGxpZWQgYnkgdG9NYXRoTGl2ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKCdcXFxcbG9uZ2Rpdns1fScpKS50b0VxdWFsKCdcXFxcZW5jbG9zZXtsb25nZGl2fXs1fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGxlYXZlIGEgcGllIG1hY3JvIGluIHdoYXQgcmVhY2hlcyB0aGUgZmllbGQnLCAoKSA9PiB7XG4gICAgICBbJ1xcXFxsb25nZGl2ezd9JywgJ1xcXFxhYnN7N30nLCAnXFxcXG92ZXJhcmN7N30nXS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICAgIGNvbnN0IG91dCA9IHRvTWF0aExpdmUobCk7XG5cbiAgICAgICAgZXhwZWN0KG91dCkubm90LnRvTWF0Y2goL1xcXFxsb25nZGl2fFxcXFxhYnN8XFxcXG92ZXJhcmMvKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmllbGRJZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgaWRzIGluIGRvY3VtZW50IG9yZGVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpZWxkSWRzKCdcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9K1xcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjJde30nKSkudG9FcXVhbChbJ3IxJywgJ3IyJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgW10gd2hlbiB0aGVyZSBhcmUgbm9uZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChmaWVsZElkcygneCt5JykpLnRvRXF1YWwoW10pO1xuICAgICAgZXhwZWN0KGZpZWxkSWRzKHVuZGVmaW5lZCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIHJlcGVhdGFibGUgKHJlZ2V4IGxhc3RJbmRleCBpcyByZXNldCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBsYXRleCA9ICdcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9JztcblxuICAgICAgZXhwZWN0KGZpZWxkSWRzKGxhdGV4KSkudG9FcXVhbChbJ3IxJ10pO1xuICAgICAgZXhwZWN0KGZpZWxkSWRzKGxhdGV4KSkudG9FcXVhbChbJ3IxJ10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgna2V5VG9BY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3ByZWZlcnMgbGF0ZXggd2hlbiB0aGVyZSBpcyBubyBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgbGF0ZXg6ICdcXFxccGknLCB3cml0ZTogJ3AnIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXHBpJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIHdyaXRlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgd3JpdGU6ICd4JyB9KSkudG9FcXVhbCh7IHR5cGU6ICdpbnNlcnQnLCB2YWx1ZTogJ3gnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2V4cGFuZHMgY29tbWFuZHMgdGhhdCB0YWtlIGFyZ3VtZW50cyBpbnRvIHBsYWNlaG9sZGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6ICdcXFxcZnJhYycgfSkpLnRvRXF1YWwoeyB0eXBlOiAnaW5zZXJ0JywgdmFsdWU6ICdcXFxcZnJhY3sjP317Iz99JyB9KTtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6ICdcXFxcc3FydCcgfSkpLnRvRXF1YWwoeyB0eXBlOiAnaW5zZXJ0JywgdmFsdWU6ICdcXFxcc3FydHsjP30nIH0pO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgY29tbWFuZDogJ14nIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXnsjP30nIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gTWF0aFF1aWxsJ3MgYC9gIHR1cm5lZCB0aGUgcHJlY2VkaW5nIGV4cHJlc3Npb24gaW50byB0aGUgbnVtZXJhdG9yOiB0eXBlXG4gICAgLy8gNSwgcHJlc3MgdGhlIGtleSwgZ2V0IDUvXyB3aXRoIHRoZSBjYXJldCBpbiB0aGUgZGVub21pbmF0b3IuIGAjQGAgaXNcbiAgICAvLyBNYXRoTGl2ZSdzIFwic2VsZWN0aW9uLCBvciB0aGUgaXRlbSBiZWZvcmUgdGhlIGN1cnNvclwiIHRva2VuLCBhbmQgaXMgd2hhdFxuICAgIC8vIE1hdGhMaXZlIGJpbmRzIHRvIGAvYCBpdHNlbGYuXG4gICAgaXQoJ2RpdmlzaW9uIHRha2VzIHRoZSBwcmVjZWRpbmcgaXRlbSBhcyB0aGUgbnVtZXJhdG9yJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgY29tbWFuZDogJy8nIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXGZyYWN7I0B9eyM/fScgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwbGljaXQgYmxhbmstb3Zlci1ibGFuayBmcmFjdGlvbiBzdGF5cyBlbXB0eScsICgpID0+IHtcbiAgICAgIC8vIGRpc3RpbmN0IGZyb20gYC9gOiB0aGlzIGtleSBpcyBtZWFudCB0byBpbnNlcnQgdHdvIGVtcHR5IHNsb3RzXG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24oeyBjb21tYW5kOiAnXFxcXGZyYWMnIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXGZyYWN7Iz99eyM/fScgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhlIHgtb3Zlci1ibGFuayBrZXkgcm91dGVzIHRocm91Z2ggZGl2aXNpb24nLCAoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICAgIGNvbnN0IHsgeE92ZXJCbGFuayB9ID0gcmVxdWlyZSgnLi4va2V5cy9mcmFjdGlvbnMnKTtcblxuICAgICAgZXhwZWN0KHhPdmVyQmxhbmsuY29tbWFuZCkudG9FcXVhbCgnLycpO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHhPdmVyQmxhbmspLnZhbHVlKS50b0VxdWFsKCdcXFxcZnJhY3sjQH17Iz99Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGFyZ3VtZW50LWxlc3MgY29tbWFuZHMgdGhyb3VnaCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6ICdcXFxccGknIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXHBpJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjb25jYXRlbmF0ZXMgYXJyYXkgY29tbWFuZHMgKE1hdGhRdWlsbCBjbWQoKSBhcHBsaWVkIHRoZW0gaW4gc2VxdWVuY2UpJywgKCkgPT4ge1xuICAgICAgLy8gTWVhc3VyZWQgQW5nbGVcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6IFsnbScsICdcXFxcYW5nbGUnXSB9KSkudG9FcXVhbCh7IHR5cGU6ICdpbnNlcnQnLCB2YWx1ZTogJ21cXFxcYW5nbGUnIH0pO1xuICAgICAgLy8gbG9nIGJhc2UgbiAtIHRoZSBgX2AgcGFydCBtdXN0IHN0aWxsIGV4cGFuZCB0byBhIHBsYWNlaG9sZGVyXG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24oeyBjb21tYW5kOiBbJ1xcXFxsb2cnLCAnXyddIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXGxvZ197Iz99JyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhbHdheXMgcmV0dXJucyBhIHN0cmluZyB2YWx1ZSBmb3IgaW5zZXJ0IGFjdGlvbnMnLCAoKSA9PiB7XG4gICAgICBbeyBjb21tYW5kOiBbJ20nLCAnXFxcXGFuZ2xlJ10gfSwgeyBjb21tYW5kOiAnXFxcXGZyYWMnIH0sIHsgd3JpdGU6ICd4JyB9LCB7IGxhdGV4OiAnXFxcXHBpJyB9XS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0eXBlb2Yga2V5VG9BY3Rpb24oaykudmFsdWUpLnRvQmUoJ3N0cmluZycpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWFwcyBrZXlzdHJva2VzIHRvIE1hdGhMaXZlIHNlbGVjdG9ycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGtleXN0cm9rZTogJ0xlZnQnIH0pKS50b0VxdWFsKHsgdHlwZTogJ2NvbW1hbmQnLCB2YWx1ZTogJ21vdmVUb1ByZXZpb3VzQ2hhcicgfSk7XG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24oeyBrZXlzdHJva2U6ICdSaWdodCcgfSkpLnRvRXF1YWwoeyB0eXBlOiAnY29tbWFuZCcsIHZhbHVlOiAnbW92ZVRvTmV4dENoYXInIH0pO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsga2V5c3Ryb2tlOiAnQmFja3NwYWNlJyB9KSkudG9FcXVhbCh7IHR5cGU6ICdjb21tYW5kJywgdmFsdWU6ICdkZWxldGVCYWNrd2FyZCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyB1bmRlZmluZWQgZm9yIHVua25vd24vZW1wdHkgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24odW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHt9KSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsga2V5c3Ryb2tlOiAnTm9wZScgfSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsYXRleCB3aW5zIG92ZXIgY29tbWFuZCBvbmx5IHdoZW4gY29tbWFuZCBpcyBhYnNlbnQnLCAoKSA9PiB7XG4gICAgICAvLyBhIGtleSB3aXRoIGJvdGggc2hvdWxkIHVzZSB0aGUgY29tbWFuZCBwYXRoIChtYXRjaGVzIE1hdGhJbnB1dC5rZXlwYWRQcmVzcylcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGxhdGV4OiAnXFxcXGZyYWN7fXt9JywgY29tbWFuZDogJ1xcXFxmcmFjJyB9KSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdpbnNlcnQnLFxuICAgICAgICB2YWx1ZTogJ1xcXFxmcmFjeyM/fXsjP30nLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFVQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFNO0VBQzdCQSxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQU07SUFDM0JDLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxZQUFNO01BQ3JDQyxNQUFNLENBQUMsSUFBQUMsdUJBQVUsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQzVELENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsdUJBQXVCLEVBQUUsWUFBTTtNQUNoQ0MsTUFBTSxDQUFDLElBQUFDLHVCQUFVLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEVBQUUsQ0FBQztNQUNsQ0YsTUFBTSxDQUFDLElBQUFDLHVCQUFVLEVBQUNFLFNBQVMsQ0FBQyxDQUFDLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7TUFDekNGLE1BQU0sQ0FBQyxJQUFBQyx1QkFBVSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxZQUFNO01BQzlEQyxNQUFNLENBQUMsSUFBQUMsdUJBQVUsTUFBQUcsTUFBQSxDQUFLQywwQkFBYSxNQUFHLENBQUMs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