@pie-element/placement-ordering 14.1.8 → 14.3.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,53 +3,23 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ## [14.1.8](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.7...@pie-element/placement-ordering@14.1.8) (2026-07-31)
6
+ # [14.3.0-beta.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.2.0-beta.0...@pie-element/placement-ordering@14.3.0-beta.0) (2026-08-07)
7
7
 
8
- ### Bug Fixes
9
-
10
- - **placement-ordering:** adjust choice grid row height and center choices PIE-787 ([ad3e41e](https://github.com/pie-framework/pie-elements/commit/ad3e41e606a1e80b2c6ba2c37e18367cbb9ccda1))
8
+ **Note:** Version bump only for package @pie-element/placement-ordering
11
9
 
12
- ## [14.1.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.6...@pie-element/placement-ordering@14.1.7) (2026-07-08)
10
+ # [14.2.0-beta.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.0...@pie-element/placement-ordering@14.2.0-beta.0) (2026-08-07)
13
11
 
14
12
  ### Bug Fixes
15
13
 
16
14
  - bump libs & shared modules PIE-706, PIE-702, PIE-679, PIE-698 ([5b1a8c4](https://github.com/pie-framework/pie-elements/commit/5b1a8c4c3eba2126fc43d78fd0187e7cd11d5424))
17
-
18
- ## [14.1.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.5...@pie-element/placement-ordering@14.1.6) (2026-07-02)
19
-
20
- ### Bug Fixes
21
-
22
- - bump shared modules and libs PIE-695, PIE-697, PIE-699, PIE-680, PIE-714, PIE-665, PIE-656 ([4b76ae7](https://github.com/pie-framework/pie-elements/commit/4b76ae75d1c5ea6d55f7c6fb53f299dfcbda2b1f))
23
- - sync libs versions ([48b5be9](https://github.com/pie-framework/pie-elements/commit/48b5be9559eb5b5235ca05f51c5f0161032a7041))
24
-
25
- ## [14.1.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.4...@pie-element/placement-ordering@14.1.5) (2026-06-22)
26
-
27
- ### Bug Fixes
28
-
29
- - bump shared modules and libs PIE-674, PIE-662, PIE-705, PIE-674, PIE-963 ([78a3f64](https://github.com/pie-framework/pie-elements/commit/78a3f64652c9581c61bd4159f3210fc1e32d8bcf))
30
- - handle webcomponent lifecycle on every element that misses it PIE-703 ([9d5923f](https://github.com/pie-framework/pie-elements/commit/9d5923f973f0471e1e8f69ad4309cfc63d980d93))
31
-
32
- ## [14.1.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.3...@pie-element/placement-ordering@14.1.4) (2026-06-17)
33
-
34
- ### Bug Fixes
35
-
15
+ - bump shared modules and libs PIE-600, PIE-602 ([ce99f6a](https://github.com/pie-framework/pie-elements/commit/ce99f6af50cb855b666a6df9340f9f5445fde4c4))
36
16
  - bump shared modules and libs PIE-661 PIE-664 PIE-683 PIE-666 PIE-656 PIE-657 PIE-658 PIE-659 PIE-670 ([ebd6be4](https://github.com/pie-framework/pie-elements/commit/ebd6be4fd48fca41ad4c4908f606b25334731aed))
37
-
38
- ## [14.1.3](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.2...@pie-element/placement-ordering@14.1.3) (2026-06-12)
39
-
40
- ### Bug Fixes
41
-
17
+ - bump shared modules and libs PIE-674, PIE-662, PIE-705, PIE-674, PIE-963 ([78a3f64](https://github.com/pie-framework/pie-elements/commit/78a3f64652c9581c61bd4159f3210fc1e32d8bcf))
18
+ - bump shared modules and libs PIE-695, PIE-697, PIE-699, PIE-680, PIE-714, PIE-665, PIE-656 ([4b76ae7](https://github.com/pie-framework/pie-elements/commit/4b76ae75d1c5ea6d55f7c6fb53f299dfcbda2b1f))
42
19
  - bump shared modules and libsPIE-603, PIE-604, PIE-663, PIE-662, PIE-678 ([e61c7a7](https://github.com/pie-framework/pie-elements/commit/e61c7a7d23744586337dfbb17a18ebfc656c202f))
43
-
44
- ## [14.1.2](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.1...@pie-element/placement-ordering@14.1.2) (2026-06-04)
45
-
46
- ### Bug Fixes
47
-
48
- - bump shared modules and libs PIE-600, PIE-602 ([ce99f6a](https://github.com/pie-framework/pie-elements/commit/ce99f6af50cb855b666a6df9340f9f5445fde4c4))
49
-
50
- ## [14.1.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.0...@pie-element/placement-ordering@14.1.1) (2026-05-21)
51
-
52
- **Note:** Version bump only for package @pie-element/placement-ordering
20
+ - handle webcomponent lifecycle on every element that misses it PIE-703 ([9d5923f](https://github.com/pie-framework/pie-elements/commit/9d5923f973f0471e1e8f69ad4309cfc63d980d93))
21
+ - **placement-ordering:** adjust choice grid row height and center choices PIE-787 ([ad3e41e](https://github.com/pie-framework/pie-elements/commit/ad3e41e606a1e80b2c6ba2c37e18367cbb9ccda1))
22
+ - sync libs versions ([48b5be9](https://github.com/pie-framework/pie-elements/commit/48b5be9559eb5b5235ca05f51c5f0161032a7041))
53
23
 
54
24
  # [14.1.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering@14.1.0-next.1...@pie-element/placement-ordering@14.1.0) (2026-05-21)
55
25
 
@@ -3,53 +3,23 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ## [11.1.8](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.7...@pie-element/placement-ordering-configure@11.1.8) (2026-07-31)
6
+ # [11.3.0-beta.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.2.0-beta.0...@pie-element/placement-ordering-configure@11.3.0-beta.0) (2026-08-07)
7
7
 
8
- ### Bug Fixes
9
-
10
- - **placement-ordering:** adjust choice grid row height and center choices PIE-787 ([ad3e41e](https://github.com/pie-framework/pie-elements/commit/ad3e41e606a1e80b2c6ba2c37e18367cbb9ccda1))
8
+ **Note:** Version bump only for package @pie-element/placement-ordering-configure
11
9
 
12
- ## [11.1.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.6...@pie-element/placement-ordering-configure@11.1.7) (2026-07-08)
10
+ # [11.2.0-beta.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.0...@pie-element/placement-ordering-configure@11.2.0-beta.0) (2026-08-07)
13
11
 
14
12
  ### Bug Fixes
15
13
 
16
14
  - bump libs & shared modules PIE-706, PIE-702, PIE-679, PIE-698 ([5b1a8c4](https://github.com/pie-framework/pie-elements/commit/5b1a8c4c3eba2126fc43d78fd0187e7cd11d5424))
17
-
18
- ## [11.1.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.5...@pie-element/placement-ordering-configure@11.1.6) (2026-07-02)
19
-
20
- ### Bug Fixes
21
-
22
- - bump shared modules and libs PIE-695, PIE-697, PIE-699, PIE-680, PIE-714, PIE-665, PIE-656 ([4b76ae7](https://github.com/pie-framework/pie-elements/commit/4b76ae75d1c5ea6d55f7c6fb53f299dfcbda2b1f))
23
- - sync libs versions ([48b5be9](https://github.com/pie-framework/pie-elements/commit/48b5be9559eb5b5235ca05f51c5f0161032a7041))
24
-
25
- ## [11.1.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.4...@pie-element/placement-ordering-configure@11.1.5) (2026-06-22)
26
-
27
- ### Bug Fixes
28
-
29
- - bump shared modules and libs PIE-674, PIE-662, PIE-705, PIE-674, PIE-963 ([78a3f64](https://github.com/pie-framework/pie-elements/commit/78a3f64652c9581c61bd4159f3210fc1e32d8bcf))
30
- - handle webcomponent lifecycle on every element that misses it PIE-703 ([9d5923f](https://github.com/pie-framework/pie-elements/commit/9d5923f973f0471e1e8f69ad4309cfc63d980d93))
31
-
32
- ## [11.1.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.3...@pie-element/placement-ordering-configure@11.1.4) (2026-06-17)
33
-
34
- ### Bug Fixes
35
-
15
+ - bump shared modules and libs PIE-600, PIE-602 ([ce99f6a](https://github.com/pie-framework/pie-elements/commit/ce99f6af50cb855b666a6df9340f9f5445fde4c4))
36
16
  - bump shared modules and libs PIE-661 PIE-664 PIE-683 PIE-666 PIE-656 PIE-657 PIE-658 PIE-659 PIE-670 ([ebd6be4](https://github.com/pie-framework/pie-elements/commit/ebd6be4fd48fca41ad4c4908f606b25334731aed))
37
-
38
- ## [11.1.3](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.2...@pie-element/placement-ordering-configure@11.1.3) (2026-06-12)
39
-
40
- ### Bug Fixes
41
-
17
+ - bump shared modules and libs PIE-674, PIE-662, PIE-705, PIE-674, PIE-963 ([78a3f64](https://github.com/pie-framework/pie-elements/commit/78a3f64652c9581c61bd4159f3210fc1e32d8bcf))
18
+ - bump shared modules and libs PIE-695, PIE-697, PIE-699, PIE-680, PIE-714, PIE-665, PIE-656 ([4b76ae7](https://github.com/pie-framework/pie-elements/commit/4b76ae75d1c5ea6d55f7c6fb53f299dfcbda2b1f))
42
19
  - bump shared modules and libsPIE-603, PIE-604, PIE-663, PIE-662, PIE-678 ([e61c7a7](https://github.com/pie-framework/pie-elements/commit/e61c7a7d23744586337dfbb17a18ebfc656c202f))
43
-
44
- ## [11.1.2](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.1...@pie-element/placement-ordering-configure@11.1.2) (2026-06-04)
45
-
46
- ### Bug Fixes
47
-
48
- - bump shared modules and libs PIE-600, PIE-602 ([ce99f6a](https://github.com/pie-framework/pie-elements/commit/ce99f6af50cb855b666a6df9340f9f5445fde4c4))
49
-
50
- ## [11.1.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.0...@pie-element/placement-ordering-configure@11.1.1) (2026-05-21)
51
-
52
- **Note:** Version bump only for package @pie-element/placement-ordering-configure
20
+ - handle webcomponent lifecycle on every element that misses it PIE-703 ([9d5923f](https://github.com/pie-framework/pie-elements/commit/9d5923f973f0471e1e8f69ad4309cfc63d980d93))
21
+ - **placement-ordering:** adjust choice grid row height and center choices PIE-787 ([ad3e41e](https://github.com/pie-framework/pie-elements/commit/ad3e41e606a1e80b2c6ba2c37e18367cbb9ccda1))
22
+ - sync libs versions ([48b5be9](https://github.com/pie-framework/pie-elements/commit/48b5be9559eb5b5235ca05f51c5f0161032a7041))
53
23
 
54
24
  # [11.1.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/placement-ordering-configure@11.1.0-next.1...@pie-element/placement-ordering-configure@11.1.0) (2026-05-21)
55
25
 
@@ -0,0 +1,376 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _react2 = require("@testing-library/react");
6
+ require("@testing-library/jest-dom");
7
+ var _choiceEditor = _interopRequireDefault(require("../choice-editor"));
8
+ // Mock dependencies
9
+ jest.mock('@pie-lib/render-ui', () => ({
10
+ InputContainer: ({
11
+ label,
12
+ children
13
+ }) => /*#__PURE__*/_react.default.createElement("div", {
14
+ "data-testid": "input-container"
15
+ }, label && /*#__PURE__*/_react.default.createElement("div", {
16
+ className: "input-container-label"
17
+ }, label), children)
18
+ }));
19
+ jest.mock('@pie-lib/config-ui', () => ({
20
+ AlertDialog: ({
21
+ open,
22
+ title,
23
+ text,
24
+ onConfirm
25
+ }) => open ? /*#__PURE__*/_react.default.createElement("div", {
26
+ "data-testid": "alert-dialog"
27
+ }, /*#__PURE__*/_react.default.createElement("div", {
28
+ "data-testid": "alert-title"
29
+ }, title), /*#__PURE__*/_react.default.createElement("div", {
30
+ "data-testid": "alert-text"
31
+ }, text), /*#__PURE__*/_react.default.createElement("button", {
32
+ "data-testid": "alert-confirm",
33
+ onClick: onConfirm
34
+ }, "Confirm")) : null
35
+ }));
36
+ jest.mock('../choice-tile', () => ({
37
+ __esModule: true,
38
+ default: ({
39
+ choice,
40
+ onDelete,
41
+ onChoiceChange,
42
+ error
43
+ }) => /*#__PURE__*/_react.default.createElement("div", {
44
+ "data-testid": `choice-tile-${choice.type}-${choice.id}`
45
+ }, /*#__PURE__*/_react.default.createElement("div", {
46
+ "data-testid": `choice-label-${choice.type}-${choice.id}`
47
+ }, choice.label), /*#__PURE__*/_react.default.createElement("button", {
48
+ "data-testid": `delete-${choice.type}-${choice.id}`,
49
+ onClick: onDelete
50
+ }, "Delete"), /*#__PURE__*/_react.default.createElement("button", {
51
+ "data-testid": `change-${choice.type}-${choice.id}`,
52
+ onClick: () => onChoiceChange({
53
+ ...choice,
54
+ label: 'Updated'
55
+ })
56
+ }, "Change"), error && /*#__PURE__*/_react.default.createElement("div", {
57
+ "data-testid": `error-${choice.type}-${choice.id}`
58
+ }, error))
59
+ }));
60
+ describe('ChoiceEditor', () => {
61
+ let defaultProps;
62
+ beforeEach(() => {
63
+ defaultProps = {
64
+ choices: [{
65
+ id: 'c1',
66
+ label: 'Choice 1'
67
+ }, {
68
+ id: 'c2',
69
+ label: 'Choice 2'
70
+ }, {
71
+ id: 'c3',
72
+ label: 'Choice 3'
73
+ }],
74
+ correctResponse: [{
75
+ id: 'c1',
76
+ weight: 0
77
+ }, {
78
+ id: 'c2',
79
+ weight: 0
80
+ }, {
81
+ id: 'c3',
82
+ weight: 0
83
+ }],
84
+ onChange: jest.fn(),
85
+ imageSupport: {
86
+ add: jest.fn(),
87
+ delete: jest.fn()
88
+ },
89
+ singularChoiceLabel: 'choice',
90
+ pluralChoiceLabel: 'choices',
91
+ choicesLabel: 'Choices',
92
+ ordering: {
93
+ tiles: [{
94
+ id: 'c1',
95
+ label: 'Choice 1',
96
+ type: 'choice'
97
+ }, {
98
+ id: 'c2',
99
+ label: 'Choice 2',
100
+ type: 'choice'
101
+ }, {
102
+ id: 'c3',
103
+ label: 'Choice 3',
104
+ type: 'choice'
105
+ }, {
106
+ id: 'c1',
107
+ label: 'Choice 1',
108
+ type: 'target'
109
+ }, {
110
+ id: 'c2',
111
+ label: 'Choice 2',
112
+ type: 'target'
113
+ }, {
114
+ id: 'c3',
115
+ label: 'Choice 3',
116
+ type: 'target'
117
+ }]
118
+ },
119
+ errors: {}
120
+ };
121
+ });
122
+ describe('rendering', () => {
123
+ it('should render without crashing', () => {
124
+ const {
125
+ container
126
+ } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
127
+ expect(container).toBeTruthy();
128
+ });
129
+ it('should render column labels', () => {
130
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
131
+ expect(_react2.screen.getByText('Student Choices')).toBeInTheDocument();
132
+ expect(_react2.screen.getByText('Correct Order')).toBeInTheDocument();
133
+ });
134
+ it('should render all choice tiles', () => {
135
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
136
+ expect(_react2.screen.getByTestId('choice-tile-choice-c1')).toBeInTheDocument();
137
+ expect(_react2.screen.getByTestId('choice-tile-choice-c2')).toBeInTheDocument();
138
+ expect(_react2.screen.getByTestId('choice-tile-choice-c3')).toBeInTheDocument();
139
+ expect(_react2.screen.getByTestId('choice-tile-target-c1')).toBeInTheDocument();
140
+ expect(_react2.screen.getByTestId('choice-tile-target-c2')).toBeInTheDocument();
141
+ expect(_react2.screen.getByTestId('choice-tile-target-c3')).toBeInTheDocument();
142
+ });
143
+ it('should render shuffle button', () => {
144
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
145
+ expect(_react2.screen.getByText('SHUFFLE CHOICES')).toBeInTheDocument();
146
+ });
147
+ it('should render add button', () => {
148
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
149
+ expect(_react2.screen.getByText('ADD CHOICE')).toBeInTheDocument();
150
+ });
151
+ it('should use custom choice labels', () => {
152
+ const props = {
153
+ ...defaultProps,
154
+ singularChoiceLabel: 'item',
155
+ pluralChoiceLabel: 'items',
156
+ choicesLabel: 'Items'
157
+ };
158
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
159
+ expect(_react2.screen.getByText('SHUFFLE ITEMS')).toBeInTheDocument();
160
+ expect(_react2.screen.getByText('ADD ITEM')).toBeInTheDocument();
161
+ expect(_react2.screen.getByText('Student Items')).toBeInTheDocument();
162
+ });
163
+ });
164
+ describe('adding choices', () => {
165
+ it('should add a new choice when add button is clicked', () => {
166
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
167
+ const addButton = _react2.screen.getByText('ADD CHOICE');
168
+ _react2.fireEvent.click(addButton);
169
+ expect(defaultProps.onChange).toHaveBeenCalledWith(expect.arrayContaining([...defaultProps.choices, {
170
+ id: 'c4',
171
+ label: ''
172
+ }]), expect.arrayContaining([...defaultProps.correctResponse, {
173
+ id: 'c4',
174
+ weight: 0
175
+ }]));
176
+ });
177
+ it('should show warning when trying to add more than 10 choices', () => {
178
+ const props = {
179
+ ...defaultProps,
180
+ choices: Array.from({
181
+ length: 10
182
+ }, (_, i) => ({
183
+ id: `c${i + 1}`,
184
+ label: `Choice ${i + 1}`
185
+ })),
186
+ ordering: {
187
+ tiles: Array.from({
188
+ length: 10
189
+ }, (_, i) => ({
190
+ id: `c${i + 1}`,
191
+ label: `Choice ${i + 1}`,
192
+ type: 'choice'
193
+ }))
194
+ }
195
+ };
196
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
197
+ const addButton = _react2.screen.getByText('ADD CHOICE');
198
+ _react2.fireEvent.click(addButton);
199
+ expect(_react2.screen.getByTestId('alert-dialog')).toBeInTheDocument();
200
+ expect(_react2.screen.getByText('There can be maximum 10 Choices.')).toBeInTheDocument();
201
+ });
202
+ it('should find free slot when adding choice', () => {
203
+ const props = {
204
+ ...defaultProps,
205
+ choices: [{
206
+ id: 'c1',
207
+ label: 'Choice 1'
208
+ }, {
209
+ id: 'c3',
210
+ label: 'Choice 3'
211
+ }],
212
+ correctResponse: [{
213
+ id: 'c1',
214
+ weight: 0
215
+ }, {
216
+ id: 'c3',
217
+ weight: 0
218
+ }],
219
+ ordering: {
220
+ tiles: [{
221
+ id: 'c1',
222
+ label: 'Choice 1',
223
+ type: 'choice'
224
+ }, {
225
+ id: 'c3',
226
+ label: 'Choice 3',
227
+ type: 'choice'
228
+ }]
229
+ }
230
+ };
231
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
232
+ const addButton = _react2.screen.getByText('ADD CHOICE');
233
+ _react2.fireEvent.click(addButton);
234
+ expect(props.onChange).toHaveBeenCalledWith(expect.arrayContaining([...props.choices, {
235
+ id: 'c2',
236
+ label: ''
237
+ }]), expect.anything());
238
+ });
239
+ });
240
+ describe('deleting choices', () => {
241
+ it('should show warning when trying to delete with only 3 choices', () => {
242
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
243
+ const deleteButton = _react2.screen.getByTestId('delete-choice-c1');
244
+ _react2.fireEvent.click(deleteButton);
245
+ expect(_react2.screen.getByTestId('alert-dialog')).toBeInTheDocument();
246
+ expect(_react2.screen.getByText('There have to be at least 3 Choices.')).toBeInTheDocument();
247
+ });
248
+ it('should allow deletion when more than 3 choices exist', () => {
249
+ const props = {
250
+ ...defaultProps,
251
+ choices: [{
252
+ id: 'c1',
253
+ label: 'Choice 1'
254
+ }, {
255
+ id: 'c2',
256
+ label: 'Choice 2'
257
+ }, {
258
+ id: 'c3',
259
+ label: 'Choice 3'
260
+ }, {
261
+ id: 'c4',
262
+ label: 'Choice 4'
263
+ }],
264
+ ordering: {
265
+ tiles: [{
266
+ id: 'c1',
267
+ label: 'Choice 1',
268
+ type: 'choice'
269
+ }, {
270
+ id: 'c2',
271
+ label: 'Choice 2',
272
+ type: 'choice'
273
+ }, {
274
+ id: 'c3',
275
+ label: 'Choice 3',
276
+ type: 'choice'
277
+ }, {
278
+ id: 'c4',
279
+ label: 'Choice 4',
280
+ type: 'choice'
281
+ }]
282
+ }
283
+ };
284
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
285
+ const deleteButton = _react2.screen.getByTestId('delete-choice-c1');
286
+ _react2.fireEvent.click(deleteButton);
287
+ expect(props.onChange).toHaveBeenCalled();
288
+ expect(_react2.screen.queryByTestId('alert-dialog')).not.toBeInTheDocument();
289
+ });
290
+ });
291
+ describe('changing choices', () => {
292
+ it('should update choice label when changed', () => {
293
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
294
+ const changeButton = _react2.screen.getByTestId('change-choice-c1');
295
+ _react2.fireEvent.click(changeButton);
296
+ expect(defaultProps.onChange).toHaveBeenCalledWith(expect.arrayContaining([{
297
+ id: 'c1',
298
+ label: 'Updated'
299
+ }, {
300
+ id: 'c2',
301
+ label: 'Choice 2'
302
+ }, {
303
+ id: 'c3',
304
+ label: 'Choice 3'
305
+ }]), defaultProps.correctResponse);
306
+ });
307
+ });
308
+ describe('shuffling choices', () => {
309
+ it('should shuffle choices when shuffle button is clicked', () => {
310
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
311
+ const shuffleButton = _react2.screen.getByText('SHUFFLE CHOICES');
312
+ _react2.fireEvent.click(shuffleButton);
313
+ expect(defaultProps.onChange).toHaveBeenCalled();
314
+ const [shuffledChoices] = defaultProps.onChange.mock.calls[0];
315
+ expect(shuffledChoices).toHaveLength(3);
316
+ expect(shuffledChoices.map(c => c.id).sort()).toEqual(['c1', 'c2', 'c3']);
317
+ });
318
+ it('should shuffle again if result matches correct order when placementArea is disabled', () => {
319
+ const props = {
320
+ ...defaultProps,
321
+ placementArea: false
322
+ };
323
+
324
+ // Mock shuffle to return the same order first time
325
+ const originalMath = Math.random;
326
+ let callCount = 0;
327
+ Math.random = () => {
328
+ callCount++;
329
+ // First call returns ordered, second returns shuffled
330
+ return callCount === 1 ? 0.1 : 0.9;
331
+ };
332
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
333
+ const shuffleButton = _react2.screen.getByText('SHUFFLE CHOICES');
334
+ _react2.fireEvent.click(shuffleButton);
335
+ expect(props.onChange).toHaveBeenCalled();
336
+ Math.random = originalMath;
337
+ });
338
+ });
339
+ describe('alert dialog', () => {
340
+ it('should close warning dialog when confirm is clicked', () => {
341
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, defaultProps));
342
+ const deleteButton = _react2.screen.getByTestId('delete-choice-c1');
343
+ _react2.fireEvent.click(deleteButton);
344
+ expect(_react2.screen.getByTestId('alert-dialog')).toBeInTheDocument();
345
+ const confirmButton = _react2.screen.getByTestId('alert-confirm');
346
+ _react2.fireEvent.click(confirmButton);
347
+ expect(_react2.screen.queryByTestId('alert-dialog')).not.toBeInTheDocument();
348
+ });
349
+ });
350
+ describe('errors', () => {
351
+ it('should display choice errors', () => {
352
+ const props = {
353
+ ...defaultProps,
354
+ errors: {
355
+ choicesErrors: {
356
+ c1: 'Choice is required'
357
+ }
358
+ }
359
+ };
360
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
361
+ // Error appears on both choice and target tiles for the same id
362
+ expect(_react2.screen.getAllByTestId(/error-.*-c1/)[0]).toHaveTextContent('Choice is required');
363
+ });
364
+ it('should display order error', () => {
365
+ const props = {
366
+ ...defaultProps,
367
+ errors: {
368
+ orderError: 'Order must be different'
369
+ }
370
+ };
371
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceEditor.default, props));
372
+ expect(_react2.screen.getByText('Order must be different')).toBeInTheDocument();
373
+ });
374
+ });
375
+ });
376
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfY2hvaWNlRWRpdG9yIiwiamVzdCIsIm1vY2siLCJJbnB1dENvbnRhaW5lciIsImxhYmVsIiwiY2hpbGRyZW4iLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIkFsZXJ0RGlhbG9nIiwib3BlbiIsInRpdGxlIiwidGV4dCIsIm9uQ29uZmlybSIsIm9uQ2xpY2siLCJfX2VzTW9kdWxlIiwiY2hvaWNlIiwib25EZWxldGUiLCJvbkNob2ljZUNoYW5nZSIsImVycm9yIiwidHlwZSIsImlkIiwiZGVzY3JpYmUiLCJkZWZhdWx0UHJvcHMiLCJiZWZvcmVFYWNoIiwiY2hvaWNlcyIsImNvcnJlY3RSZXNwb25zZSIsIndlaWdodCIsIm9uQ2hhbmdlIiwiZm4iLCJpbWFnZVN1cHBvcnQiLCJhZGQiLCJkZWxldGUiLCJzaW5ndWxhckNob2ljZUxhYmVsIiwicGx1cmFsQ2hvaWNlTGFiZWwiLCJjaG9pY2VzTGFiZWwiLCJvcmRlcmluZyIsInRpbGVzIiwiZXJyb3JzIiwiaXQiLCJjb250YWluZXIiLCJyZW5kZXIiLCJleHBlY3QiLCJ0b0JlVHJ1dGh5Iiwic2NyZWVuIiwiZ2V0QnlUZXh0IiwidG9CZUluVGhlRG9jdW1lbnQiLCJnZXRCeVRlc3RJZCIsInByb3BzIiwiYWRkQnV0dG9uIiwiZmlyZUV2ZW50IiwiY2xpY2siLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsImFycmF5Q29udGFpbmluZyIsIkFycmF5IiwiZnJvbSIsImxlbmd0aCIsIl8iLCJpIiwiYW55dGhpbmciLCJkZWxldGVCdXR0b24iLCJ0b0hhdmVCZWVuQ2FsbGVkIiwicXVlcnlCeVRlc3RJZCIsIm5vdCIsImNoYW5nZUJ1dHRvbiIsInNodWZmbGVCdXR0b24iLCJzaHVmZmxlZENob2ljZXMiLCJjYWxscyIsInRvSGF2ZUxlbmd0aCIsIm1hcCIsImMiLCJzb3J0IiwidG9FcXVhbCIsInBsYWNlbWVudEFyZWEiLCJvcmlnaW5hbE1hdGgiLCJNYXRoIiwicmFuZG9tIiwiY2FsbENvdW50IiwiY29uZmlybUJ1dHRvbiIsImNob2ljZXNFcnJvcnMiLCJjMSIsImdldEFsbEJ5VGVzdElkIiwidG9IYXZlVGV4dENvbnRlbnQiLCJvcmRlckVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9jaG9pY2UtZWRpdG9yLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIGZpcmVFdmVudCwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgJ0B0ZXN0aW5nLWxpYnJhcnkvamVzdC1kb20nO1xuaW1wb3J0IENob2ljZUVkaXRvciBmcm9tICcuLi9jaG9pY2UtZWRpdG9yJztcblxuLy8gTW9jayBkZXBlbmRlbmNpZXNcbmplc3QubW9jaygnQHBpZS1saWIvcmVuZGVyLXVpJywgKCkgPT4gKHtcbiAgSW5wdXRDb250YWluZXI6ICh7IGxhYmVsLCBjaGlsZHJlbiB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImlucHV0LWNvbnRhaW5lclwiPlxuICAgICAge2xhYmVsICYmIDxkaXYgY2xhc3NOYW1lPVwiaW5wdXQtY29udGFpbmVyLWxhYmVsXCI+e2xhYmVsfTwvZGl2Pn1cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9jb25maWctdWknLCAoKSA9PiAoe1xuICBBbGVydERpYWxvZzogKHsgb3BlbiwgdGl0bGUsIHRleHQsIG9uQ29uZmlybSB9KSA9PlxuICAgIG9wZW4gPyAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiYWxlcnQtZGlhbG9nXCI+XG4gICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJhbGVydC10aXRsZVwiPnt0aXRsZX08L2Rpdj5cbiAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImFsZXJ0LXRleHRcIj57dGV4dH08L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNvbmZpcm1cIiBvbkNsaWNrPXtvbkNvbmZpcm19PlxuICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApIDogbnVsbCxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9jaG9pY2UtdGlsZScsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6ICh7IGNob2ljZSwgb25EZWxldGUsIG9uQ2hvaWNlQ2hhbmdlLCBlcnJvciB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD17YGNob2ljZS10aWxlLSR7Y2hvaWNlLnR5cGV9LSR7Y2hvaWNlLmlkfWB9PlxuICAgICAgPGRpdiBkYXRhLXRlc3RpZD17YGNob2ljZS1sYWJlbC0ke2Nob2ljZS50eXBlfS0ke2Nob2ljZS5pZH1gfT57Y2hvaWNlLmxhYmVsfTwvZGl2PlxuICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD17YGRlbGV0ZS0ke2Nob2ljZS50eXBlfS0ke2Nob2ljZS5pZH1gfSBvbkNsaWNrPXtvbkRlbGV0ZX0+XG4gICAgICAgIERlbGV0ZVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGRhdGEtdGVzdGlkPXtgY2hhbmdlLSR7Y2hvaWNlLnR5cGV9LSR7Y2hvaWNlLmlkfWB9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hvaWNlQ2hhbmdlKHsgLi4uY2hvaWNlLCBsYWJlbDogJ1VwZGF0ZWQnIH0pfVxuICAgICAgPlxuICAgICAgICBDaGFuZ2VcbiAgICAgIDwvYnV0dG9uPlxuICAgICAge2Vycm9yICYmIDxkaXYgZGF0YS10ZXN0aWQ9e2BlcnJvci0ke2Nob2ljZS50eXBlfS0ke2Nob2ljZS5pZH1gfT57ZXJyb3J9PC9kaXY+fVxuICAgIDwvZGl2PlxuICApLFxufSkpO1xuXG5kZXNjcmliZSgnQ2hvaWNlRWRpdG9yJywgKCkgPT4ge1xuICBsZXQgZGVmYXVsdFByb3BzO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScgfSxcbiAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicgfSxcbiAgICAgICAgeyBpZDogJ2MzJywgbGFiZWw6ICdDaG9pY2UgMycgfSxcbiAgICAgIF0sXG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IFtcbiAgICAgICAgeyBpZDogJ2MxJywgd2VpZ2h0OiAwIH0sXG4gICAgICAgIHsgaWQ6ICdjMicsIHdlaWdodDogMCB9LFxuICAgICAgICB7IGlkOiAnYzMnLCB3ZWlnaHQ6IDAgfSxcbiAgICAgIF0sXG4gICAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgICAgaW1hZ2VTdXBwb3J0OiB7XG4gICAgICAgIGFkZDogamVzdC5mbigpLFxuICAgICAgICBkZWxldGU6IGplc3QuZm4oKSxcbiAgICAgIH0sXG4gICAgICBzaW5ndWxhckNob2ljZUxhYmVsOiAnY2hvaWNlJyxcbiAgICAgIHBsdXJhbENob2ljZUxhYmVsOiAnY2hvaWNlcycsXG4gICAgICBjaG9pY2VzTGFiZWw6ICdDaG9pY2VzJyxcbiAgICAgIG9yZGVyaW5nOiB7XG4gICAgICAgIHRpbGVzOiBbXG4gICAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgeyBpZDogJ2MzJywgbGFiZWw6ICdDaG9pY2UgMycsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScsIHR5cGU6ICd0YXJnZXQnIH0sXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicsIHR5cGU6ICd0YXJnZXQnIH0sXG4gICAgICAgICAgeyBpZDogJ2MzJywgbGFiZWw6ICdDaG9pY2UgMycsIHR5cGU6ICd0YXJnZXQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICB9O1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgY29sdW1uIGxhYmVscycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdTdHVkZW50IENob2ljZXMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdDb3JyZWN0IE9yZGVyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBhbGwgY2hvaWNlIHRpbGVzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnY2hvaWNlLXRpbGUtY2hvaWNlLWMxJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdjaG9pY2UtdGlsZS1jaG9pY2UtYzInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2Nob2ljZS10aWxlLWNob2ljZS1jMycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnY2hvaWNlLXRpbGUtdGFyZ2V0LWMxJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdjaG9pY2UtdGlsZS10YXJnZXQtYzInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2Nob2ljZS10aWxlLXRhcmdldC1jMycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgc2h1ZmZsZSBidXR0b24nLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnU0hVRkZMRSBDSE9JQ0VTJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBhZGQgYnV0dG9uJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGN1c3RvbSBjaG9pY2UgbGFiZWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc2luZ3VsYXJDaG9pY2VMYWJlbDogJ2l0ZW0nLFxuICAgICAgICBwbHVyYWxDaG9pY2VMYWJlbDogJ2l0ZW1zJyxcbiAgICAgICAgY2hvaWNlc0xhYmVsOiAnSXRlbXMnLFxuICAgICAgfTtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ1NIVUZGTEUgSVRFTVMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdBREQgSVRFTScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ1N0dWRlbnQgSXRlbXMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZGluZyBjaG9pY2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgbmV3IGNob2ljZSB3aGVuIGFkZCBidXR0b24gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFkZEJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFkZEJ1dHRvbik7XG5cbiAgICAgIGV4cGVjdChkZWZhdWx0UHJvcHMub25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMuY2hvaWNlcyxcbiAgICAgICAgICB7IGlkOiAnYzQnLCBsYWJlbDogJycgfSxcbiAgICAgICAgXSksXG4gICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgeyBpZDogJ2M0Jywgd2VpZ2h0OiAwIH0sXG4gICAgICAgIF0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2hvdyB3YXJuaW5nIHdoZW4gdHJ5aW5nIHRvIGFkZCBtb3JlIHRoYW4gMTAgY2hvaWNlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNob2ljZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDEwIH0sIChfLCBpKSA9PiAoe1xuICAgICAgICAgIGlkOiBgYyR7aSArIDF9YCxcbiAgICAgICAgICBsYWJlbDogYENob2ljZSAke2kgKyAxfWAsXG4gICAgICAgIH0pKSxcbiAgICAgICAgb3JkZXJpbmc6IHtcbiAgICAgICAgICB0aWxlczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMTAgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgICAgICBpZDogYGMke2kgKyAxfWAsXG4gICAgICAgICAgICBsYWJlbDogYENob2ljZSAke2kgKyAxfWAsXG4gICAgICAgICAgICB0eXBlOiAnY2hvaWNlJyxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFkZEJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFkZEJ1dHRvbik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2FsZXJ0LWRpYWxvZycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ1RoZXJlIGNhbiBiZSBtYXhpbXVtIDEwIENob2ljZXMuJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZpbmQgZnJlZSBzbG90IHdoZW4gYWRkaW5nIGNob2ljZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJyB9LFxuICAgICAgICAgIHsgaWQ6ICdjMycsIGxhYmVsOiAnQ2hvaWNlIDMnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNvcnJlY3RSZXNwb25zZTogW1xuICAgICAgICAgIHsgaWQ6ICdjMScsIHdlaWdodDogMCB9LFxuICAgICAgICAgIHsgaWQ6ICdjMycsIHdlaWdodDogMCB9LFxuICAgICAgICBdLFxuICAgICAgICBvcmRlcmluZzoge1xuICAgICAgICAgIHRpbGVzOiBbXG4gICAgICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJywgdHlwZTogJ2Nob2ljZScgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdjMycsIGxhYmVsOiAnQ2hvaWNlIDMnLCB0eXBlOiAnY2hvaWNlJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFkZEJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ0FERCBDSE9JQ0UnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFkZEJ1dHRvbik7XG5cbiAgICAgIGV4cGVjdChwcm9wcy5vbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgIC4uLnByb3BzLmNob2ljZXMsXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICcnIH0sXG4gICAgICAgIF0pLFxuICAgICAgICBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWxldGluZyBjaG9pY2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2hvdyB3YXJuaW5nIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSB3aXRoIG9ubHkgMyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gc2NyZWVuLmdldEJ5VGVzdElkKCdkZWxldGUtY2hvaWNlLWMxJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhkZWxldGVCdXR0b24pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdhbGVydC1kaWFsb2cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdUaGVyZSBoYXZlIHRvIGJlIGF0IGxlYXN0IDMgQ2hvaWNlcy4nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgZGVsZXRpb24gd2hlbiBtb3JlIHRoYW4gMyBjaG9pY2VzIGV4aXN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgaWQ6ICdjMScsIGxhYmVsOiAnQ2hvaWNlIDEnIH0sXG4gICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicgfSxcbiAgICAgICAgICB7IGlkOiAnYzMnLCBsYWJlbDogJ0Nob2ljZSAzJyB9LFxuICAgICAgICAgIHsgaWQ6ICdjNCcsIGxhYmVsOiAnQ2hvaWNlIDQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9yZGVyaW5nOiB7XG4gICAgICAgICAgdGlsZXM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdjMScsIGxhYmVsOiAnQ2hvaWNlIDEnLCB0eXBlOiAnY2hvaWNlJyB9LFxuICAgICAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicsIHR5cGU6ICdjaG9pY2UnIH0sXG4gICAgICAgICAgICB7IGlkOiAnYzMnLCBsYWJlbDogJ0Nob2ljZSAzJywgdHlwZTogJ2Nob2ljZScgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdjNCcsIGxhYmVsOiAnQ2hvaWNlIDQnLCB0eXBlOiAnY2hvaWNlJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnZGVsZXRlLWNob2ljZS1jMScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGVsZXRlQnV0dG9uKTtcblxuICAgICAgZXhwZWN0KHByb3BzLm9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXN0SWQoJ2FsZXJ0LWRpYWxvZycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NoYW5naW5nIGNob2ljZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgY2hvaWNlIGxhYmVsIHdoZW4gY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGNoYW5nZUJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnY2hhbmdlLWNob2ljZS1jMScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY2hhbmdlQnV0dG9uKTtcblxuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5vbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgIHsgaWQ6ICdjMScsIGxhYmVsOiAnVXBkYXRlZCcgfSxcbiAgICAgICAgICB7IGlkOiAnYzInLCBsYWJlbDogJ0Nob2ljZSAyJyB9LFxuICAgICAgICAgIHsgaWQ6ICdjMycsIGxhYmVsOiAnQ2hvaWNlIDMnIH0sXG4gICAgICAgIF0pLFxuICAgICAgICBkZWZhdWx0UHJvcHMuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NodWZmbGluZyBjaG9pY2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2h1ZmZsZSBjaG9pY2VzIHdoZW4gc2h1ZmZsZSBidXR0b24gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlRWRpdG9yIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IHNodWZmbGVCdXR0b24gPSBzY3JlZW4uZ2V0QnlUZXh0KCdTSFVGRkxFIENIT0lDRVMnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNodWZmbGVCdXR0b24pO1xuXG4gICAgICBleHBlY3QoZGVmYXVsdFByb3BzLm9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBjb25zdCBbc2h1ZmZsZWRDaG9pY2VzXSA9IGRlZmF1bHRQcm9wcy5vbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHNodWZmbGVkQ2hvaWNlcykudG9IYXZlTGVuZ3RoKDMpO1xuICAgICAgZXhwZWN0KHNodWZmbGVkQ2hvaWNlcy5tYXAoKGMpID0+IGMuaWQpLnNvcnQoKSkudG9FcXVhbChbJ2MxJywgJ2MyJywgJ2MzJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaHVmZmxlIGFnYWluIGlmIHJlc3VsdCBtYXRjaGVzIGNvcnJlY3Qgb3JkZXIgd2hlbiBwbGFjZW1lbnRBcmVhIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgcGxhY2VtZW50QXJlYTogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICAvLyBNb2NrIHNodWZmbGUgdG8gcmV0dXJuIHRoZSBzYW1lIG9yZGVyIGZpcnN0IHRpbWVcbiAgICAgIGNvbnN0IG9yaWdpbmFsTWF0aCA9IE1hdGgucmFuZG9tO1xuICAgICAgbGV0IGNhbGxDb3VudCA9IDA7XG4gICAgICBNYXRoLnJhbmRvbSA9ICgpID0+IHtcbiAgICAgICAgY2FsbENvdW50Kys7XG4gICAgICAgIC8vIEZpcnN0IGNhbGwgcmV0dXJucyBvcmRlcmVkLCBzZWNvbmQgcmV0dXJucyBzaHVmZmxlZFxuICAgICAgICByZXR1cm4gY2FsbENvdW50ID09PSAxID8gMC4xIDogMC45O1xuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCBzaHVmZmxlQnV0dG9uID0gc2NyZWVuLmdldEJ5VGV4dCgnU0hVRkZMRSBDSE9JQ0VTJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzaHVmZmxlQnV0dG9uKTtcblxuICAgICAgZXhwZWN0KHByb3BzLm9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgIE1hdGgucmFuZG9tID0gb3JpZ2luYWxNYXRoO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWxlcnQgZGlhbG9nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2xvc2Ugd2FybmluZyBkaWFsb2cgd2hlbiBjb25maXJtIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPENob2ljZUVkaXRvciB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBkZWxldGVCdXR0b24gPSBzY3JlZW4uZ2V0QnlUZXN0SWQoJ2RlbGV0ZS1jaG9pY2UtYzEnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGRlbGV0ZUJ1dHRvbik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdhbGVydC1kaWFsb2cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgY29uc3QgY29uZmlybUJ1dHRvbiA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnYWxlcnQtY29uZmlybScpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNvbmZpcm1CdXR0b24pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXN0SWQoJ2FsZXJ0LWRpYWxvZycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9ycycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRpc3BsYXkgY2hvaWNlIGVycm9ycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGVycm9yczoge1xuICAgICAgICAgIGNob2ljZXNFcnJvcnM6IHtcbiAgICAgICAgICAgIGMxOiAnQ2hvaWNlIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLnByb3BzfSAvPik7XG4gICAgICAvLyBFcnJvciBhcHBlYXJzIG9uIGJvdGggY2hvaWNlIGFuZCB0YXJnZXQgdGlsZXMgZm9yIHRoZSBzYW1lIGlkXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEFsbEJ5VGVzdElkKC9lcnJvci0uKi1jMS8pWzBdKS50b0hhdmVUZXh0Q29udGVudCgnQ2hvaWNlIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRpc3BsYXkgb3JkZXIgZXJyb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBvcmRlckVycm9yOiAnT3JkZXIgbXVzdCBiZSBkaWZmZXJlbnQnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VFZGl0b3Igey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnT3JkZXIgbXVzdCBiZSBkaWZmZXJlbnQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0FBLE9BQUE7QUFDQSxJQUFBRSxhQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFFQTtBQUNBRyxJQUFJLENBQUNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxPQUFPO0VBQ3JDQyxjQUFjLEVBQUVBLENBQUM7SUFBRUMsS0FBSztJQUFFQztFQUFTLENBQUMsa0JBQ2xDVCxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQTtJQUFLLGVBQVk7RUFBaUIsR0FDL0JILEtBQUssaUJBQUlSLE1BQUEsQ0FBQVUsT0FBQSxDQUFBQyxhQUFBO0lBQUtDLFNBQVMsRUFBQztFQUF1QixHQUFFSixLQUFXLENBQUMsRUFDN0RDLFFBQ0U7QUFFVCxDQUFDLENBQUMsQ0FBQztBQUVISixJQUFJLENBQUNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxPQUFPO0VBQ3JDTyxXQUFXLEVBQUVBLENBQUM7SUFBRUMsSUFBSTtJQUFFQyxLQUFLO0lBQUVDLElBQUk7SUFBRUM7RUFBVSxDQUFDLEtBQzVDSCxJQUFJLGdCQUNGZCxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQTtJQUFLLGVBQVk7RUFBYyxnQkFDN0JYLE1BQUEsQ0FBQVUsT0FBQSxDQUFBQyxhQUFBO0lBQUssZUFBWTtFQUFhLEdBQUVJLEtBQVcsQ0FBQyxlQUM1Q2YsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUE7SUFBSyxlQUFZO0VBQVksR0FBRUssSUFBVSxDQUFDLGVBQzFDaEIsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUE7SUFBUSxlQUFZLGVBQWU7SUFBQ08sT0FBTyxFQUFFRDtFQUFVLEdBQUMsU0FFaEQsQ0FDTCxDQUFDLEdBQ0o7QUFDUixDQUFDLENBQUMsQ0FBQztBQUVIWixJQUFJLENBQUNDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPO0VBQ2pDYSxVQUFVLEVBQUUsSUFBSTtFQUNoQlQsT0FBTyxFQUFFQSxDQUFDO0lBQUVVLE1BQU07SUFBRUMsUUFBUTtJQUFFQyxjQUFjO0lBQUVDO0VBQU0sQ0FBQyxrQkFDbkR2QixNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQTtJQUFLLGVBQWEsZUFBZVMsTUFBTSxDQUFDSSxJQUFJLElBQUlKLE1BQU0sQ0FBQ0ssRUFBRTtFQUFHLGdCQUMxRHpCLE1BQUEsQ0FBQVUsT0FBQSxDQUFBQyxhQUFBO0lBQUssZUFBYSxnQkFBZ0JTLE1BQU0sQ0FBQ0ksSUFBSSxJQUFJSixNQUFNLENBQUNLLEVBQUU7RUFBRyxHQUFFTCxNQUFNLENBQUNaLEtBQVcsQ0FBQyxlQUNsRlIsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUE7SUFBUSxlQUFhLFVBQVVTLE1BQU0sQ0FBQ0ksSUFBSSxJQUFJSixNQUFNLENBQUNLLEVBQUUsRUFBRztJQUFDUCxPQUFPLEVBQUVHO0VBQVMsR0FBQyxRQUV0RSxDQUFDLGVBQ1RyQixNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQTtJQUNFLGVBQWEsVUFBVVMsTUFBTSxDQUFDSSxJQUFJLElBQUlKLE1BQU0sQ0FBQ0ssRUFBRSxFQUFHO0lBQ2xEUCxPQUFPLEVBQUVBLENBQUEsS0FBTUksY0FBYyxDQUFDO01BQUUsR0FBR0YsTUFBTTtNQUFFWixLQUFLLEVBQUU7SUFBVSxDQUFDO0VBQUUsR0FDaEUsUUFFTyxDQUFDLEVBQ1JlLEtBQUssaUJBQUl2QixNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQTtJQUFLLGVBQWEsU0FBU1MsTUFBTSxDQUFDSSxJQUFJLElBQUlKLE1BQU0sQ0FBQ0ssRUFBRTtFQUFHLEdBQUVGLEtBQVcsQ0FDMUU7QUFFVCxDQUFDLENBQUMsQ0FBQztBQUVIRyxRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU07RUFDN0IsSUFBSUMsWUFBWTtFQUVoQkMsVUFBVSxDQUFDLE1BQU07SUFDZkQsWUFBWSxHQUFHO01BQ2JFLE9BQU8sRUFBRSxDQUNQO1FBQUVKLEVBQUUsRUFBRSxJQUFJO1FBQUVqQixLQUFLLEVBQUU7TUFBVyxDQUFDLEVBQy9CO1FBQUVpQixFQUFFLEVBQUUsSUFBSTtRQUFFakIsS0FBSyxFQUFFO01BQVcsQ0FBQyxFQUMvQjtRQUFFaUIsRUFBRSxFQUFFLElBQUk7UUFBRWpCLEtBQUssRUFBRTtNQUFXLENBQUMsQ0FDaEM7TUFDRHNCLGVBQWUsRUFBRSxDQUNmO1FBQUVMLEVBQUUsRUFBRSxJQUFJO1FBQUVNLE1BQU0sRUFBRTtNQUFFLENBQUMsRUFDdkI7UUFBRU4sRUFBRSxFQUFFLElBQUk7UUFBRU0sTUFBTSxFQUFFO01BQUUsQ0FBQyxFQUN2QjtRQUFFTixFQUFFLEVBQUUsSUFBSTtRQUFFTSxNQUFNLEVBQUU7TUFBRSxDQUFDLENBQ3hCO01BQ0RDLFFBQVEsRUFBRTNCLElBQUksQ0FBQzRCLEVBQUUsQ0FBQyxDQUFDO01BQ25CQyxZQUFZLEVBQUU7UUFDWkMsR0FBRyxFQUFFOUIsSUFBSSxDQUFDNEIsRUFBRSxDQUFDLENBQUM7UUFDZEcsTUFBTSxFQUFFL0IsSUFBSSxDQUFDNEIsRUFBRSxDQUFDO01BQ2xCLENBQUM7TUFDREksbUJBQW1CLEVBQUUsUUFBUTtNQUM3QkMsaUJBQWlCLEVBQUUsU0FBUztNQUM1QkMsWUFBWSxFQUFFLFNBQVM7TUFDdkJDLFFBQVEsRUFBRTtRQUNSQyxLQUFLLEVBQUUsQ0FDTDtVQUFFaEIsRUFBRSxFQUFFLElBQUk7VUFBRWpCLEtBQUssRUFBRSxVQUFVO1VBQUVnQixJQUFJLEVBQUU7UUFBUyxDQUFDLEVBQy9DO1VBQUVDLEVBQUUsRUFBRSxJQUFJO1VBQUVqQixLQUFLLEVBQUUsVUFBVTtVQUFFZ0IsSUFBSSxFQUFFO1FBQVMsQ0FBQyxFQUMvQztVQUFFQyxFQUFFLEVBQUUsSUFBSTtVQUFFakIsS0FBSyxFQUFFLFVBQVU7VUFBRWdCLElBQUksRUFBRTtRQUFTLENBQUMsRUFDL0M7VUFBRUMsRUFBRSxFQUFFLElBQUk7VUFBRWpCLEtBQUssRUFBRSxVQUFVO1VBQUVnQixJQUFJLEVBQUU7UUFBUyxDQUFDLEVBQy9DO1VBQUVDLEVBQUUsRUFBRSxJQUFJO1VBQUVqQixLQUFLLEVBQUUsVUFBVTtVQUFFZ0IsSUFBSSxFQUFFO1FBQVMsQ0FBQyxFQUMvQztVQUFFQyxFQUFFLEVBQUUsSUFBSTtVQUFFakIsS0FBSyxFQUFFLFVBQVU7VUFBRWdCLElBQUksRUFBRTtRQUFTLENBQUM7TUFFbkQsQ0FBQztNQUNEa0IsTUFBTSxFQUFFLENBQUM7SUFDWCxDQUFDO0VBQ0gsQ0FBQyxDQUFDO0VBRUZoQixRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU07SUFDMUJpQixFQUFFLENBQUMsZ0NBQWdDLEVBQUUsTUFBTTtNQUN6QyxNQUFNO1FBQUVDO01BQVUsQ0FBQyxHQUFHLElBQUFDLGNBQU0sZUFBQzdDLE1BQUEsQ0FBQVUsT0FBQSxDQUFBQyxhQUFBLENBQUNQLGFBQUEsQ0FBQU0sT0FBWSxFQUFLaUIsWUFBZSxDQUFDLENBQUM7TUFDaEVtQixNQUFNLENBQUNGLFNBQVMsQ0FBQyxDQUFDRyxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUM7SUFFRkosRUFBRSxDQUFDLDZCQUE2QixFQUFFLE1BQU07TUFDdEMsSUFBQUUsY0FBTSxlQUFDN0MsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUEsQ0FBQ1AsYUFBQSxDQUFBTSxPQUFZLEVBQUtpQixZQUFlLENBQUMsQ0FBQztNQUMxQ21CLE1BQU0sQ0FBQ0UsY0FBTSxDQUFDQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO01BQy9ESixNQUFNLENBQUNFLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDO0lBRUZQLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxNQUFNO01BQ3pDLElBQUFFLGNBQU0sZUFBQzdDLE1BQUEsQ0FBQVUsT0FBQSxDQUFBQyxhQUFBLENBQUNQLGFBQUEsQ0FBQU0sT0FBWSxFQUFLaUIsWUFBZSxDQUFDLENBQUM7TUFDMUNtQixNQUFNLENBQUNFLGNBQU0sQ0FBQ0csV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQ0QsaUJBQWlCLENBQUMsQ0FBQztNQUN2RUosTUFBTSxDQUFDRSxjQUFNLENBQUNHLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUNELGlCQUFpQixDQUFDLENBQUM7TUFDdkVKLE1BQU0sQ0FBQ0UsY0FBTSxDQUFDRyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDRCxpQkFBaUIsQ0FBQyxDQUFDO01BQ3ZFSixNQUFNLENBQUNFLGNBQU0sQ0FBQ0csV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQ0QsaUJBQWlCLENBQUMsQ0FBQztNQUN2RUosTUFBTSxDQUFDRSxjQUFNLENBQUNHLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUNELGlCQUFpQixDQUFDLENBQUM7TUFDdkVKLE1BQU0sQ0FBQ0UsY0FBTSxDQUFDRyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDRCxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQztJQUVGUCxFQUFFLENBQUMsOEJBQThCLEVBQUUsTUFBTTtNQUN2QyxJQUFBRSxjQUFNLGVBQUM3QyxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQSxDQUFDUCxhQUFBLENBQUFNLE9BQVksRUFBS2lCLFlBQWUsQ0FBQyxDQUFDO01BQzFDbUIsTUFBTSxDQUFDRSxjQUFNLENBQUNDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDO0lBRUZQLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxNQUFNO01BQ25DLElBQUFFLGNBQU0sZUFBQzdDLE1BQUEsQ0FBQVUsT0FBQSxDQUFBQyxhQUFBLENBQUNQLGFBQUEsQ0FBQU0sT0FBWSxFQUFLaUIsWUFBZSxDQUFDLENBQUM7TUFDMUNtQixNQUFNLENBQUNFLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDO0lBRUZQLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxNQUFNO01BQzFDLE1BQU1TLEtBQUssR0FBRztRQUNaLEdBQUd6QixZQUFZO1FBQ2ZVLG1CQUFtQixFQUFFLE1BQU07UUFDM0JDLGlCQUFpQixFQUFFLE9BQU87UUFDMUJDLFlBQVksRUFBRTtNQUNoQixDQUFDO01BQ0QsSUFBQU0sY0FBTSxlQUFDN0MsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUEsQ0FBQ1AsYUFBQSxDQUFBTSxPQUFZLEVBQUswQyxLQUFRLENBQUMsQ0FBQztNQUNuQ04sTUFBTSxDQUFDRSxjQUFNLENBQUNDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO01BQzdESixNQUFNLENBQUNFLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7TUFDeERKLE1BQU0sQ0FBQ0UsY0FBTSxDQUFDQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRnhCLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNO0lBQy9CaUIsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLE1BQU07TUFDN0QsSUFBQUUsY0FBTSxlQUFDN0MsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUEsQ0FBQ1AsYUFBQSxDQUFBTSxPQUFZLEVBQUtpQixZQUFlLENBQUMsQ0FBQztNQUMxQyxNQUFNMEIsU0FBUyxHQUFHTCxjQUFNLENBQUNDLFNBQVMsQ0FBQyxZQUFZLENBQUM7TUFFaERLLGlCQUFTLENBQUNDLEtBQUssQ0FBQ0YsU0FBUyxDQUFDO01BRTFCUCxNQUFNLENBQUNuQixZQUFZLENBQUNLLFFBQVEsQ0FBQyxDQUFDd0Isb0JBQW9CLENBQ2hEVixNQUFNLENBQUNXLGVBQWUsQ0FBQyxDQUNyQixHQUFHOUIsWUFBWSxDQUFDRSxPQUFPLEVBQ3ZCO1FBQUVKLEVBQUUsRUFBRSxJQUFJO1FBQUVqQixLQUFLLEVBQUU7TUFBRyxDQUFDLENBQ3hCLENBQUMsRUFDRnNDLE1BQU0sQ0FBQ1csZUFBZSxDQUFDLENBQ3JCLEdBQUc5QixZQUFZLENBQUNHLGVBQWUsRUFDL0I7UUFBRUwsRUFBRSxFQUFFLElBQUk7UUFBRU0sTUFBTSxFQUFFO01BQUUsQ0FBQyxDQUN4QixDQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRlksRUFBRSxDQUFDLDZEQUE2RCxFQUFFLE1BQU07TUFDdEUsTUFBTVMsS0FBSyxHQUFHO1FBQ1osR0FBR3pCLFlBQVk7UUFDZkUsT0FBTyxFQUFFNkIsS0FBSyxDQUFDQyxJQUFJLENBQUM7VUFBRUMsTUFBTSxFQUFFO1FBQUcsQ0FBQyxFQUFFLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxNQUFNO1VBQzdDckMsRUFBRSxFQUFFLElBQUlxQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQ2Z0RCxLQUFLLEVBQUUsVUFBVXNELENBQUMsR0FBRyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0h0QixRQUFRLEVBQUU7VUFDUkMsS0FBSyxFQUFFaUIsS0FBSyxDQUFDQyxJQUFJLENBQUM7WUFBRUMsTUFBTSxFQUFFO1VBQUcsQ0FBQyxFQUFFLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxNQUFNO1lBQzNDckMsRUFBRSxFQUFFLElBQUlxQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2Z0RCxLQUFLLEVBQUUsVUFBVXNELENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEJ0QyxJQUFJLEVBQUU7VUFDUixDQUFDLENBQUM7UUFDSjtNQUNGLENBQUM7TUFFRCxJQUFBcUIsY0FBTSxlQUFDN0MsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUEsQ0FBQ1AsYUFBQSxDQUFBTSxPQUFZLEVBQUswQyxLQUFRLENBQUMsQ0FBQztNQUNuQyxNQUFNQyxTQUFTLEdBQUdMLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLFlBQVksQ0FBQztNQUVoREssaUJBQVMsQ0FBQ0MsS0FBSyxDQUFDRixTQUFTLENBQUM7TUFFMUJQLE1BQU0sQ0FBQ0UsY0FBTSxDQUFDRyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ0QsaUJBQWlCLENBQUMsQ0FBQztNQUM5REosTUFBTSxDQUFDRSxjQUFNLENBQUNDLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUM7SUFDbEYsQ0FBQyxDQUFDO0lBRUZQLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxNQUFNO01BQ25ELE1BQU1TLEtBQUssR0FBRztRQUNaLEdBQUd6QixZQUFZO1FBQ2ZFLE9BQU8sRUFBRSxDQUNQO1VBQUVKLEVBQUUsRUFBRSxJQUFJO1VBQUVqQixLQUFLLEVBQUU7UUFBVyxDQUFDLEVBQy9CO1VBQUVpQixFQUFFLEVBQUUsSUFBSTtVQUFFakIsS0FBSyxFQUFFO1FBQVcsQ0FBQyxDQUNoQztRQUNEc0IsZUFBZSxFQUFFLENBQ2Y7VUFBRUwsRUFBRSxFQUFFLElBQUk7VUFBRU0sTUFBTSxFQUFFO1FBQUUsQ0FBQyxFQUN2QjtVQUFFTixFQUFFLEVBQUUsSUFBSTtVQUFFTSxNQUFNLEVBQUU7UUFBRSxDQUFDLENBQ3hCO1FBQ0RTLFFBQVEsRUFBRTtVQUNSQyxLQUFLLEVBQUUsQ0FDTDtZQUFFaEIsRUFBRSxFQUFFLElBQUk7WUFBRWpCLEtBQUssRUFBRSxVQUFVO1lBQUVnQixJQUFJLEVBQUU7VUFBUyxDQUFDLEVBQy9DO1lBQUVDLEVBQUUsRUFBRSxJQUFJO1lBQUVqQixLQUFLLEVBQUUsVUFBVTtZQUFFZ0IsSUFBSSxFQUFFO1VBQVMsQ0FBQztRQUVuRDtNQUNGLENBQUM7TUFFRCxJQUFBcUIsY0FBTSxlQUFDN0MsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUEsQ0FBQ1AsYUFBQSxDQUFBTSxPQUFZLEVBQUswQyxLQUFRLENBQUMsQ0FBQztNQUNuQyxNQUFNQyxTQUFTLEdBQUdMLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLFlBQVksQ0FBQztNQUVoREssaUJBQVMsQ0FBQ0MsS0FBSyxDQUFDRixTQUFTLENBQUM7TUFFMUJQLE1BQU0sQ0FBQ00sS0FBSyxDQUFDcEIsUUFBUSxDQUFDLENBQUN3QixvQkFBb0IsQ0FDekNWLE1BQU0sQ0FBQ1csZUFBZSxDQUFDLENBQ3JCLEdBQUdMLEtBQUssQ0FBQ3ZCLE9BQU8sRUFDaEI7UUFBRUosRUFBRSxFQUFFLElBQUk7UUFBRWpCLEtBQUssRUFBRTtNQUFHLENBQUMsQ0FDeEIsQ0FBQyxFQUNGc0MsTUFBTSxDQUFDaUIsUUFBUSxDQUFDLENBQ2xCLENBQUM7SUFDSCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRnJDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNO0lBQ2pDaUIsRUFBRSxDQUFDLCtEQUErRCxFQUFFLE1BQU07TUFDeEUsSUFBQUUsY0FBTSxlQUFDN0MsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUEsQ0FBQ1AsYUFBQSxDQUFBTSxPQUFZLEVBQUtpQixZQUFlLENBQUMsQ0FBQztNQUMxQyxNQUFNcUMsWUFBWSxHQUFHaEIsY0FBTSxDQUFDRyxXQUFXLENBQUMsa0JBQWtCLENBQUM7TUFFM0RHLGlCQUFTLENBQUNDLEtBQUssQ0FBQ1MsWUFBWSxDQUFDO01BRTdCbEIsTUFBTSxDQUFDRSxjQUFNLENBQUNHLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDRCxpQkFBaUIsQ0FBQyxDQUFDO01BQzlESixNQUFNLENBQUNFLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztJQUN0RixDQUFDLENBQUM7SUFFRlAsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLE1BQU07TUFDL0QsTUFBTVMsS0FBSyxHQUFHO1FBQ1osR0FBR3pCLFlBQVk7UUFDZkUsT0FBTyxFQUFFLENBQ1A7VUFBRUosRUFBRSxFQUFFLElBQUk7VUFBRWpCLEtBQUssRUFBRTtRQUFXLENBQUMsRUFDL0I7VUFBRWlCLEVBQUUsRUFBRSxJQUFJO1VBQUVqQixLQUFLLEVBQUU7UUFBVyxDQUFDLEVBQy9CO1VBQUVpQixFQUFFLEVBQUUsSUFBSTtVQUFFakIsS0FBSyxFQUFFO1FBQVcsQ0FBQyxFQUMvQjtVQUFFaUIsRUFBRSxFQUFFLElBQUk7VUFBRWpCLEtBQUssRUFBRTtRQUFXLENBQUMsQ0FDaEM7UUFDRGdDLFFBQVEsRUFBRTtVQUNSQyxLQUFLLEVBQUUsQ0FDTDtZQUFFaEIsRUFBRSxFQUFFLElBQUk7WUFBRWpCLEtBQUssRUFBRSxVQUFVO1lBQUVnQixJQUFJLEVBQUU7VUFBUyxDQUFDLEVBQy9DO1lBQUVDLEVBQUUsRUFBRSxJQUFJO1lBQUVqQixLQUFLLEVBQUUsVUFBVTtZQUFFZ0IsSUFBSSxFQUFFO1VBQVMsQ0FBQyxFQUMvQztZQUFFQyxFQUFFLEVBQUUsSUFBSTtZQUFFakIsS0FBSyxFQUFFLFVBQVU7WUFBRWdCLElBQUksRUFBRTtVQUFTLENBQUMsRUFDL0M7WUFBRUMsRUFBRSxFQUFFLElBQUk7WUFBRWpCLEtBQUssRUFBRSxVQUFVO1lBQUVnQixJQUFJLEVBQUU7VUFBUyxDQUFDO1FBRW5EO01BQ0YsQ0FBQztNQUVELElBQUFxQixjQUFNLGVBQUM3QyxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQSxDQUFDUCxhQUFBLENBQUFNLE9BQVksRUFBSzBDLEtBQVEsQ0FBQyxDQUFDO01BQ25DLE1BQU1ZLFlBQVksR0FBR2hCLGNBQU0sQ0FBQ0csV0FBVyxDQUFDLGtCQUFrQixDQUFDO01BRTNERyxpQkFBUyxDQUFDQyxLQUFLLENBQUNTLFlBQVksQ0FBQztNQUU3QmxCLE1BQU0sQ0FBQ00sS0FBSyxDQUFDcEIsUUFBUSxDQUFDLENBQUNpQyxnQkFBZ0IsQ0FBQyxDQUFDO01BQ3pDbkIsTUFBTSxDQUFDRSxjQUFNLENBQUNrQixhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxDQUFDakIsaUJBQWlCLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRnhCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNO0lBQ2pDaUIsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLE1BQU07TUFDbEQsSUFBQUUsY0FBTSxlQUFDN0MsTUFBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUEsQ0FBQ1AsYUFBQSxDQUFBTSxPQUFZLEVBQUtpQixZQUFlLENBQUMsQ0FBQztNQUMxQyxNQUFNeUMsWUFBWSxHQUFHcEIsY0FBTSxDQUFDRyxXQUFXLENBQUMsa0JBQWtCLENBQUM7TUFFM0RHLGlCQUFTLENBQUNDLEtBQUssQ0FBQ2EsWUFBWSxDQUFDO01BRTdCdEIsTUFBTSxDQUFDbkIsWUFBWSxDQUFDSyxRQUFRLENBQUMsQ0FBQ3dCLG9CQUFvQixDQUNoRFYsTUFBTSxDQUFDVyxlQUFlLENBQUMsQ0FDckI7UUFBRWhDLEVBQUUsRUFBRSxJQUFJO1FBQUVqQixLQUFLLEVBQUU7TUFBVSxDQUFDLEVBQzlCO1FBQUVpQixFQUFFLEVBQUUsSUFBSTtRQUFFakIsS0FBSyxFQUFFO01BQVcsQ0FBQyxFQUMvQjtRQUFFaUIsRUFBRSxFQUFFLElBQUk7UUFBRWpCLEtBQUssRUFBRTtNQUFXLENBQUMsQ0FDaEMsQ0FBQyxFQUNGbUIsWUFBWSxDQUFDRyxlQUNmLENBQUM7SUFDSCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRkosUUFBUSxDQUFDLG1CQUFtQixFQUFFLE1BQU07SUFDbENpQixFQUFFLENBQUMsdURBQXVELEVBQUUsTUFBTTtNQUNoRSxJQUFBRSxjQUFNLGVBQUM3QyxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQSxDQUFDUCxhQUFBLENBQUFNLE9BQVksRUFBS2lCLFlBQWUsQ0FBQyxDQUFDO01BQzFDLE1BQU0wQyxhQUFhLEdBQUdyQixjQUFNLENBQUNDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztNQUV6REssaUJBQVMsQ0FBQ0MsS0FBSyxDQUFDYyxhQUFhLENBQUM7TUFFOUJ2QixNQUFNLENBQUNuQixZQUFZLENBQUNLLFFBQVEsQ0FBQyxDQUFDaUMsZ0JBQWdCLENBQUMsQ0FBQztNQUNoRCxNQUFNLENBQUNLLGVBQWUsQ0FBQyxHQUFHM0MsWUFBWSxDQUFDSyxRQUFRLENBQUMxQixJQUFJLENBQUNpRSxLQUFLLENBQUMsQ0FBQyxDQUFDO01BQzdEekIsTUFBTSxDQUFDd0IsZUFBZSxDQUFDLENBQUNFLFlBQVksQ0FBQyxDQUFDLENBQUM7TUFDdkMxQixNQUFNLENBQUN3QixlQUFlLENBQUNHLEdBQUcsQ0FBRUMsQ0FBQyxJQUFLQSxDQUFDLENBQUNqRCxFQUFFLENBQUMsQ0FBQ2tELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RSxDQUFDLENBQUM7SUFFRmpDLEVBQUUsQ0FBQyxxRkFBcUYsRUFBRSxNQUFNO01BQzlGLE1BQU1TLEtBQUssR0FBRztRQUNaLEdBQUd6QixZQUFZO1FBQ2ZrRCxhQUFhLEVBQUU7TUFDakIsQ0FBQzs7TUFFRDtNQUNBLE1BQU1DLFlBQVksR0FBR0MsSUFBSSxDQUFDQyxNQUFNO01BQ2hDLElBQUlDLFNBQVMsR0FBRyxDQUFDO01BQ2pCRixJQUFJLENBQUNDLE1BQU0sR0FBRyxNQUFNO1FBQ2xCQyxTQUFTLEVBQUU7UUFDWDtRQUNBLE9BQU9BLFNBQVMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUc7TUFDcEMsQ0FBQztNQUVELElBQUFwQyxjQUFNLGVBQUM3QyxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQSxDQUFDUCxhQUFBLENBQUFNLE9BQVksRUFBSzBDLEtBQVEsQ0FBQyxDQUFDO01BQ25DLE1BQU1pQixhQUFhLEdBQUdyQixjQUFNLENBQUNDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztNQUV6REssaUJBQVMsQ0FBQ0MsS0FBSyxDQUFDYyxhQUFhLENBQUM7TUFFOUJ2QixNQUFNLENBQUNNLEtBQUssQ0FBQ3BCLFFBQVEsQ0FBQyxDQUFDaUMsZ0JBQWdCLENBQUMsQ0FBQztNQUV6Q2MsSUFBSSxDQUFDQyxNQUFNLEdBQUdGLFlBQVk7SUFDNUIsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZwRCxRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU07SUFDN0JpQixFQUFFLENBQUMscURBQXFELEVBQUUsTUFBTTtNQUM5RCxJQUFBRSxjQUFNLGVBQUM3QyxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQSxDQUFDUCxhQUFBLENBQUFNLE9BQVksRUFBS2lCLFlBQWUsQ0FBQyxDQUFDO01BQzFDLE1BQU1xQyxZQUFZLEdBQUdoQixjQUFNLENBQUNHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztNQUUzREcsaUJBQVMsQ0FBQ0MsS0FBSyxDQUFDUyxZQUFZLENBQUM7TUFDN0JsQixNQUFNLENBQUNFLGNBQU0sQ0FBQ0csV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUNELGlCQUFpQixDQUFDLENBQUM7TUFFOUQsTUFBTWdDLGFBQWEsR0FBR2xDLGNBQU0sQ0FBQ0csV0FBVyxDQUFDLGVBQWUsQ0FBQztNQUN6REcsaUJBQVMsQ0FBQ0MsS0FBSyxDQUFDMkIsYUFBYSxDQUFDO01BRTlCcEMsTUFBTSxDQUFDRSxjQUFNLENBQUNrQixhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxDQUFDakIsaUJBQWlCLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRnhCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTTtJQUN2QmlCLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxNQUFNO01BQ3ZDLE1BQU1TLEtBQUssR0FBRztRQUNaLEdBQUd6QixZQUFZO1FBQ2ZlLE1BQU0sRUFBRTtVQUNOeUMsYUFBYSxFQUFFO1lBQ2JDLEVBQUUsRUFBRTtVQUNOO1FBQ0Y7TUFDRixDQUFDO01BRUQsSUFBQXZDLGNBQU0sZUFBQzdDLE1BQUEsQ0FBQVUsT0FBQSxDQUFBQyxhQUFBLENBQUNQLGFBQUEsQ0FBQU0sT0FBWSxFQUFLMEMsS0FBUSxDQUFDLENBQUM7TUFDbkM7TUFDQU4sTUFBTSxDQUFDRSxjQUFNLENBQUNxQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7SUFDekYsQ0FBQyxDQUFDO0lBRUYzQyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsTUFBTTtNQUNyQyxNQUFNUyxLQUFLLEdBQUc7UUFDWixHQUFHekIsWUFBWTtRQUNmZSxNQUFNLEVBQUU7VUFDTjZDLFVBQVUsRUFBRTtRQUNkO01BQ0YsQ0FBQztNQUVELElBQUExQyxjQUFNLGVBQUM3QyxNQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQSxDQUFDUCxhQUFBLENBQUFNLE9BQVksRUFBSzBDLEtBQVEsQ0FBQyxDQUFDO01BQ25DTixNQUFNLENBQUNFLGNBQU0sQ0FBQ0MsU0FBUyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztJQUN6RSxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=