@magic-xpa/gui 4.800.0-dev480.21 → 4.800.0-dev480.213

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/bundles/magic-xpa-gui.umd.js +1055 -7529
  2. package/bundles/magic-xpa-gui.umd.js.map +1 -1
  3. package/bundles/magic-xpa-gui.umd.min.js +1 -1
  4. package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
  5. package/esm2015/index.js +1 -1
  6. package/esm2015/magic-xpa-gui.js +1 -4
  7. package/esm2015/src/Commands.js +11 -114
  8. package/esm2015/src/Events.js +1 -517
  9. package/esm2015/src/EventsProcessor.js +1 -51
  10. package/esm2015/src/FocusManager.js +1 -13
  11. package/esm2015/src/GuiConstants.js +2 -11
  12. package/esm2015/src/GuiEnums.js +126 -130
  13. package/esm2015/src/GuiEnvironment.js +1 -1
  14. package/esm2015/src/IFlowMonitorQueue.js +1 -1
  15. package/esm2015/src/Manager.js +10 -148
  16. package/esm2015/src/UIBridge.js +1 -6
  17. package/esm2015/src/env/IEnvironment.js +1 -1
  18. package/esm2015/src/gui/ControlBase.js +1 -1
  19. package/esm2015/src/gui/GuiMgControl.js +1 -94
  20. package/esm2015/src/gui/GuiMgForm.js +1 -1
  21. package/esm2015/src/gui/KeyboardItem.js +5 -46
  22. package/esm2015/src/gui/LastFocusedVal.js +1 -5
  23. package/esm2015/src/gui/MgValue.js +1 -1
  24. package/esm2015/src/gui/PropParentInterface.js +1 -1
  25. package/esm2015/src/gui/low/DialogHandler.js +1 -10
  26. package/esm2015/src/gui/low/GuiCommand.js +1 -12
  27. package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
  28. package/esm2015/src/gui/low/GuiInteractive.js +8 -465
  29. package/esm2015/src/gui/low/Style.js +1 -9
  30. package/esm2015/src/management/RuntimeContextBase.js +11 -14
  31. package/esm2015/src/management/data/BlobType.js +0 -0
  32. package/esm2015/src/management/data/DcValues.js +8 -67
  33. package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
  34. package/esm2015/src/management/data/FieldDef.js +1 -95
  35. package/esm2015/src/management/data/FieldsTable.js +2 -28
  36. package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
  37. package/esm2015/src/management/data/GuiFieldBase.js +4 -39
  38. package/esm2015/src/management/data/IRecord.js +1 -1
  39. package/esm2015/src/management/data/IReferencedObject.js +1 -8
  40. package/esm2015/src/management/data/NUM_TYPE.js +14 -485
  41. package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
  42. package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
  43. package/esm2015/src/management/data/RecordUtils.js +6 -112
  44. package/esm2015/src/management/data/VectorType.js +17 -252
  45. package/esm2015/src/management/data/VectorTypeBase.js +1 -35
  46. package/esm2015/src/management/events/IActionManager.js +1 -1
  47. package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
  48. package/esm2015/src/management/exp/ExpressionInterface.js +5 -3
  49. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
  50. package/esm2015/src/management/gui/ControlTable.js +18 -72
  51. package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
  52. package/esm2015/src/management/gui/FieldValidator.js +58 -339
  53. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
  54. package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
  55. package/esm2015/src/management/gui/HebrewDate.js +3 -140
  56. package/esm2015/src/management/gui/Helps.js +2 -48
  57. package/esm2015/src/management/gui/MgControlBase.js +143 -876
  58. package/esm2015/src/management/gui/MgFormBase.js +68 -407
  59. package/esm2015/src/management/gui/PIC.js +58 -285
  60. package/esm2015/src/management/gui/PropDefaults.js +13 -48
  61. package/esm2015/src/management/gui/PropInterface.js +2 -4
  62. package/esm2015/src/management/gui/PropTable.js +72 -183
  63. package/esm2015/src/management/gui/Property.js +38 -372
  64. package/esm2015/src/management/gui/ValidationDetails.js +10 -52
  65. package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
  66. package/esm2015/src/management/gui/WrongFormatException.js +1 -15
  67. package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
  68. package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
  69. package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
  70. package/esm2015/src/management/tasks/ITask.js +1 -1
  71. package/esm2015/src/management/tasks/MgTimer.js +1 -16
  72. package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
  73. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
  74. package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
  75. package/esm2015/src/util/MemoryUtil.js +1 -41
  76. package/esm2015/src/util/ObjectReference.js +1 -8
  77. package/esm2015/src/util/ProcessLauncher.js +3 -21
  78. package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
  79. package/fesm2015/magic-xpa-gui.js +859 -7052
  80. package/fesm2015/magic-xpa-gui.js.map +1 -1
  81. package/magic-xpa-gui.d.ts +0 -3
  82. package/package.json +2 -2
  83. package/src/Commands.d.ts +2 -0
  84. package/src/Events.d.ts +0 -2
  85. package/src/GuiEnums.d.ts +125 -128
  86. package/src/env/IEnvironment.d.ts +3 -0
  87. package/src/gui/PropParentInterface.d.ts +1 -1
  88. package/src/gui/low/GuiInteractive.d.ts +3 -1
  89. package/src/gui/low/Style.d.ts +0 -3
  90. package/src/management/RuntimeContextBase.d.ts +2 -0
  91. package/src/management/data/GuiDataViewBase.d.ts +4 -4
  92. package/src/management/data/IRecord.d.ts +1 -1
  93. package/src/management/exp/ExpressionInterface.d.ts +4 -0
  94. package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
  95. package/src/management/gui/ControlTable.d.ts +1 -1
  96. package/src/management/gui/DisplayConvertor.d.ts +1 -1
  97. package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
  98. package/src/management/gui/MgControlBase.d.ts +7 -7
  99. package/src/management/gui/MgFormBase.d.ts +6 -6
  100. package/src/management/gui/PIC.d.ts +1 -0
  101. package/src/management/gui/PropInterface.d.ts +2 -4
  102. package/src/management/gui/PropTable.d.ts +4 -5
  103. package/src/management/gui/Property.d.ts +1 -1
  104. package/src/management/tasks/GuiTaskBase.d.ts +8 -14
  105. package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
@@ -73,12 +73,9 @@ export var InteractiveCommandType;
73
73
  InteractiveCommandType[InteractiveCommandType["GET_IS_ROW_EDITING"] = 64] = "GET_IS_ROW_EDITING";
74
74
  InteractiveCommandType[InteractiveCommandType["GET_MAX_ROWS_IN_PAGINATED_TABLE"] = 65] = "GET_MAX_ROWS_IN_PAGINATED_TABLE";
75
75
  InteractiveCommandType[InteractiveCommandType["CALL_JS"] = 66] = "CALL_JS";
76
+ InteractiveCommandType[InteractiveCommandType["GET_LAST_ROUTE"] = 67] = "GET_LAST_ROUTE";
76
77
  })(InteractiveCommandType || (InteractiveCommandType = {}));
