@sapui5/sap.fe.core 1.121.3 → 1.121.6

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.
@@ -2,13 +2,13 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/DataLossOrDraftDiscard/DraftDataLossDialog.block", "../../controls/Recommendations/ConfirmRecommendationDialog.block"], function (Log, EditState, DraftDataLossDialogBlock, ConfirmRecommendationDialog_block) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "../../controls/DataLossOrDraftDiscard/DraftDataLossDialog.block", "../../controls/Recommendations/ConfirmRecommendationDialog.block"], function (Log, EditState, ModelHelper, DraftDataLossDialogBlock, ConfirmRecommendationDialog_block) {
6
6
  "use strict";
7
7
 
8
8
  var RecommendationDialogDecision = ConfirmRecommendationDialog_block.RecommendationDialogDecision;
9
9
  /* Enum for navigation types */
10
10
  var NavigationType;
11
- /* Enum types for the dataloss dialog options */
11
+ /* Enum types for the data loss dialog options */
12
12
  (function (NavigationType) {
13
13
  NavigationType["BackNavigation"] = "BackNavigation";
14
14
  NavigationType["ForwardNavigation"] = "ForwardNavigation";
@@ -19,7 +19,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
19
19
  DraftDataLossOptions["Keep"] = "draftDataLossOptionKeep";
20
20
  DraftDataLossOptions["Discard"] = "draftDataLossOptionDiscard";
21
21
  })(DraftDataLossOptions || (DraftDataLossOptions = {}));
22
- /*Create the dataloss dialog*/
22
+ /*Create the data loss dialog*/
23
23
  const dataLossDialog = new DraftDataLossDialogBlock({});
24
24
 
25
25
  /**
@@ -30,28 +30,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
30
30
  */
31
31
  function silentlyKeepDraftOnForwardNavigation(pageController) {
32
32
  var _oManifest$app;
33
- let rbSilentlyKeep = false;
33
+ let rbSilentlyKeep;
34
34
  const oManifest = pageController.getAppComponent().getManifestEntry("sap.fe");
35
35
  rbSilentlyKeep = (oManifest === null || oManifest === void 0 ? void 0 : (_oManifest$app = oManifest.app) === null || _oManifest$app === void 0 ? void 0 : _oManifest$app.silentlyKeepDraftOnForwardNavigation) || false;
36
36
  return rbSilentlyKeep;
37
37
  }
38
38
 
39
39
  /**
40
- * Logic to process the fcl mode.
40
+ * Logic to process the FCL mode.
41
41
  *
42
42
  * @param draftAdminData Admin data
43
43
  * @param fnCancelFunction The cancel function
44
44
  * @param oController The current controller referenced
45
- * @param processFunctionForDrafts The functon to process the handler
45
+ * @param processFunctionForDrafts The function to process the handler
46
46
  * @param bSkipBindingToView The optional parameter to skip the binding to the view
47
+ * @param context The context to be used for the draft operation
47
48
  * @returns Nothing
48
49
  */
49
- async function processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView) {
50
+ async function processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, context) {
50
51
  // The application is running in FCL mode so in this case we fall back to
51
52
  // the old logic since the dirty state handling is not properly working
52
53
  // for FCL.
53
54
  if (draftAdminData.CreationDateTime !== draftAdminData.LastChangeDateTime) {
54
- return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView));
55
+ return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
55
56
  } else {
56
57
  processFunctionForDrafts();
57
58
  }
@@ -63,14 +64,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
63
64
  * @param draftAdminData Admin data
64
65
  * @param fnCancelFunction The cancel function
65
66
  * @param oController The current controller referenced
66
- * @param processFunctionForDrafts The functon to process the handler
67
+ * @param processFunctionForDrafts The function to process the handler
67
68
  * @param navigationType The navigation type for which the function should be called
68
69
  * @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
69
70
  * @param bSkipBindingToView The optional parameter to skip the binding to the view
71
+ * @param context The context to be used for the draft operations
70
72
  * @returns Nothing
71
73
  */
72
- async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView) {
73
- // There is no active entity so we are editing either newly created data or
74
+ async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context) {
75
+ // There is no active entity so, we are editing either newly created data or
74
76
  // a draft which has never been saved to active version
75
77
  // Since we want to react differently in the two situations, we have to check the
76
78
  // dirty state
@@ -80,7 +82,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
80
82
  // navigation we can silently discard the draft again
81
83
  // eslint-disable-next-line promise/no-nesting
82
84
  try {
83
- await draftDataLossPopup.discardDraft(oController, bSkipBindingToView);
85
+ await draftDataLossPopup.discardDraft(oController, bSkipBindingToView, context);
84
86
  processFunctionForDrafts();
85
87
  } catch (error) {
86
88
  Log.error("Error while canceling the document", error);
@@ -91,8 +93,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
91
93
  processFunctionForDrafts();
92
94
  } else {
93
95
  // In this case data is being changed or a forward navigation is triggered
94
- // and we always want to show the dataloss dialog on navigation
95
- return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView));
96
+ // and, we always want to show the data loss dialog on navigation
97
+ return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
96
98
  }
97
99
  } else {
98
100
  // We are editing a draft which has been created earlier but never saved to active
@@ -107,7 +109,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
107
109
  *
108
110
  * @param oController The current controller referenced.
109
111
  * @param oContext The context of the current call
110
- * @param processFunctionForDrafts The functon to process the handler
112
+ * @param processFunctionForDrafts The function to process the handler
111
113
  * @param navigationType The navigation type for which the function should be called
112
114
  */
113
115
  async function processEditingDraftForExistingEntity(oController, oContext, processFunctionForDrafts, navigationType) {
@@ -115,8 +117,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
115
117
  // The CreationDateTime and LastChangeDateTime are equal, so this draft was
116
118
  // never saved before, hence we're currently editing a newly created draft for
117
119
  // an existing active entity for the first time.
118
- // Also there have so far been no changes made to the draft and in this
119
- // case we want to silently navigate and delete the draftin case of a back
120
+ // Also, there have so far been no changes made to the draft and in this
121
+ // case we want to silently navigate and delete the draft in case of a back
120
122
  // navigation but in case of a forward navigation we want to silently keep it!
121
123
  if (navigationType === NavigationType.BackNavigation) {
122
124
  const mParameters = {
@@ -136,17 +138,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
136
138
  }
137
139
 
138
140
  /**
139
- * Logic to process the edit state dirty.
141
+ * Logic to process the context when the edit state is in dirty mode.
140
142
  *
141
143
  * @param oController The current controller referenced.
142
144
  * @param fnCancelFunction The cancel function
143
- * @param processFunctionForDrafts The functon to process the handler
145
+ * @param processFunctionForDrafts The function to process the handler
144
146
  * @param navigationType The navigation type for which the function should be called
145
147
  * @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
146
148
  * @param bSkipBindingToView The optional parameter to skip the binding to the view.
149
+ * @param context The context to be used for the draft operations
147
150
  * @returns Nothing
148
151
  */
149
- async function processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView) {
152
+ async function processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context) {
150
153
  if (navigationType === NavigationType.ForwardNavigation && bSilentlyKeepDraftOnForwardNavigation) {
151
154
  // In case we have a "forward navigation" and an additional parameter set in the manifest
152
155
  // we "silently" keep the draft
@@ -155,9 +158,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
155
158
  // The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
156
159
  // an existing draft and need to distinguish depending on if any changes
157
160
  // have been made in the current editing session or not
158
- // Changes have been made in the current editing session so we want
159
- // to show the dataloss dialog and let the user decide
160
- return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView));
161
+ // Changes have been made in the current editing session, so we want
162
+ // to show the data loss dialog and let the user decide
163
+ return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
161
164
  }
162
165
  }
163
166
 
@@ -165,7 +168,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
165
168
  * Logic to process the admin data.
166
169
  *
167
170
  * @param draftAdminData Admin data
168
- * @param fnProcessFunction The functon to process the handler
171
+ * @param fnProcessFunction The function to process the handler
169
172
  * @param fnCancelFunction The cancel function
170
173
  * @param oContext The context of the current call
171
174
  * @param oController The current controller referenced
@@ -186,7 +189,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
186
189
  const bSilentlyKeepDraftOnForwardNavigation = silentlyKeepDraftOnForwardNavigation(oController);
187
190
  if (draftAdminData) {
188
191
  if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
189
- await processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView);
192
+ await processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, oContext);
190
193
  } else if (!oContext.getObject().HasActiveEntity) {
191
194
  processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView);
192
195
  } else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
@@ -196,7 +199,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
196
199
  } else {
197
200
  // The user started editing the existing draft but did not make any changes
198
201
  // in the current editing session, so in this case we do not want
199
- // to show the dataloss dialog but just keep the draft
202
+ // to show the data loss dialog but just keep the draft
200
203
  processFunctionForDrafts();
201
204
  }
