@pie-element/categorize 11.3.4-next.3 → 12.0.0-beta.1

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 (106) hide show
  1. package/CHANGELOG.md +0 -11
  2. package/configure/CHANGELOG.md +0 -11
  3. package/configure/lib/__tests__/main.test.js +100 -0
  4. package/configure/lib/__tests__/utils.js +39 -0
  5. package/configure/lib/defaults.js +3 -6
  6. package/configure/lib/defaults.js.map +1 -1
  7. package/configure/lib/design/__tests__/builder.test.js +34 -0
  8. package/configure/lib/design/__tests__/buttons.test.js +36 -0
  9. package/configure/lib/design/__tests__/header.test.js +37 -0
  10. package/configure/lib/design/__tests__/index.test.js +125 -0
  11. package/configure/lib/design/__tests__/input-header.test.js +41 -0
  12. package/configure/lib/design/builder.js +16 -34
  13. package/configure/lib/design/builder.js.map +1 -1
  14. package/configure/lib/design/buttons.js +42 -96
  15. package/configure/lib/design/buttons.js.map +1 -1
  16. package/configure/lib/design/categories/RowLabel.js +34 -47
  17. package/configure/lib/design/categories/RowLabel.js.map +1 -1
  18. package/configure/lib/design/categories/__tests__/alternateResponses.test.js +93 -0
  19. package/configure/lib/design/categories/__tests__/category.test.js +65 -0
  20. package/configure/lib/design/categories/__tests__/choice-preview.test.js +52 -0
  21. package/configure/lib/design/categories/__tests__/droppable-placeholder.test.js +63 -0
  22. package/configure/lib/design/categories/__tests__/index.test.js +91 -0
  23. package/configure/lib/design/categories/alternateResponses.js +97 -252
  24. package/configure/lib/design/categories/alternateResponses.js.map +1 -1
  25. package/configure/lib/design/categories/category.js +136 -209
  26. package/configure/lib/design/categories/category.js.map +1 -1
  27. package/configure/lib/design/categories/choice-preview.js +62 -127
  28. package/configure/lib/design/categories/choice-preview.js.map +1 -1
  29. package/configure/lib/design/categories/droppable-placeholder.js +74 -166
  30. package/configure/lib/design/categories/droppable-placeholder.js.map +1 -1
  31. package/configure/lib/design/categories/index.js +196 -385
  32. package/configure/lib/design/categories/index.js.map +1 -1
  33. package/configure/lib/design/choices/__tests__/choice.test.js +62 -0
  34. package/configure/lib/design/choices/__tests__/config.test.js +66 -0
  35. package/configure/lib/design/choices/__tests__/index.test.js +70 -0
  36. package/configure/lib/design/choices/choice.js +156 -265
  37. package/configure/lib/design/choices/choice.js.map +1 -1
  38. package/configure/lib/design/choices/config.js +43 -99
  39. package/configure/lib/design/choices/config.js.map +1 -1
  40. package/configure/lib/design/choices/index.js +149 -237
  41. package/configure/lib/design/choices/index.js.map +1 -1
  42. package/configure/lib/design/header.js +58 -112
  43. package/configure/lib/design/header.js.map +1 -1
  44. package/configure/lib/design/index.js +633 -478
  45. package/configure/lib/design/index.js.map +1 -1
  46. package/configure/lib/design/input-header.js +95 -151
  47. package/configure/lib/design/input-header.js.map +1 -1
  48. package/configure/lib/design/utils.js +5 -16
  49. package/configure/lib/design/utils.js.map +1 -1
  50. package/configure/lib/index.js +121 -184
  51. package/configure/lib/index.js.map +1 -1
  52. package/configure/lib/main.js +31 -75
  53. package/configure/lib/main.js.map +1 -1
  54. package/configure/lib/utils.js +23 -33
  55. package/configure/lib/utils.js.map +1 -1
  56. package/configure/package.json +15 -15
  57. package/controller/CHANGELOG.md +0 -11
  58. package/controller/lib/__tests__/index.test.js +526 -0
  59. package/controller/lib/defaults.js +3 -6
  60. package/controller/lib/defaults.js.map +1 -1
  61. package/controller/lib/index.js +238 -319
  62. package/controller/lib/index.js.map +1 -1
  63. package/controller/lib/utils.js +29 -66
  64. package/controller/lib/utils.js.map +1 -1
  65. package/controller/package.json +5 -5
  66. package/docs/demo/.pie/.configure/package.json +10 -0
  67. package/docs/demo/.pie/.configure/yarn.lock +2181 -0
  68. package/docs/demo/.pie/.controllers/package.json +10 -0
  69. package/docs/demo/.pie/.controllers/yarn.lock +110 -0
  70. package/docs/demo/.pie/info.entry.js +89 -0
  71. package/docs/demo/.pie/info.webpack.config.js +119 -0
  72. package/docs/demo/.pie/package.json +10 -0
  73. package/docs/demo/.pie/yarn.lock +2190 -0
  74. package/docs/demo/pie.manifest.json +11 -0
  75. package/lib/__tests__/index.test.js +197 -0
  76. package/lib/categorize/__tests__/categories.test.js +138 -0
  77. package/lib/categorize/__tests__/category.test.js +137 -0
  78. package/lib/categorize/__tests__/choice.test.js +88 -0
  79. package/lib/categorize/__tests__/choices.test.js +118 -0
  80. package/lib/categorize/__tests__/droppable-placeholder.test.js +96 -0
  81. package/lib/categorize/__tests__/grid-content.test.js +48 -0
  82. package/lib/categorize/__tests__/index.test.js +152 -0
  83. package/lib/categorize/categories.js +107 -165
  84. package/lib/categorize/categories.js.map +1 -1
  85. package/lib/categorize/category.js +74 -124
  86. package/lib/categorize/category.js.map +1 -1
  87. package/lib/categorize/choice.js +119 -246
  88. package/lib/categorize/choice.js.map +1 -1
  89. package/lib/categorize/choices.js +67 -132
  90. package/lib/categorize/choices.js.map +1 -1
  91. package/lib/categorize/droppable-placeholder.js +47 -104
  92. package/lib/categorize/droppable-placeholder.js.map +1 -1
  93. package/lib/categorize/grid-content.js +40 -88
  94. package/lib/categorize/grid-content.js.map +1 -1
  95. package/lib/categorize/index.js +342 -318
  96. package/lib/categorize/index.js.map +1 -1
  97. package/lib/index.js +286 -307
  98. package/lib/index.js.map +1 -1
  99. package/package.json +16 -14
  100. package/esm/configure.js +0 -34401
  101. package/esm/configure.js.map +0 -1
  102. package/esm/controller.js +0 -1468
  103. package/esm/controller.js.map +0 -1
  104. package/esm/element.js +0 -13134
  105. package/esm/element.js.map +0 -1
  106. package/esm/package.json +0 -3
@@ -1,545 +1,700 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = exports.Design = void 0;
9
-
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
-
18
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
-
20
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
-
22
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
-
7
+ exports.default = exports.Design = void 0;
24
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
-
26
9
  var _utils = require("./utils");
27
-
28
10
  var _react = _interopRequireDefault(require("react"));
29
-
30
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
31
-
32
- var _styles = require("@material-ui/core/styles");
33
-
12
+ var _styles = require("@mui/material/styles");
13
+ var _core = require("@dnd-kit/core");
34
14
  var _configUi = require("@pie-lib/config-ui");
35
-
36
15
  var _categorize = require("@pie-lib/categorize");
37
-
38
- var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
39
-
16
+ var _editableHtmlTipTap = _interopRequireDefault(require("@pie-lib/editable-html-tip-tap"));
40
17
  var _drag = require("@pie-lib/drag");
41
-
18
+ var _mathRendering = require("@pie-lib/math-rendering");
42
19
  var _categories = _interopRequireDefault(require("./categories"));
43
-
44
20
  var _alternateResponses = _interopRequireDefault(require("./categories/alternateResponses"));
45
-
46
21
  var _choices = _interopRequireDefault(require("./choices"));
47
-
22
+ var _choice = _interopRequireDefault(require("./choices/choice"));
23
+ var _choicePreview = _interopRequireDefault(require("./categories/choice-preview"));
48
24
  var _builder = require("./builder");
49
-
50
25
  var _header = _interopRequireDefault(require("./header"));
51
-
52
26
  var _utils2 = require("../utils");
53
-
54
27
  var _translator = _interopRequireDefault(require("@pie-lib/translator"));
