@pie-element/hotspot 4.10.10 → 4.10.11-beta.1443

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +349 -0
  2. package/configure/CHANGELOG.md +311 -0
  3. package/configure/lib/button.js.map +1 -1
  4. package/configure/lib/defaults.js +23 -2
  5. package/configure/lib/defaults.js.map +1 -1
  6. package/configure/lib/hotspot-container.js +28 -19
  7. package/configure/lib/hotspot-container.js.map +1 -1
  8. package/configure/lib/hotspot-drawable.js +3 -3
  9. package/configure/lib/hotspot-drawable.js.map +1 -1
  10. package/configure/lib/hotspot-palette.js.map +1 -1
  11. package/configure/lib/hotspot-polygon.js.map +1 -1
  12. package/configure/lib/hotspot-rectangle.js.map +1 -1
  13. package/configure/lib/index.js +16 -2
  14. package/configure/lib/index.js.map +1 -1
  15. package/configure/lib/root.js +129 -38
  16. package/configure/lib/root.js.map +1 -1
  17. package/configure/lib/upload-control.js.map +1 -1
  18. package/configure/lib/utils.js +15 -3
  19. package/configure/lib/utils.js.map +1 -1
  20. package/configure/package.json +4 -4
  21. package/configure/src/__tests__/__snapshots__/hotspot-container.test.js.snap +1 -1
  22. package/configure/src/__tests__/__snapshots__/root.test.js.snap +56 -4
  23. package/configure/src/__tests__/hotspot-container.test.js +98 -71
  24. package/configure/src/__tests__/hotspot-drawable.test.js +48 -49
  25. package/configure/src/__tests__/index.test.js +28 -51
  26. package/configure/src/__tests__/root.test.js +162 -82
  27. package/configure/src/__tests__/utils.test.js +112 -98
  28. package/configure/src/button.jsx +4 -4
  29. package/configure/src/defaults.js +35 -18
  30. package/configure/src/hotspot-container.jsx +99 -98
  31. package/configure/src/hotspot-drawable.jsx +56 -56
  32. package/configure/src/hotspot-palette.jsx +12 -25
  33. package/configure/src/hotspot-polygon.jsx +20 -22
  34. package/configure/src/hotspot-rectangle.jsx +5 -15
  35. package/configure/src/index.js +32 -18
  36. package/configure/src/root.jsx +116 -60
  37. package/configure/src/upload-control.jsx +9 -20
  38. package/configure/src/utils.js +51 -22
  39. package/controller/CHANGELOG.md +23 -0
  40. package/controller/lib/defaults.js +2 -2
  41. package/controller/lib/defaults.js.map +1 -1
  42. package/controller/lib/index.js +39 -3
  43. package/controller/lib/index.js.map +1 -1
  44. package/controller/lib/utils.js.map +1 -1
  45. package/controller/package.json +2 -2
  46. package/controller/src/__tests__/index.test.js +29 -50
  47. package/controller/src/defaults.js +5 -9
  48. package/controller/src/index.js +47 -33
  49. package/controller/src/utils.js +9 -6
  50. package/docs/config-schema.json +217 -0
  51. package/docs/config-schema.json.md +169 -0
  52. package/docs/demo/config.js +2 -2
  53. package/docs/demo/generate.js +53 -35
  54. package/docs/demo/session.js +2 -2
  55. package/docs/pie-schema.json +49 -0
  56. package/docs/pie-schema.json.md +36 -0
  57. package/lib/hotspot/container.js +24 -6
  58. package/lib/hotspot/container.js.map +1 -1
  59. package/lib/hotspot/icons.js.map +1 -1
  60. package/lib/hotspot/image.js.map +1 -1
  61. package/lib/hotspot/index.js +65 -5
  62. package/lib/hotspot/index.js.map +1 -1
  63. package/lib/hotspot/polygon.js +45 -19
  64. package/lib/hotspot/polygon.js.map +1 -1
  65. package/lib/hotspot/rectangle.js +45 -19
  66. package/lib/hotspot/rectangle.js.map +1 -1
  67. package/lib/index.js +3 -0
  68. package/lib/index.js.map +1 -1
  69. package/lib/session-updater.js.map +1 -1
  70. package/package.json +6 -4
  71. package/src/__tests__/__snapshots__/{container-test.jsx.snap → container.test.jsx.snap} +8 -0
  72. package/src/__tests__/__snapshots__/image.test.jsx.snap +43 -0
  73. package/src/__tests__/__snapshots__/{polygon-test.jsx.snap → polygon.test.jsx.snap} +11 -0
  74. package/src/__tests__/__snapshots__/{rectangle-test.jsx.snap → rectangle.test.jsx.snap} +11 -0
  75. package/src/__tests__/container.test.jsx +214 -0
  76. package/src/__tests__/{image-test.jsx → image.test.jsx} +2 -2
  77. package/src/__tests__/polygon.test.jsx +235 -0
  78. package/src/__tests__/rectangle.test.jsx +237 -0
  79. package/src/__tests__/{session-updater-test.jsx → session-updater.test.jsx} +22 -31
  80. package/src/hotspot/container.jsx +40 -23
  81. package/src/hotspot/icons.js +4 -2
  82. package/src/hotspot/image.jsx +4 -8
  83. package/src/hotspot/index.jsx +73 -33
  84. package/src/hotspot/polygon.jsx +48 -30
  85. package/src/hotspot/rectangle.jsx +48 -30
  86. package/src/index.js +10 -18
  87. package/src/session-updater.js +1 -1
  88. package/src/__tests__/__snapshots__/image-test.jsx.snap +0 -21
  89. package/src/__tests__/container-test.jsx +0 -143
  90. package/src/__tests__/polygon-test.jsx +0 -77
  91. package/src/__tests__/rectangle-test.jsx +0 -78