77
- /// <summary> GuiUtils class provides methods for retrieving information from the GUI layer</summary>
78
78
  export class GuiInteractiveBase {
79
- /// <summary>
80
- /// Constructor : sets the contextID for the current command.
81
- /// </summary>
82
79
  constructor() {
83
80
  this._commandType = 0;
84
81
  this.TaskTag = null;
@@ -97,9 +94,6 @@ export class GuiInteractiveBase {
97
94
  this._setValue = false;
98
95
  this.resultString = String.fromCharCode(0);
99
96
  }
100
- /// <summary> Returns whether control is focusable or not. </summary>
101
- /// <param name="guiMgControl"> the control which needs to be checked. </param>
102
- /// <returns></returns>
103
97
  canFocus(guiMgControl) {
104
98
  this._commandType = InteractiveCommandType.CAN_FOCUS;
105
99
  this._obj1 = guiMgControl;
@@ -107,9 +101,6 @@ export class GuiInteractiveBase {
107
101
  this.Invoke();
108
102
  return this._mgValue.boolVal;
109
103
  }
110
- /// <summary> /// Returns the comma separated string for selected indice of list control./// </summary>
111
- /// <param name="guiMgControl"></param>
112
- /// <returns>comma separated string for selected indice of list control</returns>
113
104
  GetSelectedIndice(guiMgControl) {
114
105
  this._commandType = InteractiveCommandType.GET_SELECTED_INDICE;
115
106
  this._obj1 = guiMgControl;
@@ -117,24 +108,12 @@ export class GuiInteractiveBase {
117
108
  this.Invoke();
118
109
  return this._mgValue.str;
119
110
  }
120
- /// <summary>
121
- /// Returns whether the indent has been applied to Rich Edit
122
- /// </summary>
123
- /// <param name="guiMgControl"></param>
124
- /// <returns></returns>
125
111
  GetHasIndent(guiMgControl) {
126
112
  this._commandType = InteractiveCommandType.GET_HASINDENT;
127
113
  this._obj1 = guiMgControl;
128
114
  this.Invoke();
129
115
  return this._boolVal;
130
116
  }
131
- /// <summary>
132
- /// This methode is set TRUE\FALSE that GuiUtiles\GetValue() method will be use
133
- /// this falg say if to return the : (true) suggested value or (false)the real value
134
- /// this method is use for MG_ACT_CTRL_MODIFY
135
- /// </summary>
136
- /// <param name="ctrl"></param>
137
- /// <param name="retSuggestedValue"></param>
138
117
  setGetSuggestedValueOfChoiceControlOnTagData(ctrl, line, retSuggestedValue) {
139
118
  this._commandType = InteractiveCommandType.SET_GET_SUGGESTED_VALUE_FOR_CHOICE_CONTROL_ON_TAGDATA;
140
119
  this._obj2 = ctrl;
@@ -142,9 +121,6 @@ export class GuiInteractiveBase {
142
121
  this._boolVal = retSuggestedValue;
143
122
  this.Invoke();
144
123
  }
145
- /// <summary> Get value of the control</summary>
146
- /// <param name="object">a reference to the relevant object</param>
147
- /// <param name="rect">a reference to the object that on return will contain the requested values on string</param>
148
124
  getValue(obj, line) {
149
125
  this._commandType = InteractiveCommandType.GET_VALUE;
150
126
  this._obj2 = obj;
@@ -173,8 +149,6 @@ export class GuiInteractiveBase {
173
149
  this._mgValue = new MgValue();
174
150
  this._mgValue.str = text;
175
151
  this._mgValue.obj = language;
176
- // For async execution, return true if the command is passed to the gui thread.
177
- // For sync execution, return true if the command was executed by the gui thread.
178
152
  if (syncExec) {
179
153
  this.Invoke();
180
154
  return this._mgValue.boolVal;
@@ -183,11 +157,6 @@ export class GuiInteractiveBase {
183
157
  return true;
184
158
  }
185
159
  }
186
- /// <summary>Open message box with parent form</summary>
187
- /// <param name="title"></param>
188
- /// <param name="msg"></param>
189
- /// <param name="style">the style of the message box can be flags of Styles.MSGBOX_xxx </param>
190
- /// <returns> message box style from Styles.MSGBOX_XXX</returns>
191
160
  messageBox(title, msg, style) {
192
161
  this._commandType = InteractiveCommandType.MESSAGE_BOX;
193
162
  this._mgValue = new MgValue();
@@ -198,10 +167,6 @@ export class GuiInteractiveBase {
198
167
  this.Invoke();
199
168
  return this._mgValue.number;
200
169
  }
201
- /// <summary>set title to browser</summary>
202
- /// <param name="topMostForm">the parent form of the message box</param>
203
- /// <param name="title"></param>
204
- /// <returns> message box style from Styles.MSGBOX_XXX</returns>
205
170
  setTitle(topMostForm, title) {
206
171
  this._commandType = InteractiveCommandType.SET_TITLE;
207
172
  this._mgValue = new MgValue();
@@ -209,10 +174,6 @@ export class GuiInteractiveBase {
209
174
  this._mgValue.title = ((title === null) ? '' : title);
210
175
  this.Invoke();
211
176
  }
212
- ///<summary>
213
- /// Handles Invoke UDP operation from GUI thread
214
- ///</summary>
215
- ///<param name="contextId">Context id</param>
216
177
  invokeUDP(contextId) {
217
178
  this._commandType = InteractiveCommandType.INVOKE_UDPCOMMAND;
218
179
  this._mgValue = new MgValue();
@@ -220,10 +181,6 @@ export class GuiInteractiveBase {
220
181
  this.Invoke();
221
182
  return this._mgValue.number;
222
183
  }
223
- /// <param name="caption">description for the dialog window</param>
224
- /// <param name="path">initial path to browse</param>
225
- /// <param name="bShowNewFolder">should show the new folder button?</param>
226
- /// <returns> directory path selected by user</returns>
227
184
  directoryDialogBox(caption, path, bShowNewFolder) {
228
185
  this._commandType = InteractiveCommandType.DIRECTORY_DIALOG_BOX;
229
186
  this._mgValue = new MgValue();
@@ -233,15 +190,6 @@ export class GuiInteractiveBase {
233
190
  this.Invoke();
234
191
  return this._mgValue.str;
235
192
  }
236
- /// <summary>
237
- /// File Open Dialog Box
238
- /// </summary>
239
- /// <param name="title">Dialog window caption</param>
240
- /// <param name="initDir">Initial directory</param>
241
- /// <param name="filterNames">filter string</param>
242
- /// <param name="checkExists">verify opened file exists</param>
243
- /// <param name="multiSelect">enable selecting multiple files</param>
244
- /// <returns>file path selected by user</returns>
245
193
  fileOpenDialogBox(title, dirName, fileName, filterNames, checkExists, multiSelect) {
246
194
  this._commandType = InteractiveCommandType.FILE_OPEN_DIALOG_BOX;
247
195
  this._mgValue = new MgValue();
@@ -254,16 +202,6 @@ export class GuiInteractiveBase {
254
202
  this.Invoke();
255
203
  return this._mgValue.str;
256
204
  }
257
- /// <summary>
258
- /// File Save Dialog Box
259
- /// </summary>
260
- /// <param name="title">caption of the dialog window</param>
261
- /// <param name="initDir"> initial directory</param>
262
- /// <param name="filterNames">filter string</param>
263
- /// <param name="defaultExtension"> default extension for file name</param>
264
- /// <param name="overwritePrompt"> should prompt when overwriting an existing file?</param>
265
- /// <param name="retFile"></param>
266
- /// <returns>file path selected by user</returns>
267
205
  fileSaveDialogBox(title, dirName, fileName, filterNames, defaultExtension, overwritePrompt) {
268
206
  this._commandType = InteractiveCommandType.FILE_SAVE_DIALOG_BOX;
269
207
  this._mgValue = new MgValue();
@@ -276,29 +214,17 @@ export class GuiInteractiveBase {
276
214
  this.Invoke();
277
215
  return this._mgValue.str;
278
216
  }
279
- /// <summary>Put Command to create dialog</summary>
280
- /// <param name="handle">reference to the dialog handlers</param>
281
- /// <param name="objType">parameters to be passed to objects constructor</param>
282
- /// <param name="parameters"></param>
283
217
  createDialog(handle, parameters) {
284
218
  this._commandType = InteractiveCommandType.CREATE_DIALOG;
285
219
  this._parameters = parameters;
286
220
  this._obj2 = handle;
287
221
  this.Invoke();
288
222
  }
289
- /// <summary>Put Command to close dialog</summary>
290
- /// <param name="dialog"></param>
291
223
  closeDialog(handle) {
292
224
  this._commandType = InteractiveCommandType.CLOSE_DIALOG;
293
225
  this._obj2 = handle;
294
226
  this.Invoke();
295
227
  }
296
- /// <summary> set the text to the the control
297
- ///
298
- /// </summary>
299
- /// <param name="control"></param>
300
- /// <param name="line"></param>
301
- /// <param name="text"></param>
302
228
  setEditText(control, line, text) {
303
229
  this._commandType = InteractiveCommandType.SET_EDIT_TEXT;
304
230
  this._obj2 = control;
@@ -308,12 +234,6 @@ export class GuiInteractiveBase {
308
234
  this.Invoke();
309
235
  return this._mgValue.boolVal;
310
236
  }
311
- /// <summary> insert the text to the the control at the given position
312
- ///
313
- /// </summary>
314
- /// <param name="control"></param>
315
- /// <param name="line"></param>
316
- /// <param name="text"></param>
317
237
  insertEditText(control, line, startPosition, textToInsert) {
318
238
  this._commandType = InteractiveCommandType.INSERT_EDIT_TEXT;
319
239
  this._obj2 = control;
@@ -324,10 +244,6 @@ export class GuiInteractiveBase {
324
244
  this.Invoke();
325
245
  return this._mgValue.boolVal;
326
246
  }
327
- /// <summary> set the text to the the control</summary>
328
- /// <param name="control"></param>
329
- /// <param name="line"></param>
330
- /// <param name="text"></param>
331
247
  setSelection(control, line, start, end, caretPos) {
332
248
  this._commandType = InteractiveCommandType.SET_SELECTION;
333
249
  this._obj2 = control;
@@ -338,10 +254,6 @@ export class GuiInteractiveBase {
338
254
  this._mgValue.number = caretPos;
339
255
  this.Invoke();
340
256
  }
341
- /// <summary> set the text to the the control</summary>
342
- /// <param name="control"></param>
343
- /// <param name="line"></param>
344
- /// <param name="text"></param>
345
257
  setSuggestedValue(control, suggestedValue) {
346
258
  this._commandType = InteractiveCommandType.SET_SUGGESTED_VALUE;
347
259
  this._obj2 = control;
@@ -349,11 +261,6 @@ export class GuiInteractiveBase {
349
261
  this._mgValue.str = suggestedValue;
350
262
  this.Invoke();
351
263
  }
352
- /// <summary>
353
- /// get the position of the caret on the control
354
- /// </summary>
355
- /// <param name="control"></param>
356
- /// <param name="line"></param>
357
264
  caretPosGet(control, line) {
358
265
  this._commandType = InteractiveCommandType.GET_CARET_POS;
359
266
  this._obj2 = control;
@@ -362,9 +269,6 @@ export class GuiInteractiveBase {
362
269
  this.Invoke();
363
270
  return this._mgValue.number;
364
271
  }
365
- /// <summary>
366
- /// refresh page
367
- /// </summary>
368
272
  RefreshPage(navigateToRootRoute, initialUrl) {
369
273
  this._commandType = InteractiveCommandType.REFRESH_PAGE;
370
274
  this._boolVal = navigateToRootRoute;
@@ -372,10 +276,6 @@ export class GuiInteractiveBase {
372
276
  this.Invoke();
373
277
  return;
374
278
  }
375
- /// <summary>
376
- /// check if the Carel is Positioned on the first line in TextBox.</summary>
377
- /// <param name="control"></param>
378
- /// <param name="line"></param>
379
279
  getIsTopOfTextBox(control, line) {
380
280
  this._commandType = InteractiveCommandType.GET_IS_TOP_OF_TEXTBOX;
381
281
  this._obj2 = control;
@@ -383,10 +283,6 @@ export class GuiInteractiveBase {
383
283
  this.Invoke();
384
284
  return this._boolVal;
385
285
  }
386
- /// <summary>
387
- /// check if the Carel is Positioned on the last line in TextBox.</summary>
388
- /// <param name="control"></param>
389
- /// <param name="line"></param>
390
286
  getIsEndOfTextBox(control, line) {
391
287
  this._commandType = InteractiveCommandType.GET_IS_END_OF_TEXTBOX;
392
288
  this._obj2 = control;
@@ -394,13 +290,6 @@ export class GuiInteractiveBase {
394
290
  this.Invoke();
395
291
  return this._boolVal;
396
292
  }
397
- /// <summary>
398
- /// Post a key event (emulate keys pressed by the user).
399
- /// </summary>
400
- /// <param name="control"></param>
401
- /// <param name="line"></param>
402
- /// <param name="keyCode"></param>
403
- /// <param name="stateMask"></param>
404
293
  postKeyEvent(control, line, keys, PostChar, forceLogicalControlTextUpdate) {
405
294
  this._commandType = InteractiveCommandType.POST_KEY_EVENT;
406
295
  this._obj2 = control;
@@ -411,12 +300,6 @@ export class GuiInteractiveBase {
411
300
  this._boolVal = PostChar;
412
301
  this.Invoke();
413
302
  }
414
- /// <summary>
415
- /// Send WM_CHAR to the specified control via GUI thread.
416
- /// </summary>
417
- /// <param name="control"></param>
418
- /// <param name="line"></param>
419
- /// <param name="chr"></param>
420
303
  postCharEvent(control, line, chr) {
421
304
  this._commandType = InteractiveCommandType.POST_CHAR_EVENT;
422
305
  this._obj2 = control;
@@ -424,65 +307,45 @@ export class GuiInteractiveBase {
424
307
  this._char = chr;
425
308
  this.Invoke();
426
309
  }
427
- /// <summary> dispose all the shells. last dispose will close the display.</summary>
428
310
  disposeAllForms() {
429
311
  this._commandType = InteractiveCommandType.DISPOSE_ALL_FORMS;
430
312
  this.Invoke();
431
313
  }
432
- /// <summary> return number of rows in the table</summary>
433
- /// <param name="control"></param>
434
- /// <returns></returns>
435
314
  getRowsInPage(control) {
436
315
  this._commandType = InteractiveCommandType.GET_ROWS_IN_PAGE;
437
316
  this._obj2 = control;
438
317
  this.Invoke();
439
318
  return this._intVal1;
440
319
  }
441
- /// <summary> return number of rows in the table</summary>
442
- /// <param name="control"></param>
443
- /// <returns></returns>
444
320
  getMaxRowsInPaginatedTable(control) {
445
321
  this._commandType = InteractiveCommandType.GET_MAX_ROWS_IN_PAGINATED_TABLE;
446
322
  this._obj2 = control;
447
323
  this.Invoke();
448
324
  return this._intVal1;
449
325
  }
450
- /// <summary> return the number of hidden rows (partially or fully) in table</summary>
451
- /// <param name="control"></param>
452
- /// <returns></returns>
326
+ getLastRoute() {
327
+ this._commandType = InteractiveCommandType.GET_LAST_ROUTE;
328
+ this.Invoke();
329
+ return this.resultString;
330
+ }
453
331
  GetHiddenRowsCountInTable(control) {
454
332
  this._commandType = InteractiveCommandType.GET_HIDDEN_ROWS_COUNT_IN_TABLE;
455
333
  this._obj2 = control;
456
334
  this.Invoke();
457
335
  return this._intVal1;
458
336
  }
459
- /// <summary>
460
- /// return the last window state
461
- /// </summary>
462
- /// <param name="form"></param>
463
- /// <returns></returns>
464
337
  getLastWindowState(guiMgForm) {
465
338
  this._commandType = InteractiveCommandType.GET_LAST_WINDOW_STATE;
466
339
  this._obj2 = guiMgForm;
467
340
  this.Invoke();
468
341
  return this._intVal1;
469
342
  }
470
- /// <summary>
471
- /// gets linked parent idx of frameset
472
- /// </summary>
473
- /// <param name="frameset"></param>
474
- /// <returns></returns>
475
343
  getLinkedParentIdx(frameset) {
476
344
  this._commandType = InteractiveCommandType.GET_LINKED_PARENT_IDX;
477
345
  this._obj2 = frameset;
478
346
  this.Invoke();
479
347
  return this._intVal1;
480
348
  }
481
- /// <summary>
482
- /// get the columns state --- layer, width and widthForFillTablePlacement
483
- /// </summary>
484
- /// <param name="index"></param>
485
- /// <returns></returns>
486
349
  getColumnsState(tableCtrl) {
487
350
  this._commandType = InteractiveCommandType.GET_COLUMNS_STATE;
488
351
  this._obj2 = tableCtrl;
@@ -501,10 +364,6 @@ export class GuiInteractiveBase {
501
364
  this._obj1 = newObjectToSet;
502
365
  this.Invoke();
503
366
  }
504
- /// <summary>
505
- /// Activate the form.
506
- /// </summary>
507
- /// <param name="guiMgForm"></param>
508
367
  ActivateForm(guiMgForm) {
509
368
  this._commandType = InteractiveCommandType.ACTIVATE_FORM;
510
369
  this._obj1 = guiMgForm;
@@ -519,10 +378,6 @@ export class GuiInteractiveBase {
519
378
  isFormActive_0(guiMgForm) {
520
379
  return this._boolVal;
521
380
  }
522
- /// <summary> Gets the RTF value of the RTF edit control which was set before entering it. </summary>
523
- /// <param name="guiMgControl"></param>
524
- /// <param name="line"></param>
525
- /// <returns></returns>
526
381
  GetRtfValueBeforeEnteringControl(guiMgControl, line) {
527
382
  this._commandType = InteractiveCommandType.GET_RTF_VALUE_BEFORE_ENTERING_CONTROL;
528
383
  this._obj2 = guiMgControl;
@@ -531,10 +386,6 @@ export class GuiInteractiveBase {
531
386
  this.Invoke();
532
387
  return this._mgValue.str;
533
388
  }
534
- /// <summary> Get Position Isn of Row in DataTable attached to DV Control. </summary>
535
- /// <param name="dataTable"></param>
536
- /// <param name="line"></param>
537
- /// <returns></returns>
538
389
  GetDVControlPositionIsn(dataTable, line) {
539
390
  this._commandType = InteractiveCommandType.GET_DVCONTROL_POSITION_ISN;
540
391
  this._obj1 = dataTable;
@@ -542,20 +393,12 @@ export class GuiInteractiveBase {
542
393
  this.Invoke();
543
394
  return this._intVal1;
544
395
  }
545
- /// <summary> Get Position Isn of Row in DataTable attached to DV Control. </summary>
546
- /// <param name="dataTable"></param>
547
- /// <param name="line"></param>
548
- /// <returns></returns>
549
396
  ClearDatatable(dvControl, dataTable) {
550
397
  this._commandType = InteractiveCommandType.CLEAR_DATA_TABLE;
551
398
  this._obj1 = dvControl;
552
399
  this._obj2 = dataTable;
553
400
  this.Invoke();
554
401
  }
555
- /// <summary> Set Datasource property of Dataview control. </summary>
556
- /// <param name="dvControl"></param>
557
- /// <param name="dataTable"></param>
558
- /// <param name="propertyName"></param>
559
402
  SetDataSourceToDataViewControl(dvControl, dataTable, propertyName) {
560
403
  this._commandType = InteractiveCommandType.SET_DATA_SOURCE_TO_DVCONTROL;
561
404
  this._obj1 = dvControl;
@@ -563,12 +406,6 @@ export class GuiInteractiveBase {
563
406
  this._str = propertyName;
564
407
  this.Invoke();
565
408
  }
566
- ///<summary>
567
- /// Check whether the combobox is in a DroppedDown state or not.
568
- ///</summary>
569
- ///<param name="comboBox">MgcomboBox control</param>
570
- ///<param name="line">!!.</param>
571
- ///<returns>bool</returns>
572
409
  IsComboBoxInDroppedDownState(comboBox, line) {
573
410
  this._commandType = InteractiveCommandType.IS_COMBO_DROPPED_DOWN;
574
411
  this._obj1 = comboBox;
@@ -585,9 +422,6 @@ export class GuiInteractiveBase {
585
422
  this.Invoke();
586
423
  return this.resultString;
587
424
  }
588
- /// <summary> Calls Run() synchronously to execute the command.
589
- /// But before that, it executes the GuiCommandQueue.
590
- /// </summary>
591
425
  Invoke() {
592
426
  GuiCommandQueue.getInstance().invoke();
593
427
  if (this._obj2 instanceof ControlBase) {
@@ -600,388 +434,97 @@ export class GuiInteractiveBase {
600
434
  this.TaskTag = guiMgForm.TaskTag;
601
435
  }
602
436
  else
603
- this.TaskTag = '0'; // general command
437
+ this.TaskTag = '0';
604
438
  UIBridge.getInstance().ExecuteInteractiveCommand(this);
605
439
  }
606
- /// <summary> implements the Runnable run method for calling Display.syncExec()</summary>
607
- // Run(): void {
608
- // // Sets the currentContextID
609
- // let contextIDGuard = new ContextIDGuard(this._contextID);
610
- // try {
611
- // switch (this._commandType) {
612
- // case InteractiveCommandType.GET_FONT_METRICS:
613
- // this.onGetFontMetrics();
614
- // break;
615
- // case InteractiveCommandType.GET_RESOLUTION:
616
- // this.onGetResolution();
617
- // break;
618
- // case InteractiveCommandType.GET_BOUNDS:
619
- // this.onBounds();
620
- // break;
621
- // case InteractiveCommandType.GET_VALUE:
622
- // this.onValue();
623
- // break;
624
- // case InteractiveCommandType.SET_BROWSER_TEXT:
625
- // this.onSetBrowserText();
626
- // break;
627
- // case InteractiveCommandType.GET_BROWSER_TEXT:
628
- // this.onGetBrowserText();
629
- // break;
630
- // case InteractiveCommandType.BROWSER_EXECUTE:
631
- // this.onBrowserExecute();
632
- // break;
633
- // case InteractiveCommandType.GET_TOP_INDEX:
634
- // this.onGetTopIndex();
635
- // break;
636
- // case InteractiveCommandType.MESSAGE_BOX:
637
- // this.onMessageBox();
638
- // break;
639
- // case InteractiveCommandType.DIRECTORY_DIALOG_BOX:
640
- // this.onDirectoryDialogBox();
641
- // break;
642
- // case InteractiveCommandType.GET_CLIENT_BOUNDS:
643
- // this.getClientBounds();
644
- // break;
645
- // case InteractiveCommandType.SET_EDIT_TEXT:
646
- // this.onSetEditText();
647
- // break;
648
- // case InteractiveCommandType.INSERT_EDIT_TEXT:
649
- // this.onInsertEditText();
650
- // break;
651
- // case InteractiveCommandType.SET_SELECTION:
652
- // this.onSetSelection();
653
- // break;
654
- // case InteractiveCommandType.GET_SELECTION:
655
- // this.onSelectionGet();
656
- // break;
657
- // case InteractiveCommandType.GET_CARET_POS:
658
- // this.onCaretPosGet();
659
- // break;
660
- // case InteractiveCommandType.GET_IS_TOP_OF_TEXTBOX:
661
- // this.onGetIsTopOfTextBox();
662
- // break;
663
- // case InteractiveCommandType.GET_IS_END_OF_TEXTBOX:
664
- // this.onGetIsEndOfTextBox();
665
- // break;
666
- // case InteractiveCommandType.CLIPBOARD_GET_CONTENT:
667
- // this.onClipboardRead();
668
- // break;
669
- // case InteractiveCommandType.CLIPBOARD_SET_CONTENT:
670
- // this.onClipboardWrite();
671
- // break;
672
- // case InteractiveCommandType.CLIPBOARD_PASTE:
673
- // this.onClipboardPaste();
674
- // break;
675
- // case InteractiveCommandType.POST_KEY_EVENT:
676
- // this.onPostKeyEvent();
677
- // break;
678
- // case InteractiveCommandType.POST_CHAR_EVENT:
679
- // this.onPostCharEvent();
680
- // break;
681
- // case InteractiveCommandType.SET_CURSOR:
682
- // this.onSetCursor();
683
- // break;
684
- // case InteractiveCommandType.DISPOSE_ALL_FORMS:
685
- // this.onDisposeAllForms();
686
- // break;
687
- // case InteractiveCommandType.GET_ROWS_IN_PAGE:
688
- // this.onGetRowsInPage();
689
- // break;
690
- // case InteractiveCommandType.GET_HIDDEN_ROWS_COUNT_IN_TABLE:
691
- // this.onGetHiddenRowsCountInTable();
692
- // break;
693
- // case InteractiveCommandType.FILE_OPEN_DIALOG_BOX:
694
- // this.onFileOpenDialogBox();
695
- // break;
696
- // case InteractiveCommandType.FILE_SAVE_DIALOG_BOX:
697
- // this.onFileSaveDialogBox();
698
- // break;
699
- // case InteractiveCommandType.CREATE_DIALOG:
700
- // this.onCreateDialog();
701
- // break;
702
- // case InteractiveCommandType.OPEN_DIALOG:
703
- // this.onOpenDialog();
704
- // break;
705
- // case InteractiveCommandType.CLOSE_DIALOG:
706
- // this.onCloseDialog();
707
- // break;
708
- // case InteractiveCommandType.SET_GET_SUGGESTED_VALUE_FOR_CHOICE_CONTROL_ON_TAGDATA:
709
- // this.OnSetGetSuggestedValueOfChoiceControlOnTagData();
710
- // break;
711
- // case InteractiveCommandType.GET_LAST_WINDOW_STATE:
712
- // this.onGetLastWindowState();
713
- // break;
714
- // case InteractiveCommandType.GET_FRAMES_BOUNDS:
715
- // this.onGetFramesBounds();
716
- // break;
717
- // case InteractiveCommandType.GET_LINKED_PARENT_IDX:
718
- // this.onGetLinkedParentIdx();
719
- // break;
720
- // case InteractiveCommandType.GET_FORM_BOUNDS:
721
- // this.onGetFormBounds();
722
- // break;
723
- // case InteractiveCommandType.GET_COLUMNS_STATE:
724
- // this.onGetColumnsState();
725
- // break;
726
- // case InteractiveCommandType.GET_FORM_HANDLE:
727
- // this.onGetFormHandle();
728
- // break;
729
- // case InteractiveCommandType.GET_CTRL_HANDLE:
730
- // this.onGetCtrlHandle();
731
- // break;
732
- // case InteractiveCommandType.IS_FORM_ACTIVE:
733
- // this.isFormActive();
734
- // break;
735
- // case InteractiveCommandType.GET_DROPPED_DATA:
736
- // this.onGetDroppedData();
737
- // break;
738
- // case InteractiveCommandType.GET_DROPPED_POINT:
739
- // this.onGetDroppedPoint();
740
- // break;
741
- // case InteractiveCommandType.GET_DROPPED_SELECTION:
742
- // this.onGetDroppedSelection();
743
- // break;
744
- // case InteractiveCommandType.DROP_FORMAT_SUPPORTED:
745
- // this.onCheckDropFormatPresent();
746
- // break;
747
- // case InteractiveCommandType.GET_IS_BEGIN_DRAG:
748
- // this.onGetIsBeginDrag();
749
- // break;
750
- // case InteractiveCommandType.ACTIVATE_NEXT_OR_PREVIOUS_MDI_CHILD:
751
- // this.OnActivateNextOrPreviousMDIChild();
752
- // break;
753
- // case InteractiveCommandType.SEND_IME_MSG:
754
- // this.onSendImeMsg();
755
- // break;
756
- // case InteractiveCommandType.CAN_FOCUS:
757
- // this.onCanFocus();
758
- // break;
759
- // case InteractiveCommandType.GET_SELECTED_INDICE:
760
- // this.OnGetSelectedIndice();
761
- // break;
762
- // case InteractiveCommandType.SET_SUGGESTED_VALUE:
763
- // this.onSetSuggestedValue();
764
- // break;
765
- // case InteractiveCommandType.MAP_WIDGET_TO_GUI_OBJECT:
766
- // this.MapWidget();
767
- // break;
768
- // case InteractiveCommandType.REMOVE_DN_CONTROL_VALUE_CHANGED_HANDLER:
769
- // this.OnRemoveDNControlValueChangedHandler();
770
- // break;
771
- // case InteractiveCommandType.ADD_DN_CONTROL_VALUE_CHANGED_HANDLER:
772
- // this.OnAddDNControlValueChangedHandler();
773
- // break;
774
- // case InteractiveCommandType.GET_RTF_VALUE_BEFORE_ENTERING_CONTROL:
775
- // this.OnGetRtfValueBeforeEnteringControl();
776
- // break;
777
- // case InteractiveCommandType.GET_MDI_CHILD_COUNT:
778
- // this.OnGetMDIChildCount();
779
- // break;
780
- // case InteractiveCommandType.ACTIVATE_FORM:
781
- // this.OnActivateForm();
782
- // break;
783
- // case InteractiveCommandType.ENABLE_MENU_ENTRY:
784
- // this.OnEnableMenuEntry();
785
- // break;
786
- // case InteractiveCommandType.SHOW_CONTEXT_MENU:
787
- // this.OnShowContextMenu();
788
- // break;
789
- // case InteractiveCommandType.IS_COMBO_DROPPED_DOWN:
790
- // this.OnIsComboDroppedDowndState();
791
- // break;
792
- // case InteractiveCommandType.INVOKE_UDPCOMMAND:
793
- // this.onInvokeUDP();
794
- // break;
795
- // case InteractiveCommandType.GET_HASINDENT:
796
- // this.OnGetHasIndent();
797
- // break;
798
- // }
799
- // }
800
- // catch (ex) {
801
- // if (ex instanceof Exception) {
802
- // Events.WriteExceptionToLog(ex);
803
- // throw ex;
804
- // }
805
- // else
806
- // throw ex; // Reset the current contextID.
807
- // }
808
- // finally {
809
- // contextIDGuard.Dispose();
810
- // }
811
- // }
812
- /// <summary> Remove the ValueChangedHandler. </summary>
813
440
  OnRemoveDNControlValueChangedHandler() {
814
441
  Events.WriteExceptionToLog('RemoveDNControlValueChangedHandler - Not Implemented Yet');
815
442
  }
816
- /// <summary> Add the ValueChangedHandler. </summary>
817
443
  OnAddDNControlValueChangedHandler() {
818
444
  Events.WriteExceptionToLog('AddDNControlValueChangedHandler - Not Implemented Yet');
819
445
  }
820
- /// <summary> Gets the RTF value of the RTF edit control which was set before entering it. </summary>
821
446
  OnGetRtfValueBeforeEnteringControl() {
822
447
  Events.WriteExceptionToLog('OnGetOrgRtfValue - Not Implemented Yet');
823
448
  }
824
- ///<summary>
825
- /// Handles Invoke UDP operation from GUI thread
826
- ///</summary>
827
449
  onInvokeUDP() {
828
450
  }
829
- /// <summary> Handle the file open dialog box
830
- ///
831
- /// </summary>
832
451
  onFileOpenDialogBox() {
833
452
  }
834
- /// <summary> Handle the file save dialog box
835
- ///
836
- /// </summary>
837
453
  onFileSaveDialogBox() {
838
454
  }
839
- /// <summary>Create dialog</summary>
840
455
  onCreateDialog() {
841
456
  }
842
- /// <summary>Opens dialog</summary>
843
457
  onOpenDialog() {
844
458
  }
845
- /// <summary>Closes dialog</summary>
846
459
  onCloseDialog() {
847
460
  }
848
- /// <summary>This function returns if the form is active or not.
849
- /// </summary>
850
461
  isFormActive_1() {
851
462
  }
852
- /// <summary> dispose all shells.</summary>
853
463
  onDisposeAllForms() {
854
464
  }
855
- /// <summary> calculating the font metrics</summary>
856
465
  onGetFontMetrics() {
857
466
  }
858
- /// <summary> Gets the resolution of the control. </summary>
859
467
  onGetResolution() {
860
468
  }
861
- /// <summary> return the caret position on the given control</summary>
862
469
  onCaretPosGet() {
863
470
  }
864
- /// <summary> check if the caret is positioned on the first line of TextBox</summary>
865
471
  onGetIsTopOfTextBox() {
866
472
  return this._boolVal;
867
473
  }
868
- /// <summary> check if the caret is positioned on the last line of TextBox</summary>
869
474
  onGetIsEndOfTextBox() {
870
475
  return this._boolVal;
871
476
  }
872
- /// <summary> return the caret position on the given control</summary>
873
477
  onSelectionGet() {
874
478
  }
875
- /// <summary> return the value of the control</summary>
876
- // private onValue(): void {
877
- //
878
- // UIBridge.getInstance().GetInteractiveValue(this.taskTag, this);
879
- //
880
- // //this._mgValue.str = UIBridge.getInstance().GetControlValue(controlBase.TaskTag, (this._line).toString(), controlBase.UniqueName);
881
- //
882
- // }
883
- /// <summary> set the text in the text control.</summary>
884
479
  onSetEditText() {
885
480
  }
886
- /// <summary> insert the text to the text control at a given position.</summary>
887
481
  onInsertEditText() {
888
482
  }
889
- /// <summary> set the text(html) on the browser control</summary>
890
483
  onSetBrowserText() {
891
484
  }
892
- /// <summary> set the selection in the text control.</summary>
893
485
  onSetSelection() {
894
486
  }
895
- /// <summary> set the suggested value for choice control.</summary>
896
487
  onSetSuggestedValue() {
897
488
  }
898
- /// <summary> get number of rows in the table
899
- /// </summary>
900
489
  onGetRowsInPage() {
901
490
  }
902
- /// <summary> return the number of hidden rows (partially or fully) in table
903
- /// </summary>
904
491
  onGetHiddenRowsCountInTable() {
905
492
  }
906
- /// <summary> get table top index
907
- /// </summary>
908
493
  onGetTopIndex() {
909
494
  }
910
- /// <summary> get the Client bounds of the object</summary>
911
495
  getClientBounds_1() {
912
496
  }
913
- /// <summary> post a key combination. This emulates keys pressed by the user. Setting the data in the widget to ignore
914
- /// key down, will cause the OS to handle the event instead of us.
915
- /// </summary>
916
497
  onPostKeyEvent() {
917
498
  }
918
- /// <summary> Send WM_CHAR message to ComboBox and ListBox. This emulates keys pressed by the user.
919
- /// </summary>
920
499
  onPostCharEvent() {
921
500
  }
922
- /// <summary>
923
- ///
924
- /// </summary>
925
501
  OnSetGetSuggestedValueOfChoiceControlOnTagData() {
926
502
  }
927
- /// <summary> (Korean IME) send MG_IME_XXX message to MgTextBox </summary>
928
503
  onSendImeMsg() {
929
504
  }
930
- /// <summary>set cursor on forms</summary>
931
505
  onSetCursor() {
932
506
  }
933
- /// <summary>true if the operation should be delegated to the GUI thread</summary>
934
- /// <returns></returns>
935
507
  invokeRequired() {
936
508
  return false;
937
509
  }
938
- /// <summary>
939
- /// return windowState
940
- /// </summary>
941
510
  onGetLastWindowState() {
942
511
  }
943
- /// <summary>
944
- /// get parent link Idx of this frameset
945
- /// </summary>
946
512
  onGetLinkedParentIdx() {
947
513
  }
948
- ///<summary>get layer of the column
949
- /// </summary>
950
514
  onGetColumnsState() {
951
515
  }
952
- /// <summary> Indicates if a control can be selected. </summary>
953
516
  onCanFocus() {
954
517
  }
955
- /// <summary>
956
- /// Get the selected indice of the listbox control.
957
- /// </summary>
958
518
  OnGetSelectedIndice() {
959
519
  }
960
- /// <summary>
961
- /// Returns true if control has indent applied
962
- /// </summary>
963
- /// <returns></returns>
964
520
  OnGetHasIndent() {
965
521
  }
966
- /// <summary>
967
- /// Map Widget to Gui object (MgForm/MgStatusBar/MgStatusPane) for MDI frame for a parallel context
968
- /// </summary>
969
522
  MapWidget_1() {
970
523
  }
971
- /// <summary>
972
- /// Get PositionIsn of DataRow From DataTable attached to DVControl.
973
- /// </summary>
974
524
  OnGetDVControlPositionIsn() {
975
525
  }
976
- /// <summary>
977
- /// Activate the form.
978
- /// </summary>
979
526
  OnActivateForm() {
980
527
  }
981
- ///<summary>
982
- /// Check whether the combobox is in dropped down state.
983
- ///</summary>
984
- ///<returns>!!.</returns>
985
528
  OnIsComboDroppedDowndState() {
986
529
  }
987
530
  }
@@ -999,4 +542,4 @@ export class GuiInteractive extends GuiInteractiveBase {
999
542
  super();
1000
543
  }
1001
544
  }
1002
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpSW50ZXJhY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL2d1aS9sb3cvR3VpSW50ZXJhY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxDQUFOLElBQVksc0JBb0VYO0FBcEVELFdBQVksc0JBQXNCO0lBQ2hDLDJGQUFnQixDQUFBO0lBQ2hCLHVGQUFjLENBQUE7SUFDZCwrRUFBVSxDQUFBO0lBQ1YsNkVBQVMsQ0FBQTtJQUNULDJGQUFnQixDQUFBO0lBQ2hCLDJGQUFnQixDQUFBO0lBQ2hCLHlGQUFlLENBQUE7SUFDZixxRkFBYSxDQUFBO0lBQ2IsaUZBQVcsQ0FBQTtJQUNYLDZFQUFTLENBQUE7SUFDVCxvR0FBb0IsQ0FBQTtJQUNwQiw4RkFBaUIsQ0FBQTtJQUNqQixzRkFBYSxDQUFBO0lBQ2IsNEZBQWdCLENBQUE7SUFDaEIsc0ZBQWEsQ0FBQTtJQUNiLHNGQUFhLENBQUE7SUFDYixzRkFBYSxDQUFBO0lBQ2Isb0ZBQVksQ0FBQTtJQUNaLHNHQUFxQixDQUFBO0lBQ3JCLHNHQUFxQixDQUFBO0lBQ3JCLHNHQUFxQixDQUFBO0lBQ3JCLHNHQUFxQixDQUFBO0lBQ3JCLDBGQUFlLENBQUE7SUFDZix3RkFBYyxDQUFBO0lBQ2QsMEZBQWUsQ0FBQTtJQUNmLGdGQUFVLENBQUE7SUFDViw4RkFBaUIs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QUM7QUE2aEN4QyxNQUFNLE9BQU8sY0FBZSxTQUFRLGtCQUFrQjtJQUVwRCxrQ0FBa0M7SUFDbEMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsQ0FBQztJQUVEO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHdWlNZ0NvbnRyb2wgfSBmcm9tICcuLi9HdWlNZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBNZ1ZhbHVlIH0gZnJvbSAnLi4vTWdWYWx1ZSc7XHJcbmltcG9ydCB7IEd1aU1nRm9ybSB9IGZyb20gJy4uL0d1aU1nRm9ybSc7XHJcbmltcG9ydCB7IERpYWxvZ0hhbmRsZXIgfSBmcm9tICcuL0RpYWxvZ0hhbmRsZXInO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBMaXN0IH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBVSUJyaWRnZSB9IGZyb20gJy4uLy4uL1VJQnJpZGdlJztcclxuaW1wb3J0IHsgQ29udHJvbEJhc2UgfSBmcm9tICcuLi9Db250cm9sQmFzZSc7XHJcbmltcG9ydCB7IEd1aUNvbW1hbmRRdWV1ZSB9IGZyb20gJy4vR3VpQ29tbWFuZFF1ZXVlJztcclxuXHJcbmV4cG9ydCBlbnVtIEludGVyYWN0aXZlQ29tbWFuZFR5cGUge1xyXG4gIEdFVF9GT05UX01FVFJJQ1MsXHJcbiAgR0VUX1JFU09MVVRJT04sXHJcbiAgR0VUX0JPVU5EUyxcclxuICBHRVRfVkFMVUUsXHJcbiAgU0VUX0JST1dTRVJfVEVYVCxcclxuICBHRVRfQlJPV1NFUl9URVhULFxyXG4gIEJST1dTRVJfRVhFQ1VURSxcclxuICBHRVRfVE9QX0lOREVYLFxyXG4gIE1FU1NBR0VfQk9YLFxyXG4gIFNFVF9USVRMRSxcclxuICBESVJFQ1RPUllfRElBTE9HX0JPWCxcclxuICBHRVRfQ0xJRU5UX0JPVU5EUyxcclxuICBTRVRfRURJVF9URVhULFxyXG4gIElOU0VSVF9FRElUX1RFWFQsXHJcbiAgU0VUX1NFTEVDVElPTixcclxuICBHRVRfU0VMRUNUSU9OLFxyXG4gIEdFVF9DQVJFVF9QT1MsXHJcbiAgUkVGUkVTSF9QQUdFLFxyXG4gIEdFVF9JU19UT1BfT0ZfVEVYVEJPWCxcclxuICBHRVRfSVNfRU5EX09GX1RFWFRCT1gsXHJcbiAgQ0xJUEJPQVJEX0dFVF9DT05URU5ULFxyXG4gIENMSVBCT0FSRF9TRVRfQ09OVEVOVCxcclxuICBDTElQQk9BUkRfUEFTVEUsXHJcbiAgUE9TVF9LRVlfRVZFTlQsXHJcbiAgUE9TVF9DSEFSX0VWRU5ULFxyXG4gIFNFVF9DVVJTT1IsXHJcbiAgRElTUE9TRV9BTExfRk9STVMsXHJcbiAgR0VUX1JPV1NfSU5fUEFHRSxcclxuICBHRVRfSElEREVOX1JPV1NfQ09VTlRfSU5fVEFCTEUsXHJcbiAgRklMRV9PUEVOX0RJQUxPR19CT1gsXHJcbiAgRklMRV9TQVZFX0RJQUxPR19CT1gsXHJcbiAgQ1JFQVRFX0RJQUxPRyxcclxuICBPUEVOX0RJQUxPRyxcclxuICBDTE9TRV9ESUFMT0csXHJcbiAgU0VUX0dFVF9TVUdHRVNURURfVkFMVUVfRk9SX0NIT0lDRV9DT05UUk9MX09OX1RBR0RBVEEsXHJcbiAgUkVGTEVDVElPTl9JTlZPS0UsXHJcbiAgUkVGTEVDVElPTl9TRVQsXHJcbiAgR0VUX0xBU1RfV0lORE9XX1NUQVRFLFxyXG4gIEdFVF9GUkFNRVNfQk9VTkRTLFxyXG4gIEdFVF9MSU5LRURfUEFSRU5UX0lEWCxcclxuICBHRVRfRk9STV9CT1VORFMsXHJcbiAgR0VUX0NPTFVNTlNfU1RBVEUsXHJcbiAgR0VUX0ZPUk1fSEFORExFLFxyXG4gIEdFVF9DVFJMX0hBTkRMRSxcclxuICBJU19GT1JNX0FDVElWRSxcclxuICBTRVRfTUFSS0VEX1RFWFRfT05fUklDSF9FRElULFxyXG4gIFNFTkRfSU1FX01TRyxcclxuICBDQU5fRk9DVVMsXHJcbiAgSU5WT0tFX09TQ09NTUFORCxcclxuICBHRVRfU0VMRUNURURfSU5ESUNFLFxyXG4gIFNFVF9TVUdHRVNURURfVkFMVUUsXHJcbiAgTUFQX1dJREdFVF9UT19HVUlfT0JKRUNULFxyXG4gIFJFTU9WRV9ETl9DT05UUk9MX1ZBTFVFX0NIQU5HRURfSEFORExFUixcclxuICBBRERfRE5fQ09OVFJPTF9WQUxVRV9DSEFOR0VEX0hBTkRMRVIsXHJcbiAgR0VUX1JURl9WQUxVRV9CRUZPUkVfRU5URVJJTkdfQ09OVFJPTCxcclxuICBBVFRBQ0hfRE5LRVlfVE9fT0JKRUNULFxyXG4gIEdFVF9EVkNPTlRST0xfUE9TSVRJT05fSVNOLFxyXG4gIENMRUFSX0RBVEFfVEFCTEUsXHJcbiAgU0VUX0RBVEFfU09VUkNFX1RPX0RWQ09OVFJPTCxcclxuICBBQ1RJVkFURV9GT1JNLFxyXG4gIElTX0NPTUJPX0RST1BQRURfRE9XTixcclxuICBPUEVOX0ZPUk1fREVTSUdORVIsXHJcbiAgSU5WT0tFX1VEUENPTU1BTkQsXHJcbiAgR0VUX0hBU0lOREVOVCxcclxuICBHRVRfSVNfUk9XX0VESVRJTkcsXHJcbiAgR0VUX01BWF9ST1dTX0lOX1BBR0lOQVRFRF9UQUJMRSxcclxuICBDQUxMX0pTXHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT4gR3VpVXRpbHMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBHVUkgbGF5ZXI8L3N1bW1hcnk+XHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHdWlJbnRlcmFjdGl2ZUJhc2Uge1xyXG4gIF9jb21tYW5kVHlwZTogSW50ZXJhY3RpdmVDb21tYW5kVHlwZSA9IDA7XHJcbiAgVGFza1RhZzogc3RyaW5nID0gbnVsbDtcclxuICBjb250cm9sTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgX3g6IG51bWJlciA9IDA7XHJcbiAgX3k6IG51bWJlciA9IDA7XHJcbiAgX2NoYXI6IHN0cmluZyA9IG51bGw7XHJcbiAgX3N0cjogc3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTtcclxuICBfaW50VmFsMTogbnVtYmVyID0gMDtcclxuICBfbGluZTogbnVtYmVyID0gMDtcclxuICBfb2JqMTogYW55ID0gbnVsbDtcclxuICBfcGFyYW1ldGVyczogYW55W10gPSBudWxsO1xyXG4gIF9ib29sVmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX29iajI6IGFueSA9IG51bGw7XHJcbiAgX21nVmFsdWU6IE1nVmFsdWUgPSBudWxsO1xyXG4gIF9zZXRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFyZ3VtZW50cyA6IEFycmF5PGFueT4gO1xyXG4gIHJlc3VsdFN0cmluZyA6IHN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgbG9ja09iamVjdDogYW55ID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ29uc3RydWN0b3IgOiBzZXRzIHRoZSBjb250ZXh0SUQgZm9yIHRoZSBjdXJyZW50IGNvbW1hbmQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmV0dXJucyB3aGV0aGVyIGNvbnRyb2wgaXMgZm9jdXNhYmxlIG9yIG5vdC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nQ29udHJvbFwiPiB0aGUgY29udHJvbCB3aGljaCBuZWVkcyB0byBiZSBjaGVja2VkLiA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgY2FuRm9jdXMoZ3VpTWdDb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DQU5fRk9DVVM7XHJcbiAgICB0aGlzLl9vYmoxID0gZ3VpTWdDb250cm9sO1xyXG5cclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX21nVmFsdWUuYm9vbFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gLy8vIFJldHVybnMgdGhlIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgZm9yIHNlbGVjdGVkIGluZGljZSBvZiBsaXN0IGNvbnRyb2wuLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5jb21tYSBzZXBhcmF0ZWQgc3RyaW5nIGZvciBzZWxlY3RlZCBpbmRpY2Ugb2YgbGlzdCBjb250cm9sPC9yZXR1cm5zPlxyXG4gIEdldFNlbGVjdGVkSW5kaWNlKGd1aU1nQ29udHJvbDogR3VpTWdDb250cm9sKTogc3RyaW5nIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfU0VMRUNURURfSU5ESUNFO1xyXG4gICAgdGhpcy5fb2JqMSA9IGd1aU1nQ29udHJvbDtcclxuXHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLnN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBpbmRlbnQgaGFzIGJlZW4gYXBwbGllZCB0byBSaWNoIEVkaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nQ29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRIYXNJbmRlbnQoZ3VpTWdDb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSEFTSU5ERU5UO1xyXG4gICAgdGhpcy5fb2JqMSA9IGd1aU1nQ29udHJvbDtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9vbFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2RlIGlzIHNldCBUUlVFXFxGQUxTRSB0aGF0IEd1aVV0aWxlc1xcR2V0VmFsdWUoKSBtZXRob2Qgd2lsbCBiZSB1c2VcclxuICAvLy8gdGhpcyBmYWxnIHNheSBpZiB0byByZXR1cm4gdGhlIDogKHRydWUpIHN1Z2dlc3RlZCB2YWx1ZSBvciAoZmFsc2UpdGhlIHJlYWwgdmFsdWVcclxuICAvLy8gdGhpcyBtZXRob2QgaXMgdXNlIGZvciBNR19BQ1RfQ1RSTF9NT0RJRllcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJldFN1Z2dlc3RlZFZhbHVlXCI+PC9wYXJhbT5cclxuICBzZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgcmV0U3VnZ2VzdGVkVmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfR0VUX1NVR0dFU1RFRF9WQUxVRV9GT1JfQ0hPSUNFX0NPTlRST0xfT05fVEFHREFUQTtcclxuICAgIHRoaXMuX29iajIgPSBjdHJsO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLl9ib29sVmFsID0gcmV0U3VnZ2VzdGVkVmFsdWU7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gR2V0IHZhbHVlIG9mIHRoZSBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9iamVjdFwiPmEgcmVmZXJlbmNlIHRvIHRoZSByZWxldmFudCBvYmplY3Q8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY3RcIj5hIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHRoYXQgb24gcmV0dXJuIHdpbGwgY29udGFpbiB0aGUgcmVxdWVzdGVkIHZhbHVlcyBvbiBzdHJpbmc8L3BhcmFtPlxyXG4gIGdldFZhbHVlKG9iajogYW55LCBsaW5lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9WQUxVRTtcclxuICAgIHRoaXMuX29iajIgPSBvYmo7XHJcblxyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5vYmo7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0VG9wSW5kZXgodGFibGVjb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9UT1BfSU5ERVg7XHJcbiAgICB0aGlzLl9vYmoyID0gdGFibGVjb250cm9sO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9pbnRWYWwxO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXNSb3dFZGl0aW5nKHRhYmxlY29udHJvbDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIGlzTGluZU1vZGU6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSVNfUk9XX0VESVRJTkc7XHJcbiAgICB0aGlzLl9vYmoyID0gdGFibGVjb250cm9sO1xyXG4gICAgdGhpcy5faW50VmFsMSA9IGxpbmU7XHJcbiAgICB0aGlzLl9ib29sVmFsID0gaXNMaW5lTW9kZTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jvb2xWYWw7XHJcbiAgfVxyXG5cclxuICBicm93c2VyRXhlY3V0ZShicm93c2VyQ29udHJvbDogR3VpTWdDb250cm9sLCB0ZXh0OiBzdHJpbmcsIHN5bmNFeGVjOiBib29sZWFuLCBsYW5ndWFnZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQlJPV1NFUl9FWEVDVVRFO1xyXG4gICAgdGhpcy5fb2JqMiA9IGJyb3dzZXJDb250cm9sO1xyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnN0ciA9IHRleHQ7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLm9iaiA9IGxhbmd1YWdlO1xyXG5cclxuICAgIC8vIEZvciBhc3luYyBleGVjdXRpb24sIHJldHVybiB0cnVlIGlmIHRoZSBjb21tYW5kIGlzIHBhc3NlZCB0byB0aGUgZ3VpIHRocmVhZC5cclxuICAgIC8vIEZvciBzeW5jIGV4ZWN1dGlvbiwgcmV0dXJuIHRydWUgaWYgdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGJ5IHRoZSBndWkgdGhyZWFkLlxyXG4gICAgaWYgKHN5bmNFeGVjKSB7XHJcbiAgICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLmJvb2xWYWw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5PcGVuIG1lc3NhZ2UgYm94IHdpdGggcGFyZW50IGZvcm08L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGl0bGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3R5bGVcIj50aGUgc3R5bGUgb2YgdGhlIG1lc3NhZ2UgYm94IGNhbiBiZSBmbGFncyBvZiBTdHlsZXMuTVNHQk9YX3h4eCA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbWVzc2FnZSBib3ggc3R5bGUgZnJvbSBTdHlsZXMuTVNHQk9YX1hYWDwvcmV0dXJucz5cclxuICBtZXNzYWdlQm94KHRpdGxlOiBzdHJpbmcsIG1zZzogc3RyaW5nLCBzdHlsZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5NRVNTQUdFX0JPWDtcclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS50aXRsZSA9IHRpdGxlO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5zdHIgPSAoKG1zZyA9PT0gbnVsbCkgPyAnJyA6IG1zZyk7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnN0eWxlID0gc3R5bGU7XHJcbiAgICBFdmVudHMuUmVmcmVzaFRhYmxlcygpO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLm51bWJlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZXQgdGl0bGUgdG8gYnJvd3Nlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0b3BNb3N0Rm9ybVwiPnRoZSBwYXJlbnQgZm9ybSBvZiB0aGUgbWVzc2FnZSBib3g8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRpdGxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG1lc3NhZ2UgYm94IHN0eWxlIGZyb20gU3R5bGVzLk1TR0JPWF9YWFg8L3JldHVybnM+XHJcbiAgc2V0VGl0bGUodG9wTW9zdEZvcm06IEd1aU1nRm9ybSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNFVF9USVRMRTtcclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fb2JqMiA9IHRvcE1vc3RGb3JtO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS50aXRsZSA9ICgodGl0bGUgPT09IG51bGwpID8gJycgOiB0aXRsZSk7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZXMgSW52b2tlIFVEUCBvcGVyYXRpb24gZnJvbSBHVUkgdGhyZWFkXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+Q29udGV4dCBpZDwvcGFyYW0+XHJcbiAgaW52b2tlVURQKGNvbnRleHRJZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5JTlZPS0VfVURQQ09NTUFORDtcclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5vYmogPSBjb250ZXh0SWQ7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21nVmFsdWUubnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2FwdGlvblwiPmRlc2NyaXB0aW9uIGZvciB0aGUgZGlhbG9nIHdpbmRvdzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGF0aFwiPmluaXRpYWwgcGF0aCB0byBicm93c2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJTaG93TmV3Rm9sZGVyXCI+c2hvdWxkIHNob3cgdGhlIG5ldyBmb2xkZXIgYnV0dG9uPzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBkaXJlY3RvcnkgcGF0aCBzZWxlY3RlZCBieSB1c2VyPC9yZXR1cm5zPlxyXG4gIGRpcmVjdG9yeURpYWxvZ0JveChjYXB0aW9uOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgYlNob3dOZXdGb2xkZXI6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkRJUkVDVE9SWV9ESUFMT0dfQk9YO1xyXG5cclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5jYXB0aW9uID0gY2FwdGlvbjtcclxuICAgIHRoaXMuX21nVmFsdWUucGF0aCA9IHBhdGg7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLmJvb2wxID0gYlNob3dOZXdGb2xkZXI7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLnN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRmlsZSBPcGVuIERpYWxvZyBCb3hcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRpdGxlXCI+RGlhbG9nIHdpbmRvdyBjYXB0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbml0RGlyXCI+SW5pdGlhbCBkaXJlY3Rvcnk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpbHRlck5hbWVzXCI+ZmlsdGVyIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2hlY2tFeGlzdHNcIj52ZXJpZnkgb3BlbmVkIGZpbGUgZXhpc3RzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtdWx0aVNlbGVjdFwiPmVuYWJsZSBzZWxlY3RpbmcgbXVsdGlwbGUgZmlsZXM8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5maWxlIHBhdGggc2VsZWN0ZWQgYnkgdXNlcjwvcmV0dXJucz5cclxuICBmaWxlT3BlbkRpYWxvZ0JveCh0aXRsZTogc3RyaW5nLCBkaXJOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIGZpbHRlck5hbWVzOiBzdHJpbmcsIGNoZWNrRXhpc3RzOiBib29sZWFuLCBtdWx0aVNlbGVjdDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuRklMRV9PUEVOX0RJQUxPR19CT1g7XHJcblxyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnRpdGxlID0gdGl0bGU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnBhdGggPSBkaXJOYW1lO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5zdHIgPSBmaWxlTmFtZTtcclxuICAgIHRoaXMuX21nVmFsdWUuZmlsdGVyID0gZmlsdGVyTmFtZXM7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLmJvb2xWYWwgPSBjaGVja0V4aXN0cztcclxuICAgIHRoaXMuX21nVmFsdWUuYm9vbDEgPSBtdWx0aVNlbGVjdDtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21nVmFsdWUuc3RyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGaWxlIFNhdmUgRGlhbG9nIEJveFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGl0bGVcIj5jYXB0aW9uIG9mIHRoZSBkaWFsb2cgd2luZG93PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbml0RGlyXCI+IGluaXRpYWwgZGlyZWN0b3J5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWx0ZXJOYW1lc1wiPmZpbHRlciBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlZmF1bHRFeHRlbnNpb25cIj4gZGVmYXVsdCBleHRlbnNpb24gZm9yIGZpbGUgbmFtZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3ZlcndyaXRlUHJvbXB0XCI+IHNob3VsZCBwcm9tcHQgd2hlbiBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmaWxlPzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmV0RmlsZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmZpbGUgcGF0aCBzZWxlY3RlZCBieSB1c2VyPC9yZXR1cm5zPlxyXG4gIGZpbGVTYXZlRGlhbG9nQm94KHRpdGxlOiBzdHJpbmcsIGRpck5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZywgZmlsdGVyTmFtZXM6IHN0cmluZywgZGVmYXVsdEV4dGVuc2lvbjogc3RyaW5nLCBvdmVyd3JpdGVQcm9tcHQ6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkZJTEVfU0FWRV9ESUFMT0dfQk9YO1xyXG5cclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS50aXRsZSA9IHRpdGxlO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5wYXRoID0gZGlyTmFtZTtcclxuICAgIHRoaXMuX21nVmFsdWUuc3RyID0gZmlsZU5hbWU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLmZpbHRlciA9IGZpbHRlck5hbWVzO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5jYXB0aW9uID0gZGVmYXVsdEV4dGVuc2lvbjtcclxuICAgIHRoaXMuX21nVmFsdWUuYm9vbDEgPSBvdmVyd3JpdGVQcm9tcHQ7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLnN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5QdXQgQ29tbWFuZCB0byBjcmVhdGUgZGlhbG9nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhhbmRsZVwiPnJlZmVyZW5jZSB0byB0aGUgZGlhbG9nIGhhbmRsZXJzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvYmpUeXBlXCI+cGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8gb2JqZWN0cyBjb25zdHJ1Y3RvcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyYW1ldGVyc1wiPjwvcGFyYW0+XHJcbiAgY3JlYXRlRGlhbG9nKGhhbmRsZTogRGlhbG9nSGFuZGxlciwgcGFyYW1ldGVyczogYW55W10pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DUkVBVEVfRElBTE9HO1xyXG4gICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XHJcbiAgICB0aGlzLl9vYmoyID0gaGFuZGxlO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5QdXQgQ29tbWFuZCB0byBjbG9zZSBkaWFsb2c8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGlhbG9nXCI+PC9wYXJhbT5cclxuICBjbG9zZURpYWxvZyhoYW5kbGU6IERpYWxvZ0hhbmRsZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DTE9TRV9ESUFMT0c7XHJcbiAgICB0aGlzLl9vYmoyID0gaGFuZGxlO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgdGV4dCB0byB0aGUgdGhlIGNvbnRyb2xcclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIHNldEVkaXRUZXh0KGNvbnRyb2w6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfRURJVF9URVhUO1xyXG4gICAgdGhpcy5fb2JqMiA9IGNvbnRyb2w7XHJcbiAgICB0aGlzLl9saW5lID0gbGluZTtcclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5zdHIgPSB0ZXh0O1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX21nVmFsdWUuYm9vbFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW5zZXJ0IHRoZSB0ZXh0IHRvIHRoZSB0aGUgY29udHJvbCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb25cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIGluc2VydEVkaXRUZXh0KGNvbnRyb2w6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBzdGFydFBvc2l0aW9uOiBudW1iZXIsIHRleHRUb0luc2VydDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuSU5TRVJUX0VESVRfVEVYVDtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX21nVmFsdWUuc3RyID0gdGV4dFRvSW5zZXJ0O1xyXG4gICAgdGhpcy5faW50VmFsMSA9IHN0YXJ0UG9zaXRpb247XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5ib29sVmFsO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT4gc2V0IHRoZSB0ZXh0IHRvIHRoZSB0aGUgY29udHJvbDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBzZXRTZWxlY3Rpb24oY29udHJvbDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBjYXJldFBvczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX1NFTEVDVElPTjtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLl94ID0gc3RhcnQ7XHJcbiAgICB0aGlzLl95ID0gZW5kO1xyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLm51bWJlciA9IGNhcmV0UG9zO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgdGV4dCB0byB0aGUgdGhlIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgc2V0U3VnZ2VzdGVkVmFsdWUoY29udHJvbDogR3VpTWdDb250cm9sLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX1NVR0dFU1RFRF9WQUxVRTtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnN0ciA9IHN1Z2dlc3RlZFZhbHVlO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNhcmV0IG9uIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBjYXJldFBvc0dldChjb250cm9sOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0NBUkVUX1BPUztcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcblxyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLm51bWJlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVmcmVzaCBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZWZyZXNoUGFnZShuYXZpZ2F0ZVRvUm9vdFJvdXRlOiBib29sZWFuLCBpbml0aWFsVXJsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5SRUZSRVNIX1BBR0U7XHJcbiAgICB0aGlzLl9ib29sVmFsID0gbmF2aWdhdGVUb1Jvb3RSb3V0ZTtcclxuICAgIHRoaXMuX29iajEgPSBpbml0aWFsVXJsO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgaWYgdGhlIENhcmVsIGlzIFBvc2l0aW9uZWQgb24gdGhlIGZpcnN0IGxpbmUgaW4gVGV4dEJveC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgZ2V0SXNUb3BPZlRleHRCb3goY29udHJvbDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSVNfVE9QX09GX1RFWFRCT1g7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9vbFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgaWYgdGhlIENhcmVsIGlzIFBvc2l0aW9uZWQgb24gdGhlIGxhc3QgbGluZSBpbiBUZXh0Qm94Ljwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBnZXRJc0VuZE9mVGV4dEJveChjb250cm9sOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9JU19FTkRfT0ZfVEVYVEJPWDtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fYm9vbFZhbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFBvc3QgYSBrZXkgZXZlbnQgKGVtdWxhdGUga2V5cyBwcmVzc2VkIGJ5IHRoZSB1c2VyKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImtleUNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0YXRlTWFza1wiPjwvcGFyYW0+XHJcbiAgcG9zdEtleUV2ZW50KGNvbnRyb2w6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBrZXlzOiBzdHJpbmcsIFBvc3RDaGFyOiBib29sZWFuLCBmb3JjZUxvZ2ljYWxDb250cm9sVGV4dFVwZGF0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlBPU1RfS0VZX0VWRU5UO1xyXG5cclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX21nVmFsdWUuc3RyID0ga2V5cztcclxuICAgIHRoaXMuX21nVmFsdWUuYm9vbDEgPSBmb3JjZUxvZ2ljYWxDb250cm9sVGV4dFVwZGF0ZTtcclxuICAgIHRoaXMuX2Jvb2xWYWwgPSBQb3N0Q2hhcjtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZW5kIFdNX0NIQVIgdG8gdGhlIHNwZWNpZmllZCBjb250cm9sIHZpYSBHVUkgdGhyZWFkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2hyXCI+PC9wYXJhbT5cclxuICBwb3N0Q2hhckV2ZW50KGNvbnRyb2w6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBjaHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlBPU1RfQ0hBUl9FVkVOVDtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLl9jaGFyID0gY2hyO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGRpc3Bvc2UgYWxsIHRoZSBzaGVsbHMuIGxhc3QgZGlzcG9zZSB3aWxsIGNsb3NlIHRoZSBkaXNwbGF5Ljwvc3VtbWFyeT5cclxuICBkaXNwb3NlQWxsRm9ybXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuRElTUE9TRV9BTExfRk9STVM7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm4gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Um93c0luUGFnZShjb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9ST1dTX0lOX1BBR0U7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faW50VmFsMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmV0dXJuIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKGNvbnRyb2w6IEd1aU1nQ29udHJvbCk6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX01BWF9ST1dTX0lOX1BBR0lOQVRFRF9UQUJMRTtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9pbnRWYWwxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm4gdGhlIG51bWJlciBvZiBoaWRkZW4gcm93cyAocGFydGlhbGx5IG9yIGZ1bGx5KSBpbiB0YWJsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEhpZGRlblJvd3NDb3VudEluVGFibGUoY29udHJvbDogR3VpTWdDb250cm9sKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSElEREVOX1JPV1NfQ09VTlRfSU5fVEFCTEU7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faW50VmFsMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBsYXN0IHdpbmRvdyBzdGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRMYXN0V2luZG93U3RhdGUoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9MQVNUX1dJTkRPV19TVEFURTtcclxuICAgIHRoaXMuX29iajIgPSBndWlNZ0Zvcm07XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9pbnRWYWwxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXRzIGxpbmtlZCBwYXJlbnQgaWR4IG9mIGZyYW1lc2V0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmcmFtZXNldFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRMaW5rZWRQYXJlbnRJZHgoZnJhbWVzZXQ6IEd1aU1nQ29udHJvbCk6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0xJTktFRF9QQVJFTlRfSURYO1xyXG4gICAgdGhpcy5fb2JqMiA9IGZyYW1lc2V0O1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faW50VmFsMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBjb2x1bW5zIHN0YXRlIC0tLSBsYXllciwgd2lkdGggYW5kIHdpZHRoRm9yRmlsbFRhYmxlUGxhY2VtZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb2x1bW5zU3RhdGUodGFibGVDdHJsOiBHdWlNZ0NvbnRyb2wpOiBMaXN0PG51bWJlcltdPiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0NPTFVNTlNfU1RBVEU7XHJcbiAgICB0aGlzLl9vYmoyID0gdGFibGVDdHJsO1xyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21nVmFsdWUubGlzdE9mSW50QXJyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBVcGRhdGUgdGhlIENvbnRyb2wuVGFnRGF0YS5NYXBEYXRhIHdpdGggdGhlIG5ld09iamVjdFRvU2V0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdPYmplY3RUb1NldFwiPjwvcGFyYW0+XHJcbiAgTWFwV2lkZ2V0KG5ld09iamVjdFRvU2V0OiBhbnkpOiB2b2lkO1xyXG4gIE1hcFdpZGdldCgpOiB2b2lkO1xyXG4gIE1hcFdpZGdldChuZXdPYmplY3RUb1NldD86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHRoaXMuTWFwV2lkZ2V0XzAobmV3T2JqZWN0VG9TZXQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLk1hcFdpZGdldF8xKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIE1hcFdpZGdldF8wKG5ld09iamVjdFRvU2V0OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5NQVBfV0lER0VUX1RPX0dVSV9PQkpFQ1Q7XHJcbiAgICB0aGlzLl9vYmoxID0gbmV3T2JqZWN0VG9TZXQ7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQWN0aXZhdGUgdGhlIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIEFjdGl2YXRlRm9ybShndWlNZ0Zvcm06IEd1aU1nRm9ybSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkFDVElWQVRFX0ZPUk07XHJcbiAgICB0aGlzLl9vYmoxID0gZ3VpTWdGb3JtO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgaWYgdGhlIHBhc3NlZCBmb3JtIGlzIGFjdGl2ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0Zvcm1BY3RpdmUoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pOiBib29sZWFuO1xyXG4gIGlzRm9ybUFjdGl2ZSgpOiB2b2lkO1xyXG4gIGlzRm9ybUFjdGl2ZShndWlNZ0Zvcm0/OiBHdWlNZ0Zvcm0pOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICByZXR1cm4gdGhpcy5pc0Zvcm1BY3RpdmVfMChndWlNZ0Zvcm0pO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmlzRm9ybUFjdGl2ZV8xKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRm9ybUFjdGl2ZV8wKGd1aU1nRm9ybTogR3VpTWdGb3JtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9vbFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gR2V0cyB0aGUgUlRGIHZhbHVlIG9mIHRoZSBSVEYgZWRpdCBjb250cm9sIHdoaWNoIHdhcyBzZXQgYmVmb3JlIGVudGVyaW5nIGl0LiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJ0ZlZhbHVlQmVmb3JlRW50ZXJpbmdDb250cm9sKGd1aU1nQ29udHJvbDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9SVEZfVkFMVUVfQkVGT1JFX0VOVEVSSU5HX0NPTlRST0w7XHJcbiAgICB0aGlzLl9vYmoyID0gZ3VpTWdDb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcblxyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5zdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdldCBQb3NpdGlvbiBJc24gb2YgUm93IGluIERhdGFUYWJsZSBhdHRhY2hlZCB0byBEViBDb250cm9sLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0YVRhYmxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldERWQ29udHJvbFBvc2l0aW9uSXNuKGRhdGFUYWJsZTogYW55LCBsaW5lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9EVkNPTlRST0xfUE9TSVRJT05fSVNOO1xyXG4gICAgdGhpcy5fb2JqMSA9IGRhdGFUYWJsZTtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9pbnRWYWwxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHZXQgUG9zaXRpb24gSXNuIG9mIFJvdyBpbiBEYXRhVGFibGUgYXR0YWNoZWQgdG8gRFYgQ29udHJvbC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGFUYWJsZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBDbGVhckRhdGF0YWJsZShkdkNvbnRyb2w6IEd1aU1nQ29udHJvbCwgZGF0YVRhYmxlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DTEVBUl9EQVRBX1RBQkxFO1xyXG4gICAgdGhpcy5fb2JqMSA9IGR2Q29udHJvbDtcclxuICAgIHRoaXMuX29iajIgPSBkYXRhVGFibGU7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBTZXQgRGF0YXNvdXJjZSBwcm9wZXJ0eSBvZiBEYXRhdmlldyBjb250cm9sLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZHZDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhVGFibGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb3BlcnR5TmFtZVwiPjwvcGFyYW0+XHJcbiAgU2V0RGF0YVNvdXJjZVRvRGF0YVZpZXdDb250cm9sKGR2Q29udHJvbDogR3VpTWdDb250cm9sLCBkYXRhVGFibGU6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfREFUQV9TT1VSQ0VfVE9fRFZDT05UUk9MO1xyXG4gICAgdGhpcy5fb2JqMSA9IGR2Q29udHJvbDtcclxuICAgIHRoaXMuX29iajIgPSBkYXRhVGFibGU7XHJcbiAgICB0aGlzLl9zdHIgPSBwcm9wZXJ0eU5hbWU7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2hlY2sgd2hldGhlciB0aGUgY29tYm9ib3ggaXMgaW4gYSBEcm9wcGVkRG93biBzdGF0ZSBvciBub3QuXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY29tYm9Cb3hcIj5NZ2NvbWJvQm94IGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwibGluZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHJldHVybnM+Ym9vbDwvcmV0dXJucz5cclxuICBJc0NvbWJvQm94SW5Ecm9wcGVkRG93blN0YXRlKGNvbWJvQm94OiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLklTX0NPTUJPX0RST1BQRURfRE9XTjtcclxuICAgIHRoaXMuX29iajEgPSBjb21ib0JveDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9vbFZhbDtcclxuICB9XHJcblxyXG4gIEV4ZWN1dGVDYWxsSlMoZm9ybSAsIGZvcm1OYW1lOiBzdHJpbmcsICBmdW5jdGlvbk5hbWU6IHN0cmluZywgYXJnczogQXJyYXk8YW55Pik6IHN0cmluZyB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQ0FMTF9KUztcclxuICAgIHRoaXMuX29iajIgPSBmb3JtO1xyXG4gICAgdGhpcy5jb250cm9sTmFtZSA9IGZvcm1OYW1lO1xyXG4gICAgdGhpcy5fc3RyID0gZnVuY3Rpb25OYW1lO1xyXG4gICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLnJlc3VsdFN0cmluZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2FsbHMgUnVuKCkgc3luY2hyb25vdXNseSB0byBleGVjdXRlIHRoZSBjb21tYW5kLlxyXG4gIC8vLyBCdXQgYmVmb3JlIHRoYXQsIGl0IGV4ZWN1dGVzIHRoZSBHdWlDb21tYW5kUXVldWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEludm9rZSgpOiB2b2lkIHtcclxuICAgIEd1aUNvbW1hbmRRdWV1ZS5nZXRJbnN0YW5jZSgpLmludm9rZSgpO1xyXG4gICAgaWYgKHRoaXMuX29iajIgaW5zdGFuY2VvZiBDb250cm9sQmFzZSkge1xyXG4gICAgICBsZXQgY29udHJvbEJhc2U6IENvbnRyb2xCYXNlID0gPENvbnRyb2xCYXNlPnRoaXMuX29iajI7XHJcbiAgICAgIHRoaXMuVGFza1RhZyA9IGNvbnRyb2xCYXNlLlRhc2tUYWc7XHJcbiAgICAgIHRoaXMuY29udHJvbE5hbWUgPSBjb250cm9sQmFzZS5VbmlxdWVOYW1lO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9vYmoyIGluc3RhbmNlb2YgR3VpTWdGb3JtKSB7XHJcbiAgICAgIGxldCBndWlNZ0Zvcm06IEd1aU1nRm9ybSA9IDxHdWlNZ0Zvcm0+dGhpcy5fb2JqMjtcclxuICAgICAgdGhpcy5UYXNrVGFnID0gZ3VpTWdGb3JtLlRhc2tUYWc7XHJcbiAgICB9IGVsc2VcclxuICAgICAgdGhpcy5UYXNrVGFnID0gJzAnOyAvLyBnZW5lcmFsIGNvbW1hbmRcclxuXHJcbiAgICBVSUJyaWRnZS5nZXRJbnN0YW5jZSgpLkV4ZWN1dGVJbnRlcmFjdGl2ZUNvbW1hbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGltcGxlbWVudHMgdGhlIFJ1bm5hYmxlIHJ1biBtZXRob2QgZm9yIGNhbGxpbmcgRGlzcGxheS5zeW5jRXhlYygpPC9zdW1tYXJ5PlxyXG4gIC8vIFJ1bigpOiB2b2lkIHtcclxuICAvLyAgIC8vIFNldHMgdGhlIGN1cnJlbnRDb250ZXh0SURcclxuICAvLyAgIGxldCBjb250ZXh0SURHdWFyZCA9IG5ldyBDb250ZXh0SURHdWFyZCh0aGlzLl9jb250ZXh0SUQpO1xyXG4gIC8vICAgdHJ5IHtcclxuICAvLyAgICAgc3dpdGNoICh0aGlzLl9jb21tYW5kVHlwZSkge1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfRk9OVF9NRVRSSUNTOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldEZvbnRNZXRyaWNzKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX1JFU09MVVRJT046XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0UmVzb2x1dGlvbigpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9CT1VORFM6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQm91bmRzKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX1ZBTFVFOlxyXG4gIC8vICAgICAgICAgdGhpcy5vblZhbHVlKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX0JST1dTRVJfVEVYVDpcclxuICAvLyAgICAgICAgIHRoaXMub25TZXRCcm93c2VyVGV4dCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9CUk9XU0VSX1RFWFQ6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0QnJvd3NlclRleHQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5CUk9XU0VSX0VYRUNVVEU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQnJvd3NlckV4ZWN1dGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfVE9QX0lOREVYOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldFRvcEluZGV4KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuTUVTU0FHRV9CT1g6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uTWVzc2FnZUJveCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkRJUkVDVE9SWV9ESUFMT0dfQk9YOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkRpcmVjdG9yeURpYWxvZ0JveCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9DTElFTlRfQk9VTkRTOlxyXG4gIC8vICAgICAgICAgdGhpcy5nZXRDbGllbnRCb3VuZHMoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfRURJVF9URVhUOlxyXG4gIC8vICAgICAgICAgdGhpcy5vblNldEVkaXRUZXh0KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuSU5TRVJUX0VESVRfVEVYVDpcclxuICAvLyAgICAgICAgIHRoaXMub25JbnNlcnRFZGl0VGV4dCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNFVF9TRUxFQ1RJT046XHJcbiAgLy8gICAgICAgICB0aGlzLm9uU2V0U2VsZWN0aW9uKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX1NFTEVDVElPTjpcclxuICAvLyAgICAgICAgIHRoaXMub25TZWxlY3Rpb25HZXQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfQ0FSRVRfUE9TOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkNhcmV0UG9zR2V0KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0lTX1RPUF9PRl9URVhUQk9YOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldElzVG9wT2ZUZXh0Qm94KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0lTX0VORF9PRl9URVhUQk9YOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldElzRW5kT2ZUZXh0Qm94KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQ0xJUEJPQVJEX0dFVF9DT05URU5UOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkNsaXBib2FyZFJlYWQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DTElQQk9BUkRfU0VUX0NPTlRFTlQ6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQ2xpcGJvYXJkV3JpdGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DTElQQk9BUkRfUEFTVEU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQ2xpcGJvYXJkUGFzdGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5QT1NUX0tFWV9FVkVOVDpcclxuICAvLyAgICAgICAgIHRoaXMub25Qb3N0S2V5RXZlbnQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5QT1NUX0NIQVJfRVZFTlQ6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uUG9zdENoYXJFdmVudCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNFVF9DVVJTT1I6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uU2V0Q3Vyc29yKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuRElTUE9TRV9BTExfRk9STVM6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uRGlzcG9zZUFsbEZvcm1zKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX1JPV1NfSU5fUEFHRTpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRSb3dzSW5QYWdlKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0hJRERFTl9ST1dTX0NPVU5UX0lOX1RBQkxFOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldEhpZGRlblJvd3NDb3VudEluVGFibGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5GSUxFX09QRU5fRElBTE9HX0JPWDpcclxuICAvLyAgICAgICAgIHRoaXMub25GaWxlT3BlbkRpYWxvZ0JveCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkZJTEVfU0FWRV9ESUFMT0dfQk9YOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkZpbGVTYXZlRGlhbG9nQm94KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQ1JFQVRFX0RJQUxPRzpcclxuICAvLyAgICAgICAgIHRoaXMub25DcmVhdGVEaWFsb2coKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5PUEVOX0RJQUxPRzpcclxuICAvLyAgICAgICAgIHRoaXMub25PcGVuRGlhbG9nKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQ0xPU0VfRElBTE9HOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkNsb3NlRGlhbG9nKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX0dFVF9TVUdHRVNURURfVkFMVUVfRk9SX0NIT0lDRV9DT05UUk9MX09OX1RBR0RBVEE6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uU2V0R2V0U3VnZ2VzdGVkVmFsdWVPZkNob2ljZUNvbnRyb2xPblRhZ0RhdGEoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfTEFTVF9XSU5ET1dfU1RBVEU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0TGFzdFdpbmRvd1N0YXRlKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0ZSQU1FU19CT1VORFM6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0RnJhbWVzQm91bmRzKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0xJTktFRF9QQVJFTlRfSURYOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldExpbmtlZFBhcmVudElkeCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9GT1JNX0JPVU5EUzpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRGb3JtQm91bmRzKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0NPTFVNTlNfU1RBVEU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0Q29sdW1uc1N0YXRlKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0ZPUk1fSEFORExFOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldEZvcm1IYW5kbGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfQ1RSTF9IQU5ETEU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0Q3RybEhhbmRsZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLklTX0ZPUk1fQUNUSVZFOlxyXG4gIC8vICAgICAgICAgdGhpcy5pc0Zvcm1BY3RpdmUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfRFJPUFBFRF9EQVRBOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldERyb3BwZWREYXRhKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0RST1BQRURfUE9JTlQ6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0RHJvcHBlZFBvaW50KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0RST1BQRURfU0VMRUNUSU9OOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldERyb3BwZWRTZWxlY3Rpb24oKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5EUk9QX0ZPUk1BVF9TVVBQT1JURUQ6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQ2hlY2tEcm9wRm9ybWF0UHJlc2VudCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9JU19CRUdJTl9EUkFHOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldElzQmVnaW5EcmFnKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQUNUSVZBVEVfTkVYVF9PUl9QUkVWSU9VU19NRElfQ0hJTEQ6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uQWN0aXZhdGVOZXh0T3JQcmV2aW91c01ESUNoaWxkKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VORF9JTUVfTVNHOlxyXG4gIC8vICAgICAgICAgdGhpcy5vblNlbmRJbWVNc2coKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DQU5fRk9DVVM6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQ2FuRm9jdXMoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfU0VMRUNURURfSU5ESUNFOlxyXG4gIC8vICAgICAgICAgdGhpcy5PbkdldFNlbGVjdGVkSW5kaWNlKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX1NVR0dFU1RFRF9WQUxVRTpcclxuICAvLyAgICAgICAgIHRoaXMub25TZXRTdWdnZXN0ZWRWYWx1ZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLk1BUF9XSURHRVRfVE9fR1VJX09CSkVDVDpcclxuICAvLyAgICAgICAgIHRoaXMuTWFwV2lkZ2V0KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuUkVNT1ZFX0ROX0NPTlRST0xfVkFMVUVfQ0hBTkdFRF9IQU5ETEVSOlxyXG4gIC8vICAgICAgICAgdGhpcy5PblJlbW92ZUROQ29udHJvbFZhbHVlQ2hhbmdlZEhhbmRsZXIoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5BRERfRE5fQ09OVFJPTF9WQUxVRV9DSEFOR0VEX0hBTkRMRVI6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uQWRkRE5Db250cm9sVmFsdWVDaGFuZ2VkSGFuZGxlcigpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9SVEZfVkFMVUVfQkVGT1JFX0VOVEVSSU5HX0NPTlRST0w6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uR2V0UnRmVmFsdWVCZWZvcmVFbnRlcmluZ0NvbnRyb2woKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfTURJX0NISUxEX0NPVU5UOlxyXG4gIC8vICAgICAgICAgdGhpcy5PbkdldE1ESUNoaWxkQ291bnQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5BQ1RJVkFURV9GT1JNOlxyXG4gIC8vICAgICAgICAgdGhpcy5PbkFjdGl2YXRlRm9ybSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkVOQUJMRV9NRU5VX0VOVFJZOlxyXG4gIC8vICAgICAgICAgdGhpcy5PbkVuYWJsZU1lbnVFbnRyeSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNIT1dfQ09OVEVYVF9NRU5VOlxyXG4gIC8vICAgICAgICAgdGhpcy5PblNob3dDb250ZXh0TWVudSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLklTX0NPTUJPX0RST1BQRURfRE9XTjpcclxuICAvLyAgICAgICAgIHRoaXMuT25Jc0NvbWJvRHJvcHBlZERvd25kU3RhdGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5JTlZPS0VfVURQQ09NTUFORDpcclxuICAvLyAgICAgICAgIHRoaXMub25JbnZva2VVRFAoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSEFTSU5ERU5UOlxyXG4gIC8vICAgICAgICAgdGhpcy5PbkdldEhhc0luZGVudCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGNhdGNoIChleCkge1xyXG4gIC8vICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAvLyAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgLy8gICAgICAgdGhyb3cgZXg7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgZWxzZVxyXG4gIC8vICAgICAgIHRocm93IGV4OyAvLyBSZXNldCB0aGUgY3VycmVudCBjb250ZXh0SUQuXHJcbiAgLy8gICB9XHJcbiAgLy8gICBmaW5hbGx5IHtcclxuICAvLyAgICAgY29udGV4dElER3VhcmQuRGlzcG9zZSgpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBSZW1vdmUgdGhlIFZhbHVlQ2hhbmdlZEhhbmRsZXIuIDwvc3VtbWFyeT5cclxuICBPblJlbW92ZUROQ29udHJvbFZhbHVlQ2hhbmdlZEhhbmRsZXIoKTogdm9pZCB7XHJcbiAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZygnUmVtb3ZlRE5Db250cm9sVmFsdWVDaGFuZ2VkSGFuZGxlciAtIE5vdCBJbXBsZW1lbnRlZCBZZXQnKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+IEFkZCB0aGUgVmFsdWVDaGFuZ2VkSGFuZGxlci4gPC9zdW1tYXJ5PlxyXG4gIE9uQWRkRE5Db250cm9sVmFsdWVDaGFuZ2VkSGFuZGxlcigpOiB2b2lkIHtcclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKCdBZGRETkNvbnRyb2xWYWx1ZUNoYW5nZWRIYW5kbGVyIC0gTm90IEltcGxlbWVudGVkIFlldCcpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHZXRzIHRoZSBSVEYgdmFsdWUgb2YgdGhlIFJURiBlZGl0IGNvbnRyb2wgd2hpY2ggd2FzIHNldCBiZWZvcmUgZW50ZXJpbmcgaXQuIDwvc3VtbWFyeT5cclxuICBPbkdldFJ0ZlZhbHVlQmVmb3JlRW50ZXJpbmdDb250cm9sKCk6IHZvaWQge1xyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coJ09uR2V0T3JnUnRmVmFsdWUgLSBOb3QgSW1wbGVtZW50ZWQgWWV0Jyk7XHJcbiAgfVxyXG5cclxuLy8vIG1ldGhvZHMgc3VzcGVjdGVkIGFzIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBHdWlJbnRlcmFjdGl2ZSBjbGFzc2VzIG9mIHRoZSBzdGFuZGFyZC9jb21wYWN0IGZyYW1ld29ya3NcclxuICBhYnN0cmFjdCBvbkdldEJyb3dzZXJUZXh0KCk6IHZvaWQgO1xyXG5cclxuICBhYnN0cmFjdCBvbkJyb3dzZXJFeGVjdXRlKCk6IHZvaWQgO1xyXG5cclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZXMgSW52b2tlIFVEUCBvcGVyYXRpb24gZnJvbSBHVUkgdGhyZWFkXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIG9uSW52b2tlVURQKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgYWJzdHJhY3Qgb25EaXJlY3RvcnlEaWFsb2dCb3goKTogdm9pZCA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gSGFuZGxlIHRoZSBmaWxlIG9wZW4gZGlhbG9nIGJveFxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgb25GaWxlT3BlbkRpYWxvZ0JveCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gSGFuZGxlIHRoZSBmaWxlIHNhdmUgZGlhbG9nIGJveFxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgb25GaWxlU2F2ZURpYWxvZ0JveCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5DcmVhdGUgZGlhbG9nPC9zdW1tYXJ5PlxyXG4gIG9uQ3JlYXRlRGlhbG9nKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pk9wZW5zIGRpYWxvZzwvc3VtbWFyeT5cclxuICBvbk9wZW5EaWFsb2coKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PkNsb3NlcyBkaWFsb2c8L3N1bW1hcnk+XHJcbiAgb25DbG9zZURpYWxvZygpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5UaGlzIGZ1bmN0aW9uIHJldHVybnMgaWYgdGhlIGZvcm0gaXMgYWN0aXZlIG9yIG5vdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNGb3JtQWN0aXZlXzEoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBkaXNwb3NlIGFsbCBzaGVsbHMuPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25EaXNwb3NlQWxsRm9ybXMoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGNhbGN1bGF0aW5nIHRoZSBmb250IG1ldHJpY3M8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkdldEZvbnRNZXRyaWNzKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT4gR2V0cyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgY29udHJvbC4gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25HZXRSZXNvbHV0aW9uKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm4gdGhlIGNhcmV0IHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25DYXJldFBvc0dldCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2sgaWYgdGhlIGNhcmV0IGlzIHBvc2l0aW9uZWQgb24gdGhlIGZpcnN0IGxpbmUgb2YgVGV4dEJveDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uR2V0SXNUb3BPZlRleHRCb3goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9vbFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2sgaWYgdGhlIGNhcmV0IGlzIHBvc2l0aW9uZWQgb24gdGhlIGxhc3QgbGluZSBvZiBUZXh0Qm94PC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25HZXRJc0VuZE9mVGV4dEJveCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9ib29sVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm4gdGhlIGNhcmV0IHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25TZWxlY3Rpb25HZXQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8gcHJpdmF0ZSBvblZhbHVlKCk6IHZvaWQge1xyXG4gIC8vXHJcbiAgLy8gICBVSUJyaWRnZS5nZXRJbnN0YW5jZSgpLkdldEludGVyYWN0aXZlVmFsdWUodGhpcy50YXNrVGFnLCB0aGlzKTtcclxuICAvL1xyXG4gIC8vICAgLy90aGlzLl9tZ1ZhbHVlLnN0ciA9IFVJQnJpZGdlLmdldEluc3RhbmNlKCkuR2V0Q29udHJvbFZhbHVlKGNvbnRyb2xCYXNlLlRhc2tUYWcsICh0aGlzLl9saW5lKS50b1N0cmluZygpLCBjb250cm9sQmFzZS5VbmlxdWVOYW1lKTtcclxuICAvL1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIHRleHQgaW4gdGhlIHRleHQgY29udHJvbC48L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblNldEVkaXRUZXh0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnNlcnQgdGhlIHRleHQgdG8gdGhlIHRleHQgY29udHJvbCBhdCBhIGdpdmVuIHBvc2l0aW9uLjwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uSW5zZXJ0RWRpdFRleHQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgdGV4dChodG1sKSBvbiB0aGUgYnJvd3NlciBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIG9uU2V0QnJvd3NlclRleHQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgc2VsZWN0aW9uIGluIHRoZSB0ZXh0IGNvbnRyb2wuPC9zdW1tYXJ5PlxyXG4gIG9uU2V0U2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIHN1Z2dlc3RlZCB2YWx1ZSBmb3IgY2hvaWNlIGNvbnRyb2wuPC9zdW1tYXJ5PlxyXG4gIG9uU2V0U3VnZ2VzdGVkVmFsdWUoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG9uR2V0Um93c0luUGFnZSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmV0dXJuIHRoZSBudW1iZXIgb2YgaGlkZGVuIHJvd3MgKHBhcnRpYWxseSBvciBmdWxseSkgaW4gdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG9uR2V0SGlkZGVuUm93c0NvdW50SW5UYWJsZSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRhYmxlIHRvcCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgb25HZXRUb3BJbmRleCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSBDbGllbnQgYm91bmRzIG9mIHRoZSBvYmplY3Q8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRDbGllbnRCb3VuZHNfMSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBvc3QgYSBrZXkgY29tYmluYXRpb24uIFRoaXMgZW11bGF0ZXMga2V5cyBwcmVzc2VkIGJ5IHRoZSB1c2VyLiBTZXR0aW5nIHRoZSBkYXRhIGluIHRoZSB3aWRnZXQgdG8gaWdub3JlXHJcbiAgLy8vIGtleSBkb3duLCB3aWxsIGNhdXNlIHRoZSBPUyB0byBoYW5kbGUgdGhlIGV2ZW50IGluc3RlYWQgb2YgdXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBvblBvc3RLZXlFdmVudCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gU2VuZCBXTV9DSEFSIG1lc3NhZ2UgdG8gQ29tYm9Cb3ggYW5kIExpc3RCb3guIFRoaXMgZW11bGF0ZXMga2V5cyBwcmVzc2VkIGJ5IHRoZSB1c2VyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgb25Qb3N0Q2hhckV2ZW50KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE9uU2V0R2V0U3VnZ2VzdGVkVmFsdWVPZkNob2ljZUNvbnRyb2xPblRhZ0RhdGEoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IChLb3JlYW4gSU1FKSBzZW5kIE1HX0lNRV9YWFggbWVzc2FnZSB0byBNZ1RleHRCb3ggPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25TZW5kSW1lTXNnKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNldCBjdXJzb3Igb24gZm9ybXM8L3N1bW1hcnk+XHJcbiAgb25TZXRDdXJzb3IoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+dHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBkZWxlZ2F0ZWQgdG8gdGhlIEdVSSB0aHJlYWQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGludm9rZVJlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gd2luZG93U3RhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25HZXRMYXN0V2luZG93U3RhdGUoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgcGFyZW50IGxpbmsgSWR4IG9mIHRoaXMgZnJhbWVzZXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25HZXRMaW5rZWRQYXJlbnRJZHgoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgbGF5ZXIgb2YgdGhlIGNvbHVtblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkdldENvbHVtbnNTdGF0ZSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEluZGljYXRlcyBpZiBhIGNvbnRyb2wgY2FuIGJlIHNlbGVjdGVkLiA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkNhbkZvY3VzKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIHNlbGVjdGVkIGluZGljZSBvZiB0aGUgbGlzdGJveCBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBPbkdldFNlbGVjdGVkSW5kaWNlKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaWYgY29udHJvbCBoYXMgaW5kZW50IGFwcGxpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBPbkdldEhhc0luZGVudCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTWFwIFdpZGdldCB0byBHdWkgb2JqZWN0IChNZ0Zvcm0vTWdTdGF0dXNCYXIvTWdTdGF0dXNQYW5lKSBmb3IgTURJIGZyYW1lIGZvciBhIHBhcmFsbGVsIGNvbnRleHRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgTWFwV2lkZ2V0XzEoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IFBvc2l0aW9uSXNuIG9mIERhdGFSb3cgRnJvbSBEYXRhVGFibGUgYXR0YWNoZWQgdG8gRFZDb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgT25HZXREVkNvbnRyb2xQb3NpdGlvbklzbigpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQWN0aXZhdGUgdGhlIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBPbkFjdGl2YXRlRm9ybSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICAvLy88c3VtbWFyeT5cclxuICAvLy8gIENoZWNrIHdoZXRoZXIgdGhlIGNvbWJvYm94IGlzIGluIGRyb3BwZWQgZG93biBzdGF0ZS5cclxuICAvLy88L3N1bW1hcnk+XHJcbiAgLy8vPHJldHVybnM+ISEuPC9yZXR1cm5zPlxyXG4gIE9uSXNDb21ib0Ryb3BwZWREb3duZFN0YXRlKCk6IHZvaWQge1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEd1aUludGVyYWN0aXZlIGV4dGVuZHMgR3VpSW50ZXJhY3RpdmVCYXNlIHtcclxuXHJcbiAgT25HZXRSdGZWYWx1ZUJlZm9yZUVudGVyaW5nQ29udHJvbCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIG9uR2V0QnJvd3NlclRleHQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBvbkJyb3dzZXJFeGVjdXRlKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgb25EaXJlY3RvcnlEaWFsb2dCb3goKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpSW50ZXJhY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL2d1aS9sb3cvR3VpSW50ZXJhY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxDQUFOLElBQVksc0JBcUVYO0FBckVELFdBQVksc0JBQXNCO0lBQ2hDLDJGQUFnQixDQUFBO0lBQ2hCLHVGQUFjLENBQUE7SUFDZCwrRUFBVSxDQUFBO0lBQ1YsNkVBQVMsQ0FBQTtJQUNULDJGQUFnQixDQUFBO0lBQ2hCLDJGQUFnQixDQUFBO0lBQ2hCLHlGQUFlLENBQUE7SUFDZixxRkFBYSxDQUFBO0lBQ2IsaUZBQVcsQ0FBQTtJQUNYLDZFQUFTLENBQUE7SUFDVCxvR0FBb0IsQ0FBQTtJQUNwQiw4RkFBaUIsQ0FBQTtJQUNqQixzRkFBYSxDQUFBO0lBQ2IsNEZBQWdCLENBQUE7SUFDaEIsc0ZBQWEsQ0FBQTtJQUNiLHNGQUFhLENBQUE7SUFDYixzRkFBYSxDQUFBO0lBQ2Isb0ZBQVksQ0FBQTtJQUNaLHNHQUFxQixDQUFBO0lBQ3JCLHNHQUFxQixDQUFBO0lBQ3JCLHNHQUFxQixDQUFBO0lBQ3JCLHNHQUFxQixDQUFBO0lBQ3JCLDBGQUFlLENBQUE7SUFDZix3RkFBYyxDQUFBO0lBQ2QsMEZBQWUsQ0FBQTtJQUNmLGdGQUFVLENBQUE7SUFDViw4RkFB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cm9sJztcclxuaW1wb3J0IHsgTWdWYWx1ZSB9IGZyb20gJy4uL01nVmFsdWUnO1xyXG5pbXBvcnQgeyBHdWlNZ0Zvcm0gfSBmcm9tICcuLi9HdWlNZ0Zvcm0nO1xyXG5pbXBvcnQgeyBEaWFsb2dIYW5kbGVyIH0gZnJvbSAnLi9EaWFsb2dIYW5kbGVyJztcclxuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHsgTGlzdCB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgVUlCcmlkZ2UgfSBmcm9tICcuLi8uLi9VSUJyaWRnZSc7XHJcbmltcG9ydCB7IENvbnRyb2xCYXNlIH0gZnJvbSAnLi4vQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQgeyBHdWlDb21tYW5kUXVldWUgfSBmcm9tICcuL0d1aUNvbW1hbmRRdWV1ZSc7XHJcblxyXG5leHBvcnQgZW51bSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlIHtcclxuICBHRVRfRk9OVF9NRVRSSUNTLFxyXG4gIEdFVF9SRVNPTFVUSU9OLFxyXG4gIEdFVF9CT1VORFMsXHJcbiAgR0VUX1ZBTFVFLFxyXG4gIFNFVF9CUk9XU0VSX1RFWFQsXHJcbiAgR0VUX0JST1dTRVJfVEVYVCxcclxuICBCUk9XU0VSX0VYRUNVVEUsXHJcbiAgR0VUX1RPUF9JTkRFWCxcclxuICBNRVNTQUdFX0JPWCxcclxuICBTRVRfVElUTEUsXHJcbiAgRElSRUNUT1JZX0RJQUxPR19CT1gsXHJcbiAgR0VUX0NMSUVOVF9CT1VORFMsXHJcbiAgU0VUX0VESVRfVEVYVCxcclxuICBJTlNFUlRfRURJVF9URVhULFxyXG4gIFNFVF9TRUxFQ1RJT04sXHJcbiAgR0VUX1NFTEVDVElPTixcclxuICBHRVRfQ0FSRVRfUE9TLFxyXG4gIFJFRlJFU0hfUEFHRSxcclxuICBHRVRfSVNfVE9QX09GX1RFWFRCT1gsXHJcbiAgR0VUX0lTX0VORF9PRl9URVhUQk9YLFxyXG4gIENMSVBCT0FSRF9HRVRfQ09OVEVOVCxcclxuICBDTElQQk9BUkRfU0VUX0NPTlRFTlQsXHJcbiAgQ0xJUEJPQVJEX1BBU1RFLFxyXG4gIFBPU1RfS0VZX0VWRU5ULFxyXG4gIFBPU1RfQ0hBUl9FVkVOVCxcclxuICBTRVRfQ1VSU09SLFxyXG4gIERJU1BPU0VfQUxMX0ZPUk1TLFxyXG4gIEdFVF9ST1dTX0lOX1BBR0UsXHJcbiAgR0VUX0hJRERFTl9ST1dTX0NPVU5UX0lOX1RBQkxFLFxyXG4gIEZJTEVfT1BFTl9ESUFMT0dfQk9YLFxyXG4gIEZJTEVfU0FWRV9ESUFMT0dfQk9YLFxyXG4gIENSRUFURV9ESUFMT0csXHJcbiAgT1BFTl9ESUFMT0csXHJcbiAgQ0xPU0VfRElBTE9HLFxyXG4gIFNFVF9HRVRfU1VHR0VTVEVEX1ZBTFVFX0ZPUl9DSE9JQ0VfQ09OVFJPTF9PTl9UQUdEQVRBLFxyXG4gIFJFRkxFQ1RJT05fSU5WT0tFLFxyXG4gIFJFRkxFQ1RJT05fU0VULFxyXG4gIEdFVF9MQVNUX1dJTkRPV19TVEFURSxcclxuICBHRVRfRlJBTUVTX0JPVU5EUyxcclxuICBHRVRfTElOS0VEX1BBUkVOVF9JRFgsXHJcbiAgR0VUX0ZPUk1fQk9VTkRTLFxyXG4gIEdFVF9DT0xVTU5TX1NUQVRFLFxyXG4gIEdFVF9GT1JNX0hBTkRMRSxcclxuICBHRVRfQ1RSTF9IQU5ETEUsXHJcbiAgSVNfRk9STV9BQ1RJVkUsXHJcbiAgU0VUX01BUktFRF9URVhUX09OX1JJQ0hfRURJVCxcclxuICBTRU5EX0lNRV9NU0csXHJcbiAgQ0FOX0ZPQ1VTLFxyXG4gIElOVk9LRV9PU0NPTU1BTkQsXHJcbiAgR0VUX1NFTEVDVEVEX0lORElDRSxcclxuICBTRVRfU1VHR0VTVEVEX1ZBTFVFLFxyXG4gIE1BUF9XSURHRVRfVE9fR1VJX09CSkVDVCxcclxuICBSRU1PVkVfRE5fQ09OVFJPTF9WQUxVRV9DSEFOR0VEX0hBTkRMRVIsXHJcbiAgQUREX0ROX0NPTlRST0xfVkFMVUVfQ0hBTkdFRF9IQU5ETEVSLFxyXG4gIEdFVF9SVEZfVkFMVUVfQkVGT1JFX0VOVEVSSU5HX0NPTlRST0wsXHJcbiAgQVRUQUNIX0ROS0VZX1RPX09CSkVDVCxcclxuICBHRVRfRFZDT05UUk9MX1BPU0lUSU9OX0lTTixcclxuICBDTEVBUl9EQVRBX1RBQkxFLFxyXG4gIFNFVF9EQVRBX1NPVVJDRV9UT19EVkNPTlRST0wsXHJcbiAgQUNUSVZBVEVfRk9STSxcclxuICBJU19DT01CT19EUk9QUEVEX0RPV04sXHJcbiAgT1BFTl9GT1JNX0RFU0lHTkVSLFxyXG4gIElOVk9LRV9VRFBDT01NQU5ELFxyXG4gIEdFVF9IQVNJTkRFTlQsXHJcbiAgR0VUX0lTX1JPV19FRElUSU5HLFxyXG4gIEdFVF9NQVhfUk9XU19JTl9QQUdJTkFURURfVEFCTEUsXHJcbiAgQ0FMTF9KUyxcclxuICBHRVRfTEFTVF9ST1VURVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+IEd1aVV0aWxzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgR1VJIGxheWVyPC9zdW1tYXJ5PlxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR3VpSW50ZXJhY3RpdmVCYXNlIHtcclxuICBfY29tbWFuZFR5cGU6IEludGVyYWN0aXZlQ29tbWFuZFR5cGUgPSAwO1xyXG4gIFRhc2tUYWc6IHN0cmluZyA9IG51bGw7XHJcbiAgY29udHJvbE5hbWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIF94OiBudW1iZXIgPSAwO1xyXG4gIF95OiBudW1iZXIgPSAwO1xyXG4gIF9jaGFyOiBzdHJpbmcgPSBudWxsO1xyXG4gIF9zdHI6IHN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XHJcbiAgX2ludFZhbDE6IG51bWJlciA9IDA7XHJcbiAgX2xpbmU6IG51bWJlciA9IDA7XHJcbiAgX29iajE6IGFueSA9IG51bGw7XHJcbiAgX3BhcmFtZXRlcnM6IGFueVtdID0gbnVsbDtcclxuICBfYm9vbFZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9vYmoyOiBhbnkgPSBudWxsO1xyXG4gIF9tZ1ZhbHVlOiBNZ1ZhbHVlID0gbnVsbDtcclxuICBfc2V0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhcmd1bWVudHMgOiBBcnJheTxhbnk+IDtcclxuICByZXN1bHRTdHJpbmcgOiBzdHJpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDApO1xyXG4gIHByaXZhdGUgc3RhdGljIGxvY2tPYmplY3Q6IGFueSA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENvbnN0cnVjdG9yIDogc2V0cyB0aGUgY29udGV4dElEIGZvciB0aGUgY3VycmVudCBjb21tYW5kLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFJldHVybnMgd2hldGhlciBjb250cm9sIGlzIGZvY3VzYWJsZSBvciBub3QuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj4gdGhlIGNvbnRyb2wgd2hpY2ggbmVlZHMgdG8gYmUgY2hlY2tlZC4gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGNhbkZvY3VzKGd1aU1nQ29udHJvbDogR3VpTWdDb250cm9sKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQ0FOX0ZPQ1VTO1xyXG4gICAgdGhpcy5fb2JqMSA9IGd1aU1nQ29udHJvbDtcclxuXHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLmJvb2xWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IC8vLyBSZXR1cm5zIHRoZSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIGZvciBzZWxlY3RlZCBpbmRpY2Ugb2YgbGlzdCBjb250cm9sLi8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+Y29tbWEgc2VwYXJhdGVkIHN0cmluZyBmb3Igc2VsZWN0ZWQgaW5kaWNlIG9mIGxpc3QgY29udHJvbDwvcmV0dXJucz5cclxuICBHZXRTZWxlY3RlZEluZGljZShndWlNZ0NvbnRyb2w6IEd1aU1nQ29udHJvbCk6IHN0cmluZyB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX1NFTEVDVEVEX0lORElDRTtcclxuICAgIHRoaXMuX29iajEgPSBndWlNZ0NvbnRyb2w7XHJcblxyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5zdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgaW5kZW50IGhhcyBiZWVuIGFwcGxpZWQgdG8gUmljaCBFZGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0SGFzSW5kZW50KGd1aU1nQ29udHJvbDogR3VpTWdDb250cm9sKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0hBU0lOREVOVDtcclxuICAgIHRoaXMuX29iajEgPSBndWlNZ0NvbnRyb2w7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jvb2xWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgbWV0aG9kZSBpcyBzZXQgVFJVRVxcRkFMU0UgdGhhdCBHdWlVdGlsZXNcXEdldFZhbHVlKCkgbWV0aG9kIHdpbGwgYmUgdXNlXHJcbiAgLy8vIHRoaXMgZmFsZyBzYXkgaWYgdG8gcmV0dXJuIHRoZSA6ICh0cnVlKSBzdWdnZXN0ZWQgdmFsdWUgb3IgKGZhbHNlKXRoZSByZWFsIHZhbHVlXHJcbiAgLy8vIHRoaXMgbWV0aG9kIGlzIHVzZSBmb3IgTUdfQUNUX0NUUkxfTU9ESUZZXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXRTdWdnZXN0ZWRWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgc2V0R2V0U3VnZ2VzdGVkVmFsdWVPZkNob2ljZUNvbnRyb2xPblRhZ0RhdGEoY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHJldFN1Z2dlc3RlZFZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX0dFVF9TVUdHRVNURURfVkFMVUVfRk9SX0NIT0lDRV9DT05UUk9MX09OX1RBR0RBVEE7XHJcbiAgICB0aGlzLl9vYmoyID0gY3RybDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5fYm9vbFZhbCA9IHJldFN1Z2dlc3RlZFZhbHVlO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdldCB2YWx1ZSBvZiB0aGUgY29udHJvbDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvYmplY3RcIj5hIHJlZmVyZW5jZSB0byB0aGUgcmVsZXZhbnQgb2JqZWN0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWN0XCI+YSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB0aGF0IG9uIHJldHVybiB3aWxsIGNvbnRhaW4gdGhlIHJlcXVlc3RlZCB2YWx1ZXMgb24gc3RyaW5nPC9wYXJhbT5cclxuICBnZXRWYWx1ZShvYmo6IGFueSwgbGluZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfVkFMVUU7XHJcbiAgICB0aGlzLl9vYmoyID0gb2JqO1xyXG5cclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21nVmFsdWUub2JqO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldFRvcEluZGV4KHRhYmxlY29udHJvbDogR3VpTWdDb250cm9sKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfVE9QX0lOREVYO1xyXG4gICAgdGhpcy5fb2JqMiA9IHRhYmxlY29udHJvbDtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faW50VmFsMTtcclxuICB9XHJcblxyXG4gIGdldElzUm93RWRpdGluZyh0YWJsZWNvbnRyb2w6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBpc0xpbmVNb2RlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0lTX1JPV19FRElUSU5HO1xyXG4gICAgdGhpcy5fb2JqMiA9IHRhYmxlY29udHJvbDtcclxuICAgIHRoaXMuX2ludFZhbDEgPSBsaW5lO1xyXG4gICAgdGhpcy5fYm9vbFZhbCA9IGlzTGluZU1vZGU7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9ib29sVmFsO1xyXG4gIH1cclxuXHJcbiAgYnJvd3NlckV4ZWN1dGUoYnJvd3NlckNvbnRyb2w6IEd1aU1nQ29udHJvbCwgdGV4dDogc3RyaW5nLCBzeW5jRXhlYzogYm9vbGVhbiwgbGFuZ3VhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkJST1dTRVJfRVhFQ1VURTtcclxuICAgIHRoaXMuX29iajIgPSBicm93c2VyQ29udHJvbDtcclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5zdHIgPSB0ZXh0O1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5vYmogPSBsYW5ndWFnZTtcclxuXHJcbiAgICAvLyBGb3IgYXN5bmMgZXhlY3V0aW9uLCByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tbWFuZCBpcyBwYXNzZWQgdG8gdGhlIGd1aSB0aHJlYWQuXHJcbiAgICAvLyBGb3Igc3luYyBleGVjdXRpb24sIHJldHVybiB0cnVlIGlmIHRoZSBjb21tYW5kIHdhcyBleGVjdXRlZCBieSB0aGUgZ3VpIHRocmVhZC5cclxuICAgIGlmIChzeW5jRXhlYykge1xyXG4gICAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5ib29sVmFsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+T3BlbiBtZXNzYWdlIGJveCB3aXRoIHBhcmVudCBmb3JtPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRpdGxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0eWxlXCI+dGhlIHN0eWxlIG9mIHRoZSBtZXNzYWdlIGJveCBjYW4gYmUgZmxhZ3Mgb2YgU3R5bGVzLk1TR0JPWF94eHggPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG1lc3NhZ2UgYm94IHN0eWxlIGZyb20gU3R5bGVzLk1TR0JPWF9YWFg8L3JldHVybnM+XHJcbiAgbWVzc2FnZUJveCh0aXRsZTogc3RyaW5nLCBtc2c6IHN0cmluZywgc3R5bGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuTUVTU0FHRV9CT1g7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX21nVmFsdWUudGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMuX21nVmFsdWUuc3RyID0gKChtc2cgPT09IG51bGwpID8gJycgOiBtc2cpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5zdHlsZSA9IHN0eWxlO1xyXG4gICAgRXZlbnRzLlJlZnJlc2hUYWJsZXMoKTtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5udW1iZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2V0IHRpdGxlIHRvIGJyb3dzZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidG9wTW9zdEZvcm1cIj50aGUgcGFyZW50IGZvcm0gb2YgdGhlIG1lc3NhZ2UgYm94PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0aXRsZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBtZXNzYWdlIGJveCBzdHlsZSBmcm9tIFN0eWxlcy5NU0dCT1hfWFhYPC9yZXR1cm5zPlxyXG4gIHNldFRpdGxlKHRvcE1vc3RGb3JtOiBHdWlNZ0Zvcm0sIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfVElUTEU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX29iajIgPSB0b3BNb3N0Rm9ybTtcclxuICAgIHRoaXMuX21nVmFsdWUudGl0bGUgPSAoKHRpdGxlID09PSBudWxsKSA/ICcnIDogdGl0bGUpO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyBIYW5kbGVzIEludm9rZSBVRFAgb3BlcmF0aW9uIGZyb20gR1VJIHRocmVhZFxyXG4gIC8vLzwvc3VtbWFyeT5cclxuICAvLy88cGFyYW0gbmFtZT1cImNvbnRleHRJZFwiPkNvbnRleHQgaWQ8L3BhcmFtPlxyXG4gIGludm9rZVVEUChjb250ZXh0SWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuSU5WT0tFX1VEUENPTU1BTkQ7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX21nVmFsdWUub2JqID0gY29udGV4dElkO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLm51bWJlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNhcHRpb25cIj5kZXNjcmlwdGlvbiBmb3IgdGhlIGRpYWxvZyB3aW5kb3c8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhdGhcIj5pbml0aWFsIHBhdGggdG8gYnJvd3NlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJiU2hvd05ld0ZvbGRlclwiPnNob3VsZCBzaG93IHRoZSBuZXcgZm9sZGVyIGJ1dHRvbj88L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZGlyZWN0b3J5IHBhdGggc2VsZWN0ZWQgYnkgdXNlcjwvcmV0dXJucz5cclxuICBkaXJlY3RvcnlEaWFsb2dCb3goY2FwdGlvbjogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGJTaG93TmV3Rm9sZGVyOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5ESVJFQ1RPUllfRElBTE9HX0JPWDtcclxuXHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX21nVmFsdWUuY2FwdGlvbiA9IGNhcHRpb247XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnBhdGggPSBwYXRoO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5ib29sMSA9IGJTaG93TmV3Rm9sZGVyO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5zdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZpbGUgT3BlbiBEaWFsb2cgQm94XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0aXRsZVwiPkRpYWxvZyB3aW5kb3cgY2FwdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5pdERpclwiPkluaXRpYWwgZGlyZWN0b3J5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWx0ZXJOYW1lc1wiPmZpbHRlciBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNoZWNrRXhpc3RzXCI+dmVyaWZ5IG9wZW5lZCBmaWxlIGV4aXN0czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXVsdGlTZWxlY3RcIj5lbmFibGUgc2VsZWN0aW5nIG11bHRpcGxlIGZpbGVzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+ZmlsZSBwYXRoIHNlbGVjdGVkIGJ5IHVzZXI8L3JldHVybnM+XHJcbiAgZmlsZU9wZW5EaWFsb2dCb3godGl0bGU6IHN0cmluZywgZGlyTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCBmaWx0ZXJOYW1lczogc3RyaW5nLCBjaGVja0V4aXN0czogYm9vbGVhbiwgbXVsdGlTZWxlY3Q6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkZJTEVfT1BFTl9ESUFMT0dfQk9YO1xyXG5cclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS50aXRsZSA9IHRpdGxlO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5wYXRoID0gZGlyTmFtZTtcclxuICAgIHRoaXMuX21nVmFsdWUuc3RyID0gZmlsZU5hbWU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLmZpbHRlciA9IGZpbHRlck5hbWVzO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5ib29sVmFsID0gY2hlY2tFeGlzdHM7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLmJvb2wxID0gbXVsdGlTZWxlY3Q7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLnN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRmlsZSBTYXZlIERpYWxvZyBCb3hcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRpdGxlXCI+Y2FwdGlvbiBvZiB0aGUgZGlhbG9nIHdpbmRvdzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5pdERpclwiPiBpbml0aWFsIGRpcmVjdG9yeTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmlsdGVyTmFtZXNcIj5maWx0ZXIgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWZhdWx0RXh0ZW5zaW9uXCI+IGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBmaWxlIG5hbWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm92ZXJ3cml0ZVByb21wdFwiPiBzaG91bGQgcHJvbXB0IHdoZW4gb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZT88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJldEZpbGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5maWxlIHBhdGggc2VsZWN0ZWQgYnkgdXNlcjwvcmV0dXJucz5cclxuICBmaWxlU2F2ZURpYWxvZ0JveCh0aXRsZTogc3RyaW5nLCBkaXJOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIGZpbHRlck5hbWVzOiBzdHJpbmcsIGRlZmF1bHRFeHRlbnNpb246IHN0cmluZywgb3ZlcndyaXRlUHJvbXB0OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5GSUxFX1NBVkVfRElBTE9HX0JPWDtcclxuXHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX21nVmFsdWUudGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMuX21nVmFsdWUucGF0aCA9IGRpck5hbWU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnN0ciA9IGZpbGVOYW1lO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5maWx0ZXIgPSBmaWx0ZXJOYW1lcztcclxuICAgIHRoaXMuX21nVmFsdWUuY2FwdGlvbiA9IGRlZmF1bHRFeHRlbnNpb247XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLmJvb2wxID0gb3ZlcndyaXRlUHJvbXB0O1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5zdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+UHV0IENvbW1hbmQgdG8gY3JlYXRlIGRpYWxvZzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoYW5kbGVcIj5yZWZlcmVuY2UgdG8gdGhlIGRpYWxvZyBoYW5kbGVyczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2JqVHlwZVwiPnBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG9iamVjdHMgY29uc3RydWN0b3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmFtZXRlcnNcIj48L3BhcmFtPlxyXG4gIGNyZWF0ZURpYWxvZyhoYW5kbGU6IERpYWxvZ0hhbmRsZXIsIHBhcmFtZXRlcnM6IGFueVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQ1JFQVRFX0RJQUxPRztcclxuICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xyXG4gICAgdGhpcy5fb2JqMiA9IGhhbmRsZTtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+UHV0IENvbW1hbmQgdG8gY2xvc2UgZGlhbG9nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpYWxvZ1wiPjwvcGFyYW0+XHJcbiAgY2xvc2VEaWFsb2coaGFuZGxlOiBEaWFsb2dIYW5kbGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQ0xPU0VfRElBTE9HO1xyXG4gICAgdGhpcy5fb2JqMiA9IGhhbmRsZTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIHRleHQgdG8gdGhlIHRoZSBjb250cm9sXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBzZXRFZGl0VGV4dChjb250cm9sOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgdGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX0VESVRfVEVYVDtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuX21nVmFsdWUuc3RyID0gdGV4dDtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLmJvb2xWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGluc2VydCB0aGUgdGV4dCB0byB0aGUgdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIHBvc2l0aW9uXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBpbnNlcnRFZGl0VGV4dChjb250cm9sOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgc3RhcnRQb3NpdGlvbjogbnVtYmVyLCB0ZXh0VG9JbnNlcnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLklOU0VSVF9FRElUX1RFWFQ7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnN0ciA9IHRleHRUb0luc2VydDtcclxuICAgIHRoaXMuX2ludFZhbDEgPSBzdGFydFBvc2l0aW9uO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX21nVmFsdWUuYm9vbFZhbDtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+IHNldCB0aGUgdGV4dCB0byB0aGUgdGhlIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgc2V0U2VsZWN0aW9uKGNvbnRyb2w6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgY2FyZXRQb3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNFVF9TRUxFQ1RJT047XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5feCA9IHN0YXJ0O1xyXG4gICAgdGhpcy5feSA9IGVuZDtcclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5udW1iZXIgPSBjYXJldFBvcztcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIHRleHQgdG8gdGhlIHRoZSBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIHNldFN1Z2dlc3RlZFZhbHVlKGNvbnRyb2w6IEd1aU1nQ29udHJvbCwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNFVF9TVUdHRVNURURfVkFMVUU7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbWdWYWx1ZS5zdHIgPSBzdWdnZXN0ZWRWYWx1ZTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjYXJldCBvbiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgY2FyZXRQb3NHZXQoY29udHJvbDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9DQVJFVF9QT1M7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG5cclxuICAgIHRoaXMuX21nVmFsdWUgPSBuZXcgTWdWYWx1ZSgpO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5udW1iZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlZnJlc2ggcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUmVmcmVzaFBhZ2UobmF2aWdhdGVUb1Jvb3RSb3V0ZTogYm9vbGVhbiwgaW5pdGlhbFVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuUkVGUkVTSF9QQUdFO1xyXG4gICAgdGhpcy5fYm9vbFZhbCA9IG5hdmlnYXRlVG9Sb290Um91dGU7XHJcbiAgICB0aGlzLl9vYmoxID0gaW5pdGlhbFVybDtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIGlmIHRoZSBDYXJlbCBpcyBQb3NpdGlvbmVkIG9uIHRoZSBmaXJzdCBsaW5lIGluIFRleHRCb3guPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIGdldElzVG9wT2ZUZXh0Qm94KGNvbnRyb2w6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0lTX1RPUF9PRl9URVhUQk9YO1xyXG4gICAgdGhpcy5fb2JqMiA9IGNvbnRyb2w7XHJcbiAgICB0aGlzLl9saW5lID0gbGluZTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jvb2xWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIGlmIHRoZSBDYXJlbCBpcyBQb3NpdGlvbmVkIG9uIHRoZSBsYXN0IGxpbmUgaW4gVGV4dEJveC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgZ2V0SXNFbmRPZlRleHRCb3goY29udHJvbDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSVNfRU5EX09GX1RFWFRCT1g7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG5cclxuICAgIHRoaXMuSW52b2tlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2Jvb2xWYWw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBQb3N0IGEga2V5IGV2ZW50IChlbXVsYXRlIGtleXMgcHJlc3NlZCBieSB0aGUgdXNlcikuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJrZXlDb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdGF0ZU1hc2tcIj48L3BhcmFtPlxyXG4gIHBvc3RLZXlFdmVudChjb250cm9sOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwga2V5czogc3RyaW5nLCBQb3N0Q2hhcjogYm9vbGVhbiwgZm9yY2VMb2dpY2FsQ29udHJvbFRleHRVcGRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5QT1NUX0tFWV9FVkVOVDtcclxuXHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5fbWdWYWx1ZSA9IG5ldyBNZ1ZhbHVlKCk7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLnN0ciA9IGtleXM7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlLmJvb2wxID0gZm9yY2VMb2dpY2FsQ29udHJvbFRleHRVcGRhdGU7XHJcbiAgICB0aGlzLl9ib29sVmFsID0gUG9zdENoYXI7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2VuZCBXTV9DSEFSIHRvIHRoZSBzcGVjaWZpZWQgY29udHJvbCB2aWEgR1VJIHRocmVhZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNoclwiPjwvcGFyYW0+XHJcbiAgcG9zdENoYXJFdmVudChjb250cm9sOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgY2hyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5QT1NUX0NIQVJfRVZFTlQ7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuX2xpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5fY2hhciA9IGNocjtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBkaXNwb3NlIGFsbCB0aGUgc2hlbGxzLiBsYXN0IGRpc3Bvc2Ugd2lsbCBjbG9zZSB0aGUgZGlzcGxheS48L3N1bW1hcnk+XHJcbiAgZGlzcG9zZUFsbEZvcm1zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkRJU1BPU0VfQUxMX0ZPUk1TO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmV0dXJuIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFJvd3NJblBhZ2UoY29udHJvbDogR3VpTWdDb250cm9sKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfUk9XU19JTl9QQUdFO1xyXG4gICAgdGhpcy5fb2JqMiA9IGNvbnRyb2w7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludFZhbDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybiBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZShjb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9NQVhfUk9XU19JTl9QQUdJTkFURURfVEFCTEU7XHJcbiAgICB0aGlzLl9vYmoyID0gY29udHJvbDtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faW50VmFsMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBsYXN0IHJvdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0Um91dGUoKTogc3RyaW5nIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfTEFTVF9ST1VURTtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRTdHJpbmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybiB0aGUgbnVtYmVyIG9mIGhpZGRlbiByb3dzIChwYXJ0aWFsbHkgb3IgZnVsbHkpIGluIHRhYmxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0SGlkZGVuUm93c0NvdW50SW5UYWJsZShjb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9ISURERU5fUk9XU19DT1VOVF9JTl9UQUJMRTtcclxuICAgIHRoaXMuX29iajIgPSBjb250cm9sO1xyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9pbnRWYWwxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGxhc3Qgd2luZG93IHN0YXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExhc3RXaW5kb3dTdGF0ZShndWlNZ0Zvcm06IEd1aU1nRm9ybSk6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0xBU1RfV0lORE9XX1NUQVRFO1xyXG4gICAgdGhpcy5fb2JqMiA9IGd1aU1nRm9ybTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludFZhbDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldHMgbGlua2VkIHBhcmVudCBpZHggb2YgZnJhbWVzZXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyYW1lc2V0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExpbmtlZFBhcmVudElkeChmcmFtZXNldDogR3VpTWdDb250cm9sKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfTElOS0VEX1BBUkVOVF9JRFg7XHJcbiAgICB0aGlzLl9vYmoyID0gZnJhbWVzZXQ7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9pbnRWYWwxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGNvbHVtbnMgc3RhdGUgLS0tIGxheWVyLCB3aWR0aCBhbmQgd2lkdGhGb3JGaWxsVGFibGVQbGFjZW1lbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluZGV4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbHVtbnNTdGF0ZSh0YWJsZUN0cmw6IEd1aU1nQ29udHJvbCk6IExpc3Q8bnVtYmVyW10+IHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfQ09MVU1OU19TVEFURTtcclxuICAgIHRoaXMuX29iajIgPSB0YWJsZUN0cmw7XHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fbWdWYWx1ZS5saXN0T2ZJbnRBcnI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFVwZGF0ZSB0aGUgQ29udHJvbC5UYWdEYXRhLk1hcERhdGEgd2l0aCB0aGUgbmV3T2JqZWN0VG9TZXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld09iamVjdFRvU2V0XCI+PC9wYXJhbT5cclxuICBNYXBXaWRnZXQobmV3T2JqZWN0VG9TZXQ6IGFueSk6IHZvaWQ7XHJcbiAgTWFwV2lkZ2V0KCk6IHZvaWQ7XHJcbiAgTWFwV2lkZ2V0KG5ld09iamVjdFRvU2V0PzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5NYXBXaWRnZXRfMChuZXdPYmplY3RUb1NldCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuTWFwV2lkZ2V0XzEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgTWFwV2lkZ2V0XzAobmV3T2JqZWN0VG9TZXQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLk1BUF9XSURHRVRfVE9fR1VJX09CSkVDVDtcclxuICAgIHRoaXMuX29iajEgPSBuZXdPYmplY3RUb1NldDtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBBY3RpdmF0ZSB0aGUgZm9ybS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgQWN0aXZhdGVGb3JtKGd1aU1nRm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuQUNUSVZBVEVfRk9STTtcclxuICAgIHRoaXMuX29iajEgPSBndWlNZ0Zvcm07XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyBpZiB0aGUgcGFzc2VkIGZvcm0gaXMgYWN0aXZlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRm9ybUFjdGl2ZShndWlNZ0Zvcm06IEd1aU1nRm9ybSk6IGJvb2xlYW47XHJcbiAgaXNGb3JtQWN0aXZlKCk6IHZvaWQ7XHJcbiAgaXNGb3JtQWN0aXZlKGd1aU1nRm9ybT86IEd1aU1nRm9ybSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHJldHVybiB0aGlzLmlzRm9ybUFjdGl2ZV8wKGd1aU1nRm9ybSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuaXNGb3JtQWN0aXZlXzEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGb3JtQWN0aXZlXzAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9ib29sVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHZXRzIHRoZSBSVEYgdmFsdWUgb2YgdGhlIFJURiBlZGl0IGNvbnRyb2wgd2hpY2ggd2FzIHNldCBiZWZvcmUgZW50ZXJpbmcgaXQuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UnRmVmFsdWVCZWZvcmVFbnRlcmluZ0NvbnRyb2woZ3VpTWdDb250cm9sOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX1JURl9WQUxVRV9CRUZPUkVfRU5URVJJTkdfQ09OVFJPTDtcclxuICAgIHRoaXMuX29iajIgPSBndWlNZ0NvbnRyb2w7XHJcbiAgICB0aGlzLl9saW5lID0gbGluZTtcclxuXHJcbiAgICB0aGlzLl9tZ1ZhbHVlID0gbmV3IE1nVmFsdWUoKTtcclxuXHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9tZ1ZhbHVlLnN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gR2V0IFBvc2l0aW9uIElzbiBvZiBSb3cgaW4gRGF0YVRhYmxlIGF0dGFjaGVkIHRvIERWIENvbnRyb2wuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhVGFibGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0RFZDb250cm9sUG9zaXRpb25Jc24oZGF0YVRhYmxlOiBhbnksIGxpbmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0RWQ09OVFJPTF9QT1NJVElPTl9JU047XHJcbiAgICB0aGlzLl9vYmoxID0gZGF0YVRhYmxlO1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludFZhbDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdldCBQb3NpdGlvbiBJc24gb2YgUm93IGluIERhdGFUYWJsZSBhdHRhY2hlZCB0byBEViBDb250cm9sLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0YVRhYmxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENsZWFyRGF0YXRhYmxlKGR2Q29udHJvbDogR3VpTWdDb250cm9sLCBkYXRhVGFibGU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkNMRUFSX0RBVEFfVEFCTEU7XHJcbiAgICB0aGlzLl9vYmoxID0gZHZDb250cm9sO1xyXG4gICAgdGhpcy5fb2JqMiA9IGRhdGFUYWJsZTtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFNldCBEYXRhc291cmNlIHByb3BlcnR5IG9mIERhdGF2aWV3IGNvbnRyb2wuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdkNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGFUYWJsZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcGVydHlOYW1lXCI+PC9wYXJhbT5cclxuICBTZXREYXRhU291cmNlVG9EYXRhVmlld0NvbnRyb2woZHZDb250cm9sOiBHdWlNZ0NvbnRyb2wsIGRhdGFUYWJsZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tbWFuZFR5cGUgPSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNFVF9EQVRBX1NPVVJDRV9UT19EVkNPTlRST0w7XHJcbiAgICB0aGlzLl9vYmoxID0gZHZDb250cm9sO1xyXG4gICAgdGhpcy5fb2JqMiA9IGRhdGFUYWJsZTtcclxuICAgIHRoaXMuX3N0ciA9IHByb3BlcnR5TmFtZTtcclxuICAgIHRoaXMuSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vICBDaGVjayB3aGV0aGVyIHRoZSBjb21ib2JveCBpcyBpbiBhIERyb3BwZWREb3duIHN0YXRlIG9yIG5vdC5cclxuICAvLy88L3N1bW1hcnk+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJjb21ib0JveFwiPk1nY29tYm9Cb3ggY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJsaW5lXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cmV0dXJucz5ib29sPC9yZXR1cm5zPlxyXG4gIElzQ29tYm9Cb3hJbkRyb3BwZWREb3duU3RhdGUoY29tYm9Cb3g6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLl9jb21tYW5kVHlwZSA9IEludGVyYWN0aXZlQ29tbWFuZFR5cGUuSVNfQ09NQk9fRFJPUFBFRF9ET1dOO1xyXG4gICAgdGhpcy5fb2JqMSA9IGNvbWJvQm94O1xyXG4gICAgdGhpcy5fbGluZSA9IGxpbmU7XHJcblxyXG4gICAgdGhpcy5JbnZva2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9ib29sVmFsO1xyXG4gIH1cclxuXHJcbiAgRXhlY3V0ZUNhbGxKUyhmb3JtICwgZm9ybU5hbWU6IHN0cmluZywgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTxhbnk+KTogc3RyaW5nIHtcclxuICAgIHRoaXMuX2NvbW1hbmRUeXBlID0gSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DQUxMX0pTO1xyXG4gICAgdGhpcy5fb2JqMiA9IGZvcm07XHJcbiAgICB0aGlzLmNvbnRyb2xOYW1lID0gZm9ybU5hbWU7XHJcbiAgICB0aGlzLl9zdHIgPSBmdW5jdGlvbk5hbWU7XHJcbiAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3M7XHJcbiAgICB0aGlzLkludm9rZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVzdWx0U3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDYWxscyBSdW4oKSBzeW5jaHJvbm91c2x5IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQuXHJcbiAgLy8vIEJ1dCBiZWZvcmUgdGhhdCwgaXQgZXhlY3V0ZXMgdGhlIEd1aUNvbW1hbmRRdWV1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW52b2tlKCk6IHZvaWQge1xyXG4gICAgR3VpQ29tbWFuZFF1ZXVlLmdldEluc3RhbmNlKCkuaW52b2tlKCk7XHJcbiAgICBpZiAodGhpcy5fb2JqMiBpbnN0YW5jZW9mIENvbnRyb2xCYXNlKSB7XHJcbiAgICAgIGxldCBjb250cm9sQmFzZTogQ29udHJvbEJhc2UgPSA8Q29udHJvbEJhc2U+dGhpcy5fb2JqMjtcclxuICAgICAgdGhpcy5UYXNrVGFnID0gY29udHJvbEJhc2UuVGFza1RhZztcclxuICAgICAgdGhpcy5jb250cm9sTmFtZSA9IGNvbnRyb2xCYXNlLlVuaXF1ZU5hbWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29iajIgaW5zdGFuY2VvZiBHdWlNZ0Zvcm0pIHtcclxuICAgICAgbGV0IGd1aU1nRm9ybTogR3VpTWdGb3JtID0gPEd1aU1nRm9ybT50aGlzLl9vYmoyO1xyXG4gICAgICB0aGlzLlRhc2tUYWcgPSBndWlNZ0Zvcm0uVGFza1RhZztcclxuICAgIH0gZWxzZVxyXG4gICAgICB0aGlzLlRhc2tUYWcgPSAnMCc7IC8vIGdlbmVyYWwgY29tbWFuZFxyXG5cclxuICAgIFVJQnJpZGdlLmdldEluc3RhbmNlKCkuRXhlY3V0ZUludGVyYWN0aXZlQ29tbWFuZCh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW1wbGVtZW50cyB0aGUgUnVubmFibGUgcnVuIG1ldGhvZCBmb3IgY2FsbGluZyBEaXNwbGF5LnN5bmNFeGVjKCk8L3N1bW1hcnk+XHJcbiAgLy8gUnVuKCk6IHZvaWQge1xyXG4gIC8vICAgLy8gU2V0cyB0aGUgY3VycmVudENvbnRleHRJRFxyXG4gIC8vICAgbGV0IGNvbnRleHRJREd1YXJkID0gbmV3IENvbnRleHRJREd1YXJkKHRoaXMuX2NvbnRleHRJRCk7XHJcbiAgLy8gICB0cnkge1xyXG4gIC8vICAgICBzd2l0Y2ggKHRoaXMuX2NvbW1hbmRUeXBlKSB7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9GT05UX01FVFJJQ1M6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0Rm9udE1ldHJpY3MoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfUkVTT0xVVElPTjpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRSZXNvbHV0aW9uKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0JPVU5EUzpcclxuICAvLyAgICAgICAgIHRoaXMub25Cb3VuZHMoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfVkFMVUU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uVmFsdWUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfQlJPV1NFUl9URVhUOlxyXG4gIC8vICAgICAgICAgdGhpcy5vblNldEJyb3dzZXJUZXh0KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0JST1dTRVJfVEVYVDpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRCcm93c2VyVGV4dCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkJST1dTRVJfRVhFQ1VURTpcclxuICAvLyAgICAgICAgIHRoaXMub25Ccm93c2VyRXhlY3V0ZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9UT1BfSU5ERVg6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0VG9wSW5kZXgoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5NRVNTQUdFX0JPWDpcclxuICAvLyAgICAgICAgIHRoaXMub25NZXNzYWdlQm94KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuRElSRUNUT1JZX0RJQUxPR19CT1g6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uRGlyZWN0b3J5RGlhbG9nQm94KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0NMSUVOVF9CT1VORFM6XHJcbiAgLy8gICAgICAgICB0aGlzLmdldENsaWVudEJvdW5kcygpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlNFVF9FRElUX1RFWFQ6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uU2V0RWRpdFRleHQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5JTlNFUlRfRURJVF9URVhUOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkluc2VydEVkaXRUZXh0KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX1NFTEVDVElPTjpcclxuICAvLyAgICAgICAgIHRoaXMub25TZXRTZWxlY3Rpb24oKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfU0VMRUNUSU9OOlxyXG4gIC8vICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkdldCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9DQVJFVF9QT1M6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQ2FyZXRQb3NHZXQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSVNfVE9QX09GX1RFWFRCT1g6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0SXNUb3BPZlRleHRCb3goKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSVNfRU5EX09GX1RFWFRCT1g6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0SXNFbmRPZlRleHRCb3goKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DTElQQk9BUkRfR0VUX0NPTlRFTlQ6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQ2xpcGJvYXJkUmVhZCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkNMSVBCT0FSRF9TRVRfQ09OVEVOVDpcclxuICAvLyAgICAgICAgIHRoaXMub25DbGlwYm9hcmRXcml0ZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkNMSVBCT0FSRF9QQVNURTpcclxuICAvLyAgICAgICAgIHRoaXMub25DbGlwYm9hcmRQYXN0ZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlBPU1RfS0VZX0VWRU5UOlxyXG4gIC8vICAgICAgICAgdGhpcy5vblBvc3RLZXlFdmVudCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLlBPU1RfQ0hBUl9FVkVOVDpcclxuICAvLyAgICAgICAgIHRoaXMub25Qb3N0Q2hhckV2ZW50KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0VUX0NVUlNPUjpcclxuICAvLyAgICAgICAgIHRoaXMub25TZXRDdXJzb3IoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5ESVNQT1NFX0FMTF9GT1JNUzpcclxuICAvLyAgICAgICAgIHRoaXMub25EaXNwb3NlQWxsRm9ybXMoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfUk9XU19JTl9QQUdFOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldFJvd3NJblBhZ2UoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfSElEREVOX1JPV1NfQ09VTlRfSU5fVEFCTEU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0SGlkZGVuUm93c0NvdW50SW5UYWJsZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkZJTEVfT1BFTl9ESUFMT0dfQk9YOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkZpbGVPcGVuRGlhbG9nQm94KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuRklMRV9TQVZFX0RJQUxPR19CT1g6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uRmlsZVNhdmVEaWFsb2dCb3goKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DUkVBVEVfRElBTE9HOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkNyZWF0ZURpYWxvZygpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLk9QRU5fRElBTE9HOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbk9wZW5EaWFsb2coKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5DTE9TRV9ESUFMT0c6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uQ2xvc2VEaWFsb2coKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfR0VUX1NVR0dFU1RFRF9WQUxVRV9GT1JfQ0hPSUNFX0NPTlRST0xfT05fVEFHREFUQTpcclxuICAvLyAgICAgICAgIHRoaXMuT25TZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9MQVNUX1dJTkRPV19TVEFURTpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRMYXN0V2luZG93U3RhdGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfRlJBTUVTX0JPVU5EUzpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRGcmFtZXNCb3VuZHMoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfTElOS0VEX1BBUkVOVF9JRFg6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0TGlua2VkUGFyZW50SWR4KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0ZPUk1fQk9VTkRTOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkdldEZvcm1Cb3VuZHMoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfQ09MVU1OU19TVEFURTpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRDb2x1bW5zU3RhdGUoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfRk9STV9IQU5ETEU6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0Rm9ybUhhbmRsZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9DVFJMX0hBTkRMRTpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXRDdHJsSGFuZGxlKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuSVNfRk9STV9BQ1RJVkU6XHJcbiAgLy8gICAgICAgICB0aGlzLmlzRm9ybUFjdGl2ZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9EUk9QUEVEX0RBVEE6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0RHJvcHBlZERhdGEoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfRFJPUFBFRF9QT0lOVDpcclxuICAvLyAgICAgICAgIHRoaXMub25HZXREcm9wcGVkUG9pbnQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5HRVRfRFJPUFBFRF9TRUxFQ1RJT046XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0RHJvcHBlZFNlbGVjdGlvbigpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkRST1BfRk9STUFUX1NVUFBPUlRFRDpcclxuICAvLyAgICAgICAgIHRoaXMub25DaGVja0Ryb3BGb3JtYXRQcmVzZW50KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX0lTX0JFR0lOX0RSQUc6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uR2V0SXNCZWdpbkRyYWcoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5BQ1RJVkFURV9ORVhUX09SX1BSRVZJT1VTX01ESV9DSElMRDpcclxuICAvLyAgICAgICAgIHRoaXMuT25BY3RpdmF0ZU5leHRPclByZXZpb3VzTURJQ2hpbGQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRU5EX0lNRV9NU0c6XHJcbiAgLy8gICAgICAgICB0aGlzLm9uU2VuZEltZU1zZygpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkNBTl9GT0NVUzpcclxuICAvLyAgICAgICAgIHRoaXMub25DYW5Gb2N1cygpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9TRUxFQ1RFRF9JTkRJQ0U6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uR2V0U2VsZWN0ZWRJbmRpY2UoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5TRVRfU1VHR0VTVEVEX1ZBTFVFOlxyXG4gIC8vICAgICAgICAgdGhpcy5vblNldFN1Z2dlc3RlZFZhbHVlKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuTUFQX1dJREdFVF9UT19HVUlfT0JKRUNUOlxyXG4gIC8vICAgICAgICAgdGhpcy5NYXBXaWRnZXQoKTtcclxuICAvLyAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgIGNhc2UgSW50ZXJhY3RpdmVDb21tYW5kVHlwZS5SRU1PVkVfRE5fQ09OVFJPTF9WQUxVRV9DSEFOR0VEX0hBTkRMRVI6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uUmVtb3ZlRE5Db250cm9sVmFsdWVDaGFuZ2VkSGFuZGxlcigpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkFERF9ETl9DT05UUk9MX1ZBTFVFX0NIQU5HRURfSEFORExFUjpcclxuICAvLyAgICAgICAgIHRoaXMuT25BZGRETkNvbnRyb2xWYWx1ZUNoYW5nZWRIYW5kbGVyKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuR0VUX1JURl9WQUxVRV9CRUZPUkVfRU5URVJJTkdfQ09OVFJPTDpcclxuICAvLyAgICAgICAgIHRoaXMuT25HZXRSdGZWYWx1ZUJlZm9yZUVudGVyaW5nQ29udHJvbCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9NRElfQ0hJTERfQ09VTlQ6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uR2V0TURJQ2hpbGRDb3VudCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkFDVElWQVRFX0ZPUk06XHJcbiAgLy8gICAgICAgICB0aGlzLk9uQWN0aXZhdGVGb3JtKCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuRU5BQkxFX01FTlVfRU5UUlk6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uRW5hYmxlTWVudUVudHJ5KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuU0hPV19DT05URVhUX01FTlU6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uU2hvd0NvbnRleHRNZW51KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgICBjYXNlIEludGVyYWN0aXZlQ29tbWFuZFR5cGUuSVNfQ09NQk9fRFJPUFBFRF9ET1dOOlxyXG4gIC8vICAgICAgICAgdGhpcy5PbklzQ29tYm9Ecm9wcGVkRG93bmRTdGF0ZSgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLklOVk9LRV9VRFBDT01NQU5EOlxyXG4gIC8vICAgICAgICAgdGhpcy5vbkludm9rZVVEUCgpO1xyXG4gIC8vICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgY2FzZSBJbnRlcmFjdGl2ZUNvbW1hbmRUeXBlLkdFVF9IQVNJTkRFTlQ6XHJcbiAgLy8gICAgICAgICB0aGlzLk9uR2V0SGFzSW5kZW50KCk7XHJcbiAgLy8gICAgICAgICBicmVhaztcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgY2F0Y2ggKGV4KSB7XHJcbiAgLy8gICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gIC8vICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAvLyAgICAgICB0aHJvdyBleDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBlbHNlXHJcbiAgLy8gICAgICAgdGhyb3cgZXg7IC8vIFJlc2V0IHRoZSBjdXJyZW50IGNvbnRleHRJRC5cclxuICAvLyAgIH1cclxuICAvLyAgIGZpbmFsbHkge1xyXG4gIC8vICAgICBjb250ZXh0SURHdWFyZC5EaXNwb3NlKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFJlbW92ZSB0aGUgVmFsdWVDaGFuZ2VkSGFuZGxlci4gPC9zdW1tYXJ5PlxyXG4gIE9uUmVtb3ZlRE5Db250cm9sVmFsdWVDaGFuZ2VkSGFuZGxlcigpOiB2b2lkIHtcclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKCdSZW1vdmVETkNvbnRyb2xWYWx1ZUNoYW5nZWRIYW5kbGVyIC0gTm90IEltcGxlbWVudGVkIFlldCcpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT4gQWRkIHRoZSBWYWx1ZUNoYW5nZWRIYW5kbGVyLiA8L3N1bW1hcnk+XHJcbiAgT25BZGRETkNvbnRyb2xWYWx1ZUNoYW5nZWRIYW5kbGVyKCk6IHZvaWQge1xyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coJ0FkZEROQ29udHJvbFZhbHVlQ2hhbmdlZEhhbmRsZXIgLSBOb3QgSW1wbGVtZW50ZWQgWWV0Jyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdldHMgdGhlIFJURiB2YWx1ZSBvZiB0aGUgUlRGIGVkaXQgY29udHJvbCB3aGljaCB3YXMgc2V0IGJlZm9yZSBlbnRlcmluZyBpdC4gPC9zdW1tYXJ5PlxyXG4gIE9uR2V0UnRmVmFsdWVCZWZvcmVFbnRlcmluZ0NvbnRyb2woKTogdm9pZCB7XHJcbiAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZygnT25HZXRPcmdSdGZWYWx1ZSAtIE5vdCBJbXBsZW1lbnRlZCBZZXQnKTtcclxuICB9XHJcblxyXG4vLy8gbWV0aG9kcyBzdXNwZWN0ZWQgYXMgZGlmZmVyZW50IGJldHdlZW4gdGhlIEd1aUludGVyYWN0aXZlIGNsYXNzZXMgb2YgdGhlIHN0YW5kYXJkL2NvbXBhY3QgZnJhbWV3b3Jrc1xyXG4gIGFic3RyYWN0IG9uR2V0QnJvd3NlclRleHQoKTogdm9pZCA7XHJcblxyXG4gIGFic3RyYWN0IG9uQnJvd3NlckV4ZWN1dGUoKTogdm9pZCA7XHJcblxyXG5cclxuICAvLy88c3VtbWFyeT5cclxuICAvLy8gSGFuZGxlcyBJbnZva2UgVURQIG9wZXJhdGlvbiBmcm9tIEdVSSB0aHJlYWRcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgb25JbnZva2VVRFAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBhYnN0cmFjdCBvbkRpcmVjdG9yeURpYWxvZ0JveCgpOiB2b2lkIDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBIYW5kbGUgdGhlIGZpbGUgb3BlbiBkaWFsb2cgYm94XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBvbkZpbGVPcGVuRGlhbG9nQm94KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBIYW5kbGUgdGhlIGZpbGUgc2F2ZSBkaWFsb2cgYm94XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBvbkZpbGVTYXZlRGlhbG9nQm94KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNyZWF0ZSBkaWFsb2c8L3N1bW1hcnk+XHJcbiAgb25DcmVhdGVEaWFsb2coKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+T3BlbnMgZGlhbG9nPC9zdW1tYXJ5PlxyXG4gIG9uT3BlbkRpYWxvZygpOiB2b2lkIHtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+Q2xvc2VzIGRpYWxvZzwvc3VtbWFyeT5cclxuICBvbkNsb3NlRGlhbG9nKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlRoaXMgZnVuY3Rpb24gcmV0dXJucyBpZiB0aGUgZm9ybSBpcyBhY3RpdmUgb3Igbm90LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0Zvcm1BY3RpdmVfMSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGRpc3Bvc2UgYWxsIHNoZWxscy48L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkRpc3Bvc2VBbGxGb3JtcygpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2FsY3VsYXRpbmcgdGhlIGZvbnQgbWV0cmljczwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uR2V0Rm9udE1ldHJpY3MoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PiBHZXRzIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjb250cm9sLiA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkdldFJlc29sdXRpb24oKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybiB0aGUgY2FyZXQgcG9zaXRpb24gb24gdGhlIGdpdmVuIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkNhcmV0UG9zR2V0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBjaGVjayBpZiB0aGUgY2FyZXQgaXMgcG9zaXRpb25lZCBvbiB0aGUgZmlyc3QgbGluZSBvZiBUZXh0Qm94PC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25HZXRJc1RvcE9mVGV4dEJveCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9ib29sVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBjaGVjayBpZiB0aGUgY2FyZXQgaXMgcG9zaXRpb25lZCBvbiB0aGUgbGFzdCBsaW5lIG9mIFRleHRCb3g8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkdldElzRW5kT2ZUZXh0Qm94KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jvb2xWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybiB0aGUgY2FyZXQgcG9zaXRpb24gb24gdGhlIGdpdmVuIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblNlbGVjdGlvbkdldCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbDwvc3VtbWFyeT5cclxuICAvLyBwcml2YXRlIG9uVmFsdWUoKTogdm9pZCB7XHJcbiAgLy9cclxuICAvLyAgIFVJQnJpZGdlLmdldEluc3RhbmNlKCkuR2V0SW50ZXJhY3RpdmVWYWx1ZSh0aGlzLnRhc2tUYWcsIHRoaXMpO1xyXG4gIC8vXHJcbiAgLy8gICAvL3RoaXMuX21nVmFsdWUuc3RyID0gVUlCcmlkZ2UuZ2V0SW5zdGFuY2UoKS5HZXRDb250cm9sVmFsdWUoY29udHJvbEJhc2UuVGFza1RhZywgKHRoaXMuX2xpbmUpLnRvU3RyaW5nKCksIGNvbnRyb2xCYXNlLlVuaXF1ZU5hbWUpO1xyXG4gIC8vXHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgdGV4dCBpbiB0aGUgdGV4dCBjb250cm9sLjwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uU2V0RWRpdFRleHQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGluc2VydCB0aGUgdGV4dCB0byB0aGUgdGV4dCBjb250cm9sIGF0IGEgZ2l2ZW4gcG9zaXRpb24uPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25JbnNlcnRFZGl0VGV4dCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gc2V0IHRoZSB0ZXh0KGh0bWwpIG9uIHRoZSBicm93c2VyIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgb25TZXRCcm93c2VyVGV4dCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gc2V0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRleHQgY29udHJvbC48L3N1bW1hcnk+XHJcbiAgb25TZXRTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgc3VnZ2VzdGVkIHZhbHVlIGZvciBjaG9pY2UgY29udHJvbC48L3N1bW1hcnk+XHJcbiAgb25TZXRTdWdnZXN0ZWRWYWx1ZSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgb25HZXRSb3dzSW5QYWdlKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm4gdGhlIG51bWJlciBvZiBoaWRkZW4gcm93cyAocGFydGlhbGx5IG9yIGZ1bGx5KSBpbiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgb25HZXRIaWRkZW5Sb3dzQ291bnRJblRhYmxlKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGFibGUgdG9wIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBvbkdldFRvcEluZGV4KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIENsaWVudCBib3VuZHMgb2YgdGhlIG9iamVjdDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldENsaWVudEJvdW5kc18xKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcG9zdCBhIGtleSBjb21iaW5hdGlvbi4gVGhpcyBlbXVsYXRlcyBrZXlzIHByZXNzZWQgYnkgdGhlIHVzZXIuIFNldHRpbmcgdGhlIGRhdGEgaW4gdGhlIHdpZGdldCB0byBpZ25vcmVcclxuICAvLy8ga2V5IGRvd24sIHdpbGwgY2F1c2UgdGhlIE9TIHRvIGhhbmRsZSB0aGUgZXZlbnQgaW5zdGVhZCBvZiB1cy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG9uUG9zdEtleUV2ZW50KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBTZW5kIFdNX0NIQVIgbWVzc2FnZSB0byBDb21ib0JveCBhbmQgTGlzdEJveC4gVGhpcyBlbXVsYXRlcyBrZXlzIHByZXNzZWQgYnkgdGhlIHVzZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBvblBvc3RDaGFyRXZlbnQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgT25TZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gKEtvcmVhbiBJTUUpIHNlbmQgTUdfSU1FX1hYWCBtZXNzYWdlIHRvIE1nVGV4dEJveCA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblNlbmRJbWVNc2coKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2V0IGN1cnNvciBvbiBmb3Jtczwvc3VtbWFyeT5cclxuICBvblNldEN1cnNvcigpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT50cnVlIGlmIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGRlbGVnYXRlZCB0byB0aGUgR1VJIHRocmVhZDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW52b2tlUmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB3aW5kb3dTdGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkdldExhc3RXaW5kb3dTdGF0ZSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBwYXJlbnQgbGluayBJZHggb2YgdGhpcyBmcmFtZXNldFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkdldExpbmtlZFBhcmVudElkeCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCBsYXllciBvZiB0aGUgY29sdW1uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uR2V0Q29sdW1uc1N0YXRlKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gSW5kaWNhdGVzIGlmIGEgY29udHJvbCBjYW4gYmUgc2VsZWN0ZWQuIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uQ2FuRm9jdXMoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgc2VsZWN0ZWQgaW5kaWNlIG9mIHRoZSBsaXN0Ym94IGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIE9uR2V0U2VsZWN0ZWRJbmRpY2UoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBjb250cm9sIGhhcyBpbmRlbnQgYXBwbGllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIE9uR2V0SGFzSW5kZW50KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBNYXAgV2lkZ2V0IHRvIEd1aSBvYmplY3QgKE1nRm9ybS9NZ1N0YXR1c0Jhci9NZ1N0YXR1c1BhbmUpIGZvciBNREkgZnJhbWUgZm9yIGEgcGFyYWxsZWwgY29udGV4dFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBNYXBXaWRnZXRfMSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgUG9zaXRpb25Jc24gb2YgRGF0YVJvdyBGcm9tIERhdGFUYWJsZSBhdHRhY2hlZCB0byBEVkNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBPbkdldERWQ29udHJvbFBvc2l0aW9uSXNuKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBBY3RpdmF0ZSB0aGUgZm9ybS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE9uQWN0aXZhdGVGb3JtKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2hlY2sgd2hldGhlciB0aGUgY29tYm9ib3ggaXMgaW4gZHJvcHBlZCBkb3duIHN0YXRlLlxyXG4gIC8vLzwvc3VtbWFyeT5cclxuICAvLy88cmV0dXJucz4hIS48L3JldHVybnM+XHJcbiAgT25Jc0NvbWJvRHJvcHBlZERvd25kU3RhdGUoKTogdm9pZCB7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3VpSW50ZXJhY3RpdmUgZXh0ZW5kcyBHdWlJbnRlcmFjdGl2ZUJhc2Uge1xyXG5cclxuICBPbkdldFJ0ZlZhbHVlQmVmb3JlRW50ZXJpbmdDb250cm9sKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgb25HZXRCcm93c2VyVGV4dCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIG9uQnJvd3NlckV4ZWN1dGUoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBvbkRpcmVjdG9yeURpYWxvZ0JveCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcbn1cclxuIl19