28
+ const {
29
+ translator
30
+ } = _translator.default;
31
+ const {
32
+ dropdown,
33
+ Panel,
34
+ toggle,
35
+ radio,
36
+ numberField
37
+ } = _configUi.settings;
38
+ const {
39
+ Provider: IdProvider
40
+ } = _drag.uid;
41
+
42
+ // Simple wrapper to render math in DragOverlay portal
43
+ class DragPreviewWrapper extends _react.default.Component {
44
+ constructor(...args) {
45
+ super(...args);
46
+ (0, _defineProperty2.default)(this, "containerRef", /*#__PURE__*/_react.default.createRef());
47
+ }
48
+ componentDidMount() {
49
+ if (this.containerRef.current) {
50
+ setTimeout(() => (0, _mathRendering.renderMath)(this.containerRef.current), 0);
51
+ }
52
+ }
53
+ render() {
54
+ return /*#__PURE__*/_react.default.createElement("div", {
55
+ ref: this.containerRef
56
+ }, this.props.children);
57
+ }
58
+ }
59
+ const StyledHeader = (0, _styles.styled)(_header.default)(({
60
+ theme
61
+ }) => ({
62
+ marginBottom: theme.spacing(2)
63
+ }));
64
+ const StyledInputContainer = (0, _styles.styled)(_configUi.InputContainer)(({
65
+ theme
66
+ }) => ({
67
+ width: '100%',
68
+ paddingTop: theme.spacing(2),
69
+ marginBottom: theme.spacing(2)
70
+ }));
71
+ const ErrorText = (0, _styles.styled)('div')(({
72
+ theme
73
+ }) => ({
74
+ fontSize: theme.typography.fontSize - 2,
75
+ color: theme.palette.error.main,
76
+ paddingTop: theme.spacing(1)
77
+ }));
78
+ class Design extends _react.default.Component {
79
+ constructor(_props) {
80
+ super(_props);
81
+ (0, _defineProperty2.default)(this, "updateModel", props => {
82
+ const {
83
+ model,
84
+ onChange
85
+ } = this.props;
86
+ const updatedModel = {
87
+ ...model,
88
+ ...props
89
+ };
90
+ updatedModel.choices = updatedModel.choices.map(c => ({
91
+ ...c,
92
+ categoryCount: this.checkAllowMultiplePlacements(updatedModel.allowMultiplePlacementsEnabled, c)
93
+ }));
55
94
 
56
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
57
-
58
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
59
-
60
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
61
-
62
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
63
-
64
- var translator = _translator["default"].translator;
65
- var dropdown = _configUi.settings.dropdown,
66
- Panel = _configUi.settings.Panel,
67
- toggle = _configUi.settings.toggle,
68
- radio = _configUi.settings.radio,
69
- numberField = _configUi.settings.numberField;
70
- var IdProvider = _drag.uid.Provider;
71
-
72
- var Design = /*#__PURE__*/function (_React$Component) {
73
- (0, _inherits2["default"])(Design, _React$Component);
74
-
75
- var _super = _createSuper(Design);
76
-
77
- function Design(_props) {
78
- var _this;
79
-
80
- (0, _classCallCheck2["default"])(this, Design);
81
- _this = _super.call(this, _props);
82
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateModel", function (props) {
83
- var _this$props = _this.props,
84
- model = _this$props.model,
85
- onChange = _this$props.onChange;
86
-
87
- var updatedModel = _objectSpread(_objectSpread({}, model), props);
88
-
89
- updatedModel.choices = updatedModel.choices.map(function (c) {
90
- return _objectSpread(_objectSpread({}, c), {}, {
91
- categoryCount: _this.checkAllowMultiplePlacements(updatedModel.allowMultiplePlacementsEnabled, c)
92
- });
93
- }); //Ensure that there are no extra choices in correctResponse, if the user has decided that only one choice may be used.
94
-
95
- updatedModel.correctResponse = (0, _categorize.ensureNoExtraChoicesInAnswer)(updatedModel.correctResponse || [], updatedModel.choices); //Ensure that there are no extra choices in alternate responses, if the user has decided that only one choice may be used.
95
+ //Ensure that there are no extra choices in correctResponse, if the user has decided that only one choice may be used.
96
+ updatedModel.correctResponse = (0, _categorize.ensureNoExtraChoicesInAnswer)(updatedModel.correctResponse || [], updatedModel.choices);
96
97
 
97
- updatedModel.correctResponse = (0, _categorize.ensureNoExtraChoicesInAlternate)(updatedModel.correctResponse || [], updatedModel.choices); //clean categories
98
+ //Ensure that there are no extra choices in alternate responses, if the user has decided that only one choice may be used.
99
+ updatedModel.correctResponse = (0, _categorize.ensureNoExtraChoicesInAlternate)(updatedModel.correctResponse || [], updatedModel.choices);
98
100
 
99
- updatedModel.categories = updatedModel.categories.map(function (c) {
100
- return {
101
- id: c.id,
102
- label: c.label
103
- };
104
- });
105
- updatedModel.choices = updatedModel.choices.map(function (h) {
106
- return {
107
- id: h.id,
108
- content: h.content,
109
- categoryCount: h.categoryCount
110
- };
111
- }); // ensure that maxChoicesPerCategory is reset if author switch back the corresponding switch (allowMaxChoicesPerCategory)
101
+ //clean categories
102
+ updatedModel.categories = updatedModel.categories.map(c => ({
103
+ id: c.id,
104
+ label: c.label
105
+ }));
106
+ updatedModel.choices = updatedModel.choices.map(h => ({
107
+ id: h.id,
108
+ content: h.content,
109
+ categoryCount: h.categoryCount
110
+ }));
112
111
 
112
+ // ensure that maxChoicesPerCategory is reset if author switch back the corresponding switch (allowMaxChoicesPerCategory)
113
113
  updatedModel.maxChoicesPerCategory = updatedModel.allowMaxChoicesPerCategory ? updatedModel.maxChoicesPerCategory : 0;
114
114
  onChange(updatedModel);
115
115
  });
116
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeRationale", function (rationale) {
117
- var _this$props2 = _this.props,
118
- model = _this$props2.model,
119
- onChange = _this$props2.onChange;
120
- onChange(_objectSpread(_objectSpread({}, model), {}, {
121
- rationale: rationale
122
- }));
123
- });
124
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeTeacherInstructions", function (teacherInstructions) {
125
- var _this$props3 = _this.props,
126
- model = _this$props3.model,
127
- onChange = _this$props3.onChange;
128
- onChange(_objectSpread(_objectSpread({}, model), {}, {
129
- teacherInstructions: teacherInstructions
130
- }));
116
+ (0, _defineProperty2.default)(this, "changeRationale", rationale => {
117
+ const {
118
+ model,
119
+ onChange
120
+ } = this.props;
121
+ onChange({
122
+ ...model,
123
+ rationale
124
+ });
131
125
  });
132
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeFeedback", function (feedback) {
133
- _this.updateModel({
134
- feedback: feedback
126
+ (0, _defineProperty2.default)(this, "changeTeacherInstructions", teacherInstructions => {
127
+ const {
128
+ model,
129
+ onChange
130
+ } = this.props;
131
+ onChange({
132
+ ...model,
133
+ teacherInstructions
135
134
  });
136
135
  });
137
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onAddAlternateResponse", function () {
138
- var correctResponse = _this.props.model.correctResponse;
139
-
140
- _this.updateModel({
141
- correctResponse: (correctResponse || []).map(function (cr) {
142
- return _objectSpread(_objectSpread({}, cr), {}, {
143
- alternateResponses: [].concat((0, _toConsumableArray2["default"])(cr.alternateResponses || []), [[]])
144
- });
145
- })
136
+ (0, _defineProperty2.default)(this, "changeFeedback", feedback => {
137
+ this.updateModel({
138
+ feedback
146
139
  });
147
140
  });
148
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onPromptChanged", function (prompt) {
149
- return _this.updateModel({
150
- prompt: prompt
141
+ (0, _defineProperty2.default)(this, "onAddAlternateResponse", () => {
142
+ const {
143
+ model: {
144
+ correctResponse
145
+ }
146
+ } = this.props;
147
+ this.updateModel({
148
+ correctResponse: (correctResponse || []).map(cr => ({
149
+ ...cr,
150
+ alternateResponses: [...(cr.alternateResponses || []), []]
151
+ }))
151
152
  });
152
153
  });
153
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onRemoveAlternateResponse", function (index) {
154
- var correctResponse = _this.props.model.correctResponse;
155
-
156
- _this.updateModel({
157
- correctResponse: (correctResponse || []).map(function (cr) {
158
- return _objectSpread(_objectSpread({}, cr), {}, {
159
- alternateResponses: (cr.alternateResponses || []).filter(function (alt, altIndex) {
160
- return altIndex !== index;
161
- })
162
- });
163
- })
154
+ (0, _defineProperty2.default)(this, "onPromptChanged", prompt => this.updateModel({
155
+ prompt
156
+ }));
157
+ (0, _defineProperty2.default)(this, "onRemoveAlternateResponse", index => {
158
+ const {
159
+ model: {
160
+ correctResponse
161
+ }
162
+ } = this.props;
163
+ this.updateModel({
164
+ correctResponse: (correctResponse || []).map(cr => ({
165
+ ...cr,
166
+ alternateResponses: (cr.alternateResponses || []).filter((alt, altIndex) => altIndex !== index)
167
+ }))
164
168
  });
165
169
  });
166
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "countChoiceInCorrectResponse", function (choice) {
167
- var model = _this.props.model;
170
+ (0, _defineProperty2.default)(this, "countChoiceInCorrectResponse", choice => {
171
+ const {
172
+ model
173
+ } = this.props;
168
174
  return (0, _categorize.countInAnswer)(choice.id, model.correctResponse);
169
175
  });
170
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "checkAllowMultiplePlacements", function (allowMultiplePlacements, c) {
176
+ (0, _defineProperty2.default)(this, "checkAllowMultiplePlacements", (allowMultiplePlacements, c) => {
171
177
  if (allowMultiplePlacements === _utils2.multiplePlacements.enabled) {
172
178
  return 0;
173
179
  }
174
-
175
180
  if (allowMultiplePlacements === _utils2.multiplePlacements.disabled) {
176
181
  return 1;
177
182
  }
178
-
179
183
  return c.categoryCount || 0;
180
184
  });
181
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isAlertModalOpened", function () {
182
- var model = _this.props.model;
183
-
184
- var _ref = model || {},
185
- _ref$maxChoicesPerCat = _ref.maxChoicesPerCategory,
186
- maxChoicesPerCategory = _ref$maxChoicesPerCat === void 0 ? 0 : _ref$maxChoicesPerCat;
187
-
188
- var maxChoices = (0, _utils2.getMaxCategoryChoices)(model); // when maxChoicesPerCategory is set to 0, there is no limit so modal should not be opened
189
-
185
+ (0, _defineProperty2.default)(this, "isAlertModalOpened", () => {
186
+ const {
187
+ model
188
+ } = this.props;
189
+ const {
190
+ maxChoicesPerCategory = 0
191
+ } = model || {};
192
+ const maxChoices = (0, _utils2.getMaxCategoryChoices)(model);
193
+ // when maxChoicesPerCategory is set to 0, there is no limit so modal should not be opened
190
194
  return maxChoicesPerCategory !== 0 ? maxChoices > maxChoicesPerCategory : false;
191
195
  });
192
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onAlertModalCancel", function () {
193
- var model = _this.props.model;
194
- var maxChoices = (0, _utils2.getMaxCategoryChoices)(model);
195
-
196
- _this.updateModel({
196
+ (0, _defineProperty2.default)(this, "onAlertModalCancel", () => {
197
+ const {
198
+ model
199
+ } = this.props;
200
+ const maxChoices = (0, _utils2.getMaxCategoryChoices)(model);
201
+ this.updateModel({
197
202
  maxChoicesPerCategory: maxChoices
198
203
  });
199
204
  });
200
- _this.uid = _props.uid || _drag.uid.generateId();
201
- return _this;
202
- }
203
-
204
- (0, _createClass2["default"])(Design, [{
205
- key: "render",
206
- value: function render() {
207
- var _this2 = this;
208
-
209
- var _this$props4 = this.props,
210
- classes = _this$props4.classes,
211
- configuration = _this$props4.configuration,
212
- imageSupport = _this$props4.imageSupport,
213
- model = _this$props4.model,
214
- uploadSoundSupport = _this$props4.uploadSoundSupport,
215
- onConfigurationChanged = _this$props4.onConfigurationChanged;
216
-
217
- var _ref2 = configuration || {},
218
- _ref2$allowAlternate = _ref2.allowAlternate,
219
- allowAlternate = _ref2$allowAlternate === void 0 ? {} : _ref2$allowAlternate,
220
- _ref2$allowMultiplePl = _ref2.allowMultiplePlacements,
221
- allowMultiplePlacements = _ref2$allowMultiplePl === void 0 ? {} : _ref2$allowMultiplePl,
222
- _ref2$baseInputConfig = _ref2.baseInputConfiguration,
223
- baseInputConfiguration = _ref2$baseInputConfig === void 0 ? {} : _ref2$baseInputConfig,
224
- _ref2$categoriesPerRo = _ref2.categoriesPerRow,
225
- categoriesPerRow = _ref2$categoriesPerRo === void 0 ? {} : _ref2$categoriesPerRo,
226
- _ref2$choicesPosition = _ref2.choicesPosition,
227
- choicesPosition = _ref2$choicesPosition === void 0 ? {} : _ref2$choicesPosition,
228
- _ref2$contentDimensio = _ref2.contentDimensions,
229
- contentDimensions = _ref2$contentDimensio === void 0 ? {} : _ref2$contentDimensio,
230
- _ref2$feedback = _ref2.feedback,
231
- feedback = _ref2$feedback === void 0 ? {} : _ref2$feedback,
232
- _ref2$lockChoiceOrder = _ref2.lockChoiceOrder,
233
- lockChoiceOrder = _ref2$lockChoiceOrder === void 0 ? {} : _ref2$lockChoiceOrder,
234
- _ref2$maxImageHeight = _ref2.maxImageHeight,
235
- maxImageHeight = _ref2$maxImageHeight === void 0 ? {} : _ref2$maxImageHeight,
236
- _ref2$maxImageWidth = _ref2.maxImageWidth,
237
- maxImageWidth = _ref2$maxImageWidth === void 0 ? {} : _ref2$maxImageWidth,
238
- _ref2$maxPlacements = _ref2.maxPlacements,
239
- maxPlacements = _ref2$maxPlacements === void 0 ? {} : _ref2$maxPlacements,
240
- _ref2$minCategoriesPe = _ref2.minCategoriesPerRow,
241
- minCategoriesPerRow = _ref2$minCategoriesPe === void 0 ? 1 : _ref2$minCategoriesPe,
242
- _ref2$partialScoring = _ref2.partialScoring,
243
- partialScoring = _ref2$partialScoring === void 0 ? {} : _ref2$partialScoring,
244
- _ref2$prompt = _ref2.prompt,
245
- prompt = _ref2$prompt === void 0 ? {} : _ref2$prompt,
246
- _ref2$rationale = _ref2.rationale,
247
- rationale = _ref2$rationale === void 0 ? {} : _ref2$rationale,
248
- _ref2$scoringType = _ref2.scoringType,
249
- scoringType = _ref2$scoringType === void 0 ? {} : _ref2$scoringType,
250
- settingsPanelDisabled = _ref2.settingsPanelDisabled,
251
- _ref2$spellCheck = _ref2.spellCheck,
252
- spellCheck = _ref2$spellCheck === void 0 ? {} : _ref2$spellCheck,
253
- _ref2$studentInstruct = _ref2.studentInstructions,
254
- studentInstructions = _ref2$studentInstruct === void 0 ? {} : _ref2$studentInstruct,
255
- _ref2$teacherInstruct = _ref2.teacherInstructions,
256
- teacherInstructions = _ref2$teacherInstruct === void 0 ? {} : _ref2$teacherInstruct,
257
- _ref2$withRubric = _ref2.withRubric,
258
- withRubric = _ref2$withRubric === void 0 ? {} : _ref2$withRubric,
259
- _ref2$mathMlOptions = _ref2.mathMlOptions,
260
- mathMlOptions = _ref2$mathMlOptions === void 0 ? {} : _ref2$mathMlOptions,
261
- _ref2$language = _ref2.language,
262
- language = _ref2$language === void 0 ? {} : _ref2$language,
263
- _ref2$languageChoices = _ref2.languageChoices,
264
- languageChoices = _ref2$languageChoices === void 0 ? {} : _ref2$languageChoices,
265
- _ref2$allowMaxAnswerC = _ref2.allowMaxAnswerChoices,
266
- allowMaxAnswerChoices = _ref2$allowMaxAnswerC === void 0 ? {} : _ref2$allowMaxAnswerC;
267
-
268
- var _ref3 = model || {},
269
- allowAlternateEnabled = _ref3.allowAlternateEnabled,
270
- allowMaxChoicesPerCategory = _ref3.allowMaxChoicesPerCategory,
271
- errors = _ref3.errors,
272
- feedbackEnabled = _ref3.feedbackEnabled,
273
- maxChoicesPerCategory = _ref3.maxChoicesPerCategory,
274
- promptEnabled = _ref3.promptEnabled,
275
- rationaleEnabled = _ref3.rationaleEnabled,
276
- spellCheckEnabled = _ref3.spellCheckEnabled,
277
- teacherInstructionsEnabled = _ref3.teacherInstructionsEnabled,
278
- toolbarEditorPosition = _ref3.toolbarEditorPosition,
279
- extraCSSRules = _ref3.extraCSSRules;
205
+ (0, _defineProperty2.default)(this, "onDragStart", event => {
206
+ const {
207
+ active
208
+ } = event;
209
+ const draggedItem = active.data.current;
210
+ this.setState({
211
+ activeDragItem: draggedItem
212
+ });
213
+ });
214
+ (0, _defineProperty2.default)(this, "onDragEnd", event => {
215
+ const {
216
+ active,
217
+ over
218
+ } = event;
219
+ this.setState({
220
+ activeDragItem: null
221
+ });
222
+ if (!over || !active) {
223
+ return;
224
+ }
225
+ const {
226
+ model
227
+ } = this.props;
228
+ const {
229
+ allowAlternateEnabled
230
+ } = model;
231
+ const activeData = active.data.current;
232
+ const overData = over.data.current;
233
+
234
+ // moving a choice between categories (correct response)
235
+ if (activeData.type === 'choice-preview' && overData.type === 'category') {
236
+ // Extract original choice.id - if DraggableChoice uses the unique id in data, extract the first part
237
+ // Format: ${choice.id}-${categoryId}-${choiceIndex} or ${choice.id}-${categoryId}-${choiceIndex}-alt-${alternateResponseIndex}
238
+ const choiceId = activeData.choice?.id || (typeof activeData.id === 'string' ? activeData.id.split('-')[0] : activeData.id);
239
+ this.moveChoice(choiceId, activeData.categoryId, overData.id, activeData.choiceIndex || 0);
240
+ }
280
241
 
281
- var _ref4 = errors || {},
282
- promptError = _ref4.prompt,
283
- rationaleError = _ref4.rationale,
284
- teacherInstructionsError = _ref4.teacherInstructions;
242
+ // placing a choice into a category (correct response)
243
+ if (activeData.type === 'choice' && overData.type === 'category') {
244
+ this.addChoiceToCategory({
245
+ id: activeData.id
246
+ }, overData.id);
247
+ }
285
248
 
286
- var toolbarOpts = {
287
- position: toolbarEditorPosition === 'top' ? 'top' : 'bottom'
288
- };
289
- var config = model.config || {};
290
- config.choices = config.choices || {
291
- label: '',
292
- columns: 2
293
- };
294
- var categories = (0, _builder.buildCategories)(model.categories || [], model.choices || [], model.correctResponse || []);
295
- var alternateResponses = (0, _builder.buildAlternateResponses)(model.categories || [], model.choices || [], model.correctResponse || []);
296
- var choices = model.choices.map(function (c) {
297
- c.correctResponseCount = _this2.countChoiceInCorrectResponse(c); // ensure categoryCount is set even though updatedModel hasn't been called
249
+ // moving a choice between categories (alternate response)
250
+ if (activeData.type === 'choice-preview' && overData.type === 'category-alternate') {
251
+ const toAlternateIndex = overData.alternateResponseIndex;
252
+ // Extract original choice.id - if DraggableChoice uses the unique id in data, extract the first part
253
+ const choiceId = activeData.choice?.id || (typeof activeData.id === 'string' ? activeData.id.split('-')[0] : activeData.id);
254
+ this.moveChoiceInAlternate(choiceId, activeData.categoryId, overData.id, activeData.choiceIndex || 0, toAlternateIndex);
255
+ }
298
256
 
299
- c.categoryCount = _this2.checkAllowMultiplePlacements(model.allowMultiplePlacementsEnabled, c);
300
- return c;
257
+ // placing a choice into a category (alternate response)
258
+ if (allowAlternateEnabled && activeData.type === 'choice' && overData.type === 'category-alternate') {
259
+ const choiceId = activeData.id;
260
+ const categoryId = overData.id;
261
+ const toAlternateResponseIndex = overData.alternateResponseIndex;
262
+ this.addChoiceToAlternateCategory({
263
+ id: choiceId
264
+ }, categoryId, toAlternateResponseIndex);
265
+ }
266
+ });
267
+ (0, _defineProperty2.default)(this, "addChoiceToCategory", (addedChoice, categoryId) => {
268
+ const {
269
+ model
270
+ } = this.props;
271
+ let {
272
+ choices = [],
273
+ correctResponse = [],
274
+ maxChoicesPerCategory = 0
275
+ } = model || {};
276
+ const choice = (choices || []).find(choice => choice.id === addedChoice.id);
277
+ let newCorrectResponse = (0, _categorize.moveChoiceToCategory)(addedChoice.id, undefined, categoryId, 0, correctResponse);
278
+ if (choice.categoryCount !== 0) {
279
+ newCorrectResponse = (0, _categorize.verifyAllowMultiplePlacements)(addedChoice, categoryId, newCorrectResponse);
280
+ }
281
+ const maxCategoryChoices = (0, _utils2.getMaxCategoryChoices)(model);
282
+ this.updateModel({
283
+ correctResponse: newCorrectResponse,
284
+ maxChoicesPerCategory: maxChoicesPerCategory !== 0 && maxChoicesPerCategory < maxCategoryChoices ? maxChoicesPerCategory + 1 : maxChoicesPerCategory
301
285
  });
302
- var defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
303
- var defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
304
- var panelSettings = {
305
- partialScoring: partialScoring.settings && toggle(partialScoring.label),
306
- lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),
307
- categoriesPerRow: categoriesPerRow.settings && numberField(categoriesPerRow.label, {
308
- label: categoriesPerRow.label,
309
- min: minCategoriesPerRow,
310
- max: 6
311
- }),
312
- choicesPosition: choicesPosition.settings && radio(choicesPosition.label, ['below', 'above', 'left', 'right']),
313
- allowMultiplePlacementsEnabled: allowMultiplePlacements.settings && dropdown(allowMultiplePlacements.label, [_utils2.multiplePlacements.enabled, _utils2.multiplePlacements.disabled, _utils2.multiplePlacements.perChoice]),
314
- maxAnswerChoices: allowMaxAnswerChoices.settings && numberField(allowMaxAnswerChoices.label, {
315
- label: '',
316
- min: (choices === null || choices === void 0 ? void 0 : choices.length) || 0,
317
- max: 30
318
- }),
319
- allowMaxChoicesPerCategory: maxPlacements.settings && toggle(maxPlacements.label),
320
- maxChoicesPerCategory: allowMaxChoicesPerCategory === true && numberField(maxPlacements.label, {
321
- label: '',
322
- min: 0,
323
- max: 30
324
- }),
325
- promptEnabled: prompt.settings && toggle(prompt.label),
326
- feedbackEnabled: feedback.settings && toggle(feedback.label),
327
- allowAlternateEnabled: allowAlternate.settings && toggle(allowAlternate.label),
328
- 'language.enabled': language.settings && toggle(language.label, true),
329
- language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options)
330
- };
331
- var panelProperties = {
332
- teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
333
- studentInstructionsEnabled: studentInstructions.settings && toggle(studentInstructions.label),
334
- rationaleEnabled: rationale.settings && toggle(rationale.label),
335
- spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
336
- scoringType: scoringType.settings && radio(scoringType.label, ['auto', 'rubric']),
337
- rubricEnabled: (withRubric === null || withRubric === void 0 ? void 0 : withRubric.settings) && toggle(withRubric === null || withRubric === void 0 ? void 0 : withRubric.label)
338
- };
339
- var isOpened = this.isAlertModalOpened();
340
- var alertMaxChoicesMsg = translator.t('translation:categorize:maxChoicesPerCategoryRestriction', {
341
- lng: model.language,
342
- maxChoicesPerCategory: maxChoicesPerCategory
286
+ });
287
+ (0, _defineProperty2.default)(this, "deleteChoiceFromCategory", (category, choice, choiceIndex) => {
288
+ const {
289
+ model
290
+ } = this.props;
291
+ const correctResponse = (0, _categorize.removeChoiceFromCategory)(choice.id, category.id, choiceIndex, model.correctResponse);
292
+ this.updateModel({
293
+ correctResponse
343
294
  });
344
- return /*#__PURE__*/_react["default"].createElement(IdProvider, {
345
- value: this.uid
346
- }, /*#__PURE__*/_react["default"].createElement(_configUi.layout.ConfigLayout, {
347
- extraCSSRules: extraCSSRules,
348
- dimensions: contentDimensions,
349
- hideSettings: settingsPanelDisabled,
350
- settings: /*#__PURE__*/_react["default"].createElement(Panel, {
351
- model: model,
352
- onChangeModel: this.updateModel,
353
- configuration: configuration,
354
- onChangeConfiguration: onConfigurationChanged,
355
- groups: {
356
- Settings: panelSettings,
357
- Properties: panelProperties
358
- },
359
- modal: /*#__PURE__*/_react["default"].createElement(_configUi.AlertDialog, {
360
- title: 'Warning',
361
- text: alertMaxChoicesMsg,
362
- open: isOpened,
363
- onClose: this.onAlertModalCancel
364
- })
365
- })
366
- }, teacherInstructionsEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
367
- label: teacherInstructions.label,
368
- className: classes.inputContainer
369
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
370
- className: classes.input,
371
- markup: model.teacherInstructions || '',
372
- onChange: this.changeTeacherInstructions,
373
- imageSupport: imageSupport,
374
- error: teacherInstructionsError,
375
- nonEmpty: false,
376
- toolbarOpts: toolbarOpts,
377
- pluginProps: (0, _utils.getPluginProps)(teacherInstructions === null || teacherInstructions === void 0 ? void 0 : teacherInstructions.inputConfiguration, baseInputConfiguration),
378
- spellCheck: spellCheckEnabled,
379
- maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
380
- maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight,
381
- uploadSoundSupport: uploadSoundSupport,
382
- languageCharactersProps: [{
383
- language: 'spanish'
384
- }, {
385
- language: 'special'
386
- }],
387
- mathMlOptions: mathMlOptions
388
- }), teacherInstructionsError && /*#__PURE__*/_react["default"].createElement("div", {
389
- className: classes.errorText
390
- }, teacherInstructionsError)), promptEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
391
- label: prompt.label,
392
- className: classes.inputContainer
393
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
394
- className: classes.input,
395
- markup: model.prompt || '',
396
- onChange: this.onPromptChanged,
397
- imageSupport: imageSupport,
398
- error: promptError,
399
- nonEmpty: false,
400
- disableUnderline: true,
401
- toolbarOpts: toolbarOpts,
402
- pluginProps: (0, _utils.getPluginProps)(prompt === null || prompt === void 0 ? void 0 : prompt.inputConfiguration, baseInputConfiguration),
403
- spellCheck: spellCheckEnabled,
404
- maxImageWidth: maxImageWidth && maxImageWidth.prompt,
405
- maxImageHeight: maxImageHeight && maxImageHeight.prompt,
406
- uploadSoundSupport: uploadSoundSupport,
407
- languageCharactersProps: [{
408
- language: 'spanish'
409
- }, {
410
- language: 'special'
411
- }],
412
- mathMlOptions: mathMlOptions
413
- }), promptError && /*#__PURE__*/_react["default"].createElement("div", {
414
- className: classes.errorText
415
- }, promptError)), /*#__PURE__*/_react["default"].createElement(_categories["default"], {
416
- imageSupport: imageSupport,
417
- uploadSoundSupport: uploadSoundSupport,
295
+ });
296
+ (0, _defineProperty2.default)(this, "moveChoice", (choiceId, from, to, choiceIndex) => {
297
+ const {
298
+ model
299
+ } = this.props;
300
+ let {
301
+ choices,
302
+ correctResponse = [],
303
+ maxChoicesPerCategory = 0
304
+ } = model || {};
305
+ const choice = (choices || []).find(choice => choice.id === choiceId);
306
+ if (to === from || !choice) {
307
+ return;
308
+ }
309
+ if (choice.categoryCount !== 0) {
310
+ correctResponse = (0, _categorize.moveChoiceToCategory)(choice.id, from, to, choiceIndex, correctResponse);
311
+ correctResponse = (0, _categorize.verifyAllowMultiplePlacements)(choice, to, correctResponse);
312
+ } else if (choice.categoryCount === 0) {
313
+ correctResponse = (0, _categorize.moveChoiceToCategory)(choice.id, undefined, to, 0, correctResponse);
314
+ }
315
+ const maxCategoryChoices = (0, _utils2.getMaxCategoryChoices)(model);
316
+ // when maxChoicesPerCategory is set to 0, there is no limit so it should not be updated
317
+ this.updateModel({
318
+ correctResponse,
319
+ maxChoicesPerCategory: maxChoicesPerCategory !== 0 && maxChoicesPerCategory < maxCategoryChoices ? maxChoicesPerCategory + 1 : maxChoicesPerCategory
320
+ });
321
+ });
322
+ // methods for alternate responses
323
+ (0, _defineProperty2.default)(this, "addChoiceToAlternateCategory", (addedChoice, categoryId, altIndex) => {
324
+ const {
325
+ model
326
+ } = this.props;
327
+ const {
328
+ correctResponse,
329
+ choices,
330
+ maxChoicesPerCategory = 0
331
+ } = model;
332
+ const choice = choices.find(c => c.id === addedChoice.id);
333
+ correctResponse.forEach(a => {
334
+ if (a.category === categoryId) {
335
+ a.alternateResponses = a.alternateResponses || [];
336
+ if (a.alternateResponses[altIndex] === undefined) {
337
+ a.alternateResponses[altIndex] = [];
338
+ }
339
+ a.alternateResponses[altIndex].push(addedChoice.id);
340
+ if (choice.categoryCount && choice.categoryCount !== 0) {
341
+ a.alternateResponses[altIndex] = a.alternateResponses[altIndex].reduce((acc, currentValue) => {
342
+ if (currentValue === choice.id) {
343
+ const foundIndex = acc.findIndex(c => c === choice.id);
344
+ if (foundIndex === -1) {
345
+ acc.push(currentValue);
346
+ }
347
+ } else {
348
+ acc.push(currentValue);
349
+ }
350
+ return acc;
351
+ }, []);
352
+ }
353
+ return a;
354
+ } else {
355
+ if (a.alternateResponses[altIndex] && choice.categoryCount !== 0) {
356
+ a.alternateResponses[altIndex] = a.alternateResponses[altIndex].filter(c => c !== addedChoice.id);
357
+ return a;
358
+ }
359
+ }
360
+ return a;
361
+ });
362
+ const maxCategoryChoices = (0, _utils2.getMaxCategoryChoices)(model);
363
+ // when maxChoicesPerCategory is set to 0, there is no limit so it should not be updated
364
+ this.updateModel({
365
+ correctResponse,
366
+ maxChoicesPerCategory: maxChoicesPerCategory !== 0 && maxChoicesPerCategory < maxCategoryChoices ? maxChoicesPerCategory + 1 : maxChoicesPerCategory
367
+ });
368
+ });
369
+ (0, _defineProperty2.default)(this, "moveChoiceInAlternate", (choiceId, from, to, choiceIndex, alternateIndex) => {
370
+ const {
371
+ model
372
+ } = this.props;
373
+ let {
374
+ choices,
375
+ correctResponse = [],
376
+ maxChoicesPerCategory = 0
377
+ } = model || {};
378
+ const choice = (choices || []).find(choice => choice.id === choiceId);
379
+ correctResponse = (0, _categorize.moveChoiceToAlternate)(choiceId, from, to, choiceIndex, correctResponse, alternateIndex, choice?.categoryCount);
380
+ const maxCategoryChoices = (0, _utils2.getMaxCategoryChoices)(model);
381
+ // when maxChoicesPerCategory is set to 0, there is no limit so it should not be updated
382
+ this.updateModel({
383
+ correctResponse,
384
+ maxChoicesPerCategory: maxChoicesPerCategory !== 0 && maxChoicesPerCategory < maxCategoryChoices ? maxChoicesPerCategory + 1 : maxChoicesPerCategory
385
+ });
386
+ });
387
+ (0, _defineProperty2.default)(this, "deleteChoiceFromAlternateCategory", (category, choice, choiceIndex, altIndex) => {
388
+ const {
389
+ model
390
+ } = this.props;
391
+ const correctResponse = (0, _categorize.removeChoiceFromAlternate)(choice.id, category.id, choiceIndex, altIndex, model.correctResponse);
392
+ this.updateModel({
393
+ correctResponse
394
+ });
395
+ });
396
+ (0, _defineProperty2.default)(this, "renderDragOverlay", () => {
397
+ const {
398
+ activeDragItem
399
+ } = this.state;
400
+ const {
401
+ model,
402
+ configuration
403
+ } = this.props;
404
+ if (!activeDragItem) return null;
405
+ if (activeDragItem.type === 'choice') {
406
+ const choice = model.choices?.find(c => c.id === activeDragItem.id);
407
+ if (!choice) return null;
408
+ return /*#__PURE__*/_react.default.createElement(_choice.default, {
409
+ choice: choice,
410
+ configuration: configuration
411
+ });
412
+ } else if (activeDragItem.type === 'choice-preview' && activeDragItem.alternateResponseIndex === undefined) {
413
+ const choice = model.choices?.find(c => c.id === activeDragItem.id);
414
+ if (!choice) return null;
415
+ return /*#__PURE__*/_react.default.createElement(_choicePreview.default, {
416
+ choice: choice
417
+ });
418
+ } else if (activeDragItem.type === 'choice-preview' && activeDragItem.alternateResponseIndex !== undefined) {
419
+ const choice = model.choices?.find(c => c.id === activeDragItem.id);
420
+ if (!choice) return null;
421
+ return /*#__PURE__*/_react.default.createElement(_choicePreview.default, {
422
+ choice: choice,
423
+ alternateResponseIndex: activeDragItem.alternateResponseIndex
424
+ });
425
+ }
426
+ return null;
427
+ });
428
+ this.uid = _props.uid || _drag.uid.generateId();
429
+ this.state = {
430
+ activeDragItem: null
431
+ };
432
+ }
433
+ render() {
434
+ const {
435
+ configuration,
436
+ imageSupport,
437
+ model,
438
+ uploadSoundSupport,
439
+ onConfigurationChanged
440
+ } = this.props;
441
+ const {
442
+ allowAlternate = {},
443
+ allowMultiplePlacements = {},
444
+ baseInputConfiguration = {},
445
+ categoriesPerRow = {},
446
+ choicesPosition = {},
447
+ contentDimensions = {},
448
+ feedback = {},
449
+ lockChoiceOrder = {},
450
+ maxImageHeight = {},
451
+ maxImageWidth = {},
452
+ maxPlacements = {},
453
+ minCategoriesPerRow = 1,
454
+ partialScoring = {},
455
+ prompt = {},
456
+ rationale = {},
457
+ scoringType = {},
458
+ settingsPanelDisabled,
459
+ spellCheck = {},
460
+ studentInstructions = {},
461
+ teacherInstructions = {},
462
+ withRubric = {},
463
+ mathMlOptions = {},
464
+ language = {},
465
+ languageChoices = {},
466
+ allowMaxAnswerChoices = {}
467
+ } = configuration || {};
468
+ const {
469
+ allowAlternateEnabled,
470
+ allowMaxChoicesPerCategory,
471
+ errors,
472
+ feedbackEnabled,
473
+ maxChoicesPerCategory,
474
+ promptEnabled,
475
+ rationaleEnabled,
476
+ spellCheckEnabled,
477
+ teacherInstructionsEnabled,
478
+ toolbarEditorPosition,
479
+ extraCSSRules
480
+ } = model || {};
481
+ const {
482
+ prompt: promptError,
483
+ rationale: rationaleError,
484
+ teacherInstructions: teacherInstructionsError
485
+ } = errors || {};
486
+ const toolbarOpts = {
487
+ position: toolbarEditorPosition === 'top' ? 'top' : 'bottom'
488
+ };
489
+ const config = model.config || {};
490
+ config.choices = config.choices || {
491
+ label: '',
492
+ columns: 2
493
+ };
494
+ const categories = (0, _builder.buildCategories)(model.categories || [], model.choices || [], model.correctResponse || []);
495
+ const alternateResponses = (0, _builder.buildAlternateResponses)(model.categories || [], model.choices || [], model.correctResponse || []);
496
+ const choices = model.choices.map(c => {
497
+ c.correctResponseCount = this.countChoiceInCorrectResponse(c);
498
+ // ensure categoryCount is set even though updatedModel hasn't been called
499
+ c.categoryCount = this.checkAllowMultiplePlacements(model.allowMultiplePlacementsEnabled, c);
500
+ return c;
501
+ });
502
+ const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
503
+ const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
504
+ const panelSettings = {
505
+ partialScoring: partialScoring.settings && toggle(partialScoring.label),
506
+ lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),
507
+ categoriesPerRow: categoriesPerRow.settings && numberField(categoriesPerRow.label, {
508
+ label: categoriesPerRow.label,
509
+ min: minCategoriesPerRow,
510
+ max: 6
511
+ }),
512
+ choicesPosition: choicesPosition.settings && radio(choicesPosition.label, ['below', 'above', 'left', 'right']),
513
+ allowMultiplePlacementsEnabled: allowMultiplePlacements.settings && dropdown(allowMultiplePlacements.label, [_utils2.multiplePlacements.enabled, _utils2.multiplePlacements.disabled, _utils2.multiplePlacements.perChoice]),
514
+ maxAnswerChoices: allowMaxAnswerChoices.settings && numberField(allowMaxAnswerChoices.label, {
515
+ label: '',
516
+ min: choices?.length || 0,
517
+ max: 30
518
+ }),
519
+ allowMaxChoicesPerCategory: maxPlacements.settings && toggle(maxPlacements.label),
520
+ maxChoicesPerCategory: allowMaxChoicesPerCategory === true && numberField(maxPlacements.label, {
521
+ label: '',
522
+ min: 0,
523
+ max: 30
524
+ }),
525
+ promptEnabled: prompt.settings && toggle(prompt.label),
526
+ feedbackEnabled: feedback.settings && toggle(feedback.label),
527
+ allowAlternateEnabled: allowAlternate.settings && toggle(allowAlternate.label),
528
+ 'language.enabled': language.settings && toggle(language.label, true),
529
+ language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options)
530
+ };
531
+ const panelProperties = {
532
+ teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
533
+ studentInstructionsEnabled: studentInstructions.settings && toggle(studentInstructions.label),
534
+ rationaleEnabled: rationale.settings && toggle(rationale.label),
535
+ spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
536
+ scoringType: scoringType.settings && radio(scoringType.label, ['auto', 'rubric']),
537
+ rubricEnabled: withRubric?.settings && toggle(withRubric?.label)
538
+ };
539
+ const isOpened = this.isAlertModalOpened();
540
+ const alertMaxChoicesMsg = translator.t('translation:categorize:maxChoicesPerCategoryRestriction', {
541
+ lng: model.language,
542
+ maxChoicesPerCategory
543
+ });
544
+ return /*#__PURE__*/_react.default.createElement(_drag.DragProvider, {
545
+ onDragStart: this.onDragStart,
546
+ onDragEnd: this.onDragEnd
547
+ }, /*#__PURE__*/_react.default.createElement(IdProvider, {
548
+ value: this.uid
549
+ }, /*#__PURE__*/_react.default.createElement(_configUi.layout.ConfigLayout, {
550
+ extraCSSRules: extraCSSRules,
551
+ dimensions: contentDimensions,
552
+ hideSettings: settingsPanelDisabled,
553
+ settings: /*#__PURE__*/_react.default.createElement(Panel, {
418
554
  model: model,
419
- categories: categories || [],
420
- onModelChanged: this.updateModel,
421
- toolbarOpts: toolbarOpts,
422
- spellCheck: spellCheckEnabled,
555
+ onChangeModel: this.updateModel,
423
556
  configuration: configuration,
424
- defaultImageMaxWidth: defaultImageMaxWidth,
425
- defaultImageMaxHeight: defaultImageMaxHeight,
426
- mathMlOptions: mathMlOptions
427
- }), /*#__PURE__*/_react["default"].createElement(_choices["default"], {
557
+ onChangeConfiguration: onConfigurationChanged,
558
+ groups: {
559
+ Settings: panelSettings,
560
+ Properties: panelProperties
561
+ },
562
+ modal: /*#__PURE__*/_react.default.createElement(_configUi.AlertDialog, {
563
+ title: 'Warning',
564
+ text: alertMaxChoicesMsg,
565
+ open: isOpened,
566
+ onClose: this.onAlertModalCancel
567
+ })
568
+ })
569
+ }, teacherInstructionsEnabled && /*#__PURE__*/_react.default.createElement(StyledInputContainer, {
570
+ label: teacherInstructions.label
571
+ }, /*#__PURE__*/_react.default.createElement(_editableHtmlTipTap.default, {
572
+ markup: model.teacherInstructions || '',
573
+ onChange: this.changeTeacherInstructions,
574
+ imageSupport: imageSupport,
575
+ error: teacherInstructionsError,
576
+ nonEmpty: false,
577
+ toolbarOpts: toolbarOpts,
578
+ pluginProps: (0, _utils.getPluginProps)(teacherInstructions?.inputConfiguration, baseInputConfiguration),
579
+ spellCheck: spellCheckEnabled,
580
+ maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
581
+ maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight,
582
+ uploadSoundSupport: uploadSoundSupport,
583
+ languageCharactersProps: [{
584
+ language: 'spanish'
585
+ }, {
586
+ language: 'special'
587
+ }],
588
+ mathMlOptions: mathMlOptions
589
+ }), teacherInstructionsError && /*#__PURE__*/_react.default.createElement(ErrorText, null, teacherInstructionsError)), promptEnabled && /*#__PURE__*/_react.default.createElement(StyledInputContainer, {
590
+ label: prompt.label
591
+ }, /*#__PURE__*/_react.default.createElement(_editableHtmlTipTap.default, {
592
+ markup: model.prompt || '',
593
+ onChange: this.onPromptChanged,
594
+ imageSupport: imageSupport,
595
+ error: promptError,
596
+ nonEmpty: false,
597
+ disableUnderline: true,
598
+ toolbarOpts: toolbarOpts,
599
+ pluginProps: (0, _utils.getPluginProps)(prompt?.inputConfiguration, baseInputConfiguration),
600
+ spellCheck: spellCheckEnabled,
601
+ maxImageWidth: maxImageWidth && maxImageWidth.prompt,
602
+ maxImageHeight: maxImageHeight && maxImageHeight.prompt,
603
+ uploadSoundSupport: uploadSoundSupport,
604
+ languageCharactersProps: [{
605
+ language: 'spanish'
606
+ }, {
607
+ language: 'special'
608
+ }],
609
+ mathMlOptions: mathMlOptions
610
+ }), promptError && /*#__PURE__*/_react.default.createElement(ErrorText, null, promptError)), /*#__PURE__*/_react.default.createElement(_categories.default, {
611
+ imageSupport: imageSupport,
612
+ uploadSoundSupport: uploadSoundSupport,
613
+ model: model,
614
+ categories: categories || [],
615
+ onModelChanged: this.updateModel,
616
+ toolbarOpts: toolbarOpts,
617
+ spellCheck: spellCheckEnabled,
618
+ configuration: configuration,
619
+ defaultImageMaxWidth: defaultImageMaxWidth,
620
+ defaultImageMaxHeight: defaultImageMaxHeight,
621
+ mathMlOptions: mathMlOptions
622
+ }), /*#__PURE__*/_react.default.createElement(_choices.default, {
623
+ imageSupport: imageSupport,
624
+ uploadSoundSupport: uploadSoundSupport,
625
+ choices: choices,
626
+ model: model,
627
+ onModelChanged: this.updateModel,
628
+ toolbarOpts: toolbarOpts,
629
+ spellCheck: spellCheckEnabled,
630
+ configuration: configuration,
631
+ defaultImageMaxWidth: defaultImageMaxWidth,
632
+ defaultImageMaxHeight: defaultImageMaxHeight
633
+ }), allowAlternateEnabled && /*#__PURE__*/_react.default.createElement(StyledHeader, {
634
+ label: "Alternate Responses",
635
+ buttonLabel: "ADD AN ALTERNATE RESPONSE",
636
+ onAdd: this.onAddAlternateResponse
637
+ }), allowAlternateEnabled && alternateResponses.map((categoriesList, index) => {
638
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
639
+ key: index
640
+ }, /*#__PURE__*/_react.default.createElement(StyledHeader, {
641
+ variant: 'subtitle1',
642
+ label: "Alternate Response",
643
+ buttonLabel: "REMOVE ALTERNATE RESPONSE",
644
+ onAdd: () => this.onRemoveAlternateResponse(index)
645
+ }), /*#__PURE__*/_react.default.createElement(_alternateResponses.default, {
646
+ altIndex: index,
428
647
  imageSupport: imageSupport,
429
- uploadSoundSupport: uploadSoundSupport,
430
- choices: choices,
431
648
  model: model,
432
- onModelChanged: this.updateModel,
433
- toolbarOpts: toolbarOpts,
434
- spellCheck: spellCheckEnabled,
435
649
  configuration: configuration,
436
- defaultImageMaxWidth: defaultImageMaxWidth,
437
- defaultImageMaxHeight: defaultImageMaxHeight
438
- }), allowAlternateEnabled && /*#__PURE__*/_react["default"].createElement(_header["default"], {
439
- className: classes.alternatesHeader,
440
- label: "Alternate Responses",
441
- buttonLabel: "ADD AN ALTERNATE RESPONSE",
442
- onAdd: this.onAddAlternateResponse
443
- }), allowAlternateEnabled && alternateResponses.map(function (categoriesList, index) {
444
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, {
445
- key: index
446
- }, /*#__PURE__*/_react["default"].createElement(_header["default"], {
447
- className: classes.alternatesHeader,
448
- variant: 'subtitle1',
449
- label: "Alternate Response",
450
- buttonLabel: "REMOVE ALTERNATE RESPONSE",
451
- onAdd: function onAdd() {
452
- return _this2.onRemoveAlternateResponse(index);
453
- }
454
- }), /*#__PURE__*/_react["default"].createElement(_alternateResponses["default"], {
455
- altIndex: index,
456
- imageSupport: imageSupport,
457
- model: model,
458
- configuration: configuration,
459
- categories: categoriesList,
460
- onModelChanged: _this2.updateModel,
461
- uploadSoundSupport: uploadSoundSupport,
462
- mathMlOptions: mathMlOptions
463
- }));
464
- }), rationaleEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
465
- label: rationale.label,
466
- className: classes.inputContainer
467
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
468
- className: classes.input,
469
- markup: model.rationale || '',
470
- onChange: this.changeRationale,
471
- imageSupport: imageSupport,
472
- error: rationaleError,
473
- nonEmpty: false,
474
- toolbarOpts: toolbarOpts,
475
- pluginProps: (0, _utils.getPluginProps)(prompt === null || prompt === void 0 ? void 0 : prompt.inputConfiguration, baseInputConfiguration),
476
- spellCheck: spellCheckEnabled,
477
- maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
478
- maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight,
650
+ categories: categoriesList,
651
+ onModelChanged: this.updateModel,
479
652
  uploadSoundSupport: uploadSoundSupport,
480
- languageCharactersProps: [{
481
- language: 'spanish'
482
- }, {
483
- language: 'special'
484
- }],
485
653
  mathMlOptions: mathMlOptions
486
- }), rationaleError && /*#__PURE__*/_react["default"].createElement("div", {
487
- className: classes.errorText
488
- }, rationaleError)), feedbackEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.FeedbackConfig, {
489
- feedback: model.feedback,
490
- onChange: this.changeFeedback,
491
- toolbarOpts: toolbarOpts
492
- })));
493
- }
494
- }]);
495
- return Design;
496
- }(_react["default"].Component);
497
-
654
+ }));
655
+ }), rationaleEnabled && /*#__PURE__*/_react.default.createElement(StyledInputContainer, {
656
+ label: rationale.label
657
+ }, /*#__PURE__*/_react.default.createElement(_editableHtmlTipTap.default, {
658
+ markup: model.rationale || '',
659
+ onChange: this.changeRationale,
660
+ imageSupport: imageSupport,
661
+ error: rationaleError,
662
+ nonEmpty: false,
663
+ toolbarOpts: toolbarOpts,
664
+ pluginProps: (0, _utils.getPluginProps)(prompt?.inputConfiguration, baseInputConfiguration),
665
+ spellCheck: spellCheckEnabled,
666
+ maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
667
+ maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight,
668
+ uploadSoundSupport: uploadSoundSupport,
669
+ languageCharactersProps: [{
670
+ language: 'spanish'
671
+ }, {
672
+ language: 'special'
673
+ }],
674
+ mathMlOptions: mathMlOptions
675
+ }), rationaleError && /*#__PURE__*/_react.default.createElement(ErrorText, null, rationaleError)), feedbackEnabled && /*#__PURE__*/_react.default.createElement(_configUi.FeedbackConfig, {
676
+ feedback: model.feedback,
677
+ onChange: this.changeFeedback,
678
+ toolbarOpts: toolbarOpts
679
+ })), /*#__PURE__*/_react.default.createElement(_core.DragOverlay, null, /*#__PURE__*/_react.default.createElement(DragPreviewWrapper, null, this.renderDragOverlay()))));
680
+ }
681
+ }
498
682
  exports.Design = Design;