@@ -8,6 +8,8 @@ exports[`Rectangle snapshots evaluate with correct answer renders 1`] = `
8
8
  }
9
9
  }
10
10
  disabled={false}
11
+ evaluateText="Correctly
12
+ selected"
11
13
  height={200}
12
14
  hotspotColor="rgba(137, 183, 244, 0.65)"
13
15
  id="1"
@@ -15,6 +17,7 @@ exports[`Rectangle snapshots evaluate with correct answer renders 1`] = `
15
17
  isEvaluateMode={true}
16
18
  onClick={[MockFunction]}
17
19
  outlineColor="blue"
20
+ scale={1}
18
21
  selected={false}
19
22
  strokeWidth={5}
20
23
  width={300}
@@ -31,6 +34,7 @@ exports[`Rectangle snapshots hotspot color renders 1`] = `
31
34
  }
32
35
  }
33
36
  disabled={false}
37
+ evaluateText={null}
34
38
  height={200}
35
39
  hotspotColor="rgba(217, 30, 24, 0.65)"
36
40
  id="1"
@@ -38,6 +42,7 @@ exports[`Rectangle snapshots hotspot color renders 1`] = `
38
42
  isEvaluateMode={false}
39
43
  onClick={[MockFunction]}
40
44
  outlineColor="blue"
45
+ scale={1}
41
46
  selected={false}
42
47
  strokeWidth={5}
43
48
  width={300}
@@ -54,6 +59,7 @@ exports[`Rectangle snapshots outline color renders 1`] = `
54
59
  }
55
60
  }
56
61
  disabled={false}
62
+ evaluateText={null}
57
63
  height={200}
58
64
  hotspotColor="rgba(137, 183, 244, 0.65)"
59
65
  id="1"
@@ -61,6 +67,7 @@ exports[`Rectangle snapshots outline color renders 1`] = `
61
67
  isEvaluateMode={false}
62
68
  onClick={[MockFunction]}
63
69
  outlineColor="red"
70
+ scale={1}
64
71
  selected={false}
65
72
  strokeWidth={5}
66
73
  width={300}
@@ -77,6 +84,7 @@ exports[`Rectangle snapshots outline width renders with default border width 1`]
77
84
  }
78
85
  }
79
86
  disabled={false}
87
+ evaluateText={null}
80
88
  height={200}
81
89
  hotspotColor="rgba(137, 183, 244, 0.65)"
82
90
  id="1"
@@ -84,6 +92,7 @@ exports[`Rectangle snapshots outline width renders with default border width 1`]
84
92
  isEvaluateMode={false}
