@pie-lib/math-input-mathlive 1.1.5-beta.8 → 2.0.1-next.20261107131445

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +84 -109
  2. package/dist/_virtual/_rolldown/runtime.js +11 -0
  3. package/dist/horizontal-keypad.d.ts +22 -0
  4. package/dist/horizontal-keypad.js +54 -0
  5. package/dist/index.d.ts +20 -0
  6. package/dist/index.js +12 -0
  7. package/dist/keypad/index.d.ts +40 -0
  8. package/dist/keypad/index.js +245 -0
  9. package/dist/keypad/keys-layout.d.ts +7 -0
  10. package/dist/keypad/keys-layout.js +5 -0
  11. package/dist/keys/basic-operators.d.ts +5 -0
  12. package/dist/keys/basic-operators.js +30 -0
  13. package/dist/keys/chars.d.ts +5 -0
  14. package/dist/keys/comparison.d.ts +4 -0
  15. package/dist/keys/comparison.js +32 -0
  16. package/dist/keys/constants.d.ts +4 -0
  17. package/dist/keys/constants.js +35 -0
  18. package/dist/keys/digits.d.ts +15 -0
  19. package/dist/keys/digits.js +34 -0
  20. package/dist/keys/edit.d.ts +6 -0
  21. package/dist/keys/edit.js +9 -0
  22. package/dist/keys/exponent.d.ts +4 -0
  23. package/dist/keys/exponent.js +28 -0
  24. package/dist/keys/fractions.d.ts +3 -0
  25. package/dist/keys/fractions.js +27 -0
  26. package/dist/keys/geometry.d.ts +23 -0
  27. package/dist/keys/geometry.js +127 -0
  28. package/dist/keys/grades.d.ts +9 -0
  29. package/dist/keys/grades.js +414 -0
  30. package/dist/keys/index.d.ts +6 -0
  31. package/dist/keys/index.js +50 -0
  32. package/dist/keys/log.d.ts +3 -0
  33. package/dist/keys/log.js +25 -0
  34. package/dist/keys/logic.d.ts +2 -0
  35. package/dist/keys/logic.js +13 -0
  36. package/dist/keys/matrices.d.ts +2 -0
  37. package/dist/keys/matrices.js +17 -0
  38. package/dist/keys/misc.d.ts +10 -0
  39. package/dist/keys/misc.js +60 -0
  40. package/dist/keys/navigation.d.ts +2 -0
  41. package/dist/keys/navigation.js +13 -0
  42. package/dist/keys/operators.d.ts +1 -0
  43. package/dist/keys/operators.js +11 -0
  44. package/dist/keys/statistics.d.ts +5 -0
  45. package/dist/keys/statistics.js +38 -0
  46. package/dist/keys/sub-sup.d.ts +2 -0
  47. package/dist/keys/sub-sup.js +17 -0
  48. package/dist/keys/trigonometry.d.ts +6 -0
  49. package/dist/keys/trigonometry.js +43 -0
  50. package/dist/keys/utils.d.ts +5 -0
  51. package/dist/keys/utils.js +24 -0
  52. package/dist/keys/vars.d.ts +3 -0
  53. package/dist/keys/vars.js +22 -0
  54. package/dist/latex-bridge.d.ts +197 -0
  55. package/dist/latex-bridge.js +210 -0
  56. package/dist/longdiv.d.ts +24 -0
  57. package/dist/longdiv.js +43 -0
  58. package/dist/math-input.d.ts +26 -0
  59. package/dist/math-input.js +74 -0
  60. package/dist/mathlive-instance.d.ts +221 -0
  61. package/dist/mathlive-instance.js +159 -0
  62. package/dist/mf/common-styles.d.ts +594 -0
  63. package/dist/mf/common-styles.js +80 -0
  64. package/dist/mf/field-label.d.ts +16 -0
  65. package/dist/mf/field-label.js +13 -0
  66. package/dist/mf/index.d.ts +4 -0
  67. package/dist/mf/index.js +21 -0
  68. package/dist/mf/input.d.ts +94 -0
  69. package/dist/mf/input.js +127 -0
  70. package/dist/mf/static.d.ts +143 -0
  71. package/dist/mf/static.js +230 -0
  72. package/dist/selection.d.ts +43 -0
  73. package/dist/selection.js +39 -0
  74. package/package.json +32 -18
  75. package/lib/__tests__/composites.test.js +0 -255
  76. package/lib/__tests__/drop-in-compat.test.js +0 -133
  77. package/lib/__tests__/embedded-fonts.test.js +0 -121
  78. package/lib/__tests__/index.test.js +0 -118
  79. package/lib/__tests__/input-imperative.test.js +0 -155
  80. package/lib/__tests__/input-selection.test.js +0 -103
  81. package/lib/__tests__/keypad-label.test.js +0 -231
  82. package/lib/__tests__/keypad-render.test.js +0 -206
  83. package/lib/__tests__/latex-bridge.test.js +0 -386
  84. package/lib/__tests__/mathlive-instance.test.js +0 -419
  85. package/lib/__tests__/mount-race.test.js +0 -218
  86. package/lib/__tests__/selection.test.js +0 -195
  87. package/lib/__tests__/static-prompts.test.js +0 -405
  88. package/lib/__tests__/tmp-markup.test.js +0 -26
  89. package/lib/horizontal-keypad.js +0 -101
  90. package/lib/horizontal-keypad.js.map +0 -1
  91. package/lib/index.js +0 -143
  92. package/lib/index.js.map +0 -1
  93. package/lib/keypad/index.js +0 -431
  94. package/lib/keypad/index.js.map +0 -1
  95. package/lib/keypad/keys-layout.js +0 -22
  96. package/lib/keypad/keys-layout.js.map +0 -1
  97. package/lib/keys/basic-operators.js +0 -33
  98. package/lib/keys/basic-operators.js.map +0 -1
  99. package/lib/keys/chars.js +0 -12
  100. package/lib/keys/chars.js.map +0 -1
  101. package/lib/keys/comparison.js +0 -39
  102. package/lib/keys/comparison.js.map +0 -1
  103. package/lib/keys/constants.js +0 -37
  104. package/lib/keys/constants.js.map +0 -1
  105. package/lib/keys/digits.js +0 -46
  106. package/lib/keys/digits.js.map +0 -1
  107. package/lib/keys/edit.js +0 -14
  108. package/lib/keys/edit.js.map +0 -1
  109. package/lib/keys/exponent.js +0 -30
  110. package/lib/keys/exponent.js.map +0 -1
  111. package/lib/keys/fractions.js +0 -29
  112. package/lib/keys/fractions.js.map +0 -1
  113. package/lib/keys/geometry.js +0 -143
  114. package/lib/keys/geometry.js.map +0 -1
  115. package/lib/keys/grades.js +0 -259
  116. package/lib/keys/grades.js.map +0 -1
  117. package/lib/keys/index.js +0 -35
  118. package/lib/keys/index.js.map +0 -1
  119. package/lib/keys/log.js +0 -27
  120. package/lib/keys/log.js.map +0 -1
  121. package/lib/keys/logic.js +0 -19
  122. package/lib/keys/logic.js.map +0 -1
  123. package/lib/keys/matrices.js +0 -19
  124. package/lib/keys/matrices.js.map +0 -1
  125. package/lib/keys/misc.js +0 -69
  126. package/lib/keys/misc.js.map +0 -1
  127. package/lib/keys/navigation.js +0 -20
  128. package/lib/keys/navigation.js.map +0 -1
  129. package/lib/keys/operators.js +0 -15
  130. package/lib/keys/operators.js.map +0 -1
  131. package/lib/keys/statistics.js +0 -40
  132. package/lib/keys/statistics.js.map +0 -1
  133. package/lib/keys/sub-sup.js +0 -19
  134. package/lib/keys/sub-sup.js.map +0 -1
  135. package/lib/keys/trigonometry.js +0 -45
  136. package/lib/keys/trigonometry.js.map +0 -1
  137. package/lib/keys/utils.js +0 -87
  138. package/lib/keys/utils.js.map +0 -1
  139. package/lib/keys/vars.js +0 -24
  140. package/lib/keys/vars.js.map +0 -1
  141. package/lib/latex-bridge.js +0 -445
  142. package/lib/latex-bridge.js.map +0 -1
  143. package/lib/math-input.js +0 -143
  144. package/lib/math-input.js.map +0 -1
  145. package/lib/mathlive-instance.js +0 -585
  146. package/lib/mathlive-instance.js.map +0 -1
  147. package/lib/mf/common-styles.js +0 -203
  148. package/lib/mf/common-styles.js.map +0 -1
  149. package/lib/mf/index.js +0 -84
  150. package/lib/mf/index.js.map +0 -1
  151. package/lib/mf/input.js +0 -372
  152. package/lib/mf/input.js.map +0 -1
  153. package/lib/mf/static.js +0 -500
  154. package/lib/mf/static.js.map +0 -1
  155. package/lib/selection.js +0 -148
  156. package/lib/selection.js.map +0 -1
  157. package/src/__tests__/composites.test.jsx +0 -220
  158. package/src/__tests__/drop-in-compat.test.jsx +0 -112
  159. package/src/__tests__/index.test.jsx +0 -109
  160. package/src/__tests__/input-imperative.test.jsx +0 -144
  161. package/src/__tests__/input-selection.test.jsx +0 -64
  162. package/src/__tests__/keypad-label.test.jsx +0 -283
  163. package/src/__tests__/keypad-render.test.jsx +0 -123
  164. package/src/__tests__/latex-bridge.test.js +0 -359
  165. package/src/__tests__/mathlive-instance.test.js +0 -418
  166. package/src/__tests__/mount-race.test.jsx +0 -142
  167. package/src/__tests__/selection.test.js +0 -212
  168. package/src/__tests__/static-prompts.test.jsx +0 -364
  169. package/src/horizontal-keypad.jsx +0 -73
  170. package/src/index.jsx +0 -63
  171. package/src/keypad/index.jsx +0 -386
  172. package/src/keypad/keys-layout.js +0 -16
  173. package/src/keys/basic-operators.js +0 -32
  174. package/src/keys/chars.js +0 -5
  175. package/src/keys/comparison.js +0 -28
  176. package/src/keys/constants.js +0 -35
  177. package/src/keys/digits.js +0 -40
  178. package/src/keys/edit.js +0 -3
  179. package/src/keys/exponent.js +0 -28
  180. package/src/keys/fractions.js +0 -26
  181. package/src/keys/geometry.js +0 -149
  182. package/src/keys/grades.js +0 -367
  183. package/src/keys/index.js +0 -20
  184. package/src/keys/log.js +0 -22
  185. package/src/keys/logic.js +0 -15
  186. package/src/keys/matrices.js +0 -15
  187. package/src/keys/misc.js +0 -71
  188. package/src/keys/navigation.js +0 -8
  189. package/src/keys/operators.js +0 -10
  190. package/src/keys/statistics.js +0 -38
  191. package/src/keys/sub-sup.js +0 -15
  192. package/src/keys/trigonometry.js +0 -15
  193. package/src/keys/utils.js +0 -66
  194. package/src/keys/vars.js +0 -19
  195. package/src/latex-bridge.js +0 -449
  196. package/src/math-input.jsx +0 -115
  197. package/src/mathlive-instance.js +0 -582
  198. package/src/mf/common-styles.js +0 -210
  199. package/src/mf/index.js +0 -30
  200. package/src/mf/input.jsx +0 -328
  201. package/src/mf/static.jsx +0 -479
  202. package/src/selection.js +0 -146
