@rjsf/core 4.2.2 → 4.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/AddButton.js +39 -0
- package/dist/cjs/components/ErrorList.js +41 -0
- package/dist/cjs/components/Form.js +588 -0
- package/dist/cjs/components/IconButton.js +37 -0
- package/dist/cjs/components/fields/ArrayField.js +977 -0
- package/dist/cjs/components/fields/BooleanField.js +107 -0
- package/dist/cjs/components/fields/DescriptionField.js +50 -0
- package/dist/cjs/components/fields/MultiSchemaField.js +275 -0
- package/dist/cjs/components/fields/NullField.js +66 -0
- package/dist/cjs/components/fields/NumberField.js +156 -0
- package/dist/cjs/components/fields/ObjectField.js +366 -0
- package/dist/cjs/components/fields/SchemaField.js +546 -0
- package/dist/cjs/components/fields/StringField.js +98 -0
- package/dist/cjs/components/fields/TitleField.js +42 -0
- package/dist/cjs/components/fields/UnsupportedField.js +46 -0
- package/dist/cjs/components/fields/index.js +47 -0
- package/dist/cjs/components/widgets/AltDateTimeWidget.js +48 -0
- package/dist/cjs/components/widgets/AltDateWidget.js +301 -0
- package/dist/cjs/components/widgets/BaseInput.js +151 -0
- package/dist/cjs/components/widgets/CheckboxWidget.js +85 -0
- package/dist/cjs/components/widgets/CheckboxesWidget.js +121 -0
- package/dist/cjs/components/widgets/ColorWidget.js +45 -0
- package/dist/cjs/components/widgets/DateTimeWidget.js +43 -0
- package/dist/cjs/components/widgets/DateWidget.js +39 -0
- package/dist/cjs/components/widgets/EmailWidget.js +34 -0
- package/dist/cjs/components/widgets/FileWidget.js +215 -0
- package/dist/cjs/components/widgets/HiddenWidget.js +36 -0
- package/dist/cjs/components/widgets/PasswordWidget.js +34 -0
- package/dist/cjs/components/widgets/RadioWidget.js +107 -0
- package/dist/cjs/components/widgets/RangeWidget.js +46 -0
- package/dist/cjs/components/widgets/SelectWidget.js +151 -0
- package/dist/cjs/components/widgets/SubmitButton.js +35 -0
- package/dist/cjs/components/widgets/TextWidget.js +31 -0
- package/dist/cjs/components/widgets/TextareaWidget.js +81 -0
- package/dist/cjs/components/widgets/URLWidget.js +34 -0
- package/dist/cjs/components/widgets/UpDownWidget.js +36 -0
- package/dist/cjs/components/widgets/index.js +73 -0
- package/dist/cjs/defaultRegistry.js +23 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/types.js +47 -0
- package/dist/cjs/utils.js +1407 -0
- package/dist/cjs/validate.js +354 -0
- package/dist/cjs/withTheme.js +53 -0
- package/dist/es/components/AddButton.js +28 -0
- package/dist/es/components/ErrorList.js +31 -0
- package/dist/es/components/Form.js +572 -0
- package/dist/es/components/IconButton.js +27 -0
- package/dist/es/components/fields/ArrayField.js +959 -0
- package/dist/es/components/fields/BooleanField.js +93 -0
- package/dist/es/components/fields/DescriptionField.js +39 -0
- package/dist/es/components/fields/MultiSchemaField.js +261 -0
- package/dist/es/components/fields/NullField.js +55 -0
- package/dist/es/components/fields/NumberField.js +141 -0
- package/dist/es/components/fields/ObjectField.js +351 -0
- package/dist/es/components/fields/SchemaField.js +528 -0
- package/dist/es/components/fields/StringField.js +84 -0
- package/dist/es/components/fields/TitleField.js +30 -0
- package/dist/es/components/fields/UnsupportedField.js +35 -0
- package/dist/es/components/fields/index.js +26 -0
- package/dist/es/components/widgets/AltDateTimeWidget.js +36 -0
- package/dist/es/components/widgets/AltDateWidget.js +287 -0
- package/dist/es/components/widgets/BaseInput.js +140 -0
- package/dist/es/components/widgets/CheckboxWidget.js +73 -0
- package/dist/es/components/widgets/CheckboxesWidget.js +108 -0
- package/dist/es/components/widgets/ColorWidget.js +34 -0
- package/dist/es/components/widgets/DateTimeWidget.js +31 -0
- package/dist/es/components/widgets/DateWidget.js +28 -0
- package/dist/es/components/widgets/EmailWidget.js +23 -0
- package/dist/es/components/widgets/FileWidget.js +201 -0
- package/dist/es/components/widgets/HiddenWidget.js +25 -0
- package/dist/es/components/widgets/PasswordWidget.js +23 -0
- package/dist/es/components/widgets/RadioWidget.js +94 -0
- package/dist/es/components/widgets/RangeWidget.js +34 -0
- package/dist/es/components/widgets/SelectWidget.js +138 -0
- package/dist/es/components/widgets/SubmitButton.js +24 -0
- package/dist/es/components/widgets/TextWidget.js +20 -0
- package/dist/es/components/widgets/TextareaWidget.js +70 -0
- package/dist/es/components/widgets/URLWidget.js +23 -0
- package/dist/es/components/widgets/UpDownWidget.js +24 -0
- package/dist/es/components/widgets/index.js +43 -0
- package/dist/es/defaultRegistry.js +12 -0
- package/dist/es/index.js +16 -0
- package/dist/es/types.js +34 -0
- package/dist/es/utils.js +1309 -0
- package/dist/es/validate.js +338 -0
- package/dist/es/withTheme.js +39 -0
- package/lib/components/AddButton.js +28 -0
- package/lib/components/ErrorList.js +31 -0
- package/lib/components/Form.js +572 -0
- package/lib/components/IconButton.js +27 -0
- package/lib/components/fields/ArrayField.js +959 -0
- package/lib/components/fields/BooleanField.js +93 -0
- package/lib/components/fields/DescriptionField.js +39 -0
- package/lib/components/fields/MultiSchemaField.js +261 -0
- package/lib/components/fields/NullField.js +55 -0
- package/lib/components/fields/NumberField.js +141 -0
- package/lib/components/fields/ObjectField.js +351 -0
- package/lib/components/fields/SchemaField.js +528 -0
- package/lib/components/fields/StringField.js +84 -0
- package/lib/components/fields/TitleField.js +30 -0
- package/lib/components/fields/UnsupportedField.js +35 -0
- package/lib/components/fields/index.js +26 -0
- package/lib/components/widgets/AltDateTimeWidget.js +36 -0
- package/lib/components/widgets/AltDateWidget.js +287 -0
- package/lib/components/widgets/BaseInput.js +140 -0
- package/lib/components/widgets/CheckboxWidget.js +73 -0
- package/lib/components/widgets/CheckboxesWidget.js +108 -0
- package/lib/components/widgets/ColorWidget.js +34 -0
- package/lib/components/widgets/DateTimeWidget.js +31 -0
- package/lib/components/widgets/DateWidget.js +28 -0
- package/lib/components/widgets/EmailWidget.js +23 -0
- package/lib/components/widgets/FileWidget.js +201 -0
- package/lib/components/widgets/HiddenWidget.js +25 -0
- package/lib/components/widgets/PasswordWidget.js +23 -0
- package/lib/components/widgets/RadioWidget.js +94 -0
- package/lib/components/widgets/RangeWidget.js +34 -0
- package/lib/components/widgets/SelectWidget.js +138 -0
- package/lib/components/widgets/SubmitButton.js +24 -0
- package/lib/components/widgets/TextWidget.js +20 -0
- package/lib/components/widgets/TextareaWidget.js +70 -0
- package/lib/components/widgets/URLWidget.js +23 -0
- package/lib/components/widgets/UpDownWidget.js +24 -0
- package/lib/components/widgets/index.js +43 -0
- package/lib/defaultRegistry.js +12 -0
- package/lib/index.js +16 -0
- package/lib/types.js +34 -0
- package/lib/utils.js +1309 -0
- package/lib/validate.js +338 -0
- package/lib/withTheme.js +39 -0
- package/package.json +6 -3
|
@@ -0,0 +1,959 @@
|
|
|
1
|
+
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
2
|
+
|
|
3
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
4
|
+
|
|
5
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
6
|
+
|
|
7
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
|
|
8
|
+
|
|
9
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
|
|
10
|
+
|
|
11
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
|
|
12
|
+
|
|
13
|
+
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
|
|
14
|
+
|
|
15
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
|
|
16
|
+
|
|
17
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
18
|
+
|
|
19
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
20
|
+
|
|
21
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
22
|
+
|
|
23
|
+
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
|
24
|
+
|
|
25
|
+
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
26
|
+
|
|
27
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
28
|
+
|
|
29
|
+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
30
|
+
|
|
31
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
32
|
+
|
|
33
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
34
|
+
|
|
35
|
+
import AddButton from "../AddButton";
|
|
36
|
+
import IconButton from "../IconButton";
|
|
37
|
+
import React, { Component } from "react";
|
|
38
|
+
import includes from "core-js-pure/es/array/includes";
|
|
39
|
+
import * as types from "../../types";
|
|
40
|
+
import { getWidget, getDefaultFormState, getUiOptions, isMultiSelect, isFilesArray, isFixedItems, allowAdditionalItems, isCustomWidget, optionsList, retrieveSchema, toIdSchema } from "../../utils";
|
|
41
|
+
import { nanoid } from "nanoid";
|
|
42
|
+
|
|
43
|
+
function ArrayFieldTitle(_ref) {
|
|
44
|
+
var TitleField = _ref.TitleField,
|
|
45
|
+
idSchema = _ref.idSchema,
|
|
46
|
+
title = _ref.title,
|
|
47
|
+
required = _ref.required;
|
|
48
|
+
|
|
49
|
+
if (!title) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
var id = "".concat(idSchema.$id, "__title");
|
|
54
|
+
return (
|
|
55
|
+
/*#__PURE__*/
|
|
56
|
+
React.createElement(TitleField, {
|
|
57
|
+
id: id,
|
|
58
|
+
title: title,
|
|
59
|
+
required: required
|
|
60
|
+
})
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function ArrayFieldDescription(_ref2) {
|
|
65
|
+
var DescriptionField = _ref2.DescriptionField,
|
|
66
|
+
idSchema = _ref2.idSchema,
|
|
67
|
+
description = _ref2.description;
|
|
68
|
+
|
|
69
|
+
if (!description) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
var id = "".concat(idSchema.$id, "__description");
|
|
74
|
+
return (
|
|
75
|
+
/*#__PURE__*/
|
|
76
|
+
React.createElement(DescriptionField, {
|
|
77
|
+
id: id,
|
|
78
|
+
description: description
|
|
79
|
+
})
|
|
80
|
+
);
|
|
81
|
+
} // Used in the two templates
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
function DefaultArrayItem(props) {
|
|
85
|
+
var btnStyle = {
|
|
86
|
+
flex: 1,
|
|
87
|
+
paddingLeft: 6,
|
|
88
|
+
paddingRight: 6,
|
|
89
|
+
fontWeight: "bold"
|
|
90
|
+
};
|
|
91
|
+
return (
|
|
92
|
+
/*#__PURE__*/
|
|
93
|
+
React.createElement("div", {
|
|
94
|
+
key: props.key,
|
|
95
|
+
className: props.className
|
|
96
|
+
},
|
|
97
|
+
/*#__PURE__*/
|
|
98
|
+
React.createElement("div", {
|
|
99
|
+
className: props.hasToolbar ? "col-xs-9" : "col-xs-12"
|
|
100
|
+
}, props.children), props.hasToolbar &&
|
|
101
|
+
/*#__PURE__*/
|
|
102
|
+
React.createElement("div", {
|
|
103
|
+
className: "col-xs-3 array-item-toolbox"
|
|
104
|
+
},
|
|
105
|
+
/*#__PURE__*/
|
|
106
|
+
React.createElement("div", {
|
|
107
|
+
className: "btn-group",
|
|
108
|
+
style: {
|
|
109
|
+
display: "flex",
|
|
110
|
+
justifyContent: "space-around"
|
|
111
|
+
}
|
|
112
|
+
}, (props.hasMoveUp || props.hasMoveDown) &&
|
|
113
|
+
/*#__PURE__*/
|
|
114
|
+
React.createElement(IconButton, {
|
|
115
|
+
icon: "arrow-up",
|
|
116
|
+
"aria-label": "Move up",
|
|
117
|
+
className: "array-item-move-up",
|
|
118
|
+
tabIndex: "-1",
|
|
119
|
+
style: btnStyle,
|
|
120
|
+
disabled: props.disabled || props.readonly || !props.hasMoveUp,
|
|
121
|
+
onClick: props.onReorderClick(props.index, props.index - 1)
|
|
122
|
+
}), (props.hasMoveUp || props.hasMoveDown) &&
|
|
123
|
+
/*#__PURE__*/
|
|
124
|
+
React.createElement(IconButton, {
|
|
125
|
+
icon: "arrow-down",
|
|
126
|
+
className: "array-item-move-down",
|
|
127
|
+
"aria-label": "Move down",
|
|
128
|
+
tabIndex: "-1",
|
|
129
|
+
style: btnStyle,
|
|
130
|
+
disabled: props.disabled || props.readonly || !props.hasMoveDown,
|
|
131
|
+
onClick: props.onReorderClick(props.index, props.index + 1)
|
|
132
|
+
}), props.hasRemove &&
|
|
133
|
+
/*#__PURE__*/
|
|
134
|
+
React.createElement(IconButton, {
|
|
135
|
+
type: "danger",
|
|
136
|
+
icon: "remove",
|
|
137
|
+
"aria-label": "Remove",
|
|
138
|
+
className: "array-item-remove",
|
|
139
|
+
tabIndex: "-1",
|
|
140
|
+
style: btnStyle,
|
|
141
|
+
disabled: props.disabled || props.readonly,
|
|
142
|
+
onClick: props.onDropIndexClick(props.index)
|
|
143
|
+
}))))
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function DefaultFixedArrayFieldTemplate(props) {
|
|
148
|
+
return (
|
|
149
|
+
/*#__PURE__*/
|
|
150
|
+
React.createElement("fieldset", {
|
|
151
|
+
className: props.className,
|
|
152
|
+
id: props.idSchema.$id
|
|
153
|
+
},
|
|
154
|
+
/*#__PURE__*/
|
|
155
|
+
React.createElement(ArrayFieldTitle, {
|
|
156
|
+
key: "array-field-title-".concat(props.idSchema.$id),
|
|
157
|
+
TitleField: props.TitleField,
|
|
158
|
+
idSchema: props.idSchema,
|
|
159
|
+
title: props.uiSchema["ui:title"] || props.title,
|
|
160
|
+
required: props.required
|
|
161
|
+
}), (props.uiSchema["ui:description"] || props.schema.description) &&
|
|
162
|
+
/*#__PURE__*/
|
|
163
|
+
React.createElement("div", {
|
|
164
|
+
className: "field-description",
|
|
165
|
+
key: "field-description-".concat(props.idSchema.$id)
|
|
166
|
+
}, props.uiSchema["ui:description"] || props.schema.description),
|
|
167
|
+
/*#__PURE__*/
|
|
168
|
+
React.createElement("div", {
|
|
169
|
+
className: "row array-item-list",
|
|
170
|
+
key: "array-item-list-".concat(props.idSchema.$id)
|
|
171
|
+
}, props.items && props.items.map(DefaultArrayItem)), props.canAdd &&
|
|
172
|
+
/*#__PURE__*/
|
|
173
|
+
React.createElement(AddButton, {
|
|
174
|
+
className: "array-item-add",
|
|
175
|
+
onClick: props.onAddClick,
|
|
176
|
+
disabled: props.disabled || props.readonly
|
|
177
|
+
}))
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function DefaultNormalArrayFieldTemplate(props) {
|
|
182
|
+
return (
|
|
183
|
+
/*#__PURE__*/
|
|
184
|
+
React.createElement("fieldset", {
|
|
185
|
+
className: props.className,
|
|
186
|
+
id: props.idSchema.$id
|
|
187
|
+
},
|
|
188
|
+
/*#__PURE__*/
|
|
189
|
+
React.createElement(ArrayFieldTitle, {
|
|
190
|
+
key: "array-field-title-".concat(props.idSchema.$id),
|
|
191
|
+
TitleField: props.TitleField,
|
|
192
|
+
idSchema: props.idSchema,
|
|
193
|
+
title: props.uiSchema["ui:title"] || props.title,
|
|
194
|
+
required: props.required
|
|
195
|
+
}), (props.uiSchema["ui:description"] || props.schema.description) &&
|
|
196
|
+
/*#__PURE__*/
|
|
197
|
+
React.createElement(ArrayFieldDescription, {
|
|
198
|
+
key: "array-field-description-".concat(props.idSchema.$id),
|
|
199
|
+
DescriptionField: props.DescriptionField,
|
|
200
|
+
idSchema: props.idSchema,
|
|
201
|
+
description: props.uiSchema["ui:description"] || props.schema.description
|
|
202
|
+
}),
|
|
203
|
+
/*#__PURE__*/
|
|
204
|
+
React.createElement("div", {
|
|
205
|
+
className: "row array-item-list",
|
|
206
|
+
key: "array-item-list-".concat(props.idSchema.$id)
|
|
207
|
+
}, props.items && props.items.map(function (p) {
|
|
208
|
+
return DefaultArrayItem(p);
|
|
209
|
+
})), props.canAdd &&
|
|
210
|
+
/*#__PURE__*/
|
|
211
|
+
React.createElement(AddButton, {
|
|
212
|
+
className: "array-item-add",
|
|
213
|
+
onClick: props.onAddClick,
|
|
214
|
+
disabled: props.disabled || props.readonly
|
|
215
|
+
}))
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function generateRowId() {
|
|
220
|
+
return nanoid();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function generateKeyedFormData(formData) {
|
|
224
|
+
return !Array.isArray(formData) ? [] : formData.map(function (item) {
|
|
225
|
+
return {
|
|
226
|
+
key: generateRowId(),
|
|
227
|
+
item: item
|
|
228
|
+
};
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function keyedToPlainFormData(keyedFormData) {
|
|
233
|
+
return keyedFormData.map(function (keyedItem) {
|
|
234
|
+
return keyedItem.item;
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
var ArrayField =
|
|
239
|
+
/*#__PURE__*/
|
|
240
|
+
function (_Component) {
|
|
241
|
+
_inherits(ArrayField, _Component);
|
|
242
|
+
|
|
243
|
+
function ArrayField(props) {
|
|
244
|
+
var _this;
|
|
245
|
+
|
|
246
|
+
_classCallCheck(this, ArrayField);
|
|
247
|
+
|
|
248
|
+
_this = _possibleConstructorReturn(this, _getPrototypeOf(ArrayField).call(this, props));
|
|
249
|
+
|
|
250
|
+
_defineProperty(_assertThisInitialized(_this), "_getNewFormDataRow", function () {
|
|
251
|
+
var _this$props = _this.props,
|
|
252
|
+
schema = _this$props.schema,
|
|
253
|
+
registry = _this$props.registry;
|
|
254
|
+
var rootSchema = registry.rootSchema;
|
|
255
|
+
var itemSchema = schema.items;
|
|
256
|
+
|
|
257
|
+
if (isFixedItems(schema) && allowAdditionalItems(schema)) {
|
|
258
|
+
itemSchema = schema.additionalItems;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return getDefaultFormState(itemSchema, undefined, rootSchema);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
_defineProperty(_assertThisInitialized(_this), "onAddClick", function (event) {
|
|
265
|
+
if (event) {
|
|
266
|
+
event.preventDefault();
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var onChange = _this.props.onChange;
|
|
270
|
+
var newKeyedFormDataRow = {
|
|
271
|
+
key: generateRowId(),
|
|
272
|
+
item: _this._getNewFormDataRow()
|
|
273
|
+
};
|
|
274
|
+
var newKeyedFormData = [].concat(_toConsumableArray(_this.state.keyedFormData), [newKeyedFormDataRow]);
|
|
275
|
+
|
|
276
|
+
_this.setState({
|
|
277
|
+
keyedFormData: newKeyedFormData,
|
|
278
|
+
updatedKeyedFormData: true
|
|
279
|
+
}, function () {
|
|
280
|
+
return onChange(keyedToPlainFormData(newKeyedFormData));
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
_defineProperty(_assertThisInitialized(_this), "onAddIndexClick", function (index) {
|
|
285
|
+
return function (event) {
|
|
286
|
+
if (event) {
|
|
287
|
+
event.preventDefault();
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
var onChange = _this.props.onChange;
|
|
291
|
+
var newKeyedFormDataRow = {
|
|
292
|
+
key: generateRowId(),
|
|
293
|
+
item: _this._getNewFormDataRow()
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
var newKeyedFormData = _toConsumableArray(_this.state.keyedFormData);
|
|
297
|
+
|
|
298
|
+
newKeyedFormData.splice(index, 0, newKeyedFormDataRow);
|
|
299
|
+
|
|
300
|
+
_this.setState({
|
|
301
|
+
keyedFormData: newKeyedFormData,
|
|
302
|
+
updatedKeyedFormData: true
|
|
303
|
+
}, function () {
|
|
304
|
+
return onChange(keyedToPlainFormData(newKeyedFormData));
|
|
305
|
+
});
|
|
306
|
+
};
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
_defineProperty(_assertThisInitialized(_this), "onDropIndexClick", function (index) {
|
|
310
|
+
return function (event) {
|
|
311
|
+
if (event) {
|
|
312
|
+
event.preventDefault();
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
var onChange = _this.props.onChange;
|
|
316
|
+
var keyedFormData = _this.state.keyedFormData; // refs #195: revalidate to ensure properly reindexing errors
|
|
317
|
+
|
|
318
|
+
var newErrorSchema;
|
|
319
|
+
|
|
320
|
+
if (_this.props.errorSchema) {
|
|
321
|
+
newErrorSchema = {};
|
|
322
|
+
var errorSchema = _this.props.errorSchema;
|
|
323
|
+
|
|
324
|
+
for (var i in errorSchema) {
|
|
325
|
+
i = parseInt(i);
|
|
326
|
+
|
|
327
|
+
if (i < index) {
|
|
328
|
+
newErrorSchema[i] = errorSchema[i];
|
|
329
|
+
} else if (i > index) {
|
|
330
|
+
newErrorSchema[i - 1] = errorSchema[i];
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
var newKeyedFormData = keyedFormData.filter(function (_, i) {
|
|
336
|
+
return i !== index;
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
_this.setState({
|
|
340
|
+
keyedFormData: newKeyedFormData,
|
|
341
|
+
updatedKeyedFormData: true
|
|
342
|
+
}, function () {
|
|
343
|
+
return onChange(keyedToPlainFormData(newKeyedFormData), newErrorSchema);
|
|
344
|
+
});
|
|
345
|
+
};
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
_defineProperty(_assertThisInitialized(_this), "onReorderClick", function (index, newIndex) {
|
|
349
|
+
return function (event) {
|
|
350
|
+
if (event) {
|
|
351
|
+
event.preventDefault();
|
|
352
|
+
event.target.blur();
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
var onChange = _this.props.onChange;
|
|
356
|
+
var newErrorSchema;
|
|
357
|
+
|
|
358
|
+
if (_this.props.errorSchema) {
|
|
359
|
+
newErrorSchema = {};
|
|
360
|
+
var errorSchema = _this.props.errorSchema;
|
|
361
|
+
|
|
362
|
+
for (var i in errorSchema) {
|
|
363
|
+
if (i == index) {
|
|
364
|
+
newErrorSchema[newIndex] = errorSchema[index];
|
|
365
|
+
} else if (i == newIndex) {
|
|
366
|
+
newErrorSchema[index] = errorSchema[newIndex];
|
|
367
|
+
} else {
|
|
368
|
+
newErrorSchema[i] = errorSchema[i];
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
var keyedFormData = _this.state.keyedFormData;
|
|
374
|
+
|
|
375
|
+
function reOrderArray() {
|
|
376
|
+
// Copy item
|
|
377
|
+
var _newKeyedFormData = keyedFormData.slice(); // Moves item from index to newIndex
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
_newKeyedFormData.splice(index, 1);
|
|
381
|
+
|
|
382
|
+
_newKeyedFormData.splice(newIndex, 0, keyedFormData[index]);
|
|
383
|
+
|
|
384
|
+
return _newKeyedFormData;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
var newKeyedFormData = reOrderArray();
|
|
388
|
+
|
|
389
|
+
_this.setState({
|
|
390
|
+
keyedFormData: newKeyedFormData
|
|
391
|
+
}, function () {
|
|
392
|
+
return onChange(keyedToPlainFormData(newKeyedFormData), newErrorSchema);
|
|
393
|
+
});
|
|
394
|
+
};
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
_defineProperty(_assertThisInitialized(_this), "onChangeForIndex", function (index) {
|
|
398
|
+
return function (value, errorSchema) {
|
|
399
|
+
var _this$props2 = _this.props,
|
|
400
|
+
formData = _this$props2.formData,
|
|
401
|
+
onChange = _this$props2.onChange;
|
|
402
|
+
var newFormData = formData.map(function (item, i) {
|
|
403
|
+
// We need to treat undefined items as nulls to have validation.
|
|
404
|
+
// See https://github.com/tdegrunt/jsonschema/issues/206
|
|
405
|
+
var jsonValue = typeof value === "undefined" ? null : value;
|
|
406
|
+
return index === i ? jsonValue : item;
|
|
407
|
+
});
|
|
408
|
+
onChange(newFormData, errorSchema && _this.props.errorSchema && _objectSpread({}, _this.props.errorSchema, _defineProperty({}, index, errorSchema)));
|
|
409
|
+
};
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
_defineProperty(_assertThisInitialized(_this), "onSelectChange", function (value) {
|
|
413
|
+
_this.props.onChange(value);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
var _formData = props.formData;
|
|
417
|
+
|
|
418
|
+
var _keyedFormData = generateKeyedFormData(_formData);
|
|
419
|
+
|
|
420
|
+
_this.state = {
|
|
421
|
+
keyedFormData: _keyedFormData,
|
|
422
|
+
updatedKeyedFormData: false
|
|
423
|
+
};
|
|
424
|
+
return _this;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
_createClass(ArrayField, [{
|
|
428
|
+
key: "isItemRequired",
|
|
429
|
+
value: function isItemRequired(itemSchema) {
|
|
430
|
+
if (Array.isArray(itemSchema.type)) {
|
|
431
|
+
// While we don't yet support composite/nullable jsonschema types, it's
|
|
432
|
+
// future-proof to check for requirement against these.
|
|
433
|
+
return !includes(itemSchema.type, "null");
|
|
434
|
+
} // All non-null array item types are inherently required by design
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
return itemSchema.type !== "null";
|
|
438
|
+
}
|
|
439
|
+
}, {
|
|
440
|
+
key: "canAddItem",
|
|
441
|
+
value: function canAddItem(formItems) {
|
|
442
|
+
var _this$props3 = this.props,
|
|
443
|
+
schema = _this$props3.schema,
|
|
444
|
+
uiSchema = _this$props3.uiSchema;
|
|
445
|
+
|
|
446
|
+
var _getUiOptions = getUiOptions(uiSchema),
|
|
447
|
+
addable = _getUiOptions.addable;
|
|
448
|
+
|
|
449
|
+
if (addable !== false) {
|
|
450
|
+
// if ui:options.addable was not explicitly set to false, we can add
|
|
451
|
+
// another item if we have not exceeded maxItems yet
|
|
452
|
+
if (schema.maxItems !== undefined) {
|
|
453
|
+
addable = formItems.length < schema.maxItems;
|
|
454
|
+
} else {
|
|
455
|
+
addable = true;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return addable;
|
|
460
|
+
}
|
|
461
|
+
}, {
|
|
462
|
+
key: "render",
|
|
463
|
+
value: function render() {
|
|
464
|
+
var _this$props4 = this.props,
|
|
465
|
+
schema = _this$props4.schema,
|
|
466
|
+
uiSchema = _this$props4.uiSchema,
|
|
467
|
+
idSchema = _this$props4.idSchema,
|
|
468
|
+
registry = _this$props4.registry;
|
|
469
|
+
var rootSchema = registry.rootSchema;
|
|
470
|
+
|
|
471
|
+
if (!schema.hasOwnProperty("items")) {
|
|
472
|
+
var fields = registry.fields;
|
|
473
|
+
var UnsupportedField = fields.UnsupportedField;
|
|
474
|
+
return (
|
|
475
|
+
/*#__PURE__*/
|
|
476
|
+
React.createElement(UnsupportedField, {
|
|
477
|
+
schema: schema,
|
|
478
|
+
idSchema: idSchema,
|
|
479
|
+
reason: "Missing items definition"
|
|
480
|
+
})
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if (isMultiSelect(schema, rootSchema)) {
|
|
485
|
+
// If array has enum or uniqueItems set to true, call renderMultiSelect() to render the default multiselect widget or a custom widget, if specified.
|
|
486
|
+
return this.renderMultiSelect();
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (isCustomWidget(uiSchema)) {
|
|
490
|
+
return this.renderCustomWidget();
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (isFixedItems(schema)) {
|
|
494
|
+
return this.renderFixedArray();
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
if (isFilesArray(schema, uiSchema, rootSchema)) {
|
|
498
|
+
return this.renderFiles();
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
return this.renderNormalArray();
|
|
502
|
+
}
|
|
503
|
+
}, {
|
|
504
|
+
key: "renderNormalArray",
|
|
505
|
+
value: function renderNormalArray() {
|
|
506
|
+
var _this2 = this;
|
|
507
|
+
|
|
508
|
+
var _this$props5 = this.props,
|
|
509
|
+
schema = _this$props5.schema,
|
|
510
|
+
uiSchema = _this$props5.uiSchema,
|
|
511
|
+
errorSchema = _this$props5.errorSchema,
|
|
512
|
+
idSchema = _this$props5.idSchema,
|
|
513
|
+
name = _this$props5.name,
|
|
514
|
+
required = _this$props5.required,
|
|
515
|
+
disabled = _this$props5.disabled,
|
|
516
|
+
readonly = _this$props5.readonly,
|
|
517
|
+
hideError = _this$props5.hideError,
|
|
518
|
+
autofocus = _this$props5.autofocus,
|
|
519
|
+
registry = _this$props5.registry,
|
|
520
|
+
onBlur = _this$props5.onBlur,
|
|
521
|
+
onFocus = _this$props5.onFocus,
|
|
522
|
+
idPrefix = _this$props5.idPrefix,
|
|
523
|
+
_this$props5$idSepara = _this$props5.idSeparator,
|
|
524
|
+
idSeparator = _this$props5$idSepara === void 0 ? "_" : _this$props5$idSepara,
|
|
525
|
+
rawErrors = _this$props5.rawErrors;
|
|
526
|
+
var title = schema.title === undefined ? name : schema.title;
|
|
527
|
+
var ArrayFieldTemplate = registry.ArrayFieldTemplate,
|
|
528
|
+
rootSchema = registry.rootSchema,
|
|
529
|
+
fields = registry.fields,
|
|
530
|
+
formContext = registry.formContext;
|
|
531
|
+
var TitleField = fields.TitleField,
|
|
532
|
+
DescriptionField = fields.DescriptionField;
|
|
533
|
+
var itemsSchema = retrieveSchema(schema.items, rootSchema);
|
|
534
|
+
var formData = keyedToPlainFormData(this.state.keyedFormData);
|
|
535
|
+
var arrayProps = {
|
|
536
|
+
canAdd: this.canAddItem(formData),
|
|
537
|
+
items: this.state.keyedFormData.map(function (keyedItem, index) {
|
|
538
|
+
var key = keyedItem.key,
|
|
539
|
+
item = keyedItem.item;
|
|
540
|
+
var itemSchema = retrieveSchema(schema.items, rootSchema, item);
|
|
541
|
+
var itemErrorSchema = errorSchema ? errorSchema[index] : undefined;
|
|
542
|
+
var itemIdPrefix = idSchema.$id + idSeparator + index;
|
|
543
|
+
var itemIdSchema = toIdSchema(itemSchema, itemIdPrefix, rootSchema, item, idPrefix, idSeparator);
|
|
544
|
+
return _this2.renderArrayFieldItem({
|
|
545
|
+
key: key,
|
|
546
|
+
index: index,
|
|
547
|
+
canMoveUp: index > 0,
|
|
548
|
+
canMoveDown: index < formData.length - 1,
|
|
549
|
+
itemSchema: itemSchema,
|
|
550
|
+
itemIdSchema: itemIdSchema,
|
|
551
|
+
itemErrorSchema: itemErrorSchema,
|
|
552
|
+
itemData: item,
|
|
553
|
+
itemUiSchema: uiSchema.items,
|
|
554
|
+
autofocus: autofocus && index === 0,
|
|
555
|
+
onBlur: onBlur,
|
|
556
|
+
onFocus: onFocus
|
|
557
|
+
});
|
|
558
|
+
}),
|
|
559
|
+
className: "field field-array field-array-of-".concat(itemsSchema.type),
|
|
560
|
+
DescriptionField: DescriptionField,
|
|
561
|
+
disabled: disabled,
|
|
562
|
+
idSchema: idSchema,
|
|
563
|
+
uiSchema: uiSchema,
|
|
564
|
+
onAddClick: this.onAddClick,
|
|
565
|
+
readonly: readonly,
|
|
566
|
+
hideError: hideError,
|
|
567
|
+
required: required,
|
|
568
|
+
schema: schema,
|
|
569
|
+
title: title,
|
|
570
|
+
TitleField: TitleField,
|
|
571
|
+
formContext: formContext,
|
|
572
|
+
formData: formData,
|
|
573
|
+
rawErrors: rawErrors,
|
|
574
|
+
registry: registry
|
|
575
|
+
}; // Check if a custom render function was passed in
|
|
576
|
+
|
|
577
|
+
var Component = uiSchema["ui:ArrayFieldTemplate"] || ArrayFieldTemplate || DefaultNormalArrayFieldTemplate;
|
|
578
|
+
return (
|
|
579
|
+
/*#__PURE__*/
|
|
580
|
+
React.createElement(Component, arrayProps)
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
}, {
|
|
584
|
+
key: "renderCustomWidget",
|
|
585
|
+
value: function renderCustomWidget() {
|
|
586
|
+
var _this$props6 = this.props,
|
|
587
|
+
schema = _this$props6.schema,
|
|
588
|
+
idSchema = _this$props6.idSchema,
|
|
589
|
+
uiSchema = _this$props6.uiSchema,
|
|
590
|
+
disabled = _this$props6.disabled,
|
|
591
|
+
readonly = _this$props6.readonly,
|
|
592
|
+
hideError = _this$props6.hideError,
|
|
593
|
+
required = _this$props6.required,
|
|
594
|
+
placeholder = _this$props6.placeholder,
|
|
595
|
+
autofocus = _this$props6.autofocus,
|
|
596
|
+
onBlur = _this$props6.onBlur,
|
|
597
|
+
onFocus = _this$props6.onFocus,
|
|
598
|
+
items = _this$props6.formData,
|
|
599
|
+
registry = _this$props6.registry,
|
|
600
|
+
rawErrors = _this$props6.rawErrors,
|
|
601
|
+
name = _this$props6.name;
|
|
602
|
+
var widgets = registry.widgets,
|
|
603
|
+
formContext = registry.formContext;
|
|
604
|
+
var title = schema.title || name;
|
|
605
|
+
|
|
606
|
+
var _getUiOptions2 = _objectSpread({}, getUiOptions(uiSchema)),
|
|
607
|
+
widget = _getUiOptions2.widget,
|
|
608
|
+
options = _objectWithoutProperties(_getUiOptions2, ["widget"]);
|
|
609
|
+
|
|
610
|
+
var Widget = getWidget(schema, widget, widgets);
|
|
611
|
+
return (
|
|
612
|
+
/*#__PURE__*/
|
|
613
|
+
React.createElement(Widget, {
|
|
614
|
+
id: idSchema && idSchema.$id,
|
|
615
|
+
multiple: true,
|
|
616
|
+
onChange: this.onSelectChange,
|
|
617
|
+
onBlur: onBlur,
|
|
618
|
+
onFocus: onFocus,
|
|
619
|
+
options: options,
|
|
620
|
+
schema: schema,
|
|
621
|
+
uiSchema: uiSchema,
|
|
622
|
+
registry: registry,
|
|
623
|
+
value: items,
|
|
624
|
+
disabled: disabled,
|
|
625
|
+
readonly: readonly,
|
|
626
|
+
hideError: hideError,
|
|
627
|
+
required: required,
|
|
628
|
+
label: title,
|
|
629
|
+
placeholder: placeholder,
|
|
630
|
+
formContext: formContext,
|
|
631
|
+
autofocus: autofocus,
|
|
632
|
+
rawErrors: rawErrors
|
|
633
|
+
})
|
|
634
|
+
);
|
|
635
|
+
}
|
|
636
|
+
}, {
|
|
637
|
+
key: "renderMultiSelect",
|
|
638
|
+
value: function renderMultiSelect() {
|
|
639
|
+
var _this$props7 = this.props,
|
|
640
|
+
schema = _this$props7.schema,
|
|
641
|
+
idSchema = _this$props7.idSchema,
|
|
642
|
+
uiSchema = _this$props7.uiSchema,
|
|
643
|
+
formData = _this$props7.formData,
|
|
644
|
+
disabled = _this$props7.disabled,
|
|
645
|
+
readonly = _this$props7.readonly,
|
|
646
|
+
required = _this$props7.required,
|
|
647
|
+
placeholder = _this$props7.placeholder,
|
|
648
|
+
autofocus = _this$props7.autofocus,
|
|
649
|
+
onBlur = _this$props7.onBlur,
|
|
650
|
+
onFocus = _this$props7.onFocus,
|
|
651
|
+
registry = _this$props7.registry,
|
|
652
|
+
rawErrors = _this$props7.rawErrors,
|
|
653
|
+
name = _this$props7.name;
|
|
654
|
+
var items = this.props.formData;
|
|
655
|
+
var widgets = registry.widgets,
|
|
656
|
+
rootSchema = registry.rootSchema,
|
|
657
|
+
formContext = registry.formContext;
|
|
658
|
+
var itemsSchema = retrieveSchema(schema.items, rootSchema, formData);
|
|
659
|
+
var title = schema.title || name;
|
|
660
|
+
var enumOptions = optionsList(itemsSchema);
|
|
661
|
+
|
|
662
|
+
var _getUiOptions$enumOpt = _objectSpread({}, getUiOptions(uiSchema), {
|
|
663
|
+
enumOptions: enumOptions
|
|
664
|
+
}),
|
|
665
|
+
_getUiOptions$enumOpt2 = _getUiOptions$enumOpt.widget,
|
|
666
|
+
widget = _getUiOptions$enumOpt2 === void 0 ? "select" : _getUiOptions$enumOpt2,
|
|
667
|
+
options = _objectWithoutProperties(_getUiOptions$enumOpt, ["widget"]);
|
|
668
|
+
|
|
669
|
+
var Widget = getWidget(schema, widget, widgets);
|
|
670
|
+
return (
|
|
671
|
+
/*#__PURE__*/
|
|
672
|
+
React.createElement(Widget, {
|
|
673
|
+
id: idSchema && idSchema.$id,
|
|
674
|
+
multiple: true,
|
|
675
|
+
onChange: this.onSelectChange,
|
|
676
|
+
onBlur: onBlur,
|
|
677
|
+
onFocus: onFocus,
|
|
678
|
+
options: options,
|
|
679
|
+
schema: schema,
|
|
680
|
+
uiSchema: uiSchema,
|
|
681
|
+
registry: registry,
|
|
682
|
+
value: items,
|
|
683
|
+
disabled: disabled,
|
|
684
|
+
readonly: readonly,
|
|
685
|
+
required: required,
|
|
686
|
+
label: title,
|
|
687
|
+
placeholder: placeholder,
|
|
688
|
+
formContext: formContext,
|
|
689
|
+
autofocus: autofocus,
|
|
690
|
+
rawErrors: rawErrors
|
|
691
|
+
})
|
|
692
|
+
);
|
|
693
|
+
}
|
|
694
|
+
}, {
|
|
695
|
+
key: "renderFiles",
|
|
696
|
+
value: function renderFiles() {
|
|
697
|
+
var _this$props8 = this.props,
|
|
698
|
+
schema = _this$props8.schema,
|
|
699
|
+
uiSchema = _this$props8.uiSchema,
|
|
700
|
+
idSchema = _this$props8.idSchema,
|
|
701
|
+
name = _this$props8.name,
|
|
702
|
+
disabled = _this$props8.disabled,
|
|
703
|
+
readonly = _this$props8.readonly,
|
|
704
|
+
autofocus = _this$props8.autofocus,
|
|
705
|
+
onBlur = _this$props8.onBlur,
|
|
706
|
+
onFocus = _this$props8.onFocus,
|
|
707
|
+
registry = _this$props8.registry,
|
|
708
|
+
rawErrors = _this$props8.rawErrors;
|
|
709
|
+
var title = schema.title || name;
|
|
710
|
+
var items = this.props.formData;
|
|
711
|
+
var widgets = registry.widgets,
|
|
712
|
+
formContext = registry.formContext;
|
|
713
|
+
|
|
714
|
+
var _getUiOptions3 = getUiOptions(uiSchema),
|
|
715
|
+
_getUiOptions3$widget = _getUiOptions3.widget,
|
|
716
|
+
widget = _getUiOptions3$widget === void 0 ? "files" : _getUiOptions3$widget,
|
|
717
|
+
options = _objectWithoutProperties(_getUiOptions3, ["widget"]);
|
|
718
|
+
|
|
719
|
+
var Widget = getWidget(schema, widget, widgets);
|
|
720
|
+
return (
|
|
721
|
+
/*#__PURE__*/
|
|
722
|
+
React.createElement(Widget, {
|
|
723
|
+
options: options,
|
|
724
|
+
id: idSchema && idSchema.$id,
|
|
725
|
+
multiple: true,
|
|
726
|
+
onChange: this.onSelectChange,
|
|
727
|
+
onBlur: onBlur,
|
|
728
|
+
onFocus: onFocus,
|
|
729
|
+
schema: schema,
|
|
730
|
+
uiSchema: uiSchema,
|
|
731
|
+
title: title,
|
|
732
|
+
value: items,
|
|
733
|
+
disabled: disabled,
|
|
734
|
+
readonly: readonly,
|
|
735
|
+
registry: registry,
|
|
736
|
+
formContext: formContext,
|
|
737
|
+
autofocus: autofocus,
|
|
738
|
+
rawErrors: rawErrors
|
|
739
|
+
})
|
|
740
|
+
);
|
|
741
|
+
}
|
|
742
|
+
}, {
|
|
743
|
+
key: "renderFixedArray",
|
|
744
|
+
value: function renderFixedArray() {
|
|
745
|
+
var _this3 = this;
|
|
746
|
+
|
|
747
|
+
var _this$props9 = this.props,
|
|
748
|
+
schema = _this$props9.schema,
|
|
749
|
+
uiSchema = _this$props9.uiSchema,
|
|
750
|
+
formData = _this$props9.formData,
|
|
751
|
+
errorSchema = _this$props9.errorSchema,
|
|
752
|
+
idPrefix = _this$props9.idPrefix,
|
|
753
|
+
_this$props9$idSepara = _this$props9.idSeparator,
|
|
754
|
+
idSeparator = _this$props9$idSepara === void 0 ? "_" : _this$props9$idSepara,
|
|
755
|
+
idSchema = _this$props9.idSchema,
|
|
756
|
+
name = _this$props9.name,
|
|
757
|
+
required = _this$props9.required,
|
|
758
|
+
disabled = _this$props9.disabled,
|
|
759
|
+
readonly = _this$props9.readonly,
|
|
760
|
+
autofocus = _this$props9.autofocus,
|
|
761
|
+
registry = _this$props9.registry,
|
|
762
|
+
onBlur = _this$props9.onBlur,
|
|
763
|
+
onFocus = _this$props9.onFocus,
|
|
764
|
+
rawErrors = _this$props9.rawErrors;
|
|
765
|
+
var title = schema.title || name;
|
|
766
|
+
var items = this.props.formData;
|
|
767
|
+
var ArrayFieldTemplate = registry.ArrayFieldTemplate,
|
|
768
|
+
rootSchema = registry.rootSchema,
|
|
769
|
+
fields = registry.fields,
|
|
770
|
+
formContext = registry.formContext;
|
|
771
|
+
var TitleField = fields.TitleField;
|
|
772
|
+
var itemSchemas = schema.items.map(function (item, index) {
|
|
773
|
+
return retrieveSchema(item, rootSchema, formData[index]);
|
|
774
|
+
});
|
|
775
|
+
var additionalSchema = allowAdditionalItems(schema) ? retrieveSchema(schema.additionalItems, rootSchema, formData) : null;
|
|
776
|
+
|
|
777
|
+
if (!items || items.length < itemSchemas.length) {
|
|
778
|
+
// to make sure at least all fixed items are generated
|
|
779
|
+
items = items || [];
|
|
780
|
+
items = items.concat(new Array(itemSchemas.length - items.length));
|
|
781
|
+
} // These are the props passed into the render function
|
|
782
|
+
|
|
783
|
+
|
|
784
|
+
var arrayProps = {
|
|
785
|
+
canAdd: this.canAddItem(items) && additionalSchema,
|
|
786
|
+
className: "field field-array field-array-fixed-items",
|
|
787
|
+
disabled: disabled,
|
|
788
|
+
idSchema: idSchema,
|
|
789
|
+
formData: formData,
|
|
790
|
+
items: this.state.keyedFormData.map(function (keyedItem, index) {
|
|
791
|
+
var key = keyedItem.key,
|
|
792
|
+
item = keyedItem.item;
|
|
793
|
+
var additional = index >= itemSchemas.length;
|
|
794
|
+
var itemSchema = additional ? retrieveSchema(schema.additionalItems, rootSchema, item) : itemSchemas[index];
|
|
795
|
+
var itemIdPrefix = idSchema.$id + idSeparator + index;
|
|
796
|
+
var itemIdSchema = toIdSchema(itemSchema, itemIdPrefix, rootSchema, item, idPrefix, idSeparator);
|
|
797
|
+
var itemUiSchema = additional ? uiSchema.additionalItems || {} : Array.isArray(uiSchema.items) ? uiSchema.items[index] : uiSchema.items || {};
|
|
798
|
+
var itemErrorSchema = errorSchema ? errorSchema[index] : undefined;
|
|
799
|
+
return _this3.renderArrayFieldItem({
|
|
800
|
+
key: key,
|
|
801
|
+
index: index,
|
|
802
|
+
canRemove: additional,
|
|
803
|
+
canMoveUp: index >= itemSchemas.length + 1,
|
|
804
|
+
canMoveDown: additional && index < items.length - 1,
|
|
805
|
+
itemSchema: itemSchema,
|
|
806
|
+
itemData: item,
|
|
807
|
+
itemUiSchema: itemUiSchema,
|
|
808
|
+
itemIdSchema: itemIdSchema,
|
|
809
|
+
itemErrorSchema: itemErrorSchema,
|
|
810
|
+
autofocus: autofocus && index === 0,
|
|
811
|
+
onBlur: onBlur,
|
|
812
|
+
onFocus: onFocus
|
|
813
|
+
});
|
|
814
|
+
}),
|
|
815
|
+
onAddClick: this.onAddClick,
|
|
816
|
+
readonly: readonly,
|
|
817
|
+
required: required,
|
|
818
|
+
registry: registry,
|
|
819
|
+
schema: schema,
|
|
820
|
+
uiSchema: uiSchema,
|
|
821
|
+
title: title,
|
|
822
|
+
TitleField: TitleField,
|
|
823
|
+
formContext: formContext,
|
|
824
|
+
rawErrors: rawErrors
|
|
825
|
+
}; // Check if a custom template template was passed in
|
|
826
|
+
|
|
827
|
+
var Template = uiSchema["ui:ArrayFieldTemplate"] || ArrayFieldTemplate || DefaultFixedArrayFieldTemplate;
|
|
828
|
+
return (
|
|
829
|
+
/*#__PURE__*/
|
|
830
|
+
React.createElement(Template, arrayProps)
|
|
831
|
+
);
|
|
832
|
+
}
|
|
833
|
+
}, {
|
|
834
|
+
key: "renderArrayFieldItem",
|
|
835
|
+
value: function renderArrayFieldItem(props) {
|
|
836
|
+
var key = props.key,
|
|
837
|
+
index = props.index,
|
|
838
|
+
_props$canRemove = props.canRemove,
|
|
839
|
+
canRemove = _props$canRemove === void 0 ? true : _props$canRemove,
|
|
840
|
+
_props$canMoveUp = props.canMoveUp,
|
|
841
|
+
canMoveUp = _props$canMoveUp === void 0 ? true : _props$canMoveUp,
|
|
842
|
+
_props$canMoveDown = props.canMoveDown,
|
|
843
|
+
canMoveDown = _props$canMoveDown === void 0 ? true : _props$canMoveDown,
|
|
844
|
+
itemSchema = props.itemSchema,
|
|
845
|
+
itemData = props.itemData,
|
|
846
|
+
itemUiSchema = props.itemUiSchema,
|
|
847
|
+
itemIdSchema = props.itemIdSchema,
|
|
848
|
+
itemErrorSchema = props.itemErrorSchema,
|
|
849
|
+
autofocus = props.autofocus,
|
|
850
|
+
onBlur = props.onBlur,
|
|
851
|
+
onFocus = props.onFocus,
|
|
852
|
+
rawErrors = props.rawErrors;
|
|
853
|
+
var _this$props10 = this.props,
|
|
854
|
+
disabled = _this$props10.disabled,
|
|
855
|
+
readonly = _this$props10.readonly,
|
|
856
|
+
uiSchema = _this$props10.uiSchema,
|
|
857
|
+
registry = _this$props10.registry;
|
|
858
|
+
var SchemaField = registry.fields.SchemaField;
|
|
859
|
+
|
|
860
|
+
var _getUiOptions4 = getUiOptions(uiSchema),
|
|
861
|
+
_getUiOptions4$ordera = _getUiOptions4.orderable,
|
|
862
|
+
orderable = _getUiOptions4$ordera === void 0 ? true : _getUiOptions4$ordera,
|
|
863
|
+
_getUiOptions4$remova = _getUiOptions4.removable,
|
|
864
|
+
removable = _getUiOptions4$remova === void 0 ? true : _getUiOptions4$remova;
|
|
865
|
+
|
|
866
|
+
var has = {
|
|
867
|
+
moveUp: orderable && canMoveUp,
|
|
868
|
+
moveDown: orderable && canMoveDown,
|
|
869
|
+
remove: removable && canRemove
|
|
870
|
+
};
|
|
871
|
+
has.toolbar = Object.keys(has).some(function (key) {
|
|
872
|
+
return has[key];
|
|
873
|
+
});
|
|
874
|
+
return {
|
|
875
|
+
children:
|
|
876
|
+
/*#__PURE__*/
|
|
877
|
+
React.createElement(SchemaField, {
|
|
878
|
+
index: index,
|
|
879
|
+
schema: itemSchema,
|
|
880
|
+
uiSchema: itemUiSchema,
|
|
881
|
+
formData: itemData,
|
|
882
|
+
errorSchema: itemErrorSchema,
|
|
883
|
+
idPrefix: this.props.idPrefix,
|
|
884
|
+
idSeparator: this.props.idSeparator,
|
|
885
|
+
idSchema: itemIdSchema,
|
|
886
|
+
required: this.isItemRequired(itemSchema),
|
|
887
|
+
onChange: this.onChangeForIndex(index),
|
|
888
|
+
onBlur: onBlur,
|
|
889
|
+
onFocus: onFocus,
|
|
890
|
+
registry: this.props.registry,
|
|
891
|
+
disabled: this.props.disabled,
|
|
892
|
+
readonly: this.props.readonly,
|
|
893
|
+
hideError: this.props.hideError,
|
|
894
|
+
autofocus: autofocus,
|
|
895
|
+
rawErrors: rawErrors
|
|
896
|
+
}),
|
|
897
|
+
className: "array-item",
|
|
898
|
+
disabled: disabled,
|
|
899
|
+
hasToolbar: has.toolbar,
|
|
900
|
+
hasMoveUp: has.moveUp,
|
|
901
|
+
hasMoveDown: has.moveDown,
|
|
902
|
+
hasRemove: has.remove,
|
|
903
|
+
index: index,
|
|
904
|
+
key: key,
|
|
905
|
+
onAddIndexClick: this.onAddIndexClick,
|
|
906
|
+
onDropIndexClick: this.onDropIndexClick,
|
|
907
|
+
onReorderClick: this.onReorderClick,
|
|
908
|
+
readonly: readonly
|
|
909
|
+
};
|
|
910
|
+
}
|
|
911
|
+
}, {
|
|
912
|
+
key: "itemTitle",
|
|
913
|
+
get: function get() {
|
|
914
|
+
var schema = this.props.schema;
|
|
915
|
+
return schema.items.title || schema.items.description || "Item";
|
|
916
|
+
}
|
|
917
|
+
}], [{
|
|
918
|
+
key: "getDerivedStateFromProps",
|
|
919
|
+
value: function getDerivedStateFromProps(nextProps, prevState) {
|
|
920
|
+
// Don't call getDerivedStateFromProps if keyed formdata was just updated.
|
|
921
|
+
if (prevState.updatedKeyedFormData) {
|
|
922
|
+
return {
|
|
923
|
+
updatedKeyedFormData: false
|
|
924
|
+
};
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
var nextFormData = nextProps.formData || [];
|
|
928
|
+
var previousKeyedFormData = prevState.keyedFormData || [];
|
|
929
|
+
var newKeyedFormData = nextFormData.length === previousKeyedFormData.length ? previousKeyedFormData.map(function (previousKeyedFormDatum, index) {
|
|
930
|
+
return {
|
|
931
|
+
key: previousKeyedFormDatum.key,
|
|
932
|
+
item: nextFormData[index]
|
|
933
|
+
};
|
|
934
|
+
}) : generateKeyedFormData(nextFormData);
|
|
935
|
+
return {
|
|
936
|
+
keyedFormData: newKeyedFormData
|
|
937
|
+
};
|
|
938
|
+
}
|
|
939
|
+
}]);
|
|
940
|
+
|
|
941
|
+
return ArrayField;
|
|
942
|
+
}(Component);
|
|
943
|
+
|
|
944
|
+
_defineProperty(ArrayField, "defaultProps", {
|
|
945
|
+
uiSchema: {},
|
|
946
|
+
formData: [],
|
|
947
|
+
idSchema: {},
|
|
948
|
+
required: false,
|
|
949
|
+
disabled: false,
|
|
950
|
+
readonly: false,
|
|
951
|
+
autofocus: false
|
|
952
|
+
});
|
|
953
|
+
|
|
954
|
+
if (process.env.NODE_ENV !== "production") {
|
|
955
|
+
ArrayField.propTypes = types.fieldProps;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
export default ArrayField;
|
|
959
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ZpZWxkcy9BcnJheUZpZWxkLmpzIl0sIm5hbWVzIjpbIkFkZEJ1dHRvbiIsIkljb25CdXR0b24iLCJSZWFjdCIsIkNvbXBvbmVudCIsImluY2x1ZGVzIiwidHlwZXMiLCJnZXRXaWRnZXQiLCJnZXREZWZhdWx0Rm9ybVN0YXRlIiwiZ2V0VWlPcHRpb25zIiwiaXNNdWx0aVNlbGVjdCIsImlzRmlsZXNBcnJheSIsImlzRml4ZWRJdGVtcyIsImFsbG93QWRkaXRpb25hbEl0ZW1zIiwiaXNDdXN0b21XaWRnZXQiLCJvcHRpb25zTGlzdCIsInJldHJpZXZlU2NoZW1hIiwidG9JZFNjaGVtYSIsIm5hbm9pZCIsIkFycmF5RmllbGRUaXRsZSIsIlRpdGxlRmllbGQiLCJpZFNjaGVtYSIsInRpdGxlIiwicmVxdWlyZWQiLCJpZCIsIiRpZCIsIkFycmF5RmllbGREZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uRmllbGQiLCJkZXNjcmlwdGlvbiIsIkRlZmF1bHRBcnJheUl0ZW0iLCJwcm9wcyIsImJ0blN0eWxlIiwiZmxleCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwiZm9udFdlaWdodCIsImtleSIsImNsYXNzTmFtZSIsImhhc1Rvb2xiYXIiLCJjaGlsZHJlbiIsImRpc3BsYXkiLCJqdXN0aWZ5Q29udGVudCIsImhhc01vdmVVcCIsImhhc01vdmVEb3duIiwiZGlzYWJsZWQiLCJyZWFkb25seSIsIm9uUmVvcmRlckNsaWNrIiwiaW5kZXgiLCJoYXNSZW1vdmUiLCJvbkRyb3BJbmRleENsaWNrIiwiRGVmYXVsdEZpeGVkQXJyYXlGaWVsZFRlbXBsYXRlIiwidWlTY2hlbWEiLCJzY2hlbWEiLCJpdGVtcyIsIm1hcCIsImNhbkFkZCIsIm9uQWRkQ2xpY2siLCJEZWZhdWx0Tm9ybWFsQXJyYXlGaWVsZFRlbXBsYXRlIiwicCIsImdlbmVyYXRlUm93SWQiLCJnZW5lcmF0ZUtleWVkRm9ybURhdGEiLCJmb3JtRGF0YSIsIkFycmF5IiwiaXNBcnJheSIsIml0ZW0iLCJrZXllZFRvUGxhaW5Gb3JtRGF0YSIsImtleWVkRm9ybURhdGEiLCJrZXllZEl0ZW0iLCJBcnJheUZpZWxkIiwicmVnaXN0cnkiLCJyb290U2NoZW1hIiwiaXRlbVNjaGVtYSIsImFkZGl0aW9uYWxJdGVtcyIsInVuZGVmaW5lZCIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJvbkNoYW5nZSIsIm5ld0tleWVkRm9ybURhdGFSb3ciLCJfZ2V0TmV3Rm9ybURhdGFSb3ciLCJuZXdLZXllZEZvcm1EYXRhIiwic3RhdGUiLCJzZXRTdGF0ZSIsInVwZGF0ZWRLZXllZEZvcm1EYXRhIiwic3BsaWNlIiwibmV3RXJyb3JTY2hlbWEiLCJlcnJvclNjaGVtYSIsImkiLCJwYXJzZUludCIsImZpbHRlciIsIl8iLCJuZXdJbmRleCIsInRhcmdldCIsImJsdXIiLCJyZU9yZGVyQXJyYXkiLCJfbmV3S2V5ZWRGb3JtRGF0YSIsInNsaWNlIiwidmFsdWUiLCJuZXdGb3JtRGF0YSIsImpzb25WYWx1ZSIsInR5cGUiLCJmb3JtSXRlbXMiLCJhZGRhYmxlIiwibWF4SXRlbXMiLCJsZW5ndGgiLCJoYXNPd25Qcm9wZXJ0eSIsImZpZWxkcyIsIlVuc3VwcG9ydGVkRmllbGQiLCJyZW5kZXJNdWx0aVNlbGVjdCIsInJlbmRlckN1c3RvbVdpZGdldCIsInJlbmRlckZpeGVkQXJyYXkiLCJyZW5kZXJGaWxlcyIsInJlbmRlck5vcm1hbEFycmF5IiwibmFtZSIsImhpZGVFcnJvciIsImF1dG9mb2N1cyIsIm9uQmx1ciIsIm9uRm9jdXMiLCJpZFByZWZpeCIsImlkU2VwYXJhdG9yIiwicmF3RXJyb3JzIiwiQXJyYXlGaWVsZFRlbXBsYXRlIiwiZm9ybUNvbnRleHQiLCJpdGVtc1NjaGVtYSIsImFycmF5UHJvcHMiLCJjYW5BZGRJdGVtIiwiaXRlbUVycm9yU2NoZW1hIiwiaXRlbUlkUHJlZml4IiwiaXRlbUlkU2NoZW1hIiwicmVuZGVyQXJyYXlGaWVsZEl0ZW0iLCJjYW5Nb3ZlVXAiLCJjYW5Nb3ZlRG93biIsIml0ZW1EYXRhIiwiaXRlbVVpU2NoZW1hIiwicGxhY2Vob2xkZXIiLCJ3aWRnZXRzIiwid2lkZ2V0Iiwib3B0aW9ucyIsIldpZGdldCIsIm9uU2VsZWN0Q2hhbmdlIiwiZW51bU9wdGlvbnMiLCJpdGVtU2NoZW1hcyIsImFkZGl0aW9uYWxTY2hlbWEiLCJjb25jYXQiLCJhZGRpdGlvbmFsIiwiY2FuUmVtb3ZlIiwiVGVtcGxhdGUiLCJTY2hlbWFGaWVsZCIsIm9yZGVyYWJsZSIsInJlbW92YWJsZSIsImhhcyIsIm1vdmVVcCIsIm1vdmVEb3duIiwicmVtb3ZlIiwidG9vbGJhciIsIk9iamVjdCIsImtleXMiLCJzb21lIiwiaXNJdGVtUmVxdWlyZWQiLCJvbkNoYW5nZUZvckluZGV4Iiwib25BZGRJbmRleENsaWNrIiwibmV4dFByb3BzIiwicHJldlN0YXRlIiwibmV4dEZvcm1EYXRhIiwicHJldmlvdXNLZXllZEZvcm1EYXRhIiwicHJldmlvdXNLZXllZEZvcm1EYXR1bSIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInByb3BUeXBlcyIsImZpZWxkUHJvcHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPQSxTQUFQLE1BQXNCLGNBQXRCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QixlQUF2QjtBQUNBLE9BQU9DLEtBQVAsSUFBZ0JDLFNBQWhCLFFBQWlDLE9BQWpDO0FBQ0EsT0FBT0MsUUFBUCxNQUFxQixnQ0FBckI7QUFDQSxPQUFPLEtBQUtDLEtBQVosTUFBdUIsYUFBdkI7QUFFQSxTQUNFQyxTQURGLEVBRUVDLG1CQUZGLEVBR0VDLFlBSEYsRUFJRUMsYUFKRixFQUtFQyxZQUxGLEVBTUVDLFlBTkYsRUFPRUMsb0JBUEYsRUFRRUMsY0FSRixFQVNFQyxXQVRGLEVBVUVDLGNBVkYsRUFXRUMsVUFYRixRQVlPLGFBWlA7QUFhQSxTQUFTQyxNQUFULFFBQXVCLFFBQXZCOztBQUVBLFNBQVNDLGVBQVQsT0FBb0U7QUFB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QUFDRCxVQUFNZ0YsWUFBWSxHQUFHRixTQUFTLENBQUNuRyxRQUFWLElBQXNCLEVBQTNDO0FBQ0EsVUFBTXNHLHFCQUFxQixHQUFHRixTQUFTLENBQUMvRixhQUFWLElBQTJCLEVBQXpEO0FBQ0EsVUFBTWEsZ0JBQWdCLEdBQ3BCbUYsWUFBWSxDQUFDM0QsTUFBYixLQUF3QjRELHFCQUFxQixDQUFDNUQsTUFBOUMsR0FDSTRELHFCQUFxQixDQUFDN0csR0FBdEIsQ0FBMEIsVUFBQzhHLHNCQUFELEVBQXlCckgsS0FBekIsRUFBbUM7QUFDM0QsZUFBTztBQUNMWCxVQUFBQSxHQUFHLEVBQUVnSSxzQkFBc0IsQ0FBQ2hJLEdBRHZCO0FBRUw0QixVQUFBQSxJQUFJLEVBQUVrRyxZQUFZLENBQUNuSCxLQUFEO0FBRmIsU0FBUDtBQUlELE9BTEQsQ0FESixHQU9JYSxxQkFBcUIsQ0FBQ3NHLFlBQUQsQ0FSM0I7QUFTQSxhQUFPO0FBQ0xoRyxRQUFBQSxhQUFhLEVBQUVhO0FBRFYsT0FBUDtBQUdEOzs7O0VBMUNzQjNFLFM7O2dCQUFuQmdFLFUsa0JBQ2tCO0FBQ3BCakIsRUFBQUEsUUFBUSxFQUFFLEVBRFU7QUFFcEJVLEVBQUFBLFFBQVEsRUFBRSxFQUZVO0FBR3BCeEMsRUFBQUEsUUFBUSxFQUFFLEVBSFU7QUFJcEJFLEVBQUFBLFFBQVEsRUFBRSxLQUpVO0FBS3BCcUIsRUFBQUEsUUFBUSxFQUFFLEtBTFU7QUFNcEJDLEVBQUFBLFFBQVEsRUFBRSxLQU5VO0FBT3BCcUUsRUFBQUEsU0FBUyxFQUFFO0FBUFMsQzs7QUF1b0J4QixJQUFJbUQsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFFBQVosS0FBeUIsWUFBN0IsRUFBMkM7QUFDekNuRyxFQUFBQSxVQUFVLENBQUNvRyxTQUFYLEdBQXVCbEssS0FBSyxDQUFDbUssVUFBN0I7QUFDRDs7QUFFRCxlQUFlckcsVUFBZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBZGRCdXR0b24gZnJvbSBcIi4uL0FkZEJ1dHRvblwiO1xuaW1wb3J0IEljb25CdXR0b24gZnJvbSBcIi4uL0ljb25CdXR0b25cIjtcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBpbmNsdWRlcyBmcm9tIFwiY29yZS1qcy1wdXJlL2VzL2FycmF5L2luY2x1ZGVzXCI7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHtcbiAgZ2V0V2lkZ2V0LFxuICBnZXREZWZhdWx0Rm9ybVN0YXRlLFxuICBnZXRVaU9wdGlvbnMsXG4gIGlzTXVsdGlTZWxlY3QsXG4gIGlzRmlsZXNBcnJheSxcbiAgaXNGaXhlZEl0ZW1zLFxuICBhbGxvd0FkZGl0aW9uYWxJdGVtcyxcbiAgaXNDdXN0b21XaWRnZXQsXG4gIG9wdGlvbnNMaXN0LFxuICByZXRyaWV2ZVNjaGVtYSxcbiAgdG9JZFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5cbmZ1bmN0aW9uIEFycmF5RmllbGRUaXRsZSh7IFRpdGxlRmllbGQsIGlkU2NoZW1hLCB0aXRsZSwgcmVxdWlyZWQgfSkge1xuICBpZiAoIXRpdGxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaWQgPSBgJHtpZFNjaGVtYS4kaWR9X190aXRsZWA7XG4gIHJldHVybiA8VGl0bGVGaWVsZCBpZD17aWR9IHRpdGxlPXt0aXRsZX0gcmVxdWlyZWQ9e3JlcXVpcmVkfSAvPjtcbn1cblxuZnVuY3Rpb24gQXJyYXlGaWVsZERlc2NyaXB0aW9uKHsgRGVzY3JpcHRpb25GaWVsZCwgaWRTY2hlbWEsIGRlc2NyaXB0aW9uIH0pIHtcbiAgaWYgKCFkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGlkID0gYCR7aWRTY2hlbWEuJGlkfV9fZGVzY3JpcHRpb25gO1xuICByZXR1cm4gPERlc2NyaXB0aW9uRmllbGQgaWQ9e2lkfSBkZXNjcmlwdGlvbj17ZGVzY3JpcHRpb259IC8+O1xufVxuXG4vLyBVc2VkIGluIHRoZSB0d28gdGVtcGxhdGVzXG5mdW5jdGlvbiBEZWZhdWx0QXJyYXlJdGVtKHByb3BzKSB7XG4gIGNvbnN0IGJ0blN0eWxlID0ge1xuICAgIGZsZXg6IDEsXG4gICAgcGFkZGluZ0xlZnQ6IDYsXG4gICAgcGFkZGluZ1JpZ2h0OiA2LFxuICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxkaXYga2V5PXtwcm9wcy5rZXl9IGNsYXNzTmFtZT17cHJvcHMuY2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtwcm9wcy5oYXNUb29sYmFyID8gXCJjb2wteHMtOVwiIDogXCJjb2wteHMtMTJcIn0+XG4gICAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7cHJvcHMuaGFzVG9vbGJhciAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXhzLTMgYXJyYXktaXRlbS10b29sYm94XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWdyb3VwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1hcm91bmRcIixcbiAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgeyhwcm9wcy5oYXNNb3ZlVXAgfHwgcHJvcHMuaGFzTW92ZURvd24pICYmIChcbiAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICBpY29uPVwiYXJyb3ctdXBcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIHVwXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhcnJheS1pdGVtLW1vdmUtdXBcIlxuICAgICAgICAgICAgICAgIHRhYkluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXtidG5TdHlsZX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMucmVhZG9ubHkgfHwgIXByb3BzLmhhc01vdmVVcH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtwcm9wcy5vblJlb3JkZXJDbGljayhwcm9wcy5pbmRleCwgcHJvcHMuaW5kZXggLSAxKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsocHJvcHMuaGFzTW92ZVVwIHx8IHByb3BzLmhhc01vdmVEb3duKSAmJiAoXG4gICAgICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgaWNvbj1cImFycm93LWRvd25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFycmF5LWl0ZW0tbW92ZS1kb3duXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBkb3duXCJcbiAgICAgICAgICAgICAgICB0YWJJbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17YnRuU3R5bGV9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMucmVhZG9ubHkgfHwgIXByb3BzLmhhc01vdmVEb3duXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uUmVvcmRlckNsaWNrKHByb3BzLmluZGV4LCBwcm9wcy5pbmRleCArIDEpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge3Byb3BzLmhhc1JlbW92ZSAmJiAoXG4gICAgICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgaWNvbj1cInJlbW92ZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYXJyYXktaXRlbS1yZW1vdmVcIlxuICAgICAgICAgICAgICAgIHRhYkluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXtidG5TdHlsZX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMucmVhZG9ubHl9XG4gICAgICAgICAgICAgICAgb25DbGljaz17cHJvcHMub25Ecm9wSW5kZXhDbGljayhwcm9wcy5pbmRleCl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIERlZmF1bHRGaXhlZEFycmF5RmllbGRUZW1wbGF0ZShwcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxmaWVsZHNldCBjbGFzc05hbWU9e3Byb3BzLmNsYXNzTmFtZX0gaWQ9e3Byb3BzLmlkU2NoZW1hLiRpZH0+XG4gICAgICA8QXJyYXlGaWVsZFRpdGxlXG4gICAgICAgIGtleT17YGFycmF5LWZpZWxkLXRpdGxlLSR7cHJvcHMuaWRTY2hlbWEuJGlkfWB9XG4gICAgICAgIFRpdGxlRmllbGQ9e3Byb3BzLlRpdGxlRmllbGR9XG4gICAgICAgIGlkU2NoZW1hPXtwcm9wcy5pZFNjaGVtYX1cbiAgICAgICAgdGl0bGU9e3Byb3BzLnVpU2NoZW1hW1widWk6dGl0bGVcIl0gfHwgcHJvcHMudGl0bGV9XG4gICAgICAgIHJlcXVpcmVkPXtwcm9wcy5yZXF1aXJlZH1cbiAgICAgIC8+XG5cbiAgICAgIHsocHJvcHMudWlTY2hlbWFbXCJ1aTpkZXNjcmlwdGlvblwiXSB8fCBwcm9wcy5zY2hlbWEuZGVzY3JpcHRpb24pICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImZpZWxkLWRlc2NyaXB0aW9uXCJcbiAgICAgICAgICBrZXk9e2BmaWVsZC1kZXNjcmlwdGlvbi0ke3Byb3BzLmlkU2NoZW1hLiRpZH1gfT5cbiAgICAgICAgICB7cHJvcHMudWlTY2hlbWFbXCJ1aTpkZXNjcmlwdGlvblwiXSB8fCBwcm9wcy5zY2hlbWEuZGVzY3JpcHRpb259XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJyb3cgYXJyYXktaXRlbS1saXN0XCJcbiAgICAgICAga2V5PXtgYXJyYXktaXRlbS1saXN0LSR7cHJvcHMuaWRTY2hlbWEuJGlkfWB9PlxuICAgICAgICB7cHJvcHMuaXRlbXMgJiYgcHJvcHMuaXRlbXMubWFwKERlZmF1bHRBcnJheUl0ZW0pfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtwcm9wcy5jYW5BZGQgJiYgKFxuICAgICAgICA8QWRkQnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwiYXJyYXktaXRlbS1hZGRcIlxuICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uQWRkQ2xpY2t9XG4gICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLmRpc2FibGVkIHx8IHByb3BzLnJlYWRvbmx5fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2ZpZWxkc2V0PlxuICApO1xufVxuXG5mdW5jdGlvbiBEZWZhdWx0Tm9ybWFsQXJyYXlGaWVsZFRlbXBsYXRlKHByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGZpZWxkc2V0IGNsYXNzTmFtZT17cHJvcHMuY2xhc3NOYW1lfSBpZD17cHJvcHMuaWRTY2hlbWEuJGlkfT5cbiAgICAgIDxBcnJheUZpZWxkVGl0bGVcbiAgICAgICAga2V5PXtgYXJyYXktZmllbGQtdGl0bGUtJHtwcm9wcy5pZFNjaGVtYS4kaWR9YH1cbiAgICAgICAgVGl0bGVGaWVsZD17cHJvcHMuVGl0bGVGaWVsZH1cbiAgICAgICAgaWRTY2hlbWE9e3Byb3BzLmlkU2NoZW1hfVxuICAgICAgICB0aXRsZT17cHJvcHMudWlTY2hlbWFbXCJ1aTp0aXRsZVwiXSB8fCBwcm9wcy50aXRsZX1cbiAgICAgICAgcmVxdWlyZWQ9e3Byb3BzLnJlcXVpcmVkfVxuICAgICAgLz5cblxuICAgICAgeyhwcm9wcy51aVNjaGVtYVtcInVpOmRlc2NyaXB0aW9uXCJdIHx8IHByb3BzLnNjaGVtYS5kZXNjcmlwdGlvbikgJiYgKFxuICAgICAgICA8QXJyYXlGaWVsZERlc2NyaXB0aW9uXG4gICAgICAgICAga2V5PXtgYXJyYXktZmllbGQtZGVzY3JpcHRpb24tJHtwcm9wcy5pZFNjaGVtYS4kaWR9YH1cbiAgICAgICAgICBEZXNjcmlwdGlvbkZpZWxkPXtwcm9wcy5EZXNjcmlwdGlvbkZpZWxkfVxuICAgICAgICAgIGlkU2NoZW1hPXtwcm9wcy5pZFNjaGVtYX1cbiAgICAgICAgICBkZXNjcmlwdGlvbj17XG4gICAgICAgICAgICBwcm9wcy51aVNjaGVtYVtcInVpOmRlc2NyaXB0aW9uXCJdIHx8IHByb3BzLnNjaGVtYS5kZXNjcmlwdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwicm93IGFycmF5LWl0ZW0tbGlzdFwiXG4gICAgICAgIGtleT17YGFycmF5LWl0ZW0tbGlzdC0ke3Byb3BzLmlkU2NoZW1hLiRpZH1gfT5cbiAgICAgICAge3Byb3BzLml0ZW1zICYmIHByb3BzLml0ZW1zLm1hcChwID0+IERlZmF1bHRBcnJheUl0ZW0ocCkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtwcm9wcy5jYW5BZGQgJiYgKFxuICAgICAgICA8QWRkQnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwiYXJyYXktaXRlbS1hZGRcIlxuICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uQWRkQ2xpY2t9XG4gICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLmRpc2FibGVkIHx8IHByb3BzLnJlYWRvbmx5fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2ZpZWxkc2V0PlxuICApO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJvd0lkKCkge1xuICByZXR1cm4gbmFub2lkKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlS2V5ZWRGb3JtRGF0YShmb3JtRGF0YSkge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXkoZm9ybURhdGEpXG4gICAgPyBbXVxuICAgIDogZm9ybURhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleTogZ2VuZXJhdGVSb3dJZCgpLFxuICAgICAgICAgIGl0ZW0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbn1cblxuZnVuY3Rpb24ga2V5ZWRUb1BsYWluRm9ybURhdGEoa2V5ZWRGb3JtRGF0YSkge1xuICByZXR1cm4ga2V5ZWRGb3JtRGF0YS5tYXAoa2V5ZWRJdGVtID0+IGtleWVkSXRlbS5pdGVtKTtcbn1cblxuY2xhc3MgQXJyYXlGaWVsZCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdWlTY2hlbWE6IHt9LFxuICAgIGZvcm1EYXRhOiBbXSxcbiAgICBpZFNjaGVtYToge30sXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICByZWFkb25seTogZmFsc2UsXG4gICAgYXV0b2ZvY3VzOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBjb25zdCB7IGZvcm1EYXRhIH0gPSBwcm9wcztcbiAgICBjb25zdCBrZXllZEZvcm1EYXRhID0gZ2VuZXJhdGVLZXllZEZvcm1EYXRhKGZvcm1EYXRhKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAga2V5ZWRGb3JtRGF0YSxcbiAgICAgIHVwZGF0ZWRLZXllZEZvcm1EYXRhOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIC8vIERvbid0IGNhbGwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIGlmIGtleWVkIGZvcm1kYXRhIHdhcyBqdXN0IHVwZGF0ZWQuXG4gICAgaWYgKHByZXZTdGF0ZS51cGRhdGVkS2V5ZWRGb3JtRGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlZEtleWVkRm9ybURhdGE6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbmV4dEZvcm1EYXRhID0gbmV4dFByb3BzLmZvcm1EYXRhIHx8IFtdO1xuICAgIGNvbnN0IHByZXZpb3VzS2V5ZWRGb3JtRGF0YSA9IHByZXZTdGF0ZS5rZXllZEZvcm1EYXRhIHx8IFtdO1xuICAgIGNvbnN0IG5ld0tleWVkRm9ybURhdGEgPVxuICAgICAgbmV4dEZvcm1EYXRhLmxlbmd0aCA9PT0gcHJldmlvdXNLZXllZEZvcm1EYXRhLmxlbmd0aFxuICAgICAgICA/IHByZXZpb3VzS2V5ZWRGb3JtRGF0YS5tYXAoKHByZXZpb3VzS2V5ZWRGb3JtRGF0dW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBrZXk6IHByZXZpb3VzS2V5ZWRGb3JtRGF0dW0ua2V5LFxuICAgICAgICAgICAgICBpdGVtOiBuZXh0Rm9ybURhdGFbaW5kZXhdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICA6IGdlbmVyYXRlS2V5ZWRGb3JtRGF0YShuZXh0Rm9ybURhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBrZXllZEZvcm1EYXRhOiBuZXdLZXllZEZvcm1EYXRhLFxuICAgIH07XG4gIH1cblxuICBnZXQgaXRlbVRpdGxlKCkge1xuICAgIGNvbnN0IHsgc2NoZW1hIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBzY2hlbWEuaXRlbXMudGl0bGUgfHwgc2NoZW1hLml0ZW1zLmRlc2NyaXB0aW9uIHx8IFwiSXRlbVwiO1xuICB9XG5cbiAgaXNJdGVtUmVxdWlyZWQoaXRlbVNjaGVtYSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1TY2hlbWEudHlwZSkpIHtcbiAgICAgIC8vIFdoaWxlIHdlIGRvbid0IHlldCBzdXBwb3J0IGNvbXBvc2l0ZS9udWxsYWJsZSBqc29uc2NoZW1hIHR5cGVzLCBpdCdzXG4gICAgICAvLyBmdXR1cmUtcHJvb2YgdG8gY2hlY2sgZm9yIHJlcXVpcmVtZW50IGFnYWluc3QgdGhlc2UuXG4gICAgICByZXR1cm4gIWluY2x1ZGVzKGl0ZW1TY2hlbWEudHlwZSwgXCJudWxsXCIpO1xuICAgIH1cbiAgICAvLyBBbGwgbm9uLW51bGwgYXJyYXkgaXRlbSB0eXBlcyBhcmUgaW5oZXJlbnRseSByZXF1aXJlZCBieSBkZXNpZ25cbiAgICByZXR1cm4gaXRlbVNjaGVtYS50eXBlICE9PSBcIm51bGxcIjtcbiAgfVxuXG4gIGNhbkFkZEl0ZW0oZm9ybUl0ZW1zKSB7XG4gICAgY29uc3QgeyBzY2hlbWEsIHVpU2NoZW1hIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IGFkZGFibGUgfSA9IGdldFVpT3B0aW9ucyh1aVNjaGVtYSk7XG4gICAgaWYgKGFkZGFibGUgIT09IGZhbHNlKSB7XG4gICAgICAvLyBpZiB1aTpvcHRpb25zLmFkZGFibGUgd2FzIG5vdCBleHBsaWNpdGx5IHNldCB0byBmYWxzZSwgd2UgY2FuIGFkZFxuICAgICAgLy8gYW5vdGhlciBpdGVtIGlmIHdlIGhhdmUgbm90IGV4Y2VlZGVkIG1heEl0ZW1zIHlldFxuICAgICAgaWYgKHNjaGVtYS5tYXhJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFkZGFibGUgPSBmb3JtSXRlbXMubGVuZ3RoIDwgc2NoZW1hLm1heEl0ZW1zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZGRhYmxlO1xuICB9XG5cbiAgX2dldE5ld0Zvcm1EYXRhUm93ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2NoZW1hLCByZWdpc3RyeSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHJvb3RTY2hlbWEgfSA9IHJlZ2lzdHJ5O1xuICAgIGxldCBpdGVtU2NoZW1hID0gc2NoZW1hLml0ZW1zO1xuICAgIGlmIChpc0ZpeGVkSXRlbXMoc2NoZW1hKSAmJiBhbGxvd0FkZGl0aW9uYWxJdGVtcyhzY2hlbWEpKSB7XG4gICAgICBpdGVtU2NoZW1hID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcztcbiAgICB9XG4gICAgcmV0dXJuIGdldERlZmF1bHRGb3JtU3RhdGUoaXRlbVNjaGVtYSwgdW5kZWZpbmVkLCByb290U2NoZW1hKTtcbiAgfTtcblxuICBvbkFkZENsaWNrID0gZXZlbnQgPT4ge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG5ld0tleWVkRm9ybURhdGFSb3cgPSB7XG4gICAgICBrZXk6IGdlbmVyYXRlUm93SWQoKSxcbiAgICAgIGl0ZW06IHRoaXMuX2dldE5ld0Zvcm1EYXRhUm93KCksXG4gICAgfTtcbiAgICBjb25zdCBuZXdLZXllZEZvcm1EYXRhID0gWy4uLnRoaXMuc3RhdGUua2V5ZWRGb3JtRGF0YSwgbmV3S2V5ZWRGb3JtRGF0YVJvd107XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHtcbiAgICAgICAga2V5ZWRGb3JtRGF0YTogbmV3S2V5ZWRGb3JtRGF0YSxcbiAgICAgICAgdXBkYXRlZEtleWVkRm9ybURhdGE6IHRydWUsXG4gICAgICB9LFxuICAgICAgKCkgPT4gb25DaGFuZ2Uoa2V5ZWRUb1BsYWluRm9ybURhdGEobmV3S2V5ZWRGb3JtRGF0YSkpXG4gICAgKTtcbiAgfTtcblxuICBvbkFkZEluZGV4Q2xpY2sgPSBpbmRleCA9PiB7XG4gICAgcmV0dXJuIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IG5ld0tleWVkRm9ybURhdGFSb3cgPSB7XG4gICAgICAgIGtleTogZ2VuZXJhdGVSb3dJZCgpLFxuICAgICAgICBpdGVtOiB0aGlzLl9nZXROZXdGb3JtRGF0YVJvdygpLFxuICAgICAgfTtcbiAgICAgIGxldCBuZXdLZXllZEZvcm1EYXRhID0gWy4uLnRoaXMuc3RhdGUua2V5ZWRGb3JtRGF0YV07XG4gICAgICBuZXdLZXllZEZvcm1EYXRhLnNwbGljZShpbmRleCwgMCwgbmV3S2V5ZWRGb3JtRGF0YVJvdyk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBrZXllZEZvcm1EYXRhOiBuZXdLZXllZEZvcm1EYXRhLFxuICAgICAgICAgIHVwZGF0ZWRLZXllZEZvcm1EYXRhOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiBvbkNoYW5nZShrZXllZFRvUGxhaW5Gb3JtRGF0YShuZXdLZXllZEZvcm1EYXRhKSlcbiAgICAgICk7XG4gICAgfTtcbiAgfTtcblxuICBvbkRyb3BJbmRleENsaWNrID0gaW5kZXggPT4ge1xuICAgIHJldHVybiBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7IGtleWVkRm9ybURhdGEgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAvLyByZWZzICMxOTU6IHJldmFsaWRhdGUgdG8gZW5zdXJlIHByb3Blcmx5IHJlaW5kZXhpbmcgZXJyb3JzXG4gICAgICBsZXQgbmV3RXJyb3JTY2hlbWE7XG4gICAgICBpZiAodGhpcy5wcm9wcy5lcnJvclNjaGVtYSkge1xuICAgICAgICBuZXdFcnJvclNjaGVtYSA9IHt9O1xuICAgICAgICBjb25zdCBlcnJvclNjaGVtYSA9IHRoaXMucHJvcHMuZXJyb3JTY2hlbWE7XG4gICAgICAgIGZvciAobGV0IGkgaW4gZXJyb3JTY2hlbWEpIHtcbiAgICAgICAgICBpID0gcGFyc2VJbnQoaSk7XG4gICAgICAgICAgaWYgKGkgPCBpbmRleCkge1xuICAgICAgICAgICAgbmV3RXJyb3JTY2hlbWFbaV0gPSBlcnJvclNjaGVtYVtpXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBpbmRleCkge1xuICAgICAgICAgICAgbmV3RXJyb3JTY2hlbWFbaSAtIDFdID0gZXJyb3JTY2hlbWFbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdLZXllZEZvcm1EYXRhID0ga2V5ZWRGb3JtRGF0YS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBrZXllZEZvcm1EYXRhOiBuZXdLZXllZEZvcm1EYXRhLFxuICAgICAgICAgIHVwZGF0ZWRLZXllZEZvcm1EYXRhOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiBvbkNoYW5nZShrZXllZFRvUGxhaW5Gb3JtRGF0YShuZXdLZXllZEZvcm1EYXRhKSwgbmV3RXJyb3JTY2hlbWEpXG4gICAgICApO1xuICAgIH07XG4gIH07XG5cbiAgb25SZW9yZGVyQ2xpY2sgPSAoaW5kZXgsIG5ld0luZGV4KSA9PiB7XG4gICAgcmV0dXJuIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC50YXJnZXQuYmx1cigpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGxldCBuZXdFcnJvclNjaGVtYTtcbiAgICAgIGlmICh0aGlzLnByb3BzLmVycm9yU2NoZW1hKSB7XG4gICAgICAgIG5ld0Vycm9yU2NoZW1hID0ge307XG4gICAgICAgIGNvbnN0IGVycm9yU2NoZW1hID0gdGhpcy5wcm9wcy5lcnJvclNjaGVtYTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiBlcnJvclNjaGVtYSkge1xuICAgICAgICAgIGlmIChpID09IGluZGV4KSB7XG4gICAgICAgICAgICBuZXdFcnJvclNjaGVtYVtuZXdJbmRleF0gPSBlcnJvclNjaGVtYVtpbmRleF07XG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IG5ld0luZGV4KSB7XG4gICAgICAgICAgICBuZXdFcnJvclNjaGVtYVtpbmRleF0gPSBlcnJvclNjaGVtYVtuZXdJbmRleF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0Vycm9yU2NoZW1hW2ldID0gZXJyb3JTY2hlbWFbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsga2V5ZWRGb3JtRGF0YSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGZ1bmN0aW9uIHJlT3JkZXJBcnJheSgpIHtcbiAgICAgICAgLy8gQ29weSBpdGVtXG4gICAgICAgIGxldCBfbmV3S2V5ZWRGb3JtRGF0YSA9IGtleWVkRm9ybURhdGEuc2xpY2UoKTtcblxuICAgICAgICAvLyBNb3ZlcyBpdGVtIGZyb20gaW5kZXggdG8gbmV3SW5kZXhcbiAgICAgICAgX25ld0tleWVkRm9ybURhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgX25ld0tleWVkRm9ybURhdGEuc3BsaWNlKG5ld0luZGV4LCAwLCBrZXllZEZvcm1EYXRhW2luZGV4XSk7XG5cbiAgICAgICAgcmV0dXJuIF9uZXdLZXllZEZvcm1EYXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3S2V5ZWRGb3JtRGF0YSA9IHJlT3JkZXJBcnJheSgpO1xuICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIGtleWVkRm9ybURhdGE6IG5ld0tleWVkRm9ybURhdGEsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IG9uQ2hhbmdlKGtleWVkVG9QbGFpbkZvcm1EYXRhKG5ld0tleWVkRm9ybURhdGEpLCBuZXdFcnJvclNjaGVtYSlcbiAgICAgICk7XG4gICAgfTtcbiAgfTtcblxuICBvbkNoYW5nZUZvckluZGV4ID0gaW5kZXggPT4ge1xuICAgIHJldHVybiAodmFsdWUsIGVycm9yU2NoZW1hKSA9PiB7XG4gICAgICBjb25zdCB7IGZvcm1EYXRhLCBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IG5ld0Zvcm1EYXRhID0gZm9ybURhdGEubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdHJlYXQgdW5kZWZpbmVkIGl0ZW1zIGFzIG51bGxzIHRvIGhhdmUgdmFsaWRhdGlvbi5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZGVncnVudC9qc29uc2NoZW1hL2lzc3Vlcy8yMDZcbiAgICAgICAgY29uc3QganNvblZhbHVlID0gdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IHZhbHVlO1xuICAgICAgICByZXR1cm4gaW5kZXggPT09IGkgPyBqc29uVmFsdWUgOiBpdGVtO1xuICAgICAgfSk7XG4gICAgICBvbkNoYW5nZShcbiAgICAgICAgbmV3Rm9ybURhdGEsXG4gICAgICAgIGVycm9yU2NoZW1hICYmXG4gICAgICAgICAgdGhpcy5wcm9wcy5lcnJvclNjaGVtYSAmJiB7XG4gICAgICAgICAgICAuLi50aGlzLnByb3BzLmVycm9yU2NoZW1hLFxuICAgICAgICAgICAgW2luZGV4XTogZXJyb3JTY2hlbWEsXG4gICAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuICB9O1xuXG4gIG9uU2VsZWN0Q2hhbmdlID0gdmFsdWUgPT4ge1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHNjaGVtYSwgdWlTY2hlbWEsIGlkU2NoZW1hLCByZWdpc3RyeSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHJvb3RTY2hlbWEgfSA9IHJlZ2lzdHJ5O1xuICAgIGlmICghc2NoZW1hLmhhc093blByb3BlcnR5KFwiaXRlbXNcIikpIHtcbiAgICAgIGNvbnN0IHsgZmllbGRzIH0gPSByZWdpc3RyeTtcbiAgICAgIGNvbnN0IHsgVW5zdXBwb3J0ZWRGaWVsZCB9ID0gZmllbGRzO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VW5zdXBwb3J0ZWRGaWVsZFxuICAgICAgICAgIHNjaGVtYT17c2NoZW1hfVxuICAgICAgICAgIGlkU2NoZW1hPXtpZFNjaGVtYX1cbiAgICAgICAgICByZWFzb249XCJNaXNzaW5nIGl0ZW1zIGRlZmluaXRpb25cIlxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzTXVsdGlTZWxlY3Qoc2NoZW1hLCByb290U2NoZW1hKSkge1xuICAgICAgLy8gSWYgYXJyYXkgaGFzIGVudW0gb3IgdW5pcXVlSXRlbXMgc2V0IHRvIHRydWUsIGNhbGwgcmVuZGVyTXVsdGlTZWxlY3QoKSB0byByZW5kZXIgdGhlIGRlZmF1bHQgbXVsdGlzZWxlY3Qgd2lkZ2V0IG9yIGEgY3VzdG9tIHdpZGdldCwgaWYgc3BlY2lmaWVkLlxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTXVsdGlTZWxlY3QoKTtcbiAgICB9XG4gICAgaWYgKGlzQ3VzdG9tV2lkZ2V0KHVpU2NoZW1hKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ3VzdG9tV2lkZ2V0KCk7XG4gICAgfVxuICAgIGlmIChpc0ZpeGVkSXRlbXMoc2NoZW1hKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRml4ZWRBcnJheSgpO1xuICAgIH1cbiAgICBpZiAoaXNGaWxlc0FycmF5KHNjaGVtYSwgdWlTY2hlbWEsIHJvb3RTY2hlbWEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJGaWxlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJOb3JtYWxBcnJheSgpO1xuICB9XG5cbiAgcmVuZGVyTm9ybWFsQXJyYXkoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBlcnJvclNjaGVtYSxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgbmFtZSxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICByZWFkb25seSxcbiAgICAgIGhpZGVFcnJvcixcbiAgICAgIGF1dG9mb2N1cyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIGlkUHJlZml4LFxuICAgICAgaWRTZXBhcmF0b3IgPSBcIl9cIixcbiAgICAgIHJhd0Vycm9ycyxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB0aXRsZSA9IHNjaGVtYS50aXRsZSA9PT0gdW5kZWZpbmVkID8gbmFtZSA6IHNjaGVtYS50aXRsZTtcbiAgICBjb25zdCB7IEFycmF5RmllbGRUZW1wbGF0ZSwgcm9vdFNjaGVtYSwgZmllbGRzLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyBUaXRsZUZpZWxkLCBEZXNjcmlwdGlvbkZpZWxkIH0gPSBmaWVsZHM7XG4gICAgY29uc3QgaXRlbXNTY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShzY2hlbWEuaXRlbXMsIHJvb3RTY2hlbWEpO1xuICAgIGNvbnN0IGZvcm1EYXRhID0ga2V5ZWRUb1BsYWluRm9ybURhdGEodGhpcy5zdGF0ZS5rZXllZEZvcm1EYXRhKTtcbiAgICBjb25zdCBhcnJheVByb3BzID0ge1xuICAgICAgY2FuQWRkOiB0aGlzLmNhbkFkZEl0ZW0oZm9ybURhdGEpLFxuICAgICAgaXRlbXM6IHRoaXMuc3RhdGUua2V5ZWRGb3JtRGF0YS5tYXAoKGtleWVkSXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIGl0ZW0gfSA9IGtleWVkSXRlbTtcbiAgICAgICAgY29uc3QgaXRlbVNjaGVtYSA9IHJldHJpZXZlU2NoZW1hKHNjaGVtYS5pdGVtcywgcm9vdFNjaGVtYSwgaXRlbSk7XG4gICAgICAgIGNvbnN0IGl0ZW1FcnJvclNjaGVtYSA9IGVycm9yU2NoZW1hID8gZXJyb3JTY2hlbWFbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBpdGVtSWRQcmVmaXggPSBpZFNjaGVtYS4kaWQgKyBpZFNlcGFyYXRvciArIGluZGV4O1xuICAgICAgICBjb25zdCBpdGVtSWRTY2hlbWEgPSB0b0lkU2NoZW1hKFxuICAgICAgICAgIGl0ZW1TY2hlbWEsXG4gICAgICAgICAgaXRlbUlkUHJlZml4LFxuICAgICAgICAgIHJvb3RTY2hlbWEsXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpZFByZWZpeCxcbiAgICAgICAgICBpZFNlcGFyYXRvclxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJBcnJheUZpZWxkSXRlbSh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNhbk1vdmVVcDogaW5kZXggPiAwLFxuICAgICAgICAgIGNhbk1vdmVEb3duOiBpbmRleCA8IGZvcm1EYXRhLmxlbmd0aCAtIDEsXG4gICAgICAgICAgaXRlbVNjaGVtYTogaXRlbVNjaGVtYSxcbiAgICAgICAgICBpdGVtSWRTY2hlbWEsXG4gICAgICAgICAgaXRlbUVycm9yU2NoZW1hLFxuICAgICAgICAgIGl0ZW1EYXRhOiBpdGVtLFxuICAgICAgICAgIGl0ZW1VaVNjaGVtYTogdWlTY2hlbWEuaXRlbXMsXG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMgJiYgaW5kZXggPT09IDAsXG4gICAgICAgICAgb25CbHVyLFxuICAgICAgICAgIG9uRm9jdXMsXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBjbGFzc05hbWU6IGBmaWVsZCBmaWVsZC1hcnJheSBmaWVsZC1hcnJheS1vZi0ke2l0ZW1zU2NoZW1hLnR5cGV9YCxcbiAgICAgIERlc2NyaXB0aW9uRmllbGQsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBvbkFkZENsaWNrOiB0aGlzLm9uQWRkQ2xpY2ssXG4gICAgICByZWFkb25seSxcbiAgICAgIGhpZGVFcnJvcixcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgc2NoZW1hLFxuICAgICAgdGl0bGUsXG4gICAgICBUaXRsZUZpZWxkLFxuICAgICAgZm9ybUNvbnRleHQsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIHJhd0Vycm9ycyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiBhIGN1c3RvbSByZW5kZXIgZnVuY3Rpb24gd2FzIHBhc3NlZCBpblxuICAgIGNvbnN0IENvbXBvbmVudCA9XG4gICAgICB1aVNjaGVtYVtcInVpOkFycmF5RmllbGRUZW1wbGF0ZVwiXSB8fFxuICAgICAgQXJyYXlGaWVsZFRlbXBsYXRlIHx8XG4gICAgICBEZWZhdWx0Tm9ybWFsQXJyYXlGaWVsZFRlbXBsYXRlO1xuICAgIHJldHVybiA8Q29tcG9uZW50IHsuLi5hcnJheVByb3BzfSAvPjtcbiAgfVxuXG4gIHJlbmRlckN1c3RvbVdpZGdldCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzY2hlbWEsXG4gICAgICBpZFNjaGVtYSxcbiAgICAgIHVpU2NoZW1hLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICByZWFkb25seSxcbiAgICAgIGhpZGVFcnJvcixcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBhdXRvZm9jdXMsXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkZvY3VzLFxuICAgICAgZm9ybURhdGE6IGl0ZW1zLFxuICAgICAgcmVnaXN0cnksXG4gICAgICByYXdFcnJvcnMsXG4gICAgICBuYW1lLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgd2lkZ2V0cywgZm9ybUNvbnRleHQgfSA9IHJlZ2lzdHJ5O1xuICAgIGNvbnN0IHRpdGxlID0gc2NoZW1hLnRpdGxlIHx8IG5hbWU7XG5cbiAgICBjb25zdCB7IHdpZGdldCwgLi4ub3B0aW9ucyB9ID0ge1xuICAgICAgLi4uZ2V0VWlPcHRpb25zKHVpU2NoZW1hKSxcbiAgICB9O1xuICAgIGNvbnN0IFdpZGdldCA9IGdldFdpZGdldChzY2hlbWEsIHdpZGdldCwgd2lkZ2V0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxXaWRnZXRcbiAgICAgICAgaWQ9e2lkU2NoZW1hICYmIGlkU2NoZW1hLiRpZH1cbiAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgb25DaGFuZ2U9e3RoaXMub25TZWxlY3RDaGFuZ2V9XG4gICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICBzY2hlbWE9e3NjaGVtYX1cbiAgICAgICAgdWlTY2hlbWE9e3VpU2NoZW1hfVxuICAgICAgICByZWdpc3RyeT17cmVnaXN0cnl9XG4gICAgICAgIHZhbHVlPXtpdGVtc31cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICByZWFkb25seT17cmVhZG9ubHl9XG4gICAgICAgIGhpZGVFcnJvcj17aGlkZUVycm9yfVxuICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgIGxhYmVsPXt0aXRsZX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICBmb3JtQ29udGV4dD17Zm9ybUNvbnRleHR9XG4gICAgICAgIGF1dG9mb2N1cz17YXV0b2ZvY3VzfVxuICAgICAgICByYXdFcnJvcnM9e3Jhd0Vycm9yc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlck11bHRpU2VsZWN0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgcmVhZG9ubHksXG4gICAgICByZXF1aXJlZCxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgYXV0b2ZvY3VzLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgICAgcmF3RXJyb3JzLFxuICAgICAgbmFtZSxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMucHJvcHMuZm9ybURhdGE7XG4gICAgY29uc3QgeyB3aWRnZXRzLCByb290U2NoZW1hLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgaXRlbXNTY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShzY2hlbWEuaXRlbXMsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgICBjb25zdCB0aXRsZSA9IHNjaGVtYS50aXRsZSB8fCBuYW1lO1xuICAgIGNvbnN0IGVudW1PcHRpb25zID0gb3B0aW9uc0xpc3QoaXRlbXNTY2hlbWEpO1xuICAgIGNvbnN0IHsgd2lkZ2V0ID0gXCJzZWxlY3RcIiwgLi4ub3B0aW9ucyB9ID0ge1xuICAgICAgLi4uZ2V0VWlPcHRpb25zKHVpU2NoZW1hKSxcbiAgICAgIGVudW1PcHRpb25zLFxuICAgIH07XG4gICAgY29uc3QgV2lkZ2V0ID0gZ2V0V2lkZ2V0KHNjaGVtYSwgd2lkZ2V0LCB3aWRnZXRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFdpZGdldFxuICAgICAgICBpZD17aWRTY2hlbWEgJiYgaWRTY2hlbWEuJGlkfVxuICAgICAgICBtdWx0aXBsZVxuICAgICAgICBvbkNoYW5nZT17dGhpcy5vblNlbGVjdENoYW5nZX1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIHNjaGVtYT17c2NoZW1hfVxuICAgICAgICB1aVNjaGVtYT17dWlTY2hlbWF9XG4gICAgICAgIHJlZ2lzdHJ5PXtyZWdpc3RyeX1cbiAgICAgICAgdmFsdWU9e2l0ZW1zfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIHJlYWRvbmx5PXtyZWFkb25seX1cbiAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICBsYWJlbD17dGl0bGV9XG4gICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgZm9ybUNvbnRleHQ9e2Zvcm1Db250ZXh0fVxuICAgICAgICBhdXRvZm9jdXM9e2F1dG9mb2N1c31cbiAgICAgICAgcmF3RXJyb3JzPXtyYXdFcnJvcnN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICByZW5kZXJGaWxlcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBzY2hlbWEsXG4gICAgICB1aVNjaGVtYSxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgbmFtZSxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgcmVhZG9ubHksXG4gICAgICBhdXRvZm9jdXMsXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkZvY3VzLFxuICAgICAgcmVnaXN0cnksXG4gICAgICByYXdFcnJvcnMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgdGl0bGUgPSBzY2hlbWEudGl0bGUgfHwgbmFtZTtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMucHJvcHMuZm9ybURhdGE7XG4gICAgY29uc3QgeyB3aWRnZXRzLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyB3aWRnZXQgPSBcImZpbGVzXCIsIC4uLm9wdGlvbnMgfSA9IGdldFVpT3B0aW9ucyh1aVNjaGVtYSk7XG4gICAgY29uc3QgV2lkZ2V0ID0gZ2V0V2lkZ2V0KHNjaGVtYSwgd2lkZ2V0LCB3aWRnZXRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFdpZGdldFxuICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICBpZD17aWRTY2hlbWEgJiYgaWRTY2hlbWEuJGlkfVxuICAgICAgICBtdWx0aXBsZVxuICAgICAgICBvbkNoYW5nZT17dGhpcy5vblNlbGVjdENoYW5nZX1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgIHNjaGVtYT17c2NoZW1hfVxuICAgICAgICB1aVNjaGVtYT17dWlTY2hlbWF9XG4gICAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgICAgdmFsdWU9e2l0ZW1zfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIHJlYWRvbmx5PXtyZWFkb25seX1cbiAgICAgICAgcmVnaXN0cnk9e3JlZ2lzdHJ5fVxuICAgICAgICBmb3JtQ29udGV4dD17Zm9ybUNvbnRleHR9XG4gICAgICAgIGF1dG9mb2N1cz17YXV0b2ZvY3VzfVxuICAgICAgICByYXdFcnJvcnM9e3Jhd0Vycm9yc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlckZpeGVkQXJyYXkoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGVycm9yU2NoZW1hLFxuICAgICAgaWRQcmVmaXgsXG4gICAgICBpZFNlcGFyYXRvciA9IFwiX1wiLFxuICAgICAgaWRTY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcmVxdWlyZWQsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHJlYWRvbmx5LFxuICAgICAgYXV0b2ZvY3VzLFxuICAgICAgcmVnaXN0cnksXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkZvY3VzLFxuICAgICAgcmF3RXJyb3JzLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHRpdGxlID0gc2NoZW1hLnRpdGxlIHx8IG5hbWU7XG4gICAgbGV0IGl0ZW1zID0gdGhpcy5wcm9wcy5mb3JtRGF0YTtcbiAgICBjb25zdCB7IEFycmF5RmllbGRUZW1wbGF0ZSwgcm9vdFNjaGVtYSwgZmllbGRzLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyBUaXRsZUZpZWxkIH0gPSBmaWVsZHM7XG4gICAgY29uc3QgaXRlbVNjaGVtYXMgPSBzY2hlbWEuaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT5cbiAgICAgIHJldHJpZXZlU2NoZW1hKGl0ZW0sIHJvb3RTY2hlbWEsIGZvcm1EYXRhW2luZGV4XSlcbiAgICApO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxTY2hlbWEgPSBhbGxvd0FkZGl0aW9uYWxJdGVtcyhzY2hlbWEpXG4gICAgICA/IHJldHJpZXZlU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPCBpdGVtU2NoZW1hcy5sZW5ndGgpIHtcbiAgICAgIC8vIHRvIG1ha2Ugc3VyZSBhdCBsZWFzdCBhbGwgZml4ZWQgaXRlbXMgYXJlIGdlbmVyYXRlZFxuICAgICAgaXRlbXMgPSBpdGVtcyB8fCBbXTtcbiAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KG5ldyBBcnJheShpdGVtU2NoZW1hcy5sZW5ndGggLSBpdGVtcy5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgdGhlIHByb3BzIHBhc3NlZCBpbnRvIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCBhcnJheVByb3BzID0ge1xuICAgICAgY2FuQWRkOiB0aGlzLmNhbkFkZEl0ZW0oaXRlbXMpICYmIGFkZGl0aW9uYWxTY2hlbWEsXG4gICAgICBjbGFzc05hbWU6IFwiZmllbGQgZmllbGQtYXJyYXkgZmllbGQtYXJyYXktZml4ZWQtaXRlbXNcIixcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaWRTY2hlbWEsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGl0ZW1zOiB0aGlzLnN0YXRlLmtleWVkRm9ybURhdGEubWFwKChrZXllZEl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCBpdGVtIH0gPSBrZXllZEl0ZW07XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBpbmRleCA+PSBpdGVtU2NoZW1hcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGl0ZW1TY2hlbWEgPSBhZGRpdGlvbmFsXG4gICAgICAgICAgPyByZXRyaWV2ZVNjaGVtYShzY2hlbWEuYWRkaXRpb25hbEl0ZW1zLCByb290U2NoZW1hLCBpdGVtKVxuICAgICAgICAgIDogaXRlbVNjaGVtYXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBpdGVtSWRQcmVmaXggPSBpZFNjaGVtYS4kaWQgKyBpZFNlcGFyYXRvciArIGluZGV4O1xuICAgICAgICBjb25zdCBpdGVtSWRTY2hlbWEgPSB0b0lkU2NoZW1hKFxuICAgICAgICAgIGl0ZW1TY2hlbWEsXG4gICAgICAgICAgaXRlbUlkUHJlZml4LFxuICAgICAgICAgIHJvb3RTY2hlbWEsXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpZFByZWZpeCxcbiAgICAgICAgICBpZFNlcGFyYXRvclxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpdGVtVWlTY2hlbWEgPSBhZGRpdGlvbmFsXG4gICAgICAgICAgPyB1aVNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgfHwge31cbiAgICAgICAgICA6IEFycmF5LmlzQXJyYXkodWlTY2hlbWEuaXRlbXMpXG4gICAgICAgICAgPyB1aVNjaGVtYS5pdGVtc1tpbmRleF1cbiAgICAgICAgICA6IHVpU2NoZW1hLml0ZW1zIHx8IHt9O1xuICAgICAgICBjb25zdCBpdGVtRXJyb3JTY2hlbWEgPSBlcnJvclNjaGVtYSA/IGVycm9yU2NoZW1hW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJBcnJheUZpZWxkSXRlbSh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNhblJlbW92ZTogYWRkaXRpb25hbCxcbiAgICAgICAgICBjYW5Nb3ZlVXA6IGluZGV4ID49IGl0ZW1TY2hlbWFzLmxlbmd0aCArIDEsXG4gICAgICAgICAgY2FuTW92ZURvd246IGFkZGl0aW9uYWwgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxLFxuICAgICAgICAgIGl0ZW1TY2hlbWEsXG4gICAgICAgICAgaXRlbURhdGE6IGl0ZW0sXG4gICAgICAgICAgaXRlbVVpU2NoZW1hLFxuICAgICAgICAgIGl0ZW1JZFNjaGVtYSxcbiAgICAgICAgICBpdGVtRXJyb3JTY2hlbWEsXG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMgJiYgaW5kZXggPT09IDAsXG4gICAgICAgICAgb25CbHVyLFxuICAgICAgICAgIG9uRm9jdXMsXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBvbkFkZENsaWNrOiB0aGlzLm9uQWRkQ2xpY2ssXG4gICAgICByZWFkb25seSxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcmVnaXN0cnksXG4gICAgICBzY2hlbWEsXG4gICAgICB1aVNjaGVtYSxcbiAgICAgIHRpdGxlLFxuICAgICAgVGl0bGVGaWVsZCxcbiAgICAgIGZvcm1Db250ZXh0LFxuICAgICAgcmF3RXJyb3JzLFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiBhIGN1c3RvbSB0ZW1wbGF0ZSB0ZW1wbGF0ZSB3YXMgcGFzc2VkIGluXG4gICAgY29uc3QgVGVtcGxhdGUgPVxuICAgICAgdWlTY2hlbWFbXCJ1aTpBcnJheUZpZWxkVGVtcGxhdGVcIl0gfHxcbiAgICAgIEFycmF5RmllbGRUZW1wbGF0ZSB8fFxuICAgICAgRGVmYXVsdEZpeGVkQXJyYXlGaWVsZFRlbXBsYXRlO1xuICAgIHJldHVybiA8VGVtcGxhdGUgey4uLmFycmF5UHJvcHN9IC8+O1xuICB9XG5cbiAgcmVuZGVyQXJyYXlGaWVsZEl0ZW0ocHJvcHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBrZXksXG4gICAgICBpbmRleCxcbiAgICAgIGNhblJlbW92ZSA9IHRydWUsXG4gICAgICBjYW5Nb3ZlVXAgPSB0cnVlLFxuICAgICAgY2FuTW92ZURvd24gPSB0cnVlLFxuICAgICAgaXRlbVNjaGVtYSxcbiAgICAgIGl0ZW1EYXRhLFxuICAgICAgaXRlbVVpU2NoZW1hLFxuICAgICAgaXRlbUlkU2NoZW1hLFxuICAgICAgaXRlbUVycm9yU2NoZW1hLFxuICAgICAgYXV0b2ZvY3VzLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIHJhd0Vycm9ycyxcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgeyBkaXNhYmxlZCwgcmVhZG9ubHksIHVpU2NoZW1hLCByZWdpc3RyeSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7XG4gICAgICBmaWVsZHM6IHsgU2NoZW1hRmllbGQgfSxcbiAgICB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyBvcmRlcmFibGUgPSB0cnVlLCByZW1vdmFibGUgPSB0cnVlIH0gPSBnZXRVaU9wdGlvbnModWlTY2hlbWEpO1xuICAgIGNvbnN0IGhhcyA9IHtcbiAgICAgIG1vdmVVcDogb3JkZXJhYmxlICYmIGNhbk1vdmVVcCxcbiAgICAgIG1vdmVEb3duOiBvcmRlcmFibGUgJiYgY2FuTW92ZURvd24sXG4gICAgICByZW1vdmU6IHJlbW92YWJsZSAmJiBjYW5SZW1vdmUsXG4gICAgfTtcbiAgICBoYXMudG9vbGJhciA9IE9iamVjdC5rZXlzKGhhcykuc29tZShrZXkgPT4gaGFzW2tleV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoaWxkcmVuOiAoXG4gICAgICAgIDxTY2hlbWFGaWVsZFxuICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICBzY2hlbWE9e2l0ZW1TY2hlbWF9XG4gICAgICAgICAgdWlTY2hlbWE9e2l0ZW1VaVNjaGVtYX1cbiAgICAgICAgICBmb3JtRGF0YT17aXRlbURhdGF9XG4gICAgICAgICAgZXJyb3JTY2hlbWE9e2l0ZW1FcnJvclNjaGVtYX1cbiAgICAgICAgICBpZFByZWZpeD17dGhpcy5wcm9wcy5pZFByZWZpeH1cbiAgICAgICAgICBpZFNlcGFyYXRvcj17dGhpcy5wcm9wcy5pZFNlcGFyYXRvcn1cbiAgICAgICAgICBpZFNjaGVtYT17aXRlbUlkU2NoZW1hfVxuICAgICAgICAgIHJlcXVpcmVkPXt0aGlzLmlzSXRlbVJlcXVpcmVkKGl0ZW1TY2hlbWEpfVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlRm9ySW5kZXgoaW5kZXgpfVxuICAgICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgICAgcmVnaXN0cnk9e3RoaXMucHJvcHMucmVnaXN0cnl9XG4gICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWR9XG4gICAgICAgICAgcmVhZG9ubHk9e3RoaXMucHJvcHMucmVhZG9ubHl9XG4gICAgICAgICAgaGlkZUVycm9yPXt0aGlzLnByb3BzLmhpZGVFcnJvcn1cbiAgICAgICAgICBhdXRvZm9jdXM9e2F1dG9mb2N1c31cbiAgICAgICAgICByYXdFcnJvcnM9e3Jhd0Vycm9yc31cbiAgICAgICAgLz5cbiAgICAgICksXG4gICAgICBjbGFzc05hbWU6IFwiYXJyYXktaXRlbVwiLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBoYXNUb29sYmFyOiBoYXMudG9vbGJhcixcbiAgICAgIGhhc01vdmVVcDogaGFzLm1vdmVVcCxcbiAgICAgIGhhc01vdmVEb3duOiBoYXMubW92ZURvd24sXG4gICAgICBoYXNSZW1vdmU6IGhhcy5yZW1vdmUsXG4gICAgICBpbmRleCxcbiAgICAgIGtleSxcbiAgICAgIG9uQWRkSW5kZXhDbGljazogdGhpcy5vbkFkZEluZGV4Q2xpY2ssXG4gICAgICBvbkRyb3BJbmRleENsaWNrOiB0aGlzLm9uRHJvcEluZGV4Q2xpY2ssXG4gICAgICBvblJlb3JkZXJDbGljazogdGhpcy5vblJlb3JkZXJDbGljayxcbiAgICAgIHJlYWRvbmx5LFxuICAgIH07XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBBcnJheUZpZWxkLnByb3BUeXBlcyA9IHR5cGVzLmZpZWxkUHJvcHM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFycmF5RmllbGQ7XG4iXX0=
|