botframework-webchat 4.15.3-main.20220706.75d867c → 4.15.3-main.20220728.008aa26
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/webchat-es5.js +1 -1
- package/dist/webchat-minimal.js +1 -1
- package/dist/webchat.js +1 -1
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.d.ts +2 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.js +25 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.d.ts +3 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.js +32 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.d.ts +13 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.js +132 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.d.ts +3 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.js +21 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.d.ts +2 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.js +18 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.d.ts +3 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.js +15 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.d.ts +16 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.js +45 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.d.ts +15 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.js +93 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.d.ts +6 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.js +44 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.d.ts +9 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.js +50 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.d.ts +6 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.js +103 -0
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts.map +1 -1
- package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.js +97 -557
- package/lib/adaptiveCards/Attachment/private/renderAdaptiveCard.d.ts +15 -0
- package/lib/adaptiveCards/Attachment/private/renderAdaptiveCard.d.ts.map +1 -0
- package/lib/adaptiveCards/Attachment/private/renderAdaptiveCard.js +79 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.d.ts +6 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.js +25 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/bunchUndos.d.ts +3 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/bunchUndos.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/bunchUndos.js +23 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.d.ts +8 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.js +38 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.d.ts +22 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.js +96 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/addClass.d.ts +5 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/addClass.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/addClass.js +19 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.d.ts +7 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.js +16 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/noOp.d.ts +3 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/noOp.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/noOp.js +14 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.d.ts +9 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.js +22 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.d.ts +12 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.js +41 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.d.ts +3 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.d.ts.map +1 -0
- package/lib/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.js +2 -0
- package/lib/addVersion.js +1 -1
- package/lib/createFullStyleSet.d.ts +2 -2
- package/package.json +7 -7
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/closest.ts +17 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/findDOMNodeOwner.ts +25 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/useAdaptiveCardModEffect.ts +93 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/useLazyRef.ts +15 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/usePrevious.ts +12 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/private/useValueRef.ts +11 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect.ts +39 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useActionShouldBePushButtonModEffect.ts +105 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useActiveElementModEffect.ts +35 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/useDisabledModEffect.ts +45 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardHacks/usePersistValuesModEffect.ts +110 -0
- package/src/adaptiveCards/Attachment/AdaptiveCardRenderer.tsx +83 -582
- package/src/adaptiveCards/Attachment/private/renderAdaptiveCard.ts +75 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/addEventListenerWithUndo.ts +21 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/bunchUndos.tsx +12 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/durableAddClassWithUndo.ts +28 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/durableDisableInputElementAccessiblyWithUndo.ts +84 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/private/addClass.tsx +13 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/private/getAttributeOrFalse.ts +8 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/private/noOp.ts +5 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/private/setOrRemoveAttributeIfFalse.ts +18 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/setOrRemoveAttributeIfFalseWithUndo.ts +34 -0
- package/src/adaptiveCards/DOMManipulationWithUndo/types/UndoFunction.ts +3 -0
|
@@ -11,8 +11,6 @@ exports.default = void 0;
|
|
|
11
11
|
|
|
12
12
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
13
|
|
|
14
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
|
-
|
|
16
14
|
var _botframeworkWebchatComponent = require("botframework-webchat-component");
|
|
17
15
|
|
|
18
16
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
@@ -21,10 +19,24 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
21
19
|
|
|
22
20
|
var _react = _interopRequireWildcard(require("react"));
|
|
23
21
|
|
|
22
|
+
var _renderAdaptiveCard = _interopRequireDefault(require("./private/renderAdaptiveCard"));
|
|
23
|
+
|
|
24
|
+
var _useActionSetShouldNotBeMenuBarModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/useActionSetShouldNotBeMenuBarModEffect"));
|
|
25
|
+
|
|
26
|
+
var _useActionShouldBePushButtonModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/useActionShouldBePushButtonModEffect"));
|
|
27
|
+
|
|
28
|
+
var _useActiveElementModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/useActiveElementModEffect"));
|
|
29
|
+
|
|
24
30
|
var _useAdaptiveCardsHostConfig = _interopRequireDefault(require("../hooks/useAdaptiveCardsHostConfig"));
|
|
25
31
|
|
|
26
32
|
var _useAdaptiveCardsPackage = _interopRequireDefault(require("../hooks/useAdaptiveCardsPackage"));
|
|
27
33
|
|
|
34
|
+
var _useDisabledModEffect3 = _interopRequireDefault(require("./AdaptiveCardHacks/useDisabledModEffect"));
|
|
35
|
+
|
|
36
|
+
var _usePersistValuesModEffect = _interopRequireDefault(require("./AdaptiveCardHacks/usePersistValuesModEffect"));
|
|
37
|
+
|
|
38
|
+
var _useValueRef = _interopRequireDefault(require("./AdaptiveCardHacks/private/useValueRef"));
|
|
39
|
+
|
|
28
40
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
29
41
|
|
|
30
42
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -39,437 +51,11 @@ var useDisabled = _botframeworkWebchatComponent.hooks.useDisabled,
|
|
|
39
51
|
useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet;
|
|
40
52
|
var node_env = undefined || "production";
|
|
41
53
|
|
|
42
|
-
function
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return function () {
|
|
48
|
-
return fns.forEach(function (fn) {
|
|
49
|
-
return fn === null || fn === void 0 ? void 0 : fn();
|
|
50
|
-
});
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Adds a class to the `HTMLElement`. Returns `true` if the class is added, otherwise, `undefined`.
|
|
55
|
-
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
function addClass(element, className) {
|
|
59
|
-
var classList = element.classList;
|
|
60
|
-
|
|
61
|
-
if (!classList.contains(className)) {
|
|
62
|
-
classList.add(className);
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Adds a class to the `HTMLElement` and re-add on mutations.
|
|
68
|
-
*
|
|
69
|
-
* @returns {function} A function, when called, will restore to previous state.
|
|
70
|
-
*/
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
function addPersistentClassWithUndo(element, className) {
|
|
74
|
-
if (!element) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (addClass(element, className)) {
|
|
79
|
-
// After we add the class, keep observing the element to make sure the class is not removed.
|
|
80
|
-
var observer = new MutationObserver(function () {
|
|
81
|
-
return addClass(element, className);
|
|
82
|
-
});
|
|
83
|
-
observer.observe(element, {
|
|
84
|
-
attributes: true,
|
|
85
|
-
attributeFilter: ['class']
|
|
86
|
-
});
|
|
87
|
-
return function () {
|
|
88
|
-
var classNames = new Set(element.className.split(' '));
|
|
89
|
-
classNames.delete(className);
|
|
90
|
-
element.className = Array.from(classNames).join(' ');
|
|
91
|
-
observer.disconnect();
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Returns `true`, if the object is a plain object and not a class, otherwise, `false`.
|
|
97
|
-
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
function isPlainObject(obj) {
|
|
101
|
-
return Object.getPrototypeOf(obj) === Object.prototype;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Sets an attribute.
|
|
105
|
-
*
|
|
106
|
-
* @returns {function} A function, when called, will restore to previous state.
|
|
107
|
-
*/
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
function setAttributeWithUndo(element, qualifiedName, nextValue) {
|
|
111
|
-
if (!element) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
var value = element.getAttribute(qualifiedName);
|
|
116
|
-
|
|
117
|
-
if (value !== nextValue) {
|
|
118
|
-
element.setAttribute(qualifiedName, nextValue);
|
|
119
|
-
return function () {
|
|
120
|
-
return value ? element.setAttribute(qualifiedName, value) : element.removeAttribute(qualifiedName);
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* An event handler for disabling event bubbling and propagation.
|
|
126
|
-
*/
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
var disabledHandler = function disabledHandler(event) {
|
|
130
|
-
event.preventDefault();
|
|
131
|
-
event.stopImmediatePropagation();
|
|
132
|
-
event.stopPropagation();
|
|
133
|
-
};
|
|
134
|
-
/**
|
|
135
|
-
* Listens to event once. Returns a function, when called, will stop listening.
|
|
136
|
-
*/
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
function addEventListenerOnceWithUndo(element, name, handler) {
|
|
140
|
-
if (!element) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
/* eslint-disable-next-line prefer-const */
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
var detach;
|
|
147
|
-
|
|
148
|
-
var detachingHandler = function detachingHandler(event) {
|
|
149
|
-
try {
|
|
150
|
-
handler(event);
|
|
151
|
-
} finally {
|
|
152
|
-
// IE11 does not support { once: true }, so we need to detach manually.
|
|
153
|
-
detach();
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
detach = function detach() {
|
|
158
|
-
return element.removeEventListener(name, detachingHandler);
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
element.addEventListener(name, detachingHandler, {
|
|
162
|
-
once: true
|
|
163
|
-
});
|
|
164
|
-
return detach;
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Listens to event. Returns a function, when called, will stop listening.
|
|
168
|
-
*/
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
function addEventListenerWithUndo(element, name, handler) {
|
|
172
|
-
if (!element) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
element.addEventListener(name, handler);
|
|
177
|
-
return function () {
|
|
178
|
-
return element.removeEventListener(name, handler);
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Disables an element with undo function.
|
|
183
|
-
*
|
|
184
|
-
* @returns {function} A function, when called, will restore to previous state.
|
|
185
|
-
*/
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
function disableElementWithUndo(element) {
|
|
189
|
-
if (!element) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
var undoStack = [];
|
|
194
|
-
var isActive = element === document.activeElement;
|
|
195
|
-
var tag = element.nodeName.toLowerCase();
|
|
196
|
-
/* eslint-disable-next-line default-case */
|
|
197
|
-
|
|
198
|
-
switch (tag) {
|
|
199
|
-
case 'button':
|
|
200
|
-
case 'input':
|
|
201
|
-
case 'select':
|
|
202
|
-
case 'textarea':
|
|
203
|
-
undoStack.push(setAttributeWithUndo(element, 'aria-disabled', 'true'));
|
|
204
|
-
|
|
205
|
-
if (isActive) {
|
|
206
|
-
undoStack.push(addEventListenerOnceWithUndo(element, 'blur', function () {
|
|
207
|
-
return undoStack.push(setAttributeWithUndo(element, 'disabled', 'disabled'));
|
|
208
|
-
}));
|
|
209
|
-
} else {
|
|
210
|
-
undoStack.push(setAttributeWithUndo(element, 'disabled', 'disabled'));
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (tag === 'input' || tag === 'textarea') {
|
|
214
|
-
undoStack.push(addEventListenerWithUndo(element, 'click', disabledHandler));
|
|
215
|
-
undoStack.push(setAttributeWithUndo(element, 'readonly', 'readonly'));
|
|
216
|
-
} else if (tag === 'select') {
|
|
217
|
-
undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)([].map.call(element.querySelectorAll('option'), function (option) {
|
|
218
|
-
return setAttributeWithUndo(option, 'disabled', 'disabled');
|
|
219
|
-
})));
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return bunchUndos.apply(void 0, undoStack);
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Disables all inputtable descendants.
|
|
229
|
-
*
|
|
230
|
-
* @param {HTMLElement | undefined} element Container element to start looking for inputtable descendants.
|
|
231
|
-
* @param {boolean} observeSubtree `true` to applies to all future inputtable descendants, otherwise, `false`.
|
|
232
|
-
*
|
|
233
|
-
* @returns {function} A function, when called, will restore to previous state.
|
|
234
|
-
*/
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
function disableInputElementsWithUndo(element) {
|
|
238
|
-
var observeSubtree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
239
|
-
|
|
240
|
-
if (!element) {
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
var undoStack = [].map.call(element.querySelectorAll('button, input, select, textarea'), function (element) {
|
|
245
|
-
return disableElementWithUndo(element);
|
|
246
|
-
});
|
|
247
|
-
var tag = element.nodeName.toLowerCase(); // Only set tabindex="-1" on focusable element. Otherwise, we will make <div> focusable by mouse.
|
|
248
|
-
|
|
249
|
-
(tag === 'a' || tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea') && undoStack.push(setAttributeWithUndo(element, 'tabindex', '-1'));
|
|
250
|
-
|
|
251
|
-
if (observeSubtree) {
|
|
252
|
-
var observer = new MutationObserver(function (mutations) {
|
|
253
|
-
return mutations.forEach(function (_ref) {
|
|
254
|
-
var addedNodes = _ref.addedNodes;
|
|
255
|
-
return undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)([].map.call(addedNodes, function (addedNode) {
|
|
256
|
-
return disableInputElementsWithUndo(addedNode, false);
|
|
257
|
-
})));
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
observer.observe(element, {
|
|
261
|
-
childList: true,
|
|
262
|
-
subtree: true
|
|
263
|
-
});
|
|
264
|
-
undoStack.push(function () {
|
|
265
|
-
return observer.disconnect();
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
return bunchUndos.apply(void 0, (0, _toConsumableArray2.default)(undoStack));
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Gets the value of an attribute from an element.
|
|
273
|
-
*
|
|
274
|
-
* @returns {false | string} The value of the attribute. `false` if the attribute was not set.
|
|
275
|
-
*/
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
function getAttribute(element, qualifiedName) {
|
|
279
|
-
return !!element && element.hasAttribute(qualifiedName) && (element.getAttribute(qualifiedName) || '');
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Sets or removes an attribute from an element.
|
|
283
|
-
*
|
|
284
|
-
* @param {HTMLElement} element - The element to set or remove attribute from.
|
|
285
|
-
* @param {string} qualifiedName - The name of the attribute.
|
|
286
|
-
* @param {false | string} value - The value of the attribute. When passing `false`, remove the attribute.
|
|
287
|
-
*/
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
function setOrRemoveAttribute(element, qualifiedName, value) {
|
|
291
|
-
if (value === false) {
|
|
292
|
-
element === null || element === void 0 ? void 0 : element.removeAttribute(qualifiedName);
|
|
293
|
-
} else {
|
|
294
|
-
element === null || element === void 0 ? void 0 : element.setAttribute(qualifiedName, value);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Sets or removes an attribute from an element with an undo function.
|
|
299
|
-
*
|
|
300
|
-
* @param {HTMLElement} element - The element to set or remove attribute from.
|
|
301
|
-
* @param {string} qualifiedName - The name of the attribute.
|
|
302
|
-
* @param {false | string} value - The value of the attribute. When passing `false`, remove the attribute.
|
|
303
|
-
*
|
|
304
|
-
* @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
|
|
305
|
-
*/
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
|
|
309
|
-
if (!element) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
var prevValue = getAttribute(element, qualifiedName);
|
|
314
|
-
setOrRemoveAttribute(element, qualifiedName, value);
|
|
315
|
-
return function () {
|
|
316
|
-
return setOrRemoveAttribute(element, qualifiedName, prevValue);
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Finds the first ancestor that fulfill the predicate.
|
|
321
|
-
*
|
|
322
|
-
* @param {HTMLElement} element - The starting element. This element will not be checked against the predicate.
|
|
323
|
-
* @param {(ancestor: HTMLElement) => boolean} predicate - The predicate to fulfill.
|
|
324
|
-
*
|
|
325
|
-
* @returns {HTMLElement | undefined} The first ancestor that fulfill the predicate, otherwise, `undefined`.
|
|
326
|
-
*/
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
function findAncestor(element, predicate) {
|
|
330
|
-
var current = element;
|
|
331
|
-
|
|
332
|
-
while (current = current.parentElement) {
|
|
333
|
-
if (predicate.call(element, current)) {
|
|
334
|
-
return current;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Indicates the action selected by performing a series of manipulations, with undo:
|
|
340
|
-
*
|
|
341
|
-
* - Accessibility: set `aria-pressed` to `true`
|
|
342
|
-
* - Applies `styleOptions.actionPerformedClassName`
|
|
343
|
-
*
|
|
344
|
-
* @param {HTMLElement[]} selectedActionElements - An array of elements that are representing the action and is selected.
|
|
345
|
-
* @param {string?} actionPerformedClassName - The name of the class to apply to all elements.
|
|
346
|
-
*
|
|
347
|
-
* @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
|
|
348
|
-
*/
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
function indicateActionSelectionWithUndo(selectedActionElements, actionPerformedClassName) {
|
|
352
|
-
if (!(selectedActionElements !== null && selectedActionElements !== void 0 && selectedActionElements.length)) {
|
|
353
|
-
return;
|
|
354
|
-
} // Verify all input elements are "ac-pushButton", could belongs to ActionSet or "card actions".
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
if (selectedActionElements.some(function (actionElement) {
|
|
358
|
-
return !actionElement.classList.contains('ac-pushButton');
|
|
359
|
-
})) {
|
|
360
|
-
console.warn('botframework-webchat: Cannot mark selected action in the card, some elements are not an "ac-pushButton".');
|
|
361
|
-
return;
|
|
362
|
-
} // A distinct set of action set containers which has selections, excluding containers without actions.
|
|
363
|
-
// Multiple submission in an Adaptive Card is still a vague area and TBD.
|
|
364
|
-
// We might want to disable the whole card, just buttons in same container, or do nothing (today).
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
var actionSetElements = new Set();
|
|
368
|
-
selectedActionElements.forEach(function (selectedActionElement) {
|
|
369
|
-
var actionSetElement = findAncestor(selectedActionElement, function (ancestor) {
|
|
370
|
-
return ancestor.getAttribute('role') === 'menubar';
|
|
371
|
-
});
|
|
372
|
-
actionSetElement && actionSetElements.add(actionSetElement);
|
|
373
|
-
});
|
|
374
|
-
var undoStack = [];
|
|
375
|
-
actionSetElements.forEach(function (actionSetElement) {
|
|
376
|
-
// Remove "role" from every "ac-actionSet" container.
|
|
377
|
-
undoStack.push(setOrRemoveAttributeWithUndo(actionSetElement, 'role', false)); // Modify "role" of every actions in the container.
|
|
378
|
-
|
|
379
|
-
Array.from(actionSetElement.querySelectorAll('.ac-pushButton')).forEach(function (actionElement) {
|
|
380
|
-
if (selectedActionElements.includes(actionElement)) {
|
|
381
|
-
// Add "aria-pressed" and set "role" attribute to "button" (which is required by "aria-pressed").
|
|
382
|
-
undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'aria-pressed', 'true'));
|
|
383
|
-
undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'role', 'button')); // Highlight actions by applying `styleOptions.actionPerformedClassName`.
|
|
384
|
-
|
|
385
|
-
actionPerformedClassName && undoStack.push(addPersistentClassWithUndo(actionElement, actionPerformedClassName));
|
|
386
|
-
} else {
|
|
387
|
-
// We removed "role=menubar" from the container, we must remove "role=menuitem" from unselected actions.
|
|
388
|
-
undoStack.push(setOrRemoveAttributeWithUndo(actionElement, 'role', false));
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
});
|
|
392
|
-
return bunchUndos.apply(void 0, undoStack);
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Fixes accessibility issues from Adaptive Card, with undo.
|
|
396
|
-
*
|
|
397
|
-
* @returns {() => void} The undo function, when called, will undo all manipulations by restoring values recorded at the time of the function call.
|
|
398
|
-
*/
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
function fixAccessibilityIssuesWithUndo(element) {
|
|
402
|
-
if (!element) {
|
|
403
|
-
return;
|
|
404
|
-
} // These hacks should be done in Adaptive Cards library instead.
|
|
405
|
-
// Related to #3949: All action buttons inside role="menubar" should be role="menuitem".
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
var undoStack = Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
|
|
409
|
-
return setAttributeWithUndo(actionButton, 'role', 'menuitem');
|
|
410
|
-
});
|
|
411
|
-
return function () {
|
|
412
|
-
return undoStack.forEach(function (undo) {
|
|
413
|
-
return undo === null || undo === void 0 ? void 0 : undo();
|
|
414
|
-
});
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
function getFocusableElements(element) {
|
|
419
|
-
return [].filter.call(element.querySelectorAll(['a', 'body', 'button', 'frame', 'iframe', 'img', 'input', 'isindex', 'object', 'select', 'textarea', '[tabindex]'].join(', ')), function (element) {
|
|
420
|
-
var tabIndex = (0, _botframeworkWebchatComponent.getTabIndex)(element);
|
|
421
|
-
return typeof tabIndex === 'number' && tabIndex >= 0;
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
function restoreActiveElementIndex(element, activeElementIndex) {
|
|
426
|
-
var _getFocusableElements;
|
|
427
|
-
|
|
428
|
-
(_getFocusableElements = getFocusableElements(element)[+activeElementIndex]) === null || _getFocusableElements === void 0 ? void 0 : _getFocusableElements.focus();
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
function saveActiveElementIndex(element) {
|
|
432
|
-
return getFocusableElements(element).indexOf(document.activeElement);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
function restoreInputValues(element, inputValues) {
|
|
436
|
-
var inputs = element.querySelectorAll('input, select, textarea');
|
|
437
|
-
[].forEach.call(inputs, function (input, index) {
|
|
438
|
-
var value = inputValues[+index];
|
|
439
|
-
|
|
440
|
-
if (typeof value !== 'undefined') {
|
|
441
|
-
var tagName = input.tagName,
|
|
442
|
-
type = input.type;
|
|
443
|
-
|
|
444
|
-
if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
|
|
445
|
-
if (typeof value === 'boolean') {
|
|
446
|
-
input.checked = value;
|
|
447
|
-
}
|
|
448
|
-
} else if (typeof value === 'string') {
|
|
449
|
-
input.value = value;
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
function saveInputValues(element) {
|
|
456
|
-
var inputs = element.querySelectorAll('input, select, textarea');
|
|
457
|
-
return [].map.call(inputs, function (input) {
|
|
458
|
-
var type = input.type;
|
|
459
|
-
|
|
460
|
-
if (input.tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
|
|
461
|
-
return input.checked;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
return input.value;
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
469
|
-
var actionPerformedClassName = _ref2.actionPerformedClassName,
|
|
470
|
-
adaptiveCard = _ref2.adaptiveCard,
|
|
471
|
-
disabledFromProps = _ref2.disabled,
|
|
472
|
-
tapAction = _ref2.tapAction;
|
|
54
|
+
var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref) {
|
|
55
|
+
var actionPerformedClassName = _ref.actionPerformedClassName,
|
|
56
|
+
adaptiveCard = _ref.adaptiveCard,
|
|
57
|
+
disabledFromProps = _ref.disabled,
|
|
58
|
+
tapAction = _ref.tapAction;
|
|
473
59
|
|
|
474
60
|
var _useStyleSet = useStyleSet(),
|
|
475
61
|
_useStyleSet2 = (0, _slicedToArray2.default)(_useStyleSet, 1),
|
|
@@ -481,11 +67,6 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
|
481
67
|
GlobalSettings = _useAdaptiveCardsPack3.GlobalSettings,
|
|
482
68
|
HostConfig = _useAdaptiveCardsPack3.HostConfig;
|
|
483
69
|
|
|
484
|
-
var _useState = (0, _react.useState)([]),
|
|
485
|
-
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
486
|
-
actionsPerformed = _useState2[0],
|
|
487
|
-
setActionsPerformed = _useState2[1];
|
|
488
|
-
|
|
489
70
|
var _useAdaptiveCardsHost = (0, _useAdaptiveCardsHostConfig.default)(),
|
|
490
71
|
_useAdaptiveCardsHost2 = (0, _slicedToArray2.default)(_useAdaptiveCardsHost, 1),
|
|
491
72
|
adaptiveCardsHostConfig = _useAdaptiveCardsHost2[0];
|
|
@@ -494,31 +75,20 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
|
494
75
|
_useDisabled2 = (0, _slicedToArray2.default)(_useDisabled, 1),
|
|
495
76
|
disabledFromComposer = _useDisabled2[0];
|
|
496
77
|
|
|
497
|
-
var _useState3 = (0, _react.useState)([]),
|
|
498
|
-
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
499
|
-
errors = _useState4[0],
|
|
500
|
-
setErrors = _useState4[1];
|
|
501
|
-
|
|
502
|
-
var _useState5 = (0, _react.useState)(0),
|
|
503
|
-
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
504
|
-
lastRender = _useState6[0],
|
|
505
|
-
setLastRender = _useState6[1];
|
|
506
|
-
|
|
507
|
-
var activeElementIndexRef = (0, _react.useRef)(-1);
|
|
508
|
-
var adaptiveCardElementRef = (0, _react.useRef)();
|
|
509
78
|
var contentRef = (0, _react.useRef)();
|
|
510
|
-
var inputValuesRef = (0, _react.useRef)([]);
|
|
511
79
|
var localize = useLocalizer();
|
|
512
80
|
var performCardAction = usePerformCardAction();
|
|
513
81
|
var renderMarkdownAsHTML = useRenderMarkdownAsHTML();
|
|
514
82
|
var scrollToEnd = useScrollToEnd();
|
|
515
|
-
var disabled = disabledFromComposer || disabledFromProps;
|
|
83
|
+
var disabled = disabledFromComposer || disabledFromProps;
|
|
84
|
+
var tapActionRef = (0, _useValueRef.default)(tapAction);
|
|
85
|
+
var disabledRef = (0, _useValueRef.default)(disabled); // TODO: [P2] #3199 We should consider using `adaptiveCard.selectAction` instead.
|
|
516
86
|
// The null check for "tapAction" is in "handleClickAndKeyPressForTapAction".
|
|
517
87
|
|
|
518
88
|
var handleClickAndKeyPress = (0, _react.useCallback)(function (event) {
|
|
519
|
-
var
|
|
520
|
-
key =
|
|
521
|
-
type =
|
|
89
|
+
var _ref2 = event,
|
|
90
|
+
key = _ref2.key,
|
|
91
|
+
type = _ref2.type;
|
|
522
92
|
var target = event.target; // Some items, e.g. tappable text, cannot be disabled thru DOM attributes
|
|
523
93
|
|
|
524
94
|
var current = contentRef.current;
|
|
@@ -549,29 +119,25 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
|
549
119
|
}
|
|
550
120
|
}
|
|
551
121
|
|
|
552
|
-
performCardAction(
|
|
122
|
+
performCardAction(tapActionRef.current);
|
|
553
123
|
scrollToEnd();
|
|
554
|
-
}, [contentRef, performCardAction, scrollToEnd,
|
|
124
|
+
}, [contentRef, performCardAction, scrollToEnd, tapActionRef]); // Only listen to event if it is not disabled and have "tapAction" prop.
|
|
555
125
|
|
|
556
126
|
var handleClickAndKeyPressForTapAction = !disabled && tapAction ? handleClickAndKeyPress : undefined;
|
|
557
|
-
var addActionsPerformed = (0, _react.useCallback)(function (action) {
|
|
558
|
-
return !~actionsPerformed.indexOf(action) && setActionsPerformed([].concat((0, _toConsumableArray2.default)(actionsPerformed), [action]));
|
|
559
|
-
}, [actionsPerformed, setActionsPerformed]);
|
|
560
127
|
var handleExecuteAction = (0, _react.useCallback)(function (action) {
|
|
561
128
|
// Some items, e.g. tappable image, cannot be disabled thru DOM attributes
|
|
562
|
-
if (
|
|
129
|
+
if (disabledRef.current) {
|
|
563
130
|
return;
|
|
564
131
|
}
|
|
565
132
|
|
|
566
|
-
addActionsPerformed(action);
|
|
567
133
|
var actionTypeName = action.getJsonTypeName();
|
|
568
134
|
var image = action.iconUrl,
|
|
569
135
|
title = action.title; // We cannot use "instanceof" check here, because web devs may bring their own version of Adaptive Cards package.
|
|
570
136
|
// We need to check using "getJsonTypeName()" instead.
|
|
571
137
|
|
|
572
138
|
if (actionTypeName === 'Action.OpenUrl') {
|
|
573
|
-
var
|
|
574
|
-
value =
|
|
139
|
+
var _ref3 = action,
|
|
140
|
+
value = _ref3.url;
|
|
575
141
|
performCardAction({
|
|
576
142
|
image: image,
|
|
577
143
|
title: title,
|
|
@@ -579,8 +145,8 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
|
579
145
|
value: value
|
|
580
146
|
});
|
|
581
147
|
} else if (actionTypeName === 'Action.Submit') {
|
|
582
|
-
var
|
|
583
|
-
data =
|
|
148
|
+
var _ref4 = action,
|
|
149
|
+
data = _ref4.data;
|
|
584
150
|
|
|
585
151
|
if (typeof data !== 'undefined') {
|
|
586
152
|
if (typeof data === 'string') {
|
|
@@ -607,100 +173,74 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
|
|
|
607
173
|
console.error("Web Chat: received unknown action from Adaptive Cards");
|
|
608
174
|
console.error(action);
|
|
609
175
|
}
|
|
610
|
-
}, [
|
|
176
|
+
}, [disabledRef, performCardAction, scrollToEnd]); // For accessibility issue #1340, `tabindex="0"` must not be set for the root container if it is not interactive.
|
|
177
|
+
|
|
178
|
+
var setTabIndexAtCardRoot = !!tapAction;
|
|
179
|
+
|
|
180
|
+
var _useActionShouldBePus = (0, _useActionShouldBePushButtonModEffect.default)(adaptiveCard),
|
|
181
|
+
_useActionShouldBePus2 = (0, _slicedToArray2.default)(_useActionShouldBePus, 2),
|
|
182
|
+
applyActionShouldBePushButtonMod = _useActionShouldBePus2[0],
|
|
183
|
+
undoActionShouldBePushButtonMod = _useActionShouldBePus2[1];
|
|
184
|
+
|
|
185
|
+
var _useActionSetShouldNo = (0, _useActionSetShouldNotBeMenuBarModEffect.default)(adaptiveCard),
|
|
186
|
+
_useActionSetShouldNo2 = (0, _slicedToArray2.default)(_useActionSetShouldNo, 2),
|
|
187
|
+
applyActionSetShouldNotBeMenuBarMod = _useActionSetShouldNo2[0],
|
|
188
|
+
undoActionSetShouldNotBeMenuBarMod = _useActionSetShouldNo2[1];
|
|
189
|
+
|
|
190
|
+
var _useActiveElementModE = (0, _useActiveElementModEffect.default)(adaptiveCard),
|
|
191
|
+
_useActiveElementModE2 = (0, _slicedToArray2.default)(_useActiveElementModE, 2),
|
|
192
|
+
applyActiveElementMod = _useActiveElementModE2[0],
|
|
193
|
+
undoActiveElementMod = _useActiveElementModE2[1];
|
|
194
|
+
|
|
195
|
+
var _useDisabledModEffect = (0, _useDisabledModEffect3.default)(adaptiveCard),
|
|
196
|
+
_useDisabledModEffect2 = (0, _slicedToArray2.default)(_useDisabledModEffect, 2),
|
|
197
|
+
applyDisabledMod = _useDisabledModEffect2[0],
|
|
198
|
+
undoDisabledMod = _useDisabledModEffect2[1];
|
|
199
|
+
|
|
200
|
+
var _usePersistValuesModE = (0, _usePersistValuesModEffect.default)(adaptiveCard),
|
|
201
|
+
_usePersistValuesModE2 = (0, _slicedToArray2.default)(_usePersistValuesModE, 2),
|
|
202
|
+
applyPersistValuesMod = _usePersistValuesModE2[0],
|
|
203
|
+
undoPersistValuesMod = _usePersistValuesModE2[1];
|
|
204
|
+
|
|
205
|
+
var _useMemo = (0, _react.useMemo)(function () {
|
|
206
|
+
undoActionShouldBePushButtonMod();
|
|
207
|
+
undoActionSetShouldNotBeMenuBarMod();
|
|
208
|
+
undoActiveElementMod();
|
|
209
|
+
undoDisabledMod();
|
|
210
|
+
undoPersistValuesMod();
|
|
211
|
+
return (0, _renderAdaptiveCard.default)(adaptiveCard, {
|
|
212
|
+
adaptiveCardsHostConfig: adaptiveCardsHostConfig,
|
|
213
|
+
adaptiveCardsPackage: {
|
|
214
|
+
GlobalSettings: GlobalSettings,
|
|
215
|
+
HostConfig: HostConfig
|
|
216
|
+
},
|
|
217
|
+
renderMarkdownAsHTML: renderMarkdownAsHTML,
|
|
218
|
+
setTabIndexAtCardRoot: setTabIndexAtCardRoot
|
|
219
|
+
});
|
|
220
|
+
}, [adaptiveCard, adaptiveCardsHostConfig, GlobalSettings, HostConfig, renderMarkdownAsHTML, setTabIndexAtCardRoot, undoActionShouldBePushButtonMod, undoActionSetShouldNotBeMenuBarMod, undoActiveElementMod, undoDisabledMod, undoPersistValuesMod]),
|
|
221
|
+
element = _useMemo.element,
|
|
222
|
+
errors = _useMemo.errors;
|
|
223
|
+
|
|
224
|
+
(0, _react.useMemo)(function () {
|
|
225
|
+
adaptiveCard.onExecuteAction = handleExecuteAction;
|
|
226
|
+
}, [adaptiveCard, handleExecuteAction]);
|
|
611
227
|
(0, _react.useLayoutEffect)(function () {
|
|
612
228
|
var current = contentRef.current;
|
|
613
|
-
|
|
614
|
-
if (!current || !adaptiveCard) {
|
|
615
|
-
activeElementIndexRef.current = -1;
|
|
616
|
-
inputValuesRef.current = [];
|
|
617
|
-
} // Currently, the only way to set the Markdown engine is to set it thru static member of AdaptiveCard class
|
|
618
|
-
// TODO: [P3] Checks if we could make the "renderMarkdownAsHTML" per card
|
|
619
|
-
// This could be limitations from Adaptive Cards package (not supported as of 1.2.5)
|
|
620
|
-
// Because there could be timing difference between .parse and .render, we could be using wrong Markdown engine
|
|
621
|
-
// "onProcessMarkdown" is a static function but we are trying to scope it to the current object instead.
|
|
622
|
-
// eslint-disable-next-line dot-notation
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
adaptiveCard.constructor['onProcessMarkdown'] = function (text, result) {
|
|
626
|
-
if (renderMarkdownAsHTML) {
|
|
627
|
-
result.outputHtml = renderMarkdownAsHTML(text);
|
|
628
|
-
result.didProcess = true;
|
|
629
|
-
}
|
|
630
|
-
};
|
|
631
|
-
|
|
632
|
-
if (adaptiveCardsHostConfig) {
|
|
633
|
-
adaptiveCard.hostConfig = isPlainObject(adaptiveCardsHostConfig) ? new HostConfig(adaptiveCardsHostConfig) : adaptiveCardsHostConfig;
|
|
634
|
-
} // For accessibility issue #1340, `tabindex="0"` must not be set for the root container if it is not interactive.
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
GlobalSettings.setTabIndexAtCardRoot = !!tapAction;
|
|
638
|
-
|
|
639
|
-
var _adaptiveCard$validat = adaptiveCard.validateProperties(),
|
|
640
|
-
validationEvents = _adaptiveCard$validat.validationEvents;
|
|
641
|
-
|
|
642
|
-
if (validationEvents.length) {
|
|
643
|
-
return setErrors(validationEvents.reduce(function (items, _ref6) {
|
|
644
|
-
var message = _ref6.message;
|
|
645
|
-
return [].concat((0, _toConsumableArray2.default)(items), [new Error(message)]);
|
|
646
|
-
}, []));
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
var element;
|
|
650
|
-
|
|
651
|
-
try {
|
|
652
|
-
element = adaptiveCard.render();
|
|
653
|
-
} catch (error) {
|
|
654
|
-
return setErrors([error]);
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
if (!element) {
|
|
658
|
-
return setErrors([new Error('Adaptive Card rendered as empty element')]);
|
|
659
|
-
} // Clear errors on next render
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
setErrors([]);
|
|
663
|
-
restoreInputValues(element, inputValuesRef.current);
|
|
664
|
-
current.appendChild(element);
|
|
665
|
-
adaptiveCardElementRef.current = element; // Focus can only be restored after the DOM is attached.
|
|
666
|
-
|
|
667
|
-
restoreActiveElementIndex(element, activeElementIndexRef.current);
|
|
668
|
-
setLastRender(Date.now());
|
|
229
|
+
current === null || current === void 0 ? void 0 : current.appendChild(element);
|
|
669
230
|
return function () {
|
|
670
|
-
|
|
671
|
-
inputValuesRef.current = saveInputValues(element);
|
|
672
|
-
current.removeChild(adaptiveCardElementRef.current);
|
|
673
|
-
adaptiveCardElementRef.current = undefined;
|
|
231
|
+
current === null || current === void 0 ? void 0 : current.removeChild(element);
|
|
674
232
|
};
|
|
675
|
-
}, [
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
return disableInputElementsWithUndo(adaptiveCardElementRef.current);
|
|
687
|
-
}
|
|
688
|
-
}, [adaptiveCardElementRef, disabled, lastRender]);
|
|
689
|
-
(0, _react.useEffect)(function () {
|
|
690
|
-
// If the Adaptive Card changed, reset all actions performed.
|
|
691
|
-
setActionsPerformed([]);
|
|
692
|
-
}, [adaptiveCard]);
|
|
693
|
-
(0, _react.useEffect)(function () {
|
|
694
|
-
return indicateActionSelectionWithUndo( // Actions that do not have "renderedElement" means it is the Adaptive Card itself, such as "selectAction" (AC) or "tapAction" (rich cards).
|
|
695
|
-
// We do not need to mark the whole card as performed.
|
|
696
|
-
actionsPerformed.map(function (_ref7) {
|
|
697
|
-
var renderedElement = _ref7.renderedElement;
|
|
698
|
-
return renderedElement;
|
|
699
|
-
}).filter(function (renderedElement) {
|
|
700
|
-
return renderedElement;
|
|
701
|
-
}), actionPerformedClassName);
|
|
702
|
-
}, [actionsPerformed, actionPerformedClassName, lastRender]);
|
|
703
|
-
return errors.length ? node_env === 'development' && /*#__PURE__*/_react.default.createElement(ErrorBox, {
|
|
233
|
+
}, [contentRef, element]); // Apply all mods regardless whether the element changed or not.
|
|
234
|
+
// This is because we have undoed mods when we call the `useXXXModEffect` hook.
|
|
235
|
+
|
|
236
|
+
(0, _react.useLayoutEffect)(function () {
|
|
237
|
+
applyActionShouldBePushButtonMod(element, actionPerformedClassName);
|
|
238
|
+
applyActionSetShouldNotBeMenuBarMod(element);
|
|
239
|
+
applyActiveElementMod(element);
|
|
240
|
+
applyDisabledMod(element, disabled);
|
|
241
|
+
applyPersistValuesMod(element);
|
|
242
|
+
}, [actionPerformedClassName, applyActionShouldBePushButtonMod, applyActionSetShouldNotBeMenuBarMod, applyActiveElementMod, applyDisabledMod, applyPersistValuesMod, disabled, element]);
|
|
243
|
+
return errors !== null && errors !== void 0 && errors.length ? node_env === 'development' && /*#__PURE__*/_react.default.createElement(ErrorBox, {
|
|
704
244
|
error: errors[0],
|
|
705
245
|
type: localize('ADAPTIVE_CARD_ERROR_BOX_TITLE_RENDER')
|
|
706
246
|
}) : /*#__PURE__*/_react.default.createElement("div", {
|
|
@@ -731,4 +271,4 @@ AdaptiveCardRenderer.propTypes = {
|
|
|
731
271
|
};
|
|
732
272
|
var _default = AdaptiveCardRenderer;
|
|
733
273
|
exports.default = _default;
|
|
734
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiYnVuY2hVbmRvcyIsImZucyIsImZvckVhY2giLCJmbiIsImFkZENsYXNzIiwiZWxlbWVudCIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiYWRkIiwiYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8iLCJvYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUZpbHRlciIsImNsYXNzTmFtZXMiLCJTZXQiLCJzcGxpdCIsImRlbGV0ZSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvIiwib2JzZXJ2ZVN1YnRyZWUiLCJtdXRhdGlvbnMiLCJhZGRlZE5vZGVzIiwiYWRkZWROb2RlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJpbmNsdWRlcyIsImZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyIsImFjdGlvbkJ1dHRvbiIsInVuZG8iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwiaW1hZ2UiLCJpY29uVXJsIiwidGl0bGUiLCJ1cmwiLCJkYXRhIiwiX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24iLCJjYXJkQWN0aW9uIiwiZXJyb3IiLCJjb25zdHJ1Y3RvciIsInRleHQiLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImlzUmVxdWlyZWQiLCJib29sIiwic2hhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVNBOztBQUNBOztBQUNBOztBQUNBOztBQWFBOztBQUNBOzs7Ozs7QUExQkE7QUE0QkEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1DQUFsSCxDQUFrRkksY0FBbEY7QUFBQSxJQUFrR0MsV0FBbEcsR0FBa0hMLG1DQUFsSCxDQUFrR0ssV0FBbEc7QUFFQSxJQUFNQyxRQUFRLEdBQUcseUJBQWpCOztBQUlBLFNBQVNDLFVBQVQsR0FBMEQ7QUFBQSxvQ0FBbkNDLEdBQW1DO0FBQW5DQSxJQUFBQSxHQUFtQztBQUFBOztBQUN4RCxTQUFPO0FBQUEsV0FBTUEsR0FBRyxDQUFDQyxPQUFKLENBQVksVUFBQUMsRUFBRTtBQUFBLGFBQUlBLEVBQUosYUFBSUEsRUFBSix1QkFBSUEsRUFBRSxFQUFOO0FBQUEsS0FBZCxDQUFOO0FBQUEsR0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxRQUFULENBQWtCQyxPQUFsQixFQUF3Q0MsU0FBeEMsRUFBNkU7QUFD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WUFBWSxFQUFFa0UsbUJBQVVFLEdBQVYsQ0FBY0MsVUFGRztBQUcvQm5FLEVBQUFBLFFBQVEsRUFBRWdFLG1CQUFVSSxJQUhXO0FBSy9CO0FBQ0E7QUFDQW5FLEVBQUFBLFNBQVMsRUFBRStELG1CQUFVSyxLQUFWLENBQWdCO0FBQ3pCbkMsSUFBQUEsS0FBSyxFQUFFOEIsbUJBQVVDLE1BRFE7QUFFekI3QixJQUFBQSxLQUFLLEVBQUU0QixtQkFBVUMsTUFGUTtBQUd6QnZFLElBQUFBLElBQUksRUFBRXNFLG1CQUFVQyxNQUFWLENBQWlCRSxVQUhFO0FBSXpCckosSUFBQUEsS0FBSyxFQUFFa0osbUJBQVVDO0FBSlEsR0FBaEI7QUFQb0IsQ0FBakM7ZUFlZXBFLG9CIiwic291cmNlUm9vdCI6ImJ1bmRsZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDJdIH1dICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbiBhcyBBZGFwdGl2ZUNhcmRBY3Rpb24sXG4gIEFkYXB0aXZlQ2FyZCxcbiAgSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCxcbiAgT3BlblVybEFjdGlvbixcbiAgU3VibWl0QWN0aW9uXG59IGZyb20gJ2FkYXB0aXZlY2FyZHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50cywgZ2V0VGFiSW5kZXgsIGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29tcG9uZW50JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwge1xuICBLZXlib2FyZEV2ZW50SGFuZGxlcixcbiAgTW91c2VFdmVudEhhbmRsZXIsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbiAgVkZDXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRGlyZWN0TGluZUNhcmRBY3Rpb24gfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb3JlJztcblxuaW1wb3J0IHsgQm90RnJhbWV3b3JrQ2FyZEFjdGlvbiB9IGZyb20gJy4vQWRhcHRpdmVDYXJkQnVpbGRlcic7XG5pbXBvcnQgdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcgZnJvbSAnLi4vaG9va3MvdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcnO1xuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlJztcblxuY29uc3QgeyBFcnJvckJveCB9ID0gQ29tcG9uZW50cztcbmNvbnN0IHsgdXNlRGlzYWJsZWQsIHVzZUxvY2FsaXplciwgdXNlUGVyZm9ybUNhcmRBY3Rpb24sIHVzZVJlbmRlck1hcmtkb3duQXNIVE1MLCB1c2VTY3JvbGxUb0VuZCwgdXNlU3R5bGVTZXQgfSA9IGhvb2tzO1xuXG5jb25zdCBub2RlX2VudiA9IHByb2Nlc3MuZW52Lm5vZGVfZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WO1xuXG50eXBlIFVuZG9GdW5jdGlvbiA9ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gYnVuY2hVbmRvcyguLi5mbnM6IFVuZG9GdW5jdGlvbltdKTogVW5kb0Z1bmN0aW9uIHtcbiAgcmV0dXJuICgpID0+IGZucy5mb3JFYWNoKGZuID0+IGZuPy4oKSk7XG59XG5cbi8qKlxuICogQWRkcyBhIGNsYXNzIHRvIHRoZSBgSFRNTEVsZW1lbnRgLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY2xhc3MgaXMgYWRkZWQsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHRydWUgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGNsYXNzTGlzdCB9ID0gZWxlbWVudDtcblxuICBpZiAoIWNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIGEgY2xhc3MgdG8gdGhlIGBIVE1MRWxlbWVudGAgYW5kIHJlLWFkZCBvbiBtdXRhdGlvbnMuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBhZGRQZXJzaXN0ZW50Q2xhc3NXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSkge1xuICAgIC8vIEFmdGVyIHdlIGFkZCB0aGUgY2xhc3MsIGtlZXAgb2JzZXJ2aW5nIHRoZSBlbGVtZW50IHRvIG1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgbm90IHJlbW92ZWQuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXSB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldChlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpKTtcblxuICAgICAgY2xhc3NOYW1lcy5kZWxldGUoY2xhc3NOYW1lKTtcblxuICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBBcnJheS5mcm9tKGNsYXNzTmFtZXMpLmpvaW4oJyAnKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBvYmplY3QgaXMgYSBwbGFpbiBvYmplY3QgYW5kIG5vdCBhIGNsYXNzLCBvdGhlcndpc2UsIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cblxuLyoqXG4gKiBTZXRzIGFuIGF0dHJpYnV0ZS5cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHJlc3RvcmUgdG8gcHJldmlvdXMgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZVdpdGhVbmRvKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgcXVhbGlmaWVkTmFtZTogc3RyaW5nLFxuICBuZXh0VmFsdWU6IHN0cmluZ1xuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcblxuICBpZiAodmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIG5leHRWYWx1ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4gKHZhbHVlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpIDogZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkpO1xuICB9XG59XG5cbi8qKlxuICogQW4gZXZlbnQgaGFuZGxlciBmb3IgZGlzYWJsaW5nIGV2ZW50IGJ1YmJsaW5nIGFuZCBwcm9wYWdhdGlvbi5cbiAqL1xuY29uc3QgZGlzYWJsZWRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59O1xuXG4vKipcbiAqIExpc3RlbnMgdG8gZXZlbnQgb25jZS4gUmV0dXJucyBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCBzdG9wIGxpc3RlbmluZy5cbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogRXZlbnRMaXN0ZW5lclxuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCAqL1xuICBsZXQgZGV0YWNoOiAoKSA9PiB2b2lkO1xuICBjb25zdCBkZXRhY2hpbmdIYW5kbGVyID0gZXZlbnQgPT4ge1xuICAgIHRyeSB7XG4gICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHsgb25jZTogdHJ1ZSB9LCBzbyB3ZSBuZWVkIHRvIGRldGFjaCBtYW51YWxseS5cbiAgICAgIGRldGFjaCgpO1xuICAgIH1cbiAgfTtcblxuICBkZXRhY2ggPSAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZGV0YWNoaW5nSGFuZGxlcik7XG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcblxuICByZXR1cm4gZGV0YWNoO1xufVxuXG4vKipcbiAqIExpc3RlbnMgdG8gZXZlbnQuIFJldHVybnMgYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgc3RvcCBsaXN0ZW5pbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogRXZlbnRMaXN0ZW5lclxuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xuXG4gIHJldHVybiAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgYW4gZWxlbWVudCB3aXRoIHVuZG8gZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdW5kb1N0YWNrOiBVbmRvRnVuY3Rpb25bXSA9IFtdO1xuICBjb25zdCBpc0FjdGl2ZSA9IGVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGNvbnN0IHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlICovXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJykpO1xuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goXG4gICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhlbGVtZW50LCAnYmx1cicsICgpID0+XG4gICAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyhlbGVtZW50LCAnY2xpY2snLCBkaXNhYmxlZEhhbmRsZXIpKTtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3JlYWRvbmx5JywgJ3JlYWRvbmx5JykpO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIC4uLltdLm1hcC5jYWxsKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJyksIG9wdGlvbiA9PlxuICAgICAgICAgICAgc2V0QXR0cmlidXRlV2l0aFVuZG8ob3B0aW9uLCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gYnVuY2hVbmRvcyguLi51bmRvU3RhY2spO1xufVxuXG4vKipcbiAqIERpc2FibGVzIGFsbCBpbnB1dHRhYmxlIGRlc2NlbmRhbnRzLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnQgfCB1bmRlZmluZWR9IGVsZW1lbnQgQ29udGFpbmVyIGVsZW1lbnQgdG8gc3RhcnQgbG9va2luZyBmb3IgaW5wdXR0YWJsZSBkZXNjZW5kYW50cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb2JzZXJ2ZVN1YnRyZWUgYHRydWVgIHRvIGFwcGxpZXMgdG8gYWxsIGZ1dHVyZSBpbnB1dHRhYmxlIGRlc2NlbmRhbnRzLCBvdGhlcndpc2UsIGBmYWxzZWAuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLCBvYnNlcnZlU3VidHJlZSA9IHRydWUpOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW10ubWFwLmNhbGwoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhJyksIGVsZW1lbnQgPT5cbiAgICBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQpXG4gICk7XG5cbiAgY29uc3QgdGFnID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIE9ubHkgc2V0IHRhYmluZGV4PVwiLTFcIiBvbiBmb2N1c2FibGUgZWxlbWVudC4gT3RoZXJ3aXNlLCB3ZSB3aWxsIG1ha2UgPGRpdj4gZm9jdXNhYmxlIGJ5IG1vdXNlLlxuICAodGFnID09PSAnYScgfHwgdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYScpICYmXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3RhYmluZGV4JywgJy0xJykpO1xuXG4gIGlmIChvYnNlcnZlU3VidHJlZSkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhZGRlZE5vZGVzIH0pID0+XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKC4uLltdLm1hcC5jYWxsKGFkZGVkTm9kZXMsIGFkZGVkTm9kZSA9PiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkZGVkTm9kZSwgZmFsc2UpKSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgIHVuZG9TdGFjay5wdXNoKCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICByZXR1cm4gYnVuY2hVbmRvcyguLi51bmRvU3RhY2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMge2ZhbHNlIHwgc3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gYGZhbHNlYCBpZiB0aGUgYXR0cmlidXRlIHdhcyBub3Qgc2V0LlxuICovXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHF1YWxpZmllZE5hbWU6IHN0cmluZyk6IGZhbHNlIHwgc3RyaW5nIHtcbiAgcmV0dXJuICEhZWxlbWVudCAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSAmJiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHwgJycpO1xufVxuXG4vKipcbiAqIFNldHMgb3IgcmVtb3ZlcyBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzZXQgb3IgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtmYWxzZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gV2hlbiBwYXNzaW5nIGBmYWxzZWAsIHJlbW92ZSB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgcXVhbGlmaWVkTmFtZTogc3RyaW5nLCB2YWx1ZTogZmFsc2UgfCBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIGVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50Py5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogU2V0cyBvciByZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQgd2l0aCBhbiB1bmRvIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzZXQgb3IgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtmYWxzZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gV2hlbiBwYXNzaW5nIGBmYWxzZWAsIHJlbW92ZSB0aGUgYXR0cmlidXRlLlxuICpcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBUaGUgdW5kbyBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgdW5kbyBhbGwgbWFuaXB1bGF0aW9ucyBieSByZXN0b3JpbmcgdmFsdWVzIHJlY29yZGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuICovXG5mdW5jdGlvbiBzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgcXVhbGlmaWVkTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogZmFsc2UgfCBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHByZXZWYWx1ZSA9IGdldEF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lKTtcblxuICBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCB2YWx1ZSk7XG5cbiAgcmV0dXJuICgpID0+IHNldE9yUmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIHF1YWxpZmllZE5hbWUsIHByZXZWYWx1ZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGljYXRlLlxuICogQHBhcmFtIHsoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFufSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIHRvIGZ1bGZpbGwuXG4gKlxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfSBUaGUgZmlyc3QgYW5jZXN0b3IgdGhhdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlZGljYXRlOiAoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50KSkge1xuICAgIGlmIChwcmVkaWNhdGUuY2FsbChlbGVtZW50LCBjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBhY3Rpb24gc2VsZWN0ZWQgYnkgcGVyZm9ybWluZyBhIHNlcmllcyBvZiBtYW5pcHVsYXRpb25zLCB3aXRoIHVuZG86XG4gKlxuICogLSBBY2Nlc3NpYmlsaXR5OiBzZXQgYGFyaWEtcHJlc3NlZGAgdG8gYHRydWVgXG4gKiAtIEFwcGxpZXMgYHN0eWxlT3B0aW9ucy5hY3Rpb25QZXJmb3JtZWRDbGFzc05hbWVgXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzIC0gQW4gYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgcmVwcmVzZW50aW5nIHRoZSBhY3Rpb24gYW5kIGlzIHNlbGVjdGVkLlxuICogQHBhcmFtIHtzdHJpbmc/fSBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYXBwbHkgdG8gYWxsIGVsZW1lbnRzLlxuICpcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBUaGUgdW5kbyBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgdW5kbyBhbGwgbWFuaXB1bGF0aW9ucyBieSByZXN0b3JpbmcgdmFsdWVzIHJlY29yZGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuICovXG5mdW5jdGlvbiBpbmRpY2F0ZUFjdGlvblNlbGVjdGlvbldpdGhVbmRvKFxuICBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzOiBIVE1MRWxlbWVudFtdIHwgdW5kZWZpbmVkLFxuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWU/OiBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghc2VsZWN0ZWRBY3Rpb25FbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVmVyaWZ5IGFsbCBpbnB1dCBlbGVtZW50cyBhcmUgXCJhYy1wdXNoQnV0dG9uXCIsIGNvdWxkIGJlbG9uZ3MgdG8gQWN0aW9uU2V0IG9yIFwiY2FyZCBhY3Rpb25zXCIuXG4gIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLnNvbWUoYWN0aW9uRWxlbWVudCA9PiAhYWN0aW9uRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjLXB1c2hCdXR0b24nKSkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IENhbm5vdCBtYXJrIHNlbGVjdGVkIGFjdGlvbiBpbiB0aGUgY2FyZCwgc29tZSBlbGVtZW50cyBhcmUgbm90IGFuIFwiYWMtcHVzaEJ1dHRvblwiLidcbiAgICApO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQSBkaXN0aW5jdCBzZXQgb2YgYWN0aW9uIHNldCBjb250YWluZXJzIHdoaWNoIGhhcyBzZWxlY3Rpb25zLCBleGNsdWRpbmcgY29udGFpbmVycyB3aXRob3V0IGFjdGlvbnMuXG4gIC8vIE11bHRpcGxlIHN1Ym1pc3Npb24gaW4gYW4gQWRhcHRpdmUgQ2FyZCBpcyBzdGlsbCBhIHZhZ3VlIGFyZWEgYW5kIFRCRC5cbiAgLy8gV2UgbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSB3aG9sZSBjYXJkLCBqdXN0IGJ1dHRvbnMgaW4gc2FtZSBjb250YWluZXIsIG9yIGRvIG5vdGhpbmcgKHRvZGF5KS5cbiAgY29uc3QgYWN0aW9uU2V0RWxlbWVudHMgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuXG4gIHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuZm9yRWFjaChzZWxlY3RlZEFjdGlvbkVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGFjdGlvblNldEVsZW1lbnQgPSBmaW5kQW5jZXN0b3IoXG4gICAgICBzZWxlY3RlZEFjdGlvbkVsZW1lbnQsXG4gICAgICBhbmNlc3RvciA9PiBhbmNlc3Rvci5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ21lbnViYXInXG4gICAgKTtcblxuICAgIGFjdGlvblNldEVsZW1lbnQgJiYgYWN0aW9uU2V0RWxlbWVudHMuYWRkKGFjdGlvblNldEVsZW1lbnQpO1xuICB9KTtcblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgYWN0aW9uU2V0RWxlbWVudHMuZm9yRWFjaChhY3Rpb25TZXRFbGVtZW50ID0+IHtcbiAgICAvLyBSZW1vdmUgXCJyb2xlXCIgZnJvbSBldmVyeSBcImFjLWFjdGlvblNldFwiIGNvbnRhaW5lci5cbiAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvblNldEVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcblxuICAgIC8vIE1vZGlmeSBcInJvbGVcIiBvZiBldmVyeSBhY3Rpb25zIGluIHRoZSBjb250YWluZXIuXG4gICAgQXJyYXkuZnJvbShhY3Rpb25TZXRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1wdXNoQnV0dG9uJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4pLmZvckVhY2goXG4gICAgICBhY3Rpb25FbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuaW5jbHVkZXMoYWN0aW9uRWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBBZGQgXCJhcmlhLXByZXNzZWRcIiBhbmQgc2V0IFwicm9sZVwiIGF0dHJpYnV0ZSB0byBcImJ1dHRvblwiICh3aGljaCBpcyByZXF1aXJlZCBieSBcImFyaWEtcHJlc3NlZFwiKS5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdhcmlhLXByZXNzZWQnLCAndHJ1ZScpKTtcbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgJ2J1dHRvbicpKTtcblxuICAgICAgICAgIC8vIEhpZ2hsaWdodCBhY3Rpb25zIGJ5IGFwcGx5aW5nIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYC5cbiAgICAgICAgICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgJiZcbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvKGFjdGlvbkVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIHJlbW92ZWQgXCJyb2xlPW1lbnViYXJcIiBmcm9tIHRoZSBjb250YWluZXIsIHdlIG11c3QgcmVtb3ZlIFwicm9sZT1tZW51aXRlbVwiIGZyb20gdW5zZWxlY3RlZCBhY3Rpb25zLlxuICAgICAgICAgIHVuZG9TdGFjay5wdXNoKHNldE9yUmVtb3ZlQXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uRWxlbWVudCwgJ3JvbGUnLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1bmNoVW5kb3MoLi4udW5kb1N0YWNrKTtcbn1cblxuLyoqXG4gKiBGaXhlcyBhY2Nlc3NpYmlsaXR5IGlzc3VlcyBmcm9tIEFkYXB0aXZlIENhcmQsIHdpdGggdW5kby5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZml4QWNjZXNzaWJpbGl0eUlzc3Vlc1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlc2UgaGFja3Mgc2hvdWxkIGJlIGRvbmUgaW4gQWRhcHRpdmUgQ2FyZHMgbGlicmFyeSBpbnN0ZWFkLlxuICAvLyBSZWxhdGVkIHRvICMzOTQ5OiBBbGwgYWN0aW9uIGJ1dHRvbnMgaW5zaWRlIHJvbGU9XCJtZW51YmFyXCIgc2hvdWxkIGJlIHJvbGU9XCJtZW51aXRlbVwiLlxuICBjb25zdCB1bmRvU3RhY2s6IFVuZG9GdW5jdGlvbltdID0gQXJyYXkuZnJvbShcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1hY3Rpb25TZXRbcm9sZT1cIm1lbnViYXJcIl0gW3JvbGU9XCJidXR0b25cIl0nKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PlxuICApLm1hcChhY3Rpb25CdXR0b24gPT4gc2V0QXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uQnV0dG9uLCAncm9sZScsICdtZW51aXRlbScpKTtcblxuICByZXR1cm4gKCkgPT4gdW5kb1N0YWNrLmZvckVhY2godW5kbyA9PiB1bmRvPy4oKSk7XG59XG5cbmZ1bmN0aW9uIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiBbXS5maWx0ZXIuY2FsbChcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBbXG4gICAgICAgICdhJyxcbiAgICAgICAgJ2JvZHknLFxuICAgICAgICAnYnV0dG9uJyxcbiAgICAgICAgJ2ZyYW1lJyxcbiAgICAgICAgJ2lmcmFtZScsXG4gICAgICAgICdpbWcnLFxuICAgICAgICAnaW5wdXQnLFxuICAgICAgICAnaXNpbmRleCcsXG4gICAgICAgICdvYmplY3QnLFxuICAgICAgICAnc2VsZWN0JyxcbiAgICAgICAgJ3RleHRhcmVhJyxcbiAgICAgICAgJ1t0YWJpbmRleF0nXG4gICAgICBdLmpvaW4oJywgJylcbiAgICApIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+LFxuICAgIGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleChlbGVtZW50KTtcblxuICAgICAgcmV0dXJuIHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMDtcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudDogSFRNTEVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleDogbnVtYmVyKSB7XG4gIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQpWythY3RpdmVFbGVtZW50SW5kZXhdPy5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KS5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudDogSFRNTEVsZW1lbnQsIGlucHV0VmFsdWVzOiAoYm9vbGVhbiB8IHN0cmluZylbXSkge1xuICBjb25zdCBpbnB1dHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykgYXMgTm9kZUxpc3RPZjxcbiAgICBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gID47XG5cbiAgW10uZm9yRWFjaC5jYWxsKGlucHV0cywgKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFZhbHVlc1sraW5kZXhdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHsgdGFnTmFtZSwgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICAgIGlmICh0YWdOYW1lID09PSAnSU5QVVQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIChpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IChib29sZWFuIHwgc3RyaW5nKVtdIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpIGFzIE5vZGVMaXN0T2Y8XG4gICAgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICA+O1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChpbnB1dHMsIChpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICBpZiAoaW5wdXQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgcmV0dXJuIChpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dC52YWx1ZTtcbiAgfSk7XG59XG5cbnR5cGUgQWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nO1xuICBhZGFwdGl2ZUNhcmQ6IEFkYXB0aXZlQ2FyZDtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0YXBBY3Rpb24/OiBEaXJlY3RMaW5lQ2FyZEFjdGlvbjtcbn07XG5cbmNvbnN0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBWRkM8QWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcz4gPSAoe1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsXG4gIGFkYXB0aXZlQ2FyZCxcbiAgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLFxuICB0YXBBY3Rpb25cbn0pID0+IHtcbiAgY29uc3QgW3sgYWRhcHRpdmVDYXJkUmVuZGVyZXI6IGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9XSA9IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlKCk7XG4gIGNvbnN0IFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXSA9IHVzZVN0YXRlPEFkYXB0aXZlQ2FyZEFjdGlvbltdPihbXSk7XG4gIGNvbnN0IFthZGFwdGl2ZUNhcmRzSG9zdENvbmZpZ10gPSB1c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZygpO1xuICBjb25zdCBbZGlzYWJsZWRGcm9tQ29tcG9zZXJdID0gdXNlRGlzYWJsZWQoKTtcbiAgY29uc3QgW2Vycm9ycywgc2V0RXJyb3JzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2xhc3RSZW5kZXIsIHNldExhc3RSZW5kZXJdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnRJbmRleFJlZiA9IHVzZVJlZigtMSk7XG4gIGNvbnN0IGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYgPSB1c2VSZWY8SFRNTEVsZW1lbnQ+KCk7XG4gIGNvbnN0IGNvbnRlbnRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gIGNvbnN0IGlucHV0VmFsdWVzUmVmID0gdXNlUmVmPChib29sZWFuIHwgc3RyaW5nKVtdPihbXSk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHBlcmZvcm1DYXJkQWN0aW9uID0gdXNlUGVyZm9ybUNhcmRBY3Rpb24oKTtcbiAgY29uc3QgcmVuZGVyTWFya2Rvd25Bc0hUTUwgPSB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCgpO1xuICBjb25zdCBzY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3QgZGlzYWJsZWQgPSBkaXNhYmxlZEZyb21Db21wb3NlciB8fCBkaXNhYmxlZEZyb21Qcm9wcztcblxuICAvLyBUT0RPOiBbUDJdICMzMTk5IFdlIHNob3VsZCBjb25zaWRlciB1c2luZyBgYWRhcHRpdmVDYXJkLnNlbGVjdEFjdGlvbmAgaW5zdGVhZC5cbiAgLy8gVGhlIG51bGwgY2hlY2sgZm9yIFwidGFwQWN0aW9uXCIgaXMgaW4gXCJoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uXCIuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IGtleSwgdHlwZSB9ID0gZXZlbnQgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcblxuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSB0ZXh0LCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuICAgICAgY29uc3QgYWRhcHRpdmVDYXJkUm9vdCA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmFjLWFkYXB0aXZlQ2FyZFt0YWJpbmRleD1cIjBcIl0nKTtcblxuICAgICAgaWYgKCFhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBObyBBZGFwdGl2ZSBDYXJkIHJvb3QgY29udGFpbmVyIGNhbiBiZSBmb3VuZDsgdGhlIGNhcmQgaXMgcHJvYmFibHkgb24gYW4gdW5zdXBwb3J0ZWQgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFwia2V5cHJlc3NcIiBldmVudCwgd2Ugb25seSBsaXN0ZW4gdG8gRU5URVIgYW5kIFNQQUNFQkFSIGtleS5cbiAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdFbnRlcicgJiYga2V5ICE9PSAnICcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB3aWxsIGNhbGwgcGVyZm9ybUNhcmRBY3Rpb24gaWYgZWl0aGVyOlxuICAgICAgLy8gMS4gV2UgYXJlIG9uIHRoZSB0YXJnZXQsIG9yXG4gICAgICAvLyAyLiBUaGUgZXZlbnQtZGlzcGF0Y2hpbmcgZWxlbWVudCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgIGlmICh0YXJnZXQgIT09IGFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleCh0YXJnZXQpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNsaWNraW5nIG9uIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgY2xpY2thYmxlLCBkbyBub3QgYWxsb3cgdGhlbSB0byBjbGljayB0aGUgY2FyZC5cbiAgICAgICAgLy8gRS5nLiBhIGhlcm8gY2FyZCBjYW4gYmUgdGFwcGFibGUsIGFuZCBpbWFnZSBhbmQgYnV0dG9ucyBpbnNpZGUgdGhlIGhlcm8gY2FyZCBjYW4gYWxzbyBiZSB0YXBwYWJsZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZXJmb3JtQ2FyZEFjdGlvbih0YXBBY3Rpb24pO1xuICAgICAgc2Nyb2xsVG9FbmQoKTtcbiAgICB9LFxuICAgIFtjb250ZW50UmVmLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmQsIHRhcEFjdGlvbl1cbiAgKTtcblxuICAvLyBPbmx5IGxpc3RlbiB0byBldmVudCBpZiBpdCBpcyBub3QgZGlzYWJsZWQgYW5kIGhhdmUgXCJ0YXBBY3Rpb25cIiBwcm9wLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uID0gIWRpc2FibGVkICYmIHRhcEFjdGlvbiA/IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYWRkQWN0aW9uc1BlcmZvcm1lZCA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpb246IEFkYXB0aXZlQ2FyZEFjdGlvbik6IHZvaWQgPT5cbiAgICAgICF+YWN0aW9uc1BlcmZvcm1lZC5pbmRleE9mKGFjdGlvbikgJiYgc2V0QWN0aW9uc1BlcmZvcm1lZChbLi4uYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uXSksXG4gICAgW2FjdGlvbnNQZXJmb3JtZWQsIHNldEFjdGlvbnNQZXJmb3JtZWRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRXhlY3V0ZUFjdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpb246IEFkYXB0aXZlQ2FyZEFjdGlvbik6IHZvaWQgPT4ge1xuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSBpbWFnZSwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZEFjdGlvbnNQZXJmb3JtZWQoYWN0aW9uKTtcblxuICAgICAgY29uc3QgYWN0aW9uVHlwZU5hbWUgPSBhY3Rpb24uZ2V0SnNvblR5cGVOYW1lKCk7XG4gICAgICBjb25zdCB7IGljb25Vcmw6IGltYWdlLCB0aXRsZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBXZSBjYW5ub3QgdXNlIFwiaW5zdGFuY2VvZlwiIGNoZWNrIGhlcmUsIGJlY2F1c2Ugd2ViIGRldnMgbWF5IGJyaW5nIHRoZWlyIG93biB2ZXJzaW9uIG9mIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UuXG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHVzaW5nIFwiZ2V0SnNvblR5cGVOYW1lKClcIiBpbnN0ZWFkLlxuICAgICAgaWYgKGFjdGlvblR5cGVOYW1lID09PSAnQWN0aW9uLk9wZW5VcmwnKSB7XG4gICAgICAgIGNvbnN0IHsgdXJsOiB2YWx1ZSB9ID0gYWN0aW9uIGFzIE9wZW5VcmxBY3Rpb247XG5cbiAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHR5cGU6ICdvcGVuVXJsJyxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uVHlwZU5hbWUgPT09ICdBY3Rpb24uU3VibWl0Jykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGFjdGlvbiBhcyBTdWJtaXRBY3Rpb24gYXMge1xuICAgICAgICAgIGRhdGE6IHN0cmluZyB8IEJvdEZyYW1ld29ya0NhcmRBY3Rpb247XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAnaW1CYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5fX2lzQm90RnJhbWV3b3JrQ2FyZEFjdGlvbikge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oZGF0YS5jYXJkQWN0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdwb3N0QmFjaycsXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY3JvbGxUb0VuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2ViIENoYXQ6IHJlY2VpdmVkIHVua25vd24gYWN0aW9uIGZyb20gQWRhcHRpdmUgQ2FyZHNgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihhY3Rpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZEFjdGlvbnNQZXJmb3JtZWQsIGRpc2FibGVkLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmRdXG4gICk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG5cbiAgICBpZiAoIWN1cnJlbnQgfHwgIWFkYXB0aXZlQ2FyZCkge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50bHksIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIE1hcmtkb3duIGVuZ2luZSBpcyB0byBzZXQgaXQgdGhydSBzdGF0aWMgbWVtYmVyIG9mIEFkYXB0aXZlQ2FyZCBjbGFzc1xuXG4gICAgLy8gVE9ETzogW1AzXSBDaGVja3MgaWYgd2UgY291bGQgbWFrZSB0aGUgXCJyZW5kZXJNYXJrZG93bkFzSFRNTFwiIHBlciBjYXJkXG4gICAgLy8gICAgICAgVGhpcyBjb3VsZCBiZSBsaW1pdGF0aW9ucyBmcm9tIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UgKG5vdCBzdXBwb3J0ZWQgYXMgb2YgMS4yLjUpXG4gICAgLy8gICAgICAgQmVjYXVzZSB0aGVyZSBjb3VsZCBiZSB0aW1pbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIC5wYXJzZSBhbmQgLnJlbmRlciwgd2UgY291bGQgYmUgdXNpbmcgd3JvbmcgTWFya2Rvd24gZW5naW5lXG5cbiAgICAvLyBcIm9uUHJvY2Vzc01hcmtkb3duXCIgaXMgYSBzdGF0aWMgZnVuY3Rpb24gYnV0IHdlIGFyZSB0cnlpbmcgdG8gc2NvcGUgaXQgdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGluc3RlYWQuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvblxuICAgIGFkYXB0aXZlQ2FyZC5jb25zdHJ1Y3Rvclsnb25Qcm9jZXNzTWFya2Rvd24nXSA9ICh0ZXh0OiBzdHJpbmcsIHJlc3VsdDogSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlbmRlck1hcmtkb3duQXNIVE1MKSB7XG4gICAgICAgIHJlc3VsdC5vdXRwdXRIdG1sID0gcmVuZGVyTWFya2Rvd25Bc0hUTUwodGV4dCk7XG4gICAgICAgIHJlc3VsdC5kaWRQcm9jZXNzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKSB7XG4gICAgICBhZGFwdGl2ZUNhcmQuaG9zdENvbmZpZyA9IGlzUGxhaW5PYmplY3QoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpXG4gICAgICAgID8gbmV3IEhvc3RDb25maWcoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpXG4gICAgICAgIDogYWRhcHRpdmVDYXJkc0hvc3RDb25maWc7XG4gICAgfVxuXG4gICAgLy8gRm9yIGFjY2Vzc2liaWxpdHkgaXNzdWUgIzEzNDAsIGB0YWJpbmRleD1cIjBcImAgbXVzdCBub3QgYmUgc2V0IGZvciB0aGUgcm9vdCBjb250YWluZXIgaWYgaXQgaXMgbm90IGludGVyYWN0aXZlLlxuICAgIEdsb2JhbFNldHRpbmdzLnNldFRhYkluZGV4QXRDYXJkUm9vdCA9ICEhdGFwQWN0aW9uO1xuXG4gICAgY29uc3QgeyB2YWxpZGF0aW9uRXZlbnRzIH0gPSBhZGFwdGl2ZUNhcmQudmFsaWRhdGVQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodmFsaWRhdGlvbkV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzZXRFcnJvcnModmFsaWRhdGlvbkV2ZW50cy5yZWR1Y2UoKGl0ZW1zLCB7IG1lc3NhZ2UgfSkgPT4gWy4uLml0ZW1zLCBuZXcgRXJyb3IobWVzc2FnZSldLCBbXSkpO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50ID0gYWRhcHRpdmVDYXJkLnJlbmRlcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKFtlcnJvcl0pO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbbmV3IEVycm9yKCdBZGFwdGl2ZSBDYXJkIHJlbmRlcmVkIGFzIGVtcHR5IGVsZW1lbnQnKV0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGVycm9ycyBvbiBuZXh0IHJlbmRlclxuICAgIHNldEVycm9ycyhbXSk7XG5cbiAgICByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudCwgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCk7XG5cbiAgICBjdXJyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBGb2N1cyBjYW4gb25seSBiZSByZXN0b3JlZCBhZnRlciB0aGUgRE9NIGlzIGF0dGFjaGVkLlxuICAgIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCwgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQpO1xuXG4gICAgc2V0TGFzdFJlbmRlcihEYXRlLm5vdygpKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVFbGVtZW50SW5kZXhSZWYuY3VycmVudCA9IHNhdmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCk7XG4gICAgICBpbnB1dFZhbHVlc1JlZi5jdXJyZW50ID0gc2F2ZUlucHV0VmFsdWVzKGVsZW1lbnQpO1xuXG4gICAgICBjdXJyZW50LnJlbW92ZUNoaWxkKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG5cbiAgICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXG4gICAgYWRhcHRpdmVDYXJkLFxuICAgIGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnLFxuICAgIGNvbnRlbnRSZWYsXG4gICAgR2xvYmFsU2V0dGluZ3MsXG4gICAgSG9zdENvbmZpZyxcbiAgICByZW5kZXJNYXJrZG93bkFzSFRNTCxcbiAgICBzZXRFcnJvcnMsXG4gICAgdGFwQWN0aW9uXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gU2V0IG9uRXhlY3V0ZUFjdGlvbiB3aXRob3V0IGNhdXNpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVyLlxuICAgIGFkYXB0aXZlQ2FyZC5vbkV4ZWN1dGVBY3Rpb24gPSBkaXNhYmxlZCA/IHVuZGVmaW5lZCA6IGhhbmRsZUV4ZWN1dGVBY3Rpb247XG4gIH0sIFthZGFwdGl2ZUNhcmQsIGRpc2FibGVkLCBoYW5kbGVFeGVjdXRlQWN0aW9uXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpLCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgbGFzdFJlbmRlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gSWYgdGhlIEFkYXB0aXZlIENhcmQgZ2V0IHJlLXJlbmRlcmVkLCByZS1kaXNhYmxlIGVsZW1lbnRzIGFzIG5lZWRlZC5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgZGlzYWJsZWQsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGNoYW5nZWQsIHJlc2V0IGFsbCBhY3Rpb25zIHBlcmZvcm1lZC5cbiAgICBzZXRBY3Rpb25zUGVyZm9ybWVkKFtdKTtcbiAgfSwgW2FkYXB0aXZlQ2FyZF0pO1xuXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PlxuICAgICAgaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgICAgICAgLy8gQWN0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIFwicmVuZGVyZWRFbGVtZW50XCIgbWVhbnMgaXQgaXMgdGhlIEFkYXB0aXZlIENhcmQgaXRzZWxmLCBzdWNoIGFzIFwic2VsZWN0QWN0aW9uXCIgKEFDKSBvciBcInRhcEFjdGlvblwiIChyaWNoIGNhcmRzKS5cbiAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gbWFyayB0aGUgd2hvbGUgY2FyZCBhcyBwZXJmb3JtZWQuXG4gICAgICAgIGFjdGlvbnNQZXJmb3JtZWQubWFwKCh7IHJlbmRlcmVkRWxlbWVudCB9KSA9PiByZW5kZXJlZEVsZW1lbnQpLmZpbHRlcihyZW5kZXJlZEVsZW1lbnQgPT4gcmVuZGVyZWRFbGVtZW50KSxcbiAgICAgICAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lXG4gICAgICApLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsIGxhc3RSZW5kZXJdXG4gICk7XG5cbiAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyAoXG4gICAgbm9kZV9lbnYgPT09ICdkZXZlbG9wbWVudCcgJiYgPEVycm9yQm94IGVycm9yPXtlcnJvcnNbMF19IHR5cGU9e2xvY2FsaXplKCdBREFQVElWRV9DQVJEX0VSUk9SX0JPWF9USVRMRV9SRU5ERVInKX0gLz5cbiAgKSA6IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCArICcnLCAnd2ViY2hhdF9fYWRhcHRpdmUtY2FyZC1yZW5kZXJlcicpfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiBhcyB1bmtub3duIGFzIE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50Pn1cbiAgICAgIG9uS2V5UHJlc3M9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gYXMgdW5rbm93biBhcyBLZXlib2FyZEV2ZW50SGFuZGxlcjxIVE1MRGl2RWxlbWVudD59XG4gICAgICByZWY9e2NvbnRlbnRSZWZ9XG4gICAgLz5cbiAgKTtcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiAnJyxcbiAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgdGFwQWN0aW9uOiB1bmRlZmluZWRcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLnByb3BUeXBlcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhZGFwdGl2ZUNhcmQ6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8vIFR5cGVTY3JpcHQgY2xhc3MgaXMgbm90IG1hcHBhYmxlIHRvIFByb3BUeXBlcy5mdW5jXG4gIC8vIEB0cy1pZ25vcmVcbiAgdGFwQWN0aW9uOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZ1xuICB9KVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWRhcHRpdmVDYXJkUmVuZGVyZXI7XG4iXX0=
|
|
274
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiQWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJhZGFwdGl2ZUNhcmQiLCJkaXNhYmxlZEZyb21Qcm9wcyIsImRpc2FibGVkIiwidGFwQWN0aW9uIiwiYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCIsImFkYXB0aXZlQ2FyZFJlbmRlcmVyIiwiR2xvYmFsU2V0dGluZ3MiLCJIb3N0Q29uZmlnIiwiYWRhcHRpdmVDYXJkc0hvc3RDb25maWciLCJkaXNhYmxlZEZyb21Db21wb3NlciIsImNvbnRlbnRSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsInRhcEFjdGlvblJlZiIsImRpc2FibGVkUmVmIiwiaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyIsImV2ZW50Iiwia2V5IiwidHlwZSIsInRhcmdldCIsImN1cnJlbnQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImNvbnNvbGUiLCJ3YXJuIiwicHJldmVudERlZmF1bHQiLCJ0YWJJbmRleCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJoYW5kbGVFeGVjdXRlQWN0aW9uIiwiYWN0aW9uIiwiYWN0aW9uVHlwZU5hbWUiLCJnZXRKc29uVHlwZU5hbWUiLCJpbWFnZSIsImljb25VcmwiLCJ0aXRsZSIsInZhbHVlIiwidXJsIiwiZGF0YSIsIl9faXNCb3RGcmFtZXdvcmtDYXJkQWN0aW9uIiwiY2FyZEFjdGlvbiIsImVycm9yIiwic2V0VGFiSW5kZXhBdENhcmRSb290IiwiYXBwbHlBY3Rpb25TaG91bGRCZVB1c2hCdXR0b25Nb2QiLCJ1bmRvQWN0aW9uU2hvdWxkQmVQdXNoQnV0dG9uTW9kIiwiYXBwbHlBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QiLCJ1bmRvQWN0aW9uU2V0U2hvdWxkTm90QmVNZW51QmFyTW9kIiwiYXBwbHlBY3RpdmVFbGVtZW50TW9kIiwidW5kb0FjdGl2ZUVsZW1lbnRNb2QiLCJhcHBseURpc2FibGVkTW9kIiwidW5kb0Rpc2FibGVkTW9kIiwiYXBwbHlQZXJzaXN0VmFsdWVzTW9kIiwidW5kb1BlcnNpc3RWYWx1ZXNNb2QiLCJhZGFwdGl2ZUNhcmRzUGFja2FnZSIsImVsZW1lbnQiLCJlcnJvcnMiLCJvbkV4ZWN1dGVBY3Rpb24iLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwibGVuZ3RoIiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiYW55IiwiaXNSZXF1aXJlZCIsImJvb2wiLCJzaGFwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQVlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUExQkE7QUE0QkEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1D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Q0E7QUFDQWpFLEVBQUFBLFNBQVMsRUFBRTZELG1CQUFVSyxLQUFWLENBQWdCO0FBQ3pCbEMsSUFBQUEsS0FBSyxFQUFFNkIsbUJBQVVDLE1BRFE7QUFFekI1QixJQUFBQSxLQUFLLEVBQUUyQixtQkFBVUMsTUFGUTtBQUd6QjdDLElBQUFBLElBQUksRUFBRTRDLG1CQUFVQyxNQUFWLENBQWlCRSxVQUhFO0FBSXpCN0IsSUFBQUEsS0FBSyxFQUFFMEIsbUJBQVVDO0FBSlEsR0FBaEI7QUFQb0IsQ0FBakM7ZUFlZW5FLG9CIiwic291cmNlUm9vdCI6ImJ1bmRsZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDJdIH1dICovXG5cbmltcG9ydCB7IEFjdGlvbiBhcyBBZGFwdGl2ZUNhcmRBY3Rpb24sIEFkYXB0aXZlQ2FyZCwgT3BlblVybEFjdGlvbiwgU3VibWl0QWN0aW9uIH0gZnJvbSAnYWRhcHRpdmVjYXJkcyc7XG5pbXBvcnQgeyBDb21wb25lbnRzLCBnZXRUYWJJbmRleCwgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb21wb25lbnQnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7XG4gIEtleWJvYXJkRXZlbnRIYW5kbGVyLFxuICBNb3VzZUV2ZW50SGFuZGxlcixcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICBWRkNcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBEaXJlY3RMaW5lQ2FyZEFjdGlvbiB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWNvcmUnO1xuXG5pbXBvcnQgeyBCb3RGcmFtZXdvcmtDYXJkQWN0aW9uIH0gZnJvbSAnLi9BZGFwdGl2ZUNhcmRCdWlsZGVyJztcbmltcG9ydCByZW5kZXJBZGFwdGl2ZUNhcmQgZnJvbSAnLi9wcml2YXRlL3JlbmRlckFkYXB0aXZlQ2FyZCc7XG5pbXBvcnQgdXNlQWN0aW9uU2V0U2hvdWxkTm90QmVNZW51QmFyTW9kRWZmZWN0IGZyb20gJy4vQWRhcHRpdmVDYXJkSGFja3MvdXNlQWN0aW9uU2V0U2hvdWxkTm90QmVNZW51QmFyTW9kRWZmZWN0JztcbmltcG9ydCB1c2VBY3Rpb25TaG91bGRCZVB1c2hCdXR0b25Nb2RFZmZlY3QgZnJvbSAnLi9BZGFwdGl2ZUNhcmRIYWNrcy91c2VBY3Rpb25TaG91bGRCZVB1c2hCdXR0b25Nb2RFZmZlY3QnO1xuaW1wb3J0IHVzZUFjdGl2ZUVsZW1lbnRNb2RFZmZlY3QgZnJvbSAnLi9BZGFwdGl2ZUNhcmRIYWNrcy91c2VBY3RpdmVFbGVtZW50TW9kRWZmZWN0JztcbmltcG9ydCB1c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyBmcm9tICcuLi9ob29rcy91c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyc7XG5pbXBvcnQgdXNlQWRhcHRpdmVDYXJkc1BhY2thZ2UgZnJvbSAnLi4vaG9va3MvdXNlQWRhcHRpdmVDYXJkc1BhY2thZ2UnO1xuaW1wb3J0IHVzZURpc2FibGVkTW9kRWZmZWN0IGZyb20gJy4vQWRhcHRpdmVDYXJkSGFja3MvdXNlRGlzYWJsZWRNb2RFZmZlY3QnO1xuaW1wb3J0IHVzZVBlcnNpc3RWYWx1ZXNNb2RFZmZlY3QgZnJvbSAnLi9BZGFwdGl2ZUNhcmRIYWNrcy91c2VQZXJzaXN0VmFsdWVzTW9kRWZmZWN0JztcbmltcG9ydCB1c2VWYWx1ZVJlZiBmcm9tICcuL0FkYXB0aXZlQ2FyZEhhY2tzL3ByaXZhdGUvdXNlVmFsdWVSZWYnO1xuXG5jb25zdCB7IEVycm9yQm94IH0gPSBDb21wb25lbnRzO1xuY29uc3QgeyB1c2VEaXNhYmxlZCwgdXNlTG9jYWxpemVyLCB1c2VQZXJmb3JtQ2FyZEFjdGlvbiwgdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwsIHVzZVNjcm9sbFRvRW5kLCB1c2VTdHlsZVNldCB9ID0gaG9va3M7XG5cbmNvbnN0IG5vZGVfZW52ID0gcHJvY2Vzcy5lbnYubm9kZV9lbnYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlY7XG5cbnR5cGUgQWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nO1xuICBhZGFwdGl2ZUNhcmQ6IEFkYXB0aXZlQ2FyZDtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0YXBBY3Rpb24/OiBEaXJlY3RMaW5lQ2FyZEFjdGlvbjtcbn07XG5cbmNvbnN0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBWRkM8QWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcz4gPSAoe1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsXG4gIGFkYXB0aXZlQ2FyZCxcbiAgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLFxuICB0YXBBY3Rpb25cbn0pID0+IHtcbiAgY29uc3QgW3sgYWRhcHRpdmVDYXJkUmVuZGVyZXI6IGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9XSA9IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlKCk7XG4gIGNvbnN0IFthZGFwdGl2ZUNhcmRzSG9zdENvbmZpZ10gPSB1c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZygpO1xuICBjb25zdCBbZGlzYWJsZWRGcm9tQ29tcG9zZXJdID0gdXNlRGlzYWJsZWQoKTtcbiAgY29uc3QgY29udGVudFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3QgcGVyZm9ybUNhcmRBY3Rpb24gPSB1c2VQZXJmb3JtQ2FyZEFjdGlvbigpO1xuICBjb25zdCByZW5kZXJNYXJrZG93bkFzSFRNTCA9IHVzZVJlbmRlck1hcmtkb3duQXNIVE1MKCk7XG4gIGNvbnN0IHNjcm9sbFRvRW5kID0gdXNlU2Nyb2xsVG9FbmQoKTtcblxuICBjb25zdCBkaXNhYmxlZCA9IGRpc2FibGVkRnJvbUNvbXBvc2VyIHx8IGRpc2FibGVkRnJvbVByb3BzO1xuICBjb25zdCB0YXBBY3Rpb25SZWYgPSB1c2VWYWx1ZVJlZih0YXBBY3Rpb24pO1xuXG4gIGNvbnN0IGRpc2FibGVkUmVmID0gdXNlVmFsdWVSZWYoZGlzYWJsZWQpO1xuXG4gIC8vIFRPRE86IFtQMl0gIzMxOTkgV2Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGBhZGFwdGl2ZUNhcmQuc2VsZWN0QWN0aW9uYCBpbnN0ZWFkLlxuICAvLyBUaGUgbnVsbCBjaGVjayBmb3IgXCJ0YXBBY3Rpb25cIiBpcyBpbiBcImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb25cIi5cbiAgY29uc3QgaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyA9IHVzZUNhbGxiYWNrPEtleWJvYXJkRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50PiB8IE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50Pj4oXG4gICAgKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IGtleSwgdHlwZSB9ID0gZXZlbnQgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcblxuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSB0ZXh0LCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuICAgICAgY29uc3QgYWRhcHRpdmVDYXJkUm9vdCA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmFjLWFkYXB0aXZlQ2FyZFt0YWJpbmRleD1cIjBcIl0nKTtcblxuICAgICAgaWYgKCFhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBObyBBZGFwdGl2ZSBDYXJkIHJvb3QgY29udGFpbmVyIGNhbiBiZSBmb3VuZDsgdGhlIGNhcmQgaXMgcHJvYmFibHkgb24gYW4gdW5zdXBwb3J0ZWQgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFwia2V5cHJlc3NcIiBldmVudCwgd2Ugb25seSBsaXN0ZW4gdG8gRU5URVIgYW5kIFNQQUNFQkFSIGtleS5cbiAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdFbnRlcicgJiYga2V5ICE9PSAnICcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB3aWxsIGNhbGwgcGVyZm9ybUNhcmRBY3Rpb24gaWYgZWl0aGVyOlxuICAgICAgLy8gMS4gV2UgYXJlIG9uIHRoZSB0YXJnZXQsIG9yXG4gICAgICAvLyAyLiBUaGUgZXZlbnQtZGlzcGF0Y2hpbmcgZWxlbWVudCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgIGlmICh0YXJnZXQgIT09IGFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleCh0YXJnZXQpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNsaWNraW5nIG9uIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgY2xpY2thYmxlLCBkbyBub3QgYWxsb3cgdGhlbSB0byBjbGljayB0aGUgY2FyZC5cbiAgICAgICAgLy8gRS5nLiBhIGhlcm8gY2FyZCBjYW4gYmUgdGFwcGFibGUsIGFuZCBpbWFnZSBhbmQgYnV0dG9ucyBpbnNpZGUgdGhlIGhlcm8gY2FyZCBjYW4gYWxzbyBiZSB0YXBwYWJsZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZXJmb3JtQ2FyZEFjdGlvbih0YXBBY3Rpb25SZWYuY3VycmVudCk7XG4gICAgICBzY3JvbGxUb0VuZCgpO1xuICAgIH0sXG4gICAgW2NvbnRlbnRSZWYsIHBlcmZvcm1DYXJkQWN0aW9uLCBzY3JvbGxUb0VuZCwgdGFwQWN0aW9uUmVmXVxuICApO1xuXG4gIC8vIE9ubHkgbGlzdGVuIHRvIGV2ZW50IGlmIGl0IGlzIG5vdCBkaXNhYmxlZCBhbmQgaGF2ZSBcInRhcEFjdGlvblwiIHByb3AuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gPSAhZGlzYWJsZWQgJiYgdGFwQWN0aW9uID8gaGFuZGxlQ2xpY2tBbmRLZXlQcmVzcyA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBoYW5kbGVFeGVjdXRlQWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKGFjdGlvbjogQWRhcHRpdmVDYXJkQWN0aW9uKTogdm9pZCA9PiB7XG4gICAgICAvLyBTb21lIGl0ZW1zLCBlLmcuIHRhcHBhYmxlIGltYWdlLCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgaWYgKGRpc2FibGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3Rpb25UeXBlTmFtZSA9IGFjdGlvbi5nZXRKc29uVHlwZU5hbWUoKTtcbiAgICAgIGNvbnN0IHsgaWNvblVybDogaW1hZ2UsIHRpdGxlIH0gPSBhY3Rpb247XG5cbiAgICAgIC8vIFdlIGNhbm5vdCB1c2UgXCJpbnN0YW5jZW9mXCIgY2hlY2sgaGVyZSwgYmVjYXVzZSB3ZWIgZGV2cyBtYXkgYnJpbmcgdGhlaXIgb3duIHZlcnNpb24gb2YgQWRhcHRpdmUgQ2FyZHMgcGFja2FnZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdXNpbmcgXCJnZXRKc29uVHlwZU5hbWUoKVwiIGluc3RlYWQuXG4gICAgICBpZiAoYWN0aW9uVHlwZU5hbWUgPT09ICdBY3Rpb24uT3BlblVybCcpIHtcbiAgICAgICAgY29uc3QgeyB1cmw6IHZhbHVlIH0gPSBhY3Rpb24gYXMgT3BlblVybEFjdGlvbjtcblxuICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdHlwZTogJ29wZW5VcmwnLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5TdWJtaXQnKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYWN0aW9uIGFzIFN1Ym1pdEFjdGlvbiBhcyB7XG4gICAgICAgICAgZGF0YTogc3RyaW5nIHwgQm90RnJhbWV3b3JrQ2FyZEFjdGlvbjtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbUJhY2snLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLl9faXNCb3RGcmFtZXdvcmtDYXJkQWN0aW9uKSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbihkYXRhLmNhcmRBY3Rpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3Bvc3RCYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNjcm9sbFRvRW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBXZWIgQ2hhdDogcmVjZWl2ZWQgdW5rbm93biBhY3Rpb24gZnJvbSBBZGFwdGl2ZSBDYXJkc2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZGlzYWJsZWRSZWYsIHBlcmZvcm1DYXJkQWN0aW9uLCBzY3JvbGxUb0VuZF1cbiAgKTtcblxuICAvLyBGb3IgYWNjZXNzaWJpbGl0eSBpc3N1ZSAjMTM0MCwgYHRhYmluZGV4PVwiMFwiYCBtdXN0IG5vdCBiZSBzZXQgZm9yIHRoZSByb290IGNvbnRhaW5lciBpZiBpdCBpcyBub3QgaW50ZXJhY3RpdmUuXG4gIGNvbnN0IHNldFRhYkluZGV4QXRDYXJkUm9vdCA9ICEhdGFwQWN0aW9uO1xuXG4gIGNvbnN0IFthcHBseUFjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZCwgdW5kb0FjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZF0gPVxuICAgIHVzZUFjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZEVmZmVjdChhZGFwdGl2ZUNhcmQpO1xuICBjb25zdCBbYXBwbHlBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QsIHVuZG9BY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2RdID1cbiAgICB1c2VBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2RFZmZlY3QoYWRhcHRpdmVDYXJkKTtcbiAgY29uc3QgW2FwcGx5QWN0aXZlRWxlbWVudE1vZCwgdW5kb0FjdGl2ZUVsZW1lbnRNb2RdID0gdXNlQWN0aXZlRWxlbWVudE1vZEVmZmVjdChhZGFwdGl2ZUNhcmQpO1xuICBjb25zdCBbYXBwbHlEaXNhYmxlZE1vZCwgdW5kb0Rpc2FibGVkTW9kXSA9IHVzZURpc2FibGVkTW9kRWZmZWN0KGFkYXB0aXZlQ2FyZCk7XG4gIGNvbnN0IFthcHBseVBlcnNpc3RWYWx1ZXNNb2QsIHVuZG9QZXJzaXN0VmFsdWVzTW9kXSA9IHVzZVBlcnNpc3RWYWx1ZXNNb2RFZmZlY3QoYWRhcHRpdmVDYXJkKTtcblxuICBjb25zdCB7IGVsZW1lbnQsIGVycm9ycyB9OiB7IGVsZW1lbnQ/OiBIVE1MRWxlbWVudDsgZXJyb3JzPzogRXJyb3JbXSB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgdW5kb0FjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZCgpO1xuICAgIHVuZG9BY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QoKTtcbiAgICB1bmRvQWN0aXZlRWxlbWVudE1vZCgpO1xuICAgIHVuZG9EaXNhYmxlZE1vZCgpO1xuICAgIHVuZG9QZXJzaXN0VmFsdWVzTW9kKCk7XG5cbiAgICByZXR1cm4gcmVuZGVyQWRhcHRpdmVDYXJkKGFkYXB0aXZlQ2FyZCwge1xuICAgICAgYWRhcHRpdmVDYXJkc0hvc3RDb25maWcsXG4gICAgICBhZGFwdGl2ZUNhcmRzUGFja2FnZTogeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9LFxuICAgICAgcmVuZGVyTWFya2Rvd25Bc0hUTUwsXG4gICAgICBzZXRUYWJJbmRleEF0Q2FyZFJvb3RcbiAgICB9KTtcbiAgfSwgW1xuICAgIGFkYXB0aXZlQ2FyZCxcbiAgICBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyxcbiAgICBHbG9iYWxTZXR0aW5ncyxcbiAgICBIb3N0Q29uZmlnLFxuICAgIHJlbmRlck1hcmtkb3duQXNIVE1MLFxuICAgIHNldFRhYkluZGV4QXRDYXJkUm9vdCxcbiAgICB1bmRvQWN0aW9uU2hvdWxkQmVQdXNoQnV0dG9uTW9kLFxuICAgIHVuZG9BY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QsXG4gICAgdW5kb0FjdGl2ZUVsZW1lbnRNb2QsXG4gICAgdW5kb0Rpc2FibGVkTW9kLFxuICAgIHVuZG9QZXJzaXN0VmFsdWVzTW9kXG4gIF0pO1xuXG4gIHVzZU1lbW8oKCkgPT4ge1xuICAgIGFkYXB0aXZlQ2FyZC5vbkV4ZWN1dGVBY3Rpb24gPSBoYW5kbGVFeGVjdXRlQWN0aW9uO1xuICB9LCBbYWRhcHRpdmVDYXJkLCBoYW5kbGVFeGVjdXRlQWN0aW9uXSk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG5cbiAgICBjdXJyZW50Py5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjdXJyZW50Py5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB9O1xuICB9LCBbY29udGVudFJlZiwgZWxlbWVudF0pO1xuXG4gIC8vIEFwcGx5IGFsbCBtb2RzIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgZWxlbWVudCBjaGFuZ2VkIG9yIG5vdC5cbiAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGhhdmUgdW5kb2VkIG1vZHMgd2hlbiB3ZSBjYWxsIHRoZSBgdXNlWFhYTW9kRWZmZWN0YCBob29rLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGFwcGx5QWN0aW9uU2hvdWxkQmVQdXNoQnV0dG9uTW9kKGVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSk7XG4gICAgYXBwbHlBY3Rpb25TZXRTaG91bGROb3RCZU1lbnVCYXJNb2QoZWxlbWVudCk7XG4gICAgYXBwbHlBY3RpdmVFbGVtZW50TW9kKGVsZW1lbnQpO1xuICAgIGFwcGx5RGlzYWJsZWRNb2QoZWxlbWVudCwgZGlzYWJsZWQpO1xuICAgIGFwcGx5UGVyc2lzdFZhbHVlc01vZChlbGVtZW50KTtcbiAgfSwgW1xuICAgIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSxcbiAgICBhcHBseUFjdGlvblNob3VsZEJlUHVzaEJ1dHRvbk1vZCxcbiAgICBhcHBseUFjdGlvblNldFNob3VsZE5vdEJlTWVudUJhck1vZCxcbiAgICBhcHBseUFjdGl2ZUVsZW1lbnRNb2QsXG4gICAgYXBwbHlEaXNhYmxlZE1vZCxcbiAgICBhcHBseVBlcnNpc3RWYWx1ZXNNb2QsXG4gICAgZGlzYWJsZWQsXG4gICAgZWxlbWVudFxuICBdKTtcblxuICByZXR1cm4gZXJyb3JzPy5sZW5ndGggPyAoXG4gICAgbm9kZV9lbnYgPT09ICdkZXZlbG9wbWVudCcgJiYgPEVycm9yQm94IGVycm9yPXtlcnJvcnNbMF19IHR5cGU9e2xvY2FsaXplKCdBREFQVElWRV9DQVJEX0VSUk9SX0JPWF9USVRMRV9SRU5ERVInKX0gLz5cbiAgKSA6IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCArICcnLCAnd2ViY2hhdF9fYWRhcHRpdmUtY2FyZC1yZW5kZXJlcicpfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiBhcyBNb3VzZUV2ZW50SGFuZGxlcjxIVE1MRGl2RWxlbWVudD59XG4gICAgICBvbktleVByZXNzPXtoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uIGFzIEtleWJvYXJkRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50Pn1cbiAgICAgIHJlZj17Y29udGVudFJlZn1cbiAgICAvPlxuICApO1xufTtcblxuQWRhcHRpdmVDYXJkUmVuZGVyZXIuZGVmYXVsdFByb3BzID0ge1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWU6ICcnLFxuICBkaXNhYmxlZDogdW5kZWZpbmVkLFxuICB0YXBBY3Rpb246IHVuZGVmaW5lZFxufTtcblxuQWRhcHRpdmVDYXJkUmVuZGVyZXIucHJvcFR5cGVzID0ge1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFkYXB0aXZlQ2FyZDogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLy8gVHlwZVNjcmlwdCBjbGFzcyBpcyBub3QgbWFwcGFibGUgdG8gUHJvcFR5cGVzLmZ1bmNcbiAgLy8gQHRzLWlnbm9yZVxuICB0YXBBY3Rpb246IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgaW1hZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nXG4gIH0pXG59O1xuXG5leHBvcnQgZGVmYXVsdCBBZGFwdGl2ZUNhcmRSZW5kZXJlcjtcbiJdfQ==
|