85
93
  onClick={[MockFunction]}
86
94
  outlineColor="blue"
95
+ scale={1}
87
96
  selected={false}
88
97
  strokeWidth={5}
89
98
  width={300}
@@ -100,6 +109,7 @@ exports[`Rectangle snapshots outline width renders with given border width 1`] =
100
109
  }
101
110
  }
102
111
  disabled={false}
112
+ evaluateText={null}
103
113
  height={200}
104
114
  hotspotColor="rgba(137, 183, 244, 0.65)"
105
115
  id="1"
@@ -107,6 +117,7 @@ exports[`Rectangle snapshots outline width renders with given border width 1`] =
107
117
  isEvaluateMode={false}
108
118
  onClick={[MockFunction]}
109
119
  outlineColor="blue"
120
+ scale={1}
110
121
  selected={false}
111
122
  strokeWidth={10}
112
123
  width={300}
@@ -0,0 +1,214 @@
1
+ import React from 'react';
2
+ import _ from 'lodash';
3
+ import { shallow } from 'enzyme';
4
+ import toJson from 'enzyme-to-json';
5
+ import Konva from 'konva';
6
+
7
+ import { shallowChild } from '@pie-lib/test-utils';
8
+ import CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';
9
+
10
+ import Container, { Container as ContainerComp } from '../hotspot/container';
11
+ import HotspotComponent from '../hotspot/index';
12
+
13
+ global.MutationObserver = class {
14
+ constructor(callback) {}
15
+ disconnect() {}
16
+ observe(element, initObject) {}
17
+ };
18
+
19
+ Konva.isBrowser = false;
20
+
21
+ describe('HotspotComponent', () => {
22
+ describe('renders', () => {
23
+ let wrapper;
24
+
25
+ beforeEach(() => {
26
+ wrapper = (props) => shallow(<HotspotComponent {...props} />);
27
+ });
28
+
29
+ it('snapshot', () => {
30
+ let w = wrapper();
31
+
32
+ expect(w).toMatchSnapshot();
33
+ });
34
+
35
+ it('snapshot with rationale', () => {
36
+ let w = wrapper({ rationale: 'This is rationale' });
37
+
38
+ expect(w).toMatchSnapshot();
39
+ });
40
+
41
+ it('snapshot with padding having a size accordingly to strokeWidth', () => {
42
+ let w = shallow(
43
+ <ContainerComp
44
+ strokeWidth={50}
45
+ classes={{}}
46
+ dimensions={{ width: 100, height: 100 }}
47
+ onSelectChoice={jest.fn()}
48
+ disabled={false}
49
+ hotspotColor="#000"
50
+ outlineColor="#FAFAFA"
51
+ imageUrl="data:image/jpeg;base64,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"
52
+ isEvaluateMode={false}
53
+ session={{ answers: [{ id: '1' }, { id: '2' }] }}
54
+ shapes={{
55
+ rectangles: [
56
+ {
57
+ id: '1',
58
+ correct: true,
59
+ x: 0,
60
+ y: 0,
61
+ width: 80,
62
+ height: 80,
63
+ },
64
+ ],
65
+ polygons: [],
66
+ }}
67
+ />,
68
+ );
69
+
70
+ expect(w).toMatchSnapshot();
71
+ });
72
+ });
73
+ });
74
+
75
+ describe('CorrectAnswerToggle', () => {
76
+ let testWrapper, component, toggle;
77
+ const model = {
78
+ mode: 'evaluate',
79
+ responseCorrect: false,
80
+ };
81
+ const testWrapperFn = (props) =>
82
+ shallowChild(
83
+ HotspotComponent,
84
+ {
85
+ model: {
86
+ ...model,
87
+ ...props,
88
+ },
89
+ },
90
+ 1,
91
+ );
92
+
93
+ beforeEach(() => {
94
+ testWrapper = testWrapperFn({});
95
+ component = testWrapper();
96
+ toggle = component.find(CorrectAnswerToggle);
97
+ });
98
+
99
+ it('renders when the mode is evaluate and the response is incorrect', () => {
100
+ expect(toggle.length).toEqual(1);
101
+ expect(toggle.prop('show')).toEqual(true);
102
+ });
103
+
104
+ it('does not render outside of evaluate mode', () => {
105
+ const tw = testWrapperFn({ mode: 'gather' });
106
+ const c = tw();
107
+ const t = c.find(CorrectAnswerToggle);
108
+ expect(t.length).toEqual(0);
109
+ });
110
+
111
+ it('does not render if the response is correct', () => {
112
+ const tw = testWrapperFn({ responseCorrect: true });
113
+ const c = tw();
114
+ const t = c.find(CorrectAnswerToggle);
115
+ expect(t.length).toEqual(0);
116
+ });
117
+
118
+ it('toggles the state', () => {
119
+ component.setState({ showCorrect: false });
120
+ expect(component.state('showCorrect')).toEqual(false);
121
+ expect(toggle.prop('toggled')).toEqual(false);
122
+ component.instance().onToggle();
123
+ expect(component.state('showCorrect')).toEqual(true);
124
+ expect(component.find(CorrectAnswerToggle).prop('toggled')).toEqual(true);
125
+ });
126
+ });
127
+
128
+ describe('Container', () => {
129
+ let onSelectChoice, wrapper;
130
+
131
+ const mkWrapper = (opts = {}) => {
132
+ opts = _.extend(
133
+ {
134
+ classes: {
135
+ base: 'base',
136
+ },
137
+ dimensions: {
138
+ height: 0,
139
+ width: 0,
140
+ },
141
+ disabled: false,
142
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
143
+ imageUrl: '',
144
+ isEvaluateMode: false,
145
+ outlineColor: 'blue',
146
+ session: { answers: [] },
147
+ shapes: {
148
+ rectangles: [],
149
+ polygons: [],
150
+ },
151
+ },
152
+ opts,
153
+ );
154
+
155
+ return shallow(<Container {...opts} onSelectChoice={onSelectChoice} />);
156
+ };
157
+
158
+ beforeEach(() => {
159
+ onSelectChoice = jest.fn();
160
+ wrapper = mkWrapper();
161
+ });
162
+
163
+ describe('snapshots', () => {
164
+ describe('outline color', () => {
165
+ it('renders', () => {
166
+ const wrapper = mkWrapper({ outlineColor: 'red' });
167
+ expect(toJson(wrapper)).toMatchSnapshot();
168
+ });
169
+ });
170
+
171
+ describe('hotspot color', () => {
172
+ it('renders', () => {
173
+ const wrapper = mkWrapper({ hotspotColor: 'rgba(217, 30, 24, 0.65)' });
174
+ expect(toJson(wrapper)).toMatchSnapshot();
175
+ });
176
+ });
177
+
178
+ describe('image', () => {
179
+ it('renders', () => {
180
+ const wrapper = mkWrapper({ imageUrl: 'https://picsum.photos/id/102/200/300' });
181
+ expect(toJson(wrapper)).toMatchSnapshot();
182
+ });
183
+ });
184
+
185
+ describe('shapes', () => {
186
+ it('renders', () => {
187
+ const wrapper = mkWrapper({
188
+ shapes: {
189
+ rectangles: [
190
+ { id: '1', x: 5, y: 5, width: 5, height: 5 },
191
+ { id: '2', x: 25, y: 25, width: 5, height: 5 },
192
+ ],
193
+ polygons: [
194
+ {
195
+ id: '3',
196
+ points: [
197
+ { x: 94, y: 4 },
198
+ { x: 89, y: 4 },
199
+ { x: 36, y: 40 },
200
+ ],
201
+ },
202
+ ],
203
+ },
204
+ imageUrl: 'https://picsum.photos/id/102/200/300',
205
+ dimensions: {
206
+ width: 200,
207
+ height: 300,
208
+ },
209
+ });
210
+ expect(toJson(wrapper)).toMatchSnapshot();
211
+ });
212
+ });
213
+ });
214
+ });
@@ -17,9 +17,9 @@ describe('Image', () => {
17
17
  x: 5,
18
18
  y: 5,
19
19
  src: '',
20
- tooltip: null
20
+ tooltip: null,
21
21
  },
22
- opts
22
+ opts,
23
23
  );
