@pie-element/math-inline 12.2.2-beta.4 → 12.2.3

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.
@@ -1,11 +0,0 @@
1
- {
2
- "hash": "394523898",
3
- "info": [
4
- {
5
- "pie": "@pie-element/math-inline",
6
- "version": {
7
- "requested": "latest"
8
- }
9
- }
10
- ]
11
- }
@@ -1,516 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
5
- var React = _interopRequireWildcard(require("react"));
6
- var _react2 = require("@testing-library/react");
7
- var _main = _interopRequireDefault(require("../main"));
8
- var _renderUi = require("@pie-lib/render-ui");
9
- var _correctAnswerToggle = require("@pie-lib/correct-answer-toggle");
10
- var _simpleQuestionBlock = _interopRequireDefault(require("../simple-question-block"));
11
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (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 (const 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
- jest.mock('@pie-lib/render-ui', () => ({
13
- color: {
14
- text: () => '#000',
15
- background: () => '#fff',
16
- primaryLight: () => '#ccc',
17
- correct: () => '#00ff00',
18
- incorrect: () => '#ff0000',
19
- secondary: () => '#888'
20
- },
21
- Feedback: props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
22
- "data-testid": "feedback"
23
- }, props)),
24
- PreviewPrompt: props => /*#__PURE__*/React.createElement("div", {
25
- "data-testid": "preview-prompt"
26
- }, props.children),
27
- UiLayout: props => /*#__PURE__*/React.createElement("div", {
28
- "data-testid": "ui-layout"
29
- }, props.children),
30
- Readable: props => /*#__PURE__*/React.createElement("div", {
31
- "data-testid": "readable"
32
- }, props.children),
33
- hasText: jest.fn(),
34
- hasMedia: jest.fn(),
35
- Collapsible: props => /*#__PURE__*/React.createElement("div", {
36
- "data-testid": "collapsible"
37
- }, props.children)
38
- }));
39
- jest.mock('@pie-lib/correct-answer-toggle', () => props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
40
- "data-testid": "correct-answer-toggle"
41
- }, props)));
42
- jest.mock('../simple-question-block', () => props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
43
- "data-testid": "simple-question-block"
44
- }, props)));
45
- jest.mock('@pie-lib/math-input-mathlive', () => ({
46
- mq: {
47
- Static: props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
48
- "data-testid": "mq-static"
49
- }, props))
50
- },
51
- HorizontalKeypad: props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
52
- "data-testid": "horizontal-keypad"
53
- }, props)),
54
- updateSpans: jest.fn(),
55
- registerEmbed: jest.fn(),
56
- applyStaticMath: jest.fn()
57
- }));
58
- jest.mock('@pie-lib/math-rendering', () => ({
59
- renderMath: jest.fn()
60
- }));
61
- jest.mock('@pie-lib/translator', () => ({
62
- __esModule: true,
63
- default: props => /*#__PURE__*/React.createElement("div", {
64
- "data-testid": "translator"
65
- }, props.children)
66
- }));
67
- const {
68
- registerEmbed
69
- } = require('@pie-lib/math-input-mathlive');
70
- describe('Math-Inline Main', () => {
71
- const defaultProps = {
72
- onSessionChange: jest.fn(),
73
- session: {},
74
- model: {
75
- id: '1',
76
- element: 'math-inline',
77
- correctness: {},
78
- config: {
79
- responseType: 'Advanced Multi',
80
- element: 'math-inline',
81
- question: '<p>The binomial <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>x</mi><mo>&#8722;</mo><mn>2</mn> </math> is a factor of the polynomial below.</p><p><span class="equation-block"><math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msup> <mi>x</mi> <mn>3</mn> </msup> <mo>+</mo><msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo><mi>n</mi><mi>x</mi><mo>+</mo><mn>10</mn> </math> </span></p><p>What is the value of <span class="variable">n</span>? Use the on-screen keyboard&#160;to type the correct answer in the box.</p>',
82
- expression: '\\text{A family sized box contains} {{response}} \\text{less than} {{response}} \\text{times the number }' + ' \\frac{3}{6}=\\frac{ {{response}} }{4} + \\frac{ {{response}} }{4}',
83
- equationEditor: 'miscellaneous',
84
- responses: [{
85
- validation: 'literal',
86
- answer: '\\frac{3}{6}=\\frac{1}{2}',
87
- alternates: {}
88
- }],
89
- feedback: {
90
- correct: {
91
- type: 'none',
92
- default: 'Correct'
93
- },
94
- partial: {
95
- type: 'none',
96
- default: 'Nearly'
97
- },
98
- incorrect: {
99
- type: 'none',
100
- default: 'Incorrect'
101
- }
102
- },
103
- note: 'The answer shown above is the primary correct answer specified by the author for this item, but other answers may also be recognized as correct.',
104
- customKeys: ['\\left(\\right)', '\\frac{}{}', 'x\\frac{}{}']
105
- }
106
- }
107
- };
108
- const wrapper = (props = {}) => {
109
- return (0, _react2.render)(/*#__PURE__*/React.createElement(_main.default, (0, _extends2.default)({}, defaultProps, props)));
110
- };
111
- const createInstance = (props = {}) => {
112
- const instanceProps = {
113
- ...defaultProps,
114
- ...props
115
- };
116
- const instance = new _main.default(instanceProps);
117
- instance.setState = jest.fn(state => {
118
- Object.assign(instance.state, typeof state === 'function' ? state(instance.state) : state);
119
- });
120
- return instance;
121
- };
122
- describe('render', () => {
123
- it('renders correctly', () => {
124
- const {
125
- queryByTestId
126
- } = wrapper();
127
- expect(queryByTestId('correct-answer-toggle')).not.toBeInTheDocument();
128
- expect(queryByTestId('feedback')).not.toBeInTheDocument();
129
- const instance = createInstance();
130
- expect(instance.state).toEqual({
131
- activeAnswerBlock: '',
132
- session: {
133
- answers: {
134
- r1: {
135
- value: ''
136
- },
137
- r2: {
138
- value: ''
139
- },
140
- r3: {
141
- value: ''
142
- },
143
- r4: {
144
- value: ''
145
- }
146
- }
147
- },
148
- showCorrect: false,
149
- tooltipContainerRef: expect.any(Object)
150
- });
151
- expect(registerEmbed).toHaveBeenCalled();
152
- });
153
- });
154
- describe('handleKeyDown', () => {
155
- let instance;
156
- let textarea;
157
- beforeEach(() => {
158
- instance = createInstance();
159
- textarea = document.createElement('textarea');
160
- textarea.setAttribute('aria-label', 'Enter answer.');
161
- document.body.appendChild(textarea);
162
- textarea.focus();
163
- });
164
- afterEach(() => {
165
- document.body.innerHTML = '';
166
- });
167
- it('should have handleKeyDown method', () => {
168
- expect(instance.handleKeyDown).toBeInstanceOf(Function);
169
- });
170
- it('should activate the keypad when ArrowDown is pressed', () => {
171
- const event = {
172
- key: 'ArrowDown',
173
- target: document.activeElement
174
- };
175
- instance.handleKeyDown(event, 'r1');
176
- expect(instance.state.activeAnswerBlock).toEqual('');
177
- });
178
- it('should activate the keypad on click or touch event', () => {
179
- const clickEvent = {
180
- type: 'click',
181
- target: document.activeElement
182
- };
183
- instance.handleKeyDown(clickEvent, 'r1');
184
- expect(instance.state.activeAnswerBlock).toEqual('');
185
- instance.setState({
186
- activeAnswerBlock: ''
187
- });
188
- const touchEvent = {
189
- type: 'touchstart',
190
- target: document.activeElement
191
- };
192
- instance.handleKeyDown(touchEvent, 'r1');
193
- expect(instance.state.activeAnswerBlock).toEqual('');
194
- });
195
- it('should deactivate the keypad on Escape key press', () => {
196
- instance.setState({
197
- activeAnswerBlock: 'r1'
198
- });
199
- instance.handleKeyDown({
200
- key: 'Escape',
201
- target: document.activeElement
202
- }, 'r1');
203
- expect(instance.state.activeAnswerBlock).toEqual('');
204
- });
205
- it('should deactivate the keypad if the input is not focused and a click or touch event occurs', () => {
206
- const event = {
207
- key: 'ArrowDown',
208
- target: document.activeElement
209
- };
210
- instance.setState({
211
- activeAnswerBlock: 'r1'
212
- });
213
- instance.onBlur(event);
214
- expect(instance.state.activeAnswerBlock).toEqual('');
215
- });
216
- });
217
- describe('logic', () => {
218
- it('prepares latex correctly and answer blocks and turns them into inputs', () => {
219
- const instance = createInstance();
220
- // The latex preparation happens in the render method
221
- // We can't easily test the exact latex output without rendering, but we can verify the structure is set up correctly
222
- expect(instance.state.session.answers).toHaveProperty('r1');
223
- expect(instance.state.session.answers).toHaveProperty('r2');
224
- expect(instance.state.session.answers).toHaveProperty('r3');
225
- expect(instance.state.session.answers).toHaveProperty('r4');
226
- });
227
- it('correctly renders simple interaction in case of simple mode', () => {
228
- // First verify advanced mode renders mq-static
229
- const {
230
- queryByTestId,
231
- unmount
232
- } = wrapper();
233
- expect(queryByTestId('mq-static')).toBeInTheDocument();
234
- expect(queryByTestId('simple-question-block')).not.toBeInTheDocument();
235
- unmount();
236
-
237
- // Then verify simple mode renders simple-question-block
238
- const simpleProps = {
239
- ...defaultProps,
240
- model: {
241
- ...defaultProps.model,
242
- config: {
243
- ...defaultProps.model.config,
244
- responseType: 'Simple'
245
- }
246
- }
247
- };
248
- const {
249
- queryByTestId: querySimple
250
- } = (0, _react2.render)(/*#__PURE__*/React.createElement(_main.default, simpleProps));
251
- expect(querySimple('mq-static')).not.toBeInTheDocument();
252
- expect(querySimple('simple-question-block')).toBeInTheDocument();
253
- });
254
- it('correctly pre-populates answers from session', () => {
255
- const instance = createInstance({
256
- session: {
257
- answers: {
258
- r1: {
259
- value: '\\frac{n-5}{6}'
260
- }
261
- }
262
- }
263
- });
264
- expect(instance.state).toEqual({
265
- activeAnswerBlock: '',
266
- session: {
267
- answers: {
268
- r1: {
269
- value: '\\frac{n-5}{6}'
270
- },
271
- r2: {
272
- value: ''
273
- },
274
- r3: {
275
- value: ''
276
- },
277
- r4: {
278
- value: ''
279
- }
280
- }
281
- },
282
- showCorrect: false,
283
- tooltipContainerRef: expect.any(Object)
284
- });
285
- });
286
- it('correctly updates session in case of model change', () => {
287
- const instance = createInstance();
288
- instance.subFieldChanged('r1', 'value');
289
- expect(instance.state).toEqual({
290
- activeAnswerBlock: '',
291
- session: {
292
- answers: {
293
- r1: {
294
- value: 'value'
295
- },
296
- r2: {
297
- value: ''
298
- },
299
- r3: {
300
- value: ''
301
- },
302
- r4: {
303
- value: ''
304
- }
305
- }
306
- },
307
- showCorrect: false,
308
- tooltipContainerRef: expect.any(Object)
309
- });
310
- });
311
- it('correctly updates session in case of subfield change', () => {
312
- const instance = createInstance();
313
- expect(instance.state).toEqual({
314
- activeAnswerBlock: '',
315
- session: {
316
- answers: {
317
- r1: {
318
- value: ''
319
- },
320
- r2: {
321
- value: ''
322
- },
323
- r3: {
324
- value: ''
325
- },
326
- r4: {
327
- value: ''
328
- }
329
- }
330
- },
331
- showCorrect: false,
332
- tooltipContainerRef: expect.any(Object)
333
- });
334
- const newProps = {
335
- ...defaultProps,
336
- model: {
337
- ...defaultProps.model,
338
- config: {
339
- ...defaultProps.model.config,
340
- expression: defaultProps.model.config.expression + ' {{response}}'
341
- }
342
- }
343
- };
344
- const newInstance = createInstance(newProps);
345
- expect(newInstance.state).toEqual({
346
- activeAnswerBlock: '',
347
- session: {
348
- answers: {
349
- r1: {
350
- value: ''
351
- },
352
- r2: {
353
- value: ''
354
- },
355
- r3: {
356
- value: ''
357
- },
358
- r4: {
359
- value: ''
360
- },
361
- r5: {
362
- value: ''
363
- }
364
- }
365
- },
366
- showCorrect: false,
367
- tooltipContainerRef: expect.any(Object)
368
- });
369
- });
370
- });
371
- describe('Main component additional functions', () => {
372
- let instance;
373
- let textarea;
374
- beforeEach(() => {
375
- instance = createInstance();
376
- textarea = document.createElement('textarea');
377
- textarea.setAttribute('aria-label', 'Enter answer.');
378
- document.body.appendChild(textarea);
379
- textarea.focus();
380
- });
381
- afterEach(() => {
382
- document.body.innerHTML = '';
383
- });
384
- it('should handle answer block DOM update correctly', () => {
385
- const mockRoot = document.createElement('div');
386
- mockRoot.innerHTML = `
387
- <div id="r1"></div>
388
- <div id="r1Index"></div>
389
- `;
390
- instance.root = mockRoot;
391
- instance.handleAnswerBlockDomUpdate();
392
- expect(mockRoot.querySelector('#r1').textContent).toEqual('');
393
- });
394
- it('should count response occurrences correctly', () => {
395
- const expression = '{{response}} + {{response}} = {{response}}';
396
- const count = instance.countResponseOccurrences(expression);
397
- expect(count).toEqual(3);
398
- });
399
- it('should update aria attributes correctly', () => {
400
- const mockRoot = document.createElement('div');
401
- mockRoot.innerHTML = `
402
- <div class="mq-selectable"></div>
403
- <div class="mq-selectable"></div>
404
- <div class="mq-textarea">
405
- <textarea></textarea>
406
- </div>
407
- `;
408
- instance.root = mockRoot;
409
- instance.updateAria();
410
- const textareaElements = mockRoot.querySelectorAll('textarea');
411
- textareaElements.forEach((elem, index) => {
412
- expect(elem.getAttribute('aria-label')).toEqual('Enter answer.');
413
- expect(elem.getAttribute('aria-describedby')).not.toBeNull();
414
- const describedById = elem.getAttribute('aria-describedby');
415
- const describedByElement = mockRoot.querySelector(`#${describedById}`);
416
- expect(describedByElement).not.toBeNull();
417
- });
418
- });
419
- it('should focus first keypad element correctly', () => {
420
- jest.useFakeTimers();
421
- const mockRoot = document.createElement('div');
422
- mockRoot.innerHTML = `
423
- <div data-keypad="true">
424
- <button>Button 1</button>
425
- <button>Button 2</button>
426
- </div>
427
- `;
428
- document.body.appendChild(mockRoot);
429
- instance.root = mockRoot;
430
- instance.focusFirstKeypadElement();
431
- jest.runAllTimers();
432
- const focusedElement = document.activeElement;
433
- expect(focusedElement.textContent).toEqual('Button 1');
434
- document.body.removeChild(mockRoot);
435
- jest.useRealTimers();
436
- });
437
- it('should handle blur correctly', () => {
438
- instance.setState({
439
- activeAnswerBlock: 'r1'
440
- });
441
- const mockRelatedTarget = document.createElement('div');
442
- const parentWithTooltip = document.createElement('div');
443
- parentWithTooltip.setAttribute('role', 'tooltip');
444
- const childWithKeypad = document.createElement('div');
445
- childWithKeypad.setAttribute('data-keypad', 'true');
446
- parentWithTooltip.appendChild(childWithKeypad);
447
- Object.defineProperty(mockRelatedTarget, 'offsetParent', {
448
- get: function () {
449
- return parentWithTooltip;
450
- }
451
- });
452
- const event = {
453
- relatedTarget: mockRelatedTarget,
454
- currentTarget: document.createElement('div')
455
- };
456
- instance.onBlur(event);
457
- expect(instance.state.activeAnswerBlock).toEqual('r1');
458
- event.relatedTarget = null;
459
- instance.onBlur(event);
460
- expect(instance.state.activeAnswerBlock).toEqual('');
461
- });
462
- it('should call onSessionChange correctly', () => {
463
- instance.setState({
464
- session: {
465
- answers: {
466
- r1: {
467
- value: 'test'
468
- }
469
- }
470
- }
471
- });
472
- instance.callOnSessionChange();
473
- expect(defaultProps.onSessionChange).toHaveBeenCalledWith({
474
- answers: {
475
- r1: {
476
- value: 'test'
477
- }
478
- }
479
- });
480
- });
481
- it('should toggle show correct state correctly', () => {
482
- instance.toggleShowCorrect(true);
483
- expect(instance.state.showCorrect).toEqual(true);
484
- instance.toggleShowCorrect(false);
485
- expect(instance.state.showCorrect).toEqual(false);
486
- });
487
- it('should handle subFieldChanged correctly', () => {
488
- instance.subFieldChanged('r1', 'new value');
489
- expect(instance.state.session.answers.r1.value).toEqual('new value');
490
- });
491
- it('should get the correct field name', () => {
492
- const fields = {
493
- r1: {
494
- id: 1
495
- },
496
- r2: {
497
- id: 2
498
- }
499
- };
500
- instance.setState({
501
- session: {
502
- answers: {
503
- r1: {
504
- value: 'test'
505
- }
506
- }
507
- }
508
- });
509
- const fieldName = instance.getFieldName({
510
- id: 1
511
- }, fields);
512
- expect(fieldName).toEqual('r1');
513
- });
514
- });
515
- });
516
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWFpbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVuZGVyVWkiLCJfY29ycmVjdEFuc3dlclRvZ2dsZSIsIl9zaW1wbGVRdWVzdGlvbkJsb2NrIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiamVzdCIsIm1vY2siLCJjb2xvciIsInRleHQiLCJiYWNrZ3JvdW5kIiwicHJpbWFyeUxpZ2h0IiwiY29ycmVjdCIsImluY29ycmVjdCIsInNlY29uZGFyeSIsIkZlZWRiYWNrIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiUHJldmlld1Byb21wdCIsImNoaWxkcmVuIiwiVWlMYXlvdXQiLCJSZWFkYWJsZSIsImhhc1RleHQiLCJmbiIsImhhc01lZGlhIiwiQ29sbGFwc2libGUiLCJtcSIsIlN0YXRpYyIsIkhvcml6b250YWxLZXlwYWQiLCJ1cGRhdGVTcGFucyIsInJlZ2lzdGVyRW1iZWQiLCJhcHBseVN0YXRpY01hdGgiLCJyZW5kZXJNYXRoIiwiZGVzY3JpYmUiLCJkZWZhdWx0UHJvcHMiLCJvblNlc3Npb25DaGFuZ2UiLCJzZXNzaW9uIiwibW9kZWwiLCJpZCIsImVsZW1lbnQiLCJjb3JyZWN0bmVzcyIsImNvbmZpZyIsInJlc3BvbnNlVHlwZSIsInF1ZXN0aW9uIiwiZXhwcmVzc2lvbiIsImVxdWF0aW9uRWRpdG9yIiwicmVzcG9uc2VzIiwidmFsaWRhdGlvbiIsImFuc3dlciIsImFsdGVybmF0ZXMiLCJmZWVkYmFjayIsInR5cGUiLCJwYXJ0aWFsIiwibm90ZSIsImN1c3RvbUtleXMiLCJ3cmFwcGVyIiwicmVuZGVyIiwiY3JlYXRlSW5zdGFuY2UiLCJpbnN0YW5jZVByb3BzIiwiaW5zdGFuY2UiLCJNYWluIiwic2V0U3RhdGUiLCJzdGF0ZSIsImFzc2lnbiIsIml0IiwicXVlcnlCeVRlc3RJZCIsImV4cGVjdCIsIm5vdCIsInRvQmVJblRoZURvY3VtZW50IiwidG9FcXVhbCIsImFjdGl2ZUFuc3dlckJsb2NrIiwiYW5zd2VycyIsInIxIiwidmFsdWUiLCJyMiIsInIzIiwicjQiLCJzaG93Q29ycmVjdCIsInRvb2x0aXBDb250YWluZXJSZWYiLCJhbnkiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwidGV4dGFyZWEiLCJiZWZvcmVFYWNoIiwiZG9jdW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJmb2N1cyIsImFmdGVyRWFjaCIsImlubmVySFRNTCIsImhhbmRsZUtleURvd24iLCJ0b0JlSW5zdGFuY2VPZiIsIkZ1bmN0aW9uIiwiZXZlbnQiLCJrZXkiLCJ0YXJnZXQiLCJhY3RpdmVFbGVtZW50IiwiY2xpY2tFdmVudCIsInRvdWNoRXZlbnQiLCJvbkJsdXIiLCJ0b0hhdmVQcm9wZXJ0eSIsInVubW91bnQiLCJzaW1wbGVQcm9wcyIsInF1ZXJ5U2ltcGxlIiwic3ViRmllbGRDaGFuZ2VkIiwibmV3UHJvcHMiLCJuZXdJbnN0YW5jZSIsInI1IiwibW9ja1Jvb3QiLCJyb290IiwiaGFuZGxlQW5zd2VyQmxvY2tEb21VcGRhdGUiLCJxdWVyeVNlbGVjdG9yIiwidGV4dENvbnRlbnQiLCJjb3VudCIsImNvdW50UmVzcG9uc2VPY2N1cnJlbmNlcyIsInVwZGF0ZUFyaWEiLCJ0ZXh0YXJlYUVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtIiwiaW5kZXgiLCJnZXRBdHRyaWJ1dGUiLCJ0b0JlTnVsbCIsImRlc2NyaWJlZEJ5SWQiLCJkZXNjcmliZWRCeUVsZW1lbnQiLCJ1c2VGYWtlVGltZXJzIiwiZm9jdXNGaXJzdEtleXBhZEVsZW1lbnQiLCJydW5BbGxUaW1lcnMiLCJmb2N1c2VkRWxlbWVudCIsInJlbW92ZUNoaWxkIiwidXNlUmVhbFRpbWVycyIsIm1vY2tSZWxhdGVkVGFyZ2V0IiwicGFyZW50V2l0aFRvb2x0aXAiLCJjaGlsZFdpdGhLZXlwYWQiLCJyZWxhdGVkVGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImNhbGxPblNlc3Npb25DaGFuZ2UiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvZ2dsZVNob3dDb3JyZWN0IiwiZmllbGRzIiwiZmllbGROYW1lIiwiZ2V0RmllbGROYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYWluLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgTWFpbiBmcm9tICcuLi9tYWluJztcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnQHBpZS1saWIvcmVuZGVyLXVpJztcbmltcG9ydCB7IENvcnJlY3RBbnN3ZXJUb2dnbGUgfSBmcm9tICdAcGllLWxpYi9jb3JyZWN0LWFuc3dlci10b2dnbGUnO1xuaW1wb3J0IFNpbXBsZVF1ZXN0aW9uQmxvY2sgZnJvbSAnLi4vc2ltcGxlLXF1ZXN0aW9uLWJsb2NrJztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9yZW5kZXItdWknLCAoKSA9PiAoe1xuICBjb2xvcjoge1xuICAgIHRleHQ6ICgpID0+ICcjMDAwJyxcbiAgICBiYWNrZ3JvdW5kOiAoKSA9PiAnI2ZmZicsXG4gICAgcHJpbWFyeUxpZ2h0OiAoKSA9PiAnI2NjYycsXG4gICAgY29ycmVjdDogKCkgPT4gJyMwMGZmMDAnLFxuICAgIGluY29ycmVjdDogKCkgPT4gJyNmZjAwMDAnLFxuICAgIHNlY29uZGFyeTogKCkgPT4gJyM4ODgnLFxuICB9LFxuICBGZWVkYmFjazogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiZmVlZGJhY2tcIiB7Li4ucHJvcHN9IC8+LFxuICBQcmV2aWV3UHJvbXB0OiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJwcmV2aWV3LXByb21wdFwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIFVpTGF5b3V0OiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJ1aS1sYXlvdXRcIj57cHJvcHMuY2hpbGRyZW59PC9kaXY+LFxuICBSZWFkYWJsZTogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwicmVhZGFibGVcIj57cHJvcHMuY2hpbGRyZW59PC9kaXY+LFxuICBoYXNUZXh0OiBqZXN0LmZuKCksXG4gIGhhc01lZGlhOiBqZXN0LmZuKCksXG4gIENvbGxhcHNpYmxlOiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsYXBzaWJsZVwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29ycmVjdC1hbnN3ZXItdG9nZ2xlJywgKCkgPT4gKHByb3BzKSA9PiAoXG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb3JyZWN0LWFuc3dlci10b2dnbGVcIiB7Li4ucHJvcHN9IC8+XG4pKTtcblxuamVzdC5tb2NrKCcuLi9zaW1wbGUtcXVlc3Rpb24tYmxvY2snLCAoKSA9PiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJzaW1wbGUtcXVlc3Rpb24tYmxvY2tcIiB7Li4ucHJvcHN9IC8+KTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLWlucHV0LW1hdGhsaXZlJywgKCkgPT4gKHtcbiAgbXE6IHtcbiAgICBTdGF0aWM6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cIm1xLXN0YXRpY1wiIHsuLi5wcm9wc30gLz4sXG4gIH0sXG4gIEhvcml6b250YWxLZXlwYWQ6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImhvcml6b250YWwta2V5cGFkXCIgey4uLnByb3BzfSAvPixcbiAgdXBkYXRlU3BhbnM6IGplc3QuZm4oKSxcbiAgcmVnaXN0ZXJFbWJlZDogamVzdC5mbigpLFxuICBhcHBseVN0YXRpY01hdGg6IGplc3QuZm4oKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLXJlbmRlcmluZycsICgpID0+ICh7XG4gIHJlbmRlck1hdGg6IGplc3QuZm4oKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi90cmFuc2xhdG9yJywgKCkgPT4gKHtcbiAgX19lc01vZHVsZTogdHJ1ZSxcbiAgZGVmYXVsdDogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwidHJhbnNsYXRvclwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmNvbnN0IHsgcmVnaXN0ZXJFbWJlZCB9ID0gcmVxdWlyZSgnQHBpZS1saWIvbWF0aC1pbnB1dC1tYXRobGl2ZScpO1xuXG5kZXNjcmliZSgnTWF0aC1JbmxpbmUgTWFpbicsICgpID0+IHtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIG9uU2Vzc2lvbkNoYW5nZTogamVzdC5mbigpLFxuICAgIHNlc3Npb246IHt9LFxuICAgIG1vZGVsOiB7XG4gICAgICBpZDogJzEnLFxuICAgICAgZWxlbWVudDogJ21hdGgtaW5saW5lJyxcbiAgICAgIGNvcnJlY3RuZXNzOiB7fSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZXNwb25zZVR5cGU6ICdBZHZhbmNlZCBNdWx0aScsXG4gICAgICAgIGVsZW1lbnQ6ICdtYXRoLWlubGluZScsXG4gICAgICAgIHF1ZXN0aW9uOlxuICAgICAgICAgICc8cD5UaGUgYmlub21pYWwgPG1hdGggeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI+IDxtaT54PC9taT48bW8+JiM4NzIyOzwvbW8+PG1uPjI8L21uPiA8L21hdGg+IGlzIGEgZmFjdG9yIG9mIHRoZSBwb2x5bm9taWFsIGJlbG93LjwvcD48cD48c3BhbiBjbGFzcz1cImVxdWF0aW9uLWJsb2NrXCI+PG1hdGggeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI+IDxtaT5mPC9taT48bW8gc3RyZXRjaHk9XCJmYWxzZVwiPig8L21vPjxtaT54PC9taT48bW8gc3RyZXRjaHk9XCJmYWxzZVwiPik8L21vPjxtbz49PC9tbz48bXN1cD4gPG1pPng8L21pPiA8bW4+MzwvbW4+IDwvbXN1cD4gPG1vPis8L21vPjxtc3VwPiA8bWk+eDwvbWk+IDxtbj4yPC9tbj4gPC9tc3VwPiA8bW8+KzwvbW8+PG1pPm48L21pPjxtaT54PC9taT48bW8+KzwvbW8+PG1uPjEwPC9tbj4gPC9tYXRoPiA8L3NwYW4+PC9wPjxwPldoYXQgaXMgdGhlIHZhbHVlIG9mIDxzcGFuIGNsYXNzPVwidmFyaWFibGVcIj5uPC9zcGFuPj8gVXNlIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQmIzE2MDt0byB0eXBlIHRoZSBjb3JyZWN0IGFuc3dlciBpbiB0aGUgYm94LjwvcD4nLFxuICAgICAgICBleHByZXNzaW9uOlxuICAgICAgICAgICdcXFxcdGV4dHtBIGZhbWlseSBzaXplZCBib3ggY29udGFpbnN9IHt7cmVzcG9uc2V9fSBcXFxcdGV4dHtsZXNzIHRoYW59IHt7cmVzcG9uc2V9fSBcXFxcdGV4dHt0aW1lcyB0aGUgbnVtYmVyICB9JyArXG4gICAgICAgICAgJyAgXFxcXGZyYWN7M317Nn09XFxcXGZyYWN7IHt7cmVzcG9uc2V9fSB9ezR9ICsgXFxcXGZyYWN7IHt7cmVzcG9uc2V9fSB9ezR9JyxcbiAgICAgICAgZXF1YXRpb25FZGl0b3I6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgcmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsaWRhdGlvbjogJ2xpdGVyYWwnLFxuICAgICAgICAgICAgYW5zd2VyOiAnXFxcXGZyYWN7M317Nn09XFxcXGZyYWN7MX17Mn0nLFxuICAgICAgICAgICAgYWx0ZXJuYXRlczoge30sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICB0eXBlOiAnbm9uZScsXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29ycmVjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXJ0aWFsOiB7XG4gICAgICAgICAgICB0eXBlOiAnbm9uZScsXG4gICAgICAgICAgICBkZWZhdWx0OiAnTmVhcmx5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluY29ycmVjdDoge1xuICAgICAgICAgICAgdHlwZTogJ25vbmUnLFxuICAgICAgICAgICAgZGVmYXVsdDogJ0luY29ycmVjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbm90ZTogJ1RoZSBhbnN3ZXIgc2hvd24gYWJvdmUgaXMgdGhlIHByaW1hcnkgY29ycmVjdCBhbnN3ZXIgc3BlY2lmaWVkIGJ5IHRoZSBhdXRob3IgZm9yIHRoaXMgaXRlbSwgYnV0IG90aGVyIGFuc3dlcnMgbWF5IGFsc28gYmUgcmVjb2duaXplZCBhcyBjb3JyZWN0LicsXG4gICAgICAgIGN1c3RvbUtleXM6IFsnXFxcXGxlZnQoXFxcXHJpZ2h0KScsICdcXFxcZnJhY3t9e30nLCAneFxcXFxmcmFje317fSddLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHdyYXBwZXIgPSAocHJvcHMgPSB7fSkgPT4ge1xuICAgIHJldHVybiByZW5kZXIoPE1haW4gey4uLmRlZmF1bHRQcm9wc30gey4uLnByb3BzfSAvPik7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlSW5zdGFuY2UgPSAocHJvcHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE1haW4oaW5zdGFuY2VQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc2V0U3RhdGUgPSBqZXN0LmZuKChzdGF0ZSkgPT4ge1xuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5zdGF0ZSwgdHlwZW9mIHN0YXRlID09PSAnZnVuY3Rpb24nID8gc3RhdGUoaW5zdGFuY2Uuc3RhdGUpIDogc3RhdGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gd3JhcHBlcigpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NvcnJlY3QtYW5zd2VyLXRvZ2dsZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdmZWVkYmFjaycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlKS50b0VxdWFsKHtcbiAgICAgICAgYWN0aXZlQW5zd2VyQmxvY2s6ICcnLFxuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgICAgcjE6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzaG93Q29ycmVjdDogZmFsc2UsXG4gICAgICAgIHRvb2x0aXBDb250YWluZXJSZWY6IGV4cGVjdC5hbnkoT2JqZWN0KSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVnaXN0ZXJFbWJlZCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFuZGxlS2V5RG93bicsICgpID0+IHtcbiAgICBsZXQgaW5zdGFuY2U7XG4gICAgbGV0IHRleHRhcmVhO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgIHRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdFbnRlciBhbnN3ZXIuJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcbiAgICAgIHRleHRhcmVhLmZvY3VzKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBoYW5kbGVLZXlEb3duIG1ldGhvZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5oYW5kbGVLZXlEb3duKS50b0JlSW5zdGFuY2VPZihGdW5jdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjdGl2YXRlIHRoZSBrZXlwYWQgd2hlbiBBcnJvd0Rvd24gaXMgcHJlc3NlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50ID0geyBrZXk6ICdBcnJvd0Rvd24nLCB0YXJnZXQ6IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfTtcbiAgICAgIGluc3RhbmNlLmhhbmRsZUtleURvd24oZXZlbnQsICdyMScpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLmFjdGl2ZUFuc3dlckJsb2NrKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWN0aXZhdGUgdGhlIGtleXBhZCBvbiBjbGljayBvciB0b3VjaCBldmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSB7IHR5cGU6ICdjbGljaycsIHRhcmdldDogZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB9O1xuICAgICAgaW5zdGFuY2UuaGFuZGxlS2V5RG93bihjbGlja0V2ZW50LCAncjEnKTtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5hY3RpdmVBbnN3ZXJCbG9jaykudG9FcXVhbCgnJyk7XG5cbiAgICAgIGluc3RhbmNlLnNldFN0YXRlKHsgYWN0aXZlQW5zd2VyQmxvY2s6ICcnIH0pO1xuICAgICAgY29uc3QgdG91Y2hFdmVudCA9IHsgdHlwZTogJ3RvdWNoc3RhcnQnLCB0YXJnZXQ6IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfTtcbiAgICAgIGluc3RhbmNlLmhhbmRsZUtleURvd24odG91Y2hFdmVudCwgJ3IxJyk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuYWN0aXZlQW5zd2VyQmxvY2spLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWFjdGl2YXRlIHRoZSBrZXlwYWQgb24gRXNjYXBlIGtleSBwcmVzcycsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnNldFN0YXRlKHsgYWN0aXZlQW5zd2VyQmxvY2s6ICdyMScgfSk7XG4gICAgICBpbnN0YW5jZS5oYW5kbGVLZXlEb3duKHsga2V5OiAnRXNjYXBlJywgdGFyZ2V0OiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IH0sICdyMScpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLmFjdGl2ZUFuc3dlckJsb2NrKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVhY3RpdmF0ZSB0aGUga2V5cGFkIGlmIHRoZSBpbnB1dCBpcyBub3QgZm9jdXNlZCBhbmQgYSBjbGljayBvciB0b3VjaCBldmVudCBvY2N1cnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHsga2V5OiAnQXJyb3dEb3duJywgdGFyZ2V0OiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IH07XG4gICAgICBpbnN0YW5jZS5zZXRTdGF0ZSh7IGFjdGl2ZUFuc3dlckJsb2NrOiAncjEnIH0pO1xuXG4gICAgICBpbnN0YW5jZS5vbkJsdXIoZXZlbnQpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuYWN0aXZlQW5zd2VyQmxvY2spLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgaXQoJ3ByZXBhcmVzIGxhdGV4IGNvcnJlY3RseSBhbmQgYW5zd2VyIGJsb2NrcyBhbmQgdHVybnMgdGhlbSBpbnRvIGlucHV0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIC8vIFRoZSBsYXRleCBwcmVwYXJhdGlvbiBoYXBwZW5zIGluIHRoZSByZW5kZXIgbWV0aG9kXG4gICAgICAvLyBXZSBjYW4ndCBlYXNpbHkgdGVzdCB0aGUgZXhhY3QgbGF0ZXggb3V0cHV0IHdpdGhvdXQgcmVuZGVyaW5nLCBidXQgd2UgY2FuIHZlcmlmeSB0aGUgc3RydWN0dXJlIGlzIHNldCB1cCBjb3JyZWN0bHlcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5zZXNzaW9uLmFuc3dlcnMpLnRvSGF2ZVByb3BlcnR5KCdyMScpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLnNlc3Npb24uYW5zd2VycykudG9IYXZlUHJvcGVydHkoJ3IyJyk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuc2Vzc2lvbi5hbnN3ZXJzKS50b0hhdmVQcm9wZXJ0eSgncjMnKTtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5zZXNzaW9uLmFuc3dlcnMpLnRvSGF2ZVByb3BlcnR5KCdyNCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSByZW5kZXJzIHNpbXBsZSBpbnRlcmFjdGlvbiBpbiBjYXNlIG9mIHNpbXBsZSBtb2RlJywgKCkgPT4ge1xuICAgICAgLy8gRmlyc3QgdmVyaWZ5IGFkdmFuY2VkIG1vZGUgcmVuZGVycyBtcS1zdGF0aWNcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCwgdW5tb3VudCB9ID0gd3JhcHBlcigpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21xLXN0YXRpYycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ3NpbXBsZS1xdWVzdGlvbi1ibG9jaycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIHVubW91bnQoKTtcblxuICAgICAgLy8gVGhlbiB2ZXJpZnkgc2ltcGxlIG1vZGUgcmVuZGVycyBzaW1wbGUtcXVlc3Rpb24tYmxvY2tcbiAgICAgIGNvbnN0IHNpbXBsZVByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLm1vZGVsLFxuICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgLi4uZGVmYXVsdFByb3BzLm1vZGVsLmNvbmZpZyxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ1NpbXBsZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZDogcXVlcnlTaW1wbGUgfSA9IHJlbmRlcig8TWFpbiB7Li4uc2ltcGxlUHJvcHN9IC8+KTtcblxuICAgICAgZXhwZWN0KHF1ZXJ5U2ltcGxlKCdtcS1zdGF0aWMnKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlTaW1wbGUoJ3NpbXBsZS1xdWVzdGlvbi1ibG9jaycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSBwcmUtcG9wdWxhdGVzIGFuc3dlcnMgZnJvbSBzZXNzaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh7XG4gICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICBhbnN3ZXJzOiB7XG4gICAgICAgICAgICByMToge1xuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxmcmFje24tNX17Nn0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUpLnRvRXF1YWwoe1xuICAgICAgICBhY3RpdmVBbnN3ZXJCbG9jazogJycsXG4gICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICBhbnN3ZXJzOiB7XG4gICAgICAgICAgICByMToge1xuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxmcmFje24tNX17Nn0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzaG93Q29ycmVjdDogZmFsc2UsXG4gICAgICAgIHRvb2x0aXBDb250YWluZXJSZWY6IGV4cGVjdC5hbnkoT2JqZWN0KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSB1cGRhdGVzIHNlc3Npb24gaW4gY2FzZSBvZiBtb2RlbCBjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIGluc3RhbmNlLnN1YkZpZWxkQ2hhbmdlZCgncjEnLCAndmFsdWUnKTtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZSkudG9FcXVhbCh7XG4gICAgICAgIGFjdGl2ZUFuc3dlckJsb2NrOiAnJyxcbiAgICAgICAgc2Vzc2lvbjoge1xuICAgICAgICAgIGFuc3dlcnM6IHtcbiAgICAgICAgICAgIHIxOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAndmFsdWUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzaG93Q29ycmVjdDogZmFsc2UsXG4gICAgICAgIHRvb2x0aXBDb250YWluZXJSZWY6IGV4cGVjdC5hbnkoT2JqZWN0KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSB1cGRhdGVzIHNlc3Npb24gaW4gY2FzZSBvZiBzdWJmaWVsZCBjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZSkudG9FcXVhbCh7XG4gICAgICAgIGFjdGl2ZUFuc3dlckJsb2NrOiAnJyxcbiAgICAgICAgc2Vzc2lvbjoge1xuICAgICAgICAgIGFuc3dlcnM6IHtcbiAgICAgICAgICAgIHIxOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMjoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjM6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHI0OiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgICB0b29sdGlwQ29udGFpbmVyUmVmOiBleHBlY3QuYW55KE9iamVjdCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3UHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMubW9kZWwsXG4gICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMubW9kZWwuY29uZmlnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogZGVmYXVsdFByb3BzLm1vZGVsLmNvbmZpZy5leHByZXNzaW9uICsgJyB7e3Jlc3BvbnNlfX0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKG5ld1Byb3BzKTtcblxuICAgICAgZXhwZWN0KG5ld0luc3RhbmNlLnN0YXRlKS50b0VxdWFsKHtcbiAgICAgICAgYWN0aXZlQW5zd2VyQmxvY2s6ICcnLFxuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgICAgcjE6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHI1OiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgICB0b29sdGlwQ29udGFpbmVyUmVmOiBleHBlY3QuYW55KE9iamVjdCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01haW4gY29tcG9uZW50IGFkZGl0aW9uYWwgZnVuY3Rpb25zJywgKCkgPT4ge1xuICAgIGxldCBpbnN0YW5jZTtcbiAgICBsZXQgdGV4dGFyZWE7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UoKTtcblxuICAgICAgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0VudGVyIGFuc3dlci4nKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dGFyZWEpO1xuICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICcnO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYW5zd2VyIGJsb2NrIERPTSB1cGRhdGUgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1vY2tSb290LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBpZD1cInIxXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJyMUluZGV4XCI+PC9kaXY+XG4gICAgICBgO1xuICAgICAgaW5zdGFuY2Uucm9vdCA9IG1vY2tSb290O1xuXG4gICAgICBpbnN0YW5jZS5oYW5kbGVBbnN3ZXJCbG9ja0RvbVVwZGF0ZSgpO1xuXG4gICAgICBleHBlY3QobW9ja1Jvb3QucXVlcnlTZWxlY3RvcignI3IxJykudGV4dENvbnRlbnQpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3VudCByZXNwb25zZSBvY2N1cnJlbmNlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByZXNzaW9uID0gJ3t7cmVzcG9uc2V9fSArIHt7cmVzcG9uc2V9fSA9IHt7cmVzcG9uc2V9fSc7XG4gICAgICBjb25zdCBjb3VudCA9IGluc3RhbmNlLmNvdW50UmVzcG9uc2VPY2N1cnJlbmNlcyhleHByZXNzaW9uKTtcbiAgICAgIGV4cGVjdChjb3VudCkudG9FcXVhbCgzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIGFyaWEgYXR0cmlidXRlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbW9ja1Jvb3QuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwibXEtc2VsZWN0YWJsZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXEtc2VsZWN0YWJsZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXEtdGV4dGFyZWFcIj5cbiAgICAgICAgICA8dGV4dGFyZWE+PC90ZXh0YXJlYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgICAgaW5zdGFuY2Uucm9vdCA9IG1vY2tSb290O1xuXG4gICAgICBpbnN0YW5jZS51cGRhdGVBcmlhKCk7XG5cbiAgICAgIGNvbnN0IHRleHRhcmVhRWxlbWVudHMgPSBtb2NrUm9vdC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dGFyZWFFbGVtZW50cy5mb3JFYWNoKChlbGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBleHBlY3QoZWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkudG9FcXVhbCgnRW50ZXIgYW5zd2VyLicpO1xuICAgICAgICBleHBlY3QoZWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKSkubm90LnRvQmVOdWxsKCk7XG4gICAgICAgIGNvbnN0IGRlc2NyaWJlZEJ5SWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuICAgICAgICBjb25zdCBkZXNjcmliZWRCeUVsZW1lbnQgPSBtb2NrUm9vdC5xdWVyeVNlbGVjdG9yKGAjJHtkZXNjcmliZWRCeUlkfWApO1xuICAgICAgICBleHBlY3QoZGVzY3JpYmVkQnlFbGVtZW50KS5ub3QudG9CZU51bGwoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmb2N1cyBmaXJzdCBrZXlwYWQgZWxlbWVudCBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBqZXN0LnVzZUZha2VUaW1lcnMoKTtcblxuICAgICAgY29uc3QgbW9ja1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1vY2tSb290LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBkYXRhLWtleXBhZD1cInRydWVcIj5cbiAgICAgICAgICA8YnV0dG9uPkJ1dHRvbiAxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbj5CdXR0b24gMjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9ja1Jvb3QpO1xuXG4gICAgICBpbnN0YW5jZS5yb290ID0gbW9ja1Jvb3Q7XG5cbiAgICAgIGluc3RhbmNlLmZvY3VzRmlyc3RLZXlwYWRFbGVtZW50KCk7XG5cbiAgICAgIGplc3QucnVuQWxsVGltZXJzKCk7XG5cbiAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGV4cGVjdChmb2N1c2VkRWxlbWVudC50ZXh0Q29udGVudCkudG9FcXVhbCgnQnV0dG9uIDEnKTtcblxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChtb2NrUm9vdCk7XG5cbiAgICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYmx1ciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5zZXRTdGF0ZSh7IGFjdGl2ZUFuc3dlckJsb2NrOiAncjEnIH0pO1xuXG4gICAgICBjb25zdCBtb2NrUmVsYXRlZFRhcmdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29uc3QgcGFyZW50V2l0aFRvb2x0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBhcmVudFdpdGhUb29sdGlwLnNldEF0dHJpYnV0ZSgncm9sZScsICd0b29sdGlwJyk7XG5cbiAgICAgIGNvbnN0IGNoaWxkV2l0aEtleXBhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY2hpbGRXaXRoS2V5cGFkLnNldEF0dHJpYnV0ZSgnZGF0YS1rZXlwYWQnLCAndHJ1ZScpO1xuXG4gICAgICBwYXJlbnRXaXRoVG9vbHRpcC5hcHBlbmRDaGlsZChjaGlsZFdpdGhLZXlwYWQpO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9ja1JlbGF0ZWRUYXJnZXQsICdvZmZzZXRQYXJlbnQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwYXJlbnRXaXRoVG9vbHRpcDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbW9ja1JlbGF0ZWRUYXJnZXQsXG4gICAgICAgIGN1cnJlbnRUYXJnZXQ6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgICAgfTtcblxuICAgICAgaW5zdGFuY2Uub25CbHVyKGV2ZW50KTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLmFjdGl2ZUFuc3dlckJsb2NrKS50b0VxdWFsKCdyMScpO1xuXG4gICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID0gbnVsbDtcbiAgICAgIGluc3RhbmNlLm9uQmx1cihldmVudCk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5hY3RpdmVBbnN3ZXJCbG9jaykudG9FcXVhbCgnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgb25TZXNzaW9uQ2hhbmdlIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnNldFN0YXRlKHtcbiAgICAgICAgc2Vzc2lvbjoge1xuICAgICAgICAgIGFuc3dlcnM6IHtcbiAgICAgICAgICAgIHIxOiB7IHZhbHVlOiAndGVzdCcgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGluc3RhbmNlLmNhbGxPblNlc3Npb25DaGFuZ2UoKTtcblxuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5vblNlc3Npb25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgIHIxOiB7IHZhbHVlOiAndGVzdCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0b2dnbGUgc2hvdyBjb3JyZWN0IHN0YXRlIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnRvZ2dsZVNob3dDb3JyZWN0KHRydWUpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLnNob3dDb3JyZWN0KS50b0VxdWFsKHRydWUpO1xuXG4gICAgICBpbnN0YW5jZS50b2dnbGVTaG93Q29ycmVjdChmYWxzZSk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuc2hvd0NvcnJlY3QpLnRvRXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3ViRmllbGRDaGFuZ2VkIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnN1YkZpZWxkQ2hhbmdlZCgncjEnLCAnbmV3IHZhbHVlJyk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5zZXNzaW9uLmFuc3dlcnMucjEudmFsdWUpLnRvRXF1YWwoJ25ldyB2YWx1ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIGNvcnJlY3QgZmllbGQgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHsgcjE6IHsgaWQ6IDEgfSwgcjI6IHsgaWQ6IDIgfSB9O1xuICAgICAgaW5zdGFuY2Uuc2V0U3RhdGUoe1xuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgICAgcjE6IHsgdmFsdWU6ICd0ZXN0JyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZmllbGROYW1lID0gaW5zdGFuY2UuZ2V0RmllbGROYW1lKHsgaWQ6IDEgfSwgZmllbGRzKTtcbiAgICAgIGV4cGVjdChmaWVsZE5hbWUpLnRvRXF1YWwoJ3IxJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxvQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sb0JBQUEsR0FBQUgsc0JBQUEsQ0FBQUgsT0FBQTtBQUEyRCxTQUFBRCx3QkFBQVEsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQVYsdUJBQUEsWUFBQUEsQ0FBQVEsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsVUFBQU0sQ0FBQSxDQUFBTSxHQUFBLENBQUFaLENBQUEsR0FBQU0sQ0FBQSxDQUFBTyxHQUFBLENBQUFiLENBQUEsRUFBQVEsQ0FBQSxnQkFBQVAsQ0FBQSxJQUFBRCxDQUFBLGdCQUFBQyxDQUFBLE9BQUFhLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZixDQUFBLEVBQUFDLENBQUEsT0FBQU0sQ0FBQSxJQUFBRCxDQUFBLEdBQUFVLE1BQUEsQ0FBQUMsY0FBQSxLQUFBRCxNQUFBLENBQUFFLHdCQUFBLENBQUFsQixDQUFBLEVBQUFDLENBQUEsT0FBQU0sQ0FBQSxDQUFBSyxHQUFBLElBQUFMLENBQUEsQ0FBQU0sR0FBQSxJQUFBUCxDQUFBLENBQUFFLENBQUEsRUFBQVAsQ0FBQSxFQUFBTSxDQUFBLElBQUFDLENBQUEsQ0FBQVAsQ0FBQSxJQUFBRCxDQUFBLENBQUFDLENBQUEsV0FBQU8sQ0FBQSxLQUFBUixDQUFBLEVBQUFDLENBQUE7QUFFM0RrQixJQUFJLENBQUNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxPQUFPO0VBQ3JDQyxLQUFLLEVBQUU7SUFDTEMsSUFBSSxFQUFFQSxDQUFBLEtBQU0sTUFBTTtJQUNsQkMsVUFBVSxFQUFFQSxDQUFBLEtBQU0sTUFBTTtJQUN4QkMsWUFBWSxFQUFFQSxDQUFBLEtBQU0sTUFBTTtJQUMxQkMsT0FBTyxFQUFFQSxDQUFBLEtBQU0sU0FBUztJQUN4QkMsU0FBUyxFQUFFQSxDQUFBLEtBQU0sU0FBUztJQUMxQkMsU0FBUyxFQUFFQSxDQUFBLEtBQU07RUFDbkIsQ0FBQztFQUNEQyxRQUFRLEVBQUdDLEtBQUssaUJBQUt0QyxLQUFBLENBQUF1QyxhQUFBLFlBQUFDLFNBQUEsQ0FBQXJCLE9BQUE7SUFBSyxlQUFZO0VBQVUsR0FBS21CLEtBQUssQ0FBRyxDQUFDO0VBQzlERyxhQUFhLEVBQUdILEtBQUssaUJBQUt0QyxLQUFBLENBQUF1QyxhQUFBO0lBQUssZUFBWTtFQUFnQixHQUFFRCxLQUFLLENBQUNJLFFBQWMsQ0FBQztFQUNsRkMsUUFBUSxFQUFHTCxLQUFLLGlCQUFLdEMsS0FBQSxDQUFBdUMsYUFBQTtJQUFLLGVBQVk7RUFBVyxHQUFFRCxLQUFLLENBQUNJLFFBQWMsQ0FBQztFQUN4RUUsUUFBUSxFQUFHTixLQUFLLGlCQUFLdEMsS0FBQSxDQUFBdUMsYUFBQTtJQUFLLGVBQVk7RUFBVSxHQUFFRCxLQUFLLENBQUNJLFFBQWMsQ0FBQztFQUN2RUcsT0FBTyxFQUFFakIsSUFBSSxDQUFDa0IsRUFBRSxDQUFDLENBQUM7RUFDbEJDLFFBQVEsRUFBRW5CLElBQUksQ0FBQ2tCLEVBQUUsQ0FBQyxDQUFDO0VBQ25CRSxXQUFXLEVBQUdWLEtBQUssaUJBQUt0QyxLQUFBLENBQUF1QyxhQUFBO0lBQUssZUFBWTtFQUFhLEdBQUVELEtBQUssQ0FBQ0ksUUFBYztBQUM5RSxDQUFDLENBQUMsQ0FBQztBQUVIZCxJQUFJLENBQUNDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxNQUFPUyxLQUFLLGlCQUN0RHRDLEtBQUEsQ0FBQXVDLGFBQUEsWUFBQUMsU0FBQSxDQUFBckIsT0FBQTtFQUFLLGVBQVk7QUFBdUIsR0FBS21CLEtBQUssQ0FBRyxDQUN0RCxDQUFDO0FBRUZWLElBQUksQ0FBQ0MsSUFBSSxDQUFDLDBCQUEwQixFQUFFLE1BQU9TLEtBQUssaUJBQUt0QyxLQUFBLENBQUF1QyxhQUFBLFlBQUFDLFNBQUEsQ0FBQXJCLE9BQUE7RUFBSyxlQUFZO0FBQXVCLEdBQUttQixLQUFLLENBQUcsQ0FBQyxDQUFDO0FBRTlHVixJQUFJLENBQUNDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxPQUFPO0VBQy9Db0IsRUFBRSxFQUFFO0lBQ0ZDLE1BQU0sRUFBR1osS0FBSyxpQkFBS3RDLEtBQUEsQ0FBQXVDLGFBQUEsWUFBQUMsU0FBQSxDQUFBckIsT0FBQTtNQUFLLGVBQVk7SUFBVyxHQUFLbUIsS0FBSyxDQUFHO0VBQzlELENBQUM7RUFDRGEsZ0JBQWdCLEVBQUdiLEtBQUssaUJBQUt0QyxLQUFBLENBQUF1QyxhQUFBLFlBQUFDLFNBQUEsQ0FBQXJCLE9BQUE7SUFBSyxlQUFZO0VBQW1CLEdBQUttQixLQUFLLENBQUcsQ0FBQztFQUMvRWMsV0FBVyxFQUFFeEIsSUFBSSxDQUFDa0IsRUFBRSxDQUFDLENBQUM7RUFDdEJPLGFBQWEsRUFBRXpCLElBQUksQ0FBQ2tCLEVBQUUsQ0FBQyxDQUFDO0VBQ3hCUSxlQUFlLEVBQUUxQixJQUFJLENBQUNrQixFQUFFLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUM7QUFFSGxCLElBQUksQ0FBQ0MsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU87RUFDMUMwQixVQUFVLEVBQUUzQixJQUFJLENBQUNrQixFQUFFLENBQUM7QUFDdEIsQ0FBQyxDQUFDLENBQUM7QUFFSGxCLElBQUksQ0FBQ0MsSUFBSSxDQUFDLHFCQUFxQixFQUFFLE9BQU87RUFDdENmLFVBQVUsRUFBRSxJQUFJO0VBQ2hCSyxPQUFPLEVBQUdtQixLQUFLLGlCQUFLdEMsS0FBQSxDQUFBdUMsYUFBQTtJQUFLLGVBQVk7RUFBWSxHQUFFRCxLQUFLLENBQUNJLFFBQWM7QUFDekUsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNO0VBQUVXO0FBQWMsQ0FBQyxHQUFHbkQsT0FBTyxDQUFDLDhCQUE4QixDQUFDO0FBRWpFc0QsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE1BQU07RUFDakMsTUFBTUMsWUFBWSxHQUFHO0lBQ25CQyxlQUFlLEVBQUU5QixJQUFJLENBQUNrQixFQUFFLENBQUMsQ0FBQztJQUMxQmEsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNYQyxLQUFLLEVBQUU7TUFDTEMsRUFBRSxFQUFFLEdBQUc7TUFDUEMsT0FBTyxFQUFFLGFBQWE7TUFDdEJDLFdBQVcsRUFBRSxDQUFDLENBQUM7TUFDZkMsTUFBTSxFQUFFO1FBQ05DLFlBQVksRUFBRSxnQkFBZ0I7UUFDOUJILE9BQU8sRUFBRSxhQUFhO1FBQ3RCSSxRQUFRLEVBQ04sNmxCQUE2bEI7UUFDL2xCQyxVQUFVLEVBQ1IsNEdBQTRHLEdBQzVHLHNFQUFzRTtRQUN4RUMsY0FBYyxFQUFFLGVBQWU7UUFDL0JDLFNBQVMsRUFBRSxDQUNUO1VBQ0VDLFVBQVUsRUFBRSxTQUFTO1VBQ3JCQyxNQUFNLEVBQUUsMkJBQTJCO1VBQ25DQyxVQUFVLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FDRjtRQUNEQyxRQUFRLEVBQUU7VUFDUnZDLE9BQU8sRUFBRTtZQUNQd0MsSUFBSSxFQUFFLE1BQU07WUFDWnZELE9BQU8sRUFBRTtVQUNYLENBQUM7VUFDRHdELE9BQU8sRUFBRTtZQUNQRCxJQUFJLEVBQUUsTUFBTTtZQUNadkQsT0FBTyxFQUFFO1VBQ1gsQ0FBQztVQUNEZ0IsU0FBUyxFQUFFO1lBQ1R1QyxJQUFJLEVBQUUsTUFBTTtZQUNadkQsT0FBTyxFQUFFO1VBQ1g7UUFDRixDQUFDO1FBQ0R5RCxJQUFJLEVBQUUsa0pBQWtKO1FBQ3hKQyxVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsYUFBYTtNQUM3RDtJQUNGO0VBQ0YsQ0FBQztFQUVELE1BQU1DLE9BQU8sR0FBR0EsQ0FBQ3hDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSztJQUM5QixPQUFPLElBQUF5QyxjQUFNLGVBQUMvRSxLQUFBLENBQUF1QyxhQUFBLENBQUNuQyxLQUFBLENBQUFlLE9BQUksTUFBQXFCLFNBQUEsQ0FBQXJCLE9BQUEsTUFBS3NDLFlBQVksRUFBTW5CLEtBQUssQ0FBRyxDQUFDLENBQUM7RUFDdEQsQ0FBQztFQUVELE1BQU0wQyxjQUFjLEdBQUdBLENBQUMxQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUs7SUFDckMsTUFBTTJDLGFBQWEsR0FBRztNQUNwQixHQUFHeEIsWUFBWTtNQUNmLEdBQUduQjtJQUNMLENBQUM7SUFDRCxNQUFNNEMsUUFBUSxHQUFHLElBQUlDLGFBQUksQ0FBQ0YsYUFBYSxDQUFDO0lBQ3hDQyxRQUFRLENBQUNFLFFBQVEsR0FBR3hELElBQUksQ0FBQ2tCLEVBQUUsQ0FBRXVDLEtBQUssSUFBSztNQUNyQzVELE1BQU0sQ0FBQzZELE1BQU0sQ0FBQ0osUUFBUSxDQUFDRyxLQUFLLEVBQUUsT0FBT0EsS0FBSyxLQUFLLFVBQVUsR0FBR0EsS0FBSyxDQUFDSCxRQUFRLENBQUNHLEtBQUssQ0FBQyxHQUFHQSxLQUFLLENBQUM7SUFDNUYsQ0FBQyxDQUFDO0lBQ0YsT0FBT0gsUUFBUTtFQUNqQixDQUFDO0VBRUQxQixRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU07SUFDdkIrQixFQUFFLENBQUMsbUJBQW1CLEVBQUUsTUFBTTtNQUM1QixNQUFNO1FBQUVDO01BQWMsQ0FBQyxHQUFHVixPQUFPLENBQUMsQ0FBQztNQUNuQ1csTUFBTSxDQUFDRCxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDRSxHQUFHLENBQUNDLGlCQUFpQixDQUFDLENBQUM7TUFDdEVGLE1BQU0sQ0FBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUNFLEdBQUcsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztNQUV6RCxNQUFNVCxRQUFRLEdBQUdGLGNBQWMsQ0FBQyxDQUFDO01BQ2pDUyxNQUFNLENBQUNQLFFBQVEsQ0FBQ0csS0FBSyxDQUFDLENBQUNPLE9BQU8sQ0FBQztRQUM3QkMsaUJBQWlCLEVBQUUsRUFBRTtRQUNyQmxDLE9BQU8sRUFBRTtVQUNQbUMsT0FBTyxFQUFFO1lBQ1BDLEVBQUUsRUFBRTtjQUNGQyxLQUFLLEVBQUU7WUFDVCxDQUFDO1lBQ0RDLEVBQUUsRUFBRTtjQUNGRCxLQUFLLEVBQUU7WUFDVCxDQUFDO1lBQ0RFLEVBQUUsRUFBRTtjQUNGRixLQUFLLEVBQUU7WUFDVCxDQUFDO1lBQ0RHLEVBQUUsRUFBRTtjQUNGSCxLQUFLLEVBQUU7WUFDVDtVQUNGO1FBQ0YsQ0FBQztRQUNESSxXQUFXLEVBQUUsS0FBSztRQUNsQkMsbUJBQW1CLEVBQUVaLE1BQU0sQ0FBQ2EsR0FBRyxDQUFDN0UsTUFBTTtNQUN4QyxDQUFDLENBQUM7TUFFRmdFLE1BQU0sQ0FBQ3BDLGFBQWEsQ0FBQyxDQUFDa0QsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRi9DLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTTtJQUM5QixJQUFJMEIsUUFBUTtJQUNaLElBQUlzQixRQUFRO0lBRVpDLFVBQVUsQ0FBQyxNQUFNO01BQ2Z2QixRQUFRLEdBQUdGLGNBQWMsQ0FBQyxDQUFDO01BRTNCd0IsUUFBUSxHQUFHRSxRQUFRLENBQUNuRSxhQUFhLENBQUMsVUFBVSxDQUFDO01BQzdDaUUsUUFBUSxDQUFDRyxZQUFZLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQztNQUNwREQsUUFBUSxDQUFDRSxJQUFJLENBQUNDLFdBQVcsQ0FBQ0wsUUFBUSxDQUFDO01BQ25DQSxRQUFRLENBQUNNLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQztJQUVGQyxTQUFTLENBQUMsTUFBTTtNQUNkTCxRQUFRLENBQUNFLElBQUksQ0FBQ0ksU0FBUyxHQUFHLEVBQUU7SUFDOUIsQ0FBQyxDQUFDO0lBRUZ6QixFQUFFLENBQUMsa0NBQWtDLEVBQUUsTUFBTTtNQUMzQ0UsTUFBTSxDQUFDUCxRQUFRLENBQUMrQixhQUFhLENBQUMsQ0FBQ0MsY0FBYyxDQUFDQyxRQUFRLENBQUM7SUFDekQsQ0FBQyxDQUFDO0lBRUY1QixFQUFFLENBQUMsc0RBQXNELEVBQUUsTUFBTTtNQUMvRCxNQUFNNkIsS0FBSyxHQUFHO1FBQUVDLEdBQUcsRUFBRSxXQUFXO1FBQUVDLE1BQU0sRUFBRVosUUFBUSxDQUFDYTtNQUFjLENBQUM7TUFDbEVyQyxRQUFRLENBQUMrQixhQUFhLENBQUNHLEtBQUssRUFBRSxJQUFJLENBQUM7TUFDbkMzQixNQUFNLENBQUNQLFFBQVEsQ0FBQ0csS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ3RELENBQUMsQ0FBQztJQUVGTCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsTUFBTTtNQUM3RCxNQUFNaUMsVUFBVSxHQUFHO1FBQUU5QyxJQUFJLEVBQUUsT0FBTztRQUFFNEMsTUFBTSxFQUFFWixRQUFRLENBQUNhO01BQWMsQ0FBQztNQUNwRXJDLFFBQVEsQ0FBQytCLGFBQWEsQ0FBQ08sVUFBVSxFQUFFLElBQUksQ0FBQztNQUN4Qy9CLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7TUFFcERWLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDO1FBQUVTLGlCQUFpQixFQUFFO01BQUcsQ0FBQyxDQUFDO01BQzVDLE1BQU00QixVQUFVLEdBQUc7UUFBRS9DLElBQUksRUFBRSxZQUFZO1FBQUU0QyxNQUFNLEVBQUVaLFFBQVEsQ0FBQ2E7TUFBYyxDQUFDO01BQ3pFckMsUUFBUSxDQUFDK0IsYUFBYSxDQUFDUSxVQUFVLEVBQUUsSUFBSSxDQUFDO01BQ3hDaEMsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQ0QsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN0RCxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLE1BQU07TUFDM0RMLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDO1FBQUVTLGlCQUFpQixFQUFFO01BQUssQ0FBQyxDQUFDO01BQzlDWCxRQUFRLENBQUMrQixhQUFhLENBQUM7UUFBRUksR0FBRyxFQUFFLFFBQVE7UUFBRUMsTUFBTSxFQUFFWixRQUFRLENBQUNhO01BQWMsQ0FBQyxFQUFFLElBQUksQ0FBQztNQUMvRTlCLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEQsQ0FBQyxDQUFDO0lBRUZMLEVBQUUsQ0FBQyw0RkFBNEYsRUFBRSxNQUFNO01BQ3JHLE1BQU02QixLQUFLLEdBQUc7UUFBRUMsR0FBRyxFQUFFLFdBQVc7UUFBRUMsTUFBTSxFQUFFWixRQUFRLENBQUNhO01BQWMsQ0FBQztNQUNsRXJDLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDO1FBQUVTLGlCQUFpQixFQUFFO01BQUssQ0FBQyxDQUFDO01BRTlDWCxRQUFRLENBQUN3QyxNQUFNLENBQUNOLEtBQUssQ0FBQztNQUV0QjNCLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEQsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZwQyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU07SUFDdEIrQixFQUFFLENBQUMsdUVBQXVFLEVBQUUsTUFBTTtNQUNoRixNQUFNTCxRQUFRLEdBQUdGLGNBQWMsQ0FBQyxDQUFDO01BQ2pDO01BQ0E7TUFDQVMsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQzFCLE9BQU8sQ0FBQ21DLE9BQU8sQ0FBQyxDQUFDNkIsY0FBYyxDQUFDLElBQUksQ0FBQztNQUMzRGxDLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUMxQixPQUFPLENBQUNtQyxPQUFPLENBQUMsQ0FBQzZCLGNBQWMsQ0FBQyxJQUFJLENBQUM7TUFDM0RsQyxNQUFNLENBQUNQLFFBQVEsQ0FBQ0csS0FBSyxDQUFDMUIsT0FBTyxDQUFDbUMsT0FBTyxDQUFDLENBQUM2QixjQUFjLENBQUMsSUFBSSxDQUFDO01BQzNEbEMsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQzFCLE9BQU8sQ0FBQ21DLE9BQU8sQ0FBQyxDQUFDNkIsY0FBYyxDQUFDLElBQUksQ0FBQztJQUM3RCxDQUFDLENBQUM7SUFFRnBDLEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxNQUFNO01BQ3RFO01BQ0EsTUFBTTtRQUFFQyxhQUFhO1FBQUVvQztNQUFRLENBQUMsR0FBRzlDLE9BQU8sQ0FBQyxDQUFDO01BQzVDVyxNQUFNLENBQUNELGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDRyxpQkFBaUIsQ0FBQyxDQUFDO01BQ3RERixNQUFNLENBQUNELGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUNFLEdBQUcsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztNQUN0RWlDLE9BQU8sQ0FBQyxDQUFDOztNQUVUO01BQ0EsTUFBTUMsV0FBVyxHQUFHO1FBQ2xCLEdBQUdwRSxZQUFZO1FBQ2ZHLEtBQUssRUFBRTtVQUNMLEdBQUdILFlBQVksQ0FBQ0csS0FBSztVQUNyQkksTUFBTSxFQUFFO1lBQ04sR0FBR1AsWUFBWSxDQUFDRyxLQUFLLENBQUNJLE1BQU07WUFDNUJDLFlBQVksRUFBRTtVQUNoQjtRQUNGO01BQ0YsQ0FBQztNQUVELE1BQU07UUFBRXVCLGFBQWEsRUFBRXNDO01BQVksQ0FBQyxHQUFHLElBQUEvQyxjQUFNLGVBQUMvRSxLQUFBLENBQUF1QyxhQUFBLENBQUNuQyxLQUFBLENBQUFlLE9BQUksRUFBSzBHLFdBQWMsQ0FBQyxDQUFDO01BRXhFcEMsTUFBTSxDQUFDcUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUNwQyxHQUFHLENBQUNDLGlCQUFpQixDQUFDLENBQUM7TUFDeERGLE1BQU0sQ0FBQ3FDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUNuQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQztJQUVGSixFQUFFLENBQUMsOENBQThDLEVBQUUsTUFBTTtNQUN2RCxNQUFNTCxRQUFRLEdBQUdGLGNBQWMsQ0FBQztRQUM5QnJCLE9BQU8sRUFBRTtVQUNQbUMsT0FBTyxFQUFFO1lBQ1BDLEVBQUUsRUFBRTtjQUNGQyxLQUFLLEVBQUU7WUFDVDtVQUNGO1FBQ0Y7TUFDRixDQUFDLENBQUM7TUFDRlAsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQyxDQUFDTyxPQUFPLENBQUM7UUFDN0JDLGlCQUFpQixFQUFFLEVBQUU7UUFDckJsQyxPQUFPLEVBQUU7VUFDUG1DLE9BQU8sRUFBRTtZQUNQQyxFQUFFLEVBQUU7Y0FDRkMsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNEQyxFQUFFLEVBQUU7Y0FDRkQsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNERSxFQUFFLEVBQUU7Y0FDRkYsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNERyxFQUFFLEVBQUU7Y0FDRkgsS0FBSyxFQUFFO1lBQ1Q7VUFDRjtRQUNGLENBQUM7UUFDREksV0FBVyxFQUFFLEtBQUs7UUFDbEJDLG1CQUFtQixFQUFFWixNQUFNLENBQUNhLEdBQUcsQ0FBQzdFLE1BQU07TUFDeEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUY4RCxFQUFFLENBQUMsbURBQW1ELEVBQUUsTUFBTTtNQUM1RCxNQUFNTCxRQUFRLEdBQUdGLGNBQWMsQ0FBQyxDQUFDO01BRWpDRSxRQUFRLENBQUM2QyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztNQUN2Q3RDLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUMsQ0FBQ08sT0FBTyxDQUFDO1FBQzdCQyxpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCbEMsT0FBTyxFQUFFO1VBQ1BtQyxPQUFPLEVBQUU7WUFDUEMsRUFBRSxFQUFFO2NBQ0ZDLEtBQUssRUFBRTtZQUNULENBQUM7WUFDREMsRUFBRSxFQUFFO2NBQ0ZELEtBQUssRUFBRTtZQUNULENBQUM7WUFDREUsRUFBRSxFQUFFO2NBQ0ZGLEtBQUssRUFBRTtZQUNULENBQUM7WUFDREcsRUFBRSxFQUFFO2NBQ0ZILEtBQUssRUFBRTtZQUNUO1VBQ0Y7UUFDRixDQUFDO1FBQ0RJLFdBQVcsRUFBRSxLQUFLO1FBQ2xCQyxtQkFBbUIsRUFBRVosTUFBTSxDQUFDYSxHQUFHLENBQUM3RSxNQUFNO01BQ3hDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOEQsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLE1BQU07TUFDL0QsTUFBTUwsUUFBUSxHQUFHRixjQUFjLENBQUMsQ0FBQztNQUVqQ1MsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQyxDQUFDTyxPQUFPLENBQUM7UUFDN0JDLGlCQUFpQixFQUFFLEVBQUU7UUFDckJsQyxPQUFPLEVBQUU7VUFDUG1DLE9BQU8sRUFBRTtZQUNQQyxFQUFFLEVBQUU7Y0FDRkMsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNEQyxFQUFFLEVBQUU7Y0FDRkQsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNERSxFQUFFLEVBQUU7Y0FDRkYsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNERyxFQUFFLEVBQUU7Y0FDRkgsS0FBSyxFQUFFO1lBQ1Q7VUFDRjtRQUNGLENBQUM7UUFDREksV0FBVyxFQUFFLEtBQUs7UUFDbEJDLG1CQUFtQixFQUFFWixNQUFNLENBQUNhLEdBQUcsQ0FBQzdFLE1BQU07TUFDeEMsQ0FBQyxDQUFDO01BRUYsTUFBTXVHLFFBQVEsR0FBRztRQUNmLEdBQUd2RSxZQUFZO1FBQ2ZHLEtBQUssRUFBRTtVQUNMLEdBQUdILFlBQVksQ0FBQ0csS0FBSztVQUNyQkksTUFBTSxFQUFFO1lBQ04sR0FBR1AsWUFBWSxDQUFDRyxLQUFLLENBQUNJLE1BQU07WUFDNUJHLFVBQVUsRUFBRVYsWUFBWSxDQUFDRyxLQUFLLENBQUNJLE1BQU0sQ0FBQ0csVUFBVSxHQUFHO1VBQ3JEO1FBQ0Y7TUFDRixDQUFDO01BRUQsTUFBTThELFdBQVcsR0FBR2pELGNBQWMsQ0FBQ2dELFFBQVEsQ0FBQztNQUU1Q3ZDLE1BQU0sQ0FBQ3dDLFdBQVcsQ0FBQzVDLEtBQUssQ0FBQyxDQUFDTyxPQUFPLENBQUM7UUFDaENDLGlCQUFpQixFQUFFLEVBQUU7UUFDckJsQyxPQUFPLEVBQUU7VUFDUG1DLE9BQU8sRUFBRTtZQUNQQyxFQUFFLEVBQUU7Y0FDRkMsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNEQyxFQUFFLEVBQUU7Y0FDRkQsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNERSxFQUFFLEVBQUU7Y0FDRkYsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNERyxFQUFFLEVBQUU7Y0FDRkgsS0FBSyxFQUFFO1lBQ1QsQ0FBQztZQUNEa0MsRUFBRSxFQUFFO2NBQ0ZsQyxLQUFLLEVBQUU7WUFDVDtVQUNGO1FBQ0YsQ0FBQztRQUNESSxXQUFXLEVBQUUsS0FBSztRQUNsQkMsbUJBQW1CLEVBQUVaLE1BQU0sQ0FBQ2EsR0FBRyxDQUFDN0UsTUFBTTtNQUN4QyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRitCLFFBQVEsQ0FBQyxxQ0FBcUMsRUFBRSxNQUFNO0lBQ3BELElBQUkwQixRQUFRO0lBQ1osSUFBSXNCLFFBQVE7SUFFWkMsVUFBVSxDQUFDLE1BQU07TUFDZnZCLFFBQVEsR0FBR0YsY0FBYyxDQUFDLENBQUM7TUFFM0J3QixRQUFRLEdBQUdFLFFBQVEsQ0FBQ25FLGFBQWEsQ0FBQyxVQUFVLENBQUM7TUFDN0NpRSxRQUFRLENBQUNHLFlBQVksQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDO01BQ3BERCxRQUFRLENBQUNFLElBQUksQ0FBQ0MsV0FBVyxDQUFDTCxRQUFRLENBQUM7TUFDbkNBLFFBQVEsQ0FBQ00sS0FBSyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBRUZDLFNBQVMsQ0FBQyxNQUFNO01BQ2RMLFFBQVEsQ0FBQ0UsSUFBSSxDQUFDSSxTQUFTLEdBQUcsRUFBRTtJQUM5QixDQUFDLENBQUM7SUFFRnpCLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxNQUFNO01BQzFELE1BQU00QyxRQUFRLEdBQUd6QixRQUFRLENBQUNuRSxhQUFhLENBQUMsS0FBSyxDQUFDO01BQzlDNEYsUUFBUSxDQUFDbkIsU0FBUyxHQUFHO0FBQzNCO0FBQ0E7QUFDQSxPQUFPO01BQ0Q5QixRQUFRLENBQUNrRCxJQUFJLEdBQUdELFFBQVE7TUFFeEJqRCxRQUFRLENBQUNtRCwwQkFBMEIsQ0FBQyxDQUFDO01BRXJDNUMsTUFBTSxDQUFDMEMsUUFBUSxDQUFDRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDM0MsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMvRCxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLE1BQU07TUFDdEQsTUFBTXBCLFVBQVUsR0FBRyw0Q0FBNEM7TUFDL0QsTUFBTXFFLEtBQUssR0FBR3RELFFBQVEsQ0FBQ3VELHdCQUF3QixDQUFDdEUsVUFBVSxDQUFDO01BQzNEc0IsTUFBTSxDQUFDK0MsS0FBSyxDQUFDLENBQUM1QyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQztJQUVGTCxFQUFFLENBQUMseUNBQXlDLEVBQUUsTUFBTTtNQUNsRCxNQUFNNEMsUUFBUSxHQUFHekIsUUFBUSxDQUFDbkUsYUFBYSxDQUFDLEtBQUssQ0FBQztNQUM5QzRGLFFBQVEsQ0FBQ25CLFNBQVMsR0FBRztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztNQUNEOUIsUUFBUSxDQUFDa0QsSUFBSSxHQUFHRCxRQUFRO01BRXhCakQsUUFBUSxDQUFDd0QsVUFBVSxDQUFDLENBQUM7TUFFckIsTUFBTUMsZ0JBQWdCLEdBQUdSLFFBQVEsQ0FBQ1MsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO01BQzlERCxnQkFBZ0IsQ0FBQ0UsT0FBTyxDQUFDLENBQUNDLElBQUksRUFBRUMsS0FBSyxLQUFLO1FBQ3hDdEQsTUFBTSxDQUFDcUQsSUFBSSxDQUFDRSxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQ3BELE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDaEVILE1BQU0sQ0FBQ3FELElBQUksQ0FBQ0UsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQ3RELEdBQUcsQ0FBQ3VELFFBQVEsQ0FBQyxDQUFDO1FBQzVELE1BQU1DLGFBQWEsR0FBR0osSUFBSSxDQUFDRSxZQUFZLENBQUMsa0JBQWtCLENBQUM7UUFDM0QsTUFBTUcsa0JBQWtCLEdBQUdoQixRQUFRLENBQUNHLGFBQWEsQ0FBQyxJQUFJWSxhQUFhLEVBQUUsQ0FBQztRQUN0RXpELE1BQU0sQ0FBQzBELGtCQUFrQixDQUFDLENBQUN6RCxHQUFHLENBQUN1RCxRQUFRLENBQUMsQ0FBQztNQUMzQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjFELEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxNQUFNO01BQ3REM0QsSUFBSSxDQUFDd0gsYUFBYSxDQUFDLENBQUM7TUFFcEIsTUFBTWpCLFFBQVEsR0FBR3pCLFFBQVEsQ0FBQ25FLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDOUM0RixRQUFRLENBQUNuQixTQUFTLEdBQUc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO01BRUROLFFBQVEsQ0FBQ0UsSUFBSSxDQUFDQyxXQUFXLENBQUNzQixRQUFRLENBQUM7TUFFbkNqRCxRQUFRLENBQUNrRCxJQUFJLEdBQUdELFFBQVE7TUFFeEJqRCxRQUFRLENBQUNtRSx1QkFBdUIsQ0FBQyxDQUFDO01BRWxDekgsSUFBSSxDQUFDMEgsWUFBWSxDQUFDLENBQUM7TUFFbkIsTUFBTUMsY0FBYyxHQUFHN0MsUUFBUSxDQUFDYSxhQUFhO01BQzdDOUIsTUFBTSxDQUFDOEQsY0FBYyxDQUFDaEIsV0FBVyxDQUFDLENBQUMzQyxPQUFPLENBQUMsVUFBVSxDQUFDO01BRXREYyxRQUFRLENBQUNFLElBQUksQ0FBQzRDLFdBQVcsQ0FBQ3JCLFFBQVEsQ0FBQztNQUVuQ3ZHLElBQUksQ0FBQzZILGFBQWEsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUVGbEUsRUFBRSxDQUFDLDhCQUE4QixFQUFFLE1BQU07TUFDdkNMLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDO1FBQUVTLGlCQUFpQixFQUFFO01BQUssQ0FBQyxDQUFDO01BRTlDLE1BQU02RCxpQkFBaUIsR0FBR2hELFFBQVEsQ0FBQ25FLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDdkQsTUFBTW9ILGlCQUFpQixHQUFHakQsUUFBUSxDQUFDbkUsYUFBYSxDQUFDLEtBQUssQ0FBQztNQUN2RG9ILGlCQUFpQixDQUFDaEQsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7TUFFakQsTUFBTWlELGVBQWUsR0FBR2xELFFBQVEsQ0FBQ25FLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDckRxSCxlQUFlLENBQUNqRCxZQUFZLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQztNQUVuRGdELGlCQUFpQixDQUFDOUMsV0FBVyxDQUFDK0MsZUFBZSxDQUFDO01BRTlDbkksTUFBTSxDQUFDQyxjQUFjLENBQUNnSSxpQkFBaUIsRUFBRSxjQUFjLEVBQUU7UUFDdkRySSxHQUFHLEVBQUUsU0FBQUEsQ0FBQSxFQUFZO1VBQ2YsT0FBT3NJLGlCQUFpQjtRQUMxQjtNQUNGLENBQUMsQ0FBQztNQUVGLE1BQU12QyxLQUFLLEdBQUc7UUFDWnlDLGFBQWEsRUFBRUgsaUJBQWlCO1FBQ2hDSSxhQUFhLEVBQUVwRCxRQUFRLENBQUNuRSxhQUFhLENBQUMsS0FBSztNQUM3QyxDQUFDO01BRUQyQyxRQUFRLENBQUN3QyxNQUFNLENBQUNOLEtBQUssQ0FBQztNQUV0QjNCLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUNELE9BQU8sQ0FBQyxJQUFJLENBQUM7TUFFdER3QixLQUFLLENBQUN5QyxhQUFhLEdBQUcsSUFBSTtNQUMxQjNFLFFBQVEsQ0FBQ3dDLE1BQU0sQ0FBQ04sS0FBSyxDQUFDO01BRXRCM0IsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQ0QsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN0RCxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLE1BQU07TUFDaERMLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDO1FBQ2hCekIsT0FBTyxFQUFFO1VBQ1BtQyxPQUFPLEVBQUU7WUFDUEMsRUFBRSxFQUFFO2NBQUVDLEtBQUssRUFBRTtZQUFPO1VBQ3RCO1FBQ0Y7TUFDRixDQUFDLENBQUM7TUFFRmQsUUFBUSxDQUFDNkUsbUJBQW1CLENBQUMsQ0FBQztNQUU5QnRFLE1BQU0sQ0FBQ2hDLFlBQVksQ0FBQ0MsZUFBZSxDQUFDLENBQUNzRyxvQkFBb0IsQ0FBQztRQUN4RGxFLE9BQU8sRUFBRTtVQUNQQyxFQUFFLEVBQUU7WUFBRUMsS0FBSyxFQUFFO1VBQU87UUFDdEI7TUFDRixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRlQsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLE1BQU07TUFDckRMLFFBQVEsQ0FBQytFLGlCQUFpQixDQUFDLElBQUksQ0FBQztNQUNoQ3hFLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUNlLFdBQVcsQ0FBQyxDQUFDUixPQUFPLENBQUMsSUFBSSxDQUFDO01BRWhEVixRQUFRLENBQUMrRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7TUFDakN4RSxNQUFNLENBQUNQLFFBQVEsQ0FBQ0csS0FBSyxDQUFDZSxXQUFXLENBQUMsQ0FBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNuRCxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLE1BQU07TUFDbERMLFFBQVEsQ0FBQzZDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO01BRTNDdEMsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQzFCLE9BQU8sQ0FBQ21DLE9BQU8sQ0FBQ0MsRUFBRSxDQUFDQyxLQUFLLENBQUMsQ0FBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUN0RSxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLE1BQU07TUFDNUMsTUFBTTJFLE1BQU0sR0FBRztRQUFFbkUsRUFBRSxFQUFFO1VBQUVsQyxFQUFFLEVBQUU7UUFBRSxDQUFDO1FBQUVvQyxFQUFFLEVBQUU7VUFBRXBDLEVBQUUsRUFBRTtRQUFFO01BQUUsQ0FBQztNQUMvQ3FCLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDO1FBQ2hCekIsT0FBTyxFQUFFO1VBQ1BtQyxPQUFPLEVBQUU7WUFDUEMsRUFBRSxFQUFFO2NBQUVDLEtBQUssRUFBRTtZQUFPO1VBQ3RCO1FBQ0Y7TUFDRixDQUFDLENBQUM7TUFFRixNQUFNbUUsU0FBUyxHQUFHakYsUUFBUSxDQUFDa0YsWUFBWSxDQUFDO1FBQUV2RyxFQUFFLEVBQUU7TUFBRSxDQUFDLEVBQUVxRyxNQUFNLENBQUM7TUFDMUR6RSxNQUFNLENBQUMwRSxTQUFTLENBQUMsQ0FBQ3ZFLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119