@sapui5/sap.fe.templates 1.141.1 → 1.142.0
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/package.json +1 -1
- package/src/sap/fe/templates/.library +1 -1
- package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
- package/src/sap/fe/templates/ListReport/ExtensionAPI.js +1 -1
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +1 -1
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +10 -12
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +95 -60
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +92 -53
- package/src/sap/fe/templates/ListReport/manifest.json +1 -1
- package/src/sap/fe/templates/ListReport/overrides/MessageHandler.js +25 -0
- package/src/sap/fe/templates/ListReport/overrides/MessageHandler.ts +20 -0
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +180 -13
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +209 -13
- package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +4 -0
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +136 -24
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +178 -26
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +3 -2
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +2 -1
- package/src/sap/fe/templates/ObjectPage/manifest.json +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +7 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +2 -2
- package/src/sap/fe/templates/library.js +1 -1
- package/src/sap/fe/templates/messagebundle.properties +8 -7
- package/src/sap/fe/templates/messagebundle_ar.properties +5 -5
- package/src/sap/fe/templates/messagebundle_bg.properties +6 -6
- package/src/sap/fe/templates/messagebundle_ca.properties +4 -4
- package/src/sap/fe/templates/messagebundle_cnr.properties +5 -5
- package/src/sap/fe/templates/messagebundle_cs.properties +6 -6
- package/src/sap/fe/templates/messagebundle_cy.properties +5 -5
- package/src/sap/fe/templates/messagebundle_da.properties +6 -6
- package/src/sap/fe/templates/messagebundle_de.properties +7 -7
- package/src/sap/fe/templates/messagebundle_el.properties +5 -5
- package/src/sap/fe/templates/messagebundle_en.properties +6 -6
- package/src/sap/fe/templates/messagebundle_en_GB.properties +6 -6
- package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +3 -3
- package/src/sap/fe/templates/messagebundle_es.properties +4 -4
- package/src/sap/fe/templates/messagebundle_es_MX.properties +4 -4
- package/src/sap/fe/templates/messagebundle_et.properties +4 -4
- package/src/sap/fe/templates/messagebundle_fi.properties +4 -4
- package/src/sap/fe/templates/messagebundle_fr.properties +4 -4
- package/src/sap/fe/templates/messagebundle_fr_CA.properties +5 -5
- package/src/sap/fe/templates/messagebundle_hi.properties +6 -6
- package/src/sap/fe/templates/messagebundle_hr.properties +4 -4
- package/src/sap/fe/templates/messagebundle_hu.properties +6 -6
- package/src/sap/fe/templates/messagebundle_id.properties +7 -7
- package/src/sap/fe/templates/messagebundle_it.properties +4 -4
- package/src/sap/fe/templates/messagebundle_iw.properties +6 -6
- package/src/sap/fe/templates/messagebundle_ja.properties +4 -4
- package/src/sap/fe/templates/messagebundle_kk.properties +4 -4
- package/src/sap/fe/templates/messagebundle_ko.properties +4 -4
- package/src/sap/fe/templates/messagebundle_lt.properties +4 -4
- package/src/sap/fe/templates/messagebundle_lv.properties +6 -6
- package/src/sap/fe/templates/messagebundle_mk.properties +4 -4
- package/src/sap/fe/templates/messagebundle_ms.properties +5 -5
- package/src/sap/fe/templates/messagebundle_nl.properties +4 -4
- package/src/sap/fe/templates/messagebundle_no.properties +4 -4
- package/src/sap/fe/templates/messagebundle_pl.properties +4 -4
- package/src/sap/fe/templates/messagebundle_pt.properties +5 -5
- package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -6
- package/src/sap/fe/templates/messagebundle_ro.properties +4 -4
- package/src/sap/fe/templates/messagebundle_ru.properties +4 -4
- package/src/sap/fe/templates/messagebundle_sh.properties +5 -5
- package/src/sap/fe/templates/messagebundle_sk.properties +4 -4
- package/src/sap/fe/templates/messagebundle_sl.properties +6 -6
- package/src/sap/fe/templates/messagebundle_sr.properties +5 -5
- package/src/sap/fe/templates/messagebundle_sv.properties +4 -4
- package/src/sap/fe/templates/messagebundle_th.properties +4 -4
- package/src/sap/fe/templates/messagebundle_tr.properties +4 -4
- package/src/sap/fe/templates/messagebundle_uk.properties +4 -4
- package/src/sap/fe/templates/messagebundle_vi.properties +6 -6
- package/src/sap/fe/templates/messagebundle_zh_CN.properties +4 -4
- package/src/sap/fe/templates/messagebundle_zh_TW.properties +4 -4
- package/src/sap/fe/templates/types/sap.fe.templates-auto-ext.d.js +10 -0
- package/src/sap/fe/templates/types/sap.fe.templates-auto-ext.d.ts +49 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2025 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/ExtensionAPI", "sap/fe/core/converters/helpers/ID", "sap/fe/core/helpers/RecommendationHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/ui/core/InvisibleMessage", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType"], function (Log, ClassSupport, CommonUtils, ExtensionAPI, ID, RecommendationHelper, ResourceModelHelper, InvisibleMessage, library, Message, MessageType) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/ExtensionAPI", "sap/fe/core/converters/helpers/ID", "sap/fe/core/helpers/RecommendationHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/m/Link", "sap/m/MessageItem", "sap/m/MessagePopover", "sap/m/MessageStrip", "sap/ui/core/InvisibleMessage", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType"], function (Log, uid, ClassSupport, CommonUtils, ExtensionAPI, ID, RecommendationHelper, ResourceModelHelper, Link, MessageItem, MessagePopover, MessageStrip, InvisibleMessage, library, Message, MessageType) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _dec, _class;
|
|
@@ -27,11 +27,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
27
27
|
}
|
|
28
28
|
_inheritsLoose(ObjectPageExtensionAPI, _ExtensionAPI);
|
|
29
29
|
var _proto = ObjectPageExtensionAPI.prototype;
|
|
30
|
+
/**
|
|
31
|
+
* ID of the active custom MessageStrip for programmatic removal.
|
|
32
|
+
*/
|
|
30
33
|
/**
|
|
31
34
|
* Refreshes either the whole object page or only parts of it.
|
|
32
35
|
* @param [vPath] Path or array of paths referring to entities or properties to be refreshed.
|
|
33
36
|
* If omitted, the whole object page is refreshed. The path "" refreshes the entity assigned to the object page
|
|
34
|
-
* without
|
|
37
|
+
* without navigation.
|
|
35
38
|
* @returns Resolved once the data is refreshed or rejected if the request failed
|
|
36
39
|
* @public
|
|
37
40
|
*/
|
|
@@ -128,22 +131,152 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
128
131
|
}
|
|
129
132
|
|
|
130
133
|
/**
|
|
131
|
-
* Displays the message strip between the title and the header of the ObjectPage.
|
|
132
|
-
*
|
|
134
|
+
* Displays the message strip between the title and the header of the ObjectPage. If only one message is provided, it is displayed directly in the message strip. If multiple messages are provided, they are prioritized by the order: Error, Warning, and Information and a corresponding generic text is displayed:
|
|
135
|
+
* - Error: "The object contains errors."
|
|
136
|
+
* - Warning: "The object contains warnings."
|
|
137
|
+
* - Information: "The object contains messages."
|
|
138
|
+
* If a back-end message is received with a target pointing to the Object Page, it is displayed in the message strip, overriding any existing message or message strip. If multiple back-end messages are received, the message with the highest priority is displayed with a generic text as described above.
|
|
139
|
+
* @param messagesOrStrip The message to be displayed or a MessageStrip control
|
|
133
140
|
* @public
|
|
134
141
|
*/;
|
|
135
|
-
_proto.showMessages = function showMessages(
|
|
136
|
-
|
|
142
|
+
_proto.showMessages = function showMessages(messagesOrStrip) {
|
|
143
|
+
if (Array.isArray(messagesOrStrip)) {
|
|
144
|
+
this._showMessages(messagesOrStrip);
|
|
145
|
+
} else if (messagesOrStrip.isA("sap.m.MessageStrip")) {
|
|
146
|
+
this.showCustomMessageStrip(messagesOrStrip);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Shows a custom MessageStrip control provided by the application.
|
|
152
|
+
* Ensures mutual exclusivity with the MessageStrip rendered by the object page view.
|
|
153
|
+
* @param messageStrip MessageStrip control
|
|
154
|
+
* @private
|
|
155
|
+
*/;
|
|
156
|
+
_proto.showCustomMessageStrip = function showCustomMessageStrip(messageStrip) {
|
|
157
|
+
const messageStripInternalModelContext = this._view.getModel("internal").bindContext(this._getMessageStripBindingContextPath()).getBoundContext();
|
|
158
|
+
if (!messageStripInternalModelContext) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
this.removeCustomMessageStrip(); // Remove any existing custom message strip before adding new one
|
|
162
|
+
|
|
163
|
+
// Hide framework generated message strip to ensure mutual exclusivity
|
|
164
|
+
messageStripInternalModelContext.setProperty("OPBackendMessageVisible", false);
|
|
165
|
+
messageStripInternalModelContext.setProperty("OPCustomMessageVisible", false);
|
|
166
|
+
this.customMessageStripId = messageStrip.getId() || uid(); // Store reference for programmatic removal
|
|
167
|
+
|
|
168
|
+
messageStrip.addStyleClass("sapUiSmallMarginTop");
|
|
169
|
+
this.addCustomMessageStripToPage(messageStrip, messageStripInternalModelContext);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Adds a custom MessageStrip to the page layout in the header container such as in expanded and snapped content.
|
|
174
|
+
* @param messageStrip The MessageStrip control to add
|
|
175
|
+
* @param messagestripInternalModelContext
|
|
176
|
+
*/;
|
|
177
|
+
_proto.addCustomMessageStripToPage = function addCustomMessageStripToPage(messageStrip, messagestripInternalModelContext) {
|
|
178
|
+
const headerContainer = this._view.byId("fe::ObjectPageDynamicHeaderTitle");
|
|
179
|
+
if (headerContainer) {
|
|
180
|
+
const insertIntoAggregation = (aggregationName, controlToInsert) => {
|
|
181
|
+
const aggregationContent = headerContainer.getAggregation(aggregationName);
|
|
182
|
+
if (aggregationContent) {
|
|
183
|
+
const contentArray = Array.isArray(aggregationContent) ? aggregationContent : [aggregationContent];
|
|
184
|
+
headerContainer.insertAggregation(aggregationName, controlToInsert, contentArray.length);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
insertIntoAggregation("expandedContent", messageStrip);
|
|
188
|
+
insertIntoAggregation("snappedContent", messageStrip.clone());
|
|
189
|
+
messagestripInternalModelContext.setProperty("OPCustomMessageStripVisible", true);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Removes the active custom MessageStrip programmatically.
|
|
195
|
+
*/;
|
|
196
|
+
_proto.removeCustomMessageStrip = function removeCustomMessageStrip() {
|
|
197
|
+
if (!this.customMessageStripId) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Find and remove the custom message strip from header container
|
|
202
|
+
const headerContainer = this._view.byId("fe::ObjectPageDynamicHeaderTitle");
|
|
203
|
+
if (headerContainer) {
|
|
204
|
+
const removeFromAggregation = (aggregationName, idMatcher) => {
|
|
205
|
+
const aggregationContent = headerContainer.getAggregation(aggregationName);
|
|
206
|
+
if (aggregationContent) {
|
|
207
|
+
const controlToRemove = aggregationContent.find(control => idMatcher(control.getId()));
|
|
208
|
+
if (controlToRemove) {
|
|
209
|
+
headerContainer.removeAggregation(aggregationName, controlToRemove);
|
|
210
|
+
controlToRemove.destroy();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
removeFromAggregation("expandedContent", controlId => controlId === this.customMessageStripId);
|
|
215
|
+
removeFromAggregation("snappedContent", controlId => controlId.includes(this.customMessageStripId + "-__clone"));
|
|
216
|
+
}
|
|
217
|
+
this.customMessageStripId = undefined;
|
|
218
|
+
const messagestripInternalModelContext = this._view.getModel("internal").bindContext(this._getMessageStripBindingContextPath()).getBoundContext();
|
|
219
|
+
if (messagestripInternalModelContext) {
|
|
220
|
+
messagestripInternalModelContext.setProperty("OPCustomMessageStripVisible", false);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Creates a MessageItem from a Message instance.
|
|
226
|
+
* @param message The message object containing text, type, description, etc.
|
|
227
|
+
* @returns The created MessageItem instance for the MessagePopover.
|
|
228
|
+
*/;
|
|
229
|
+
_proto.createMessageItem = function createMessageItem(message) {
|
|
230
|
+
const sDescriptionUrl = message.getDescriptionUrl?.();
|
|
231
|
+
return new MessageItem({
|
|
232
|
+
title: message.getMessage(),
|
|
233
|
+
description: message.getDescription(),
|
|
234
|
+
type: message.getType(),
|
|
235
|
+
longtextUrl: sDescriptionUrl,
|
|
236
|
+
subtitle: message.getAdditionalText?.(),
|
|
237
|
+
groupName: "T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_GENERAL",
|
|
238
|
+
activeTitle: !!message.getControlIds?.().length
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Creates a MessagePopover for a set of MessageItems and attaches
|
|
244
|
+
* an async description handler to load long text when needed.
|
|
245
|
+
* @param messageItems Array of MessageItems to be displayed in the popover.
|
|
246
|
+
* @returns The created MessagePopover instance.
|
|
247
|
+
*/;
|
|
248
|
+
_proto.createMessagePopover = function createMessagePopover(messageItems) {
|
|
249
|
+
const popover = new MessagePopover({
|
|
250
|
+
items: messageItems
|
|
251
|
+
});
|
|
252
|
+
return popover;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Opens a MessagePopover for the provided messages, anchored to the
|
|
257
|
+
* source control of the UI5 event.
|
|
258
|
+
* @param event The UI5 event from the control that triggers the popover.
|
|
259
|
+
* @param message Array of Message objects to be shown in the popover.
|
|
260
|
+
* @returns The MessagePopover that was opened.
|
|
261
|
+
*/;
|
|
262
|
+
_proto.showMessagePopover = function showMessagePopover(event, message) {
|
|
263
|
+
const messageItem = this.createMessageItem(message[0]);
|
|
264
|
+
const popover = this.createMessagePopover(messageItem);
|
|
265
|
+
const sourceControl = event.getSource?.();
|
|
266
|
+
sourceControl?.addDependent(popover);
|
|
267
|
+
popover.openBy(sourceControl);
|
|
268
|
+
return popover;
|
|
137
269
|
}
|
|
138
270
|
|
|
139
271
|
/**
|
|
140
272
|
* Displays the message strip between the title and the header of the ObjectPage.
|
|
141
273
|
* @param messages The message to be displayed
|
|
142
|
-
* @param origin The origin of the message
|
|
274
|
+
* @param origin The origin of the message. It may come from a back-end message or a custom message
|
|
143
275
|
*/;
|
|
144
276
|
_proto._showMessages = function _showMessages(messages) {
|
|
145
277
|
let origin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "Custom";
|
|
146
278
|
try {
|
|
279
|
+
this.removeCustomMessageStrip();
|
|
147
280
|
const view = this._view;
|
|
148
281
|
const internalModel = view.getModel("internal");
|
|
149
282
|
const messagestripInternalModelContext = internalModel.bindContext(this._getMessageStripBindingContextPath()).getBoundContext();
|
|
@@ -151,14 +284,48 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
151
284
|
return;
|
|
152
285
|
}
|
|
153
286
|
const resourceModel = ResourceModelHelper.getResourceModel(view);
|
|
154
|
-
let message = null;
|
|
287
|
+
let message = messages[0] || null;
|
|
155
288
|
messagestripInternalModelContext.setProperty(`OP${origin}MessageVisible`, !!message);
|
|
156
289
|
switch (messages.length) {
|
|
157
290
|
case 0:
|
|
158
291
|
break;
|
|
159
292
|
case 1:
|
|
160
293
|
message = messages[0];
|
|
161
|
-
|
|
294
|
+
const hasDescriptionUrl = !!message?.getDescriptionUrl();
|
|
295
|
+
const isEditMode = CommonUtils.getIsEditable(view);
|
|
296
|
+
try {
|
|
297
|
+
const objectPage = view.getContent()?.[0];
|
|
298
|
+
const headerTitle = objectPage.getHeaderTitle();
|
|
299
|
+
|
|
300
|
+
// Collect all MessageStrips (excluding Collaboration Strips)
|
|
301
|
+
const allStrips = [...(headerTitle.getSnappedContent?.() || []), ...(headerTitle.getExpandedContent?.() || [])].filter(item => item instanceof MessageStrip && !item.getId()?.includes("CollaborationStrip"));
|
|
302
|
+
|
|
303
|
+
// Only add links when message is from Backend, in Display mode, and has a description URL
|
|
304
|
+
if (origin === "Backend" && !isEditMode && hasDescriptionUrl) {
|
|
305
|
+
allStrips.forEach(strip => {
|
|
306
|
+
// Always destroy the existing link before creating a new one
|
|
307
|
+
if (strip.getLink()) {
|
|
308
|
+
strip.destroyLink();
|
|
309
|
+
}
|
|
310
|
+
const link = new Link({
|
|
311
|
+
text: resourceModel.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGE_STRIP_LINK_TEXT"),
|
|
312
|
+
press: event => {
|
|
313
|
+
this.showMessagePopover(event, [message]);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
strip.setLink(link);
|
|
317
|
+
});
|
|
318
|
+
} else {
|
|
319
|
+
// Remove links when not applicable
|
|
320
|
+
allStrips.forEach(strip => {
|
|
321
|
+
if (strip.getLink()) {
|
|
322
|
+
strip.destroyLink();
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
} catch (err) {
|
|
327
|
+
Log.warning("Unable to attach link to ObjectPage MessageStrip", err);
|
|
328
|
+
}
|
|
162
329
|
break;
|
|
163
330
|
default:
|
|
164
331
|
const messageStats = {
|
|
@@ -211,13 +378,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
211
378
|
* @public
|
|
212
379
|
*/;
|
|
213
380
|
_proto.hideMessage = function hideMessage() {
|
|
214
|
-
const
|
|
215
|
-
const messagestripInternalModelContext = internalModel.bindContext(this._getMessageStripBindingContextPath()).getBoundContext();
|
|
381
|
+
const messagestripInternalModelContext = this._view.getModel("internal").bindContext(this._getMessageStripBindingContextPath()).getBoundContext();
|
|
216
382
|
messagestripInternalModelContext.setProperty(`OPCustomMessageVisible`, false);
|
|
383
|
+
this.removeCustomMessageStrip();
|
|
217
384
|
}
|
|
218
385
|
|
|
219
386
|
/**
|
|
220
|
-
* This function will take the recommendation data details, transform it and update internal model
|
|
387
|
+
* This function will take the recommendation data details, transform it, and update the internal model.
|
|
221
388
|
* @param data Recommendation data for the app
|
|
222
389
|
*/;
|
|
223
390
|
_proto.setRecommendations = function setRecommendations(data) {
|
|
@@ -267,4 +434,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
267
434
|
}(ExtensionAPI)) || _class);
|
|
268
435
|
return ObjectPageExtensionAPI;
|
|
269
436
|
}, false);
|
|
270
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2NsYXNzIiwiX0V4dGVuc2lvbkFQSSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJyZWZyZXNoIiwidlBhdGgiLCJvQmluZGluZ0NvbnRleHQiLCJfdmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1NpZGVFZmZlY3RzIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwidW5kZWZpbmVkIiwicHVzaCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiYWxsUGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJvd25lckNvbXBvbmVudCIsIl9jb250cm9sbGVyIiwiZ2V0T3duZXJDb21wb25lbnQiLCJjb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiZ2V0RW50aXR5U2V0IiwicGF0aCIsImtpbmQiLCJnZXRPYmplY3QiLCJyZWplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwic1RhYmxlSWQiLCJ0YWJsZSIsImJ5SWQiLCJpc0EiLCJnZXRQYXJlbnQiLCJzaG93U2lkZUNvbnRlbnQiLCJzU3ViU2VjdGlvbktleSIsImJTaG93Iiwic0Jsb2NrSUQiLCJnZXRTaWRlQ29udGVudExheW91dElEIiwib0Jsb2NrIiwiYkJsb2NrU3RhdGUiLCJnZXRTaG93U2lkZUNvbnRlbnQiLCJzZXRTaG93U2lkZUNvbnRlbnQiLCJfZ2V0TWVzc2FnZVN0cmlwQmluZGluZ0NvbnRleHRQYXRoIiwiaW50ZXJuYWxNb2RlbENvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInZpZXdDb250ZXh0UGF0aCIsInJlcGxhY2UiLCJzaG93TWVzc2FnZXMiLCJtZXNzYWdlcyIsIl9zaG93TWVzc2FnZXMiLCJvcmlnaW4iLCJsZW5ndGgiLCJ2aWV3IiwiaW50ZXJuYWxNb2RlbCIsIm1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyZXNvdXJjZU1vZGVsIiwiUmVzb3VyY2VNb2RlbEhlbHBlciIsImdldFJlc291cmNlTW9kZWwiLCJtZXNzYWdlIiwic2V0UHJvcGVydHkiLCJtZXNzYWdlU3RhdHMiLCJFcnJvciIsImlkIiwiY291bnQiLCJXYXJuaW5nIiwiSW5mb3JtYXRpb24iLCJyZWR1Y2UiLCJhY2MiLCJjdXJyZW50VmFsdWUiLCJjdXJyZW50VHlwZSIsImdldFR5cGUiLCJzZXRUeXBlIiwiTWVzc2FnZSIsInR5cGUiLCJNZXNzYWdlVHlwZSIsImdldElzRWRpdGFibGUiLCJzZXRNZXNzYWdlIiwiZ2V0VGV4dCIsImdldE1lc3NhZ2UiLCJJbnZpc2libGVNZXNzYWdlIiwiZ2V0SW5zdGFuY2UiLCJhbm5vdW5jZSIsIkludmlzaWJsZU1lc3NhZ2VNb2RlIiwiQXNzZXJ0aXZlIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJoaWRlTWVzc2FnZSIsInNldFJlY29tbWVuZGF0aW9ucyIsImRhdGEiLCJyZWNvbW1lbmRhdGlvbkhlbHBlciIsInRyYW5zZm9ybVJlY29tbWVuZGF0aW9uc0ZvckludGVybmFsU3RvcmFnZSIsInNldEFzU2VjdGlvblRpdGxlT3duZXIiLCJjb250cm9sIiwic2VjdGlvbiIsIm9yaWdpbmFsQ29udHJvbCIsInJldXNlQ29tcG9uZW50IiwiY29udGFpbmVyIiwiY29udHJvbFBhcmVudCIsImdldFZpc2libGVTdWJTZWN0aW9ucyIsImFkanVzdEZvclNpbmdsZUNvbnRlbnQiLCJtdWx0aXBsZVN1YlNlY3Rpb25zV2l0aFJldXNlQ29tcG9uZW50IiwiRXh0ZW5zaW9uQVBJIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFeHRlbnNpb25BUEkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS9jb3JlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHR5cGUgUmV1c2VDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1JldXNlQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBnZXRTaWRlQ29udGVudExheW91dElEIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9JRFwiO1xuaW1wb3J0IHR5cGUgeyBJbkNvbXBsZXRlbmVzc0luZm9UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB7IHJlY29tbWVuZGF0aW9uSGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIFNlY3Rpb24gZnJvbSBcInNhcC9mZS9tYWNyb3MvY29udHJvbHMvU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBJbnZpc2libGVNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVNZXNzYWdlXCI7XG5pbXBvcnQgeyBJbnZpc2libGVNZXNzYWdlTW9kZSB9IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIER5bmFtaWNTaWRlQ29udGVudCBmcm9tIFwic2FwL3VpL2xheW91dC9EeW5hbWljU2lkZUNvbnRlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9tZGMvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcblxuLyoqXG4gKiBFeHRlbnNpb24gQVBJIGZvciBvYmplY3QgcGFnZXMgb24gU0FQIEZpb3JpIGVsZW1lbnRzIGZvciBPRGF0YSBWNC5cbiAqXG4gKiBUbyBjb3JyZWN0bHkgaW50ZWdyYXRlIHlvdXIgYXBwIGV4dGVuc2lvbiBjb2Rpbmcgd2l0aCBTQVAgRmlvcmkgZWxlbWVudHMsIHVzZSBvbmx5IHRoZSBleHRlbnNpb25BUEkgb2YgU0FQIEZpb3JpIGVsZW1lbnRzLiBEb24ndCBhY2Nlc3Mgb3IgbWFuaXB1bGF0ZSBjb250cm9scywgcHJvcGVydGllcywgbW9kZWxzLCBvciBvdGhlciBpbnRlcm5hbCBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlIFNBUCBGaW9yaSBlbGVtZW50cyBmcmFtZXdvcmsuXG4gKiBAcHVibGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAZmluYWxcbiAqIEBzaW5jZSAxLjc5LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSVwiKVxuY2xhc3MgT2JqZWN0UGFnZUV4dGVuc2lvbkFQSSBleHRlbmRzIEV4dGVuc2lvbkFQSSB7XG5cdC8qKlxuXHQgKiBSZWZyZXNoZXMgZWl0aGVyIHRoZSB3aG9sZSBvYmplY3QgcGFnZSBvciBvbmx5IHBhcnRzIG9mIGl0LlxuXHQgKiBAcGFyYW0gW3ZQYXRoXSBQYXRoIG9yIGFycmF5IG9mIHBhdGhzIHJlZmVycmluZyB0byBlbnRpdGllcyBvciBwcm9wZXJ0aWVzIHRvIGJlIHJlZnJlc2hlZC5cblx0ICogSWYgb21pdHRlZCwgdGhlIHdob2xlIG9iamVjdCBwYWdlIGlzIHJlZnJlc2hlZC4gVGhlIHBhdGggXCJcIiByZWZyZXNoZXMgdGhlIGVudGl0eSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogd2l0aG91dCBuYXZpZ2F0aW9uc1xuXHQgKiBAcmV0dXJucyBSZXNvbHZlZCBvbmNlIHRoZSBkYXRhIGlzIHJlZnJlc2hlZCBvciByZWplY3RlZCBpZiB0aGUgcmVxdWVzdCBmYWlsZWRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0YXN5bmMgcmVmcmVzaCh2UGF0aD86IHN0cmluZyB8IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5fdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmICghb0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHQvLyBub3RoaW5nIHRvIGJlIHJlZnJlc2hlZCAtIGRvIG5vdCBibG9jayB0aGUgYXBwIVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX3ZpZXcpLFxuXHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0XHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHRcdHRhcmdldEVudGl0aWVzOiBbXVxuXHRcdFx0fTtcblxuXHRcdGlmICh2UGF0aCA9PT0gdW5kZWZpbmVkIHx8IHZQYXRoID09PSBudWxsKSB7XG5cdFx0XHQvLyB3ZSBqdXN0IGFkZCBhbiBlbXB0eSBwYXRoIHdoaWNoIHNob3VsZCByZWZyZXNoIHRoZSBwYWdlIHdpdGggYWxsIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIlxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGFsbFBhdGhzID0gQXJyYXkuaXNBcnJheSh2UGF0aCkgPyB2UGF0aCA6IFt2UGF0aF07XG5cdFx0XHRjb25zdCBvd25lckNvbXBvbmVudCA9IHRoaXMuX2NvbnRyb2xsZXIuZ2V0T3duZXJDb21wb25lbnQoKSBhcyB1bmtub3duIGFzIHtcblx0XHRcdFx0Z2V0Q29udGV4dFBhdGg6ICgpID0+IHN0cmluZztcblx0XHRcdFx0Z2V0RW50aXR5U2V0OiAoKSA9PiBzdHJpbmc7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSBvd25lckNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpIHx8IGAvJHtvd25lckNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKX1gO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHBhdGggb2YgYWxsUGF0aHMpIHtcblx0XHRcdFx0aWYgKHBhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0XHQvLyBhbiBlbXB0eSBwYXRoIHNoYWxsIHJlZnJlc2ggdGhlIGVudGl0eSB3aXRob3V0IGRlcGVuZGVuY2llcyB3aGljaCBtZWFucyAqIGZvciB0aGUgbW9kZWxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5wdXNoKFwiKlwiKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBraW5kID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7Y29udGV4dFBhdGh9LyR7cGF0aH0vJGtpbmRgKTtcblxuXHRcdFx0XHRcdGlmIChraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBwYXRoXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGtpbmQpIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2gocGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBwYXRoIHRvIGJlIHJlZnJlc2hlZGApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoWy4uLm9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcywgLi4ub1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXNdLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGxpc3QgZW50cmllcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIHRoZSB0YWJsZS5cblx0ICogQHBhcmFtIHNUYWJsZUlkIFRoZSBJRCBpZGVudGlmeWluZyB0aGUgdGFibGUgdGhlIHNlbGVjdGVkIGNvbnRleHQgaXMgcmVxdWVzdGVkIGZvclxuXHQgKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0c1xuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRnZXRTZWxlY3RlZENvbnRleHRzKHNUYWJsZUlkOiBzdHJpbmcpOiBPRGF0YVY0Q29udGV4dFtdIHtcblx0XHRsZXQgdGFibGUgPSB0aGlzLl92aWV3LmJ5SWQoc1RhYmxlSWQpO1xuXHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRhYmxlID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0fVxuXHRcdGlmICh0YWJsZT8uaXNBKFwic2FwLmZlLm1hY3Jvcy50YWJsZS5UYWJsZUFQSVwiKSkge1xuXHRcdFx0cmV0dXJuICh0YWJsZSBhcyBUYWJsZUFQSSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpO1xuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGxheXMgb3IgaGlkZXMgdGhlIHNpZGUgY29udGVudCBvZiBhbiBvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHNTdWJTZWN0aW9uS2V5IEtleSBvZiB0aGUgc2lkZSBjb250ZW50IGZyYWdtZW50IGFzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0Lmpzb25cblx0ICogQHBhcmFtIFtiU2hvd10gT3B0aW9uYWwgQm9vbGVhbiBmbGFnIHRvIHNob3cgb3IgaGlkZSB0aGUgc2lkZSBjb250ZW50XG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHNob3dTaWRlQ29udGVudChzU3ViU2VjdGlvbktleTogc3RyaW5nLCBiU2hvdz86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBzQmxvY2tJRCA9IGdldFNpZGVDb250ZW50TGF5b3V0SUQoc1N1YlNlY3Rpb25LZXkpLFxuXHRcdFx0b0Jsb2NrID0gdGhpcy5fdmlldy5ieUlkKHNCbG9ja0lEKSxcblx0XHRcdGJCbG9ja1N0YXRlID0gYlNob3cgPT09IHVuZGVmaW5lZCA/ICEob0Jsb2NrIGFzIER5bmFtaWNTaWRlQ29udGVudCkuZ2V0U2hvd1NpZGVDb250ZW50KCkgOiBiU2hvdztcblx0XHQob0Jsb2NrIGFzIER5bmFtaWNTaWRlQ29udGVudCkuc2V0U2hvd1NpZGVDb250ZW50KGJCbG9ja1N0YXRlLCBmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYm91bmQgY29udGV4dCBvZiB0aGUgY3VycmVudCBvYmplY3QgcGFnZS5cblx0ICogQHJldHVybnMgQ29udGV4dCBib3VuZCB0byB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0Z2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl92aWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGQgdGhlIGludGVybmFsIGNvbnRleHQgcGF0aCBvZiB0aGUgTWVzc2FnZVN0cmlwIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHQgcGF0aCBmb3IgdGhlIG1lc3NhZ2VTdHJpcFxuXHQgKi9cblx0X2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWxDb250ZXh0UGF0aCA9IHRoaXMuX3ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHZpZXdDb250ZXh0UGF0aCA9IHRoaXMuX3ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdHJldHVybiBpbnRlcm5hbE1vZGVsQ29udGV4dFBhdGggJiYgdmlld0NvbnRleHRQYXRoXG5cdFx0XHQ/IGAke2ludGVybmFsTW9kZWxDb250ZXh0UGF0aH0vTWVzc2FnZVN0cmlwLyR7dmlld0NvbnRleHRQYXRoLnJlcGxhY2UoL1xcLy9nLCBcIi1cIil9YFxuXHRcdFx0OiBcIlwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIHRoZSBtZXNzYWdlIHN0cmlwIGJldHdlZW4gdGhlIHRpdGxlIGFuZCB0aGUgaGVhZGVyIG9mIHRoZSBPYmplY3RQYWdlLlxuXHQgKiBAcGFyYW0gIG1lc3NhZ2VzIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXG5cdHNob3dNZXNzYWdlcyhtZXNzYWdlczogTWVzc2FnZVtdKTogdm9pZCB7XG5cdFx0dGhpcy5fc2hvd01lc3NhZ2VzKG1lc3NhZ2VzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5cyB0aGUgbWVzc2FnZSBzdHJpcCBiZXR3ZWVuIHRoZSB0aXRsZSBhbmQgdGhlIGhlYWRlciBvZiB0aGUgT2JqZWN0UGFnZS5cblx0ICogQHBhcmFtIG1lc3NhZ2VzIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZFxuXHQgKiBAcGFyYW0gb3JpZ2luIFRoZSBvcmlnaW4gb2YgdGhlIG1lc3NhZ2UgLiBJdCBtYXkgY29tZSBmcm9tIGEgYmFja2VuZCBtZXNzYWdlIG9yIGEgY3VzdG9tIG1lc3NhZ2Vcblx0ICovXG5cblx0X3Nob3dNZXNzYWdlcyhtZXNzYWdlczogTWVzc2FnZVtdLCBvcmlnaW46IFwiQmFja2VuZFwiIHwgXCJDdXN0b21cIiA9IFwiQ3VzdG9tXCIpOiB2b2lkIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuX3ZpZXc7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0Y29uc3QgbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0KHRoaXMuX2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGlmICghbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IFJlc291cmNlTW9kZWxIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbCh2aWV3KTtcblx0XHRcdGxldCBtZXNzYWdlOiBNZXNzYWdlIHwgbnVsbCA9IG51bGw7XG5cdFx0XHRtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgT1Ake29yaWdpbn1NZXNzYWdlVmlzaWJsZWAsICEhbWVzc2FnZSk7XG5cdFx0XHRzd2l0Y2ggKG1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0XHRtZXNzYWdlID0gbWVzc2FnZXNbMF07XG5cdFx0XHRcdFx0bWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYE9QJHtvcmlnaW59TWVzc2FnZVZpc2libGVgLCAhIW1lc3NhZ2UpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VTdGF0czogeyBba2V5OiBzdHJpbmddOiB7IGlkOiBudW1iZXI7IGNvdW50OiBudW1iZXIgfSB9ID0ge1xuXHRcdFx0XHRcdFx0RXJyb3I6IHsgaWQ6IDIsIGNvdW50OiAwIH0sXG5cdFx0XHRcdFx0XHRXYXJuaW5nOiB7IGlkOiAxLCBjb3VudDogMCB9LFxuXHRcdFx0XHRcdFx0SW5mb3JtYXRpb246IHsgaWQ6IDAsIGNvdW50OiAwIH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG1lc3NhZ2UgPSBtZXNzYWdlcy5yZWR1Y2UoXG5cdFx0XHRcdFx0XHQoYWNjLCBjdXJyZW50VmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudFR5cGUgPSBjdXJyZW50VmFsdWUuZ2V0VHlwZSgpO1xuXHRcdFx0XHRcdFx0XHRhY2Muc2V0VHlwZShtZXNzYWdlU3RhdHNbY3VycmVudFR5cGVdLmlkID4gbWVzc2FnZVN0YXRzW2FjYy5nZXRUeXBlKCldLmlkID8gY3VycmVudFR5cGUgOiBhY2MuZ2V0VHlwZSgpKTtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZVN0YXRzW2N1cnJlbnRUeXBlXS5jb3VudCsrO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWNjO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHsgdHlwZTogTWVzc2FnZVR5cGUuSW5mb3JtYXRpb24gfSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmIChvcmlnaW4gPT09IFwiQmFja2VuZFwiICYmICFDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHZpZXcpKSB7XG5cdFx0XHRcdFx0XHRtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgT1Ake29yaWdpbn1NZXNzYWdlVmlzaWJsZWAsIGZhbHNlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYE9QJHtvcmlnaW59TWVzc2FnZVZpc2libGVgLCAhIW1lc3NhZ2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChtZXNzYWdlU3RhdHMuRXJyb3IuY291bnQgPiAwKSB7XG5cdFx0XHRcdFx0XHRtZXNzYWdlLnNldE1lc3NhZ2UocmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiT0JKRUNUUEFHRVNUQVRFX0VSUk9SXCIpKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG1lc3NhZ2VTdGF0cy5XYXJuaW5nLmNvdW50ID4gMCkge1xuXHRcdFx0XHRcdFx0bWVzc2FnZS5zZXRNZXNzYWdlKHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIk9CSkVDVFBBR0VTVEFURV9XQVJOSU5HXCIpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWVzc2FnZS5zZXRNZXNzYWdlKHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIk9CSkVDVFBBR0VTVEFURV9JTkZPUk1BVElPTlwiKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYE9QJHtvcmlnaW59TWVzc2FnZVRleHRgLCBtZXNzYWdlID8gbWVzc2FnZS5nZXRNZXNzYWdlKCkgOiBudWxsKTtcblx0XHRcdG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBPUCR7b3JpZ2lufU1lc3NhZ2VUeXBlYCwgbWVzc2FnZSA/IG1lc3NhZ2UuZ2V0VHlwZSgpIDogbnVsbCk7XG5cdFx0XHRpZiAobWVzc2FnZSkge1xuXHRcdFx0XHRJbnZpc2libGVNZXNzYWdlLmdldEluc3RhbmNlKCkuYW5ub3VuY2UobWVzc2FnZS5nZXRNZXNzYWdlKCksIEludmlzaWJsZU1lc3NhZ2VNb2RlLkFzc2VydGl2ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgZGlzcGxheSBPYmplY3RQYWdlIG1lc3NhZ2VcIik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhpZGVzIHRoZSBtZXNzYWdlIHN0cmlwIGJlbG93IHRoZSBhbmNob3IgYmFyLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRoaWRlTWVzc2FnZSgpOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0ID0gaW50ZXJuYWxNb2RlbC5iaW5kQ29udGV4dCh0aGlzLl9nZXRNZXNzYWdlU3RyaXBCaW5kaW5nQ29udGV4dFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCkhO1xuXHRcdG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBPUEN1c3RvbU1lc3NhZ2VWaXNpYmxlYCwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSByZWNvbW1lbmRhdGlvbiBkYXRhIGRldGFpbHMsIHRyYW5zZm9ybSBpdCBhbmQgdXBkYXRlIGludGVybmFsIG1vZGVsIHdpdGggdGhhdC5cblx0ICogQHBhcmFtIGRhdGEgUmVjb21tZW5kYXRpb24gZGF0YSBmb3IgdGhlIGFwcFxuXHQgKi9cblx0c2V0UmVjb21tZW5kYXRpb25zKGRhdGE6IEluQ29tcGxldGVuZXNzSW5mb1R5cGUpOiB2b2lkIHtcblx0XHRyZWNvbW1lbmRhdGlvbkhlbHBlci50cmFuc2Zvcm1SZWNvbW1lbmRhdGlvbnNGb3JJbnRlcm5hbFN0b3JhZ2UoZGF0YSk7XG5cdFx0dGhpcy5fdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpLnNldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIiwgZGF0YSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyBhIGNvbnRyb2wgdG8gYmUgdGhlIHRpdGxlIG93bmVyIG9mIGl0cyBzZWN0aW9uL3N1YnNlY3Rpb24uIEFzIHRoZSB0aXRsZSBvd25lcnMgb2Ygc3RhbmRhcmQgc3Vic2VjdGlvbnMgYXJlIGRldGVybWluZWQgYXV0b21hdGljYWxseSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gZm9yIGN1c3RvbSBzZWN0aW9uL3N1YnNlY3Rpb24uXG5cdCAqIFRoZSB0aXRsZSBvd25lciBjYW4gYmUgZWl0aGVyIG9uZSBvZiB0aGUgc3RhbmRhcmQgYnVpbGRpbmcgYmxvY2tzIChGb3JtLCBDaGFydCwgVGFibGUpLCBvciByZXVzZSBjb21wb25lbnRzLCBvciBzYXAubS5UaXRsZS5cblx0ICogVGhlIGZyYW1ld29yayBhZGFwdHMgdGhlIHZhbHVlIG9mIHRoZXNlIHByb3BlcnRpZXMgdG8gYmUgYWxpZ25lZCB3aXRoIHRoZSB0aXRsZSB0aGF0IGlzIHNob3duIGluIHRoZSBhbmNob3IgYmFyIChvciBpY29uIHRhYiBiYXIpIGZvciB0aGUgc2VjdGlvbi4gTW9yZW92ZXIsIHRoZSB0aXRsZSBvZiB0aGUgc3Vic2VjdGlvbiAoYW5kIGlmIGFwcGxpY2FibGUgYWxzbyBvZiB0aGUgc2VjdGlvbikgaXMgaGlkZGVuIGluIG9yZGVyIHRvIHByZXZlbnQgcmVkdW5kYW50IHRpdGxlcywgaWYgdGhlIHN1YnNlY3Rpb24gcG9zc2Vzc2VzIGEgdGl0bGUgb3duZXIuXG5cdCAqIEhpbnQ6IElmIHlvdSBjaG9vc2UgdG8gc2V0IHNhcC5tLlRpdGxlIGFzIHRoZSB0aXRsZSBvd25lciwgc3R5bGluZyBhZGp1c3RtZW50cyBtYXkgYmUgcmVxdWlyZWQgaW4gdGhlIGN1c3RvbSB2aWV3LiBGb3IgZXhhbXBsZSwgaWYgc2FwLm0uVGl0bGUgaXMgc2V0IGFzIHRpdGxlIG93bmVyIHdoaWNoIGJlbG9uZ3MgdG8gc2FwLm0uT3ZlcmZsb3dUb29sYmFyIG9yIHRvIHNhcC5tLlRvb2xiYXIsIHRoZW4gdGhlIOKAmGRlc2lnbuKAmSBwcm9wZXJ0eSBvZiB0aGUgdG9vbGJhciBjb250cm9sIGlzIHRvIGJlIHNldCB0byDigJhUcmFuc3BhcmVudOKAmS5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIHNpbmdsZSBjb250ZW50IGNvbnRyb2wgY2FuIGJlIGVpdGhlciBvbmUgb2YgdGhlIHN0YW5kYXJkIGJ1aWxkaW5nIGJsb2NrcyAoRm9ybSwgQ2hhcnQsIFRhYmxlKSwgb3IgcmV1c2UgY29tcG9uZW50cywgb3Igc2FwLm0uVGl0bGUuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHNldEFzU2VjdGlvblRpdGxlT3duZXIoY29udHJvbDogTWFuYWdlZE9iamVjdCk6IHZvaWQge1xuXHRcdGxldCBzZWN0aW9uO1xuXHRcdGNvbnN0IG9yaWdpbmFsQ29udHJvbCA9IGNvbnRyb2w7XG5cdFx0bGV0IHJldXNlQ29tcG9uZW50O1xuXHRcdHdoaWxlIChjb250cm9sKSB7XG5cdFx0XHRpZiAoY29udHJvbC5pc0E8U2VjdGlvbj4oXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLlNlY3Rpb25cIikpIHtcblx0XHRcdFx0c2VjdGlvbiA9IGNvbnRyb2w7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbnRyb2wuaXNBPFJldXNlQ29tcG9uZW50PihcInNhcC5mZS5jb3JlLlJldXNlQ29tcG9uZW50XCIpKSB7XG5cdFx0XHRcdGNvbnRyb2wgPSBjb250cm9sLmNvbnRhaW5lci5nZXRQYXJlbnQoKSBhcyBDb250cm9sO1xuXHRcdFx0XHRyZXVzZUNvbXBvbmVudCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjb250cm9sUGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdGlmIChjb250cm9sUGFyZW50KSB7XG5cdFx0XHRcdGNvbnRyb2wgPSBjb250cm9sUGFyZW50O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzZWN0aW9uKSB7XG5cdFx0XHRpZiAocmV1c2VDb21wb25lbnQgJiYgc2VjdGlvbi5nZXRWaXNpYmxlU3ViU2VjdGlvbnMoKS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdHNlY3Rpb24uYWRqdXN0Rm9yU2luZ2xlQ29udGVudChvcmlnaW5hbENvbnRyb2wsIHsgbXVsdGlwbGVTdWJTZWN0aW9uc1dpdGhSZXVzZUNvbXBvbmVudCA6IHRydWUgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWN0aW9uLmFkanVzdEZvclNpbmdsZUNvbnRlbnQob3JpZ2luYWxDb250cm9sKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0UGFnZUV4dGVuc2lvbkFQSTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7RUF1QkE7QUFDQTtB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
|
|
437
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2NsYXNzIiwiX0V4dGVuc2lvbkFQSSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJyZWZyZXNoIiwidlBhdGgiLCJvQmluZGluZ0NvbnRleHQiLCJfdmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1NpZGVFZmZlY3RzIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwidW5kZWZpbmVkIiwicHVzaCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiYWxsUGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJvd25lckNvbXBvbmVudCIsIl9jb250cm9sbGVyIiwiZ2V0T3duZXJDb21wb25lbnQiLCJjb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiZ2V0RW50aXR5U2V0IiwicGF0aCIsImtpbmQiLCJnZXRPYmplY3QiLCJyZWplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwic1RhYmxlSWQiLCJ0YWJsZSIsImJ5SWQiLCJpc0EiLCJnZXRQYXJlbnQiLCJzaG93U2lkZUNvbnRlbnQiLCJzU3ViU2VjdGlvbktleSIsImJTaG93Iiwic0Jsb2NrSUQiLCJnZXRTaWRlQ29udGVudExheW91dElEIiwib0Jsb2NrIiwiYkJsb2NrU3RhdGUiLCJnZXRTaG93U2lkZUNvbnRlbnQiLCJzZXRTaG93U2lkZUNvbnRlbnQiLCJfZ2V0TWVzc2FnZVN0cmlwQmluZGluZ0NvbnRleHRQYXRoIiwiaW50ZXJuYWxNb2RlbENvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInZpZXdDb250ZXh0UGF0aCIsInJlcGxhY2UiLCJzaG93TWVzc2FnZXMiLCJtZXNzYWdlc09yU3RyaXAiLCJfc2hvd01lc3NhZ2VzIiwic2hvd0N1c3RvbU1lc3NhZ2VTdHJpcCIsIm1lc3NhZ2VTdHJpcCIsIm1lc3NhZ2VTdHJpcEludGVybmFsTW9kZWxDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyZW1vdmVDdXN0b21NZXNzYWdlU3RyaXAiLCJzZXRQcm9wZXJ0eSIsImN1c3RvbU1lc3NhZ2VTdHJpcElkIiwiZ2V0SWQiLCJ1aWQiLCJhZGRTdHlsZUNsYXNzIiwiYWRkQ3VzdG9tTWVzc2FnZVN0cmlwVG9QYWdlIiwibWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQiLCJoZWFkZXJDb250YWluZXIiLCJpbnNlcnRJbnRvQWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbk5hbWUiLCJjb250cm9sVG9JbnNlcnQiLCJhZ2dyZWdhdGlvbkNvbnRlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImNvbnRlbnRBcnJheSIsImluc2VydEFnZ3JlZ2F0aW9uIiwibGVuZ3RoIiwiY2xvbmUiLCJyZW1vdmVGcm9tQWdncmVnYXRpb24iLCJpZE1hdGNoZXIiLCJjb250cm9sVG9SZW1vdmUiLCJmaW5kIiwiY29udHJvbCIsInJlbW92ZUFnZ3JlZ2F0aW9uIiwiZGVzdHJveSIsImNvbnRyb2xJZCIsImluY2x1ZGVzIiwiY3JlYXRlTWVzc2FnZUl0ZW0iLCJtZXNzYWdlIiwic0Rlc2NyaXB0aW9uVXJsIiwiZ2V0RGVzY3JpcHRpb25VcmwiLCJNZXNzYWdlSXRlbSIsInRpdGxlIiwiZ2V0TWVzc2FnZSIsImRlc2NyaXB0aW9uIiwiZ2V0RGVzY3JpcHRpb24iLCJ0eXBlIiwiZ2V0VHlwZSIsImxvbmd0ZXh0VXJsIiwic3VidGl0bGUiLCJnZXRBZGRpdGlvbmFsVGV4dCIsImdyb3VwTmFtZSIsImFjdGl2ZVRpdGxlIiwiZ2V0Q29udHJvbElkcyIsImNyZWF0ZU1lc3NhZ2VQb3BvdmVyIiwibWVzc2FnZUl0ZW1zIiwicG9wb3ZlciIsIk1lc3NhZ2VQb3BvdmVyIiwiaXRlbXMiLCJzaG93TWVzc2FnZVBvcG92ZXIiLCJldmVudCIsIm1lc3NhZ2VJdGVtIiwic291cmNlQ29udHJvbCIsImdldFNvdXJjZSIsImFkZERlcGVuZGVudCIsIm9wZW5CeSIsIm1lc3NhZ2VzIiwib3JpZ2luIiwidmlldyIsImludGVybmFsTW9kZWwiLCJyZXNvdXJjZU1vZGVsIiwiUmVzb3VyY2VNb2RlbEhlbHBlciIsImdldFJlc291cmNlTW9kZWwiLCJoYXNEZXNjcmlwdGlvblVybCIsImlzRWRpdE1vZGUiLCJnZXRJc0VkaXRhYmxlIiwib2JqZWN0UGFnZSIsImdldENvbnRlbnQiLCJoZWFkZXJUaXRsZSIsImdldEhlYWRlclRpdGxlIiwiYWxsU3RyaXBzIiwiZ2V0U25hcHBlZENvbnRlbnQiLCJnZXRFeHBhbmRlZENvbnRlbnQiLCJmaWx0ZXIiLCJpdGVtIiwiTWVzc2FnZVN0cmlwIiwiZm9yRWFjaCIsInN0cmlwIiwiZ2V0TGluayIsImRlc3Ryb3lMaW5rIiwibGluayIsIkxpbmsiLCJ0ZXh0IiwiZ2V0VGV4dCIsInByZXNzIiwic2V0TGluayIsImVyciIsIkxvZyIsIndhcm5pbmciLCJtZXNzYWdlU3RhdHMiLCJFcnJvciIsImlkIiwiY291bnQiLCJXYXJuaW5nIiwiSW5mb3JtYXRpb24iLCJyZWR1Y2UiLCJhY2MiLCJjdXJyZW50VmFsdWUiLCJjdXJyZW50VHlwZSIsInNldFR5cGUiLCJNZXNzYWdlIiwiTWVzc2FnZVR5cGUiLCJzZXRNZXNzYWdlIiwiSW52aXNpYmxlTWVzc2FnZSIsImdldEluc3RhbmNlIiwiYW5ub3VuY2UiLCJJbnZpc2libGVNZXNzYWdlTW9kZSIsIkFzc2VydGl2ZSIsImVycm9yIiwiaGlkZU1lc3NhZ2UiLCJzZXRSZWNvbW1lbmRhdGlvbnMiLCJkYXRhIiwicmVjb21tZW5kYXRpb25IZWxwZXIiLCJ0cmFuc2Zvcm1SZWNvbW1lbmRhdGlvbnNGb3JJbnRlcm5hbFN0b3JhZ2UiLCJzZXRBc1NlY3Rpb25UaXRsZU93bmVyIiwic2VjdGlvbiIsIm9yaWdpbmFsQ29udHJvbCIsInJldXNlQ29tcG9uZW50IiwiY29udGFpbmVyIiwiY29udHJvbFBhcmVudCIsImdldFZpc2libGVTdWJTZWN0aW9ucyIsImFkanVzdEZvclNpbmdsZUNvbnRlbnQiLCJtdWx0aXBsZVN1YlNlY3Rpb25zV2l0aFJldXNlQ29tcG9uZW50IiwiRXh0ZW5zaW9uQVBJIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFeHRlbnNpb25BUEkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvY29yZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB0eXBlIFJldXNlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9SZXVzZUNvbXBvbmVudFwiO1xuaW1wb3J0IHsgZ2V0U2lkZUNvbnRlbnRMYXlvdXRJRCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSURcIjtcbmltcG9ydCB0eXBlIHsgSW5Db21wbGV0ZW5lc3NJbmZvVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1JlY29tbWVuZGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgeyByZWNvbW1lbmRhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1JlY29tbWVuZGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBTZWN0aW9uIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NvbnRyb2xzL1NlY3Rpb25cIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgTGluayBmcm9tIFwic2FwL20vTGlua1wiO1xuaW1wb3J0IE1lc3NhZ2VJdGVtIGZyb20gXCJzYXAvbS9NZXNzYWdlSXRlbVwiO1xuaW1wb3J0IE1lc3NhZ2VQb3BvdmVyIGZyb20gXCJzYXAvbS9NZXNzYWdlUG9wb3ZlclwiO1xuaW1wb3J0IE1lc3NhZ2VTdHJpcCBmcm9tIFwic2FwL20vTWVzc2FnZVN0cmlwXCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBJbnZpc2libGVNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVNZXNzYWdlXCI7XG5pbXBvcnQgeyBJbnZpc2libGVNZXNzYWdlTW9kZSB9IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIER5bmFtaWNTaWRlQ29udGVudCBmcm9tIFwic2FwL3VpL2xheW91dC9EeW5hbWljU2lkZUNvbnRlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9tZGMvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGVcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcblxuLyoqXG4gKiBFeHRlbnNpb24gQVBJIGZvciBvYmplY3QgcGFnZXMgb24gU0FQIEZpb3JpIGVsZW1lbnRzIGZvciBPRGF0YSBWNC5cbiAqXG4gKiBUbyBjb3JyZWN0bHkgaW50ZWdyYXRlIHlvdXIgYXBwIGV4dGVuc2lvbiBjb2Rpbmcgd2l0aCBTQVAgRmlvcmkgZWxlbWVudHMsIHVzZSBvbmx5IHRoZSBleHRlbnNpb25BUEkgb2YgU0FQIEZpb3JpIGVsZW1lbnRzLiBEb24ndCBhY2Nlc3Mgb3IgbWFuaXB1bGF0ZSBjb250cm9scywgcHJvcGVydGllcywgbW9kZWxzLCBvciBvdGhlciBpbnRlcm5hbCBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlIFNBUCBGaW9yaSBlbGVtZW50cyBmcmFtZXdvcmsuXG4gKiBAcHVibGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAZmluYWxcbiAqIEBzaW5jZSAxLjc5LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSVwiKVxuY2xhc3MgT2JqZWN0UGFnZUV4dGVuc2lvbkFQSSBleHRlbmRzIEV4dGVuc2lvbkFQSSB7XG5cdC8qKlxuXHQgKiBJRCBvZiB0aGUgYWN0aXZlIGN1c3RvbSBNZXNzYWdlU3RyaXAgZm9yIHByb2dyYW1tYXRpYyByZW1vdmFsLlxuXHQgKi9cblx0cHJpdmF0ZSBjdXN0b21NZXNzYWdlU3RyaXBJZD86IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmcmVzaGVzIGVpdGhlciB0aGUgd2hvbGUgb2JqZWN0IHBhZ2Ugb3Igb25seSBwYXJ0cyBvZiBpdC5cblx0ICogQHBhcmFtIFt2UGF0aF0gUGF0aCBvciBhcnJheSBvZiBwYXRocyByZWZlcnJpbmcgdG8gZW50aXRpZXMgb3IgcHJvcGVydGllcyB0byBiZSByZWZyZXNoZWQuXG5cdCAqIElmIG9taXR0ZWQsIHRoZSB3aG9sZSBvYmplY3QgcGFnZSBpcyByZWZyZXNoZWQuIFRoZSBwYXRoIFwiXCIgcmVmcmVzaGVzIHRoZSBlbnRpdHkgYXNzaWduZWQgdG8gdGhlIG9iamVjdCBwYWdlXG5cdCAqIHdpdGhvdXQgbmF2aWdhdGlvbi5cblx0ICogQHJldHVybnMgUmVzb2x2ZWQgb25jZSB0aGUgZGF0YSBpcyByZWZyZXNoZWQgb3IgcmVqZWN0ZWQgaWYgdGhlIHJlcXVlc3QgZmFpbGVkXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGFzeW5jIHJlZnJlc2godlBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuX3ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRpZiAoIW9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Ly8gbm90aGluZyB0byBiZSByZWZyZXNoZWQgLSBkbyBub3QgYmxvY2sgdGhlIGFwcCFcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl92aWV3KSxcblx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0b1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFx0XHRcdHRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHRcdH07XG5cblx0XHRpZiAodlBhdGggPT09IHVuZGVmaW5lZCB8fCB2UGF0aCA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gd2UganVzdCBhZGQgYW4gZW1wdHkgcGF0aCB3aGljaCBzaG91bGQgcmVmcmVzaCB0aGUgcGFnZSB3aXRoIGFsbCBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCJcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBhbGxQYXRocyA9IEFycmF5LmlzQXJyYXkodlBhdGgpID8gdlBhdGggOiBbdlBhdGhdO1xuXHRcdFx0Y29uc3Qgb3duZXJDb21wb25lbnQgPSB0aGlzLl9jb250cm9sbGVyLmdldE93bmVyQ29tcG9uZW50KCkgYXMgdW5rbm93biBhcyB7XG5cdFx0XHRcdGdldENvbnRleHRQYXRoOiAoKSA9PiBzdHJpbmc7XG5cdFx0XHRcdGdldEVudGl0eVNldDogKCkgPT4gc3RyaW5nO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gb3duZXJDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSB8fCBgLyR7b3duZXJDb21wb25lbnQuZ2V0RW50aXR5U2V0KCl9YDtcblxuXHRcdFx0Zm9yIChjb25zdCBwYXRoIG9mIGFsbFBhdGhzKSB7XG5cdFx0XHRcdGlmIChwYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0Ly8gYW4gZW1wdHkgcGF0aCBzaGFsbCByZWZyZXNoIHRoZSBlbnRpdHkgd2l0aG91dCBkZXBlbmRlbmNpZXMgd2hpY2ggbWVhbnMgKiBmb3IgdGhlIG1vZGVsXG5cdFx0XHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucHVzaChcIipcIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qga2luZCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke2NvbnRleHRQYXRofS8ke3BhdGh9LyRraW5kYCk7XG5cblx0XHRcdFx0XHRpZiAoa2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogcGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChraW5kKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5wdXNoKHBhdGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoYCR7cGF0aH0gaXMgbm90IGEgdmFsaWQgcGF0aCB0byBiZSByZWZyZXNoZWRgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBsaXN0IGVudHJpZXMgY3VycmVudGx5IHNlbGVjdGVkIGZvciB0aGUgdGFibGUuXG5cdCAqIEBwYXJhbSBzVGFibGVJZCBUaGUgSUQgaWRlbnRpZnlpbmcgdGhlIHRhYmxlIHRoZSBzZWxlY3RlZCBjb250ZXh0IGlzIHJlcXVlc3RlZCBmb3Jcblx0ICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dHNcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0Z2V0U2VsZWN0ZWRDb250ZXh0cyhzVGFibGVJZDogc3RyaW5nKTogT0RhdGFWNENvbnRleHRbXSB7XG5cdFx0bGV0IHRhYmxlID0gdGhpcy5fdmlldy5ieUlkKHNUYWJsZUlkKTtcblx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdH1cblx0XHRpZiAodGFibGU/LmlzQShcInNhcC5mZS5tYWNyb3MudGFibGUuVGFibGVBUElcIikpIHtcblx0XHRcdHJldHVybiAodGFibGUgYXMgVGFibGVBUEkpLmdldFNlbGVjdGVkQ29udGV4dHMoKTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIG9yIGhpZGVzIHRoZSBzaWRlIGNvbnRlbnQgb2YgYW4gb2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSBzU3ViU2VjdGlvbktleSBLZXkgb2YgdGhlIHNpZGUgY29udGVudCBmcmFnbWVudCBhcyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5qc29uXG5cdCAqIEBwYXJhbSBbYlNob3ddIE9wdGlvbmFsIEJvb2xlYW4gZmxhZyB0byBzaG93IG9yIGhpZGUgdGhlIHNpZGUgY29udGVudFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRzaG93U2lkZUNvbnRlbnQoc1N1YlNlY3Rpb25LZXk6IHN0cmluZywgYlNob3c/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgc0Jsb2NrSUQgPSBnZXRTaWRlQ29udGVudExheW91dElEKHNTdWJTZWN0aW9uS2V5KSxcblx0XHRcdG9CbG9jayA9IHRoaXMuX3ZpZXcuYnlJZChzQmxvY2tJRCksXG5cdFx0XHRiQmxvY2tTdGF0ZSA9IGJTaG93ID09PSB1bmRlZmluZWQgPyAhKG9CbG9jayBhcyBEeW5hbWljU2lkZUNvbnRlbnQpLmdldFNob3dTaWRlQ29udGVudCgpIDogYlNob3c7XG5cdFx0KG9CbG9jayBhcyBEeW5hbWljU2lkZUNvbnRlbnQpLnNldFNob3dTaWRlQ29udGVudChiQmxvY2tTdGF0ZSwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJvdW5kIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IHBhZ2UuXG5cdCAqIEByZXR1cm5zIENvbnRleHQgYm91bmQgdG8gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGdldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkIHRoZSBpbnRlcm5hbCBjb250ZXh0IHBhdGggb2YgdGhlIE1lc3NhZ2VTdHJpcCBjb250cm9sLlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgYmluZGluZyBjb250ZXh0IHBhdGggZm9yIHRoZSBtZXNzYWdlU3RyaXBcblx0ICovXG5cdF9nZXRNZXNzYWdlU3RyaXBCaW5kaW5nQ29udGV4dFBhdGgoKTogc3RyaW5nIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dFBhdGggPSB0aGlzLl92aWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFBhdGgoKTtcblx0XHRjb25zdCB2aWV3Q29udGV4dFBhdGggPSB0aGlzLl92aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gaW50ZXJuYWxNb2RlbENvbnRleHRQYXRoICYmIHZpZXdDb250ZXh0UGF0aFxuXHRcdFx0PyBgJHtpbnRlcm5hbE1vZGVsQ29udGV4dFBhdGh9L01lc3NhZ2VTdHJpcC8ke3ZpZXdDb250ZXh0UGF0aC5yZXBsYWNlKC9cXC8vZywgXCItXCIpfWBcblx0XHRcdDogXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5cyB0aGUgbWVzc2FnZSBzdHJpcCBiZXR3ZWVuIHRoZSB0aXRsZSBhbmQgdGhlIGhlYWRlciBvZiB0aGUgT2JqZWN0UGFnZS4gSWYgb25seSBvbmUgbWVzc2FnZSBpcyBwcm92aWRlZCwgaXQgaXMgZGlzcGxheWVkIGRpcmVjdGx5IGluIHRoZSBtZXNzYWdlIHN0cmlwLiBJZiBtdWx0aXBsZSBtZXNzYWdlcyBhcmUgcHJvdmlkZWQsIHRoZXkgYXJlIHByaW9yaXRpemVkIGJ5IHRoZSBvcmRlcjogRXJyb3IsIFdhcm5pbmcsIGFuZCBJbmZvcm1hdGlvbiBhbmQgYSBjb3JyZXNwb25kaW5nIGdlbmVyaWMgdGV4dCBpcyBkaXNwbGF5ZWQ6XG5cdCAqIC0gRXJyb3I6IFwiVGhlIG9iamVjdCBjb250YWlucyBlcnJvcnMuXCJcblx0ICogLSBXYXJuaW5nOiBcIlRoZSBvYmplY3QgY29udGFpbnMgd2FybmluZ3MuXCJcblx0ICogLSBJbmZvcm1hdGlvbjogXCJUaGUgb2JqZWN0IGNvbnRhaW5zIG1lc3NhZ2VzLlwiXG5cdCAqIElmIGEgYmFjay1lbmQgbWVzc2FnZSBpcyByZWNlaXZlZCB3aXRoIGEgdGFyZ2V0IHBvaW50aW5nIHRvIHRoZSBPYmplY3QgUGFnZSwgaXQgaXMgZGlzcGxheWVkIGluIHRoZSBtZXNzYWdlIHN0cmlwLCBvdmVycmlkaW5nIGFueSBleGlzdGluZyBtZXNzYWdlIG9yIG1lc3NhZ2Ugc3RyaXAuIElmIG11bHRpcGxlIGJhY2stZW5kIG1lc3NhZ2VzIGFyZSByZWNlaXZlZCwgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSBpcyBkaXNwbGF5ZWQgd2l0aCBhIGdlbmVyaWMgdGV4dCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cdCAqIEBwYXJhbSAgbWVzc2FnZXNPclN0cmlwIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBvciBhIE1lc3NhZ2VTdHJpcCBjb250cm9sXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHNob3dNZXNzYWdlcyhtZXNzYWdlc09yU3RyaXA6IE1lc3NhZ2VbXSB8IE1lc3NhZ2VTdHJpcCk6IHZvaWQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2VzT3JTdHJpcCkpIHtcblx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlcyhtZXNzYWdlc09yU3RyaXApO1xuXHRcdH0gZWxzZSBpZiAobWVzc2FnZXNPclN0cmlwLmlzQShcInNhcC5tLk1lc3NhZ2VTdHJpcFwiKSkge1xuXHRcdFx0dGhpcy5zaG93Q3VzdG9tTWVzc2FnZVN0cmlwKG1lc3NhZ2VzT3JTdHJpcCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNob3dzIGEgY3VzdG9tIE1lc3NhZ2VTdHJpcCBjb250cm9sIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi5cblx0ICogRW5zdXJlcyBtdXR1YWwgZXhjbHVzaXZpdHkgd2l0aCB0aGUgTWVzc2FnZVN0cmlwIHJlbmRlcmVkIGJ5IHRoZSBvYmplY3QgcGFnZSB2aWV3LlxuXHQgKiBAcGFyYW0gbWVzc2FnZVN0cmlwIE1lc3NhZ2VTdHJpcCBjb250cm9sXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIHNob3dDdXN0b21NZXNzYWdlU3RyaXAobWVzc2FnZVN0cmlwOiBNZXNzYWdlU3RyaXApOiB2b2lkIHtcblx0XHRjb25zdCBtZXNzYWdlU3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuX3ZpZXdcblx0XHRcdC5nZXRNb2RlbChcImludGVybmFsXCIpXG5cdFx0XHQuYmluZENvbnRleHQodGhpcy5fZ2V0TWVzc2FnZVN0cmlwQmluZGluZ0NvbnRleHRQYXRoKCkpXG5cdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0aWYgKCFtZXNzYWdlU3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMucmVtb3ZlQ3VzdG9tTWVzc2FnZVN0cmlwKCk7IC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgY3VzdG9tIG1lc3NhZ2Ugc3RyaXAgYmVmb3JlIGFkZGluZyBuZXcgb25lXG5cblx0XHQvLyBIaWRlIGZyYW1ld29yayBnZW5lcmF0ZWQgbWVzc2FnZSBzdHJpcCB0byBlbnN1cmUgbXV0dWFsIGV4Y2x1c2l2aXR5XG5cdFx0bWVzc2FnZVN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJPUEJhY2tlbmRNZXNzYWdlVmlzaWJsZVwiLCBmYWxzZSk7XG5cdFx0bWVzc2FnZVN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJPUEN1c3RvbU1lc3NhZ2VWaXNpYmxlXCIsIGZhbHNlKTtcblxuXHRcdHRoaXMuY3VzdG9tTWVzc2FnZVN0cmlwSWQgPSBtZXNzYWdlU3RyaXAuZ2V0SWQoKSB8fCB1aWQoKTsgLy8gU3RvcmUgcmVmZXJlbmNlIGZvciBwcm9ncmFtbWF0aWMgcmVtb3ZhbFxuXG5cdFx0bWVzc2FnZVN0cmlwLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaVNtYWxsTWFyZ2luVG9wXCIpO1xuXHRcdHRoaXMuYWRkQ3VzdG9tTWVzc2FnZVN0cmlwVG9QYWdlKG1lc3NhZ2VTdHJpcCwgbWVzc2FnZVN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBjdXN0b20gTWVzc2FnZVN0cmlwIHRvIHRoZSBwYWdlIGxheW91dCBpbiB0aGUgaGVhZGVyIGNvbnRhaW5lciBzdWNoIGFzIGluIGV4cGFuZGVkIGFuZCBzbmFwcGVkIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBtZXNzYWdlU3RyaXAgVGhlIE1lc3NhZ2VTdHJpcCBjb250cm9sIHRvIGFkZFxuXHQgKiBAcGFyYW0gbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYWRkQ3VzdG9tTWVzc2FnZVN0cmlwVG9QYWdlKG1lc3NhZ2VTdHJpcDogTWVzc2FnZVN0cmlwLCBtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IGhlYWRlckNvbnRhaW5lciA9IHRoaXMuX3ZpZXcuYnlJZChcImZlOjpPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCIpO1xuXHRcdGlmIChoZWFkZXJDb250YWluZXIpIHtcblx0XHRcdGNvbnN0IGluc2VydEludG9BZ2dyZWdhdGlvbiA9IChhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZywgY29udHJvbFRvSW5zZXJ0OiBNZXNzYWdlU3RyaXApOiB2b2lkID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Db250ZW50ID0gaGVhZGVyQ29udGFpbmVyLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkNvbnRlbnQpIHtcblx0XHRcdFx0XHRjb25zdCBjb250ZW50QXJyYXkgPSBBcnJheS5pc0FycmF5KGFnZ3JlZ2F0aW9uQ29udGVudCkgPyBhZ2dyZWdhdGlvbkNvbnRlbnQgOiBbYWdncmVnYXRpb25Db250ZW50XTtcblx0XHRcdFx0XHRoZWFkZXJDb250YWluZXIuaW5zZXJ0QWdncmVnYXRpb24oYWdncmVnYXRpb25OYW1lLCBjb250cm9sVG9JbnNlcnQsIGNvbnRlbnRBcnJheS5sZW5ndGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0aW5zZXJ0SW50b0FnZ3JlZ2F0aW9uKFwiZXhwYW5kZWRDb250ZW50XCIsIG1lc3NhZ2VTdHJpcCk7XG5cdFx0XHRpbnNlcnRJbnRvQWdncmVnYXRpb24oXCJzbmFwcGVkQ29udGVudFwiLCBtZXNzYWdlU3RyaXAuY2xvbmUoKSk7XG5cblx0XHRcdG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiT1BDdXN0b21NZXNzYWdlU3RyaXBWaXNpYmxlXCIsIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBhY3RpdmUgY3VzdG9tIE1lc3NhZ2VTdHJpcCBwcm9ncmFtbWF0aWNhbGx5LlxuXHQgKi9cblx0cHJpdmF0ZSByZW1vdmVDdXN0b21NZXNzYWdlU3RyaXAoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmN1c3RvbU1lc3NhZ2VTdHJpcElkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmluZCBhbmQgcmVtb3ZlIHRoZSBjdXN0b20gbWVzc2FnZSBzdHJpcCBmcm9tIGhlYWRlciBjb250YWluZXJcblx0XHRjb25zdCBoZWFkZXJDb250YWluZXIgPSB0aGlzLl92aWV3LmJ5SWQoXCJmZTo6T2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZVwiKTtcblx0XHRpZiAoaGVhZGVyQ29udGFpbmVyKSB7XG5cdFx0XHRjb25zdCByZW1vdmVGcm9tQWdncmVnYXRpb24gPSAoYWdncmVnYXRpb25OYW1lOiBzdHJpbmcsIGlkTWF0Y2hlcjogKGNvbnRyb2xJZDogc3RyaW5nKSA9PiBib29sZWFuKTogdm9pZCA9PiB7XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IGhlYWRlckNvbnRhaW5lci5nZXRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbk5hbWUpIGFzIENvbnRyb2xbXTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uQ29udGVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRyb2xUb1JlbW92ZSA9IGFnZ3JlZ2F0aW9uQ29udGVudC5maW5kKChjb250cm9sKSA9PiBpZE1hdGNoZXIoY29udHJvbC5nZXRJZCgpKSk7XG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xUb1JlbW92ZSkge1xuXHRcdFx0XHRcdFx0aGVhZGVyQ29udGFpbmVyLnJlbW92ZUFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uTmFtZSwgY29udHJvbFRvUmVtb3ZlKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xUb1JlbW92ZS5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0cmVtb3ZlRnJvbUFnZ3JlZ2F0aW9uKFwiZXhwYW5kZWRDb250ZW50XCIsIChjb250cm9sSWQpID0+IGNvbnRyb2xJZCA9PT0gdGhpcy5jdXN0b21NZXNzYWdlU3RyaXBJZCk7XG5cdFx0XHRyZW1vdmVGcm9tQWdncmVnYXRpb24oXCJzbmFwcGVkQ29udGVudFwiLCAoY29udHJvbElkKSA9PiBjb250cm9sSWQuaW5jbHVkZXModGhpcy5jdXN0b21NZXNzYWdlU3RyaXBJZCArIFwiLV9fY2xvbmVcIikpO1xuXHRcdH1cblxuXHRcdHRoaXMuY3VzdG9tTWVzc2FnZVN0cmlwSWQgPSB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuX3ZpZXdcblx0XHRcdC5nZXRNb2RlbChcImludGVybmFsXCIpXG5cdFx0XHQuYmluZENvbnRleHQodGhpcy5fZ2V0TWVzc2FnZVN0cmlwQmluZGluZ0NvbnRleHRQYXRoKCkpXG5cdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0aWYgKG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIk9QQ3VzdG9tTWVzc2FnZVN0cmlwVmlzaWJsZVwiLCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBNZXNzYWdlSXRlbSBmcm9tIGEgTWVzc2FnZSBpbnN0YW5jZS5cblx0ICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGV4dCwgdHlwZSwgZGVzY3JpcHRpb24sIGV0Yy5cblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgTWVzc2FnZUl0ZW0gaW5zdGFuY2UgZm9yIHRoZSBNZXNzYWdlUG9wb3Zlci5cblx0ICovXG5cdHByaXZhdGUgY3JlYXRlTWVzc2FnZUl0ZW0obWVzc2FnZTogTWVzc2FnZSk6IE1lc3NhZ2VJdGVtIHtcblx0XHRjb25zdCBzRGVzY3JpcHRpb25Vcmw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG1lc3NhZ2UuZ2V0RGVzY3JpcHRpb25Vcmw/LigpO1xuXG5cdFx0cmV0dXJuIG5ldyBNZXNzYWdlSXRlbSh7XG5cdFx0XHR0aXRsZTogbWVzc2FnZS5nZXRNZXNzYWdlKCksXG5cdFx0XHRkZXNjcmlwdGlvbjogbWVzc2FnZS5nZXREZXNjcmlwdGlvbigpLFxuXHRcdFx0dHlwZTogbWVzc2FnZS5nZXRUeXBlKCksXG5cdFx0XHRsb25ndGV4dFVybDogc0Rlc2NyaXB0aW9uVXJsLFxuXHRcdFx0c3VidGl0bGU6IG1lc3NhZ2UuZ2V0QWRkaXRpb25hbFRleHQ/LigpLFxuXHRcdFx0Z3JvdXBOYW1lOiBcIlRfTUVTU0FHRV9CVVRUT05fU0FQRkVfTUVTU0FHRV9HUk9VUF9HRU5FUkFMXCIsXG5cdFx0XHRhY3RpdmVUaXRsZTogISFtZXNzYWdlLmdldENvbnRyb2xJZHM/LigpLmxlbmd0aFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBNZXNzYWdlUG9wb3ZlciBmb3IgYSBzZXQgb2YgTWVzc2FnZUl0ZW1zIGFuZCBhdHRhY2hlc1xuXHQgKiBhbiBhc3luYyBkZXNjcmlwdGlvbiBoYW5kbGVyIHRvIGxvYWQgbG9uZyB0ZXh0IHdoZW4gbmVlZGVkLlxuXHQgKiBAcGFyYW0gbWVzc2FnZUl0ZW1zIEFycmF5IG9mIE1lc3NhZ2VJdGVtcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBvcG92ZXIuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIE1lc3NhZ2VQb3BvdmVyIGluc3RhbmNlLlxuXHQgKi9cblx0Y3JlYXRlTWVzc2FnZVBvcG92ZXIobWVzc2FnZUl0ZW1zOiBNZXNzYWdlSXRlbSk6IE1lc3NhZ2VQb3BvdmVyIHtcblx0XHRjb25zdCBwb3BvdmVyID0gbmV3IE1lc3NhZ2VQb3BvdmVyKHtcblx0XHRcdGl0ZW1zOiBtZXNzYWdlSXRlbXNcblx0XHR9KSBhcyBNZXNzYWdlUG9wb3Zlcjtcblx0XHRyZXR1cm4gcG9wb3Zlcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBPcGVucyBhIE1lc3NhZ2VQb3BvdmVyIGZvciB0aGUgcHJvdmlkZWQgbWVzc2FnZXMsIGFuY2hvcmVkIHRvIHRoZVxuXHQgKiBzb3VyY2UgY29udHJvbCBvZiB0aGUgVUk1IGV2ZW50LlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIFVJNSBldmVudCBmcm9tIHRoZSBjb250cm9sIHRoYXQgdHJpZ2dlcnMgdGhlIHBvcG92ZXIuXG5cdCAqIEBwYXJhbSBtZXNzYWdlIEFycmF5IG9mIE1lc3NhZ2Ugb2JqZWN0cyB0byBiZSBzaG93biBpbiB0aGUgcG9wb3Zlci5cblx0ICogQHJldHVybnMgVGhlIE1lc3NhZ2VQb3BvdmVyIHRoYXQgd2FzIG9wZW5lZC5cblx0ICovXG5cdHNob3dNZXNzYWdlUG9wb3ZlcihldmVudDogVUk1RXZlbnQsIG1lc3NhZ2U6IE1lc3NhZ2VbXSk6IE1lc3NhZ2VQb3BvdmVyIHtcblx0XHRjb25zdCBtZXNzYWdlSXRlbSA9IHRoaXMuY3JlYXRlTWVzc2FnZUl0ZW0obWVzc2FnZVswXSk7XG5cdFx0Y29uc3QgcG9wb3ZlciA9IHRoaXMuY3JlYXRlTWVzc2FnZVBvcG92ZXIobWVzc2FnZUl0ZW0pO1xuXHRcdGNvbnN0IHNvdXJjZUNvbnRyb2wgPSBldmVudC5nZXRTb3VyY2U/LigpIGFzIENvbnRyb2w7XG5cdFx0c291cmNlQ29udHJvbD8uYWRkRGVwZW5kZW50KHBvcG92ZXIpO1xuXHRcdHBvcG92ZXIub3BlbkJ5KHNvdXJjZUNvbnRyb2wpO1xuXHRcdHJldHVybiBwb3BvdmVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIHRoZSBtZXNzYWdlIHN0cmlwIGJldHdlZW4gdGhlIHRpdGxlIGFuZCB0aGUgaGVhZGVyIG9mIHRoZSBPYmplY3RQYWdlLlxuXHQgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkXG5cdCAqIEBwYXJhbSBvcmlnaW4gVGhlIG9yaWdpbiBvZiB0aGUgbWVzc2FnZS4gSXQgbWF5IGNvbWUgZnJvbSBhIGJhY2stZW5kIG1lc3NhZ2Ugb3IgYSBjdXN0b20gbWVzc2FnZVxuXHQgKi9cblx0X3Nob3dNZXNzYWdlcyhtZXNzYWdlczogTWVzc2FnZVtdLCBvcmlnaW46IFwiQmFja2VuZFwiIHwgXCJDdXN0b21cIiA9IFwiQ3VzdG9tXCIpOiB2b2lkIHtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5yZW1vdmVDdXN0b21NZXNzYWdlU3RyaXAoKTtcblxuXHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuX3ZpZXc7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0Y29uc3QgbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0KHRoaXMuX2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGlmICghbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IFJlc291cmNlTW9kZWxIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbCh2aWV3KTtcblx0XHRcdGxldCBtZXNzYWdlOiBNZXNzYWdlIHwgbnVsbCA9IG1lc3NhZ2VzWzBdIHx8IG51bGw7XG5cdFx0XHRtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgT1Ake29yaWdpbn1NZXNzYWdlVmlzaWJsZWAsICEhbWVzc2FnZSk7XG5cdFx0XHRzd2l0Y2ggKG1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0XHRtZXNzYWdlID0gbWVzc2FnZXNbMF07XG5cdFx0XHRcdFx0Y29uc3QgaGFzRGVzY3JpcHRpb25VcmwgPSAhIW1lc3NhZ2U/LmdldERlc2NyaXB0aW9uVXJsKCk7XG5cdFx0XHRcdFx0Y29uc3QgaXNFZGl0TW9kZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodmlldyk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9iamVjdFBhZ2UgPSB2aWV3LmdldENvbnRlbnQoKT8uWzBdIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdFx0XHRcdFx0XHRjb25zdCBoZWFkZXJUaXRsZSA9IG9iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlO1xuXG5cdFx0XHRcdFx0XHQvLyBDb2xsZWN0IGFsbCBNZXNzYWdlU3RyaXBzIChleGNsdWRpbmcgQ29sbGFib3JhdGlvbiBTdHJpcHMpXG5cdFx0XHRcdFx0XHRjb25zdCBhbGxTdHJpcHMgPSBbXG5cdFx0XHRcdFx0XHRcdC4uLihoZWFkZXJUaXRsZS5nZXRTbmFwcGVkQ29udGVudD8uKCkgfHwgW10pLFxuXHRcdFx0XHRcdFx0XHQuLi4oaGVhZGVyVGl0bGUuZ2V0RXhwYW5kZWRDb250ZW50Py4oKSB8fCBbXSlcblx0XHRcdFx0XHRcdF0uZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHQoaXRlbSk6IGl0ZW0gaXMgTWVzc2FnZVN0cmlwID0+IGl0ZW0gaW5zdGFuY2VvZiBNZXNzYWdlU3RyaXAgJiYgIWl0ZW0uZ2V0SWQoKT8uaW5jbHVkZXMoXCJDb2xsYWJvcmF0aW9uU3RyaXBcIilcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIE9ubHkgYWRkIGxpbmtzIHdoZW4gbWVzc2FnZSBpcyBmcm9tIEJhY2tlbmQsIGluIERpc3BsYXkgbW9kZSwgYW5kIGhhcyBhIGRlc2NyaXB0aW9uIFVSTFxuXHRcdFx0XHRcdFx0aWYgKG9yaWdpbiA9PT0gXCJCYWNrZW5kXCIgJiYgIWlzRWRpdE1vZGUgJiYgaGFzRGVzY3JpcHRpb25VcmwpIHtcblx0XHRcdFx0XHRcdFx0YWxsU3RyaXBzLmZvckVhY2goKHN0cmlwKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWx3YXlzIGRlc3Ryb3kgdGhlIGV4aXN0aW5nIGxpbmsgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZVxuXHRcdFx0XHRcdFx0XHRcdGlmIChzdHJpcC5nZXRMaW5rKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHN0cmlwLmRlc3Ryb3lMaW5rKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxpbmsgPSBuZXcgTGluayh7XG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRV9TVFJJUF9MSU5LX1RFWFRcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVzczogKGV2ZW50OiBVSTVFdmVudCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNob3dNZXNzYWdlUG9wb3ZlcihldmVudCwgW21lc3NhZ2UhXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0c3RyaXAuc2V0TGluayhsaW5rKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBSZW1vdmUgbGlua3Mgd2hlbiBub3QgYXBwbGljYWJsZVxuXHRcdFx0XHRcdFx0XHRhbGxTdHJpcHMuZm9yRWFjaCgoc3RyaXApID0+IHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc3RyaXAuZ2V0TGluaygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzdHJpcC5kZXN0cm95TGluaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIlVuYWJsZSB0byBhdHRhY2ggbGluayB0byBPYmplY3RQYWdlIE1lc3NhZ2VTdHJpcFwiLCBlcnIgYXMgRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjb25zdCBtZXNzYWdlU3RhdHM6IHsgW2tleTogc3RyaW5nXTogeyBpZDogbnVtYmVyOyBjb3VudDogbnVtYmVyIH0gfSA9IHtcblx0XHRcdFx0XHRcdEVycm9yOiB7IGlkOiAyLCBjb3VudDogMCB9LFxuXHRcdFx0XHRcdFx0V2FybmluZzogeyBpZDogMSwgY291bnQ6IDAgfSxcblx0XHRcdFx0XHRcdEluZm9ybWF0aW9uOiB7IGlkOiAwLCBjb3VudDogMCB9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRtZXNzYWdlID0gbWVzc2FnZXMucmVkdWNlKFxuXHRcdFx0XHRcdFx0KGFjYywgY3VycmVudFZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRUeXBlID0gY3VycmVudFZhbHVlLmdldFR5cGUoKTtcblx0XHRcdFx0XHRcdFx0YWNjLnNldFR5cGUobWVzc2FnZVN0YXRzW2N1cnJlbnRUeXBlXS5pZCA+IG1lc3NhZ2VTdGF0c1thY2MuZ2V0VHlwZSgpXS5pZCA/IGN1cnJlbnRUeXBlIDogYWNjLmdldFR5cGUoKSk7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VTdGF0c1tjdXJyZW50VHlwZV0uY291bnQrKztcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFjYztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7IHR5cGU6IE1lc3NhZ2VUeXBlLkluZm9ybWF0aW9uIH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAob3JpZ2luID09PSBcIkJhY2tlbmRcIiAmJiAhQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZSh2aWV3KSkge1xuXHRcdFx0XHRcdFx0bWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYE9QJHtvcmlnaW59TWVzc2FnZVZpc2libGVgLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBPUCR7b3JpZ2lufU1lc3NhZ2VWaXNpYmxlYCwgISFtZXNzYWdlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobWVzc2FnZVN0YXRzLkVycm9yLmNvdW50ID4gMCkge1xuXHRcdFx0XHRcdFx0bWVzc2FnZS5zZXRNZXNzYWdlKHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIk9CSkVDVFBBR0VTVEFURV9FUlJPUlwiKSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChtZXNzYWdlU3RhdHMuV2FybmluZy5jb3VudCA+IDApIHtcblx0XHRcdFx0XHRcdG1lc3NhZ2Uuc2V0TWVzc2FnZShyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJPQkpFQ1RQQUdFU1RBVEVfV0FSTklOR1wiKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG1lc3NhZ2Uuc2V0TWVzc2FnZShyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJPQkpFQ1RQQUdFU1RBVEVfSU5GT1JNQVRJT05cIikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBPUCR7b3JpZ2lufU1lc3NhZ2VUZXh0YCwgbWVzc2FnZSA/IG1lc3NhZ2UuZ2V0TWVzc2FnZSgpIDogbnVsbCk7XG5cdFx0XHRtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgT1Ake29yaWdpbn1NZXNzYWdlVHlwZWAsIG1lc3NhZ2UgPyBtZXNzYWdlLmdldFR5cGUoKSA6IG51bGwpO1xuXHRcdFx0aWYgKG1lc3NhZ2UpIHtcblx0XHRcdFx0SW52aXNpYmxlTWVzc2FnZS5nZXRJbnN0YW5jZSgpLmFubm91bmNlKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCBJbnZpc2libGVNZXNzYWdlTW9kZS5Bc3NlcnRpdmUpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGRpc3BsYXkgT2JqZWN0UGFnZSBtZXNzYWdlXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIaWRlcyB0aGUgbWVzc2FnZSBzdHJpcCBiZWxvdyB0aGUgYW5jaG9yIGJhci5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0aGlkZU1lc3NhZ2UoKTogdm9pZCB7XG5cdFx0Y29uc3QgbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLl92aWV3XG5cdFx0XHQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKVxuXHRcdFx0LmJpbmRDb250ZXh0KHRoaXMuX2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCgpKVxuXHRcdFx0LmdldEJvdW5kQ29udGV4dCgpITtcblx0XHRtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgT1BDdXN0b21NZXNzYWdlVmlzaWJsZWAsIGZhbHNlKTtcblx0XHR0aGlzLnJlbW92ZUN1c3RvbU1lc3NhZ2VTdHJpcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSByZWNvbW1lbmRhdGlvbiBkYXRhIGRldGFpbHMsIHRyYW5zZm9ybSBpdCwgYW5kIHVwZGF0ZSB0aGUgaW50ZXJuYWwgbW9kZWwuXG5cdCAqIEBwYXJhbSBkYXRhIFJlY29tbWVuZGF0aW9uIGRhdGEgZm9yIHRoZSBhcHBcblx0ICovXG5cdHNldFJlY29tbWVuZGF0aW9ucyhkYXRhOiBJbkNvbXBsZXRlbmVzc0luZm9UeXBlKTogdm9pZCB7XG5cdFx0cmVjb21tZW5kYXRpb25IZWxwZXIudHJhbnNmb3JtUmVjb21tZW5kYXRpb25zRm9ySW50ZXJuYWxTdG9yYWdlKGRhdGEpO1xuXHRcdHRoaXMuX3ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKS5zZXRQcm9wZXJ0eShcIi9yZWNvbW1lbmRhdGlvbnNEYXRhXCIsIGRhdGEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgYSBjb250cm9sIHRvIGJlIHRoZSB0aXRsZSBvd25lciBvZiBpdHMgc2VjdGlvbi9zdWJzZWN0aW9uLiBBcyB0aGUgdGl0bGUgb3duZXJzIG9mIHN0YW5kYXJkIHN1YnNlY3Rpb25zIGFyZSBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHksIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBjdXN0b20gc2VjdGlvbi9zdWJzZWN0aW9uLlxuXHQgKiBUaGUgdGl0bGUgb3duZXIgY2FuIGJlIGVpdGhlciBvbmUgb2YgdGhlIHN0YW5kYXJkIGJ1aWxkaW5nIGJsb2NrcyAoRm9ybSwgQ2hhcnQsIFRhYmxlKSwgb3IgcmV1c2UgY29tcG9uZW50cywgb3Igc2FwLm0uVGl0bGUuXG5cdCAqIFRoZSBmcmFtZXdvcmsgYWRhcHRzIHRoZSB2YWx1ZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIHRvIGJlIGFsaWduZWQgd2l0aCB0aGUgdGl0bGUgdGhhdCBpcyBzaG93biBpbiB0aGUgYW5jaG9yIGJhciAob3IgaWNvbiB0YWIgYmFyKSBmb3IgdGhlIHNlY3Rpb24uIE1vcmVvdmVyLCB0aGUgdGl0bGUgb2YgdGhlIHN1YnNlY3Rpb24gKGFuZCBpZiBhcHBsaWNhYmxlIGFsc28gb2YgdGhlIHNlY3Rpb24pIGlzIGhpZGRlbiBpbiBvcmRlciB0byBwcmV2ZW50IHJlZHVuZGFudCB0aXRsZXMsIGlmIHRoZSBzdWJzZWN0aW9uIHBvc3Nlc3NlcyBhIHRpdGxlIG93bmVyLlxuXHQgKiBIaW50OiBJZiB5b3UgY2hvb3NlIHRvIHNldCBzYXAubS5UaXRsZSBhcyB0aGUgdGl0bGUgb3duZXIsIHN0eWxpbmcgYWRqdXN0bWVudHMgbWF5IGJlIHJlcXVpcmVkIGluIHRoZSBjdXN0b20gdmlldy4gRm9yIGV4YW1wbGUsIGlmIHNhcC5tLlRpdGxlIGlzIHNldCBhcyB0aXRsZSBvd25lciB3aGljaCBiZWxvbmdzIHRvIHNhcC5tLk92ZXJmbG93VG9vbGJhciBvciB0byBzYXAubS5Ub29sYmFyLCB0aGVuIHRoZSDigJhkZXNpZ27igJkgcHJvcGVydHkgb2YgdGhlIHRvb2xiYXIgY29udHJvbCBpcyB0byBiZSBzZXQgdG8g4oCYVHJhbnNwYXJlbnTigJkuXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBzaW5nbGUgY29udGVudCBjb250cm9sIGNhbiBiZSBlaXRoZXIgb25lIG9mIHRoZSBzdGFuZGFyZCBidWlsZGluZyBibG9ja3MgKEZvcm0sIENoYXJ0LCBUYWJsZSksIG9yIHJldXNlIGNvbXBvbmVudHMsIG9yIHNhcC5tLlRpdGxlLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRzZXRBc1NlY3Rpb25UaXRsZU93bmVyKGNvbnRyb2w6IE1hbmFnZWRPYmplY3QpOiB2b2lkIHtcblx0XHRsZXQgc2VjdGlvbjtcblx0XHRjb25zdCBvcmlnaW5hbENvbnRyb2wgPSBjb250cm9sO1xuXHRcdGxldCByZXVzZUNvbXBvbmVudDtcblx0XHR3aGlsZSAoY29udHJvbCkge1xuXHRcdFx0aWYgKGNvbnRyb2wuaXNBPFNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5TZWN0aW9uXCIpKSB7XG5cdFx0XHRcdHNlY3Rpb24gPSBjb250cm9sO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmIChjb250cm9sLmlzQTxSZXVzZUNvbXBvbmVudD4oXCJzYXAuZmUuY29yZS5SZXVzZUNvbXBvbmVudFwiKSkge1xuXHRcdFx0XHRjb250cm9sID0gY29udHJvbC5jb250YWluZXIuZ2V0UGFyZW50KCkgYXMgQ29udHJvbDtcblx0XHRcdFx0cmV1c2VDb21wb25lbnQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udHJvbFBhcmVudCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAoY29udHJvbFBhcmVudCkge1xuXHRcdFx0XHRjb250cm9sID0gY29udHJvbFBhcmVudDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoc2VjdGlvbikge1xuXHRcdFx0aWYgKHJldXNlQ29tcG9uZW50ICYmIHNlY3Rpb24uZ2V0VmlzaWJsZVN1YlNlY3Rpb25zKCkubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRzZWN0aW9uLmFkanVzdEZvclNpbmdsZUNvbnRlbnQob3JpZ2luYWxDb250cm9sLCB7IG11bHRpcGxlU3ViU2VjdGlvbnNXaXRoUmV1c2VDb21wb25lbnQ6IHRydWUgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWN0aW9uLmFkanVzdEZvclNpbmdsZUNvbnRlbnQob3JpZ2luYWxDb250cm9sKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0UGFnZUV4dGVuc2lvbkFQSTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7RUErQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkEsSUFVTUEsc0JBQXNCLElBQUFDLElBQUEsR0FEM0JDLGNBQWMsQ0FBQywwQ0FBMEMsQ0FBQyxFQUFBRCxJQUFBLENBQUFFLE1BQUEsMEJBQUFDLGFBQUE7SUFBQSxTQUFBSix1QkFBQTtNQUFBLE9BQUFJLGFBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0lBQUE7SUFBQUMsY0FBQSxDQUFBUCxzQkFBQSxFQUFBSSxhQUFBO0lBQUEsSUFBQUksTUFBQSxHQUFBUixzQkFBQSxDQUFBUyxTQUFBO0lBRTFEO0FBQ0Q7QUFDQTtJQUdDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFQQ0QsTUFBQSxDQVFNRSxPQUFPLEdBQWIsZUFBTUEsT0FBT0EsQ0FBQ0MsS0FBeUIsRUFBaUI7TUFDdkQsTUFBTUMsZUFBZSxHQUFHLElBQUksQ0FBQ0MsS0FBSyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO01BQ3RELElBQUksQ0FBQ0YsZUFBZSxFQUFFO1FBQ3JCO1FBQ0EsT0FBT0csT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztNQUN6QjtNQUNBLE1BQU1DLGFBQWEsR0FBR0MsV0FBVyxDQUFDQyxlQUFlLENBQUMsSUFBSSxDQUFDTixLQUFLLENBQUM7UUFDNURPLG1CQUFtQixHQUFHSCxhQUFh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
|