202
205
  } else {
@@ -223,15 +226,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
223
226
  const isDraftRoot = entitySetName ? !!oMetaModel.getObject("/" + entitySetName + "@com.sap.vocabularies.Common.v1.DraftRoot") : false;
224
227
  const oUIModel = oView.getModel("ui");
225
228
  const bIsEditable = oUIModel.getProperty("/isEditable");
226
- const draftDataContext = oModel.bindContext(`${oContext.getPath()}/DraftAdministrativeData`).getBoundContext();
229
+ const originalContext = oContext;
230
+ let draftRootPath = oContext.getPath();
231
+ if (!isDraftRoot) {
232
+ draftRootPath = ModelHelper.getDraftRootPath(oContext) ?? draftRootPath;
233
+ }
234
+ oContext = oModel.bindContext(draftRootPath, undefined, {
235
+ $expand: "DraftAdministrativeData"
236
+ }).getBoundContext();
227
237
 
228
238
  // Shouldn't display data loss popover on shell back navigation from sub-object pages
229
239
  // or when object page is in display mode, or when the object is deleted
230
- if (oContext.isDeleted() || !isDraftRoot && navigationType === NavigationType.BackNavigation || !bIsEditable) {
240
+ if (originalContext.isDeleted() || !isDraftRoot && navigationType === NavigationType.BackNavigation || !bIsEditable) {
231
241
  fnProcessFunction();
232
242
  } else {
233
243
  try {
234
- const draftAdminData = await draftDataContext.requestObject();
244
+ const draftAdminData = await oContext.requestObject("DraftAdministrativeData");
235
245
  await processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView, navigationType);
236
246
  } catch (oError) {
237
247
  Log.error("Cannot retrieve draftDataContext information", oError);
@@ -245,11 +255,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
245
255
  * from EditFlow is called.
246
256
  *
247
257
  * @param controller Controller of the current view
258
+ * @param context The context to be used for the draft operations
248
259
  * @returns A promise resolved if the save was successful
249
260
  */
250
- async function saveDocument(controller) {
251
- const context = controller.getView().getBindingContext();
252
- if (controller.isA("sap.fe.templates.ObjectPage.ObjectPageController")) {
261
+ async function saveDocument(controller, context) {
262
+ const hasInitialContext = context !== undefined;
263
+ context = context ?? controller.getView().getBindingContext();
264
+ if (!hasInitialContext && controller.isA("sap.fe.templates.ObjectPage.ObjectPageController")) {
253
265
  return controller._saveDocument();
254
266
  } else {
255
267
  return controller.editFlow.saveDocument(context, {});
@@ -261,10 +273,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
261
273
  *
262
274
  * @param controller Controller of the current view
263
275
  * @param skipBindingToView The parameter to skip the binding to the view
276
+ * @param context The context to be used for the draft operations
264
277
  * @returns A promise resolved if cancelDocument was successful
265
278
  */
266
- async function discardDraft(controller, skipBindingToView) {
267
- const context = controller.getView().getBindingContext();
279
+ async function discardDraft(controller, skipBindingToView, context) {
280
+ context = context ?? controller.getView().getBindingContext();
268
281
  const params = {
269
282
  skipBackNavigation: true,
270
283
  skipDiscardPopover: true,
@@ -274,18 +287,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
274
287
  }
275
288
 
276
289
  /**
277
- * Executes the follow-up functions after an option was selected in the dataloss dialog.
290
+ * Executes the follow-up functions after an option was selected in the data loss dialog.
278
291
  *
279
- * @param selectedKey The key of the selected option from the dataloss dialog
292
+ * @param selectedKey The key of the selected option from the data loss dialog
280
293
  * @param processFunctionForDrafts The function to process the handler
281
294
  * @param fnCancelFunction The function to process the handler
282
295
  * @param controller Controller of the current view
283
296
  * @param skipBindingToView The parameter to skip the binding to the view
297
+ * @param context The context to be used for the binding
284
298
  */
285
- function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView) {
299
+ function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView, context) {
286
300
  switch (selectedKey) {
287
301
  case DraftDataLossOptions.Save:
288
- draftDataLossPopup.saveDocument(controller).then(context => processFunctionForDrafts(context)).catch(function (error) {
302
+ draftDataLossPopup.saveDocument(controller, context).then(context => processFunctionForDrafts(context)).catch(function (error) {
289
303
  if (error === RecommendationDialogDecision.Continue) {
290
304
  return fnCancelFunction();
291
305
  }
@@ -298,7 +312,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
298
312
  dataLossDialog.close();
299
313
  break;
300
314
  case DraftDataLossOptions.Discard:
301
- draftDataLossPopup.discardDraft(controller, skipBindingToView).then(context => processFunctionForDrafts(context)).catch(function (error) {
315
+ draftDataLossPopup.discardDraft(controller, skipBindingToView, context).then(context => processFunctionForDrafts(context)).catch(function (error) {
302
316
  Log.error("Error while discarding draft", error);
303
317
  });
304
318
  dataLossDialog.close();
@@ -322,4 +336,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
322
336
  };
323
337
  return draftDataLossPopup;
324
338
  }, false);
325
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2siLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJwYWdlQ29udHJvbGxlciIsInJiU2lsZW50bHlLZWVwIiwib01hbmlmZXN0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0TWFuaWZlc3RFbnRyeSIsImFwcCIsInByb2Nlc3NGY2xNb2RlIiwiZHJhZnRBZG1pbkRhdGEiLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwib3BlbiIsInRoZW4iLCJzZWxlY3RlZEtleSIsImRyYWZ0RGF0YUxvc3NQb3B1cCIsImhhbmRsZURpYWxvZ1NlbGVjdGlvbiIsInByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUiLCJuYXZpZ2F0aW9uVHlwZSIsImJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5IiwiQmFja05hdmlnYXRpb24iLCJkaXNjYXJkRHJhZnQiLCJlcnJvciIsIkxvZyIsIkZvcndhcmROYXZpZ2F0aW9uIiwicHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5Iiwib0NvbnRleHQiLCJtUGFyYW1ldGVycyIsInNraXBEaXNjYXJkUG9wb3ZlciIsImVkaXRGbG93IiwiY2FuY2VsRG9jdW1lbnQiLCJwcm9jZXNzRWRpdFN0YXRlRGlydHkiLCJwcm9jZXNzRHJhZnRBZG1pbkRhdGEiLCJmblByb2Nlc3NGdW5jdGlvbiIsImNvbGxhYm9yYXRpb25Db25uZWN0ZWQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJpc0Nvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJhcmdzIiwiYXBwbHkiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJpc0ZjbEVuYWJsZWQiLCJnZXRPYmplY3QiLCJIYXNBY3RpdmVFbnRpdHkiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIm9WaWV3IiwiZ2V0VmlldyIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImVudGl0eVNldE5hbWUiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsImlzRHJhZnRSb290Iiwib1VJTW9kZWwiLCJiSXNFZGl0YWJsZSIsImdldFByb3BlcnR5IiwiZHJhZnREYXRhQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0UGF0aCIsImdldEJvdW5kQ29udGV4dCIsImlzRGVsZXRlZCIsInJlcXVlc3RPYmplY3QiLCJvRXJyb3IiLCJzYXZlRG9jdW1lbnQiLCJjb250cm9sbGVyIiwiY29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNBIiwiX3NhdmVEb2N1bWVudCIsInNraXBCaW5kaW5nVG9WaWV3IiwicGFyYW1zIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwidW5kZWZpbmVkIiwiU2F2ZSIsImNhdGNoIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiY2xvc2UiLCJLZWVwIiwiRGlzY2FyZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnREYXRhTG9zc1BvcHVwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUNvbnRyb2xsZXJDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgRHJhZnREYXRhTG9zc0RpYWxvZ0Jsb2NrIGZyb20gXCIuLi8uLi9jb250cm9scy9EYXRhTG9zc09yRHJhZnREaXNjYXJkL0RyYWZ0RGF0YUxvc3NEaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB7IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfSBmcm9tIFwiLi4vLi4vY29udHJvbHMvUmVjb21tZW5kYXRpb25zL0NvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZy5ibG9ja1wiO1xuXG4vKiBFbnVtIGZvciBuYXZpZ2F0aW9uIHR5cGVzICovXG5lbnVtIE5hdmlnYXRpb25UeXBlIHtcblx0QmFja05hdmlnYXRpb24gPSBcIkJhY2tOYXZpZ2F0aW9uXCIsXG5cdEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXG59XG5cbi8qIEVudW0gdHlwZXMgZm9yIHRoZSBkYXRhbG9zcyBkaWFsb2cgb3B0aW9ucyAqL1xuZW51bSBEcmFmdERhdGFMb3NzT3B0aW9ucyB7XG5cdFNhdmUgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25TYXZlXCIsXG5cdEtlZXAgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25LZWVwXCIsXG5cdERpc2NhcmQgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25EaXNjYXJkXCJcbn1cblxudHlwZSBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSA9IHtcblx0Q3JlYXRpb25EYXRlVGltZTogRGF0ZTtcblx0TGFzdENoYW5nZURhdGVUaW1lOiBEYXRlO1xufTtcblxuLypDcmVhdGUgdGhlIGRhdGFsb3NzIGRpYWxvZyovXG5jb25zdCBkYXRhTG9zc0RpYWxvZyA9IG5ldyBEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2soe30pO1xuXG4vKipcbiAqIFRoZSBtZXRob2QgY2hlY2tzIHdoZXRoZXIgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGluIHRoZSBtYW5pZmVzdCBpcyBzZXQgdG8gc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgaW4gY2FzZSBhIGZvcndhcmQgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250cm9sbGVyIFRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgUGFnZUNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWUgd2l0aCB0cnVlIG9yIGZhbHNlIHRvIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0XG4gKi9cbmZ1bmN0aW9uIHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbihwYWdlQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpOiBib29sZWFuIHtcblx0bGV0IHJiU2lsZW50bHlLZWVwID0gZmFsc2U7XG5cdGNvbnN0IG9NYW5pZmVzdCA9IHBhZ2VDb250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuZmVcIik7XG5cdHJiU2lsZW50bHlLZWVwID0gb01hbmlmZXN0Py5hcHA/LnNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiB8fCBmYWxzZTtcblx0cmV0dXJuIHJiU2lsZW50bHlLZWVwO1xufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGZjbCBtb2RlLlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdG9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGY2xNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBUaGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBGQ0wgbW9kZSBzbyBpbiB0aGlzIGNhc2Ugd2UgZmFsbCBiYWNrIHRvXG5cdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdC8vIGZvciBGQ0wuXG5cdGlmIChkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lICE9PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gZGF0YUxvc3NEaWFsb2dcblx0XHRcdC5vcGVuKG9Db250cm9sbGVyKVxuXHRcdFx0LnRoZW4oKHNlbGVjdGVkS2V5KSA9PlxuXHRcdFx0XHRkcmFmdERhdGFMb3NzUG9wdXAuaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRcdFx0XHRcdHNlbGVjdGVkS2V5IGFzIHN0cmluZyxcblx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXdcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0fSBlbHNlIHtcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIG1vZGUgd2l0aCBubyBhY3RpdmUgZW50aXR5LlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdG9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gVGhlIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBza2lwIHRoZSBwb3B1cCBhcHBlYXJhbmNlIGluIGZvcndhcmQgY2FzZVxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBUaGVyZSBpcyBubyBhY3RpdmUgZW50aXR5IHNvIHdlIGFyZSBlZGl0aW5nIGVpdGhlciBuZXdseSBjcmVhdGVkIGRhdGEgb3Jcblx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHQvLyBTaW5jZSB3ZSB3YW50IHRvIHJlYWN0IGRpZmZlcmVudGx5IGluIHRoZSB0d28gc2l0dWF0aW9ucywgd2UgaGF2ZSB0byBjaGVjayB0aGVcblx0Ly8gZGlydHkgc3RhdGVcblx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0Ly8gaW4gY2FzZSB3ZSBoYXZlIHVudG91Y2hlZCBjaGFuZ2VzIGZvciB0aGUgZHJhZnQgYW5kIGEgXCJiYWNrXCJcblx0XHRcdC8vIG5hdmlnYXRpb24gd2UgY2FuIHNpbGVudGx5IGRpc2NhcmQgdGhlIGRyYWZ0IGFnYWluXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9uby1uZXN0aW5nXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBkcmFmdERhdGFMb3NzUG9wdXAuZGlzY2FyZERyYWZ0KG9Db250cm9sbGVyLCBiU2tpcEJpbmRpbmdUb1ZpZXcpO1xuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0XHQvLyBJbiBjYXNlIHdlIGhhdmUgYSBcImZvcndhcmQgbmF2aWdhdGlvblwiIGFuZCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgZGF0YSBpcyBiZWluZyBjaGFuZ2VkIG9yIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHRcdFx0Ly8gYW5kIHdlIGFsd2F5cyB3YW50IHRvIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRyZXR1cm4gZGF0YUxvc3NEaWFsb2dcblx0XHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHRcdC50aGVuKChzZWxlY3RlZEtleSkgPT5cblx0XHRcdFx0XHRkcmFmdERhdGFMb3NzUG9wdXAuaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGRyYWZ0IGVkaXRpbmcgZm9yIGV4aXN0aW5nIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0b24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eShcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFdlIGFyZSBlZGl0aW5nIGEgZHJhZnQgZm9yIGFuIGV4aXN0aW5nIGFjdGl2ZSBlbnRpdHlcblx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdC8vIG5ldmVyIHNhdmVkIGJlZm9yZSwgaGVuY2Ugd2UncmUgY3VycmVudGx5IGVkaXRpbmcgYSBuZXdseSBjcmVhdGVkIGRyYWZ0IGZvclxuXHQvLyBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5IGZvciB0aGUgZmlyc3QgdGltZS5cblx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0Ly8gY2FzZSB3ZSB3YW50IHRvIHNpbGVudGx5IG5hdmlnYXRlIGFuZCBkZWxldGUgdGhlIGRyYWZ0aW4gY2FzZSBvZiBhIGJhY2tcblx0Ly8gbmF2aWdhdGlvbiBidXQgaW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIHNpbGVudGx5IGtlZXAgaXQhXG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24pIHtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZVxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgb0NvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIEVycm9yKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBhbmQgb25seVxuXHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgZWRpdCBzdGF0ZSBkaXJ0eS5cbiAqXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3RvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEBwYXJhbSBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIFRoZSBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2tpcCB0aGUgcG9wdXAgYXBwZWFyYW5jZSBpbiBmb3J3YXJkIGNhc2VcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3LlxuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSxcblx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb24gJiYgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbikge1xuXHRcdC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fSBlbHNlIHtcblx0XHQvLyBUaGUgQ3JlYXRpb25EYXRlVGltZSBhbmQgTGFzdENoYW5nZURhdGVUaW1lIGFyZSBOT1QgZXF1YWwsIHNvIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZ1xuXHRcdC8vIGFuIGV4aXN0aW5nIGRyYWZ0IGFuZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIGRlcGVuZGluZyBvbiBpZiBhbnkgY2hhbmdlc1xuXHRcdC8vIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBvciBub3Rcblx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBzbyB3ZSB3YW50XG5cdFx0Ly8gdG8gc2hvdyB0aGUgZGF0YWxvc3MgZGlhbG9nIGFuZCBsZXQgdGhlIHVzZXIgZGVjaWRlXG5cdFx0cmV0dXJuIGRhdGFMb3NzRGlhbG9nXG5cdFx0XHQub3BlbihvQ29udHJvbGxlcilcblx0XHRcdC50aGVuKChzZWxlY3RlZEtleSkgPT5cblx0XHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwLmhhbmRsZURpYWxvZ1NlbGVjdGlvbihcblx0XHRcdFx0XHRzZWxlY3RlZEtleSBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBhZG1pbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5Qcm9jZXNzRnVuY3Rpb24gVGhlIGZ1bmN0b24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RyYWZ0QWRtaW5EYXRhKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBvQ29udHJvbGxlci5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0XHRcdG9Db250cm9sbGVyLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLmFwcGx5KG51bGwsIC4uLmFyZ3MpO1xuXHRcdCAgfTtcblxuXHRjb25zdCBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uID0gc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKG9Db250cm9sbGVyKTtcblxuXHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGF3YWl0IHByb2Nlc3NGY2xNb2RlKGRyYWZ0QWRtaW5EYXRhLCBmbkNhbmNlbEZ1bmN0aW9uLCBvQ29udHJvbGxlciwgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLCBiU2tpcEJpbmRpbmdUb1ZpZXcpO1xuXHRcdH0gZWxzZSBpZiAoIW9Db250ZXh0LmdldE9iamVjdCgpLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0cHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlLFxuXHRcdFx0XHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXdcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpIHtcblx0XHRcdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eShvQ29udHJvbGxlciwgb0NvbnRleHQsIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cywgbmF2aWdhdGlvblR5cGUpO1xuXHRcdH0gZWxzZSBpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0cHJvY2Vzc0VkaXRTdGF0ZURpcnR5KFxuXHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRuYXZpZ2F0aW9uVHlwZSxcblx0XHRcdFx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGdlbmVyYWwgaGFuZGxlciBpbiB3aGljaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyBhcmUgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBlbnRpdHlTZXROYW1lID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgeyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSkuZW50aXR5U2V0O1xuXHRjb25zdCBpc0RyYWZ0Um9vdCA9IGVudGl0eVNldE5hbWUgPyAhIW9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgZW50aXR5U2V0TmFtZSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIikgOiBmYWxzZTtcblx0Y29uc3Qgb1VJTW9kZWwgPSBvVmlldy5nZXRNb2RlbChcInVpXCIpO1xuXHRjb25zdCBiSXNFZGl0YWJsZSA9IG9VSU1vZGVsLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdC8vIFNob3VsZG4ndCBkaXNwbGF5IGRhdGEgbG9zcyBwb3BvdmVyIG9uIHNoZWxsIGJhY2sgbmF2aWdhdGlvbiBmcm9tIHN1Yi1vYmplY3QgcGFnZXNcblx0Ly8gb3Igd2hlbiBvYmplY3QgcGFnZSBpcyBpbiBkaXNwbGF5IG1vZGUsIG9yIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkXG5cdGlmIChvQ29udGV4dC5pc0RlbGV0ZWQoKSB8fCAoIWlzRHJhZnRSb290ICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikgfHwgIWJJc0VkaXRhYmxlKSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdGF3YWl0IHByb2Nlc3NEcmFmdEFkbWluRGF0YShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGVcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uKCk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogU2F2ZXMgdGhlIGRvY3VtZW50LiBJZiB0aGUgY29udHJvbGxlciBpcyBvZiB0eXBlIE9iamVjdFBhZ2UsIHRoZW4gaW50ZXJuYWwgX3NhdmVEb2N1bWVudCBpcyBjYWxsZWQsIG90aGVyd2lzZSBzYXZlRG9jdW1lbnRcbiAqIGZyb20gRWRpdEZsb3cgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmVkIGlmIHRoZSBzYXZlIHdhcyBzdWNjZXNzZnVsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVEb2N1bWVudChjb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcik6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0aWYgKGNvbnRyb2xsZXIuaXNBPE9iamVjdFBhZ2VDb250cm9sbGVyQ29udHJvbGxlcj4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIikpIHtcblx0XHRyZXR1cm4gY29udHJvbGxlci5fc2F2ZURvY3VtZW50KCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZWRpdEZsb3cuc2F2ZURvY3VtZW50KGNvbnRleHQsIHt9KTtcblx0fVxufVxuXG4vKipcbiAqIERpc2NhcmRzIHRoZSBkcmFmdC5cbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiBjYW5jZWxEb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNjYXJkRHJhZnQoY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdGNvbnN0IGNvbnRleHQgPSBjb250cm9sbGVyLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0c2tpcEJhY2tOYXZpZ2F0aW9uOiB0cnVlLFxuXHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZSxcblx0XHRza2lwQmluZGluZ1RvVmlldzogc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHVuZGVmaW5lZCA/IHNraXBCaW5kaW5nVG9WaWV3IDogdHJ1ZVxuXHR9O1xuXHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChjb250ZXh0LCBwYXJhbXMpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBmb2xsb3ctdXAgZnVuY3Rpb25zIGFmdGVyIGFuIG9wdGlvbiB3YXMgc2VsZWN0ZWQgaW4gdGhlIGRhdGFsb3NzIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0ZWRLZXkgVGhlIGtleSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZyb20gdGhlIGRhdGFsb3NzIGRpYWxvZ1xuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICovXG5mdW5jdGlvbiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdHNlbGVjdGVkS2V5OiBzdHJpbmcsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRjb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0c2tpcEJpbmRpbmdUb1ZpZXc6IGJvb2xlYW4gfCB1bmRlZmluZWRcbik6IHZvaWQge1xuXHRzd2l0Y2ggKHNlbGVjdGVkS2V5KSB7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5TYXZlOlxuXHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwXG5cdFx0XHRcdC5zYXZlRG9jdW1lbnQoY29udHJvbGxlcilcblx0XHRcdFx0LnRoZW4oKGNvbnRleHQ/KSA9PiBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoY29udGV4dCkpXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChlcnJvciA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuQ2FuY2VsRnVuY3Rpb24oKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5LZWVwOlxuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3KVxuXHRcdFx0XHQudGhlbigoY29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhjb250ZXh0KSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0RGF0YUxvc3NQb3B1cCA9IHtcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRwcm9jZXNzRmNsTW9kZTogcHJvY2Vzc0ZjbE1vZGUsXG5cdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGU6IHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUsXG5cdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eTogcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5LFxuXHRwcm9jZXNzRWRpdFN0YXRlRGlydHk6IHByb2Nlc3NFZGl0U3RhdGVEaXJ0eSxcblx0aGFuZGxlRGlhbG9nU2VsZWN0aW9uOiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24sXG5cdHNhdmVEb2N1bWVudDogc2F2ZURvY3VtZW50LFxuXHRkaXNjYXJkRHJhZnQ6IGRpc2NhcmREcmFmdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnREYXRhTG9zc1Bv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
339
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2siLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJwYWdlQ29udHJvbGxlciIsInJiU2lsZW50bHlLZWVwIiwib01hbmlmZXN0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0TWFuaWZlc3RFbnRyeSIsImFwcCIsInByb2Nlc3NGY2xNb2RlIiwiZHJhZnRBZG1pbkRhdGEiLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJjb250ZXh0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsIm9wZW4iLCJ0aGVuIiwic2VsZWN0ZWRLZXkiLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJoYW5kbGVEaWFsb2dTZWxlY3Rpb24iLCJwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlIiwibmF2aWdhdGlvblR5cGUiLCJiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIkJhY2tOYXZpZ2F0aW9uIiwiZGlzY2FyZERyYWZ0IiwiZXJyb3IiLCJMb2ciLCJGb3J3YXJkTmF2aWdhdGlvbiIsInByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlZGl0RmxvdyIsImNhbmNlbERvY3VtZW50IiwicHJvY2Vzc0VkaXRTdGF0ZURpcnR5IiwicHJvY2Vzc0RyYWZ0QWRtaW5EYXRhIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwiYXJncyIsImFwcGx5IiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiZ2V0T2JqZWN0IiwiSGFzQWN0aXZlRW50aXR5IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJvVmlldyIsImdldFZpZXciLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJlbnRpdHlTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJpc0RyYWZ0Um9vdCIsIm9VSU1vZGVsIiwiYklzRWRpdGFibGUiLCJnZXRQcm9wZXJ0eSIsIm9yaWdpbmFsQ29udGV4dCIsImRyYWZ0Um9vdFBhdGgiLCJnZXRQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXREcmFmdFJvb3RQYXRoIiwiYmluZENvbnRleHQiLCJ1bmRlZmluZWQiLCIkZXhwYW5kIiwiZ2V0Qm91bmRDb250ZXh0IiwiaXNEZWxldGVkIiwicmVxdWVzdE9iamVjdCIsIm9FcnJvciIsInNhdmVEb2N1bWVudCIsImNvbnRyb2xsZXIiLCJoYXNJbml0aWFsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNBIiwiX3NhdmVEb2N1bWVudCIsInNraXBCaW5kaW5nVG9WaWV3IiwicGFyYW1zIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwiU2F2ZSIsImNhdGNoIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiY2xvc2UiLCJLZWVwIiwiRGlzY2FyZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnREYXRhTG9zc1BvcHVwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlQ29udHJvbGxlckNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9PYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2sgZnJvbSBcIi4uLy4uL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRHJhZnREYXRhTG9zc0RpYWxvZy5ibG9ja1wiO1xuaW1wb3J0IHsgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi8uLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLmJsb2NrXCI7XG5cbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cblxuLyogRW51bSB0eXBlcyBmb3IgdGhlIGRhdGEgbG9zcyBkaWFsb2cgb3B0aW9ucyAqL1xuZW51bSBEcmFmdERhdGFMb3NzT3B0aW9ucyB7XG5cdFNhdmUgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25TYXZlXCIsXG5cdEtlZXAgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25LZWVwXCIsXG5cdERpc2NhcmQgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25EaXNjYXJkXCJcbn1cblxudHlwZSBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSA9IHtcblx0Q3JlYXRpb25EYXRlVGltZTogRGF0ZTtcblx0TGFzdENoYW5nZURhdGVUaW1lOiBEYXRlO1xufTtcblxuLypDcmVhdGUgdGhlIGRhdGEgbG9zcyBkaWFsb2cqL1xuY29uc3QgZGF0YUxvc3NEaWFsb2cgPSBuZXcgRHJhZnREYXRhTG9zc0RpYWxvZ0Jsb2NrKHt9KTtcblxuLyoqXG4gKiBUaGUgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBpbiB0aGUgbWFuaWZlc3QgaXMgc2V0IHRvIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0IGluIGNhc2UgYSBmb3J3YXJkIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBwYXJhbSBwYWdlQ29udHJvbGxlciBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFBhZ2VDb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdpdGggdHJ1ZSBvciBmYWxzZSB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdFxuICovXG5mdW5jdGlvbiBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24ocGFnZUNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKTogYm9vbGVhbiB7XG5cdGxldCByYlNpbGVudGx5S2VlcDtcblx0Y29uc3Qgb01hbmlmZXN0ID0gcGFnZUNvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5mZVwiKTtcblx0cmJTaWxlbnRseUtlZXAgPSBvTWFuaWZlc3Q/LmFwcD8uc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIHx8IGZhbHNlO1xuXHRyZXR1cm4gcmJTaWxlbnRseUtlZXA7XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgRkNMIG1vZGUuXG4gKlxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGY2xNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0Ly8gdGhlIG9sZCBsb2dpYyBzaW5jZSB0aGUgZGlydHkgc3RhdGUgaGFuZGxpbmcgaXMgbm90IHByb3Blcmx5IHdvcmtpbmdcblx0Ly8gZm9yIEZDTC5cblx0aWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBtb2RlIHdpdGggbm8gYWN0aXZlIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0gZHJhZnRBZG1pbkRhdGEgQWRtaW4gZGF0YVxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZFxuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKiBAcGFyYW0gYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiBUaGUgcGFyYW1ldGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNraXAgdGhlIHBvcHVwIGFwcGVhcmFuY2UgaW4gZm9yd2FyZCBjYXNlXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFRoZXJlIGlzIG5vIGFjdGl2ZSBlbnRpdHkgc28sIHdlIGFyZSBlZGl0aW5nIGVpdGhlciBuZXdseSBjcmVhdGVkIGRhdGEgb3Jcblx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHQvLyBTaW5jZSB3ZSB3YW50IHRvIHJlYWN0IGRpZmZlcmVudGx5IGluIHRoZSB0d28gc2l0dWF0aW9ucywgd2UgaGF2ZSB0byBjaGVjayB0aGVcblx0Ly8gZGlydHkgc3RhdGVcblx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0Ly8gaW4gY2FzZSB3ZSBoYXZlIHVudG91Y2hlZCBjaGFuZ2VzIGZvciB0aGUgZHJhZnQgYW5kIGEgXCJiYWNrXCJcblx0XHRcdC8vIG5hdmlnYXRpb24gd2UgY2FuIHNpbGVudGx5IGRpc2NhcmQgdGhlIGRyYWZ0IGFnYWluXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9uby1uZXN0aW5nXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBkcmFmdERhdGFMb3NzUG9wdXAuZGlzY2FyZERyYWZ0KG9Db250cm9sbGVyLCBiU2tpcEJpbmRpbmdUb1ZpZXcsIGNvbnRleHQpO1xuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0XHQvLyBJbiBjYXNlIHdlIGhhdmUgYSBcImZvcndhcmQgbmF2aWdhdGlvblwiIGFuZCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgZGF0YSBpcyBiZWluZyBjaGFuZ2VkIG9yIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHRcdFx0Ly8gYW5kLCB3ZSBhbHdheXMgd2FudCB0byBzaG93IHRoZSBkYXRhIGxvc3MgZGlhbG9nIG9uIG5hdmlnYXRpb25cblx0XHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0XHQub3BlbihvQ29udHJvbGxlcilcblx0XHRcdFx0LnRoZW4oKHNlbGVjdGVkS2V5KSA9PlxuXHRcdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0XHRzZWxlY3RlZEtleSBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGRyYWZ0IGVkaXRpbmcgZm9yIGV4aXN0aW5nIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGVcbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IGZvciBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5XG5cdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIGVxdWFsLCBzbyB0aGlzIGRyYWZ0IHdhc1xuXHQvLyBuZXZlciBzYXZlZCBiZWZvcmUsIGhlbmNlIHdlJ3JlIGN1cnJlbnRseSBlZGl0aW5nIGEgbmV3bHkgY3JlYXRlZCBkcmFmdCBmb3Jcblx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdC8vIEFsc28sIHRoZXJlIGhhdmUgc28gZmFyIGJlZW4gbm8gY2hhbmdlcyBtYWRlIHRvIHRoZSBkcmFmdCBhbmQgaW4gdGhpc1xuXHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0Ly8gbmF2aWdhdGlvbiBidXQgaW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIHNpbGVudGx5IGtlZXAgaXQhXG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24pIHtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZVxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgb0NvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIEVycm9yKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBhbmQgb25seVxuXHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgY29udGV4dCB3aGVuIHRoZSBlZGl0IHN0YXRlIGlzIGluIGRpcnR5IG1vZGUuXG4gKlxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gVGhlIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBza2lwIHRoZSBwb3B1cCBhcHBlYXJhbmNlIGluIGZvcndhcmQgY2FzZVxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcuXG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uc1xuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSxcblx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0Ly8gSW4gY2FzZSB3ZSBoYXZlIGEgXCJmb3J3YXJkIG5hdmlnYXRpb25cIiBhbmQgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgc2V0IGluIHRoZSBtYW5pZmVzdFxuXHRcdC8vIHdlIFwic2lsZW50bHlcIiBrZWVwIHRoZSBkcmFmdFxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdC8vIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyB3ZSB3YW50XG5cdFx0Ly8gdG8gc2hvdyB0aGUgZGF0YSBsb3NzIGRpYWxvZyBhbmQgbGV0IHRoZSB1c2VyIGRlY2lkZVxuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBhZG1pbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5Qcm9jZXNzRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBjYWxsXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEcmFmdEFkbWluRGF0YShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmblByb2Nlc3NGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBjb2xsYWJvcmF0aW9uQ29ubmVjdGVkID0gb0NvbnRyb2xsZXIuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCk7XG5cdGNvbnN0IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyA9ICFjb2xsYWJvcmF0aW9uQ29ubmVjdGVkXG5cdFx0PyBmblByb2Nlc3NGdW5jdGlvblxuXHRcdDogZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0XHRvQ29udHJvbGxlci5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbi5hcHBseShudWxsLCAuLi5hcmdzKTtcblx0XHQgIH07XG5cblx0Y29uc3QgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiA9IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbihvQ29udHJvbGxlcik7XG5cblx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0aWYgKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRhd2FpdCBwcm9jZXNzRmNsTW9kZShkcmFmdEFkbWluRGF0YSwgZm5DYW5jZWxGdW5jdGlvbiwgb0NvbnRyb2xsZXIsIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cywgYlNraXBCaW5kaW5nVG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fSBlbHNlIGlmICghb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlKFxuXHRcdFx0XHRkcmFmdEFkbWluRGF0YSxcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGUsXG5cdFx0XHRcdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlld1xuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xuXHRcdFx0cHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5KG9Db250cm9sbGVyLCBvQ29udGV4dCwgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLCBuYXZpZ2F0aW9uVHlwZSk7XG5cdFx0fSBlbHNlIGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlLFxuXHRcdFx0XHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXdcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRoZSB1c2VyIHN0YXJ0ZWQgZWRpdGluZyB0aGUgZXhpc3RpbmcgZHJhZnQgYnV0IGRpZCBub3QgbWFrZSBhbnkgY2hhbmdlc1xuXHRcdFx0Ly8gaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnRcblx0XHRcdC8vIHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGdlbmVyYWwgaGFuZGxlciBpbiB3aGljaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyBhcmUgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBlbnRpdHlTZXROYW1lID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgeyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSkuZW50aXR5U2V0O1xuXHRjb25zdCBpc0RyYWZ0Um9vdCA9IGVudGl0eVNldE5hbWUgPyAhIW9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgZW50aXR5U2V0TmFtZSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIikgOiBmYWxzZTtcblx0Y29uc3Qgb1VJTW9kZWwgPSBvVmlldy5nZXRNb2RlbChcInVpXCIpO1xuXHRjb25zdCBiSXNFZGl0YWJsZSA9IG9VSU1vZGVsLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdGNvbnN0IG9yaWdpbmFsQ29udGV4dCA9IG9Db250ZXh0O1xuXHRsZXQgZHJhZnRSb290UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0aWYgKCFpc0RyYWZ0Um9vdCkge1xuXHRcdGRyYWZ0Um9vdFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KSA/PyBkcmFmdFJvb3RQYXRoO1xuXHR9XG5cdG9Db250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGRyYWZ0Um9vdFBhdGgsIHVuZGVmaW5lZCwgeyAkZXhwYW5kOiBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIgfSkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cblx0Ly8gU2hvdWxkbid0IGRpc3BsYXkgZGF0YSBsb3NzIHBvcG92ZXIgb24gc2hlbGwgYmFjayBuYXZpZ2F0aW9uIGZyb20gc3ViLW9iamVjdCBwYWdlc1xuXHQvLyBvciB3aGVuIG9iamVjdCBwYWdlIGlzIGluIGRpc3BsYXkgbW9kZSwgb3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWRcblx0aWYgKG9yaWdpbmFsQ29udGV4dC5pc0RlbGV0ZWQoKSB8fCAoIWlzRHJhZnRSb290ICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikgfHwgIWJJc0VkaXRhYmxlKSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRhd2FpdCBwcm9jZXNzRHJhZnRBZG1pbkRhdGEoXG5cdFx0XHRcdGRyYWZ0QWRtaW5EYXRhLFxuXHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbixcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIGRyYWZ0RGF0YUNvbnRleHQgaW5mb3JtYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBkb2N1bWVudC4gSWYgdGhlIGNvbnRyb2xsZXIgaXMgb2YgdHlwZSBPYmplY3RQYWdlLCB0aGVuIGludGVybmFsIF9zYXZlRG9jdW1lbnQgaXMgY2FsbGVkLCBvdGhlcndpc2Ugc2F2ZURvY3VtZW50XG4gKiBmcm9tIEVkaXRGbG93IGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2ZWQgaWYgdGhlIHNhdmUgd2FzIHN1Y2Nlc3NmdWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZURvY3VtZW50KGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLCBjb250ZXh0PzogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0Y29uc3QgaGFzSW5pdGlhbENvbnRleHQgPSBjb250ZXh0ICE9PSB1bmRlZmluZWQ7XG5cdGNvbnRleHQgPSBjb250ZXh0ID8/IGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdGlmICghaGFzSW5pdGlhbENvbnRleHQgJiYgY29udHJvbGxlci5pc0E8T2JqZWN0UGFnZUNvbnRyb2xsZXJDb250cm9sbGVyPihcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlclwiKSkge1xuXHRcdHJldHVybiBjb250cm9sbGVyLl9zYXZlRG9jdW1lbnQoKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5zYXZlRG9jdW1lbnQoY29udGV4dCwge30pO1xuXHR9XG59XG5cbi8qKlxuICogRGlzY2FyZHMgdGhlIGRyYWZ0LlxuICpcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiBjYW5jZWxEb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNjYXJkRHJhZnQoXG5cdGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRza2lwQmluZGluZ1RvVmlldzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0XG4pOiBQcm9taXNlPHVua25vd24+IHtcblx0Y29udGV4dCA9IGNvbnRleHQgPz8gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdHNraXBCYWNrTmF2aWdhdGlvbjogdHJ1ZSxcblx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWUsXG5cdFx0c2tpcEJpbmRpbmdUb1ZpZXc6IHNraXBCaW5kaW5nVG9WaWV3ICE9PSB1bmRlZmluZWQgPyBza2lwQmluZGluZ1RvVmlldyA6IHRydWVcblx0fTtcblx0cmV0dXJuIGNvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQoY29udGV4dCwgcGFyYW1zKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZm9sbG93LXVwIGZ1bmN0aW9ucyBhZnRlciBhbiBvcHRpb24gd2FzIHNlbGVjdGVkIGluIHRoZSBkYXRhIGxvc3MgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBzZWxlY3RlZEtleSBUaGUga2V5IG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gZnJvbSB0aGUgZGF0YSBsb3NzIGRpYWxvZ1xuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRzZWxlY3RlZEtleTogc3RyaW5nLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0Y29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHRcbik6IHZvaWQge1xuXHRzd2l0Y2ggKHNlbGVjdGVkS2V5KSB7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5TYXZlOlxuXHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwXG5cdFx0XHRcdC5zYXZlRG9jdW1lbnQoY29udHJvbGxlciwgY29udGV4dClcblx0XHRcdFx0LnRoZW4oKGNvbnRleHQ/KSA9PiBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoY29udGV4dCkpXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChlcnJvciA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuQ2FuY2VsRnVuY3Rpb24oKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5LZWVwOlxuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3LCBjb250ZXh0KVxuXHRcdFx0XHQudGhlbigoY29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhjb250ZXh0KSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0RGF0YUxvc3NQb3B1cCA9IHtcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRwcm9jZXNzRmNsTW9kZTogcHJvY2Vzc0ZjbE1vZGUsXG5cdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGU6IHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUsXG5cdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eTogcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5LFxuXHRwcm9jZXNzRWRpdFN0YXRlRGlydHk6IHByb2Nlc3NFZGl0U3RhdGVEaXJ0eSxcblx0aGFuZGxlRGlhbG9nU2VsZWN0aW9uOiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24sXG5cdHNhdmVEb2N1bWVudDogc2F2ZURvY3VtZW50LFxuXHRkaXNjYXJkRHJhZnQ6IGRpc2NhcmREcmFmdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnREYXRhTG9zc1BvcHVwO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7OztFQVNBO0VBQUEsSUFDS0EsY0FBYztFQUtuQjtFQUFBLFdBTEtBLGNBQWM7SUFBZEEsY0FBYztJQUFkQSxjQUFjO0VBQUEsR0FBZEEsY0FBYyxLQUFkQSxjQUFjO0VBQUEsSUFNZEMsb0JBQW9CO0VBQUEsV0FBcEJBLG9CQUFvQjtJQUFwQkEsb0JBQW9CO0lBQXBCQSxvQkFBb0I7SUFBcEJBLG9CQUFvQjtFQUFBLEdBQXBCQSxvQkFBb0IsS0FBcEJBLG9CQUFvQjtFQVd6QjtFQUNBLE1BQU1DLGNBQWMsR0FBRyxJQUFJQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0Msb0NBQW9DLENBQUNDLGNBQThCLEVBQVc7SUFBQTtJQUN0RixJQUFJQyxjQUFjO0lBQ2xCLE1BQU1DLFNBQVMsR0FBR0YsY0FBYyxDQUFDRyxlQUFlLEVBQUUsQ0FBQ0MsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQzdFSCxjQUFjLEdBQUcsQ0FBQUMsU0FBUyxhQUFUQSxTQUFTLHlDQUFUQSxTQUFTLENBQUVHLEdBQUcsbURBQWQsZUFBZ0JOLG9DQUFvQyxLQUFJLEtBQUs7SUFDOUUsT0FBT0UsY0FBYztFQUN0Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZUssY0FBYyxDQUM1QkMsY0FBdUMsRUFDdkNDLGdCQUEwQixFQUMxQkMsV0FBMkIsRUFDM0JDLHdCQUFrQyxFQUNsQ0Msa0JBQTRCLEVBQzVCQyxPQUF3QixFQUNSO0lBQ2hCO0lBQ0E7SUFDQTtJQUNBLElBQUlMLGNBQWMsQ0FBQ00sZ0JBQWdCLEtBQUtOLGNBQWMsQ0FBQ08sa0JBQWtCLEVBQUU7TUFDMUUsT0FBT2pCLGNBQWMsQ0FDbkJrQixJQUFJLENBQUNOLFdBQVcsQ0FBQyxDQUNqQk8sSUFBSSxDQUFFQyxXQUFXLElBQ2pCQyxrQkFBa0IsQ0FBQ0MscUJBQXFCLENBQ3ZDRixXQUFXLEVBQ1hQLHdCQUF3QixFQUN4QkYsZ0JBQWdCLEVBQ2hCQyxXQUFXLEVBQ1hFLGtCQUFrQixFQUNsQkMsT0FBTyxDQUNQLENBQ0Q7SUFDSCxDQUFDLE1BQU07TUFDTkYsd0JBQXdCLEVBQUU7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVVLHlCQUF5QixDQUN2Q2IsY0FBdUMsRUFDdkNDLGdCQUEwQixFQUMxQkMsV0FBMkIsRUFDM0JDLHdCQUFrQyxFQUNsQ1csY0FBOEIsRUFDOUJDLHFDQUE4QyxFQUM5Q1gsa0JBQTRCLEVBQzVCQyxPQUF3QixFQUNSO0lBQ2hCO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsSUFBSVcsU0FBUyxDQUFDQyxnQkFBZ0IsRUFBRSxFQUFFO01BQ2pDLElBQUlqQixjQUFjLENBQUNNLGdCQUFnQixLQUFLTixjQUFjLENBQUNPLGtCQUFrQixJQUFJTyxjQUFjLEtBQUsxQixjQUFjLENBQUM4QixjQUFjLEVBQUU7UUFDOUg7UUFDQTtRQUNBO1FBQ0EsSUFBSTtVQUNILE1BQU1QLGtCQUFrQixDQUFDUSxZQUFZLENBQUNqQixXQUFXLEVBQUVFLGtCQUFrQixFQUFFQyxPQUFPLENBQUM7VUFDL0VGLHdCQUF3QixFQUFFO1FBQzNCLENBQUMsQ0FBQyxPQUFPaUIsS0FBYyxFQUFFO1VBQ3hCQyxHQUFHLENBQUNELEtBQUssQ0FBQyxvQ0FBb0MsRUFBRUEsS0FBSyxDQUFXO1FBQ2pFO01BQ0QsQ0FBQyxNQUFNLElBQUlOLGNBQWMsS0FBSzFCLGNBQWMsQ0FBQ2tDLGlCQUFpQixJQUFJUCxxQ0FBcUMsRUFBRTtRQUN4RztRQUNBO1FBQ0FaLHdCQUF3QixFQUFFO01BQzNCLENBQUMsTUFBTTtRQUNOO1FBQ0E7UUFDQSxPQUFPYixjQUFjLENBQ25Ca0IsSUFBSSxDQUFDTixXQUFXLENBQUMsQ0FDakJPLElBQUksQ0FBRUMsV0FBVyxJQUNqQkMsa0JBQWtCLENBQUNDLHFCQUFxQixDQUN2Q0YsV0FBVyxFQUNYUCx3QkFBd0IsRUFDeEJGLGdCQUFnQixFQUNoQkMsV0FBVyxFQUNYRSxrQkFBa0IsRUFDbEJDLE9BQU8sQ0FDUCxDQUNEO01BQ0g7SUFDRCxDQUFDLE1BQU07TUFDTjtNQUNBO01BQ0E7TUFDQUYsd0JBQXdCLEVBQUU7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZW9CLG9DQUFvQyxDQUNsRHJCLFdBQTJCLEVBQzNCc0IsUUFBd0IsRUFDeEJyQix3QkFBa0MsRUFDbENXLGNBQThCLEVBQ2Q7SUFDaEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJQSxjQUFjLEtBQUsxQixjQUFjLENBQUM4QixjQUFjLEVBQUU7TUFDckQsTUFBTU8sV0FBVyxHQUFHO1FBQ25CQyxrQkFBa0IsRUFBRTtNQUNyQixDQUFDO01BRUQsSUFBSTtRQUNILE1BQU14QixXQUFXLENBQUN5QixRQUFRLENBQUNDLGNBQWMsQ0FBQ0osUUFBUSxFQUFFQyxXQUFXLENBQUM7UUFDaEV0Qix3QkFBd0IsRUFBRTtNQUMzQixDQUFDLENBQUMsT0FBT2lCLEtBQUssRUFBRTtRQUNmQyxHQUFHLENBQUNELEtBQUssQ0FBQyxvQ0FBb0MsRUFBRUEsS0FBSyxDQUFVO01BQ2hFO0lBQ0QsQ0FBQyxNQUFNO01BQ047TUFDQTtNQUNBakIsd0JBQXdCLEVBQUU7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlMEIscUJBQXFCLENBQ25DM0IsV0FBMkIsRUFDM0JELGdCQUEwQixFQUMxQkUsd0JBQWtDLEVBQ2xDVyxjQUE4QixFQUM5QkMscUNBQThDLEVBQzlDWCxrQkFBNEIsRUFDNUJDLE9BQXdCLEVBQ1I7SUFDaEIsSUFBSVMsY0FBYyxLQUFLMUIsY0FBYyxDQUFDa0MsaUJBQWlCLElBQUlQLHFDQUFxQyxFQUFFO01BQ2pHO01BQ0E7TUFDQVosd0JBQXdCLEVBQUU7SUFDM0IsQ0FBQyxNQUFNO01BQ047TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLE9BQU9iLGNBQWMsQ0FDbkJrQixJQUFJLENBQUNOLFdBQVcsQ0FBQyxDQUNqQk8sSUFBSSxDQUFFQyxXQUFXLElBQ2pCQyxrQkFBa0IsQ0FBQ0MscUJBQXFCLENBQ3ZDRixXQUFXLEVBQ1hQLHdCQUF3QixFQUN4QkYsZ0JBQWdCLEVBQ2hCQyxXQUFXLEVBQ1hFLGtCQUFrQixFQUNsQkMsT0FBTyxDQUNQLENBQ0Q7SUFDSDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWV5QixxQkFBcUIsQ0FDbkM5QixjQUF1QyxFQUN2QytCLGlCQUEyQixFQUMzQjlCLGdCQUEwQixFQUMxQnVCLFFBQXdCLEVBQ3hCdEIsV0FBMkIsRUFDM0JFLGtCQUE0QixFQUVaO0lBQUEsSUFEaEJVLGNBQThCLHVFQUFHMUIsY0FBYyxDQUFDOEIsY0FBYztJQUU5RCxNQUFNYyxzQkFBc0IsR0FBRzlCLFdBQVcsQ0FBQytCLGtCQUFrQixDQUFDQyxXQUFXLEVBQUU7SUFDM0UsTUFBTS9CLHdCQUF3QixHQUFHLENBQUM2QixzQkFBc0IsR0FDckRELGlCQUFpQixHQUNqQixZQUFvQztNQUNwQzdCLFdBQVcsQ0FBQytCLGtCQUFrQixDQUFDRSxVQUFVLEVBQUU7TUFBQyxrQ0FEL0JDLElBQUk7UUFBSkEsSUFBSTtNQUFBO01BRWpCTCxpQkFBaUIsQ0FBQ00sS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHRCxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVKLE1BQU1yQixxQ0FBcUMsR0FBR3ZCLG9DQUFvQyxDQUFDVSxXQUFXLENBQUM7SUFFL0YsSUFBSUYsY0FBYyxFQUFFO01BQ25CLElBQUlFLFdBQVcsQ0FBQ04sZUFBZSxFQUFFLENBQUMwQyxxQkFBcUIsRUFBRSxDQUFDQyxZQUFZLEVBQUUsRUFBRTtRQUN6RSxNQUFNeEMsY0FBYyxDQUFDQyxjQUFjLEVBQUVDLGdCQUFnQixFQUFFQyxXQUFXLEVBQUVDLHdCQUF3QixFQUFFQyxrQkFBa0IsRUFBRW9CLFFBQVEsQ0FBQztNQUM1SCxDQUFDLE1BQU0sSUFBSSxDQUFDQSxRQUFRLENBQUNnQixTQUFTLEVBQUUsQ0FBQ0MsZUFBZSxFQUFFO1FBQ2pENUIseUJBQXlCLENBQ3hCYixjQUFjLEVBQ2RDLGdCQUFnQixFQUNoQkMsV0FBVyxFQUNYQyx3QkFBd0IsRUFDeEJXLGNBQWMsRUFDZEMscUNBQXFDLEVBQ3JDWCxrQkFBa0IsQ0FDbEI7TUFDRixDQUFDLE1BQU0sSUFBSUosY0FBYyxDQUFDTSxnQkFBZ0IsS0FBS04sY0FBYyxDQUFDTyxrQkFBa0IsRUFBRTtRQUNqRmdCLG9DQUFvQyxDQUFDckIsV0FBVyxFQUFFc0IsUUFBUSxFQUFFckIsd0JBQXdCLEVBQUVXLGNBQWMsQ0FBQztNQUN0RyxDQUFDLE1BQU0sSUFBSUUsU0FBUyxDQUFDQyxnQkFBZ0IsRUFBRSxFQUFFO1FBQ3hDWSxxQkFBcUIsQ0FDcEIzQixXQUFXLEVBQ1hELGdCQUFnQixFQUNoQkUsd0JBQXdCLEVBQ3hCVyxjQUFjLEVBQ2RDLHFDQUFxQyxFQUNyQ1gsa0JBQWtCLENBQ2xCO01BQ0YsQ0FBQyxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0FELHdCQUF3QixFQUFFO01BQzNCO0lBQ0QsQ0FBQyxNQUFNO01BQ040QixpQkFBaUIsRUFBRTtJQUNwQjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZVcseUNBQXlDLENBQ3ZEWCxpQkFBMkIsRUFDM0I5QixnQkFBMEIsRUFDMUJ1QixRQUF3QixFQUN4QnRCLFdBQTJCLEVBQzNCRSxrQkFBNEIsRUFFWjtJQUFBLElBRGhCVSxjQUE4Qix1RUFBRzFCLGNBQWMsQ0FBQzhCLGNBQWM7SUFFOUQsTUFBTXlCLEtBQUssR0FBR3pDLFdBQVcsQ0FBQzBDLE9BQU8sRUFBRTtJQUNuQyxNQUFNQyxNQUFNLEdBQUdyQixRQUFRLENBQUNzQixRQUFRLEVBQUU7SUFDbEMsTUFBTUMsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVksRUFBRTtJQUN4QyxNQUFNQyxhQUFhLEdBQUlOLEtBQUssQ0FBQ08sV0FBVyxFQUFFLENBQTRCQyxTQUFTO0lBQy9FLE1BQU1DLFdBQVcsR0FBR0gsYUFBYSxHQUFHLENBQUMsQ0FBQ0YsVUFBVSxDQUFDUCxTQUFTLENBQUMsR0FBRyxHQUFHUyxhQUFhLEdBQUcsMkNBQTJDLENBQUMsR0FBRyxLQUFLO0lBQ3JJLE1BQU1JLFFBQVEsR0FBR1YsS0FBSyxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ3JDLE1BQU1RLFdBQVcsR0FBR0QsUUFBUSxDQUFDRSxXQUFXLENBQUMsYUFBYSxDQUFDO0lBQ3ZELE1BQU1DLGVBQWUsR0FBR2hDLFFBQVE7SUFDaEMsSUFBSWlDLGFBQWEsR0FBR2pDLFFBQVEsQ0FBQ2tDLE9BQU8sRUFBRTtJQUN0QyxJQUFJLENBQUNOLFdBQVcsRUFBRTtNQUNqQkssYUFBYSxHQUFHRSxXQUFXLENBQUNDLGdCQUFnQixDQUFDcEMsUUFBUSxDQUFDLElBQUlpQyxhQUFhO0lBQ3hFO0lBQ0FqQyxRQUFRLEdBQUdxQixNQUFNLENBQUNnQixXQUFXLENBQUNKLGFBQWEsRUFBRUssU0FBUyxFQUFFO01BQUVDLE9BQU8sRUFBRTtJQUEwQixDQUFDLENBQUMsQ0FBQ0MsZUFBZSxFQUFFOztJQUVqSDtJQUNBO0lBQ0EsSUFBSVIsZUFBZSxDQUFDUyxTQUFTLEVBQUUsSUFBSyxDQUFDYixXQUFXLElBQUl0QyxjQUFjLEtBQUsxQixjQUFjLENBQUM4QixjQUFlLElBQUksQ0FBQ29DLFdBQVcsRUFBRTtNQUN0SHZCLGlCQUFpQixFQUFFO0lBQ3BCLENBQUMsTUFBTTtNQUNOLElBQUk7UUFDSCxNQUFNL0IsY0FBYyxHQUFHLE1BQU13QixRQUFRLENBQUMwQyxhQUFhLENBQUMseUJBQXlCLENBQUM7UUFDOUUsTUFBTXBDLHFCQUFxQixDQUMxQjlCLGNBQWMsRUFDZCtCLGlCQUFpQixFQUNqQjlCLGdCQUFnQixFQUNoQnVCLFFBQVEsRUFDUnRCLFdBQVcsRUFDWEUsa0JBQWtCLEVBQ2xCVSxjQUFjLENBQ2Q7TUFDRixDQUFDLENBQUMsT0FBT3FELE1BQWUsRUFBRTtRQUN6QjlDLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLDhDQUE4QyxFQUFFK0MsTUFBTSxDQUFXO1FBQzNFcEMsaUJBQWlCLEVBQUU7TUFDcEI7SUFDRDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlcUMsWUFBWSxDQUFDQyxVQUEwQixFQUFFaEUsT0FBd0IsRUFBb0I7SUFDbkcsTUFBTWlFLGlCQUFpQixHQUFHakUsT0FBTyxLQUFLeUQsU0FBUztJQUMvQ3pELE9BQU8sR0FBR0EsT0FBTyxJQUFJZ0UsVUFBVSxDQUFDekIsT0FBTyxFQUFFLENBQUMyQixpQkFBaUIsRUFBRTtJQUM3RCxJQUFJLENBQUNELGlCQUFpQixJQUFJRCxVQUFVLENBQUNHLEdBQUcsQ0FBaUMsa0RBQWtELENBQUMsRUFBRTtNQUM3SCxPQUFPSCxVQUFVLENBQUNJLGFBQWEsRUFBRTtJQUNsQyxDQUFDLE1BQU07TUFDTixPQUFPSixVQUFVLENBQUMxQyxRQUFRLENBQUN5QyxZQUFZLENBQUMvRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQ7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZWMsWUFBWSxDQUMxQmtELFVBQTBCLEVBQzFCSyxpQkFBc0MsRUFDdENyRSxPQUF3QixFQUNMO0lBQ25CQSxPQUFPLEdBQUdBLE9BQU8sSUFBSWdFLFVBQVUsQ0FBQ3pCLE9BQU8sRUFBRSxDQUFDMkIsaUJBQWlCLEVBQUU7SUFDN0QsTUFBTUksTUFBTSxHQUFHO01BQ2RDLGtCQUFrQixFQUFFLElBQUk7TUFDeEJsRCxrQkFBa0IsRUFBRSxJQUFJO01BQ3hCZ0QsaUJBQWlCLEVBQUVBLGlCQUFpQixLQUFLWixTQUFTLEdBQUdZLGlCQUFpQixHQUFHO0lBQzFFLENBQUM7SUFDRCxPQUFPTCxVQUFVLENBQUMxQyxRQUFRLENBQUNDLGNBQWMsQ0FBQ3ZCLE9BQU8sRUFBRXNFLE1BQU0sQ0FBQztFQUMzRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVMvRCxxQkFBcUIsQ0FDN0JGLFdBQW1CLEVBQ25CUCx3QkFBa0MsRUFDbENGLGdCQUEwQixFQUMxQm9FLFVBQTBCLEVBQzFCSyxpQkFBc0MsRUFDdENyRSxPQUF3QixFQUNqQjtJQUNQLFFBQVFLLFdBQVc7TUFDbEIsS0FBS3JCLG9CQUFvQixDQUFDd0YsSUFBSTtRQUM3QmxFLGtCQUFrQixDQUNoQnlELFlBQVksQ0FBQ0MsVUFBVSxFQUFFaEUsT0FBTyxDQUFDLENBQ2pDSSxJQUFJLENBQUVKLE9BQVEsSUFBS0Ysd0JBQXdCLENBQUNFLE9BQU8sQ0FBQyxDQUFDLENBQ3JEeUUsS0FBSyxDQUFDLFVBQVUxRCxLQUF5QixFQUFFO1VBQzNDLElBQUlBLEtBQUssS0FBSzJELDRCQUE0QixDQUFDQyxRQUFRLEVBQUU7WUFDcEQsT0FBTy9FLGdCQUFnQixFQUFFO1VBQzFCO1VBQ0FvQixHQUFHLENBQUNELEtBQUssQ0FBQyw2QkFBNkIsRUFBRUEsS0FBSyxDQUFDO1FBQ2hELENBQUMsQ0FBQztRQUNIOUIsY0FBYyxDQUFDMkYsS0FBSyxFQUFFO1FBQ3RCO01BQ0QsS0FBSzVGLG9CQUFvQixDQUFDNkYsSUFBSTtRQUM3Qi9FLHdCQUF3QixDQUFDa0UsVUFBVSxDQUFDekIsT0FBTyxFQUFFLENBQUMyQixpQkFBaUIsRUFBRSxDQUFDO1FBQ2xFakYsY0FBYyxDQUFDMkYsS0FBSyxFQUFFO1FBQ3RCO01BQ0QsS0FBSzVGLG9CQUFvQixDQUFDOEYsT0FBTztRQUNoQ3hFLGtCQUFrQixDQUNoQlEsWUFBWSxDQUFDa0QsVUFBVSxFQUFFSyxpQkFBaUIsRUFBRXJFLE9BQU8sQ0FBQyxDQUNwREksSUFBSSxDQUFFSixPQUFRLElBQUtGLHdCQUF3QixDQUFDRSxPQUFPLENBQUMsQ0FBQyxDQUNyRHlFLEtBQUssQ0FBQyxVQUFVMUQsS0FBeUIsRUFBRTtVQUMzQ0MsR0FBRyxDQUFDRCxLQUFLLENBQUMsOEJBQThCLEVBQUVBLEtBQUssQ0FBQztRQUNqRCxDQUFDLENBQUM7UUFDSDlCLGNBQWMsQ0FBQzJGLEtBQUssRUFBRTtRQUN0QjtNQUNEO1FBQ0NoRixnQkFBZ0IsRUFBRTtRQUNsQlgsY0FBYyxDQUFDMkYsS0FBSyxFQUFFO0lBQUM7RUFFMUI7RUFFQSxNQUFNdEUsa0JBQWtCLEdBQUc7SUFDMUIrQix5Q0FBeUMsRUFBRUEseUNBQXlDO0lBQ3BGbEQsb0NBQW9DLEVBQUVBLG9DQUFvQztJQUMxRUosY0FBYyxFQUFFQSxjQUFjO0lBQzlCVyxjQUFjLEVBQUVBLGNBQWM7SUFDOUJjLHlCQUF5QixFQUFFQSx5QkFBeUI7SUFDcERVLG9DQUFvQyxFQUFFQSxvQ0FBb0M7SUFDMUVNLHFCQUFxQixFQUFFQSxxQkFBcUI7SUFDNUNqQixxQkFBcUIsRUFBRUEscUJBQXFCO0lBQzVDd0QsWUFBWSxFQUFFQSxZQUFZO0lBQzFCakQsWUFBWSxFQUFFQTtFQUNmLENBQUM7RUFBQyxPQUVhUixrQkFBa0I7QUFBQSJ9