@pie-element/multiple-choice 13.4.0-beta.0 → 13.4.0-next.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/author.js +2 -0
- package/configure.js +2 -0
- package/controller.js +1 -0
- package/dist/author/defaults.d.ts +205 -0
- package/dist/author/defaults.js +151 -0
- package/dist/author/index.d.ts +26 -0
- package/dist/author/index.js +119 -0
- package/dist/author/main.d.ts +34 -0
- package/dist/author/main.js +287 -0
- package/dist/author/utils.d.ts +9 -0
- package/dist/author/utils.js +7 -0
- package/dist/browser/Radio-B-Cd30zs.js +9592 -0
- package/dist/browser/Radio-B-Cd30zs.js.map +1 -0
- package/dist/browser/author/index.js +35031 -0
- package/dist/browser/author/index.js.map +1 -0
- package/dist/browser/controller/index.js +204 -0
- package/dist/browser/controller/index.js.map +1 -0
- package/dist/browser/delivery/index.js +303 -0
- package/dist/browser/delivery/index.js.map +1 -0
- package/dist/browser/dist-CHbLnyuX.js +111 -0
- package/dist/browser/dist-CHbLnyuX.js.map +1 -0
- package/dist/browser/main-DoiD4nKm.js +2553 -0
- package/dist/browser/main-DoiD4nKm.js.map +1 -0
- package/dist/browser/multiple-choice.css +2 -0
- package/dist/browser/print/index.js +43 -0
- package/dist/browser/print/index.js.map +1 -0
- package/dist/controller/defaults.d.ts +35 -0
- package/dist/controller/defaults.js +29 -0
- package/dist/controller/index.d.ts +65 -0
- package/dist/controller/index.js +129 -0
- package/dist/controller/utils.d.ts +10 -0
- package/dist/controller/utils.js +8 -0
- package/dist/delivery/choice-input.d.ts +44 -0
- package/dist/delivery/choice-input.js +280 -0
- package/dist/delivery/choice.d.ts +20 -0
- package/dist/delivery/choice.js +106 -0
- package/dist/delivery/feedback-tick.d.ts +20 -0
- package/dist/delivery/feedback-tick.js +104 -0
- package/dist/delivery/index.d.ts +37 -0
- package/dist/delivery/index.js +217 -0
- package/dist/delivery/main.d.ts +31 -0
- package/dist/delivery/main.js +51 -0
- package/dist/delivery/multiple-choice.d.ts +61 -0
- package/dist/delivery/multiple-choice.js +245 -0
- package/dist/delivery/session-updater.d.ts +10 -0
- package/dist/delivery/session-updater.js +9 -0
- package/dist/delivery/utils.d.ts +10 -0
- package/dist/delivery/utils.js +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.iife.d.ts +8 -0
- package/dist/index.iife.js +148 -0
- package/dist/index.js +2 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +16 -0
- package/dist/print/index.d.ts +15 -0
- package/dist/print/index.js +43 -0
- package/dist/runtime-support.d.ts +12 -0
- package/dist/runtime-support.js +12 -0
- package/module/print.js +18058 -1
- package/module/print.js.map +1 -0
- package/package.json +95 -28
- package/print.js +2 -0
- package/CHANGELOG.json +0 -1972
- package/CHANGELOG.md +0 -2741
- package/LICENSE.md +0 -5
- package/PRINT.md +0 -35
- package/README.md +0 -56
- package/choice.png +0 -0
- package/configure/CHANGELOG.json +0 -1387
- package/configure/CHANGELOG.md +0 -2081
- package/configure/lib/__tests__/root.test.js +0 -279
- package/configure/lib/defaults.js +0 -203
- package/configure/lib/defaults.js.map +0 -1
- package/configure/lib/index.js +0 -203
- package/configure/lib/index.js.map +0 -1
- package/configure/lib/main.js +0 -484
- package/configure/lib/main.js.map +0 -1
- package/configure/lib/utils.js +0 -18
- package/configure/lib/utils.js.map +0 -1
- package/configure/package.json +0 -22
- package/controller/CHANGELOG.json +0 -527
- package/controller/CHANGELOG.md +0 -1412
- package/controller/lib/__tests__/index.test.js +0 -561
- package/controller/lib/__tests__/utils.test.js +0 -8
- package/controller/lib/defaults.js +0 -33
- package/controller/lib/defaults.js.map +0 -1
- package/controller/lib/index.js +0 -298
- package/controller/lib/index.js.map +0 -1
- package/controller/lib/utils.js +0 -15
- package/controller/lib/utils.js.map +0 -1
- package/controller/package.json +0 -15
- package/docs/config-schema.json +0 -2993
- package/docs/config-schema.json.md +0 -2217
- package/docs/demo/config.js +0 -8
- package/docs/demo/generate.js +0 -61
- package/docs/demo/index.html +0 -1
- package/docs/demo/pie.manifest.json +0 -11
- package/docs/demo/session.js +0 -7
- package/docs/pie-schema.json +0 -1332
- package/docs/pie-schema.json.md +0 -1015
- package/lib/__tests__/choice-input-test.js +0 -49
- package/lib/__tests__/choice-input.test.js +0 -49
- package/lib/__tests__/index-test.js +0 -206
- package/lib/__tests__/index.test.js +0 -221
- package/lib/__tests__/key-events-test.js +0 -95
- package/lib/__tests__/key-events.test.js +0 -107
- package/lib/__tests__/multiple-choice-test.js +0 -101
- package/lib/__tests__/multiple-choice.test.js +0 -256
- package/lib/__tests__/session-updater-test.js +0 -70
- package/lib/__tests__/session-updater.test.js +0 -70
- package/lib/choice-input.js +0 -383
- package/lib/choice-input.js.map +0 -1
- package/lib/choice.js +0 -192
- package/lib/choice.js.map +0 -1
- package/lib/feedback-tick.js +0 -134
- package/lib/feedback-tick.js.map +0 -1
- package/lib/index.js +0 -405
- package/lib/index.js.map +0 -1
- package/lib/main.js +0 -63
- package/lib/main.js.map +0 -1
- package/lib/multiple-choice.js +0 -399
- package/lib/multiple-choice.js.map +0 -1
- package/lib/print.js +0 -94
- package/lib/print.js.map +0 -1
- package/lib/session-updater.js +0 -37
- package/lib/session-updater.js.map +0 -1
- package/lib/utils.js +0 -14
- package/lib/utils.js.map +0 -1
- package/module/configure.js +0 -1
- package/module/controller.js +0 -3045
- package/module/demo.js +0 -86
- package/module/element.js +0 -1
- package/module/index.html +0 -21
- package/module/manifest.json +0 -14
- package/module/print-demo.js +0 -124
- package/module/print.html +0 -18
package/configure/lib/main.js
DELETED
|
@@ -1,484 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.default = exports.Main = void 0;
|
|
8
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
-
var _react = _interopRequireDefault(require("react"));
|
|
11
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
12
|
-
var _styles = require("@mui/material/styles");
|
|
13
|
-
var _editableHtmlTipTap = _interopRequireDefault(require("@pie-lib/editable-html-tip-tap"));
|
|
14
|
-
var _configUi = require("@pie-lib/config-ui");
|
|
15
|
-
var _renderUi = require("@pie-lib/render-ui");
|
|
16
|
-
var _Button = _interopRequireDefault(require("@mui/material/Button"));
|
|
17
|
-
var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
|
|
18
|
-
var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
|
|
19
|
-
var _Box = _interopRequireDefault(require("@mui/material/Box"));
|
|
20
|
-
var _Info = _interopRequireDefault(require("@mui/icons-material/Info"));
|
|
21
|
-
var _lodashEs = require("lodash-es");
|
|
22
|
-
var _utils = require("./utils");
|
|
23
|
-
const {
|
|
24
|
-
Panel,
|
|
25
|
-
toggle,
|
|
26
|
-
radio,
|
|
27
|
-
dropdown
|
|
28
|
-
} = _configUi.settings;
|
|
29
|
-
const MAX_CHOICES = 9;
|
|
30
|
-
const PromptHolder = (0, _styles.styled)(_configUi.InputContainer)(({
|
|
31
|
-
theme
|
|
32
|
-
}) => ({
|
|
33
|
-
width: '100%',
|
|
34
|
-
paddingTop: theme.spacing(2),
|
|
35
|
-
marginBottom: theme.spacing(2)
|
|
36
|
-
}));
|
|
37
|
-
const RationaleHolder = (0, _styles.styled)(_configUi.InputContainer)(({
|
|
38
|
-
theme
|
|
39
|
-
}) => ({
|
|
40
|
-
flex: 1,
|
|
41
|
-
marginTop: theme.spacing(1.5),
|
|
42
|
-
paddingTop: theme.spacing(2),
|
|
43
|
-
marginLeft: theme.spacing(3.5)
|
|
44
|
-
}));
|
|
45
|
-
const ChoiceConfigurationHolder = (0, _styles.styled)(_configUi.InputContainer)(({
|
|
46
|
-
theme
|
|
47
|
-
}) => ({
|
|
48
|
-
display: 'flex',
|
|
49
|
-
flexDirection: 'column',
|
|
50
|
-
marginBottom: theme.spacing(1),
|
|
51
|
-
width: '100%'
|
|
52
|
-
}));
|
|
53
|
-
const AddButton = (0, _styles.styled)(_Button.default)(({
|
|
54
|
-
theme
|
|
55
|
-
}) => ({
|
|
56
|
-
marginTop: theme.spacing(1),
|
|
57
|
-
float: 'right'
|
|
58
|
-
}));
|
|
59
|
-
const DisableButton = (0, _styles.styled)(AddButton)({
|
|
60
|
-
cursor: 'not-allowed',
|
|
61
|
-
pointerEvents: 'all',
|
|
62
|
-
backgroundColor: _renderUi.color.disabled(),
|
|
63
|
-
'&:hover': {
|
|
64
|
-
backgroundColor: _renderUi.color.disabled()
|
|
65
|
-
},
|
|
66
|
-
'&:focus': {
|
|
67
|
-
backgroundColor: _renderUi.color.disabled()
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
const FlexContainer = (0, _styles.styled)(_Box.default)({
|
|
71
|
-
display: 'flex',
|
|
72
|
-
alignItems: 'center'
|
|
73
|
-
});
|
|
74
|
-
const TitleText = (0, _styles.styled)(_Typography.default)(({
|
|
75
|
-
theme
|
|
76
|
-
}) => ({
|
|
77
|
-
fontSize: theme.typography.fontSize + 2,
|
|
78
|
-
marginRight: theme.spacing(1)
|
|
79
|
-
}));
|
|
80
|
-
const StyledTooltip = (0, _styles.styled)(_Tooltip.default)(({
|
|
81
|
-
theme
|
|
82
|
-
}) => ({
|
|
83
|
-
'& .MuiTooltip-tooltip': {
|
|
84
|
-
fontSize: theme.typography.fontSize - 2,
|
|
85
|
-
whiteSpace: 'pre',
|
|
86
|
-
maxWidth: '500px'
|
|
87
|
-
}
|
|
88
|
-
}));
|
|
89
|
-
const ErrorText = (0, _styles.styled)('div')(({
|
|
90
|
-
theme
|
|
91
|
-
}) => ({
|
|
92
|
-
fontSize: theme.typography.fontSize - 2,
|
|
93
|
-
color: theme.palette.error.main,
|
|
94
|
-
paddingTop: theme.spacing(1)
|
|
95
|
-
}));
|
|
96
|
-
const Design = props => {
|
|
97
|
-
const {
|
|
98
|
-
model,
|
|
99
|
-
configuration,
|
|
100
|
-
onPromptChanged,
|
|
101
|
-
onChoiceChanged,
|
|
102
|
-
onRemoveChoice,
|
|
103
|
-
onAddChoice,
|
|
104
|
-
imageSupport,
|
|
105
|
-
uploadSoundSupport,
|
|
106
|
-
onChangeModel,
|
|
107
|
-
onConfigurationChanged,
|
|
108
|
-
onTeacherInstructionsChanged
|
|
109
|
-
} = props;
|
|
110
|
-
const {
|
|
111
|
-
addChoiceButton = {},
|
|
112
|
-
contentDimensions = {},
|
|
113
|
-
feedback = {},
|
|
114
|
-
deleteChoice = {},
|
|
115
|
-
choiceMode = {},
|
|
116
|
-
choicePrefix = {},
|
|
117
|
-
partialScoring = {},
|
|
118
|
-
lockChoiceOrder = {},
|
|
119
|
-
teacherInstructions = {},
|
|
120
|
-
studentInstructions = {},
|
|
121
|
-
rationale = {},
|
|
122
|
-
scoringType = {},
|
|
123
|
-
sequentialChoiceLabels = {},
|
|
124
|
-
settingsPanelDisabled,
|
|
125
|
-
choicesLayout,
|
|
126
|
-
spellCheck = {},
|
|
127
|
-
gridColumns,
|
|
128
|
-
maxImageWidth = {},
|
|
129
|
-
maxImageHeight = {},
|
|
130
|
-
prompt = {},
|
|
131
|
-
withRubric = {},
|
|
132
|
-
mathMlOptions = {},
|
|
133
|
-
language = {},
|
|
134
|
-
languageChoices = {}
|
|
135
|
-
} = configuration || {};
|
|
136
|
-
let {
|
|
137
|
-
maxAnswerChoices
|
|
138
|
-
} = configuration || {};
|
|
139
|
-
const {
|
|
140
|
-
limitChoicesNumber,
|
|
141
|
-
teacherInstructionsEnabled,
|
|
142
|
-
rationaleEnabled,
|
|
143
|
-
feedbackEnabled,
|
|
144
|
-
promptEnabled,
|
|
145
|
-
spellCheckEnabled,
|
|
146
|
-
choices,
|
|
147
|
-
errors,
|
|
148
|
-
toolbarEditorPosition,
|
|
149
|
-
extraCSSRules
|
|
150
|
-
} = model || {};
|
|
151
|
-
const {
|
|
152
|
-
answerChoices: answerChoicesError,
|
|
153
|
-
choices: choicesErrors,
|
|
154
|
-
correctResponse: correctResponseError,
|
|
155
|
-
prompt: promptError,
|
|
156
|
-
rationale: rationaleErrors,
|
|
157
|
-
teacherInstructions: teacherInstructionsError
|
|
158
|
-
} = errors || {};
|
|
159
|
-
const nrOfColumnsAvailable = choices?.length ? Array.from({
|
|
160
|
-
length: choices.length
|
|
161
|
-
}, (_, i) => `${i + 1}`) : [];
|
|
162
|
-
const {
|
|
163
|
-
baseInputConfiguration = {}
|
|
164
|
-
} = configuration;
|
|
165
|
-
const toolbarOpts = {
|
|
166
|
-
position: toolbarEditorPosition === 'top' ? 'top' : 'bottom'
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
// if old property is used, set maxAnswerChoices to 9
|
|
170
|
-
if (limitChoicesNumber) {
|
|
171
|
-
maxAnswerChoices = MAX_CHOICES;
|
|
172
|
-
}
|
|
173
|
-
const getPluginProps = (props = {}) => ({
|
|
174
|
-
...baseInputConfiguration,
|
|
175
|
-
...props
|
|
176
|
-
});
|
|
177
|
-
const validationMessage = (0, _utils.generateValidationMessage)(configuration);
|
|
178
|
-
const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
|
|
179
|
-
const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
|
|
180
|
-
const addChoiceButtonTooltip = maxAnswerChoices && choices?.length >= maxAnswerChoices ? `Only ${maxAnswerChoices} allowed maximum` : '';
|
|
181
|
-
const panelSettings = {
|
|
182
|
-
choiceMode: choiceMode.settings && radio(choiceMode.label, ['checkbox', 'radio']),
|
|
183
|
-
'sequentialChoiceLabels.enabled': sequentialChoiceLabels.settings && toggle(sequentialChoiceLabels.label, true),
|
|
184
|
-
choicePrefix: choicePrefix.settings && radio(choicePrefix.label, ['numbers', 'letters']),
|
|
185
|
-
partialScoring: partialScoring.settings && toggle(partialScoring.label),
|
|
186
|
-
lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),
|
|
187
|
-
feedbackEnabled: feedback.settings && toggle(feedback.label),
|
|
188
|
-
choicesLayout: choicesLayout.settings && dropdown(choicesLayout.label, ['vertical', 'grid', 'horizontal']),
|
|
189
|
-
gridColumns: choicesLayout.settings && model.choicesLayout === 'grid' && nrOfColumnsAvailable.length > 0 && dropdown(gridColumns.label, nrOfColumnsAvailable),
|
|
190
|
-
'language.enabled': language.settings && toggle(language.label, true),
|
|
191
|
-
language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options)
|
|
192
|
-
};
|
|
193
|
-
const panelProperties = {
|
|
194
|
-
teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
|
|
195
|
-
studentInstructionsEnabled: studentInstructions.settings && toggle(studentInstructions.label),
|
|
196
|
-
promptEnabled: prompt.settings && toggle(prompt.label),
|
|
197
|
-
rationaleEnabled: rationale.settings && toggle(rationale.label),
|
|
198
|
-
spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
|
|
199
|
-
scoringType: scoringType.settings && radio(scoringType.label, ['auto', 'rubric']),
|
|
200
|
-
rubricEnabled: withRubric?.settings && toggle(withRubric?.label)
|
|
201
|
-
};
|
|
202
|
-
return /*#__PURE__*/_react.default.createElement(_configUi.layout.ConfigLayout, {
|
|
203
|
-
dimensions: contentDimensions,
|
|
204
|
-
hideSettings: settingsPanelDisabled,
|
|
205
|
-
extraCSSRules: extraCSSRules,
|
|
206
|
-
classes: {},
|
|
207
|
-
settings: /*#__PURE__*/_react.default.createElement(Panel, {
|
|
208
|
-
model: model,
|
|
209
|
-
onChangeModel: onChangeModel,
|
|
210
|
-
configuration: configuration,
|
|
211
|
-
onChangeConfiguration: onConfigurationChanged,
|
|
212
|
-
groups: {
|
|
213
|
-
Settings: panelSettings,
|
|
214
|
-
Properties: panelProperties
|
|
215
|
-
}
|
|
216
|
-
})
|
|
217
|
-
}, teacherInstructionsEnabled && /*#__PURE__*/_react.default.createElement(PromptHolder, {
|
|
218
|
-
label: teacherInstructions.label
|
|
219
|
-
}, /*#__PURE__*/_react.default.createElement(_editableHtmlTipTap.default, {
|
|
220
|
-
markup: model.teacherInstructions || '',
|
|
221
|
-
onChange: onTeacherInstructionsChanged,
|
|
222
|
-
imageSupport: imageSupport,
|
|
223
|
-
nonEmpty: false,
|
|
224
|
-
disableUnderline: true,
|
|
225
|
-
error: teacherInstructionsError,
|
|
226
|
-
toolbarOpts: toolbarOpts,
|
|
227
|
-
pluginProps: getPluginProps(configuration?.teacherInstructions?.inputConfiguration),
|
|
228
|
-
spellCheck: spellCheckEnabled,
|
|
229
|
-
maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
|
|
230
|
-
maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight,
|
|
231
|
-
uploadSoundSupport: uploadSoundSupport,
|
|
232
|
-
languageCharactersProps: [{
|
|
233
|
-
language: 'spanish'
|
|
234
|
-
}, {
|
|
235
|
-
language: 'special'
|
|
236
|
-
}],
|
|
237
|
-
mathMlOptions: mathMlOptions
|
|
238
|
-
}), teacherInstructionsError && /*#__PURE__*/_react.default.createElement(ErrorText, null, teacherInstructionsError)), promptEnabled && /*#__PURE__*/_react.default.createElement(PromptHolder, {
|
|
239
|
-
label: prompt.label
|
|
240
|
-
}, /*#__PURE__*/_react.default.createElement(_editableHtmlTipTap.default, {
|
|
241
|
-
markup: model.prompt,
|
|
242
|
-
onChange: onPromptChanged,
|
|
243
|
-
imageSupport: imageSupport,
|
|
244
|
-
nonEmpty: false,
|
|
245
|
-
disableUnderline: true,
|
|
246
|
-
error: promptError,
|
|
247
|
-
toolbarOpts: toolbarOpts,
|
|
248
|
-
pluginProps: getPluginProps(configuration?.prompt?.inputConfiguration),
|
|
249
|
-
spellCheck: spellCheckEnabled,
|
|
250
|
-
maxImageWidth: maxImageWidth && maxImageWidth.prompt,
|
|
251
|
-
maxImageHeight: maxImageHeight && maxImageHeight.prompt,
|
|
252
|
-
uploadSoundSupport: uploadSoundSupport,
|
|
253
|
-
languageCharactersProps: [{
|
|
254
|
-
language: 'spanish'
|
|
255
|
-
}, {
|
|
256
|
-
language: 'special'
|
|
257
|
-
}],
|
|
258
|
-
mathMlOptions: mathMlOptions
|
|
259
|
-
}), promptError && /*#__PURE__*/_react.default.createElement(ErrorText, null, promptError)), /*#__PURE__*/_react.default.createElement(FlexContainer, null, /*#__PURE__*/_react.default.createElement(TitleText, {
|
|
260
|
-
component: 'div'
|
|
261
|
-
}, "Choices"), /*#__PURE__*/_react.default.createElement(StyledTooltip, {
|
|
262
|
-
disableFocusListener: true,
|
|
263
|
-
disableTouchListener: true,
|
|
264
|
-
placement: 'right',
|
|
265
|
-
title: validationMessage
|
|
266
|
-
}, /*#__PURE__*/_react.default.createElement(_Info.default, {
|
|
267
|
-
fontSize: 'small',
|
|
268
|
-
color: 'primary'
|
|
269
|
-
}))), choices.map((choice, index) => /*#__PURE__*/_react.default.createElement(ChoiceConfigurationHolder, {
|
|
270
|
-
key: `choice-${index}`
|
|
271
|
-
}, /*#__PURE__*/_react.default.createElement(_configUi.ChoiceConfiguration, {
|
|
272
|
-
key: index,
|
|
273
|
-
index: index + 1,
|
|
274
|
-
useLetterOrdering: model.choicePrefix === 'letters',
|
|
275
|
-
mode: model.choiceMode,
|
|
276
|
-
data: choice,
|
|
277
|
-
defaultFeedback: {},
|
|
278
|
-
imageSupport: imageSupport,
|
|
279
|
-
disableImageAlignmentButtons: true,
|
|
280
|
-
onDelete: () => onRemoveChoice(index),
|
|
281
|
-
onChange: c => onChoiceChanged(index, c),
|
|
282
|
-
allowFeedBack: feedbackEnabled,
|
|
283
|
-
allowDelete: deleteChoice.settings,
|
|
284
|
-
noLabels: true,
|
|
285
|
-
pluginOpts: getPluginProps(configuration?.choices?.inputConfiguration),
|
|
286
|
-
toolbarOpts: toolbarOpts,
|
|
287
|
-
spellCheck: spellCheckEnabled,
|
|
288
|
-
error: choicesErrors?.[choice.value] || null,
|
|
289
|
-
noCorrectAnswerError: correctResponseError,
|
|
290
|
-
maxImageWidth: maxImageWidth && maxImageWidth.choices || defaultImageMaxWidth,
|
|
291
|
-
maxImageHeight: maxImageHeight && maxImageHeight.choices || defaultImageMaxHeight,
|
|
292
|
-
uploadSoundSupport: uploadSoundSupport,
|
|
293
|
-
mathMlOptions: mathMlOptions
|
|
294
|
-
}), rationaleEnabled && /*#__PURE__*/_react.default.createElement(RationaleHolder, {
|
|
295
|
-
key: `rationale-${index}`,
|
|
296
|
-
label: rationale.label
|
|
297
|
-
}, /*#__PURE__*/_react.default.createElement(_editableHtmlTipTap.default, {
|
|
298
|
-
markup: choice.rationale || '',
|
|
299
|
-
onChange: c => onChoiceChanged(index, {
|
|
300
|
-
...choice,
|
|
301
|
-
rationale: c
|
|
302
|
-
}),
|
|
303
|
-
imageSupport: imageSupport,
|
|
304
|
-
error: rationaleErrors?.[choice.value] || null,
|
|
305
|
-
toolbarOpts: toolbarOpts,
|
|
306
|
-
pluginProps: getPluginProps(configuration?.rationale?.inputConfiguration),
|
|
307
|
-
spellCheck: spellCheckEnabled,
|
|
308
|
-
maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
|
|
309
|
-
maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight,
|
|
310
|
-
uploadSoundSupport: uploadSoundSupport,
|
|
311
|
-
languageCharactersProps: [{
|
|
312
|
-
language: 'spanish'
|
|
313
|
-
}, {
|
|
314
|
-
language: 'special'
|
|
315
|
-
}],
|
|
316
|
-
mathMlOptions: mathMlOptions
|
|
317
|
-
}), rationaleErrors?.[choice.value] && /*#__PURE__*/_react.default.createElement(ErrorText, null, rationaleErrors?.[choice.value])))), correctResponseError && /*#__PURE__*/_react.default.createElement(ErrorText, null, correctResponseError), answerChoicesError && /*#__PURE__*/_react.default.createElement(ErrorText, null, answerChoicesError), addChoiceButton.settings && /*#__PURE__*/_react.default.createElement(StyledTooltip, {
|
|
318
|
-
title: addChoiceButtonTooltip
|
|
319
|
-
}, maxAnswerChoices && choices?.length >= maxAnswerChoices ? /*#__PURE__*/_react.default.createElement(DisableButton, {
|
|
320
|
-
variant: "contained",
|
|
321
|
-
color: "primary",
|
|
322
|
-
onClick: onAddChoice,
|
|
323
|
-
disabled: true
|
|
324
|
-
}, addChoiceButton.label) : /*#__PURE__*/_react.default.createElement(AddButton, {
|
|
325
|
-
variant: "contained",
|
|
326
|
-
color: "primary",
|
|
327
|
-
onClick: onAddChoice
|
|
328
|
-
}, addChoiceButton.label)));
|
|
329
|
-
};
|
|
330
|
-
class Main extends _react.default.Component {
|
|
331
|
-
constructor(...args) {
|
|
332
|
-
super(...args);
|
|
333
|
-
(0, _defineProperty2.default)(this, "state", {
|
|
334
|
-
showWarning: false
|
|
335
|
-
});
|
|
336
|
-
(0, _defineProperty2.default)(this, "onRemoveChoice", index => {
|
|
337
|
-
const {
|
|
338
|
-
model,
|
|
339
|
-
configuration,
|
|
340
|
-
onModelChanged
|
|
341
|
-
} = this.props;
|
|
342
|
-
const {
|
|
343
|
-
minAnswerChoices
|
|
344
|
-
} = configuration || {};
|
|
345
|
-
if (minAnswerChoices && model.choices.length === minAnswerChoices) {
|
|
346
|
-
this.setState({
|
|
347
|
-
showWarning: true
|
|
348
|
-
});
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
model.choices.splice(index, 1);
|
|
352
|
-
onModelChanged({
|
|
353
|
-
choices: model.choices
|
|
354
|
-
});
|
|
355
|
-
});
|
|
356
|
-
(0, _defineProperty2.default)(this, "onAddChoice", () => {
|
|
357
|
-
const {
|
|
358
|
-
model,
|
|
359
|
-
configuration,
|
|
360
|
-
onModelChanged
|
|
361
|
-
} = this.props;
|
|
362
|
-
let {
|
|
363
|
-
maxAnswerChoices
|
|
364
|
-
} = configuration || {};
|
|
365
|
-
const {
|
|
366
|
-
limitChoicesNumber
|
|
367
|
-
} = model || {};
|
|
368
|
-
|
|
369
|
-
// if old property is used, set maxAnswerChoices to 9
|
|
370
|
-
if (limitChoicesNumber) {
|
|
371
|
-
maxAnswerChoices = MAX_CHOICES;
|
|
372
|
-
}
|
|
373
|
-
if (maxAnswerChoices && model.choices.length >= maxAnswerChoices) {
|
|
374
|
-
return;
|
|
375
|
-
}
|
|
376
|
-
model.choices.push({
|
|
377
|
-
label: '',
|
|
378
|
-
value: _configUi.choiceUtils.firstAvailableIndex(model.choices.map(c => c.value), 0),
|
|
379
|
-
feedback: {
|
|
380
|
-
type: 'none'
|
|
381
|
-
}
|
|
382
|
-
});
|
|
383
|
-
onModelChanged({
|
|
384
|
-
choices: model.choices
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
(0, _defineProperty2.default)(this, "onChoiceChanged", (index, choice) => {
|
|
388
|
-
const {
|
|
389
|
-
model,
|
|
390
|
-
onModelChanged
|
|
391
|
-
} = this.props;
|
|
392
|
-
if (choice.correct && model.choiceMode === 'radio') {
|
|
393
|
-
model.choices = model.choices.map(c => (0, _lodashEs.merge)({}, c, {
|
|
394
|
-
correct: false
|
|
395
|
-
}));
|
|
396
|
-
}
|
|
397
|
-
model.choices.splice(index, 1, choice);
|
|
398
|
-
onModelChanged({
|
|
399
|
-
choices: model.choices
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
(0, _defineProperty2.default)(this, "onPromptChanged", prompt => {
|
|
403
|
-
this.props.onModelChanged({
|
|
404
|
-
prompt
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
(0, _defineProperty2.default)(this, "onTeacherInstructionsChanged", teacherInstructions => {
|
|
408
|
-
this.props.onModelChanged({
|
|
409
|
-
teacherInstructions
|
|
410
|
-
});
|
|
411
|
-
});
|
|
412
|
-
(0, _defineProperty2.default)(this, "onModelChanged", (model, key) => {
|
|
413
|
-
const {
|
|
414
|
-
onModelChanged
|
|
415
|
-
} = this.props;
|
|
416
|
-
switch (key) {
|
|
417
|
-
case 'choiceMode':
|
|
418
|
-
{
|
|
419
|
-
let value = model.choiceMode;
|
|
420
|
-
if (value === 'radio') {
|
|
421
|
-
let correctFound = false;
|
|
422
|
-
model.choices = model.choices.map(c => {
|
|
423
|
-
if (correctFound) {
|
|
424
|
-
c.correct = false;
|
|
425
|
-
return c;
|
|
426
|
-
}
|
|
427
|
-
if (c.correct) {
|
|
428
|
-
correctFound = true;
|
|
429
|
-
}
|
|
430
|
-
return c;
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
onModelChanged({
|
|
434
|
-
choiceMode: model.choiceMode,
|
|
435
|
-
choices: model.choices
|
|
436
|
-
}, true);
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
default:
|
|
440
|
-
onModelChanged(model);
|
|
441
|
-
break;
|
|
442
|
-
}
|
|
443
|
-
});
|
|
444
|
-
}
|
|
445
|
-
render() {
|
|
446
|
-
const {
|
|
447
|
-
configuration: {
|
|
448
|
-
minAnswerChoices
|
|
449
|
-
} = {}
|
|
450
|
-
} = this.props;
|
|
451
|
-
const {
|
|
452
|
-
showWarning
|
|
453
|
-
} = this.state;
|
|
454
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_configUi.AlertDialog, {
|
|
455
|
-
open: showWarning,
|
|
456
|
-
title: "Warning",
|
|
457
|
-
text: `There can't be less than ${minAnswerChoices || 0} choices.`,
|
|
458
|
-
onConfirm: () => this.setState({
|
|
459
|
-
showWarning: false
|
|
460
|
-
})
|
|
461
|
-
}), /*#__PURE__*/_react.default.createElement(Design, (0, _extends2.default)({}, this.props, {
|
|
462
|
-
onChangeModel: this.onModelChanged,
|
|
463
|
-
onRemoveChoice: this.onRemoveChoice,
|
|
464
|
-
onChoiceChanged: this.onChoiceChanged,
|
|
465
|
-
onAddChoice: this.onAddChoice,
|
|
466
|
-
onPromptChanged: this.onPromptChanged,
|
|
467
|
-
onTeacherInstructionsChanged: this.onTeacherInstructionsChanged
|
|
468
|
-
})));
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
exports.Main = Main;
|
|
472
|
-
(0, _defineProperty2.default)(Main, "propTypes", {
|
|
473
|
-
model: _propTypes.default.object.isRequired,
|
|
474
|
-
configuration: _propTypes.default.object.isRequired,
|
|
475
|
-
disableSidePanel: _propTypes.default.bool,
|
|
476
|
-
onModelChanged: _propTypes.default.func.isRequired,
|
|
477
|
-
onConfigurationChanged: _propTypes.default.func.isRequired,
|
|
478
|
-
imageSupport: _propTypes.default.shape({
|
|
479
|
-
add: _propTypes.default.func.isRequired,
|
|
480
|
-
delete: _propTypes.default.func.isRequired
|
|
481
|
-
})
|
|
482
|
-
});
|
|
483
|
-
var _default = exports.default = Main;
|
|
484
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfc3R5bGVzIiwiX2VkaXRhYmxlSHRtbFRpcFRhcCIsIl9jb25maWdVaSIsIl9yZW5kZXJVaSIsIl9CdXR0b24iLCJfVG9vbHRpcCIsIl9UeXBvZ3JhcGh5IiwiX0JveCIsIl9JbmZvIiwiX2xvZGFzaEVzIiwiX3V0aWxzIiwiUGFuZWwiLCJ0b2dnbGUiLCJyYWRpbyIsImRyb3Bkb3duIiwic2V0dGluZ3MiLCJNQVhfQ0hPSUNFUyIsIlByb21wdEhvbGRlciIsInN0eWxlZCIsIklucHV0Q29udGFpbmVyIiwidGhlbWUiLCJ3aWR0aCIsInBhZGRpbmdUb3AiLCJzcGFjaW5nIiwibWFyZ2luQm90dG9tIiwiUmF0aW9uYWxlSG9sZGVyIiwiZmxleCIsIm1hcmdpblRvcCIsIm1hcmdpbkxlZnQiLCJDaG9pY2VDb25maWd1cmF0aW9uSG9sZGVyIiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJBZGRCdXR0b24iLCJCdXR0b24iLCJmbG9hdCIsIkRpc2FibGVCdXR0b24iLCJjdXJzb3IiLCJwb2ludGVyRXZlbnRzIiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJkaXNhYmxlZCIsIkZsZXhDb250YWluZXIiLCJCb3giLCJhbGlnbkl0ZW1zIiwiVGl0bGVUZXh0IiwiVHlwb2dyYXBoeSIsImZvbnRTaXplIiwidHlwb2dyYXBoeSIsIm1hcmdpblJpZ2h0IiwiU3R5bGVkVG9vbHRpcCIsIlRvb2x0aXAiLCJ3aGl0ZVNwYWNlIiwibWF4V2lkdGgiLCJFcnJvclRleHQiLCJwYWxldHRlIiwiZXJyb3IiLCJtYWluIiwiRGVzaWduIiwicHJvcHMiLCJtb2RlbCIsImNvbmZpZ3VyYXRpb24iLCJvblByb21wdENoYW5nZWQiLCJvbkNob2ljZUNoYW5nZWQiLCJvblJlbW92ZUNob2ljZSIsIm9uQWRkQ2hvaWNlIiwiaW1hZ2VTdXBwb3J0IiwidXBsb2FkU291bmRTdXBwb3J0Iiwib25DaGFuZ2VNb2RlbCIsIm9uQ29uZmlndXJhdGlvbkNoYW5nZWQiLCJvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkIiwiYWRkQ2hvaWNlQnV0dG9uIiwiY29udGVudERpbWVuc2lvbnMiLCJmZWVkYmFjayIsImRlbGV0ZUNob2ljZSIsImNob2ljZU1vZGUiLCJjaG9pY2VQcmVmaXgiLCJwYXJ0aWFsU2NvcmluZyIsImxvY2tDaG9pY2VPcmRlciIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJzdHVkZW50SW5zdHJ1Y3Rpb25zIiwicmF0aW9uYWxlIiwic2NvcmluZ1R5cGUiLCJzZXF1ZW50aWFsQ2hvaWNlTGFiZWxzIiwic2V0dGluZ3NQYW5lbERpc2FibGVkIiwiY2hvaWNlc0xheW91dCIsInNwZWxsQ2hlY2siLCJncmlkQ29sdW1ucyIsIm1heEltYWdlV2lkdGgiLCJtYXhJbWFnZUhlaWdodCIsInByb21wdCIsIndpdGhSdWJyaWMiLCJtYXRoTWxPcHRpb25zIiwibGFuZ3VhZ2UiLCJsYW5ndWFnZUNob2ljZXMiLCJtYXhBbnN3ZXJDaG9pY2VzIiwibGltaXRDaG9pY2VzTnVtYmVyIiwidGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQiLCJyYXRpb25hbGVFbmFibGVkIiwiZmVlZGJhY2tFbmFibGVkIiwicHJvbXB0RW5hYmxlZCIsInNwZWxsQ2hlY2tFbmFibGVkIiwiY2hvaWNlcyIsImVycm9ycyIsInRvb2xiYXJFZGl0b3JQb3NpdGlvbiIsImV4dHJhQ1NTUnVsZXMiLCJhbnN3ZXJDaG9pY2VzIiwiYW5zd2VyQ2hvaWNlc0Vycm9yIiwiY2hvaWNlc0Vycm9ycyIsImNvcnJlY3RSZXNwb25zZSIsImNvcnJlY3RSZXNwb25zZUVycm9yIiwicHJvbXB0RXJyb3IiLCJyYXRpb25hbGVFcnJvcnMiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zRXJyb3IiLCJuck9mQ29sdW1uc0F2YWlsYWJsZSIsImxlbmd0aCIsIkFycmF5IiwiZnJvbSIsIl8iLCJpIiwiYmFzZUlucHV0Q29uZmlndXJhdGlvbiIsInRvb2xiYXJPcHRzIiwicG9zaXRpb24iLCJnZXRQbHVnaW5Qcm9wcyIsInZhbGlkYXRpb25NZXNzYWdlIiwiZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZSIsImRlZmF1bHRJbWFnZU1heFdpZHRoIiwiZGVmYXVsdEltYWdlTWF4SGVpZ2h0IiwiYWRkQ2hvaWNlQnV0dG9uVG9vbHRpcCIsInBhbmVsU2V0dGluZ3MiLCJsYWJlbCIsImVuYWJsZWQiLCJvcHRpb25zIiwicGFuZWxQcm9wZXJ0aWVzIiwic3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQiLCJydWJyaWNFbmFibGVkIiwiZGVmYXVsdCIsImNyZWF0ZUVsZW1lbnQiLCJsYXlvdXQiLCJDb25maWdMYXlvdXQiLCJkaW1lbnNpb25zIiwiaGlkZVNldHRpbmdzIiwiY2xhc3NlcyIsIm9uQ2hhbmdlQ29uZmlndXJhdGlvbiIsImdyb3VwcyIsIlNldHRpbmdzIiwiUHJvcGVydGllcyIsIm1hcmt1cCIsIm9uQ2hhbmdlIiwibm9uRW1wdHkiLCJkaXNhYmxlVW5kZXJsaW5lIiwicGx1Z2luUHJvcHMiLCJpbnB1dENvbmZpZ3VyYXRpb24iLCJsYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyIsImNvbXBvbmVudCIsImRpc2FibGVGb2N1c0xpc3RlbmVyIiwiZGlzYWJsZVRvdWNoTGlzdGVuZXIiLCJwbGFjZW1lbnQiLCJ0aXRsZSIsIm1hcCIsImNob2ljZSIsImluZGV4Iiwia2V5IiwiQ2hvaWNlQ29uZmlndXJhdGlvbiIsInVzZUxldHRlck9yZGVyaW5nIiwibW9kZSIsImRhdGEiLCJkZWZhdWx0RmVlZGJhY2siLCJkaXNhYmxlSW1hZ2VBbGlnbm1lbnRCdXR0b25zIiwib25EZWxldGUiLCJjIiwiYWxsb3dGZWVkQmFjayIsImFsbG93RGVsZXRlIiwibm9MYWJlbHMiLCJwbHVnaW5PcHRzIiwidmFsdWUiLCJub0NvcnJlY3RBbnN3ZXJFcnJvciIsInZhcmlhbnQiLCJvbkNsaWNrIiwiTWFpbiIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiX2RlZmluZVByb3BlcnR5MiIsInNob3dXYXJuaW5nIiwib25Nb2RlbENoYW5nZWQiLCJtaW5BbnN3ZXJDaG9pY2VzIiwic2V0U3RhdGUiLCJzcGxpY2UiLCJwdXNoIiwidXRpbHMiLCJmaXJzdEF2YWlsYWJsZUluZGV4IiwidHlwZSIsImNvcnJlY3QiLCJtZXJnZSIsImNvcnJlY3RGb3VuZCIsInJlbmRlciIsInN0YXRlIiwiRnJhZ21lbnQiLCJBbGVydERpYWxvZyIsIm9wZW4iLCJ0ZXh0Iiwib25Db25maXJtIiwiX2V4dGVuZHMyIiwiZXhwb3J0cyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJkaXNhYmxlU2lkZVBhbmVsIiwiYm9vbCIsImZ1bmMiLCJzaGFwZSIsImFkZCIsImRlbGV0ZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL21haW4uanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IEVkaXRhYmxlSHRtbCBmcm9tICdAcGllLWxpYi9lZGl0YWJsZS1odG1sLXRpcC10YXAnO1xuaW1wb3J0IHtcbiAgQWxlcnREaWFsb2csXG4gIElucHV0Q29udGFpbmVyLFxuICBDaG9pY2VDb25maWd1cmF0aW9uLFxuICBzZXR0aW5ncyxcbiAgbGF5b3V0LFxuICBjaG9pY2VVdGlscyBhcyB1dGlscyxcbn0gZnJvbSAnQHBpZS1saWIvY29uZmlnLXVpJztcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnQHBpZS1saWIvcmVuZGVyLXVpJztcbmltcG9ydCBCdXR0b24gZnJvbSAnQG11aS9tYXRlcmlhbC9CdXR0b24nO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnQG11aS9tYXRlcmlhbC9Ub29sdGlwJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJ0BtdWkvbWF0ZXJpYWwvVHlwb2dyYXBoeSc7XG5pbXBvcnQgQm94IGZyb20gJ0BtdWkvbWF0ZXJpYWwvQm94JztcbmltcG9ydCBJbmZvIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvSW5mbyc7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZhbGlkYXRpb25NZXNzYWdlIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IHsgUGFuZWwsIHRvZ2dsZSwgcmFkaW8sIGRyb3Bkb3duIH0gPSBzZXR0aW5ncztcblxuY29uc3QgTUFYX0NIT0lDRVMgPSA5O1xuXG5jb25zdCBQcm9tcHRIb2xkZXIgPSBzdHlsZWQoSW5wdXRDb250YWluZXIpKCh7IHRoZW1lIH0pID0+ICh7XG4gIHdpZHRoOiAnMTAwJScsXG4gIHBhZGRpbmdUb3A6IHRoZW1lLnNwYWNpbmcoMiksXG4gIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZygyKSxcbn0pKTtcblxuY29uc3QgUmF0aW9uYWxlSG9sZGVyID0gc3R5bGVkKElucHV0Q29udGFpbmVyKSgoeyB0aGVtZSB9KSA9PiAoe1xuICBmbGV4OiAxLFxuICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcoMS41KSxcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygyKSxcbiAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygzLjUpLFxufSkpO1xuXG5jb25zdCBDaG9pY2VDb25maWd1cmF0aW9uSG9sZGVyID0gc3R5bGVkKElucHV0Q29udGFpbmVyKSgoeyB0aGVtZSB9KSA9PiAoe1xuICBkaXNwbGF5OiAnZmxleCcsXG4gIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMSksXG4gIHdpZHRoOiAnMTAwJScsXG59KSk7XG5cblxuY29uc3QgQWRkQnV0dG9uID0gc3R5bGVkKEJ1dHRvbikoKHsgdGhlbWUgfSkgPT4gKHtcbiAgbWFyZ2luVG9wOiB0aGVtZS5zcGFjaW5nKDEpLFxuICBmbG9hdDogJ3JpZ2h0Jyxcbn0pKTtcblxuY29uc3QgRGlzYWJsZUJ1dHRvbiA9IHN0eWxlZChBZGRCdXR0b24pKHtcbiAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICBwb2ludGVyRXZlbnRzOiAnYWxsJyxcbiAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5kaXNhYmxlZCgpLFxuICAnJjpob3Zlcic6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLmRpc2FibGVkKCksXG4gIH0sXG4gICcmOmZvY3VzJzoge1xuICAgIGJhY2tncm91bmRDb2xvcjogY29sb3IuZGlzYWJsZWQoKSxcbiAgfSxcbn0pO1xuXG5jb25zdCBGbGV4Q29udGFpbmVyID0gc3R5bGVkKEJveCkoe1xuICBkaXNwbGF5OiAnZmxleCcsXG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxufSk7XG5cbmNvbnN0IFRpdGxlVGV4dCA9IHN0eWxlZChUeXBvZ3JhcGh5KSgoeyB0aGVtZSB9KSA9PiAoe1xuICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5mb250U2l6ZSArIDIsXG4gIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDEpLFxufSkpO1xuXG5jb25zdCBTdHlsZWRUb29sdGlwID0gc3R5bGVkKFRvb2x0aXApKCh7IHRoZW1lIH0pID0+ICh7XG4gICcmIC5NdWlUb29sdGlwLXRvb2x0aXAnOiB7XG4gICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFNpemUgLSAyLFxuICAgIHdoaXRlU3BhY2U6ICdwcmUnLFxuICAgIG1heFdpZHRoOiAnNTAwcHgnLFxuICB9LFxufSkpO1xuXG5jb25zdCBFcnJvclRleHQgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRTaXplIC0gMixcbiAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSxcbn0pKTtcblxuY29uc3QgRGVzaWduID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBtb2RlbCxcbiAgICBjb25maWd1cmF0aW9uLFxuICAgIG9uUHJvbXB0Q2hhbmdlZCxcbiAgICBvbkNob2ljZUNoYW5nZWQsXG4gICAgb25SZW1vdmVDaG9pY2UsXG4gICAgb25BZGRDaG9pY2UsXG4gICAgaW1hZ2VTdXBwb3J0LFxuICAgIHVwbG9hZFNvdW5kU3VwcG9ydCxcbiAgICBvbkNoYW5nZU1vZGVsLFxuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgb25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZCxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBhZGRDaG9pY2VCdXR0b24gPSB7fSxcbiAgICBjb250ZW50RGltZW5zaW9ucyA9IHt9LFxuICAgIGZlZWRiYWNrID0ge30sXG4gICAgZGVsZXRlQ2hvaWNlID0ge30sXG4gICAgY2hvaWNlTW9kZSA9IHt9LFxuICAgIGNob2ljZVByZWZpeCA9IHt9LFxuICAgIHBhcnRpYWxTY29yaW5nID0ge30sXG4gICAgbG9ja0Nob2ljZU9yZGVyID0ge30sXG4gICAgdGVhY2hlckluc3RydWN0aW9ucyA9IHt9LFxuICAgIHN0dWRlbnRJbnN0cnVjdGlvbnMgPSB7fSxcbiAgICByYXRpb25hbGUgPSB7fSxcbiAgICBzY29yaW5nVHlwZSA9IHt9LFxuICAgIHNlcXVlbnRpYWxDaG9pY2VMYWJlbHMgPSB7fSxcbiAgICBzZXR0aW5nc1BhbmVsRGlzYWJsZWQsXG4gICAgY2hvaWNlc0xheW91dCxcbiAgICBzcGVsbENoZWNrID0ge30sXG4gICAgZ3JpZENvbHVtbnMsXG4gICAgbWF4SW1hZ2VXaWR0aCA9IHt9LFxuICAgIG1heEltYWdlSGVpZ2h0ID0ge30sXG4gICAgcHJvbXB0ID0ge30sXG4gICAgd2l0aFJ1YnJpYyA9IHt9LFxuICAgIG1hdGhNbE9wdGlvbnMgPSB7fSxcbiAgICBsYW5ndWFnZSA9IHt9LFxuICAgIGxhbmd1YWdlQ2hvaWNlcyA9IHt9LFxuICB9ID0gY29uZmlndXJhdGlvbiB8fCB7fTtcbiAgbGV0IHsgbWF4QW5zd2VyQ2hvaWNlcyB9ID0gY29uZmlndXJhdGlvbiB8fCB7fTtcbiAgY29uc3Qge1xuICAgIGxpbWl0Q2hvaWNlc051bWJlcixcbiAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCxcbiAgICByYXRpb25hbGVFbmFibGVkLFxuICAgIGZlZWRiYWNrRW5hYmxlZCxcbiAgICBwcm9tcHRFbmFibGVkLFxuICAgIHNwZWxsQ2hlY2tFbmFibGVkLFxuICAgIGNob2ljZXMsXG4gICAgZXJyb3JzLFxuICAgIHRvb2xiYXJFZGl0b3JQb3NpdGlvbixcbiAgICBleHRyYUNTU1J1bGVzLFxuICB9ID0gbW9kZWwgfHwge307XG5cbiAgY29uc3Qge1xuICAgIGFuc3dlckNob2ljZXM6IGFuc3dlckNob2ljZXNFcnJvcixcbiAgICBjaG9pY2VzOiBjaG9pY2VzRXJyb3JzLFxuICAgIGNvcnJlY3RSZXNwb25zZTogY29ycmVjdFJlc3BvbnNlRXJyb3IsXG4gICAgcHJvbXB0OiBwcm9tcHRFcnJvcixcbiAgICByYXRpb25hbGU6IHJhdGlvbmFsZUVycm9ycyxcbiAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiB0ZWFjaGVySW5zdHJ1Y3Rpb25zRXJyb3IsXG4gIH0gPSBlcnJvcnMgfHwge307XG4gIGNvbnN0IG5yT2ZDb2x1bW5zQXZhaWxhYmxlID0gY2hvaWNlcz8ubGVuZ3RoID8gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hvaWNlcy5sZW5ndGggfSwgKF8sIGkpID0+IGAke2kgKyAxfWApIDogW107XG5cbiAgY29uc3QgeyBiYXNlSW5wdXRDb25maWd1cmF0aW9uID0ge30gfSA9IGNvbmZpZ3VyYXRpb247XG4gIGNvbnN0IHRvb2xiYXJPcHRzID0ge1xuICAgIHBvc2l0aW9uOiB0b29sYmFyRWRpdG9yUG9zaXRpb24gPT09ICd0b3AnID8gJ3RvcCcgOiAnYm90dG9tJyxcbiAgfTtcblxuICAvLyBpZiBvbGQgcHJvcGVydHkgaXMgdXNlZCwgc2V0IG1heEFuc3dlckNob2ljZXMgdG8gOVxuICBpZiAobGltaXRDaG9pY2VzTnVtYmVyKSB7XG4gICAgbWF4QW5zd2VyQ2hvaWNlcyA9IE1BWF9DSE9JQ0VTO1xuICB9XG5cbiAgY29uc3QgZ2V0UGx1Z2luUHJvcHMgPSAocHJvcHMgPSB7fSkgPT4gKHtcbiAgICAuLi5iYXNlSW5wdXRDb25maWd1cmF0aW9uLFxuICAgIC4uLnByb3BzLFxuICB9KTtcblxuICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IGdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UoY29uZmlndXJhdGlvbik7XG4gIGNvbnN0IGRlZmF1bHRJbWFnZU1heFdpZHRoID0gbWF4SW1hZ2VXaWR0aCAmJiBtYXhJbWFnZVdpZHRoLnByb21wdDtcbiAgY29uc3QgZGVmYXVsdEltYWdlTWF4SGVpZ2h0ID0gbWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQucHJvbXB0O1xuICBjb25zdCBhZGRDaG9pY2VCdXR0b25Ub29sdGlwID1cbiAgICBtYXhBbnN3ZXJDaG9pY2VzICYmIGNob2ljZXM/Lmxlbmd0aCA+PSBtYXhBbnN3ZXJDaG9pY2VzID8gYE9ubHkgJHttYXhBbnN3ZXJDaG9pY2VzfSBhbGxvd2VkIG1heGltdW1gIDogJyc7XG5cbiAgY29uc3QgcGFuZWxTZXR0aW5ncyA9IHtcbiAgICBjaG9pY2VNb2RlOiBjaG9pY2VNb2RlLnNldHRpbmdzICYmIHJhZGlvKGNob2ljZU1vZGUubGFiZWwsIFsnY2hlY2tib3gnLCAncmFkaW8nXSksXG4gICAgJ3NlcXVlbnRpYWxDaG9pY2VMYWJlbHMuZW5hYmxlZCc6IHNlcXVlbnRpYWxDaG9pY2VMYWJlbHMuc2V0dGluZ3MgJiYgdG9nZ2xlKHNlcXVlbnRpYWxDaG9pY2VMYWJlbHMubGFiZWwsIHRydWUpLFxuICAgIGNob2ljZVByZWZpeDogY2hvaWNlUHJlZml4LnNldHRpbmdzICYmIHJhZGlvKGNob2ljZVByZWZpeC5sYWJlbCwgWydudW1iZXJzJywgJ2xldHRlcnMnXSksXG4gICAgcGFydGlhbFNjb3Jpbmc6IHBhcnRpYWxTY29yaW5nLnNldHRpbmdzICYmIHRvZ2dsZShwYXJ0aWFsU2NvcmluZy5sYWJlbCksXG4gICAgbG9ja0Nob2ljZU9yZGVyOiBsb2NrQ2hvaWNlT3JkZXIuc2V0dGluZ3MgJiYgdG9nZ2xlKGxvY2tDaG9pY2VPcmRlci5sYWJlbCksXG4gICAgZmVlZGJhY2tFbmFibGVkOiBmZWVkYmFjay5zZXR0aW5ncyAmJiB0b2dnbGUoZmVlZGJhY2subGFiZWwpLFxuICAgIGNob2ljZXNMYXlvdXQ6IGNob2ljZXNMYXlvdXQuc2V0dGluZ3MgJiYgZHJvcGRvd24oY2hvaWNlc0xheW91dC5sYWJlbCwgWyd2ZXJ0aWNhbCcsICdncmlkJywgJ2hvcml6b250YWwnXSksXG4gICAgZ3JpZENvbHVtbnM6XG4gICAgICBjaG9pY2VzTGF5b3V0LnNldHRpbmdzICYmXG4gICAgICBtb2RlbC5jaG9pY2VzTGF5b3V0ID09PSAnZ3JpZCcgJiZcbiAgICAgIG5yT2ZDb2x1bW5zQXZhaWxhYmxlLmxlbmd0aCA+IDAgJiZcbiAgICAgIGRyb3Bkb3duKGdyaWRDb2x1bW5zLmxhYmVsLCBuck9mQ29sdW1uc0F2YWlsYWJsZSksXG4gICAgJ2xhbmd1YWdlLmVuYWJsZWQnOiBsYW5ndWFnZS5zZXR0aW5ncyAmJiB0b2dnbGUobGFuZ3VhZ2UubGFiZWwsIHRydWUpLFxuICAgIGxhbmd1YWdlOiBsYW5ndWFnZS5zZXR0aW5ncyAmJiBsYW5ndWFnZS5lbmFibGVkICYmIGRyb3Bkb3duKGxhbmd1YWdlQ2hvaWNlcy5sYWJlbCwgbGFuZ3VhZ2VDaG9pY2VzLm9wdGlvbnMpLFxuICB9O1xuXG4gIGNvbnN0IHBhbmVsUHJvcGVydGllcyA9IHtcbiAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogdGVhY2hlckluc3RydWN0aW9ucy5zZXR0aW5ncyAmJiB0b2dnbGUodGVhY2hlckluc3RydWN0aW9ucy5sYWJlbCksXG4gICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IHN0dWRlbnRJbnN0cnVjdGlvbnMuc2V0dGluZ3MgJiYgdG9nZ2xlKHN0dWRlbnRJbnN0cnVjdGlvbnMubGFiZWwpLFxuICAgIHByb21wdEVuYWJsZWQ6IHByb21wdC5zZXR0aW5ncyAmJiB0b2dnbGUocHJvbXB0LmxhYmVsKSxcbiAgICByYXRpb25hbGVFbmFibGVkOiByYXRpb25hbGUuc2V0dGluZ3MgJiYgdG9nZ2xlKHJhdGlvbmFsZS5sYWJlbCksXG4gICAgc3BlbGxDaGVja0VuYWJsZWQ6IHNwZWxsQ2hlY2suc2V0dGluZ3MgJiYgdG9nZ2xlKHNwZWxsQ2hlY2subGFiZWwpLFxuICAgIHNjb3JpbmdUeXBlOiBzY29yaW5nVHlwZS5zZXR0aW5ncyAmJiByYWRpbyhzY29yaW5nVHlwZS5sYWJlbCwgWydhdXRvJywgJ3J1YnJpYyddKSxcbiAgICBydWJyaWNFbmFibGVkOiB3aXRoUnVicmljPy5zZXR0aW5ncyAmJiB0b2dnbGUod2l0aFJ1YnJpYz8ubGFiZWwpLFxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGxheW91dC5Db25maWdMYXlvdXRcbiAgICAgIGRpbWVuc2lvbnM9e2NvbnRlbnREaW1lbnNpb25zfVxuICAgICAgaGlkZVNldHRpbmdzPXtzZXR0aW5nc1BhbmVsRGlzYWJsZWR9XG4gICAgICBleHRyYUNTU1J1bGVzPXtleHRyYUNTU1J1bGVzfVxuICAgICAgY2xhc3Nlcz17e319XG4gICAgICBzZXR0aW5ncz17XG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIG1vZGVsPXttb2RlbH1cbiAgICAgICAgICBvbkNoYW5nZU1vZGVsPXtvbkNoYW5nZU1vZGVsfVxuICAgICAgICAgIGNvbmZpZ3VyYXRpb249e2NvbmZpZ3VyYXRpb259XG4gICAgICAgICAgb25DaGFuZ2VDb25maWd1cmF0aW9uPXtvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkfVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgU2V0dGluZ3M6IHBhbmVsU2V0dGluZ3MsXG4gICAgICAgICAgICBQcm9wZXJ0aWVzOiBwYW5lbFByb3BlcnRpZXMsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA+XG4gICAgICB7dGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgJiYgKFxuICAgICAgICA8UHJvbXB0SG9sZGVyIGxhYmVsPXt0ZWFjaGVySW5zdHJ1Y3Rpb25zLmxhYmVsfT5cbiAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgbWFya3VwPXttb2RlbC50ZWFjaGVySW5zdHJ1Y3Rpb25zIHx8ICcnfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17b25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZH1cbiAgICAgICAgICAgICAgaW1hZ2VTdXBwb3J0PXtpbWFnZVN1cHBvcnR9XG4gICAgICAgICAgICAgIG5vbkVtcHR5PXtmYWxzZX1cbiAgICAgICAgICAgICAgZGlzYWJsZVVuZGVybGluZVxuICAgICAgICAgICAgICBlcnJvcj17dGVhY2hlckluc3RydWN0aW9uc0Vycm9yfVxuICAgICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICAgIHBsdWdpblByb3BzPXtnZXRQbHVnaW5Qcm9wcyhjb25maWd1cmF0aW9uPy50ZWFjaGVySW5zdHJ1Y3Rpb25zPy5pbnB1dENvbmZpZ3VyYXRpb24pfVxuICAgICAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrRW5hYmxlZH1cbiAgICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17KG1heEltYWdlV2lkdGggJiYgbWF4SW1hZ2VXaWR0aC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSB8fCBkZWZhdWx0SW1hZ2VNYXhXaWR0aH1cbiAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ9eyhtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSB8fCBkZWZhdWx0SW1hZ2VNYXhIZWlnaHR9XG4gICAgICAgICAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydD17dXBsb2FkU291bmRTdXBwb3J0fVxuICAgICAgICAgICAgICBsYW5ndWFnZUNoYXJhY3RlcnNQcm9wcz17W3sgbGFuZ3VhZ2U6ICdzcGFuaXNoJyB9LCB7IGxhbmd1YWdlOiAnc3BlY2lhbCcgfV19XG4gICAgICAgICAgICAgIG1hdGhNbE9wdGlvbnM9e21hdGhNbE9wdGlvbnN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3RlYWNoZXJJbnN0cnVjdGlvbnNFcnJvciAmJiA8RXJyb3JUZXh0Pnt0ZWFjaGVySW5zdHJ1Y3Rpb25zRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAgICA8L1Byb21wdEhvbGRlcj5cbiAgICAgICl9XG5cbiAgICAgIHtwcm9tcHRFbmFibGVkICYmIChcbiAgICAgICAgPFByb21wdEhvbGRlciBsYWJlbD17cHJvbXB0LmxhYmVsfT5cbiAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgbWFya3VwPXttb2RlbC5wcm9tcHR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtvblByb21wdENoYW5nZWR9XG4gICAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgICBub25FbXB0eT17ZmFsc2V9XG4gICAgICAgICAgICAgIGRpc2FibGVVbmRlcmxpbmVcbiAgICAgICAgICAgICAgZXJyb3I9e3Byb21wdEVycm9yfVxuICAgICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICAgIHBsdWdpblByb3BzPXtnZXRQbHVnaW5Qcm9wcyhjb25maWd1cmF0aW9uPy5wcm9tcHQ/LmlucHV0Q29uZmlndXJhdGlvbil9XG4gICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICBtYXhJbWFnZVdpZHRoPXttYXhJbWFnZVdpZHRoICYmIG1heEltYWdlV2lkdGgucHJvbXB0fVxuICAgICAgICAgICAgICBtYXhJbWFnZUhlaWdodD17bWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQucHJvbXB0fVxuICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM9e1t7IGxhbmd1YWdlOiAnc3BhbmlzaCcgfSwgeyBsYW5ndWFnZTogJ3NwZWNpYWwnIH1dfVxuICAgICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtwcm9tcHRFcnJvciAmJiA8RXJyb3JUZXh0Pntwcm9tcHRFcnJvcn08L0Vycm9yVGV4dD59XG4gICAgICAgIDwvUHJvbXB0SG9sZGVyPlxuICAgICAgKX1cblxuICAgICAgPEZsZXhDb250YWluZXI+XG4gICAgICAgIDxUaXRsZVRleHQgY29tcG9uZW50PXsnZGl2J30+XG4gICAgICAgICAgQ2hvaWNlc1xuICAgICAgICA8L1RpdGxlVGV4dD5cbiAgICAgICAgPFN0eWxlZFRvb2x0aXBcbiAgICAgICAgICBkaXNhYmxlRm9jdXNMaXN0ZW5lclxuICAgICAgICAgIGRpc2FibGVUb3VjaExpc3RlbmVyXG4gICAgICAgICAgcGxhY2VtZW50PXsncmlnaHQnfVxuICAgICAgICAgIHRpdGxlPXt2YWxpZGF0aW9uTWVzc2FnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJbmZvIGZvbnRTaXplPXsnc21hbGwnfSBjb2xvcj17J3ByaW1hcnknfSAvPlxuICAgICAgICA8L1N0eWxlZFRvb2x0aXA+XG4gICAgICA8L0ZsZXhDb250YWluZXI+XG5cbiAgICAgIHtjaG9pY2VzLm1hcCgoY2hvaWNlLCBpbmRleCkgPT4gKFxuICAgICAgICA8Q2hvaWNlQ29uZmlndXJhdGlvbkhvbGRlciBrZXk9e2BjaG9pY2UtJHtpbmRleH1gfT5cbiAgICAgICAgICA8Q2hvaWNlQ29uZmlndXJhdGlvblxuICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgIGluZGV4PXtpbmRleCArIDF9XG4gICAgICAgICAgICB1c2VMZXR0ZXJPcmRlcmluZz17bW9kZWwuY2hvaWNlUHJlZml4ID09PSAnbGV0dGVycyd9XG4gICAgICAgICAgICBtb2RlPXttb2RlbC5jaG9pY2VNb2RlfVxuICAgICAgICAgICAgZGF0YT17Y2hvaWNlfVxuICAgICAgICAgICAgZGVmYXVsdEZlZWRiYWNrPXt7fX1cbiAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9ucz17dHJ1ZX1cbiAgICAgICAgICAgIG9uRGVsZXRlPXsoKSA9PiBvblJlbW92ZUNob2ljZShpbmRleCl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGMpID0+IG9uQ2hvaWNlQ2hhbmdlZChpbmRleCwgYyl9XG4gICAgICAgICAgICBhbGxvd0ZlZWRCYWNrPXtmZWVkYmFja0VuYWJsZWR9XG4gICAgICAgICAgICBhbGxvd0RlbGV0ZT17ZGVsZXRlQ2hvaWNlLnNldHRpbmdzfVxuICAgICAgICAgICAgbm9MYWJlbHNcbiAgICAgICAgICAgIHBsdWdpbk9wdHM9e2dldFBsdWdpblByb3BzKGNvbmZpZ3VyYXRpb24/LmNob2ljZXM/LmlucHV0Q29uZmlndXJhdGlvbil9XG4gICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrRW5hYmxlZH1cbiAgICAgICAgICAgIGVycm9yPXtjaG9pY2VzRXJyb3JzPy5bY2hvaWNlLnZhbHVlXSB8fCBudWxsfVxuICAgICAgICAgICAgbm9Db3JyZWN0QW5zd2VyRXJyb3I9e2NvcnJlY3RSZXNwb25zZUVycm9yfVxuICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17KG1heEltYWdlV2lkdGggJiYgbWF4SW1hZ2VXaWR0aC5jaG9pY2VzKSB8fCBkZWZhdWx0SW1hZ2VNYXhXaWR0aH1cbiAgICAgICAgICAgIG1heEltYWdlSGVpZ2h0PXsobWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQuY2hvaWNlcykgfHwgZGVmYXVsdEltYWdlTWF4SGVpZ2h0fVxuICAgICAgICAgICAgdXBsb2FkU291bmRTdXBwb3J0PXt1cGxvYWRTb3VuZFN1cHBvcnR9XG4gICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICB7cmF0aW9uYWxlRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICA8UmF0aW9uYWxlSG9sZGVyIGtleT17YHJhdGlvbmFsZS0ke2luZGV4fWB9IGxhYmVsPXtyYXRpb25hbGUubGFiZWx9PlxuICAgICAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgICAgIG1hcmt1cD17Y2hvaWNlLnJhdGlvbmFsZSB8fCAnJ31cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYykgPT4gb25DaG9pY2VDaGFuZ2VkKGluZGV4LCB7IC4uLmNob2ljZSwgcmF0aW9uYWxlOiBjIH0pfVxuICAgICAgICAgICAgICAgICAgaW1hZ2VTdXBwb3J0PXtpbWFnZVN1cHBvcnR9XG4gICAgICAgICAgICAgICAgICBlcnJvcj17cmF0aW9uYWxlRXJyb3JzPy5bY2hvaWNlLnZhbHVlXSB8fCBudWxsfVxuICAgICAgICAgICAgICAgICAgdG9vbGJhck9wdHM9e3Rvb2xiYXJPcHRzfVxuICAgICAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e2dldFBsdWdpblByb3BzKGNvbmZpZ3VyYXRpb24/LnJhdGlvbmFsZT8uaW5wdXRDb25maWd1cmF0aW9uKX1cbiAgICAgICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17KG1heEltYWdlV2lkdGggJiYgbWF4SW1hZ2VXaWR0aC5yYXRpb25hbGUpIHx8IGRlZmF1bHRJbWFnZU1heFdpZHRofVxuICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ9eyhtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC5yYXRpb25hbGUpIHx8IGRlZmF1bHRJbWFnZU1heEhlaWdodH1cbiAgICAgICAgICAgICAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydD17dXBsb2FkU291bmRTdXBwb3J0fVxuICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM9e1t7IGxhbmd1YWdlOiAnc3BhbmlzaCcgfSwgeyBsYW5ndWFnZTogJ3NwZWNpYWwnIH1dfVxuICAgICAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHtyYXRpb25hbGVFcnJvcnM/LltjaG9pY2UudmFsdWVdICYmIChcbiAgICAgICAgICAgICAgICAgIDxFcnJvclRleHQ+e3JhdGlvbmFsZUVycm9ycz8uW2Nob2ljZS52YWx1ZV19PC9FcnJvclRleHQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvUmF0aW9uYWxlSG9sZGVyPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvQ2hvaWNlQ29uZmlndXJhdGlvbkhvbGRlcj5cbiAgICAgICkpfVxuXG4gICAgICB7Y29ycmVjdFJlc3BvbnNlRXJyb3IgJiYgPEVycm9yVGV4dD57Y29ycmVjdFJlc3BvbnNlRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAge2Fuc3dlckNob2ljZXNFcnJvciAmJiA8RXJyb3JUZXh0PnthbnN3ZXJDaG9pY2VzRXJyb3J9PC9FcnJvclRleHQ+fVxuXG4gICAgICB7YWRkQ2hvaWNlQnV0dG9uLnNldHRpbmdzICYmIChcbiAgICAgICAgPFN0eWxlZFRvb2x0aXAgdGl0bGU9e2FkZENob2ljZUJ1dHRvblRvb2x0aXB9PlxuICAgICAgICAgIHttYXhBbnN3ZXJDaG9pY2VzICYmIGNob2ljZXM/Lmxlbmd0aCA+PSBtYXhBbnN3ZXJDaG9pY2VzID8gKFxuICAgICAgICAgICAgPERpc2FibGVCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e29uQWRkQ2hvaWNlfVxuICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7YWRkQ2hvaWNlQnV0dG9uLmxhYmVsfVxuICAgICAgICAgICAgPC9EaXNhYmxlQnV0dG9uPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8QWRkQnV0dG9uXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXtvbkFkZENob2ljZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2FkZENob2ljZUJ1dHRvbi5sYWJlbH1cbiAgICAgICAgICAgIDwvQWRkQnV0dG9uPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvU3R5bGVkVG9vbHRpcD5cbiAgICAgICl9XG4gICAgPC9sYXlvdXQuQ29uZmlnTGF5b3V0PlxuICApO1xufTtcblxuZXhwb3J0IGNsYXNzIE1haW4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIG1vZGVsOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgY29uZmlndXJhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGRpc2FibGVTaWRlUGFuZWw6IFByb3BUeXBlcy5ib29sLFxuICAgIG9uTW9kZWxDaGFuZ2VkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgaW1hZ2VTdXBwb3J0OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYWRkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgZGVsZXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRlID0geyBzaG93V2FybmluZzogZmFsc2UgfTtcblxuICBvblJlbW92ZUNob2ljZSA9IChpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwsIGNvbmZpZ3VyYXRpb24sIG9uTW9kZWxDaGFuZ2VkIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgbWluQW5zd2VyQ2hvaWNlcyB9ID0gY29uZmlndXJhdGlvbiB8fCB7fTtcblxuICAgIGlmIChtaW5BbnN3ZXJDaG9pY2VzICYmIG1vZGVsLmNob2ljZXMubGVuZ3RoID09PSBtaW5BbnN3ZXJDaG9pY2VzKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd1dhcm5pbmc6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtb2RlbC5jaG9pY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgb25Nb2RlbENoYW5nZWQoe1xuICAgICAgY2hvaWNlczogbW9kZWwuY2hvaWNlcyxcbiAgICB9KTtcbiAgfTtcblxuICBvbkFkZENob2ljZSA9ICgpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsLCBjb25maWd1cmF0aW9uLCBvbk1vZGVsQ2hhbmdlZCB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgeyBtYXhBbnN3ZXJDaG9pY2VzIH0gPSBjb25maWd1cmF0aW9uIHx8IHt9O1xuICAgIGNvbnN0IHsgbGltaXRDaG9pY2VzTnVtYmVyIH0gPSBtb2RlbCB8fCB7fTtcblxuICAgIC8vIGlmIG9sZCBwcm9wZXJ0eSBpcyB1c2VkLCBzZXQgbWF4QW5zd2VyQ2hvaWNlcyB0byA5XG4gICAgaWYgKGxpbWl0Q2hvaWNlc051bWJlcikge1xuICAgICAgbWF4QW5zd2VyQ2hvaWNlcyA9IE1BWF9DSE9JQ0VTO1xuICAgIH1cblxuICAgIGlmIChtYXhBbnN3ZXJDaG9pY2VzICYmIG1vZGVsLmNob2ljZXMubGVuZ3RoID49IG1heEFuc3dlckNob2ljZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtb2RlbC5jaG9pY2VzLnB1c2goe1xuICAgICAgbGFiZWw6ICcnLFxuICAgICAgdmFsdWU6IHV0aWxzLmZpcnN0QXZhaWxhYmxlSW5kZXgoXG4gICAgICAgIG1vZGVsLmNob2ljZXMubWFwKChjKSA9PiBjLnZhbHVlKSxcbiAgICAgICAgMCxcbiAgICAgICksXG4gICAgICBmZWVkYmFjazogeyB0eXBlOiAnbm9uZScgfSxcbiAgICB9KTtcblxuICAgIG9uTW9kZWxDaGFuZ2VkKHtcbiAgICAgIGNob2ljZXM6IG1vZGVsLmNob2ljZXMsXG4gICAgfSk7XG4gIH07XG5cbiAgb25DaG9pY2VDaGFuZ2VkID0gKGluZGV4LCBjaG9pY2UpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsLCBvbk1vZGVsQ2hhbmdlZCB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmIChjaG9pY2UuY29ycmVjdCAmJiBtb2RlbC5jaG9pY2VNb2RlID09PSAncmFkaW8nKSB7XG4gICAgICBtb2RlbC5jaG9pY2VzID0gbW9kZWwuY2hvaWNlcy5tYXAoKGMpID0+IG1lcmdlKHt9LCBjLCB7IGNvcnJlY3Q6IGZhbHNlIH0pKTtcbiAgICB9XG5cbiAgICBtb2RlbC5jaG9pY2VzLnNwbGljZShpbmRleCwgMSwgY2hvaWNlKTtcbiAgICBvbk1vZGVsQ2hhbmdlZCh7XG4gICAgICBjaG9pY2VzOiBtb2RlbC5jaG9pY2VzLFxuICAgIH0pO1xuICB9O1xuXG4gIG9uUHJvbXB0Q2hhbmdlZCA9IChwcm9tcHQpID0+IHtcbiAgICB0aGlzLnByb3BzLm9uTW9kZWxDaGFuZ2VkKHtcbiAgICAgIHByb21wdCxcbiAgICB9KTtcbiAgfTtcblxuICBvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkID0gKHRlYWNoZXJJbnN0cnVjdGlvbnMpID0+IHtcbiAgICB0aGlzLnByb3BzLm9uTW9kZWxDaGFuZ2VkKHtcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnMsXG4gICAgfSk7XG4gIH07XG5cbiAgb25Nb2RlbENoYW5nZWQgPSAobW9kZWwsIGtleSkgPT4ge1xuICAgIGNvbnN0IHsgb25Nb2RlbENoYW5nZWQgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnY2hvaWNlTW9kZSc6IHtcbiAgICAgICAgbGV0IHZhbHVlID0gbW9kZWwuY2hvaWNlTW9kZTtcblxuICAgICAgICBpZiAodmFsdWUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICBsZXQgY29ycmVjdEZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICBtb2RlbC5jaG9pY2VzID0gbW9kZWwuY2hvaWNlcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjb3JyZWN0Rm91bmQpIHtcbiAgICAgICAgICAgICAgYy5jb3JyZWN0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjLmNvcnJlY3QpIHtcbiAgICAgICAgICAgICAgY29ycmVjdEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBvbk1vZGVsQ2hhbmdlZCh7XG4gICAgICAgICAgY2hvaWNlTW9kZTogbW9kZWwuY2hvaWNlTW9kZSxcbiAgICAgICAgICBjaG9pY2VzOiBtb2RlbC5jaG9pY2VzLFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG9uTW9kZWxDaGFuZ2VkKG1vZGVsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNvbmZpZ3VyYXRpb246IHsgbWluQW5zd2VyQ2hvaWNlcyB9ID0ge30gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBzaG93V2FybmluZyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHJldHVybiAoXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgIDxBbGVydERpYWxvZ1xuICAgICAgICAgIG9wZW49e3Nob3dXYXJuaW5nfVxuICAgICAgICAgIHRpdGxlPVwiV2FybmluZ1wiXG4gICAgICAgICAgdGV4dD17YFRoZXJlIGNhbid0IGJlIGxlc3MgdGhhbiAke21pbkFuc3dlckNob2ljZXMgfHwgMH0gY2hvaWNlcy5gfVxuICAgICAgICAgIG9uQ29uZmlybT17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dXYXJuaW5nOiBmYWxzZSB9KX1cbiAgICAgICAgLz5cbiAgICAgICAgPERlc2lnblxuICAgICAgICAgIHsuLi50aGlzLnByb3BzfVxuICAgICAgICAgIG9uQ2hhbmdlTW9kZWw9e3RoaXMub25Nb2RlbENoYW5nZWR9XG4gICAgICAgICAgb25SZW1vdmVDaG9pY2U9e3RoaXMub25SZW1vdmVDaG9pY2V9XG4gICAgICAgICAgb25DaG9pY2VDaGFuZ2VkPXt0aGlzLm9uQ2hvaWNlQ2hhbmdlZH1cbiAgICAgICAgICBvbkFkZENob2ljZT17dGhpcy5vbkFkZENob2ljZX1cbiAgICAgICAgICBvblByb21wdENoYW5nZWQ9e3RoaXMub25Qcm9tcHRDaGFuZ2VkfVxuICAgICAgICAgIG9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQ9e3RoaXMub25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZH1cbiAgICAgICAgLz5cbiAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYWluO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxtQkFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBUUEsSUFBQUssU0FBQSxHQUFBTCxPQUFB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
|