24
24
 
25
25
  return shallow(<Image {...opts} />);
@@ -0,0 +1,235 @@
1
+ import React from 'react';
2
+ import _ from 'lodash';
3
+ import { shallow } from 'enzyme';
4
+ import toJson from 'enzyme-to-json';
5
+ import Konva from 'konva';
6
+ import { Line } from 'react-konva';
7
+
8
+ import { shallowChild } from '@pie-lib/test-utils';
9
+
10
+ import Polygon from '../hotspot/polygon';
11
+ import Image from '../hotspot/image';
12
+ import { faCorrect, faWrong } from '../hotspot/icons';
13
+
14
+ Konva.isBrowser = false;
15
+
16
+ describe('Polygon', () => {
17
+ let onClick, wrapper;
18
+
19
+ const mkWrapper = (opts = {}) => {
20
+ opts = _.extend(
21
+ {
22
+ classes: {
23
+ base: 'base',
24
+ },
25
+ height: 200,
26
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
27
+ id: '1',
28
+ isCorrect: false,
29
+ isEvaluateMode: false,
30
+ evaluateText: null,
31
+ disabled: false,
32
+ outlineColor: 'blue',
33
+ selected: false,
34
+ points: [
35
+ { x: 94, y: 4 },
36
+ { x: 89, y: 4 },
37
+ { x: 36, y: 40 },
38
+ ],
39
+ },
40
+ opts,
41
+ );
42
+
43
+ return shallow(<Polygon {...opts} onClick={onClick} />);
44
+ };
45
+
46
+ beforeEach(() => {
47
+ onClick = jest.fn();
48
+ wrapper = mkWrapper();
49
+ });
50
+
51
+ describe('snapshots', () => {
52
+ describe('outline color', () => {
53
+ it('renders', () => {
54
+ const wrapper = mkWrapper({ outlineColor: 'red' });
55
+ expect(toJson(wrapper)).toMatchSnapshot();
56
+ });
57
+ });
58
+
59
+ describe('outline width', () => {
60
+ it('renders with default border width', () => {
61
+ const wrapper = mkWrapper();
62
+ expect(toJson(wrapper)).toMatchSnapshot();
63
+ });
64
+
65
+ it('renders with given border width', () => {
66
+ const wrapper = mkWrapper({ strokeWidth: 10 });
67
+ expect(toJson(wrapper)).toMatchSnapshot();
68
+ });
69
+ });
70
+
71
+ describe('hotspot color', () => {
72
+ it('renders', () => {
73
+ const wrapper = mkWrapper({ hotspotColor: 'rgba(217, 30, 24, 0.65)' });
74
+ expect(toJson(wrapper)).toMatchSnapshot();
75
+ });
76
+ });
77
+
78
+ describe('evaluate with correct answer', () => {
79
+ it('renders', () => {
80
+ const wrapper = mkWrapper({ isEvaluateMode: true, isCorrect: true, evaluateText: 'Correctly\nselected' });
81
+ expect(toJson(wrapper)).toMatchSnapshot();
82
+ });
83
+ });
84
+ });
85
+
86
+ describe('in evaluate mode', () => {
87
+ const defaultModel = {
88
+ height: 200,
89
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
90
+ id: '1',
91
+ isCorrect: false,
92
+ isEvaluateMode: true,
93
+ evaluateText: null,
94
+ disabled: true,
95
+ outlineColor: 'blue',
96
+ strokeWidth: 5,
97
+ selected: false,
98
+ points: [
99
+ { x: 94, y: 4 },
100
+ { x: 89, y: 4 },
101
+ { x: 36, y: 40 },
102
+ ],
103
+ markAsCorrect: false,
104
+ showCorrectEnabled: false,
105
+ onClick,
106
+ };
107
+
108
+ const getComponents = (model) => {
109
+ const testWrapper = shallowChild(
110
+ Polygon,
111
+ {
112
+ ...defaultModel,
113
+ ...model,
114
+ },
115
+ 1,
116
+ );
117
+ const polygonComponent = testWrapper();
118
+ const lineComponent = polygonComponent.find(Line);
119
+ return {
120
+ polygonComponent,
121
+ lineComponent,
122
+ };
123
+ };
124
+
125
+ describe('when correctly selected', () => {
126
+ const { polygonComponent, lineComponent } = getComponents({
127
+ selected: true,
128
+ isCorrect: true,
129
+ });
130
+
131
+ it('should have a blue outline', () => {
132
+ expect(lineComponent.prop('stroke')).toEqual('blue');
133
+ expect(lineComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
134
+ });
135
+
136
+ it('should have a green checkmark icon', () => {
137
+ const imgComponent = polygonComponent.find(Image);
138
+ expect(imgComponent.length).toEqual(1);
139
+ expect(imgComponent.prop('src')).toEqual(faCorrect);
140
+ });
141
+ });
142
+
143
+ describe('when correctly not selected', () => {
144
+ const { polygonComponent, lineComponent } = getComponents({
145
+ selected: false,
146
+ isCorrect: true,
147
+ });
148
+
149
+ it('should have no outline', () => {
150
+ expect(lineComponent.prop('strokeWidth')).toEqual(0);
151
+ });
152
+
153
+ it('should have no icon', () => {
154
+ const imgComponent = polygonComponent.find(Image);
155
+ expect(imgComponent.length).toEqual(0);
156
+ });
157
+ });
158
+
159
+ describe('when incorrectly selected', () => {
160
+ const { polygonComponent, lineComponent } = getComponents({
161
+ selected: true,
162
+ isCorrect: false,
163
+ });
164
+
165
+ it('should have a red outline', () => {
166
+ expect(lineComponent.prop('stroke')).toEqual('red');
167
+ expect(lineComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
168
+ });
169
+
170
+ it('should have a red x icon', () => {
171
+ const imgComponent = polygonComponent.find(Image);
172
+ expect(imgComponent.length).toEqual(1);
173
+ expect(imgComponent.prop('src')).toEqual(faWrong);
174
+ });
175
+ });
176
+
177
+ describe('when incorrectly not selected', () => {
178
+ const { polygonComponent, lineComponent } = getComponents({
179
+ selected: false,
180
+ isCorrect: false,
181
+ });
182
+
183
+ it('should have no outline', () => {
184
+ expect(lineComponent.prop('strokeWidth')).toEqual(0);
185
+ });
186
+
187
+ it('should have a red x icon', () => {
188
+ const imgComponent = polygonComponent.find(Image);
189
+ expect(imgComponent.length).toEqual(1);
190
+ expect(imgComponent.prop('src')).toEqual(faWrong);
191
+ });
192
+ });
193
+
194
+ describe('when showing correct answer (showCorrectEnabled = true)', () => {
195
+ it('should have a green outline', () => {
196
+ const { lineComponent } = getComponents({
197
+ showCorrectEnabled: true,
198
+ markAsCorrect: true,
199
+ });
200
+ expect(lineComponent.prop('stroke')).toEqual('green');
201
+ expect(lineComponent.prop('strokeWidth')).toEqual(defaultModel.strokeWidth);
202
+ });
203
+
204
+ it('should have a green checkmark icon', () => {
205
+ const { polygonComponent } = getComponents({
206
+ showCorrectEnabled: true,
207
+ markAsCorrect: true,
208
+ });
209
+ const imgComponent = polygonComponent.find(Image);
210
+ expect(imgComponent.prop('src')).toEqual(faCorrect);
211
+ });
212
+
213
+ it('should not be selected if the answer is incorrect', () => {
214
+ const { lineComponent } = getComponents({
215
+ showCorrectEnabled: true,
216
+ markAsCorrect: false,
217
+ selected: true,
218
+ isCorrect: false,
219
+ });
220
+ expect(lineComponent.prop('strokeWidth')).toEqual(0);
221
+ });
222
+
223
+ it('should not render an icon if the answer is incorrect', () => {
224
+ const { polygonComponent } = getComponents({
225
+ showCorrectEnabled: true,
226
+ markAsCorrect: false,
227
+ selected: true,
228
+ isCorrect: false,
229
+ });
230
+ const imgComponent = polygonComponent.find(Image);
231
+ expect(imgComponent.length).toEqual(0);
232
+ });
233
+ });
234
+ });
235
+ });