499
- (0, _defineProperty2["default"])(Design, "propTypes", {
500
- classes: _propTypes["default"].object.isRequired,
501
- configuration: _propTypes["default"].object,
502
- className: _propTypes["default"].string,
503
- onConfigurationChanged: _propTypes["default"].func,
504
- model: _propTypes["default"].object.isRequired,
505
- onChange: _propTypes["default"].func.isRequired,
506
- uid: _propTypes["default"].string,
507
- imageSupport: _propTypes["default"].shape({
508
- add: _propTypes["default"].func.isRequired,
509
- "delete": _propTypes["default"].func.isRequired
683
+ (0, _defineProperty2.default)(Design, "propTypes", {
684
+ configuration: _propTypes.default.object,
685
+ className: _propTypes.default.string,
686
+ onConfigurationChanged: _propTypes.default.func,
687
+ model: _propTypes.default.object.isRequired,
688
+ onChange: _propTypes.default.func.isRequired,
689
+ uid: _propTypes.default.string,
690
+ imageSupport: _propTypes.default.shape({
691
+ add: _propTypes.default.func.isRequired,
692
+ delete: _propTypes.default.func.isRequired
510
693
  }),
511
- uploadSoundSupport: _propTypes["default"].shape({
512
- add: _propTypes["default"].func.isRequired,
513
- "delete": _propTypes["default"].func.isRequired
694
+ uploadSoundSupport: _propTypes.default.shape({
695
+ add: _propTypes.default.func.isRequired,
696
+ delete: _propTypes.default.func.isRequired
514
697
  })
515
698
  });
516
-
517
- var styles = function styles(theme) {
518
- return {
519
- alternatesHeader: {
520
- marginBottom: theme.spacing.unit * 2
521
- },
522
- text: {
523
- paddingTop: theme.spacing.unit * 2,
524
- paddingBottom: theme.spacing.unit * 2
525
- },
526
- inputContainer: {
527
- width: '100%',
528
- paddingTop: theme.spacing.unit * 2,
529
- marginBottom: theme.spacing.unit * 2
530
- },
531
- title: {
532
- marginBottom: theme.spacing.unit * 4
533
- },
534
- errorText: {
535
- fontSize: theme.typography.fontSize - 2,
536
- color: theme.palette.error.main,
537
- paddingTop: theme.spacing.unit
538
- }
539
- };
540
- };
541
-
542
- var _default = (0, _drag.withDragContext)((0, _styles.withStyles)(styles)(Design));
543
-
544
- exports["default"] = _default;
545
- //# sourceMappingURL=index.js.map
699
+ var _default = exports.default = Design;
700
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9wcm9wVHlwZXMiLCJfc3R5bGVzIiwiX2NvcmUiLCJfY29uZmlnVWkiLCJfY2F0ZWdvcml6ZSIsIl9lZGl0YWJsZUh0bWxUaXBUYXAiLCJfZHJhZyIsIl9tYXRoUmVuZGVyaW5nIiwiX2NhdGVnb3JpZXMiLCJfYWx0ZXJuYXRlUmVzcG9uc2VzIiwiX2Nob2ljZXMiLCJfY2hvaWNlIiwiX2Nob2ljZVByZXZpZXciLCJfYnVpbGRlciIsIl9oZWFkZXIiLCJfdXRpbHMyIiwiX3RyYW5zbGF0b3IiLCJ0cmFuc2xhdG9yIiwiVHJhbnNsYXRvciIsImRyb3Bkb3duIiwiUGFuZWwiLCJ0b2dnbGUiLCJyYWRpbyIsIm51bWJlckZpZWxkIiwic2V0dGluZ3MiLCJQcm92aWRlciIsIklkUHJvdmlkZXIiLCJ1aWQiLCJEcmFnUHJldmlld1dyYXBwZXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiY3JlYXRlUmVmIiwiY29tcG9uZW50RGlkTW91bnQiLCJjb250YWluZXJSZWYiLCJjdXJyZW50Iiwic2V0VGltZW91dCIsInJlbmRlck1hdGgiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwicmVmIiwicHJvcHMiLCJjaGlsZHJlbiIsIlN0eWxlZEhlYWRlciIsInN0eWxlZCIsIkhlYWRlciIsInRoZW1lIiwibWFyZ2luQm90dG9tIiwic3BhY2luZyIsIlN0eWxlZElucHV0Q29udGFpbmVyIiwiSW5wdXRDb250YWluZXIiLCJ3aWR0aCIsInBhZGRpbmdUb3AiLCJFcnJvclRleHQiLCJmb250U2l6ZSIsInR5cG9ncmFwaHkiLCJjb2xvciIsInBhbGV0dGUiLCJlcnJvciIsIm1haW4iLCJEZXNpZ24iLCJtb2RlbCIsIm9uQ2hhbmdlIiwidXBkYXRlZE1vZGVsIiwiY2hvaWNlcyIsIm1hcCIsImMiLCJjYXRlZ29yeUNvdW50IiwiY2hlY2tBbGxvd011bHRpcGxlUGxhY2VtZW50cyIsImFsbG93TXVsdGlwbGVQbGFjZW1lbnRzRW5hYmxlZCIsImNvcnJlY3RSZXNwb25zZSIsImVuc3VyZU5vRXh0cmFDaG9pY2VzSW5BbnN3ZXIiLCJlbnN1cmVOb0V4dHJhQ2hvaWNlc0luQWx0ZXJuYXRlIiwiY2F0ZWdvcmllcyIsImlkIiwibGFiZWwiLCJoIiwiY29udGVudCIsIm1heENob2ljZXNQZXJDYXRlZ29yeSIsImFsbG93TWF4Q2hvaWNlc1BlckNhdGVnb3J5IiwicmF0aW9uYWxlIiwidGVhY2hlckluc3RydWN0aW9ucyIsImZlZWRiYWNrIiwidXBkYXRlTW9kZWwiLCJjciIsImFsdGVybmF0ZVJlc3BvbnNlcyIsInByb21wdCIsImluZGV4IiwiZmlsdGVyIiwiYWx0IiwiYWx0SW5kZXgiLCJjaG9pY2UiLCJjb3VudEluQW5zd2VyIiwiYWxsb3dNdWx0aXBsZVBsYWNlbWVudHMiLCJtdWx0aXBsZVBsYWNlbWVudHMiLCJlbmFibGVkIiwiZGlzYWJsZWQiLCJtYXhDaG9pY2VzIiwiZ2V0TWF4Q2F0ZWdvcnlDaG9pY2VzIiwiZXZlbnQiLCJhY3RpdmUiLCJkcmFnZ2VkSXRlbSIsImRhdGEiLCJzZXRTdGF0ZSIsImFjdGl2ZURyYWdJdGVtIiwib3ZlciIsImFsbG93QWx0ZXJuYXRlRW5hYmxlZCIsImFjdGl2ZURhdGEiLCJvdmVyRGF0YSIsInR5cGUiLCJjaG9pY2VJZCIsInNwbGl0IiwibW92ZUNob2ljZSIsImNhdGVnb3J5SWQiLCJjaG9pY2VJbmRleCIsImFkZENob2ljZVRvQ2F0ZWdvcnkiLCJ0b0FsdGVybmF0ZUluZGV4IiwiYWx0ZXJuYXRlUmVzcG9uc2VJbmRleCIsIm1vdmVDaG9pY2VJbkFsdGVybmF0ZSIsInRvQWx0ZXJuYXRlUmVzcG9uc2VJbmRleCIsImFkZENob2ljZVRvQWx0ZXJuYXRlQ2F0ZWdvcnkiLCJhZGRlZENob2ljZSIsImZpbmQiLCJuZXdDb3JyZWN0UmVzcG9uc2UiLCJtb3ZlQ2hvaWNlVG9DYXRlZ29yeSIsInVuZGVmaW5lZCIsInZlcmlmeUFsbG93TXVsdGlwbGVQbGFjZW1lbnRzIiwibWF4Q2F0ZWdvcnlDaG9pY2VzIiwiY2F0ZWdvcnkiLCJyZW1vdmVDaG9pY2VGcm9tQ2F0ZWdvcnkiLCJmcm9tIiwidG8iLCJmb3JFYWNoIiwiYSIsInB1c2giLCJyZWR1Y2UiLCJhY2MiLCJjdXJyZW50VmFsdWUiLCJmb3VuZEluZGV4IiwiZmluZEluZGV4IiwiYWx0ZXJuYXRlSW5kZXgiLCJtb3ZlQ2hvaWNlVG9BbHRlcm5hdGUiLCJyZW1vdmVDaG9pY2VGcm9tQWx0ZXJuYXRlIiwic3RhdGUiLCJjb25maWd1cmF0aW9uIiwiZ2VuZXJhdGVJZCIsImltYWdlU3VwcG9ydCIsInVwbG9hZFNvdW5kU3VwcG9ydCIsIm9uQ29uZmlndXJhdGlvbkNoYW5nZWQiLCJhbGxvd0FsdGVybmF0ZSIsImJhc2VJbnB1dENvbmZpZ3VyYXRpb24iLCJjYXRlZ29yaWVzUGVyUm93IiwiY2hvaWNlc1Bvc2l0aW9uIiwiY29udGVudERpbWVuc2lvbnMiLCJsb2NrQ2hvaWNlT3JkZXIiLCJtYXhJbWFnZUhlaWdodCIsIm1heEltYWdlV2lkdGgiLCJtYXhQbGFjZW1lbnRzIiwibWluQ2F0ZWdvcmllc1BlclJvdyIsInBhcnRpYWxTY29yaW5nIiwic2NvcmluZ1R5cGUiLCJzZXR0aW5nc1BhbmVsRGlzYWJsZWQiLCJzcGVsbENoZWNrIiwic3R1ZGVudEluc3RydWN0aW9ucyIsIndpdGhSdWJyaWMiLCJtYXRoTWxPcHRpb25zIiwibGFuZ3VhZ2UiLCJsYW5ndWFnZUNob2ljZXMiLCJhbGxvd01heEFuc3dlckNob2ljZXMiLCJlcnJvcnMiLCJmZWVkYmFja0VuYWJsZWQiLCJwcm9tcHRFbmFibGVkIiwicmF0aW9uYWxlRW5hYmxlZCIsInNwZWxsQ2hlY2tFbmFibGVkIiwidGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQiLCJ0b29sYmFyRWRpdG9yUG9zaXRpb24iLCJleHRyYUNTU1J1bGVzIiwicHJvbXB0RXJyb3IiLCJyYXRpb25hbGVFcnJvciIsInRlYWNoZXJJbnN0cnVjdGlvbnNFcnJvciIsInRvb2xiYXJPcHRzIiwicG9zaXRpb24iLCJjb25maWciLCJjb2x1bW5zIiwiYnVpbGRDYXRlZ29yaWVzIiwiYnVpbGRBbHRlcm5hdGVSZXNwb25zZXMiLCJjb3JyZWN0UmVzcG9uc2VDb3VudCIsImNvdW50Q2hvaWNlSW5Db3JyZWN0UmVzcG9uc2UiLCJkZWZhdWx0SW1hZ2VNYXhXaWR0aCIsImRlZmF1bHRJbWFnZU1heEhlaWdodCIsInBhbmVsU2V0dGluZ3MiLCJtaW4iLCJtYXgiLCJwZXJDaG9pY2UiLCJtYXhBbnN3ZXJDaG9pY2VzIiwibGVuZ3RoIiwib3B0aW9ucyIsInBhbmVsUHJvcGVydGllcyIsInN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkIiwicnVicmljRW5hYmxlZCIsImlzT3BlbmVkIiwiaXNBbGVydE1vZGFsT3BlbmVkIiwiYWxlcnRNYXhDaG9pY2VzTXNnIiwidCIsImxuZyIsIkRyYWdQcm92aWRlciIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnRW5kIiwidmFsdWUiLCJsYXlvdXQiLCJDb25maWdMYXlvdXQiLCJkaW1lbnNpb25zIiwiaGlkZVNldHRpbmdzIiwib25DaGFuZ2VNb2RlbCIsIm9uQ2hhbmdlQ29uZmlndXJhdGlvbiIsImdyb3VwcyIsIlNldHRpbmdzIiwiUHJvcGVydGllcyIsIm1vZGFsIiwiQWxlcnREaWFsb2ciLCJ0aXRsZSIsInRleHQiLCJvcGVuIiwib25DbG9zZSIsIm9uQWxlcnRNb2RhbENhbmNlbCIsIm1hcmt1cCIsImNoYW5nZVRlYWNoZXJJbnN0cnVjdGlvbnMiLCJub25FbXB0eSIsInBsdWdpblByb3BzIiwiZ2V0UGx1Z2luUHJvcHMiLCJpbnB1dENvbmZpZ3VyYXRpb24iLCJsYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyIsIm9uUHJvbXB0Q2hhbmdlZCIsImRpc2FibGVVbmRlcmxpbmUiLCJvbk1vZGVsQ2hhbmdlZCIsImJ1dHRvbkxhYmVsIiwib25BZGQiLCJvbkFkZEFsdGVybmF0ZVJlc3BvbnNlIiwiY2F0ZWdvcmllc0xpc3QiLCJGcmFnbWVudCIsImtleSIsInZhcmlhbnQiLCJvblJlbW92ZUFsdGVybmF0ZVJlc3BvbnNlIiwiY2hhbmdlUmF0aW9uYWxlIiwiRmVlZGJhY2tDb25maWciLCJjaGFuZ2VGZWVkYmFjayIsIkRyYWdPdmVybGF5IiwicmVuZGVyRHJhZ092ZXJsYXkiLCJleHBvcnRzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiY2xhc3NOYW1lIiwic3RyaW5nIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJzaGFwZSIsImFkZCIsImRlbGV0ZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rlc2lnbi9pbmRleC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0UGx1Z2luUHJvcHMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IHsgRHJhZ092ZXJsYXkgfSBmcm9tICdAZG5kLWtpdC9jb3JlJztcbmltcG9ydCB7IEZlZWRiYWNrQ29uZmlnLCBJbnB1dENvbnRhaW5lciwgbGF5b3V0LCBzZXR0aW5ncyB9IGZyb20gJ0BwaWUtbGliL2NvbmZpZy11aSc7XG5pbXBvcnQge1xuICBjb3VudEluQW5zd2VyLFxuICBlbnN1cmVOb0V4dHJhQ2hvaWNlc0luQW5zd2VyLFxuICBlbnN1cmVOb0V4dHJhQ2hvaWNlc0luQWx0ZXJuYXRlLFxuICBtb3ZlQ2hvaWNlVG9DYXRlZ29yeSxcbiAgbW92ZUNob2ljZVRvQWx0ZXJuYXRlLFxuICByZW1vdmVDaG9pY2VGcm9tQ2F0ZWdvcnksXG4gIHJlbW92ZUNob2ljZUZyb21BbHRlcm5hdGUsXG4gIHZlcmlmeUFsbG93TXVsdGlwbGVQbGFjZW1lbnRzLFxufSBmcm9tICdAcGllLWxpYi9jYXRlZ29yaXplJztcbmltcG9ydCBFZGl0YWJsZUh0bWwgZnJvbSAnQHBpZS1saWIvZWRpdGFibGUtaHRtbC10aXAtdGFwJztcbmltcG9ydCB7IERyYWdQcm92aWRlciwgdWlkIH0gZnJvbSAnQHBpZS1saWIvZHJhZyc7XG5pbXBvcnQgeyByZW5kZXJNYXRoIH0gZnJvbSAnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnO1xuXG5pbXBvcnQgQ2F0ZWdvcmllcyBmcm9tICcuL2NhdGVnb3JpZXMnO1xuaW1wb3J0IEFsdGVybmF0ZVJlc3BvbnNlcyBmcm9tICcuL2NhdGVnb3JpZXMvYWx0ZXJuYXRlUmVzcG9uc2VzJztcbmltcG9ydCBDaG9pY2VzIGZyb20gJy4vY2hvaWNlcyc7XG5pbXBvcnQgQ2hvaWNlIGZyb20gJy4vY2hvaWNlcy9jaG9pY2UnO1xuaW1wb3J0IENob2ljZVByZXZpZXcgZnJvbSAnLi9jYXRlZ29yaWVzL2Nob2ljZS1wcmV2aWV3JztcbmltcG9ydCB7IGJ1aWxkQWx0ZXJuYXRlUmVzcG9uc2VzLCBidWlsZENhdGVnb3JpZXMgfSBmcm9tICcuL2J1aWxkZXInO1xuaW1wb3J0IEhlYWRlciBmcm9tICcuL2hlYWRlcic7XG5pbXBvcnQgeyBnZXRNYXhDYXRlZ29yeUNob2ljZXMsIG11bHRpcGxlUGxhY2VtZW50cyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nIH0gZnJvbSAnQHBpZS1saWIvY29uZmlnLXVpJztcbmltcG9ydCBUcmFuc2xhdG9yIGZyb20gJ0BwaWUtbGliL3RyYW5zbGF0b3InO1xuXG5jb25zdCB7IHRyYW5zbGF0b3IgfSA9IFRyYW5zbGF0b3I7XG5jb25zdCB7IGRyb3Bkb3duLCBQYW5lbCwgdG9nZ2xlLCByYWRpbywgbnVtYmVyRmllbGQgfSA9IHNldHRpbmdzO1xuY29uc3QgeyBQcm92aWRlcjogSWRQcm92aWRlciB9ID0gdWlkO1xuXG4vLyBTaW1wbGUgd3JhcHBlciB0byByZW5kZXIgbWF0aCBpbiBEcmFnT3ZlcmxheSBwb3J0YWxcbmNsYXNzIERyYWdQcmV2aWV3V3JhcHBlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHJlbmRlck1hdGgodGhpcy5jb250YWluZXJSZWYuY3VycmVudCksIDApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gPGRpdiByZWY9e3RoaXMuY29udGFpbmVyUmVmfT57dGhpcy5wcm9wcy5jaGlsZHJlbn08L2Rpdj47XG4gIH1cbn1cblxuY29uc3QgU3R5bGVkSGVhZGVyID0gc3R5bGVkKEhlYWRlcikoKHsgdGhlbWUgfSkgPT4gKHtcbiAgbWFyZ2luQm90dG9tOiB0aGVtZS5zcGFjaW5nKDIpLFxufSkpO1xuXG5jb25zdCBTdHlsZWRJbnB1dENvbnRhaW5lciA9IHN0eWxlZChJbnB1dENvbnRhaW5lcikoKHsgdGhlbWUgfSkgPT4gKHtcbiAgd2lkdGg6ICcxMDAlJyxcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygyKSxcbiAgbWFyZ2luQm90dG9tOiB0aGVtZS5zcGFjaW5nKDIpLFxufSkpO1xuXG5jb25zdCBFcnJvclRleHQgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRTaXplIC0gMixcbiAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSxcbn0pKTtcblxuZXhwb3J0IGNsYXNzIERlc2lnbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgY29uZmlndXJhdGlvbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgbW9kZWw6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB1aWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgaW1hZ2VTdXBwb3J0OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYWRkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgZGVsZXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIH0pLFxuICAgIHVwbG9hZFNvdW5kU3VwcG9ydDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGFkZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGRlbGV0ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB9KSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnVpZCA9IHByb3BzLnVpZCB8fCB1aWQuZ2VuZXJhdGVJZCgpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBhY3RpdmVEcmFnSXRlbTogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlTW9kZWwgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsLCBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbCA9IHtcbiAgICAgIC4uLm1vZGVsLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfTtcblxuICAgIHVwZGF0ZWRNb2RlbC5jaG9pY2VzID0gdXBkYXRlZE1vZGVsLmNob2ljZXMubWFwKChjKSA9PiAoe1xuICAgICAgLi4uYyxcbiAgICAgIGNhdGVnb3J5Q291bnQ6IHRoaXMuY2hlY2tBbGxvd011bHRpcGxlUGxhY2VtZW50cyh1cGRhdGVkTW9kZWwuYWxsb3dNdWx0aXBsZVBsYWNlbWVudHNFbmFibGVkLCBjKSxcbiAgICB9KSk7XG5cbiAgICAvL0Vuc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBleHRyYSBjaG9pY2VzIGluIGNvcnJlY3RSZXNwb25zZSwgaWYgdGhlIHVzZXIgaGFzIGRlY2lkZWQgdGhhdCBvbmx5IG9uZSBjaG9pY2UgbWF5IGJlIHVzZWQuXG4gICAgdXBkYXRlZE1vZGVsLmNvcnJlY3RSZXNwb25zZSA9IGVuc3VyZU5vRXh0cmFDaG9pY2VzSW5BbnN3ZXIoXG4gICAgICB1cGRhdGVkTW9kZWwuY29ycmVjdFJlc3BvbnNlIHx8IFtdLFxuICAgICAgdXBkYXRlZE1vZGVsLmNob2ljZXMsXG4gICAgKTtcblxuICAgIC8vRW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGV4dHJhIGNob2ljZXMgaW4gYWx0ZXJuYXRlIHJlc3BvbnNlcywgaWYgdGhlIHVzZXIgaGFzIGRlY2lkZWQgdGhhdCBvbmx5IG9uZSBjaG9pY2UgbWF5IGJlIHVzZWQuXG4gICAgdXBkYXRlZE1vZGVsLmNvcnJlY3RSZXNwb25zZSA9IGVuc3VyZU5vRXh0cmFDaG9pY2VzSW5BbHRlcm5hdGUoXG4gICAgICB1cGRhdGVkTW9kZWwuY29ycmVjdFJlc3BvbnNlIHx8IFtdLFxuICAgICAgdXBkYXRlZE1vZGVsLmNob2ljZXMsXG4gICAgKTtcblxuICAgIC8vY2xlYW4gY2F0ZWdvcmllc1xuICAgIHVwZGF0ZWRNb2RlbC5jYXRlZ29yaWVzID0gdXBkYXRlZE1vZGVsLmNhdGVnb3JpZXMubWFwKChjKSA9PiAoe1xuICAgICAgaWQ6IGMuaWQsXG4gICAgICBsYWJlbDogYy5sYWJlbCxcbiAgICB9KSk7XG5cbiAgICB1cGRhdGVkTW9kZWwuY2hvaWNlcyA9IHVwZGF0ZWRNb2RlbC5jaG9pY2VzLm1hcCgoaCkgPT4gKHtcbiAgICAgIGlkOiBoLmlkLFxuICAgICAgY29udGVudDogaC5jb250ZW50LFxuICAgICAgY2F0ZWdvcnlDb3VudDogaC5jYXRlZ29yeUNvdW50LFxuICAgIH0pKTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IG1heENob2ljZXNQZXJDYXRlZ29yeSBpcyByZXNldCBpZiBhdXRob3Igc3dpdGNoIGJhY2sgdGhlIGNvcnJlc3BvbmRpbmcgc3dpdGNoIChhbGxvd01heENob2ljZXNQZXJDYXRlZ29yeSlcbiAgICB1cGRhdGVkTW9kZWwubWF4Q2hvaWNlc1BlckNhdGVnb3J5ID0gdXBkYXRlZE1vZGVsLmFsbG93TWF4Q2hvaWNlc1BlckNhdGVnb3J5XG4gICAgICA/IHVwZGF0ZWRNb2RlbC5tYXhDaG9pY2VzUGVyQ2F0ZWdvcnlcbiAgICAgIDogMDtcblxuICAgIG9uQ2hhbmdlKHVwZGF0ZWRNb2RlbCk7XG4gIH07XG5cbiAgY2hhbmdlUmF0aW9uYWxlID0gKHJhdGlvbmFsZSkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwsIG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgb25DaGFuZ2Uoe1xuICAgICAgLi4ubW9kZWwsXG4gICAgICByYXRpb25hbGUsXG4gICAgfSk7XG4gIH07XG5cbiAgY2hhbmdlVGVhY2hlckluc3RydWN0aW9ucyA9ICh0ZWFjaGVySW5zdHJ1Y3Rpb25zKSA9PiB7XG4gICAgY29uc3QgeyBtb2RlbCwgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBvbkNoYW5nZSh7XG4gICAgICAuLi5tb2RlbCxcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnMsXG4gICAgfSk7XG4gIH07XG5cbiAgY2hhbmdlRmVlZGJhY2sgPSAoZmVlZGJhY2spID0+IHtcbiAgICB0aGlzLnVwZGF0ZU1vZGVsKHsgZmVlZGJhY2sgfSk7XG4gIH07XG5cbiAgb25BZGRBbHRlcm5hdGVSZXNwb25zZSA9ICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBtb2RlbDogeyBjb3JyZWN0UmVzcG9uc2UgfSxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIHRoaXMudXBkYXRlTW9kZWwoe1xuICAgICAgY29ycmVjdFJlc3BvbnNlOiAoY29ycmVjdFJlc3BvbnNlIHx8IFtdKS5tYXAoKGNyKSA9PiAoe1xuICAgICAgICAuLi5jcixcbiAgICAgICAgYWx0ZXJuYXRlUmVzcG9uc2VzOiBbLi4uKGNyLmFsdGVybmF0ZVJlc3BvbnNlcyB8fCBbXSksIFtdXSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfTtcblxuICBvblByb21wdENoYW5nZWQgPSAocHJvbXB0KSA9PiB0aGlzLnVwZGF0ZU1vZGVsKHsgcHJvbXB0IH0pO1xuXG4gIG9uUmVtb3ZlQWx0ZXJuYXRlUmVzcG9uc2UgPSAoaW5kZXgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBtb2RlbDogeyBjb3JyZWN0UmVzcG9uc2UgfSxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIHRoaXMudXBkYXRlTW9kZWwoe1xuICAgICAgY29ycmVjdFJlc3BvbnNlOiAoY29ycmVjdFJlc3BvbnNlIHx8IFtdKS5tYXAoKGNyKSA9PiAoe1xuICAgICAgICAuLi5jcixcbiAgICAgICAgYWx0ZXJuYXRlUmVzcG9uc2VzOiAoY3IuYWx0ZXJuYXRlUmVzcG9uc2VzIHx8IFtdKS5maWx0ZXIoKGFsdCwgYWx0SW5kZXgpID0+IGFsdEluZGV4ICE9PSBpbmRleCksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH07XG5cbiAgY291bnRDaG9pY2VJbkNvcnJlY3RSZXNwb25zZSA9IChjaG9pY2UpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIGNvdW50SW5BbnN3ZXIoY2hvaWNlLmlkLCBtb2RlbC5jb3JyZWN0UmVzcG9uc2UpO1xuICB9O1xuXG4gIGNoZWNrQWxsb3dNdWx0aXBsZVBsYWNlbWVudHMgPSAoYWxsb3dNdWx0aXBsZVBsYWNlbWVudHMsIGMpID0+IHtcbiAgICBpZiAoYWxsb3dNdWx0aXBsZVBsYWNlbWVudHMgPT09IG11bHRpcGxlUGxhY2VtZW50cy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dNdWx0aXBsZVBsYWNlbWVudHMgPT09IG11bHRpcGxlUGxhY2VtZW50cy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGMuY2F0ZWdvcnlDb3VudCB8fCAwO1xuICB9O1xuXG4gIGlzQWxlcnRNb2RhbE9wZW5lZCA9ICgpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgbWF4Q2hvaWNlc1BlckNhdGVnb3J5ID0gMCB9ID0gbW9kZWwgfHwge307XG4gICAgY29uc3QgbWF4Q2hvaWNlcyA9IGdldE1heENhdGVnb3J5Q2hvaWNlcyhtb2RlbCk7XG4gICAgLy8gd2hlbiBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnkgaXMgc2V0IHRvIDAsIHRoZXJlIGlzIG5vIGxpbWl0IHNvIG1vZGFsIHNob3VsZCBub3QgYmUgb3BlbmVkXG4gICAgcmV0dXJuIG1heENob2ljZXNQZXJDYXRlZ29yeSAhPT0gMCA/IG1heENob2ljZXMgPiBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnkgOiBmYWxzZTtcbiAgfTtcblxuICBvbkFsZXJ0TW9kYWxDYW5jZWwgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBtb2RlbCB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtYXhDaG9pY2VzID0gZ2V0TWF4Q2F0ZWdvcnlDaG9pY2VzKG1vZGVsKTtcbiAgICB0aGlzLnVwZGF0ZU1vZGVsKHsgbWF4Q2hvaWNlc1BlckNhdGVnb3J5OiBtYXhDaG9pY2VzIH0pO1xuICB9O1xuXG4gIG9uRHJhZ1N0YXJ0ID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBhY3RpdmUgfSA9IGV2ZW50O1xuICAgIGNvbnN0IGRyYWdnZWRJdGVtID0gYWN0aXZlLmRhdGEuY3VycmVudDtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYWN0aXZlRHJhZ0l0ZW06IGRyYWdnZWRJdGVtLFxuICAgIH0pO1xuICB9O1xuXG4gIG9uRHJhZ0VuZCA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgYWN0aXZlLCBvdmVyIH0gPSBldmVudDtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBhY3RpdmVEcmFnSXRlbTogbnVsbCB9KTtcblxuICAgIGlmICghb3ZlciB8fCAhYWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBtb2RlbCB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGFsbG93QWx0ZXJuYXRlRW5hYmxlZCB9ID0gbW9kZWw7XG4gICAgY29uc3QgYWN0aXZlRGF0YSA9IGFjdGl2ZS5kYXRhLmN1cnJlbnQ7XG4gICAgY29uc3Qgb3ZlckRhdGEgPSBvdmVyLmRhdGEuY3VycmVudDtcblxuICAgIC8vIG1vdmluZyBhIGNob2ljZSBiZXR3ZWVuIGNhdGVnb3JpZXMgKGNvcnJlY3QgcmVzcG9uc2UpXG4gICAgaWYgKGFjdGl2ZURhdGEudHlwZSA9PT0gJ2Nob2ljZS1wcmV2aWV3JyAmJiBvdmVyRGF0YS50eXBlID09PSAnY2F0ZWdvcnknKSB7XG4gICAgICAvLyBFeHRyYWN0IG9yaWdpbmFsIGNob2ljZS5pZCAtIGlmIERyYWdnYWJsZUNob2ljZSB1c2VzIHRoZSB1bmlxdWUgaWQgaW4gZGF0YSwgZXh0cmFjdCB0aGUgZmlyc3QgcGFydFxuICAgICAgLy8gRm9ybWF0OiAke2Nob2ljZS5pZH0tJHtjYXRlZ29yeUlkfS0ke2Nob2ljZUluZGV4fSBvciAke2Nob2ljZS5pZH0tJHtjYXRlZ29yeUlkfS0ke2Nob2ljZUluZGV4fS1hbHQtJHthbHRlcm5hdGVSZXNwb25zZUluZGV4fVxuICAgICAgY29uc3QgY2hvaWNlSWQgPVxuICAgICAgICBhY3RpdmVEYXRhLmNob2ljZT8uaWQgfHwgKHR5cGVvZiBhY3RpdmVEYXRhLmlkID09PSAnc3RyaW5nJyA/IGFjdGl2ZURhdGEuaWQuc3BsaXQoJy0nKVswXSA6IGFjdGl2ZURhdGEuaWQpO1xuICAgICAgdGhpcy5tb3ZlQ2hvaWNlKGNob2ljZUlkLCBhY3RpdmVEYXRhLmNhdGVnb3J5SWQsIG92ZXJEYXRhLmlkLCBhY3RpdmVEYXRhLmNob2ljZUluZGV4IHx8IDApO1xuICAgIH1cblxuICAgIC8vIHBsYWNpbmcgYSBjaG9pY2UgaW50byBhIGNhdGVnb3J5IChjb3JyZWN0IHJlc3BvbnNlKVxuICAgIGlmIChhY3RpdmVEYXRhLnR5cGUgPT09ICdjaG9pY2UnICYmIG92ZXJEYXRhLnR5cGUgPT09ICdjYXRlZ29yeScpIHtcbiAgICAgIHRoaXMuYWRkQ2hvaWNlVG9DYXRlZ29yeSh7IGlkOiBhY3RpdmVEYXRhLmlkIH0sIG92ZXJEYXRhLmlkKTtcbiAgICB9XG5cbiAgICAvLyBtb3ZpbmcgYSBjaG9pY2UgYmV0d2VlbiBjYXRlZ29yaWVzIChhbHRlcm5hdGUgcmVzcG9uc2UpXG4gICAgaWYgKGFjdGl2ZURhdGEudHlwZSA9PT0gJ2Nob2ljZS1wcmV2aWV3JyAmJiBvdmVyRGF0YS50eXBlID09PSAnY2F0ZWdvcnktYWx0ZXJuYXRlJykge1xuICAgICAgY29uc3QgdG9BbHRlcm5hdGVJbmRleCA9IG92ZXJEYXRhLmFsdGVybmF0ZVJlc3BvbnNlSW5kZXg7XG4gICAgICAvLyBFeHRyYWN0IG9yaWdpbmFsIGNob2ljZS5pZCAtIGlmIERyYWdnYWJsZUNob2ljZSB1c2VzIHRoZSB1bmlxdWUgaWQgaW4gZGF0YSwgZXh0cmFjdCB0aGUgZmlyc3QgcGFydFxuICAgICAgY29uc3QgY2hvaWNlSWQgPVxuICAgICAgICBhY3RpdmVEYXRhLmNob2ljZT8uaWQgfHwgKHR5cGVvZiBhY3RpdmVEYXRhLmlkID09PSAnc3RyaW5nJyA/IGFjdGl2ZURhdGEuaWQuc3BsaXQoJy0nKVswXSA6IGFjdGl2ZURhdGEuaWQpO1xuICAgICAgdGhpcy5tb3ZlQ2hvaWNlSW5BbHRlcm5hdGUoXG4gICAgICAgIGNob2ljZUlkLFxuICAgICAgICBhY3RpdmVEYXRhLmNhdGVnb3J5SWQsXG4gICAgICAgIG92ZXJEYXRhLmlkLFxuICAgICAgICBhY3RpdmVEYXRhLmNob2ljZUluZGV4IHx8IDAsXG4gICAgICAgIHRvQWx0ZXJuYXRlSW5kZXgsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHBsYWNpbmcgYSBjaG9pY2UgaW50byBhIGNhdGVnb3J5IChhbHRlcm5hdGUgcmVzcG9uc2UpXG4gICAgaWYgKGFsbG93QWx0ZXJuYXRlRW5hYmxlZCAmJiBhY3RpdmVEYXRhLnR5cGUgPT09ICdjaG9pY2UnICYmIG92ZXJEYXRhLnR5cGUgPT09ICdjYXRlZ29yeS1hbHRlcm5hdGUnKSB7XG4gICAgICBjb25zdCBjaG9pY2VJZCA9IGFjdGl2ZURhdGEuaWQ7XG4gICAgICBjb25zdCBjYXRlZ29yeUlkID0gb3ZlckRhdGEuaWQ7XG4gICAgICBjb25zdCB0b0FsdGVybmF0ZVJlc3BvbnNlSW5kZXggPSBvdmVyRGF0YS5hbHRlcm5hdGVSZXNwb25zZUluZGV4O1xuICAgICAgdGhpcy5hZGRDaG9pY2VUb0FsdGVybmF0ZUNhdGVnb3J5KHsgaWQ6IGNob2ljZUlkIH0sIGNhdGVnb3J5SWQsIHRvQWx0ZXJuYXRlUmVzcG9uc2VJbmRleCk7XG4gICAgfVxuICB9O1xuXG4gIGFkZENob2ljZVRvQ2F0ZWdvcnkgPSAoYWRkZWRDaG9pY2UsIGNhdGVnb3J5SWQpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IGNob2ljZXMgPSBbXSwgY29ycmVjdFJlc3BvbnNlID0gW10sIG1heENob2ljZXNQZXJDYXRlZ29yeSA9IDAgfSA9IG1vZGVsIHx8IHt9O1xuICAgIGNvbnN0IGNob2ljZSA9IChjaG9pY2VzIHx8IFtdKS5maW5kKChjaG9pY2UpID0+IGNob2ljZS5pZCA9PT0gYWRkZWRDaG9pY2UuaWQpO1xuXG4gICAgbGV0IG5ld0NvcnJlY3RSZXNwb25zZSA9IG1vdmVDaG9pY2VUb0NhdGVnb3J5KGFkZGVkQ2hvaWNlLmlkLCB1bmRlZmluZWQsIGNhdGVnb3J5SWQsIDAsIGNvcnJlY3RSZXNwb25zZSk7XG5cbiAgICBpZiAoY2hvaWNlLmNhdGVnb3J5Q291bnQgIT09IDApIHtcbiAgICAgIG5ld0NvcnJlY3RSZXNwb25zZSA9IHZlcmlmeUFsbG93TXVsdGlwbGVQbGFjZW1lbnRzKGFkZGVkQ2hvaWNlLCBjYXRlZ29yeUlkLCBuZXdDb3JyZWN0UmVzcG9uc2UpO1xuICAgIH1cbiAgICBjb25zdCBtYXhDYXRlZ29yeUNob2ljZXMgPSBnZXRNYXhDYXRlZ29yeUNob2ljZXMobW9kZWwpO1xuXG4gICAgdGhpcy51cGRhdGVNb2RlbCh7XG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IG5ld0NvcnJlY3RSZXNwb25zZSxcbiAgICAgIG1heENob2ljZXNQZXJDYXRlZ29yeTpcbiAgICAgICAgbWF4Q2hvaWNlc1BlckNhdGVnb3J5ICE9PSAwICYmIG1heENob2ljZXNQZXJDYXRlZ29yeSA8IG1heENhdGVnb3J5Q2hvaWNlc1xuICAgICAgICAgID8gbWF4Q2hvaWNlc1BlckNhdGVnb3J5ICsgMVxuICAgICAgICAgIDogbWF4Q2hvaWNlc1BlckNhdGVnb3J5LFxuICAgIH0pO1xuICB9O1xuXG4gIGRlbGV0ZUNob2ljZUZyb21DYXRlZ29yeSA9IChjYXRlZ29yeSwgY2hvaWNlLCBjaG9pY2VJbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgY29ycmVjdFJlc3BvbnNlID0gcmVtb3ZlQ2hvaWNlRnJvbUNhdGVnb3J5KGNob2ljZS5pZCwgY2F0ZWdvcnkuaWQsIGNob2ljZUluZGV4LCBtb2RlbC5jb3JyZWN0UmVzcG9uc2UpO1xuXG4gICAgdGhpcy51cGRhdGVNb2RlbCh7IGNvcnJlY3RSZXNwb25zZSB9KTtcbiAgfTtcblxuICBtb3ZlQ2hvaWNlID0gKGNob2ljZUlkLCBmcm9tLCB0bywgY2hvaWNlSW5kZXgpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IGNob2ljZXMsIGNvcnJlY3RSZXNwb25zZSA9IFtdLCBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnkgPSAwIH0gPSBtb2RlbCB8fCB7fTtcbiAgICBjb25zdCBjaG9pY2UgPSAoY2hvaWNlcyB8fCBbXSkuZmluZCgoY2hvaWNlKSA9PiBjaG9pY2UuaWQgPT09IGNob2ljZUlkKTtcbiAgICBpZiAodG8gPT09IGZyb20gfHwgIWNob2ljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2hvaWNlLmNhdGVnb3J5Q291bnQgIT09IDApIHtcbiAgICAgIGNvcnJlY3RSZXNwb25zZSA9IG1vdmVDaG9pY2VUb0NhdGVnb3J5KGNob2ljZS5pZCwgZnJvbSwgdG8sIGNob2ljZUluZGV4LCBjb3JyZWN0UmVzcG9uc2UpO1xuICAgICAgY29ycmVjdFJlc3BvbnNlID0gdmVyaWZ5QWxsb3dNdWx0aXBsZVBsYWNlbWVudHMoY2hvaWNlLCB0bywgY29ycmVjdFJlc3BvbnNlKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZS5jYXRlZ29yeUNvdW50ID09PSAwKSB7XG4gICAgICBjb3JyZWN0UmVzcG9uc2UgPSBtb3ZlQ2hvaWNlVG9DYXRlZ29yeShjaG9pY2UuaWQsIHVuZGVmaW5lZCwgdG8sIDAsIGNvcnJlY3RSZXNwb25zZSk7XG4gICAgfVxuICAgIGNvbnN0IG1heENhdGVnb3J5Q2hvaWNlcyA9IGdldE1heENhdGVnb3J5Q2hvaWNlcyhtb2RlbCk7XG4gICAgLy8gd2hlbiBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnkgaXMgc2V0IHRvIDAsIHRoZXJlIGlzIG5vIGxpbWl0IHNvIGl0IHNob3VsZCBub3QgYmUgdXBkYXRlZFxuICAgIHRoaXMudXBkYXRlTW9kZWwoe1xuICAgICAgY29ycmVjdFJlc3BvbnNlLFxuICAgICAgbWF4Q2hvaWNlc1BlckNhdGVnb3J5OlxuICAgICAgICBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnkgIT09IDAgJiYgbWF4Q2hvaWNlc1BlckNhdGVnb3J5IDwgbWF4Q2F0ZWdvcnlDaG9pY2VzXG4gICAgICAgICAgPyBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnkgKyAxXG4gICAgICAgICAgOiBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnksXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gbWV0aG9kcyBmb3IgYWx0ZXJuYXRlIHJlc3BvbnNlc1xuICBhZGRDaG9pY2VUb0FsdGVybmF0ZUNhdGVnb3J5ID0gKGFkZGVkQ2hvaWNlLCBjYXRlZ29yeUlkLCBhbHRJbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBjb3JyZWN0UmVzcG9uc2UsIGNob2ljZXMsIG1heENob2ljZXNQZXJDYXRlZ29yeSA9IDAgfSA9IG1vZGVsO1xuXG4gICAgY29uc3QgY2hvaWNlID0gY2hvaWNlcy5maW5kKChjKSA9PiBjLmlkID09PSBhZGRlZENob2ljZS5pZCk7XG5cbiAgICBjb3JyZWN0UmVzcG9uc2UuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgaWYgKGEuY2F0ZWdvcnkgPT09IGNhdGVnb3J5SWQpIHtcbiAgICAgICAgYS5hbHRlcm5hdGVSZXNwb25zZXMgPSBhLmFsdGVybmF0ZVJlc3BvbnNlcyB8fCBbXTtcblxuICAgICAgICBpZiAoYS5hbHRlcm5hdGVSZXNwb25zZXNbYWx0SW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhLmFsdGVybmF0ZVJlc3BvbnNlc1thbHRJbmRleF0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGEuYWx0ZXJuYXRlUmVzcG9uc2VzW2FsdEluZGV4XS5wdXNoKGFkZGVkQ2hvaWNlLmlkKTtcbiAgICAgICAgaWYgKGNob2ljZS5jYXRlZ29yeUNvdW50ICYmIGNob2ljZS5jYXRlZ29yeUNvdW50ICE9PSAwKSB7XG4gICAgICAgICAgYS5hbHRlcm5hdGVSZXNwb25zZXNbYWx0SW5kZXhdID0gYS5hbHRlcm5hdGVSZXNwb25zZXNbYWx0SW5kZXhdLnJlZHVjZSgoYWNjLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IGNob2ljZS5pZCkge1xuICAgICAgICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gYWNjLmZpbmRJbmRleCgoYykgPT4gYyA9PT0gY2hvaWNlLmlkKTtcbiAgICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWNjLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCBbXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhLmFsdGVybmF0ZVJlc3BvbnNlc1thbHRJbmRleF0gJiYgY2hvaWNlLmNhdGVnb3J5Q291bnQgIT09IDApIHtcbiAgICAgICAgICBhLmFsdGVybmF0ZVJlc3BvbnNlc1thbHRJbmRleF0gPSBhLmFsdGVybmF0ZVJlc3BvbnNlc1thbHRJbmRleF0uZmlsdGVyKChjKSA9PiBjICE9PSBhZGRlZENob2ljZS5pZCk7XG4gICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGE7XG4gICAgfSk7XG5cbiAgICBjb25zdCBtYXhDYXRlZ29yeUNob2ljZXMgPSBnZXRNYXhDYXRlZ29yeUNob2ljZXMobW9kZWwpO1xuICAgIC8vIHdoZW4gbWF4Q2hvaWNlc1BlckNhdGVnb3J5IGlzIHNldCB0byAwLCB0aGVyZSBpcyBubyBsaW1pdCBzbyBpdCBzaG91bGQgbm90IGJlIHVwZGF0ZWRcbiAgICB0aGlzLnVwZGF0ZU1vZGVsKHtcbiAgICAgIGNvcnJlY3RSZXNwb25zZSxcbiAgICAgIG1heENob2ljZXNQZXJDYXRlZ29yeTpcbiAgICAgICAgbWF4Q2hvaWNlc1BlckNhdGVnb3J5ICE9PSAwICYmIG1heENob2ljZXNQZXJDYXRlZ29yeSA8IG1heENhdGVnb3J5Q2hvaWNlc1xuICAgICAgICAgID8gbWF4Q2hvaWNlc1BlckNhdGVnb3J5ICsgMVxuICAgICAgICAgIDogbWF4Q2hvaWNlc1BlckNhdGVnb3J5LFxuICAgIH0pO1xuICB9O1xuXG4gIG1vdmVDaG9pY2VJbkFsdGVybmF0ZSA9IChjaG9pY2VJZCwgZnJvbSwgdG8sIGNob2ljZUluZGV4LCBhbHRlcm5hdGVJbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHsgY2hvaWNlcywgY29ycmVjdFJlc3BvbnNlID0gW10sIG1heENob2ljZXNQZXJDYXRlZ29yeSA9IDAgfSA9IG1vZGVsIHx8IHt9O1xuICAgIGNvbnN0IGNob2ljZSA9IChjaG9pY2VzIHx8IFtdKS5maW5kKChjaG9pY2UpID0+IGNob2ljZS5pZCA9PT0gY2hvaWNlSWQpO1xuICAgIGNvcnJlY3RSZXNwb25zZSA9IG1vdmVDaG9pY2VUb0FsdGVybmF0ZShcbiAgICAgIGNob2ljZUlkLFxuICAgICAgZnJvbSxcbiAgICAgIHRvLFxuICAgICAgY2hvaWNlSW5kZXgsXG4gICAgICBjb3JyZWN0UmVzcG9uc2UsXG4gICAgICBhbHRlcm5hdGVJbmRleCxcbiAgICAgIGNob2ljZT8uY2F0ZWdvcnlDb3VudCxcbiAgICApO1xuXG4gICAgY29uc3QgbWF4Q2F0ZWdvcnlDaG9pY2VzID0gZ2V0TWF4Q2F0ZWdvcnlDaG9pY2VzKG1vZGVsKTtcbiAgICAvLyB3aGVuIG1heENob2ljZXNQZXJDYXRlZ29yeSBpcyBzZXQgdG8gMCwgdGhlcmUgaXMgbm8gbGltaXQgc28gaXQgc2hvdWxkIG5vdCBiZSB1cGRhdGVkXG4gICAgdGhpcy51cGRhdGVNb2RlbCh7XG4gICAgICBjb3JyZWN0UmVzcG9uc2UsXG4gICAgICBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnk6XG4gICAgICAgIG1heENob2ljZXNQZXJDYXRlZ29yeSAhPT0gMCAmJiBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnkgPCBtYXhDYXRlZ29yeUNob2ljZXNcbiAgICAgICAgICA/IG1heENob2ljZXNQZXJDYXRlZ29yeSArIDFcbiAgICAgICAgICA6IG1heENob2ljZXNQZXJDYXRlZ29yeSxcbiAgICB9KTtcbiAgfTtcblxuICBkZWxldGVDaG9pY2VGcm9tQWx0ZXJuYXRlQ2F0ZWdvcnkgPSAoY2F0ZWdvcnksIGNob2ljZSwgY2hvaWNlSW5kZXgsIGFsdEluZGV4KSA9PiB7XG4gICAgY29uc3QgeyBtb2RlbCB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IGNvcnJlY3RSZXNwb25zZSA9IHJlbW92ZUNob2ljZUZyb21BbHRlcm5hdGUoXG4gICAgICBjaG9pY2UuaWQsXG4gICAgICBjYXRlZ29yeS5pZCxcbiAgICAgIGNob2ljZUluZGV4LFxuICAgICAgYWx0SW5kZXgsXG4gICAgICBtb2RlbC5jb3JyZWN0UmVzcG9uc2UsXG4gICAgKTtcblxuICAgIHRoaXMudXBkYXRlTW9kZWwoeyBjb3JyZWN0UmVzcG9uc2UgfSk7XG4gIH07XG5cbiAgcmVuZGVyRHJhZ092ZXJsYXkgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBhY3RpdmVEcmFnSXRlbSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IG1vZGVsLCBjb25maWd1cmF0aW9uIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKCFhY3RpdmVEcmFnSXRlbSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoYWN0aXZlRHJhZ0l0ZW0udHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgIGNvbnN0IGNob2ljZSA9IG1vZGVsLmNob2ljZXM/LmZpbmQoKGMpID0+IGMuaWQgPT09IGFjdGl2ZURyYWdJdGVtLmlkKTtcbiAgICAgIGlmICghY2hvaWNlKSByZXR1cm4gbnVsbDtcblxuICAgICAgcmV0dXJuIDxDaG9pY2UgY2hvaWNlPXtjaG9pY2V9IGNvbmZpZ3VyYXRpb249e2NvbmZpZ3VyYXRpb259IC8+O1xuICAgIH0gZWxzZSBpZiAoYWN0aXZlRHJhZ0l0ZW0udHlwZSA9PT0gJ2Nob2ljZS1wcmV2aWV3JyAmJiBhY3RpdmVEcmFnSXRlbS5hbHRlcm5hdGVSZXNwb25zZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNob2ljZSA9IG1vZGVsLmNob2ljZXM/LmZpbmQoKGMpID0+IGMuaWQgPT09IGFjdGl2ZURyYWdJdGVtLmlkKTtcbiAgICAgIGlmICghY2hvaWNlKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiA8Q2hvaWNlUHJldmlldyBjaG9pY2U9e2Nob2ljZX0gLz47XG4gICAgfSBlbHNlIGlmIChhY3RpdmVEcmFnSXRlbS50eXBlID09PSAnY2hvaWNlLXByZXZpZXcnICYmIGFjdGl2ZURyYWdJdGVtLmFsdGVybmF0ZVJlc3BvbnNlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2hvaWNlID0gbW9kZWwuY2hvaWNlcz8uZmluZCgoYykgPT4gYy5pZCA9PT0gYWN0aXZlRHJhZ0l0ZW0uaWQpO1xuICAgICAgaWYgKCFjaG9pY2UpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIDxDaG9pY2VQcmV2aWV3IGNob2ljZT17Y2hvaWNlfSBhbHRlcm5hdGVSZXNwb25zZUluZGV4PXthY3RpdmVEcmFnSXRlbS5hbHRlcm5hdGVSZXNwb25zZUluZGV4fSAvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjb25maWd1cmF0aW9uLCBpbWFnZVN1cHBvcnQsIG1vZGVsLCB1cGxvYWRTb3VuZFN1cHBvcnQsIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge1xuICAgICAgYWxsb3dBbHRlcm5hdGUgPSB7fSxcbiAgICAgIGFsbG93TXVsdGlwbGVQbGFjZW1lbnRzID0ge30sXG4gICAgICBiYXNlSW5wdXRDb25maWd1cmF0aW9uID0ge30sXG4gICAgICBjYXRlZ29yaWVzUGVyUm93ID0ge30sXG4gICAgICBjaG9pY2VzUG9zaXRpb24gPSB7fSxcbiAgICAgIGNvbnRlbnREaW1lbnNpb25zID0ge30sXG4gICAgICBmZWVkYmFjayA9IHt9LFxuICAgICAgbG9ja0Nob2ljZU9yZGVyID0ge30sXG4gICAgICBtYXhJbWFnZUhlaWdodCA9IHt9LFxuICAgICAgbWF4SW1hZ2VXaWR0aCA9IHt9LFxuICAgICAgbWF4UGxhY2VtZW50cyA9IHt9LFxuICAgICAgbWluQ2F0ZWdvcmllc1BlclJvdyA9IDEsXG4gICAgICBwYXJ0aWFsU2NvcmluZyA9IHt9LFxuICAgICAgcHJvbXB0ID0ge30sXG4gICAgICByYXRpb25hbGUgPSB7fSxcbiAgICAgIHNjb3JpbmdUeXBlID0ge30sXG4gICAgICBzZXR0aW5nc1BhbmVsRGlzYWJsZWQsXG4gICAgICBzcGVsbENoZWNrID0ge30sXG4gICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zID0ge30sXG4gICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zID0ge30sXG4gICAgICB3aXRoUnVicmljID0ge30sXG4gICAgICBtYXRoTWxPcHRpb25zID0ge30sXG4gICAgICBsYW5ndWFnZSA9IHt9LFxuICAgICAgbGFuZ3VhZ2VDaG9pY2VzID0ge30sXG4gICAgICBhbGxvd01heEFuc3dlckNob2ljZXMgPSB7fSxcbiAgICB9ID0gY29uZmlndXJhdGlvbiB8fCB7fTtcbiAgICBjb25zdCB7XG4gICAgICBhbGxvd0FsdGVybmF0ZUVuYWJsZWQsXG4gICAgICBhbGxvd01heENob2ljZXNQZXJDYXRlZ29yeSxcbiAgICAgIGVycm9ycyxcbiAgICAgIGZlZWRiYWNrRW5hYmxlZCxcbiAgICAgIG1heENob2ljZXNQZXJDYXRlZ29yeSxcbiAgICAgIHByb21wdEVuYWJsZWQsXG4gICAgICByYXRpb25hbGVFbmFibGVkLFxuICAgICAgc3BlbGxDaGVja0VuYWJsZWQsXG4gICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCxcbiAgICAgIHRvb2xiYXJFZGl0b3JQb3NpdGlvbixcbiAgICAgIGV4dHJhQ1NTUnVsZXMsXG4gICAgfSA9IG1vZGVsIHx8IHt9O1xuICAgIGNvbnN0IHtcbiAgICAgIHByb21wdDogcHJvbXB0RXJyb3IsXG4gICAgICByYXRpb25hbGU6IHJhdGlvbmFsZUVycm9yLFxuICAgICAgdGVhY2hlckluc3RydWN0aW9uczogdGVhY2hlckluc3RydWN0aW9uc0Vycm9yLFxuICAgIH0gPSBlcnJvcnMgfHwge307XG5cbiAgICBjb25zdCB0b29sYmFyT3B0cyA9IHtcbiAgICAgIHBvc2l0aW9uOiB0b29sYmFyRWRpdG9yUG9zaXRpb24gPT09ICd0b3AnID8gJ3RvcCcgOiAnYm90dG9tJyxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uZmlnID0gbW9kZWwuY29uZmlnIHx8IHt9O1xuICAgIGNvbmZpZy5jaG9pY2VzID0gY29uZmlnLmNob2ljZXMgfHwgeyBsYWJlbDogJycsIGNvbHVtbnM6IDIgfTtcblxuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBidWlsZENhdGVnb3JpZXMobW9kZWwuY2F0ZWdvcmllcyB8fCBbXSwgbW9kZWwuY2hvaWNlcyB8fCBbXSwgbW9kZWwuY29ycmVjdFJlc3BvbnNlIHx8IFtdKTtcblxuICAgIGNvbnN0IGFsdGVybmF0ZVJlc3BvbnNlcyA9IGJ1aWxkQWx0ZXJuYXRlUmVzcG9uc2VzKFxuICAgICAgbW9kZWwuY2F0ZWdvcmllcyB8fCBbXSxcbiAgICAgIG1vZGVsLmNob2ljZXMgfHwgW10sXG4gICAgICBtb2RlbC5jb3JyZWN0UmVzcG9uc2UgfHwgW10sXG4gICAgKTtcblxuICAgIGNvbnN0IGNob2ljZXMgPSBtb2RlbC5jaG9pY2VzLm1hcCgoYykgPT4ge1xuICAgICAgYy5jb3JyZWN0UmVzcG9uc2VDb3VudCA9IHRoaXMuY291bnRDaG9pY2VJbkNvcnJlY3RSZXNwb25zZShjKTtcbiAgICAgIC8vIGVuc3VyZSBjYXRlZ29yeUNvdW50IGlzIHNldCBldmVuIHRob3VnaCB1cGRhdGVkTW9kZWwgaGFzbid0IGJlZW4gY2FsbGVkXG4gICAgICBjLmNhdGVnb3J5Q291bnQgPSB0aGlzLmNoZWNrQWxsb3dNdWx0aXBsZVBsYWNlbWVudHMobW9kZWwuYWxsb3dNdWx0aXBsZVBsYWNlbWVudHNFbmFibGVkLCBjKTtcbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZGVmYXVsdEltYWdlTWF4V2lkdGggPSBtYXhJbWFnZVdpZHRoICYmIG1heEltYWdlV2lkdGgucHJvbXB0O1xuICAgIGNvbnN0IGRlZmF1bHRJbWFnZU1heEhlaWdodCA9IG1heEltYWdlSGVpZ2h0ICYmIG1heEltYWdlSGVpZ2h0LnByb21wdDtcblxuICAgIGNvbnN0IHBhbmVsU2V0dGluZ3MgPSB7XG4gICAgICBwYXJ0aWFsU2NvcmluZzogcGFydGlhbFNjb3Jpbmcuc2V0dGluZ3MgJiYgdG9nZ2xlKHBhcnRpYWxTY29yaW5nLmxhYmVsKSxcbiAgICAgIGxvY2tDaG9pY2VPcmRlcjogbG9ja0Nob2ljZU9yZGVyLnNldHRpbmdzICYmIHRvZ2dsZShsb2NrQ2hvaWNlT3JkZXIubGFiZWwpLFxuICAgICAgY2F0ZWdvcmllc1BlclJvdzpcbiAgICAgICAgY2F0ZWdvcmllc1BlclJvdy5zZXR0aW5ncyAmJlxuICAgICAgICBudW1iZXJGaWVsZChjYXRlZ29yaWVzUGVyUm93LmxhYmVsLCB7XG4gICAgICAgICAgbGFiZWw6IGNhdGVnb3JpZXNQZXJSb3cubGFiZWwsXG4gICAgICAgICAgbWluOiBtaW5DYXRlZ29yaWVzUGVyUm93LFxuICAgICAgICAgIG1heDogNixcbiAgICAgICAgfSksXG4gICAgICBjaG9pY2VzUG9zaXRpb246IGNob2ljZXNQb3NpdGlvbi5zZXR0aW5ncyAmJiByYWRpbyhjaG9pY2VzUG9zaXRpb24ubGFiZWwsIFsnYmVsb3cnLCAnYWJvdmUnLCAnbGVmdCcsICdyaWdodCddKSxcbiAgICAgIGFsbG93TXVsdGlwbGVQbGFjZW1lbnRzRW5hYmxlZDpcbiAgICAgICAgYWxsb3dNdWx0aXBsZVBsYWNlbWVudHMuc2V0dGluZ3MgJiZcbiAgICAgICAgZHJvcGRvd24oYWxsb3dNdWx0aXBsZVBsYWNlbWVudHMubGFiZWwsIFtcbiAgICAgICAgICBtdWx0aXBsZVBsYWNlbWVudHMuZW5hYmxlZCxcbiAgICAgICAgICBtdWx0aXBsZVBsYWNlbWVudHMuZGlzYWJsZWQsXG4gICAgICAgICAgbXVsdGlwbGVQbGFjZW1lbnRzLnBlckNob2ljZSxcbiAgICAgICAgXSksXG4gICAgICBtYXhBbnN3ZXJDaG9pY2VzOlxuICAgICAgICBhbGxvd01heEFuc3dlckNob2ljZXMuc2V0dGluZ3MgJiZcbiAgICAgICAgbnVtYmVyRmllbGQoYWxsb3dNYXhBbnN3ZXJDaG9pY2VzLmxhYmVsLCB7XG4gICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgIG1pbjogY2hvaWNlcz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgICAgbWF4OiAzMCxcbiAgICAgICAgfSksXG4gICAgICBhbGxvd01heENob2ljZXNQZXJDYXRlZ29yeTogbWF4UGxhY2VtZW50cy5zZXR0aW5ncyAmJiB0b2dnbGUobWF4UGxhY2VtZW50cy5sYWJlbCksXG4gICAgICBtYXhDaG9pY2VzUGVyQ2F0ZWdvcnk6XG4gICAgICAgIGFsbG93TWF4Q2hvaWNlc1BlckNhdGVnb3J5ID09PSB0cnVlICYmXG4gICAgICAgIG51bWJlckZpZWxkKG1heFBsYWNlbWVudHMubGFiZWwsIHtcbiAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgbWluOiAwLFxuICAgICAgICAgIG1heDogMzAsXG4gICAgICAgIH0pLFxuICAgICAgcHJvbXB0RW5hYmxlZDogcHJvbXB0LnNldHRpbmdzICYmIHRvZ2dsZShwcm9tcHQubGFiZWwpLFxuICAgICAgZmVlZGJhY2tFbmFibGVkOiBmZWVkYmFjay5zZXR0aW5ncyAmJiB0b2dnbGUoZmVlZGJhY2subGFiZWwpLFxuICAgICAgYWxsb3dBbHRlcm5hdGVFbmFibGVkOiBhbGxvd0FsdGVybmF0ZS5zZXR0aW5ncyAmJiB0b2dnbGUoYWxsb3dBbHRlcm5hdGUubGFiZWwpLFxuICAgICAgJ2xhbmd1YWdlLmVuYWJsZWQnOiBsYW5ndWFnZS5zZXR0aW5ncyAmJiB0b2dnbGUobGFuZ3VhZ2UubGFiZWwsIHRydWUpLFxuICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLnNldHRpbmdzICYmIGxhbmd1YWdlLmVuYWJsZWQgJiYgZHJvcGRvd24obGFuZ3VhZ2VDaG9pY2VzLmxhYmVsLCBsYW5ndWFnZUNob2ljZXMub3B0aW9ucyksXG4gICAgfTtcblxuICAgIGNvbnN0IHBhbmVsUHJvcGVydGllcyA9IHtcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiB0ZWFjaGVySW5zdHJ1Y3Rpb25zLnNldHRpbmdzICYmIHRvZ2dsZSh0ZWFjaGVySW5zdHJ1Y3Rpb25zLmxhYmVsKSxcbiAgICAgIHN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkOiBzdHVkZW50SW5zdHJ1Y3Rpb25zLnNldHRpbmdzICYmIHRvZ2dsZShzdHVkZW50SW5zdHJ1Y3Rpb25zLmxhYmVsKSxcbiAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IHJhdGlvbmFsZS5zZXR0aW5ncyAmJiB0b2dnbGUocmF0aW9uYWxlLmxhYmVsKSxcbiAgICAgIHNwZWxsQ2hlY2tFbmFibGVkOiBzcGVsbENoZWNrLnNldHRpbmdzICYmIHRvZ2dsZShzcGVsbENoZWNrLmxhYmVsKSxcbiAgICAgIHNjb3JpbmdUeXBlOiBzY29yaW5nVHlwZS5zZXR0aW5ncyAmJiByYWRpbyhzY29yaW5nVHlwZS5sYWJlbCwgWydhdXRvJywgJ3J1YnJpYyddKSxcbiAgICAgIHJ1YnJpY0VuYWJsZWQ6IHdpdGhSdWJyaWM/LnNldHRpbmdzICYmIHRvZ2dsZSh3aXRoUnVicmljPy5sYWJlbCksXG4gICAgfTtcblxuICAgIGNvbnN0IGlzT3BlbmVkID0gdGhpcy5pc0FsZXJ0TW9kYWxPcGVuZWQoKTtcbiAgICBjb25zdCBhbGVydE1heENob2ljZXNNc2cgPSB0cmFuc2xhdG9yLnQoJ3RyYW5zbGF0aW9uOmNhdGVnb3JpemU6bWF4Q2hvaWNlc1BlckNhdGVnb3J5UmVzdHJpY3Rpb24nLCB7XG4gICAgICBsbmc6IG1vZGVsLmxhbmd1YWdlLFxuICAgICAgbWF4Q2hvaWNlc1BlckNhdGVnb3J5LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEcmFnUHJvdmlkZXIgb25EcmFnU3RhcnQ9e3RoaXMub25EcmFnU3RhcnR9IG9uRHJhZ0VuZD17dGhpcy5vbkRyYWdFbmR9PlxuICAgICAgICA8SWRQcm92aWRlciB2YWx1ZT17dGhpcy51aWR9PlxuICAgICAgICAgIDxsYXlvdXQuQ29uZmlnTGF5b3V0XG4gICAgICAgICAgICBleHRyYUNTU1J1bGVzPXtleHRyYUNTU1J1bGVzfVxuICAgICAgICAgICAgZGltZW5zaW9ucz17Y29udGVudERpbWVuc2lvbnN9XG4gICAgICAgICAgICBoaWRlU2V0dGluZ3M9e3NldHRpbmdzUGFuZWxEaXNhYmxlZH1cbiAgICAgICAgICAgIHNldHRpbmdzPXtcbiAgICAgICAgICAgICAgPFBhbmVsXG4gICAgICAgICAgICAgICAgbW9kZWw9e21vZGVsfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlTW9kZWw9e3RoaXMudXBkYXRlTW9kZWx9XG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbj17Y29uZmlndXJhdGlvbn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZUNvbmZpZ3VyYXRpb249e29uQ29uZmlndXJhdGlvbkNoYW5nZWR9XG4gICAgICAgICAgICAgICAgZ3JvdXBzPXt7XG4gICAgICAgICAgICAgICAgICBTZXR0aW5nczogcGFuZWxTZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXM6IHBhbmVsUHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG1vZGFsPXtcbiAgICAgICAgICAgICAgICAgIDxBbGVydERpYWxvZ1xuICAgICAgICAgICAgICAgICAgICB0aXRsZT17J1dhcm5pbmcnfVxuICAgICAgICAgICAgICAgICAgICB0ZXh0PXthbGVydE1heENob2ljZXNNc2d9XG4gICAgICAgICAgICAgICAgICAgIG9wZW49e2lzT3BlbmVkfVxuICAgICAgICAgICAgICAgICAgICBvbkNsb3NlPXt0aGlzLm9uQWxlcnRNb2RhbENhbmNlbH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICAgIDxTdHlsZWRJbnB1dENvbnRhaW5lciBsYWJlbD17dGVhY2hlckluc3RydWN0aW9ucy5sYWJlbH0+XG4gICAgICAgICAgICAgICAgPEVkaXRhYmxlSHRtbFxuICAgICAgICAgICAgICAgICAgbWFya3VwPXttb2RlbC50ZWFjaGVySW5zdHJ1Y3Rpb25zIHx8ICcnfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuY2hhbmdlVGVhY2hlckluc3RydWN0aW9uc31cbiAgICAgICAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgICAgICAgZXJyb3I9e3RlYWNoZXJJbnN0cnVjdGlvbnNFcnJvcn1cbiAgICAgICAgICAgICAgICAgIG5vbkVtcHR5PXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICAgICAgICAgIHBsdWdpblByb3BzPXtnZXRQbHVnaW5Qcm9wcyh0ZWFjaGVySW5zdHJ1Y3Rpb25zPy5pbnB1dENvbmZpZ3VyYXRpb24sIGJhc2VJbnB1dENvbmZpZ3VyYXRpb24pfVxuICAgICAgICAgICAgICAgICAgc3BlbGxDaGVjaz17c3BlbGxDaGVja0VuYWJsZWR9XG4gICAgICAgICAgICAgICAgICBtYXhJbWFnZVdpZHRoPXsobWF4SW1hZ2VXaWR0aCAmJiBtYXhJbWFnZVdpZHRoLnRlYWNoZXJJbnN0cnVjdGlvbnMpIHx8IGRlZmF1bHRJbWFnZU1heFdpZHRofVxuICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ9eyhtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSB8fCBkZWZhdWx0SW1hZ2VNYXhIZWlnaHR9XG4gICAgICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzPXtbeyBsYW5ndWFnZTogJ3NwYW5pc2gnIH0sIHsgbGFuZ3VhZ2U6ICdzcGVjaWFsJyB9XX1cbiAgICAgICAgICAgICAgICAgIG1hdGhNbE9wdGlvbnM9e21hdGhNbE9wdGlvbnN9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7dGVhY2hlckluc3RydWN0aW9uc0Vycm9yICYmIDxFcnJvclRleHQ+e3RlYWNoZXJJbnN0cnVjdGlvbnNFcnJvcn08L0Vycm9yVGV4dD59XG4gICAgICAgICAgICAgIDwvU3R5bGVkSW5wdXRDb250YWluZXI+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7cHJvbXB0RW5hYmxlZCAmJiAoXG4gICAgICAgICAgICAgIDxTdHlsZWRJbnB1dENvbnRhaW5lciBsYWJlbD17cHJvbXB0LmxhYmVsfT5cbiAgICAgICAgICAgICAgICA8RWRpdGFibGVIdG1sXG4gICAgICAgICAgICAgICAgICBtYXJrdXA9e21vZGVsLnByb21wdCB8fCAnJ31cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uUHJvbXB0Q2hhbmdlZH1cbiAgICAgICAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgICAgICAgZXJyb3I9e3Byb21wdEVycm9yfVxuICAgICAgICAgICAgICAgICAgbm9uRW1wdHk9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZVVuZGVybGluZVxuICAgICAgICAgICAgICAgICAgdG9vbGJhck9wdHM9e3Rvb2xiYXJPcHRzfVxuICAgICAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e2dldFBsdWdpblByb3BzKHByb21wdD8uaW5wdXRDb25maWd1cmF0aW9uLCBiYXNlSW5wdXRDb25maWd1cmF0aW9uKX1cbiAgICAgICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17bWF4SW1hZ2VXaWR0aCAmJiBtYXhJbWFnZVdpZHRoLnByb21wdH1cbiAgICAgICAgICAgICAgICAgIG1heEltYWdlSGVpZ2h0PXttYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC5wcm9tcHR9XG4gICAgICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzPXtbeyBsYW5ndWFnZTogJ3NwYW5pc2gnIH0sIHsgbGFuZ3VhZ2U6ICdzcGVjaWFsJyB9XX1cbiAgICAgICAgICAgICAgICAgIG1hdGhNbE9wdGlvbnM9e21hdGhNbE9wdGlvbnN9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7cHJvbXB0RXJyb3IgJiYgPEVycm9yVGV4dD57cHJvbXB0RXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAgICAgICAgICA8L1N0eWxlZElucHV0Q29udGFpbmVyPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgPENhdGVnb3JpZXNcbiAgICAgICAgICAgICAgaW1hZ2VTdXBwb3J0PXtpbWFnZVN1cHBvcnR9XG4gICAgICAgICAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydD17dXBsb2FkU291bmRTdXBwb3J0fVxuICAgICAgICAgICAgICBtb2RlbD17bW9kZWx9XG4gICAgICAgICAgICAgIGNhdGVnb3JpZXM9e2NhdGVnb3JpZXMgfHwgW119XG4gICAgICAgICAgICAgIG9uTW9kZWxDaGFuZ2VkPXt0aGlzLnVwZGF0ZU1vZGVsfVxuICAgICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICBjb25maWd1cmF0aW9uPXtjb25maWd1cmF0aW9ufVxuICAgICAgICAgICAgICBkZWZhdWx0SW1hZ2VNYXhXaWR0aD17ZGVmYXVsdEltYWdlTWF4V2lkdGh9XG4gICAgICAgICAgICAgIGRlZmF1bHRJbWFnZU1heEhlaWdodD17ZGVmYXVsdEltYWdlTWF4SGVpZ2h0fVxuICAgICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPENob2ljZXNcbiAgICAgICAgICAgICAgaW1hZ2VTdXBwb3J0PXtpbWFnZVN1cHBvcnR9XG4gICAgICAgICAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydD17dXBsb2FkU291bmRTdXBwb3J0fVxuICAgICAgICAgICAgICBjaG9pY2VzPXtjaG9pY2VzfVxuICAgICAgICAgICAgICBtb2RlbD17bW9kZWx9XG4gICAgICAgICAgICAgIG9uTW9kZWxDaGFuZ2VkPXt0aGlzLnVwZGF0ZU1vZGVsfVxuICAgICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICBjb25maWd1cmF0aW9uPXtjb25maWd1cmF0aW9ufVxuICAgICAgICAgICAgICBkZWZhdWx0SW1hZ2VNYXhXaWR0aD17ZGVmYXVsdEltYWdlTWF4V2lkdGh9XG4gICAgICAgICAgICAgIGRlZmF1bHRJbWFnZU1heEhlaWdodD17ZGVmYXVsdEltYWdlTWF4SGVpZ2h0fVxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAge2FsbG93QWx0ZXJuYXRlRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICAgIDxTdHlsZWRIZWFkZXJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkFsdGVybmF0ZSBSZXNwb25zZXNcIlxuICAgICAgICAgICAgICAgIGJ1dHRvbkxhYmVsPVwiQUREIEFOIEFMVEVSTkFURSBSRVNQT05TRVwiXG4gICAgICAgICAgICAgICAgb25BZGQ9e3RoaXMub25BZGRBbHRlcm5hdGVSZXNwb25zZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7YWxsb3dBbHRlcm5hdGVFbmFibGVkICYmXG4gICAgICAgICAgICAgIGFsdGVybmF0ZVJlc3BvbnNlcy5tYXAoKGNhdGVnb3JpZXNMaXN0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PXsnc3VidGl0bGUxJ31cbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkFsdGVybmF0ZSBSZXNwb25zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgYnV0dG9uTGFiZWw9XCJSRU1PVkUgQUxURVJOQVRFIFJFU1BPTlNFXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkFkZD17KCkgPT4gdGhpcy5vblJlbW92ZUFsdGVybmF0ZVJlc3BvbnNlKGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPEFsdGVybmF0ZVJlc3BvbnNlc1xuICAgICAgICAgICAgICAgICAgICAgIGFsdEluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZVN1cHBvcnQ9e2ltYWdlU3VwcG9ydH1cbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbD17bW9kZWx9XG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbj17Y29uZmlndXJhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzPXtjYXRlZ29yaWVzTGlzdH1cbiAgICAgICAgICAgICAgICAgICAgICBvbk1vZGVsQ2hhbmdlZD17dGhpcy51cGRhdGVNb2RlbH1cbiAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cblxuICAgICAgICAgICAge3JhdGlvbmFsZUVuYWJsZWQgJiYgKFxuICAgICAgICAgICAgICA8U3R5bGVkSW5wdXRDb250YWluZXIgbGFiZWw9e3JhdGlvbmFsZS5sYWJlbH0+XG4gICAgICAgICAgICAgICAgPEVkaXRhYmxlSHRtbFxuICAgICAgICAgICAgICAgICAgbWFya3VwPXttb2RlbC5yYXRpb25hbGUgfHwgJyd9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5jaGFuZ2VSYXRpb25hbGV9XG4gICAgICAgICAgICAgICAgICBpbWFnZVN1cHBvcnQ9e2ltYWdlU3VwcG9ydH1cbiAgICAgICAgICAgICAgICAgIGVycm9yPXtyYXRpb25hbGVFcnJvcn1cbiAgICAgICAgICAgICAgICAgIG5vbkVtcHR5PXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICAgICAgICAgIHBsdWdpblByb3BzPXtnZXRQbHVnaW5Qcm9wcyhwcm9tcHQ/LmlucHV0Q29uZmlndXJhdGlvbiwgYmFzZUlucHV0Q29uZmlndXJhdGlvbil9XG4gICAgICAgICAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrRW5hYmxlZH1cbiAgICAgICAgICAgICAgICAgIG1heEltYWdlV2lkdGg9eyhtYXhJbWFnZVdpZHRoICYmIG1heEltYWdlV2lkdGgucmF0aW9uYWxlKSB8fCBkZWZhdWx0SW1hZ2VNYXhXaWR0aH1cbiAgICAgICAgICAgICAgICAgIG1heEltYWdlSGVpZ2h0PXsobWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQucmF0aW9uYWxlKSB8fCBkZWZhdWx0SW1hZ2VNYXhIZWlnaHR9XG4gICAgICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzPXtbeyBsYW5ndWFnZTogJ3NwYW5pc2gnIH0sIHsgbGFuZ3VhZ2U6ICdzcGVjaWFsJyB9XX1cbiAgICAgICAgICAgICAgICAgIG1hdGhNbE9wdGlvbnM9e21hdGhNbE9wdGlvbnN9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7cmF0aW9uYWxlRXJyb3IgJiYgPEVycm9yVGV4dD57cmF0aW9uYWxlRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAgICAgICAgICA8L1N0eWxlZElucHV0Q29udGFpbmVyPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge2ZlZWRiYWNrRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICAgIDxGZWVkYmFja0NvbmZpZyBmZWVkYmFjaz17bW9kZWwuZmVlZGJhY2t9IG9uQ2hhbmdlPXt0aGlzLmNoYW5nZUZlZWRiYWNrfSB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9IC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvbGF5b3V0LkNvbmZpZ0xheW91dD5cbiAgICAgICAgICA8RHJhZ092ZXJsYXk+XG4gICAgICAgICAgICA8RHJhZ1ByZXZpZXdXcmFwcGVyPnt0aGlzLnJlbmRlckRyYWdPdmVybGF5KCl9PC9EcmFnUHJldmlld1dyYXBwZXI+XG4gICAgICAgICAgPC9EcmFnT3ZlcmxheT5cbiAgICAgICAgPC9JZFByb3ZpZGVyPlxuICAgICAgPC9EcmFnUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZXNpZ247XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsVUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBQ0Es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