@@ -1,231 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
5
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
6
- var _latexBridge = require("../latex-bridge");
7
- /**
8
- * Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
9
- * MathLive renders `{}` as nothing, so labels need a visible stand-in - but the
10
- * value that gets *inserted* must stay untouched.
11
- */
12
- describe('keypad label display normalisation', function () {
13
- it('gives empty groups a visible glyph', function () {
14
- var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
15
- expect(out).not.toEqual('\\frac{}{}');
16
- // a \rule, not a glyph: font metrics for a substituted glyph do not match
17
- // MathLive's, which left stretchy accents narrower than the box
18
- expect(out).toContain('\\rule');
19
- expect(out).toContain('pie-empty');
20
- });
21
- it.each([['absolute value', '\\abs{}', '|', '|'], ['parenthesis', '\\left(\\right)', '(', ')'], ['brackets', '\\left[\\right]', '[', ']']])('gives an empty %s a tall, filled slot (the same muted tag as other slots)', function (_name, latex, open, close) {
22
- var out = (0, _latexBridge.withVisibleEmptySlots)((0, _latexBridge.toMathLive)(latex));
23
- expect(out).toContain('pie-empty=1');
24
- expect(out).toContain('\\rule[-0.25em]{0.55em}{1em}');
25
- expect(out).not.toContain('\\boxed');
26
- // the strut that keeps the fences tall while the box is centred on the axis
27
- expect(out).toContain('\\rule{0em}{1em}');
28
- expect(out.startsWith("\\left".concat(open))).toBe(true);
29
- expect(out.endsWith("\\right".concat(close))).toBe(true);
30
- });
31
- it('leaves a filled pair of fences alone', function () {
32
- expect((0, _latexBridge.withVisibleEmptySlots)((0, _latexBridge.toMathLive)('\\abs{x}'))).toEqual('\\left|x\\right|');
33
- expect((0, _latexBridge.withVisibleEmptySlots)('\\left(x\\right)')).toEqual('\\left(x\\right)');
34
- });
35
- it('handles every empty-group key shape', function () {
36
- ['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
37
- expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
38
- });
39
- });
40
- it('treats a whitespace-only group as empty', function () {
41
- // e.g. \frac{x}{ }
42
- expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
43
- });
44
-
45
- // MathQuill needed a nested \overline{} to draw the empty box. MathLive
46
- // renders that as a real line, so those labels showed a spurious bar (a line
47
- // under the arrows, and a straight line instead of the arc).
48
- it('accent keys do not carry the nested-overline box hack', function () {
49
- // eslint-disable-next-line global-require
50
- var geometry = require('../keys/geometry');
51
- Object.values(geometry).forEach(function (key) {
52
- if (key && typeof key.latex === 'string') {
53
- expect(key.latex).not.toContain('\\overline{}}');
54
- }
55
- });
56
- });
57
- it('an accent over an empty slot still gets a visible box', function () {
58
- ['\\overleftrightarrow{}', '\\overarc{}'].forEach(function (latex) {
59
- var out = (0, _latexBridge.withVisibleEmptySlots)(latex);
60
- expect(out).toContain('pie-empty');
61
- expect(out).not.toContain('\\overline');
62
- });
63
- });
64
-
65
- // A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,
66
- // so the browser substituted a wider one and stretchy accents came out
67
- // narrower than the box. A rule has an explicit width.
68
- it('the empty slot has an explicit width, not font-dependent metrics', function () {
69
- var out = (0, _latexBridge.withVisibleEmptySlots)('\\overarc{}');
70
- expect(out).toContain('\\rule');
71
- expect(out).toMatch(/rule\{[\d.]+em\}\{[\d.]+em\}/);
72
- expect(out).not.toContain('unicode');
73
- });
74
-
75
- // Measured in the browser: the accent's immediate wrapper computes to 0px
76
- // (its .ML__stretchy child is absolutely positioned), so the svg width has to
77
- // resolve against .ML__base - whose width equals the content. Without pinning
78
- // that, the arc collapsed to a spike and sat right of the box.
79
- it('pins the accent containing block and drops the centering shift', function () {
80
- // eslint-disable-next-line global-require
81
- var _require = require('../mf/common-styles'),
82
- placeholderStyles = _require.placeholderStyles;
83
- expect(placeholderStyles['& .ML__base'].position).toEqual('relative');
84
- expect(placeholderStyles['& .ML__stretchy']).toEqual({
85
- position: 'absolute',
86
- left: 0,
87
- width: '100%'
88
- });
89
- // must be !important: MathLive writes margin-left as an inline style, and a
90
- // class cannot override that. Leaving it un-important also halved the arc's
91
- // width, because .ML__center is the stretchy's containing block.
92
- expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');
93
- });
94
-
95
- // MathLive sets the index of \sqrt[n]{x} in scriptscriptstyle - an inline
96
- // `font-size: 50%` - which is too small to read on the nth-root key and in
97
- // authored radicals. It is scaled up to 80%.
98
- describe('radical index size', function () {
99
- // Real MathLive 0.110 output for `\sqrt[1]{2}`, trimmed to the index. The
100
- // selector walks this exact chain, so this fixture is what pins it down.
101
- var INDEX_MARKUP = "\n <span class=\"ML__base\">\n <span class=\"ML__sqrt-index\">\n <span class=\"ML__vlist-t\"><span class=\"ML__vlist-r\"><span class=\"ML__vlist\" style=\"height:0.78em\">\n <span style=\"top:-3.45em\">\n <span class=\"ML__pstrut\" style=\"height:3em\"></span>\n <span id=\"index-size\" style=\"height:0.33em;display:inline-block;font-size: 50%\">\n <span class=\"ML__cmr\">1</span>\n <span id=\"nested-size\" style=\"font-size: 50%\">nested</span>\n </span>\n </span>\n </span></span></span>\n </span>\n <span class=\"ML__sqrt-sign\"><span class=\"ML__delim-size1\">&#8730;</span></span>\n </span>";
102
- var rule = function rule() {
103
- // eslint-disable-next-line global-require
104
- var _require2 = require('../mf/common-styles'),
105
- rootIndexStyles = _require2.rootIndexStyles;
106
- var selectors = Object.keys(rootIndexStyles);
107
- expect(selectors).toHaveLength(1);
108
- return {
109
- selector: selectors[0],
110
- value: rootIndexStyles[selectors[0]].fontSize
111
- };
112
- };
113
- it("scales the index glyph to 80%, up from MathLive's 50%", function () {
114
- // !important: the 50% is an inline style, which a class cannot override.
115
- expect(rule().value).toEqual('80% !important');
116
- });
117
- it('targets the span MathLive puts the inline font-size on', function () {
118
- var holder = document.createElement('div');
119
- holder.innerHTML = INDEX_MARKUP;
120
- var matched = holder.querySelectorAll(rule().selector.replace(/^&\s*/, ''));
121
- expect(Array.from(matched).map(function (el) {
122
- return el.id;
123
- })).toEqual(['index-size']);
124
- });
125
- it('leaves the radical index box itself unscaled', function () {
126
- // Scaling `.ML__sqrt-index` would scale the em-based top/height offsets
127
- // that tuck the index into the radical, lifting it clear of the crook.
128
- var _rule = rule(),
129
- selector = _rule.selector;
130
- expect(selector).not.toMatch(/\.ML__sqrt-index\s*\{?$/);
131
- expect(selector.startsWith('& .ML__sqrt-index >')).toBe(true);
132
- });
133
- it('applies wherever math renders - keypad labels, static math, mathfield', function () {
134
- // eslint-disable-next-line global-require
135
- var cs = require('../mf/common-styles');
136
- var _rule2 = rule(),
137
- selector = _rule2.selector;
138
- ['commonKeyboardStyles', 'commonMathLiveStyles', 'supsubStyles'].forEach(function (name) {
139
- expect(cs[name][selector]).toBeDefined();
140
- });
141
-
142
- // The live mathfield renders in a shadow root, which host styles cannot
143
- // reach, so the same rule ships as plain CSS for `applyShadowStyles`.
144
- expect(cs.ROOT_INDEX_CSS).toContain('.ML__sqrt-index >');
145
- // Derived, so the size lives in one place: the two copies cannot drift.
146
- expect(cs.ROOT_INDEX_CSS).toContain("font-size:".concat(rule().value));
147
- });
148
- });
149
- it('applies those rules wherever static math renders', function () {
150
- // eslint-disable-next-line global-require
151
- var cs = require('../mf/common-styles');
152
- ['commonKeyboardStyles', 'commonMathLiveStyles'].forEach(function (name) {
153
- expect(cs[name]['& .ML__stretchy']).toBeDefined();
154
- expect(cs[name]['& .ML__base']).toBeDefined();
155
- });
156
- });
157
-
158
- // A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule
159
- // is descendant-scoped to .ML__latex .ML__stretchy svg.
160
- it('does not use a blanket svg rule', function () {
161
- // eslint-disable-next-line global-require
162
- var cs = require('../mf/common-styles');
163
- Object.values(cs).forEach(function (style) {
164
- if (style && (0, _typeof2["default"])(style) === 'object') {
165
- expect(Object.keys(style)).not.toContain('& svg');
166
- }
167
- });
168
- });
169
-
170
- // The Percent key showed as a blank button on the Advanced Algebra keypad
171
- // (row 1, position 6). MathQuill defined `LatexCmds['%']` as a symbol that
172
- // serialised to `\\%`, so its bare `%` label parsed fine; MathLive parses real
173
- // LaTeX, where `%` opens a comment - the label rendered nothing, and pressing
174
- // the key inserted a comment that swallowed the rest of the expression.
175
- it('the percent key is escaped, not a latex comment', function () {
176
- // eslint-disable-next-line global-require
177
- var _require3 = require('../keys/misc'),
178
- percentage = _require3.percentage;
179
- expect(percentage.latex).toEqual('\\%');
180
- expect((0, _latexBridge.keyToAction)(percentage).value).toEqual('\\%');
181
- });
182
-
183
- // Any bare `%` in a key would fail the same way, silently.
184
- it('no keypad key carries an unescaped %', function () {
185
- // eslint-disable-next-line global-require
186
- var _require4 = require('../keys'),
187
- baseSet = _require4.baseSet;
188
- // eslint-disable-next-line global-require
189
- var _require5 = require('../keys/grades'),
190
- gradeSets = _require5.gradeSets;
191
- var every = [].concat((0, _toConsumableArray2["default"])(baseSet), (0, _toConsumableArray2["default"])(gradeSets.map(function (g) {
192
- return g.set;
193
- })));
194
- var _walk = function walk(node) {
195
- if (Array.isArray(node)) {
196
- node.forEach(_walk);
197
- return;
198
- }
199
- if (!node) {
200
- return;
201
- }
202
- ['latex', 'write', 'command'].forEach(function (field) {
203
- var value = node[field];
204
- if (typeof value === 'string') {
205
- // a `%` is only safe when preceded by an odd run of backslashes
206
- expect(value.replace(/\\./g, '')).not.toContain('%');
207
- }
208
- });
209
- };
210
- _walk(every);
211
- });
212
- it('leaves latex without empty groups alone', function () {
213
- ['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
214
- expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
215
- });
216
- });
217
- it('handles nullish input', function () {
218
- expect((0, _latexBridge.withVisibleEmptySlots)(undefined)).toEqual('');
219
- expect((0, _latexBridge.withVisibleEmptySlots)('')).toEqual('');
220
- });
221
- it('does NOT affect what gets inserted into the field', function () {
222
- // the action must use the key's own latex, never the display form
223
- var key = {
224
- name: 'frac',
225
- latex: '\\frac{}{}'
226
- };
227
- expect((0, _latexBridge.keyToAction)(key).value).toEqual('\\frac{}{}');
228
- expect((0, _latexBridge.keyToAction)(key).value).not.toContain('pie-empty');
229
- });
230
- });
231
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsIm91dCIsImxhdGV4Rm9yRGlzcGxheSIsImV4cGVjdCIsIm5vdCIsInRvRXF1YWwiLCJ0b0NvbnRhaW4iLCJlYWNoIiwiX25hbWUiLCJsYXRleCIsIm9wZW4iLCJjbG9zZSIsInRvTWF0aExpdmUiLCJzdGFydHNXaXRoIiwiY29uY2F0IiwidG9CZSIsImVuZHNXaXRoIiwiZm9yRWFjaCIsImdlb21ldHJ5IiwiT2JqZWN0IiwidmFsdWVzIiwia2V5IiwidG9NYXRjaCIsIl9yZXF1aXJlIiwicGxhY2Vob2xkZXJTdHlsZXMiLCJwb3NpdGlvbiIsImxlZnQiLCJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJJTkRFWF9NQVJLVVAiLCJydWxlIiwiX3JlcXVpcmUyIiwicm9vdEluZGV4U3R5bGVzIiwic2VsZWN0b3JzIiwia2V5cyIsInRvSGF2ZUxlbmd0aCIsInNlbGVjdG9yIiwidmFsdWUiLCJmb250U2l6ZSIsImhvbGRlciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsIm1hdGNoZWQiLCJxdWVyeVNlbGVjdG9yQWxsIiwicmVwbGFjZSIsIkFycmF5IiwiZnJvbSIsIm1hcCIsImVsIiwiaWQiLCJfcnVsZSIsImNzIiwiX3J1bGUyIiwibmFtZSIsInRvQmVEZWZpbmVkIiwiUk9PVF9JTkRFWF9DU1MiLCJzdHlsZSIsIl90eXBlb2YyIiwiX3JlcXVpcmUzIiwicGVyY2VudGFnZSIsImtleVRvQWN0aW9uIiwiX3JlcXVpcmU0IiwiYmFzZVNldCIsIl9yZXF1aXJlNSIsImdyYWRlU2V0cyIsImV2ZXJ5IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImciLCJzZXQiLCJ3YWxrIiwibm9kZSIsImlzQXJyYXkiLCJmaWVsZCIsInVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18va2V5cGFkLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdpdGhWaXNpYmxlRW1wdHlTbG90cyBhcyBsYXRleEZvckRpc3BsYXkgfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuaW1wb3J0IHsga2V5VG9BY3Rpb24sIHRvTWF0aExpdmUgfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuXG4vKipcbiAqIEtleXMgdXNlIGVtcHR5IGdyb3VwcyB0byBzaG93IGEgY29tbWFuZCdzIHNoYXBlIChgXFxmcmFje317fWAsIGB4Xnt9YCkuXG4gKiBNYXRoTGl2ZSByZW5kZXJzIGB7fWAgYXMgbm90aGluZywgc28gbGFiZWxzIG5lZWQgYSB2aXNpYmxlIHN0YW5kLWluIC0gYnV0IHRoZVxuICogdmFsdWUgdGhhdCBnZXRzICppbnNlcnRlZCogbXVzdCBzdGF5IHVudG91Y2hlZC5cbiAqL1xuZGVzY3JpYmUoJ2tleXBhZCBsYWJlbCBkaXNwbGF5IG5vcm1hbGlzYXRpb24nLCAoKSA9PiB7XG4gIGl0KCdnaXZlcyBlbXB0eSBncm91cHMgYSB2aXNpYmxlIGdseXBoJywgKCkgPT4ge1xuICAgIGNvbnN0IG91dCA9IGxhdGV4Rm9yRGlzcGxheSgnXFxcXGZyYWN7fXt9Jyk7XG5cbiAgICBleHBlY3Qob3V0KS5ub3QudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgLy8gYSBcXHJ1bGUsIG5vdCBhIGdseXBoOiBmb250IG1ldHJpY3MgZm9yIGEgc3Vic3RpdHV0ZWQgZ2x5cGggZG8gbm90IG1hdGNoXG4gICAgLy8gTWF0aExpdmUncywgd2hpY2ggbGVmdCBzdHJldGNoeSBhY2NlbnRzIG5hcnJvd2VyIHRoYW4gdGhlIGJveFxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbignXFxcXHJ1bGUnKTtcbiAgICBleHBlY3Qob3V0KS50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICBbJ2Fic29sdXRlIHZhbHVlJywgJ1xcXFxhYnN7fScsICd8JywgJ3wnXSxcbiAgICBbJ3BhcmVudGhlc2lzJywgJ1xcXFxsZWZ0KFxcXFxyaWdodCknLCAnKCcsICcpJ10sXG4gICAgWydicmFja2V0cycsICdcXFxcbGVmdFtcXFxccmlnaHRdJywgJ1snLCAnXSddLFxuICBdKSgnZ2l2ZXMgYW4gZW1wdHkgJXMgYSB0YWxsLCBmaWxsZWQgc2xvdCAodGhlIHNhbWUgbXV0ZWQgdGFnIGFzIG90aGVyIHNsb3RzKScsIChfbmFtZSwgbGF0ZXgsIG9wZW4sIGNsb3NlKSA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbGF0ZXhGb3JEaXNwbGF5KHRvTWF0aExpdmUobGF0ZXgpKTtcblxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbigncGllLWVtcHR5PTEnKTtcbiAgICBleHBlY3Qob3V0KS50b0NvbnRhaW4oJ1xcXFxydWxlWy0wLjI1ZW1dezAuNTVlbX17MWVtfScpO1xuICAgIGV4cGVjdChvdXQpLm5vdC50b0NvbnRhaW4oJ1xcXFxib3hlZCcpO1xuICAgIC8vIHRoZSBzdHJ1dCB0aGF0IGtlZXBzIHRoZSBmZW5jZXMgdGFsbCB3aGlsZSB0aGUgYm94IGlzIGNlbnRyZWQgb24gdGhlIGF4aXNcbiAgICBleHBlY3Qob3V0KS50b0NvbnRhaW4oJ1xcXFxydWxlezBlbX17MWVtfScpO1xuICAgIGV4cGVjdChvdXQuc3RhcnRzV2l0aChgXFxcXGxlZnQke29wZW59YCkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KG91dC5lbmRzV2l0aChgXFxcXHJpZ2h0JHtjbG9zZX1gKSkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2xlYXZlcyBhIGZpbGxlZCBwYWlyIG9mIGZlbmNlcyBhbG9uZScsICgpID0+IHtcbiAgICBleHBlY3QobGF0ZXhGb3JEaXNwbGF5KHRvTWF0aExpdmUoJ1xcXFxhYnN7eH0nKSkpLnRvRXF1YWwoJ1xcXFxsZWZ0fHhcXFxccmlnaHR8Jyk7XG4gICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheSgnXFxcXGxlZnQoeFxcXFxyaWdodCknKSkudG9FcXVhbCgnXFxcXGxlZnQoeFxcXFxyaWdodCknKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgZXZlcnkgZW1wdHktZ3JvdXAga2V5IHNoYXBlJywgKCkgPT4ge1xuICAgIFtcbiAgICAgICdcXFxcZnJhY3t9e30nLFxuICAgICAgJ1xcXFxvdmVybGluZXt9JyxcbiAgICAgICd4Xnt9JyxcbiAgICAgICd4X3t9JyxcbiAgICAgICdcXFxcc3FydHt9JyxcbiAgICAgICdcXFxcc3FydFt7fV17fScsXG4gICAgICAnXFxcXGFic3t9JyxcbiAgICAgICdcXFxcbG9nX3t9JyxcbiAgICAgICdcXFxcbG9uZ2Rpdnt9JyxcbiAgICBdLmZvckVhY2goKGxhdGV4KSA9PiB7XG4gICAgICBleHBlY3QobGF0ZXhGb3JEaXNwbGF5KGxhdGV4KSkubm90LnRvQ29udGFpbigne30nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3RyZWF0cyBhIHdoaXRlc3BhY2Utb25seSBncm91cCBhcyBlbXB0eScsICgpID0+IHtcbiAgICAvLyBlLmcuIFxcZnJhY3t4fXsgfVxuICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkoJ1xcXFxmcmFje3h9eyB9JykpLnRvQ29udGFpbigncGllLWVtcHR5Jyk7XG4gIH0pO1xuXG4gIC8vIE1hdGhRdWlsbCBuZWVkZWQgYSBuZXN0ZWQgXFxvdmVybGluZXt9IHRvIGRyYXcgdGhlIGVtcHR5IGJveC4gTWF0aExpdmVcbiAgLy8gcmVuZGVycyB0aGF0IGFzIGEgcmVhbCBsaW5lLCBzbyB0aG9zZSBsYWJlbHMgc2hvd2VkIGEgc3B1cmlvdXMgYmFyIChhIGxpbmVcbiAgLy8gdW5kZXIgdGhlIGFycm93cywgYW5kIGEgc3RyYWlnaHQgbGluZSBpbnN0ZWFkIG9mIHRoZSBhcmMpLlxuICBpdCgnYWNjZW50IGtleXMgZG8gbm90IGNhcnJ5IHRoZSBuZXN0ZWQtb3ZlcmxpbmUgYm94IGhhY2snLCAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgY29uc3QgZ2VvbWV0cnkgPSByZXF1aXJlKCcuLi9rZXlzL2dlb21ldHJ5Jyk7XG5cbiAgICBPYmplY3QudmFsdWVzKGdlb21ldHJ5KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleS5sYXRleCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXhwZWN0KGtleS5sYXRleCkubm90LnRvQ29udGFpbignXFxcXG92ZXJsaW5le319Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdhbiBhY2NlbnQgb3ZlciBhbiBlbXB0eSBzbG90IHN0aWxsIGdldHMgYSB2aXNpYmxlIGJveCcsICgpID0+IHtcbiAgICBbJ1xcXFxvdmVybGVmdHJpZ2h0YXJyb3d7fScsICdcXFxcb3ZlcmFyY3t9J10uZm9yRWFjaCgobGF0ZXgpID0+IHtcbiAgICAgIGNvbnN0IG91dCA9IGxhdGV4Rm9yRGlzcGxheShsYXRleCk7XG5cbiAgICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbigncGllLWVtcHR5Jyk7XG4gICAgICBleHBlY3Qob3V0KS5ub3QudG9Db250YWluKCdcXFxcb3ZlcmxpbmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gQSBnbHlwaCdzIHdpZHRoIGNvbWVzIGZyb20gZm9udCBtZXRyaWNzOyBVKzI1QUIgaXMgbm90IGluIHRoZSBLYVRlWCBmb250cyxcbiAgLy8gc28gdGhlIGJyb3dzZXIgc3Vic3RpdHV0ZWQgYSB3aWRlciBvbmUgYW5kIHN0cmV0Y2h5IGFjY2VudHMgY2FtZSBvdXRcbiAgLy8gbmFycm93ZXIgdGhhbiB0aGUgYm94LiBBIHJ1bGUgaGFzIGFuIGV4cGxpY2l0IHdpZHRoLlxuICBpdCgndGhlIGVtcHR5IHNsb3QgaGFzIGFuIGV4cGxpY2l0IHdpZHRoLCBub3QgZm9udC1kZXBlbmRlbnQgbWV0cmljcycsICgpID0+IHtcbiAgICBjb25zdCBvdXQgPSBsYXRleEZvckRpc3BsYXkoJ1xcXFxvdmVyYXJje30nKTtcblxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbignXFxcXHJ1bGUnKTtcbiAgICBleHBlY3Qob3V0KS50b01hdGNoKC9ydWxlXFx7W1xcZC5dK2VtXFx9XFx7W1xcZC5dK2VtXFx9Lyk7XG4gICAgZXhwZWN0KG91dCkubm90LnRvQ29udGFpbigndW5pY29kZScpO1xuICB9KTtcblxuICAvLyBNZWFzdXJlZCBpbiB0aGUgYnJvd3NlcjogdGhlIGFjY2VudCdzIGltbWVkaWF0ZSB3cmFwcGVyIGNvbXB1dGVzIHRvIDBweFxuICAvLyAoaXRzIC5NTF9fc3RyZXRjaHkgY2hpbGQgaXMgYWJzb2x1dGVseSBwb3NpdGlvbmVkKSwgc28gdGhlIHN2ZyB3aWR0aCBoYXMgdG9cbiAgLy8gcmVzb2x2ZSBhZ2FpbnN0IC5NTF9fYmFzZSAtIHdob3NlIHdpZHRoIGVxdWFscyB0aGUgY29udGVudC4gV2l0aG91dCBwaW5uaW5nXG4gIC8vIHRoYXQsIHRoZSBhcmMgY29sbGFwc2VkIHRvIGEgc3Bpa2UgYW5kIHNhdCByaWdodCBvZiB0aGUgYm94LlxuICBpdCgncGlucyB0aGUgYWNjZW50IGNvbnRhaW5pbmcgYmxvY2sgYW5kIGRyb3BzIHRoZSBjZW50ZXJpbmcgc2hpZnQnLCAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgY29uc3QgeyBwbGFjZWhvbGRlclN0eWxlcyB9ID0gcmVxdWlyZSgnLi4vbWYvY29tbW9uLXN0eWxlcycpO1xuXG4gICAgZXhwZWN0KHBsYWNlaG9sZGVyU3R5bGVzWycmIC5NTF9fYmFzZSddLnBvc2l0aW9uKS50b0VxdWFsKCdyZWxhdGl2ZScpO1xuICAgIGV4cGVjdChwbGFjZWhvbGRlclN0eWxlc1snJiAuTUxfX3N0cmV0Y2h5J10pLnRvRXF1YWwoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgbGVmdDogMCwgd2lkdGg6ICcxMDAlJyB9KTtcbiAgICAvLyBtdXN0IGJlICFpbXBvcnRhbnQ6IE1hdGhMaXZlIHdyaXRlcyBtYXJnaW4tbGVmdCBhcyBhbiBpbmxpbmUgc3R5bGUsIGFuZCBhXG4gICAgLy8gY2xhc3MgY2Fubm90IG92ZXJyaWRlIHRoYXQuIExlYXZpbmcgaXQgdW4taW1wb3J0YW50IGFsc28gaGFsdmVkIHRoZSBhcmMnc1xuICAgIC8vIHdpZHRoLCBiZWNhdXNlIC5NTF9fY2VudGVyIGlzIHRoZSBzdHJldGNoeSdzIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgZXhwZWN0KHBsYWNlaG9sZGVyU3R5bGVzWycmIC5NTF9fY2VudGVyOmhhcyguTUxfX3N0cmV0Y2h5KSddLm1hcmdpbkxlZnQpLnRvRXF1YWwoJzAgIWltcG9ydGFudCcpO1xuICB9KTtcblxuICAvLyBNYXRoTGl2ZSBzZXRzIHRoZSBpbmRleCBvZiBcXHNxcnRbbl17eH0gaW4gc2NyaXB0c2NyaXB0c3R5bGUgLSBhbiBpbmxpbmVcbiAgLy8gYGZvbnQtc2l6ZTogNTAlYCAtIHdoaWNoIGlzIHRvbyBzbWFsbCB0byByZWFkIG9uIHRoZSBudGgtcm9vdCBrZXkgYW5kIGluXG4gIC8vIGF1dGhvcmVkIHJhZGljYWxzLiBJdCBpcyBzY2FsZWQgdXAgdG8gODAlLlxuICBkZXNjcmliZSgncmFkaWNhbCBpbmRleCBzaXplJywgKCkgPT4ge1xuICAgIC8vIFJlYWwgTWF0aExpdmUgMC4xMTAgb3V0cHV0IGZvciBgXFxzcXJ0WzFdezJ9YCwgdHJpbW1lZCB0byB0aGUgaW5kZXguIFRoZVxuICAgIC8vIHNlbGVjdG9yIHdhbGtzIHRoaXMgZXhhY3QgY2hhaW4sIHNvIHRoaXMgZml4dHVyZSBpcyB3aGF0IHBpbnMgaXQgZG93bi5cbiAgICBjb25zdCBJTkRFWF9NQVJLVVAgPSBgXG4gICAgICA8c3BhbiBjbGFzcz1cIk1MX19iYXNlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX3NxcnQtaW5kZXhcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIk1MX192bGlzdC10XCI+PHNwYW4gY2xhc3M9XCJNTF9fdmxpc3QtclwiPjxzcGFuIGNsYXNzPVwiTUxfX3ZsaXN0XCIgc3R5bGU9XCJoZWlnaHQ6MC43OGVtXCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRvcDotMy40NWVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX3BzdHJ1dFwiIHN0eWxlPVwiaGVpZ2h0OjNlbVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJpbmRleC1zaXplXCIgc3R5bGU9XCJoZWlnaHQ6MC4zM2VtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTogNTAlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJNTF9fY21yXCI+MTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cIm5lc3RlZC1zaXplXCIgc3R5bGU9XCJmb250LXNpemU6IDUwJVwiPm5lc3RlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj48L3NwYW4+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX3NxcnQtc2lnblwiPjxzcGFuIGNsYXNzPVwiTUxfX2RlbGltLXNpemUxXCI+JiM4NzMwOzwvc3Bhbj48L3NwYW4+XG4gICAgICA8L3NwYW4+YDtcblxuICAgIGNvbnN0IHJ1bGUgPSAoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICAgIGNvbnN0IHsgcm9vdEluZGV4U3R5bGVzIH0gPSByZXF1aXJlKCcuLi9tZi9jb21tb24tc3R5bGVzJyk7XG4gICAgICBjb25zdCBzZWxlY3RvcnMgPSBPYmplY3Qua2V5cyhyb290SW5kZXhTdHlsZXMpO1xuXG4gICAgICBleHBlY3Qoc2VsZWN0b3JzKS50b0hhdmVMZW5ndGgoMSk7XG5cbiAgICAgIHJldHVybiB7IHNlbGVjdG9yOiBzZWxlY3RvcnNbMF0sIHZhbHVlOiByb290SW5kZXhTdHlsZXNbc2VsZWN0b3JzWzBdXS5mb250U2l6ZSB9O1xuICAgIH07XG5cbiAgICBpdChcInNjYWxlcyB0aGUgaW5kZXggZ2x5cGggdG8gODAlLCB1cCBmcm9tIE1hdGhMaXZlJ3MgNTAlXCIsICgpID0+IHtcbiAgICAgIC8vICFpbXBvcnRhbnQ6IHRoZSA1MCUgaXMgYW4gaW5saW5lIHN0eWxlLCB3aGljaCBhIGNsYXNzIGNhbm5vdCBvdmVycmlkZS5cbiAgICAgIGV4cGVjdChydWxlKCkudmFsdWUpLnRvRXF1YWwoJzgwJSAhaW1wb3J0YW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGFyZ2V0cyB0aGUgc3BhbiBNYXRoTGl2ZSBwdXRzIHRoZSBpbmxpbmUgZm9udC1zaXplIG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGhvbGRlci5pbm5lckhUTUwgPSBJTkRFWF9NQVJLVVA7XG5cbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBob2xkZXIucXVlcnlTZWxlY3RvckFsbChydWxlKCkuc2VsZWN0b3IucmVwbGFjZSgvXiZcXHMqLywgJycpKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmZyb20obWF0Y2hlZCkubWFwKChlbCkgPT4gZWwuaWQpKS50b0VxdWFsKFsnaW5kZXgtc2l6ZSddKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgdGhlIHJhZGljYWwgaW5kZXggYm94IGl0c2VsZiB1bnNjYWxlZCcsICgpID0+IHtcbiAgICAgIC8vIFNjYWxpbmcgYC5NTF9fc3FydC1pbmRleGAgd291bGQgc2NhbGUgdGhlIGVtLWJhc2VkIHRvcC9oZWlnaHQgb2Zmc2V0c1xuICAgICAgLy8gdGhhdCB0dWNrIHRoZSBpbmRleCBpbnRvIHRoZSByYWRpY2FsLCBsaWZ0aW5nIGl0IGNsZWFyIG9mIHRoZSBjcm9vay5cbiAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IHJ1bGUoKTtcblxuICAgICAgZXhwZWN0KHNlbGVjdG9yKS5ub3QudG9NYXRjaCgvXFwuTUxfX3NxcnQtaW5kZXhcXHMqXFx7PyQvKTtcbiAgICAgIGV4cGVjdChzZWxlY3Rvci5zdGFydHNXaXRoKCcmIC5NTF9fc3FydC1pbmRleCA+JykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYXBwbGllcyB3aGVyZXZlciBtYXRoIHJlbmRlcnMgLSBrZXlwYWQgbGFiZWxzLCBzdGF0aWMgbWF0aCwgbWF0aGZpZWxkJywgKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgICBjb25zdCBjcyA9IHJlcXVpcmUoJy4uL21mL2NvbW1vbi1zdHlsZXMnKTtcbiAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IHJ1bGUoKTtcblxuICAgICAgWydjb21tb25LZXlib2FyZFN0eWxlcycsICdjb21tb25NYXRoTGl2ZVN0eWxlcycsICdzdXBzdWJTdHlsZXMnXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGV4cGVjdChjc1tuYW1lXVtzZWxlY3Rvcl0pLnRvQmVEZWZpbmVkKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGxpdmUgbWF0aGZpZWxkIHJlbmRlcnMgaW4gYSBzaGFkb3cgcm9vdCwgd2hpY2ggaG9zdCBzdHlsZXMgY2Fubm90XG4gICAgICAvLyByZWFjaCwgc28gdGhlIHNhbWUgcnVsZSBzaGlwcyBhcyBwbGFpbiBDU1MgZm9yIGBhcHBseVNoYWRvd1N0eWxlc2AuXG4gICAgICBleHBlY3QoY3MuUk9PVF9JTkRFWF9DU1MpLnRvQ29udGFpbignLk1MX19zcXJ0LWluZGV4ID4nKTtcbiAgICAgIC8vIERlcml2ZWQsIHNvIHRoZSBzaXplIGxpdmVzIGluIG9uZSBwbGFjZTogdGhlIHR3byBjb3BpZXMgY2Fubm90IGRyaWZ0LlxuICAgICAgZXhwZWN0KGNzLlJPT1RfSU5ERVhfQ1NTKS50b0NvbnRhaW4oYGZvbnQtc2l6ZToke3J1bGUoKS52YWx1ZX1gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgdGhvc2UgcnVsZXMgd2hlcmV2ZXIgc3RhdGljIG1hdGggcmVuZGVycycsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCBjcyA9IHJlcXVpcmUoJy4uL21mL2NvbW1vbi1zdHlsZXMnKTtcblxuICAgIFsnY29tbW9uS2V5Ym9hcmRTdHlsZXMnLCAnY29tbW9uTWF0aExpdmVTdHlsZXMnXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICBleHBlY3QoY3NbbmFtZV1bJyYgLk1MX19zdHJldGNoeSddKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGNzW25hbWVdWycmIC5NTF9fYmFzZSddKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIGJhcmUgYCYgc3ZnYCBydWxlIHJlLXBhcmVudHMgZXZlcnkgc3ZnIGluIHRoZSBzdWJ0cmVlOyBNYXRoTGl2ZSdzIG93biBydWxlXG4gIC8vIGlzIGRlc2NlbmRhbnQtc2NvcGVkIHRvIC5NTF9fbGF0ZXggLk1MX19zdHJldGNoeSBzdmcuXG4gIGl0KCdkb2VzIG5vdCB1c2UgYSBibGFua2V0IHN2ZyBydWxlJywgKCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgIGNvbnN0IGNzID0gcmVxdWlyZSgnLi4vbWYvY29tbW9uLXN0eWxlcycpO1xuXG4gICAgT2JqZWN0LnZhbHVlcyhjcykuZm9yRWFjaCgoc3R5bGUpID0+IHtcbiAgICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdHlsZSkpLm5vdC50b0NvbnRhaW4oJyYgc3ZnJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFRoZSBQZXJjZW50IGtleSBzaG93ZWQgYXMgYSBibGFuayBidXR0b24gb24gdGhlIEFkdmFuY2VkIEFsZ2VicmEga2V5cGFkXG4gIC8vIChyb3cgMSwgcG9zaXRpb24gNikuIE1hdGhRdWlsbCBkZWZpbmVkIGBMYXRleENtZHNbJyUnXWAgYXMgYSBzeW1ib2wgdGhhdFxuICAvLyBzZXJpYWxpc2VkIHRvIGBcXFxcJWAsIHNvIGl0cyBiYXJlIGAlYCBsYWJlbCBwYXJzZWQgZmluZTsgTWF0aExpdmUgcGFyc2VzIHJlYWxcbiAgLy8gTGFUZVgsIHdoZXJlIGAlYCBvcGVucyBhIGNvbW1lbnQgLSB0aGUgbGFiZWwgcmVuZGVyZWQgbm90aGluZywgYW5kIHByZXNzaW5nXG4gIC8vIHRoZSBrZXkgaW5zZXJ0ZWQgYSBjb21tZW50IHRoYXQgc3dhbGxvd2VkIHRoZSByZXN0IG9mIHRoZSBleHByZXNzaW9uLlxuICBpdCgndGhlIHBlcmNlbnQga2V5IGlzIGVzY2FwZWQsIG5vdCBhIGxhdGV4IGNvbW1lbnQnLCAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgY29uc3QgeyBwZXJjZW50YWdlIH0gPSByZXF1aXJlKCcuLi9rZXlzL21pc2MnKTtcblxuICAgIGV4cGVjdChwZXJjZW50YWdlLmxhdGV4KS50b0VxdWFsKCdcXFxcJScpO1xuICAgIGV4cGVjdChrZXlUb0FjdGlvbihwZXJjZW50YWdlKS52YWx1ZSkudG9FcXVhbCgnXFxcXCUnKTtcbiAgfSk7XG5cbiAgLy8gQW55IGJhcmUgYCVgIGluIGEga2V5IHdvdWxkIGZhaWwgdGhlIHNhbWUgd2F5LCBzaWxlbnRseS5cbiAgaXQoJ25vIGtleXBhZCBrZXkgY2FycmllcyBhbiB1bmVzY2FwZWQgJScsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCB7IGJhc2VTZXQgfSA9IHJlcXVpcmUoJy4uL2tleXMnKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCB7IGdyYWRlU2V0cyB9ID0gcmVxdWlyZSgnLi4va2V5cy9ncmFkZXMnKTtcblxuICAgIGNvbnN0IGV2ZXJ5ID0gWy4uLmJhc2VTZXQsIC4uLmdyYWRlU2V0cy5tYXAoKGcpID0+IGcuc2V0KV07XG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgIG5vZGUuZm9yRWFjaCh3YWxrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBbJ2xhdGV4JywgJ3dyaXRlJywgJ2NvbW1hbmQnXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVbZmllbGRdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gYSBgJWAgaXMgb25seSBzYWZlIHdoZW4gcHJlY2VkZWQgYnkgYW4gb2RkIHJ1biBvZiBiYWNrc2xhc2hlc1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5yZXBsYWNlKC9cXFxcLi9nLCAnJykpLm5vdC50b0NvbnRhaW4oJyUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdhbGsoZXZlcnkpO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGxhdGV4IHdpdGhvdXQgZW1wdHkgZ3JvdXBzIGFsb25lJywgKCkgPT4ge1xuICAgIFsnXFxcXHBpJywgJ1xcXFxzaW4nLCAneF4yJywgJ1xcXFxvdmVybGluZXtBQn0nXS5mb3JFYWNoKChsYXRleCkgPT4ge1xuICAgICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheShsYXRleCkpLnRvRXF1YWwobGF0ZXgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyBudWxsaXNoIGlucHV0JywgKCkgPT4ge1xuICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkodW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheSgnJykpLnRvRXF1YWwoJycpO1xuICB9KTtcblxuICBpdCgnZG9lcyBOT1QgYWZmZWN0IHdoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBmaWVsZCcsICgpID0+IHtcbiAgICAvLyB0aGUgYWN0aW9uIG11c3QgdXNlIHRoZSBrZXkncyBvd24gbGF0ZXgsIG5ldmVyIHRoZSBkaXNwbGF5IGZvcm1cbiAgICBjb25zdCBrZXkgPSB7IG5hbWU6ICdmcmFjJywgbGF0ZXg6ICdcXFxcZnJhY3t9e30nIH07XG5cbiAgICBleHBlY3Qoa2V5VG9BY3Rpb24oa2V5KS52YWx1ZSkudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgZXhwZWN0KGtleVRvQWN0aW9uKGtleSkudmFsdWUpLm5vdC50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLFlBQUEsR0FBQUMsT0FBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUMsUUFBUSxDQUFDLG9DQUFvQyxFQUFFLFlBQU07RUFDbkRDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxZQUFNO0lBQzdDLElBQU1DLEdBQUcsR0FBRyxJQUFBQyxrQ0FBZSxFQUFDLFlBQVksQ0FBQztJQUV6Q0MsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0csR0FBRyxDQUFDQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3JDO0lBQ0E7SUFDQUYsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0ssU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUMvQkgsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0ssU0FBUyxDQUFDLFdBQVcsQ0FBQztFQUNwQyxDQUFDLENBQUM7RUFFRk4sRUFBRSxDQUFDTyxJQUFJLENBQUMsQ0FDTixDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQ3ZDLENBQUMsYUFBYSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFDNUMsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUMxQyxDQUFDLENBQUMs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
@@ -1,206 +0,0 @@
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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