@sapui5/sap.fe.core 1.136.1 → 1.136.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +7 -1
  4. package/src/sap/fe/core/AppComponent.ts +10 -0
  5. package/src/sap/fe/core/AppStateHandler.js +9 -2
  6. package/src/sap/fe/core/AppStateHandler.ts +8 -2
  7. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +2 -1
  8. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +1 -0
  9. package/src/sap/fe/core/controllerextensions/EditFlow.js +63 -35
  10. package/src/sap/fe/core/controllerextensions/EditFlow.ts +80 -47
  11. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
  12. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
  13. package/src/sap/fe/core/controllerextensions/InternalRouting.js +16 -2
  14. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +15 -1
  15. package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
  16. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
  17. package/src/sap/fe/core/controllerextensions/SideEffects.js +7 -5
  18. package/src/sap/fe/core/controllerextensions/SideEffects.ts +10 -7
  19. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
  20. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
  21. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
  22. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
  23. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +30 -3
  24. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +26 -3
  25. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +21 -16
  26. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +36 -16
  27. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +12 -26
  28. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +25 -44
  29. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +2 -2
  30. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +1 -1
  31. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +8 -6
  32. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +13 -4
  33. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +15 -5
  34. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +21 -6
  35. package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
  36. package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
  37. package/src/sap/fe/core/converters/controls/Common/Action.js +17 -12
  38. package/src/sap/fe/core/converters/controls/Common/Action.ts +19 -11
  39. package/src/sap/fe/core/converters/controls/Common/Table.js +25 -3
  40. package/src/sap/fe/core/converters/controls/Common/Table.ts +31 -2
  41. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +13 -11
  42. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +15 -2
  43. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +19 -5
  44. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +28 -5
  45. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +11 -6
  46. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +17 -10
  47. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -3
  48. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +26 -1
  49. package/src/sap/fe/core/designtime/messagebundle_en_US_saprigi.properties +7 -0
  50. package/src/sap/fe/core/fpm/manifest.json +1 -1
  51. package/src/sap/fe/core/helpers/DeleteHelper.js +12 -10
  52. package/src/sap/fe/core/helpers/DeleteHelper.ts +9 -10
  53. package/src/sap/fe/core/helpers/ModelHelper.js +43 -4
  54. package/src/sap/fe/core/helpers/ModelHelper.ts +48 -3
  55. package/src/sap/fe/core/library.js +1 -1
  56. package/src/sap/fe/core/messagebundle.properties +4 -0
  57. package/src/sap/fe/core/messagebundle_ar.properties +5 -4
  58. package/src/sap/fe/core/messagebundle_bg.properties +2 -1
  59. package/src/sap/fe/core/messagebundle_ca.properties +2 -1
  60. package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
  61. package/src/sap/fe/core/messagebundle_cs.properties +4 -3
  62. package/src/sap/fe/core/messagebundle_cy.properties +2 -1
  63. package/src/sap/fe/core/messagebundle_da.properties +2 -1
  64. package/src/sap/fe/core/messagebundle_de.properties +8 -7
  65. package/src/sap/fe/core/messagebundle_el.properties +4 -3
  66. package/src/sap/fe/core/messagebundle_en.properties +2 -1
  67. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
  68. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -1
  69. package/src/sap/fe/core/messagebundle_es.properties +5 -4
  70. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
  71. package/src/sap/fe/core/messagebundle_et.properties +2 -1
  72. package/src/sap/fe/core/messagebundle_fi.properties +2 -1
  73. package/src/sap/fe/core/messagebundle_fr.properties +4 -3
  74. package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
  75. package/src/sap/fe/core/messagebundle_hi.properties +2 -1
  76. package/src/sap/fe/core/messagebundle_hr.properties +2 -1
  77. package/src/sap/fe/core/messagebundle_hu.properties +2 -1
  78. package/src/sap/fe/core/messagebundle_id.properties +4 -3
  79. package/src/sap/fe/core/messagebundle_it.properties +2 -1
  80. package/src/sap/fe/core/messagebundle_iw.properties +2 -1
  81. package/src/sap/fe/core/messagebundle_ja.properties +3 -2
  82. package/src/sap/fe/core/messagebundle_kk.properties +2 -1
  83. package/src/sap/fe/core/messagebundle_ko.properties +6 -5
  84. package/src/sap/fe/core/messagebundle_lt.properties +2 -1
  85. package/src/sap/fe/core/messagebundle_lv.properties +2 -1
  86. package/src/sap/fe/core/messagebundle_mk.properties +2 -1
  87. package/src/sap/fe/core/messagebundle_ms.properties +2 -1
  88. package/src/sap/fe/core/messagebundle_nl.properties +2 -1
  89. package/src/sap/fe/core/messagebundle_no.properties +3 -2
  90. package/src/sap/fe/core/messagebundle_pl.properties +2 -1
  91. package/src/sap/fe/core/messagebundle_pt.properties +2 -1
  92. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
  93. package/src/sap/fe/core/messagebundle_ro.properties +2 -1
  94. package/src/sap/fe/core/messagebundle_ru.properties +2 -1
  95. package/src/sap/fe/core/messagebundle_sh.properties +2 -1
  96. package/src/sap/fe/core/messagebundle_sk.properties +2 -1
  97. package/src/sap/fe/core/messagebundle_sl.properties +2 -1
  98. package/src/sap/fe/core/messagebundle_sr.properties +2 -1
  99. package/src/sap/fe/core/messagebundle_sv.properties +2 -1
  100. package/src/sap/fe/core/messagebundle_th.properties +2 -1
  101. package/src/sap/fe/core/messagebundle_tr.properties +2 -1
  102. package/src/sap/fe/core/messagebundle_uk.properties +2 -1
  103. package/src/sap/fe/core/messagebundle_vi.properties +9 -8
  104. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
  105. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
  106. package/src/sap/fe/core/rootView/Fcl.controller.js +8 -3
  107. package/src/sap/fe/core/rootView/Fcl.controller.ts +14 -7
  108. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
  109. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
  110. package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
  111. package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
  112. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
  113. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
  114. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
@@ -352,7 +352,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
352
352
  if (message.userAction === Activity.JoinEcho) {
353
353
  if (message.clientContent) {
354
354
  // another user was already typing therefore I want to see his activity immediately. Calling me again as a live change
355
- message.userAction = Activity.Lock;
355
+ message.userAction = Activity.LockEcho;
356
356
  this.messageReceive(message, view);
357
357
  }
358
358
  }
@@ -433,6 +433,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
433
433
  this.updateOnAction(view, message);
434
434
  break;
435
435
  case Activity.Lock:
436
+ case Activity.LockEcho:
436
437
  mactivity = sender;
437
438
  mactivity.key = getActivityKeyFromPath(message.clientContent);
438
439
 
@@ -449,6 +450,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
449
450
  activities = activities?.slice ? activities.slice() : [];
450
451
  activities.push(mactivity);
451
452
  internalModel.setProperty(ACTIVITIES + metaPath, activities);
453
+ if (message.userAction === Activity.LockEcho && this.checkPathForLock(internalModel, message.clientContent)) {
454
+ // The current user has locked this path right after connection, before knowing it was already locked by someone else
455
+ // --> remove the current lock
456
+ this.doSend(internalModel, Activity.Unlock, message.clientContent);
457
+ }
452
458
  break;
453
459
  case Activity.Unlock:
454
460
  // The user did a change but reverted it, therefore unblock the control
@@ -777,4 +783,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
777
783
  _exports = CollaborativeDraftServiceFactory;
778
784
  return _exports;
779
785
  }, false);
780
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNWUFDVElWSVRJRVMiLCJBQ1RJVkVVU0VSUyIsIkFDVElWSVRJRVMiLCJBU1lOQ01FU1NBR0VTUVVFVUUiLCJSRVRBSU5FREFTWU5DTUVTU0FHRVMiLCJBU1lOQ01FU1NBR0VTVElNRVJJRCIsIlNZTkNHUk9VUElEIiwiREVMQVlPTkZPQ1VTIiwiQ29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiY2hlY2tQYXRoRm9yTG9jayIsImFjdGl2aXR5TW9kZWwiLCJhY3Rpdml0eVBhdGgiLCJteUFjdGl2aXRpZXMiLCJnZXRQcm9wZXJ0eSIsImluY2x1ZGVzIiwic2V0TG9jayIsInB1c2giLCJzZXRQcm9wZXJ0eSIsInJlbW92ZUxvY2siLCJhY3Rpdml0eVBhdGhzIiwidW5kZWZpbmVkIiwicGF0aHNUb1JlbW92ZSIsIkFycmF5IiwiaXNBcnJheSIsIm15TmV3QWN0aXZpdGllcyIsImZpbHRlciIsImFjdGl2aXR5IiwibGVuZ3RoIiwiZ2V0TG9ja2VkUHJvcGVydGllcyIsImpvaW4iLCJ1cGRhdGVMb2Nrc0ZvckNvbnRleHRQYXRoIiwiZWxlbWVudCIsIm9sZENvbnRleHRQYXRoIiwibmV3Q29udGV4dFBhdGgiLCJpc0Nvbm5lY3RlZCIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsImN1cnJlbnRRdWV1ZSIsImZvckVhY2giLCJxdWV1ZUl0ZW0iLCJwYXRoIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJjaGFuZ2VkQWN0aXZpdGllcyIsInVuY2hhbmdlZEFjdGl2aXRpZXMiLCJsb2NrZWRQYXRoIiwibmV3bG9ja2VkUGF0aCIsInNlbmQiLCJhY3Rpb24iLCJBY3Rpdml0eSIsIkxvY2siLCJjb250ZW50IiwicmVzZXRBc3luY01lc3NhZ2VzVGltZXIiLCJ0aW1lcklkIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsInF1ZXVlIiwibmV3UXVldWUiLCJwYXRoc1RvUmV0YWluIiwiaXRlbSIsImRvU2VuZCIsInJldGFpbkFzeW5jTWVzc2FnZXMiLCJhZGRpdGlvbmFsUGF0aHNUb1JldGFpbiIsInJldGFpbmVkUGF0aHMiLCJyZWxlYXNlQXN5bmNNZXNzYWdlcyIsInBhdGhzVG9SZWxlYXNlIiwicmV0YWluZWRQYXRoIiwiaXNDb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwibWVzc2FnZSIsIlVubG9jayIsImRvU2VuZEFzeW5jIiwidHJpZ2dlcmVkQWN0aW9uTmFtZSIsInJlZnJlc2hMaXN0QmluZGluZyIsImFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMiLCJjbGllbnRDb250ZW50IiwicmVxdWVzdGVkUHJvcGVydGllcyIsInBhdGhGb3JMb2NrIiwicmVtb3ZlZCIsImJyb2FkY2FzdENvbGxhYm9yYXRpb25NZXNzYWdlIiwicGF0aHNUb0FkZCIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJ2aWV3IiwiYmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRNZXRhTW9kZWwiLCJjb25uZWN0IiwiZHJhZnRSb290Q29udGV4dCIsIm1lIiwiQ29sbGFib3JhdGlvblV0aWxzIiwiZ2V0TWUiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsInNEcmFmdFVVSUQiLCJyZXF1ZXN0UHJvcGVydHkiLCJpbml0aWFsaXplZCIsImluaXRpYWxpemVDb2xsYWJvcmF0aW9uIiwibWVzc2FnZVJlY2VpdmUiLCJkaXNjb25uZWN0IiwiZW5kQ29sbGFib3JhdGlvbiIsInVzZXJKb2luRHJhZnQiLCJhY3RpdmVVc2VycyIsInNlbmRlciIsImZpbmRJbmRleCIsInVzZXIiLCJpZCIsInVuc2hpZnQiLCJ1c2VyQWN0aW9uIiwiSm9pbiIsIkpvaW5FY2hvIiwidXNlckxlYXZlRHJhZnQiLCJhbGxBY3Rpdml0aWVzIiwicmVtb3ZlVXNlckFjdGl2aXRpZXMiLCJiYWciLCJwIiwiYWN0aXZpdGllcyIsImFjdGl2aXR5S2V5IiwibWV0YVBhdGgiLCJjYWxjdWxhdGVNZXRhUGF0aCIsImNsaWVudEFjdGlvbiIsInVzZXJJRCIsIm5hbWUiLCJ1c2VyRGVzY3JpcHRpb24iLCJpbml0aWFscyIsImZvcm1hdEluaXRpYWxzIiwiY29sb3IiLCJnZXRVc2VyQ29sb3IiLCJtYWN0aXZpdHkiLCJMZWF2ZSIsIkNoYW5nZSIsInVwZGF0ZU9uQ2hhbmdlIiwiQ3JlYXRlIiwidXBkYXRlT25DcmVhdGUiLCJEZWxldGUiLCJ1cGRhdGVPbkRlbGV0ZSIsIkFjdGl2YXRlIiwiZHJhZnRDbG9zZWRCeU90aGVyVXNlciIsImdldFRleHQiLCJEaXNjYXJkIiwiQWN0aW9uIiwidXBkYXRlT25BY3Rpb24iLCJrZXkiLCJnZXRBY3Rpdml0eUtleUZyb21QYXRoIiwiaW5pdEpTT05Nb2RlbCIsInBhcnRzIiwic3BsaXQiLCJpIiwic2xpY2UiLCJhIiwibWVzc2FnZVRleHQiLCJNZXNzYWdlQm94IiwiaW5mb3JtYXRpb24iLCJvbkNsb3NlIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsIm5hdmlnYXRlIiwiZXJyb3IiLCJMb2ciLCJ1cGRhdGVkT2JqZWN0c1BhdGhzIiwiY3VycmVudFBhZ2UiLCJnZXRDdXJyZW50UGFnZSIsImN1cnJlbnRDb250ZXh0IiwicmVxdWVzdFByb21pc2VzIiwibWFwIiwiYXBwbHlVcGRhdGVzRm9yQ2hhbmdlIiwiZ2V0Q29udHJvbGxlciIsImVkaXRGbG93IiwidXBkYXRlRG9jdW1lbnQiLCJQcm9taXNlIiwiYWxsIiwicHJvcGVydHlQYXRoRm9yVXBkYXRlIiwibWV0YU1vZGVsIiwibWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsImRhdGFNb2RlbE9iamVjdCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInRhcmdldENvbnRleHRQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJ0YXJnZXRDb250ZXh0IiwiZmluZENvbnRleHRGb3JVcGRhdGUiLCJwYXJlbnRDb2xsZWN0aW9uUGF0aCIsInBhcmVudENvbnRleHRQYXRoIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RzUHJvbWlzZXMiLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJ0YXJnZXRNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsInJlbGF0aXZlTWV0YVBhdGhGb3JVcGRhdGUiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJmaWVsZEdyb3VwSWRzIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwidGFyZ2V0T2JqZWN0IiwicGFnZUNvbnRyb2xsZXIiLCJzaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXAiLCJfc2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBzIiwiT2JqZWN0Iiwia2V5cyIsInNpZGVFZmZlY3ROYW1lIiwic2lkZUVmZmVjdCIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImVyciIsImN1cnJlbnRQYXRoIiwiZGVsZXRlZE9iamVjdFBhdGhzIiwiZGVsZXRlZFBhdGhJblVzZSIsImZpbmQiLCJkZWxldGVkUGF0aCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJzZXRLZWVwQWxpdmUiLCJyZXF1ZXN0UHJvbWlzZSIsImFwcGx5VXBkYXRlc0ZvckNvbGxlY3Rpb24iLCJfcm91dGluZyIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiY3JlYXRlZE9iamVjdFBhdGhzIiwicGF0aEluQ29sbGVjdGlvbiIsImFwcENvbXBvbmVudCIsInBhcmVudFBhdGgiLCJtZXRhUGF0aEZvclVwZGF0ZSIsInBhcmVudE1ldGFQYXRoIiwicmVsYXRpdmVQYXRoIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwicGF0aHNGb3JBY3Rpb24iLCJhY3Rpb25OYW1lIiwiY2xpZW50VHJpZ2dlcmVkQWN0aW9uTmFtZSIsImNsaWVudFJlcXVlc3RlZFByb3BlcnRpZXMiLCJjbGllbnRSZWZyZXNoTGlzdEJpbmRpbmciLCJyZXF1ZXN0VXBkYXRlRm9yQWN0aW9uIiwicGF0aEZvckFjdGlvbiIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic2lkZUVmZmVjdHNGcm9tQWN0aW9uIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RQcm9taXNlcyIsInBhdGhFeHByZXNzaW9ucyIsIm1ldGFQYXRoRm9yQWN0aW9uIiwiZGF0YU1vZGVsUGF0aCIsImdldENvbnRleHQiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiZW50aXR5UHJvcGVydGllcyIsInByb3BlcnR5IiwicHJvcCIsInRhcmdldFBhdGhzIiwiZW5kc1dpdGgiLCJtb2RlbCIsInBhcmVudExpc3RCaW5kaW5nIiwiZ2V0QWxsQmluZGluZ3MiLCJiaW5kaW5nIiwiYmluZGluZ1BhdGgiLCJpc1JlbGF0aXZlIiwiZ2V0UmVzb2x2ZWRQYXRoIiwiaXNBIiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJnZXRDcmVhdGlvbk1vZGUiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsInJlY3JlYXRlQ29udGV4dCIsImdldEN1cnJlbnRQYWdlVmlldyIsImRhdGFQYXRoIiwiaW5pdCIsImluaXRQcm9taXNlIiwicmVzb2x2ZSIsIlNlcnZpY2UiLCJDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlRmFjdG9yeSIsIl9TZXJ2aWNlRmFjdG9yeSIsIl9wcm90bzIiLCJjcmVhdGVJbnN0YW5jZSIsIm9TZXJ2aWNlQ29udGV4dCIsImNvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZUZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NpZGVFZmZlY3RzXCI7XG5pbXBvcnQge1xuXHRicm9hZGNhc3RDb2xsYWJvcmF0aW9uTWVzc2FnZSxcblx0ZW5kQ29sbGFib3JhdGlvbixcblx0aW5pdGlhbGl6ZUNvbGxhYm9yYXRpb24sXG5cdGlzQ29sbGFib3JhdGlvbkNvbm5lY3RlZFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eUJhc2VcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgVXNlciwgVXNlckFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIENvbGxhYm9yYXRpb25VdGlscywgZ2V0QWN0aXZpdHlLZXlGcm9tUGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbmNvbnN0IE1ZQUNUSVZJVElFUyA9IFwiL2NvbGxhYm9yYXRpb24vbXlBY3Rpdml0aWVzXCI7XG5jb25zdCBBQ1RJVkVVU0VSUyA9IFwiL2NvbGxhYm9yYXRpb24vYWN0aXZlVXNlcnNcIjtcbmNvbnN0IEFDVElWSVRJRVMgPSBcIi9jb2xsYWJvcmF0aW9uL2FjdGl2aXRpZXNcIjtcbmNvbnN0IEFTWU5DTUVTU0FHRVNRVUVVRSA9IFwiL2NvbGxhYm9yYXRpb24vYXN5bmNNc2dRdWV1ZVwiO1xuY29uc3QgUkVUQUlORURBU1lOQ01FU1NBR0VTID0gXCIvY29sbGFib3JhdGlvbi9yZXRhaW5lZE1lc3NhZ2VzXCI7XG5jb25zdCBBU1lOQ01FU1NBR0VTVElNRVJJRCA9IFwiL2NvbGxhYm9yYXRpb24vYXN5bmNNc2dUaW1lcklkXCI7XG5jb25zdCBTWU5DR1JPVVBJRCA9IFwiJGF1dG8uc3luY1wiO1xuXG5jb25zdCBERUxBWU9ORk9DVVMgPSA1MDA7IC8vIDUwMG1zIGRlbGF5IGZvciBhc3luYyBMT0NLL1VOTE9DSyBtZXNzYWdlc1xuXG50eXBlIEFzeW5jTWVzc2FnZSA9IHtcblx0cGF0aDogc3RyaW5nO1xuXHRhY3Rpb246IEFjdGl2aXR5LlVubG9jayB8IEFjdGl2aXR5LkxvY2s7XG59O1xuXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSBleHRlbmRzIFNlcnZpY2U8Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZUZhY3Rvcnk+IHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2U+O1xuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBnaXZlbiBwYXRoIGlzIGxvY2tlZCBieSB0aGUgY3VycmVudCB1c2VyLlxuXHQgKiBAcGFyYW0gYWN0aXZpdHlNb2RlbFxuXHQgKiBAcGFyYW0gYWN0aXZpdHlQYXRoXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHBhdGggaXMgbG9ja2VkXG5cdCAqL1xuXHRjaGVja1BhdGhGb3JMb2NrKGFjdGl2aXR5TW9kZWw6IEpTT05Nb2RlbCwgYWN0aXZpdHlQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBteUFjdGl2aXRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCA9IGFjdGl2aXR5TW9kZWwuZ2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTKTtcblx0XHRpZiAoIW15QWN0aXZpdGllcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gbXlBY3Rpdml0aWVzLmluY2x1ZGVzKGFjdGl2aXR5UGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSBwYXRoIGFzIGxvY2tlZCBmb3IgdGhlIGN1cnJlbnQgdXNlci5cblx0ICogQHBhcmFtIGFjdGl2aXR5TW9kZWxcblx0ICogQHBhcmFtIGFjdGl2aXR5UGF0aFxuXHQgKi9cblx0c2V0TG9jayhhY3Rpdml0eU1vZGVsOiBKU09OTW9kZWwsIGFjdGl2aXR5UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgbXlBY3Rpdml0aWVzOiBzdHJpbmdbXSA9IGFjdGl2aXR5TW9kZWwuZ2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTKSA/PyBbXTtcblx0XHRpZiAoIW15QWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eVBhdGgpKSB7XG5cdFx0XHRteUFjdGl2aXRpZXMucHVzaChhY3Rpdml0eVBhdGgpO1xuXHRcdH1cblxuXHRcdGFjdGl2aXR5TW9kZWwuc2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTLCBteUFjdGl2aXRpZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGxvY2sgZm9yIGEgZ2l2ZW4gcGF0aC5cblx0ICogQHBhcmFtIGFjdGl2aXR5TW9kZWxcblx0ICogQHBhcmFtIGFjdGl2aXR5UGF0aHNcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGF0aCB3YXMgcHJldmlvdXNseSBsb2NrZWRcblx0ICovXG5cdHJlbW92ZUxvY2soYWN0aXZpdHlNb2RlbDogSlNPTk1vZGVsLCBhY3Rpdml0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG15QWN0aXZpdGllczogc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsID0gYWN0aXZpdHlNb2RlbC5nZXRQcm9wZXJ0eShNWUFDVElWSVRJRVMpO1xuXHRcdGlmICghbXlBY3Rpdml0aWVzIHx8IGFjdGl2aXR5UGF0aHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhdGhzVG9SZW1vdmUgPSBBcnJheS5pc0FycmF5KGFjdGl2aXR5UGF0aHMpID8gYWN0aXZpdHlQYXRocyA6IFthY3Rpdml0eVBhdGhzXTtcblx0XHRjb25zdCBteU5ld0FjdGl2aXRpZXMgPSBteUFjdGl2aXRpZXMuZmlsdGVyKChhY3Rpdml0eSkgPT4ge1xuXHRcdFx0cmV0dXJuICFwYXRoc1RvUmVtb3ZlLmluY2x1ZGVzKGFjdGl2aXR5KTtcblx0XHR9KTtcblx0XHRhY3Rpdml0eU1vZGVsLnNldFByb3BlcnR5KE1ZQUNUSVZJVElFUywgbXlOZXdBY3Rpdml0aWVzKTtcblxuXHRcdHJldHVybiBteU5ld0FjdGl2aXRpZXMubGVuZ3RoICE9PSBteUFjdGl2aXRpZXMubGVuZ3RoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIGxvY2tlZCBwYXRocyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cblx0ICogQHBhcmFtIGFjdGl2aXR5TW9kZWxcblx0ICogQHJldHVybnMgQ29uY2F0ZW5hdGVkIHBhdGhzIGZvciBhbGwgbG9ja2VkIHByb3BlcnRpZXNcblx0ICovXG5cdGdldExvY2tlZFByb3BlcnRpZXMoYWN0aXZpdHlNb2RlbDogSlNPTk1vZGVsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBteUFjdGl2aXRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCA9IGFjdGl2aXR5TW9kZWwuZ2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTKTtcblx0XHRpZiAoIW15QWN0aXZpdGllcykge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG15QWN0aXZpdGllcy5qb2luKFwifFwiKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyBhbGwgY3VycmVudCBsb2NrcyBieSBjaGFuZ2luZyBhIGNvbnRleHQgcGF0aC5cblx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhY3RpdmF0aW5nIGEgY29udGV4dCwgd2hlcmUgdGhlIGluaXRpYWwgbG9ja3Mgd2VyZSB1c2luZyB0aGUgdHJhbnNpZW50IHBhdGhcblx0ICogYW5kIG5lZWQgdG8gYmUgdXBkYXRlZCB3aXRoIHRoZSBhY3R1YWwgcGF0aC5cblx0ICogQHBhcmFtIGVsZW1lbnRcblx0ICogQHBhcmFtIG9sZENvbnRleHRQYXRoXG5cdCAqIEBwYXJhbSBuZXdDb250ZXh0UGF0aFxuXHQgKi9cblx0dXBkYXRlTG9ja3NGb3JDb250ZXh0UGF0aChlbGVtZW50OiBVSTVFbGVtZW50LCBvbGRDb250ZXh0UGF0aDogc3RyaW5nLCBuZXdDb250ZXh0UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmlzQ29ubmVjdGVkKGVsZW1lbnQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHQvLyBSZXBsYWNlIHBhdGhzIGluIHBlbmRpbmcgYXN5bmMgbWVzc2FnZXNcblx0XHRjb25zdCBjdXJyZW50UXVldWU6IEFzeW5jTWVzc2FnZVtdID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBU1lOQ01FU1NBR0VTUVVFVUUpO1xuXHRcdGN1cnJlbnRRdWV1ZS5mb3JFYWNoKChxdWV1ZUl0ZW0pID0+IHtcblx0XHRcdGlmIChxdWV1ZUl0ZW0ucGF0aC5zdGFydHNXaXRoKG9sZENvbnRleHRQYXRoKSkge1xuXHRcdFx0XHRxdWV1ZUl0ZW0ucGF0aCA9IHF1ZXVlSXRlbS5wYXRoLnJlcGxhY2Uob2xkQ29udGV4dFBhdGgsIG5ld0NvbnRleHRQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIFJlcGxhY2UgcGF0aHMgaW4gZXhpc3RpbmcgbG9ja3MgKGFuZCBicm9hZGNhc3QgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBpZiBuZWNlc3NhcnkpXG5cdFx0Y29uc3QgbXlBY3Rpdml0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IG51bGwgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KE1ZQUNUSVZJVElFUyk7XG5cdFx0aWYgKG15QWN0aXZpdGllcykge1xuXHRcdFx0Y29uc3QgY2hhbmdlZEFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRjb25zdCB1bmNoYW5nZWRBY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0bXlBY3Rpdml0aWVzLmZvckVhY2goKGxvY2tlZFBhdGgpID0+IHtcblx0XHRcdFx0aWYgKGxvY2tlZFBhdGguc3RhcnRzV2l0aChvbGRDb250ZXh0UGF0aCkpIHtcblx0XHRcdFx0XHQvLyBSZXBsYWNlIHRoZSBwYXRoIGluIHRoZSBsaXN0IG9mIGxvY2tzLCBhbmQgc3RvcmUgdGhpcyBwYXRoIGZvciBzZW5kaW5nIGEgbmV3IExPQ0sgbWVzc2FnZVxuXHRcdFx0XHRcdGNvbnN0IG5ld2xvY2tlZFBhdGggPSBsb2NrZWRQYXRoLnJlcGxhY2Uob2xkQ29udGV4dFBhdGgsIG5ld0NvbnRleHRQYXRoKTtcblx0XHRcdFx0XHRjaGFuZ2VkQWN0aXZpdGllcy5wdXNoKG5ld2xvY2tlZFBhdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHVuY2hhbmdlZEFjdGl2aXRpZXMucHVzaChsb2NrZWRQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTLCB1bmNoYW5nZWRBY3Rpdml0aWVzKTtcblx0XHRcdGlmIChjaGFuZ2VkQWN0aXZpdGllcy5sZW5ndGggIT09IDApIHtcblx0XHRcdFx0dGhpcy5zZW5kKGVsZW1lbnQsIHsgYWN0aW9uOiBBY3Rpdml0eS5Mb2NrLCBjb250ZW50OiBjaGFuZ2VkQWN0aXZpdGllcyB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVzZXRzIHRoZSB0aW1lciBmb3Igc2VuZGluZyBhc3luY2hyb25vdXMgY29sbGFib3JhdGlvbiBtZXNzYWdlcy5cblx0ICogQHBhcmFtIGludGVybmFsTW9kZWxcblx0ICovXG5cdHJlc2V0QXN5bmNNZXNzYWdlc1RpbWVyKGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCk6IHZvaWQge1xuXHRcdGxldCB0aW1lcklkID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBU1lOQ01FU1NBR0VTVElNRVJJRCk7XG5cdFx0aWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuXHRcdH1cblxuXHRcdHRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IHF1ZXVlOiBBc3luY01lc3NhZ2VbXSB8IHVuZGVmaW5lZCA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoQVNZTkNNRVNTQUdFU1FVRVVFKTtcblx0XHRcdGNvbnN0IG5ld1F1ZXVlOiBBc3luY01lc3NhZ2VbXSA9IFtdO1xuXHRcdFx0Y29uc3QgcGF0aHNUb1JldGFpbjogc3RyaW5nW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFJFVEFJTkVEQVNZTkNNRVNTQUdFUykgPz8gW107XG5cblx0XHRcdGlmICghcXVldWUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRxdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0XHRcdGlmIChwYXRoc1RvUmV0YWluLmluY2x1ZGVzKGl0ZW0ucGF0aCkpIHtcblx0XHRcdFx0XHRuZXdRdWV1ZS5wdXNoKGl0ZW0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZG9TZW5kKGludGVybmFsTW9kZWwsIGl0ZW0uYWN0aW9uLCBpdGVtLnBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBU1lOQ01FU1NBR0VTUVVFVUUsIG5ld1F1ZXVlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQVNZTkNNRVNTQUdFU1RJTUVSSUQsIHVuZGVmaW5lZCk7XG5cblx0XHRcdGlmIChuZXdRdWV1ZS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gSWYgc29tZSBtZXNzYWdlcyBhcmUgc3RpbGwgcGVuZGluZywgcmVzY2hlZHVsZSBhIG5ldyB0aW1lclxuXHRcdFx0XHR0aGlzLnJlc2V0QXN5bmNNZXNzYWdlc1RpbWVyKGludGVybmFsTW9kZWwpO1xuXHRcdFx0fVxuXHRcdH0sIERFTEFZT05GT0NVUyk7XG5cblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFTWU5DTUVTU0FHRVNUSU1FUklELCB0aW1lcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXJrIHNvbWUgcGF0aHMgYXMgYmVpbmcgcmV0YWluZWQsIGkuZS4gYXN5bmMgbWVzc2FnZXMgZm9yIHRoZXNlIHBhdGhzIHdvbid0IGJlIHNlbnQgYnV0IGtlcHQgdW50aWwgdGhleSdyZSByZWxlYXNlZC5cblx0ICogVGhpcyBhcHBsaWVzIHRvIGV4aXN0aW5nIGFzeW5jIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSwgYnV0IGFsc28gdG8gZnV0dXJlIG1lc3NhZ2VzLlxuXHQgKiBAcGFyYW0gZWxlbWVudFxuXHQgKiBAcGFyYW0gYWN0aXZpdHlQYXRocyBUaGUgcGF0aHMgdG8gYmUgcmV0YWluZWRcblx0ICovXG5cdHJldGFpbkFzeW5jTWVzc2FnZXMoZWxlbWVudDogVUk1RWxlbWVudCwgYWN0aXZpdHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gZWxlbWVudC5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRjb25zdCBhZGRpdGlvbmFsUGF0aHNUb1JldGFpbiA9IEFycmF5LmlzQXJyYXkoYWN0aXZpdHlQYXRocykgPyBhY3Rpdml0eVBhdGhzIDogW2FjdGl2aXR5UGF0aHNdO1xuXG5cdFx0Y29uc3QgcmV0YWluZWRQYXRoczogc3RyaW5nW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFJFVEFJTkVEQVNZTkNNRVNTQUdFUyk7XG5cdFx0YWRkaXRpb25hbFBhdGhzVG9SZXRhaW4uZm9yRWFjaCgocGF0aCkgPT4ge1xuXHRcdFx0aWYgKCFyZXRhaW5lZFBhdGhzLmluY2x1ZGVzKHBhdGgpKSB7XG5cdFx0XHRcdHJldGFpbmVkUGF0aHMucHVzaChwYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWxlYXNlIGFzeW5jIG1lc3NhZ2VzIGZvciBzb21lIHBhdGhzIHRoYXQgd2VyZSBwcmV2aW91c2x5IHJldGFpbmVkLlxuXHQgKiBUaGUgY29ycmVzcG9uZGluZyBtZXNzYWdlcyBhcmUgbm90IHNlbnQgaW1tZWRpYXRlbHksIGJ1dCB0aGUgbmV4dCB0aW1lIHRoZSBhc3luYyB0aW1lciB3YWtlcyB1cC5cblx0ICogQHBhcmFtIGVsZW1lbnRcblx0ICogQHBhcmFtIGFjdGl2aXR5UGF0aHMgVGhlIHBhdGhzIHRvIGJlIHJlbGVhc2VkXG5cdCAqL1xuXHRyZWxlYXNlQXN5bmNNZXNzYWdlcyhlbGVtZW50OiBVSTVFbGVtZW50LCBhY3Rpdml0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdGNvbnN0IHBhdGhzVG9SZXRhaW46IHN0cmluZ1tdID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShSRVRBSU5FREFTWU5DTUVTU0FHRVMpO1xuXHRcdGNvbnN0IHBhdGhzVG9SZWxlYXNlID0gQXJyYXkuaXNBcnJheShhY3Rpdml0eVBhdGhzKSA/IGFjdGl2aXR5UGF0aHMgOiBbYWN0aXZpdHlQYXRoc107XG5cblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0UkVUQUlORURBU1lOQ01FU1NBR0VTLFxuXHRcdFx0cGF0aHNUb1JldGFpbi5maWx0ZXIoKHJldGFpbmVkUGF0aCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gIXBhdGhzVG9SZWxlYXNlLmluY2x1ZGVzKHJldGFpbmVkUGF0aCk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgY29sbGFib3JhdGlvbiBzZXNzaW9uIGlzIGN1cnJlbnRseSBvcGVuLlxuXHQgKiBAcGFyYW0gZWxlbWVudFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGEgY29sbGFib3JhdGlvbiBzZXNzaW9uIGlzIGN1cnJlbnRseSBvcGVuLlxuXHQgKi9cblx0aXNDb25uZWN0ZWQoZWxlbWVudDogVUk1RWxlbWVudCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdHJldHVybiBpc0NvbGxhYm9yYXRpb25Db25uZWN0ZWQoaW50ZXJuYWxNb2RlbCk7XG5cdH1cblxuXHQvKipcblx0ICogU2VuZHMgYSBjb2xsYWJvcmF0aW9uIG1lc3NhZ2UgdG8gb3RoZXIgY29ubmVjdGVkIHVzZXJzLlxuXHQgKiBAcGFyYW0gZWxlbWVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZVxuXHQgKiBAcGFyYW0gbWVzc2FnZS5hY3Rpb25cblx0ICogQHBhcmFtIG1lc3NhZ2UuY29udGVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZS50cmlnZ2VyZWRBY3Rpb25OYW1lXG5cdCAqIEBwYXJhbSBtZXNzYWdlLnJlZnJlc2hMaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gbWVzc2FnZS5hY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzXG5cdCAqL1xuXHRwdWJsaWMgc2VuZChcblx0XHRlbGVtZW50OiBVSTVFbGVtZW50LFxuXHRcdG1lc3NhZ2U6IHtcblx0XHRcdGFjdGlvbjogQWN0aXZpdHk7XG5cdFx0XHRjb250ZW50OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0XHRcdHRyaWdnZXJlZEFjdGlvbk5hbWU/OiBzdHJpbmc7XG5cdFx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuO1xuXHRcdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRcdH1cblx0KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNDb25uZWN0ZWQoZWxlbWVudCkpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0aWYgKG1lc3NhZ2UuYWN0aW9uID09PSBBY3Rpdml0eS5Mb2NrIHx8IG1lc3NhZ2UuYWN0aW9uID09PSBBY3Rpdml0eS5VbmxvY2spIHtcblx0XHRcdFx0Ly8gTG9jay1yZWxhdGVkIGV2ZW50cyBhcmUgYWx3YXlzIHNlbnQgd2l0aCBzb21lIGRlbGF5XG5cdFx0XHRcdHRoaXMuZG9TZW5kQXN5bmMoaW50ZXJuYWxNb2RlbCwgbWVzc2FnZS5hY3Rpb24sIG1lc3NhZ2UuY29udGVudCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmRvU2VuZChcblx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsLFxuXHRcdFx0XHRcdG1lc3NhZ2UuYWN0aW9uLFxuXHRcdFx0XHRcdG1lc3NhZ2UuY29udGVudCxcblx0XHRcdFx0XHRtZXNzYWdlLnRyaWdnZXJlZEFjdGlvbk5hbWUsXG5cdFx0XHRcdFx0bWVzc2FnZS5yZWZyZXNoTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0bWVzc2FnZS5hY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHNlbmQgYSBjb2xsYWJvcmF0aW9uIG1lc3NhZ2UgaW1tZWRpYXRlbHkuXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsXG5cdCAqIEBwYXJhbSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRlbnRcblx0ICogQHBhcmFtIHRyaWdnZXJlZEFjdGlvbk5hbWVcblx0ICogQHBhcmFtIHJlZnJlc2hMaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllc1xuXHQgKi9cblx0ZG9TZW5kKFxuXHRcdGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdGNvbnRlbnQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRcdHRyaWdnZXJlZEFjdGlvbk5hbWU/OiBzdHJpbmcsXG5cdFx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbixcblx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW11cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY2xpZW50Q29udGVudCA9IChBcnJheS5pc0FycmF5KGNvbnRlbnQpID8gY29udGVudC5qb2luKFwifFwiKSA6IGNvbnRlbnQpID8/IFwiXCI7XG5cdFx0Y29uc3QgcmVxdWVzdGVkUHJvcGVydGllcyA9IGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/LmpvaW4oXCJ8XCIpO1xuXHRcdGlmIChhY3Rpb24gPT09IEFjdGl2aXR5LkxvY2spIHtcblx0XHRcdGNvbnN0IHBhdGhGb3JMb2NrID0gKEFycmF5LmlzQXJyYXkoY29udGVudCkgPyBjb250ZW50WzBdIDogY29udGVudCkgPz8gXCJcIjtcblx0XHRcdC8vIFRvIGF2b2lkIHVubmVjZXNzYXJ5IHRyYWZmaWMgd2Uga2VlcCB0cmFjayBvZiBsb2NrIGNoYW5nZXMgYW5kIHNlbmQgaXQgb25seSBvbmNlXG5cdFx0XHRpZiAodGhpcy5jaGVja1BhdGhGb3JMb2NrKGludGVybmFsTW9kZWwsIHBhdGhGb3JMb2NrKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnNldExvY2soaW50ZXJuYWxNb2RlbCwgcGF0aEZvckxvY2spO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoYWN0aW9uID09PSBBY3Rpdml0eS5VbmxvY2spIHtcblx0XHRcdGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZUxvY2soaW50ZXJuYWxNb2RlbCwgY29udGVudCk7XG5cdFx0XHQvLyBObyBuZWVkIHRvIHNlbmQgYW4gVW5sb2NrIG1lc3NhZ2UgaWYgaXQgd2FzIG5vdCBhbHJlYWR5IGxvY2tlZFxuXHRcdFx0aWYgKCFyZW1vdmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRicm9hZGNhc3RDb2xsYWJvcmF0aW9uTWVzc2FnZShhY3Rpb24sIGNsaWVudENvbnRlbnQsIGludGVybmFsTW9kZWwsIHRyaWdnZXJlZEFjdGlvbk5hbWUsIHJlZnJlc2hMaXN0QmluZGluZywgcmVxdWVzdGVkUHJvcGVydGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gc2VuZCBhIGNvbGxhYm9yYXRpb24gbWVzc2FnZSBhc3luY2hyb25vdXNseS5cblx0ICogQHBhcmFtIGludGVybmFsTW9kZWxcblx0ICogQHBhcmFtIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGVudFxuXHQgKi9cblx0ZG9TZW5kQXN5bmMoaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBhY3Rpb246IEFjdGl2aXR5LkxvY2sgfCBBY3Rpdml0eS5VbmxvY2ssIGNvbnRlbnQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0aWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBjdXJyZW50UXVldWU6IEFzeW5jTWVzc2FnZVtdID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBU1lOQ01FU1NBR0VTUVVFVUUpO1xuXHRcdGNvbnN0IHBhdGhzVG9BZGQgPSBBcnJheS5pc0FycmF5KGNvbnRlbnQpID8gY29udGVudCA6IFtjb250ZW50XTtcblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgaXRlbXMgaW4gdGhlIHF1ZXVlIGZvciB0aGUgcGF0aHMgdGhhdCB3aWxsIGJlIGFkZGVkXG5cdFx0Y29uc3QgbmV3UXVldWUgPSBjdXJyZW50UXVldWUuZmlsdGVyKChpdGVtKSA9PiB7XG5cdFx0XHRyZXR1cm4gIXBhdGhzVG9BZGQuaW5jbHVkZXMoaXRlbS5wYXRoKTtcblx0XHR9KTtcblx0XHRwYXRoc1RvQWRkLmZvckVhY2goKHBhdGgpID0+IHtcblx0XHRcdG5ld1F1ZXVlLnB1c2goeyBwYXRoLCBhY3Rpb24gfSk7XG5cdFx0fSk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBU1lOQ01FU1NBR0VTUVVFVUUsIG5ld1F1ZXVlKTtcblx0XHR0aGlzLnJlc2V0QXN5bmNNZXNzYWdlc1RpbWVyKGludGVybmFsTW9kZWwpO1xuXHR9XG5cblx0aXNDb2xsYWJvcmF0aW9uRW5hYmxlZCh2aWV3OiBWaWV3KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSB2aWV3Py5nZXRCaW5kaW5nQ29udGV4dCAmJiAodmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpO1xuXHRcdHJldHVybiAhIShiaW5kaW5nQ29udGV4dCAmJiBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChiaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSk7XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3aXRoIGEgY29sbGFib3JhdGl2ZSBkcmFmdCBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gZHJhZnRSb290Q29udGV4dCBUaGUgZHJhZnQgcm9vdCBjb250ZXh0XG5cdCAqIEBwYXJhbSB2aWV3ICBUaGUgdmlldyB0aGF0IGlzIHVzZWQgdG8gY29ubmVjdCB0aGUgd2Vic29ja2V0XG5cdCAqIEByZXR1cm5zIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGNvbm5lY3QoZHJhZnRSb290Q29udGV4dDogQ29udGV4dCwgdmlldzogRkVWaWV3KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRjb25zdCBtZSA9IENvbGxhYm9yYXRpb25VdGlscy5nZXRNZShDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldykpO1xuXG5cdFx0Ly8gUmV0cmlldmluZyBNRSBmcm9tIHNoZWxsIHNlcnZpY2Vcblx0XHRpZiAoIW1lKSB7XG5cdFx0XHQvLyBubyBtZSA9IG5vIHNoZWxsID0gbm90IHN1cmUgd2hhdCB0byBkb1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNEcmFmdFVVSUQgPSBhd2FpdCBkcmFmdFJvb3RDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0VVVJRFwiKTtcblx0XHRpZiAoIXNEcmFmdFVVSUQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpbml0aWFsaXplZCA9IGluaXRpYWxpemVDb2xsYWJvcmF0aW9uKFxuXHRcdFx0bWUsXG5cdFx0XHRzRHJhZnRVVUlELFxuXHRcdFx0aW50ZXJuYWxNb2RlbCxcblx0XHRcdChtZXNzYWdlOiBNZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHRoaXMubWVzc2FnZVJlY2VpdmUobWVzc2FnZSwgdmlldyk7XG5cdFx0XHR9LFxuXHRcdFx0dmlld1xuXHRcdCk7XG5cblx0XHRpZiAoaW5pdGlhbGl6ZWQpIHtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTLCBbXSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFTWU5DTUVTU0FHRVNRVUVVRSwgW10pO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShSRVRBSU5FREFTWU5DTUVTU0FHRVMsIFtdKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gY2xvc2UgYSBjb25uZWN0aW9uIHdpdGggYSBjb2xsYWJvcmF0aXZlIGRyYWZ0IHNlcnZpY2UuXG5cdCAqIEBwYXJhbSB2aWV3IEN1cnJlbnQgVmlld1xuXHQgKi9cblx0ZGlzY29ubmVjdCh2aWV3OiBGRVZpZXcpOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdGVuZENvbGxhYm9yYXRpb24oaW50ZXJuYWxNb2RlbCk7XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gdXBkYXRlIGludGVybmFsIG1vZGVsIHdoZW4gYSB1c2VyIGpvaW5zIHRoZSBkcmFmdC5cblx0ICogQHBhcmFtIGFjdGl2ZVVzZXJzIExpc3Qgb2YgY29ubmVjdGVkIHVzZXJzXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIEludGVybmFsIG1vZGVsXG5cdCAqIEBwYXJhbSBzZW5kZXIgVXNlciBzZW5kaW5nIHRoZSBKT0lOIG9yIEpPSU5FQ0hPIG1lc3NhZ2Vcblx0ICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Vcblx0ICogQHBhcmFtIHZpZXcgQ3VycmVudCBWaWV3XG5cdCAqL1xuXHR1c2VySm9pbkRyYWZ0KGFjdGl2ZVVzZXJzOiBVc2VyW10sIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgc2VuZGVyOiBVc2VyLCBtZXNzYWdlOiBNZXNzYWdlLCB2aWV3OiBGRVZpZXcpOiB2b2lkIHtcblx0XHRpZiAoYWN0aXZlVXNlcnMuZmluZEluZGV4KCh1c2VyKSA9PiB1c2VyLmlkID09PSBzZW5kZXIuaWQpID09PSAtMSkge1xuXHRcdFx0YWN0aXZlVXNlcnMudW5zaGlmdChzZW5kZXIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVkVVU0VSUywgYWN0aXZlVXNlcnMpO1xuXHRcdH1cblxuXHRcdGlmIChtZXNzYWdlLnVzZXJBY3Rpb24gPT09IEFjdGl2aXR5LkpvaW4pIHtcblx0XHRcdC8vIHdlIGVjaG8gb3VyIGV4aXN0ZW5jZSB0byB0aGUgbmV3bHkgZW50ZXJlZCB1c2VyIGFuZCBhbHNvIHNlbmQgdGhlIGN1cnJlbnQgYWN0aXZpdHkgaWYgdGhlcmUgaXMgYW55XG5cdFx0XHRicm9hZGNhc3RDb2xsYWJvcmF0aW9uTWVzc2FnZShBY3Rpdml0eS5Kb2luRWNobywgdGhpcy5nZXRMb2NrZWRQcm9wZXJ0aWVzKGludGVybmFsTW9kZWwpLCBpbnRlcm5hbE1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAobWVzc2FnZS51c2VyQWN0aW9uID09PSBBY3Rpdml0eS5Kb2luRWNobykge1xuXHRcdFx0aWYgKG1lc3NhZ2UuY2xpZW50Q29udGVudCkge1xuXHRcdFx0XHQvLyBhbm90aGVyIHVzZXIgd2FzIGFscmVhZHkgdHlwaW5nIHRoZXJlZm9yZSBJIHdhbnQgdG8gc2VlIGhpcyBhY3Rpdml0eSBpbW1lZGlhdGVseS4gQ2FsbGluZyBtZSBhZ2FpbiBhcyBhIGxpdmUgY2hhbmdlXG5cdFx0XHRcdG1lc3NhZ2UudXNlckFjdGlvbiA9IEFjdGl2aXR5LkxvY2s7XG5cdFx0XHRcdHRoaXMubWVzc2FnZVJlY2VpdmUobWVzc2FnZSwgdmlldyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIHVwZGF0ZSBpbnRlcm5hbCBtb2RlbCB3aGVuIGEgdXNlciBsZWF2ZXMgdGhlIGRyYWZ0LlxuXHQgKiBAcGFyYW0gYWN0aXZlVXNlcnMgTGlzdCBvZiBjb25uZWN0ZWQgdXNlcnNcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgSW50ZXJuYWwgbW9kZWxcblx0ICogQHBhcmFtIHNlbmRlciBVc2VyIHNlbmRpbmcgdGhlIEpPSU4gb3IgSk9JTkVDSE8gbWVzc2FnZVxuXHQgKi9cblx0dXNlckxlYXZlRHJhZnQoYWN0aXZlVXNlcnM6IFVzZXJbXSwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBzZW5kZXI6IFVzZXIpOiB2b2lkIHtcblx0XHQvLyBSZW1vdmluZyB0aGUgYWN0aXZlIHVzZXIuIE5vdCByZW1vdmluZyBcIm1lXCIgaWYgSSBoYWQgdGhlIHNjcmVlbiBvcGVuIGluIGFub3RoZXIgc2Vzc2lvblxuXHRcdGFjdGl2ZVVzZXJzID0gYWN0aXZlVXNlcnMuZmlsdGVyKCh1c2VyKSA9PiB1c2VyLmlkICE9PSBzZW5kZXIuaWQgfHwgdXNlci5tZSk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVkVVU0VSUywgYWN0aXZlVXNlcnMpO1xuXHRcdGNvbnN0IGFsbEFjdGl2aXRpZXMgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMpIHx8IHt9O1xuXHRcdGNvbnN0IHJlbW92ZVVzZXJBY3Rpdml0aWVzID0gZnVuY3Rpb24gKGJhZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBVc2VyQWN0aXZpdHlbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVXNlckFjdGl2aXR5W10ge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoYmFnKSkge1xuXHRcdFx0XHRyZXR1cm4gYmFnLmZpbHRlcigoYWN0aXZpdHkpID0+IGFjdGl2aXR5LmlkICE9PSBzZW5kZXIuaWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChjb25zdCBwIGluIGJhZykge1xuXHRcdFx0XHRcdGJhZ1twXSA9IHJlbW92ZVVzZXJBY3Rpdml0aWVzKGJhZ1twXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFVzZXJBY3Rpdml0eVtdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYmFnO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0cmVtb3ZlVXNlckFjdGl2aXRpZXMoYWxsQWN0aXZpdGllcyk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVklUSUVTLCBhbGxBY3Rpdml0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXQuXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHJlY2VpdmVkXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqL1xuXHRtZXNzYWdlUmVjZWl2ZShtZXNzYWdlOiBNZXNzYWdlLCB2aWV3OiBGRVZpZXcpOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdGNvbnN0IGFjdGl2ZVVzZXJzOiBVc2VyW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWRVVTRVJTKTtcblx0XHRsZXQgYWN0aXZpdGllczogVXNlckFjdGl2aXR5W107XG5cdFx0bGV0IGFjdGl2aXR5S2V5OiBzdHJpbmc7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSB0aGlzLmNhbGN1bGF0ZU1ldGFQYXRoKHZpZXcsIG1lc3NhZ2UuY2xpZW50Q29udGVudCk7XG5cdFx0bWVzc2FnZS51c2VyQWN0aW9uID0gbWVzc2FnZS51c2VyQWN0aW9uIHx8IG1lc3NhZ2UuY2xpZW50QWN0aW9uO1xuXG5cdFx0Y29uc3Qgc2VuZGVyOiBVc2VyID0ge1xuXHRcdFx0aWQ6IG1lc3NhZ2UudXNlcklELFxuXHRcdFx0bmFtZTogbWVzc2FnZS51c2VyRGVzY3JpcHRpb24sXG5cdFx0XHRpbml0aWFsczogQ29sbGFib3JhdGlvblV0aWxzLmZvcm1hdEluaXRpYWxzKG1lc3NhZ2UudXNlckRlc2NyaXB0aW9uKSxcblx0XHRcdGNvbG9yOiBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0VXNlckNvbG9yKG1lc3NhZ2UudXNlcklELCBhY3RpdmVVc2VycywgW10pXG5cdFx0fTtcblxuXHRcdGxldCBtYWN0aXZpdHk6IFVzZXJBY3Rpdml0eSA9IHNlbmRlcjtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2Vcblx0XHRzd2l0Y2ggKG1lc3NhZ2UudXNlckFjdGlvbikge1xuXHRcdFx0Y2FzZSBBY3Rpdml0eS5Kb2luOlxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5Kb2luRWNobzpcblx0XHRcdFx0dGhpcy51c2VySm9pbkRyYWZ0KGFjdGl2ZVVzZXJzLCBpbnRlcm5hbE1vZGVsLCBzZW5kZXIsIG1lc3NhZ2UsIHZpZXcpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5MZWF2ZTpcblx0XHRcdFx0dGhpcy51c2VyTGVhdmVEcmFmdChhY3RpdmVVc2VycywgaW50ZXJuYWxNb2RlbCwgc2VuZGVyKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWN0aXZpdHkuQ2hhbmdlOlxuXHRcdFx0XHR0aGlzLnVwZGF0ZU9uQ2hhbmdlKHZpZXcsIG1lc3NhZ2UpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5DcmVhdGU6XG5cdFx0XHRcdC8vIEZvciBjcmVhdGUgd2UgYWN0dWFsbHkganVzdCBuZWVkIHRvIHJlZnJlc2ggdGhlIHRhYmxlXG5cdFx0XHRcdHRoaXMudXBkYXRlT25DcmVhdGUodmlldywgbWVzc2FnZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFjdGl2aXR5LkRlbGV0ZTpcblx0XHRcdFx0Ly8gRm9yIG5vdyBhbHNvIHJlZnJlc2ggdGhlIHBhZ2UgYnV0IGluIGNhc2Ugb2YgZGVsZXRpb24gd2UgbmVlZCB0byBpbmZvcm0gdGhlIHVzZXJcblx0XHRcdFx0dGhpcy51cGRhdGVPbkRlbGV0ZSh2aWV3LCBtZXNzYWdlKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWN0aXZpdHkuQWN0aXZhdGU6XG5cdFx0XHRcdHRoaXMuZHJhZnRDbG9zZWRCeU90aGVyVXNlcihcblx0XHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRcdG1lc3NhZ2UuY2xpZW50Q29udGVudCxcblx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0VGV4dChcIkNfQ09MTEFCT1JBVElPTkRSQUZUX0FDVElWQVRFXCIsIHNlbmRlci5uYW1lKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5EaXNjYXJkOlxuXHRcdFx0XHR0aGlzLmRyYWZ0Q2xvc2VkQnlPdGhlclVzZXIoXG5cdFx0XHRcdFx0dmlldyxcblx0XHRcdFx0XHRtZXNzYWdlLmNsaWVudENvbnRlbnQsXG5cdFx0XHRcdFx0Q29sbGFib3JhdGlvblV0aWxzLmdldFRleHQoXCJDX0NPTExBQk9SQVRJT05EUkFGVF9ESVNDQVJEXCIsIHNlbmRlci5uYW1lKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5BY3Rpb246XG5cdFx0XHRcdHRoaXMudXBkYXRlT25BY3Rpb24odmlldywgbWVzc2FnZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFjdGl2aXR5LkxvY2s6XG5cdFx0XHRcdG1hY3Rpdml0eSA9IHNlbmRlcjtcblx0XHRcdFx0bWFjdGl2aXR5LmtleSA9IGdldEFjdGl2aXR5S2V5RnJvbVBhdGgobWVzc2FnZS5jbGllbnRDb250ZW50KTtcblxuXHRcdFx0XHQvLyBzdHVwaWQgSlNPTiBtb2RlbC4uLlxuXHRcdFx0XHRsZXQgaW5pdEpTT05Nb2RlbCA9IFwiXCI7XG5cdFx0XHRcdGNvbnN0IHBhcnRzID0gbWV0YVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRcdGluaXRKU09OTW9kZWwgKz0gYC8ke3BhcnRzW2ldfWA7XG5cdFx0XHRcdFx0aWYgKCFpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMgKyBpbml0SlNPTk1vZGVsKSkge1xuXHRcdFx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgaW5pdEpTT05Nb2RlbCwge30pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjdGl2aXRpZXMgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMgKyBtZXRhUGF0aCk7XG5cdFx0XHRcdGFjdGl2aXRpZXMgPSBhY3Rpdml0aWVzPy5zbGljZSA/IGFjdGl2aXRpZXMuc2xpY2UoKSA6IFtdO1xuXHRcdFx0XHRhY3Rpdml0aWVzLnB1c2gobWFjdGl2aXR5KTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgbWV0YVBhdGgsIGFjdGl2aXRpZXMpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5VbmxvY2s6XG5cdFx0XHRcdC8vIFRoZSB1c2VyIGRpZCBhIGNoYW5nZSBidXQgcmV2ZXJ0ZWQgaXQsIHRoZXJlZm9yZSB1bmJsb2NrIHRoZSBjb250cm9sXG5cdFx0XHRcdGFjdGl2aXRpZXMgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMgKyBtZXRhUGF0aCk7XG5cdFx0XHRcdGFjdGl2aXR5S2V5ID0gZ2V0QWN0aXZpdHlLZXlGcm9tUGF0aChtZXNzYWdlLmNsaWVudENvbnRlbnQpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFDVElWSVRJRVMgKyBtZXRhUGF0aCwgYWN0aXZpdGllcz8uZmlsdGVyKChhKSA9PiBhLmtleSAhPT0gYWN0aXZpdHlLZXkpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGEgbWVzc2FnZSB0aGF0IHRoZSBjdXJyZW50IGRyYWZ0IHdhcyBjbG9zZWQgYmUgYW5vdGhlciB1c2VyLCBhbmQgbmF2aWdhdGVzIGJhY2sgdG8gYSBwcm9wZXIgdmlldy5cblx0ICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcblx0ICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgdGhlIGNvbnRleHQgdG8gbmF2aWdhdGUgdG9cblx0ICogQHBhcmFtIG1lc3NhZ2VUZXh0IFRoZSBtZXNzYWdlIHRvIGRpc3BsYXlcblx0ICovXG5cdGRyYWZ0Q2xvc2VkQnlPdGhlclVzZXIodmlldzogRkVWaWV3LCBwYXRoOiBzdHJpbmcsIG1lc3NhZ2VUZXh0OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmRpc2Nvbm5lY3Qodmlldyk7XG5cdFx0TWVzc2FnZUJveC5pbmZvcm1hdGlvbihtZXNzYWdlVGV4dCwge1xuXHRcdFx0b25DbG9zZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZShwYXRoLCB2aWV3KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiUGVuZGluZyBDaGFuZ2VzIGNvdWxkIG5vdCBiZSByZXNldCAtIHN0aWxsIG5hdmlnYXRpbmcgdG8gYWN0aXZlIGluc3RhbmNlXCIpO1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGUocGF0aCwgdmlldyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIGRhdGEgd2hlbiBhIENIQU5HRSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLlxuXHQgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuXHQgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXRcblx0ICovXG5cdHVwZGF0ZU9uQ2hhbmdlKHZpZXc6IEZFVmlldywgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWQge1xuXHRcdGNvbnN0IHVwZGF0ZWRPYmplY3RzUGF0aHMgPSBtZXNzYWdlLmNsaWVudENvbnRlbnQuc3BsaXQoXCJ8XCIpO1xuXG5cdFx0Y29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLmdldEN1cnJlbnRQYWdlKHZpZXcpO1xuXHRcdGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY3VycmVudFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCByZXF1ZXN0UHJvbWlzZXMgPSB1cGRhdGVkT2JqZWN0c1BhdGhzLm1hcChhc3luYyAocGF0aCkgPT4gdGhpcy5hcHBseVVwZGF0ZXNGb3JDaGFuZ2UodmlldywgcGF0aCkpO1xuXG5cdFx0Ly8gU2ltdWxhdGUgYW55IGNoYW5nZSBzbyB0aGUgZWRpdCBmbG93IHNob3dzIHRoZSBkcmFmdCBpbmRpY2F0b3IgYW5kIHNldHMgdGhlIHBhZ2UgdG8gZGlydHlcblx0XHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuZWRpdEZsb3cudXBkYXRlRG9jdW1lbnQoY3VycmVudENvbnRleHQsIFByb21pc2UuYWxsKHJlcXVlc3RQcm9taXNlcykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgZGF0YSBjb3JyZXNwb25kaW5nIHRvIGEgcGF0aC5cblx0ICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aEZvclVwZGF0ZSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSB1cGRhdGVkIHByb3BlcnR5XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBkYXRhIGFuZCBpdHMgcmVsYXRlZCBzaWRlIGVmZmVjdHMgaGF2ZSBiZWVuIHJlY2VpdmVkXG5cdCAqL1xuXHRhc3luYyBhcHBseVVwZGF0ZXNGb3JDaGFuZ2UodmlldzogRkVWaWV3LCBwcm9wZXJ0eVBhdGhGb3JVcGRhdGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwcm9wZXJ0eVBhdGhGb3JVcGRhdGUpO1xuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UHJvcGVydHk+KG1ldGFDb250ZXh0KTtcblx0XHRjb25zdCB0YXJnZXRDb250ZXh0UGF0aCA9IHByb3BlcnR5UGF0aEZvclVwZGF0ZS5zdWJzdHJpbmcoMCwgcHJvcGVydHlQYXRoRm9yVXBkYXRlLmxhc3RJbmRleE9mKFwiL1wiKSk7IC8vIFJlbW92ZSBwcm9wZXJ0eSBuYW1lXG5cdFx0Y29uc3QgdGFyZ2V0Q29udGV4dCA9IHRoaXMuZmluZENvbnRleHRGb3JVcGRhdGUodmlldywgdGFyZ2V0Q29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudENvbGxlY3Rpb25QYXRoID0gdGFyZ2V0Q29udGV4dFBhdGguc3Vic3RyaW5nKDAsIHRhcmdldENvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dFBhdGggPSBwYXJlbnRDb2xsZWN0aW9uUGF0aC5zdWJzdHJpbmcoMCwgcGFyZW50Q29sbGVjdGlvblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dFBhdGggPyB0aGlzLmZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXcsIHBhcmVudENvbnRleHRQYXRoKSA6IHVuZGVmaW5lZDtcblxuXHRcdGlmICghdGFyZ2V0Q29udGV4dCAmJiAhcGFyZW50Q29udGV4dCkge1xuXHRcdFx0cmV0dXJuOyAvLyBObyBjb250ZXh0IGZvciB1cGRhdGVcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNQcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHZpZXcpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXG5cdFx0XHRpZiAodGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0XHQvLyBXZSBoYXZlIGEgdGFyZ2V0IGNvbnRleHQsIHNvIHdlIGNhbiByZXRyaWV2ZSB0aGUgdXBkYXRlZCBwcm9wZXJ0eVxuXHRcdFx0XHRjb25zdCB0YXJnZXRNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IHJlbGF0aXZlTWV0YVBhdGhGb3JVcGRhdGUgPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgocHJvcGVydHlQYXRoRm9yVXBkYXRlKS5yZXBsYWNlKHRhcmdldE1ldGFQYXRoLCBcIlwiKS5zbGljZSgxKTtcblx0XHRcdFx0c2lkZUVmZmVjdHNQcm9taXNlcy5wdXNoKHNpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3JlbGF0aXZlTWV0YVBhdGhGb3JVcGRhdGVdLCB0YXJnZXRDb250ZXh0LCBTWU5DR1JPVVBJRCkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBHZXQgdGhlIGZpZWxkR3JvdXBJZHMgY29ycmVzcG9uZGluZyB0byBwYXRoRm9yVXBkYXRlXG5cdFx0XHRjb25zdCBmaWVsZEdyb3VwSWRzID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmNvbXB1dGVGaWVsZEdyb3VwSWRzKFxuXHRcdFx0XHRkYXRhTW9kZWxPYmplY3QudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdGRhdGFNb2RlbE9iamVjdC50YXJnZXRPYmplY3QhLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSB0aGUgc2lkZSBlZmZlY3RzIGZvciB0aGUgZmllbGRHcm91cElkc1xuXHRcdFx0aWYgKGZpZWxkR3JvdXBJZHMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IHBhZ2VDb250cm9sbGVyID0gdmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzTWFwRm9yRmllbGRHcm91cCA9IHBhZ2VDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5nZXRTaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBzKFxuXHRcdFx0XHRcdGZpZWxkR3JvdXBJZHMsXG5cdFx0XHRcdFx0dGFyZ2V0Q29udGV4dCB8fCBwYXJlbnRDb250ZXh0XG5cdFx0XHRcdCkgYXMgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblx0XHRcdFx0T2JqZWN0LmtleXMoc2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3VwKS5mb3JFYWNoKChzaWRlRWZmZWN0TmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3QgPSBzaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBbc2lkZUVmZmVjdE5hbWVdO1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdHBhZ2VDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5yZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3Quc2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3QuY29udGV4dCxcblx0XHRcdFx0XHRcdFx0U1lOQ0dST1VQSUQsXG5cdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChzaWRlRWZmZWN0c1Byb21pc2VzKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdExvZy5lcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgZGF0YSBhZnRlciBjaGFuZ2U6XCIgKyBlcnIpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIGRhdGEgd2hlbiBhIERFTEVURSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLlxuXHQgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuXHQgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXRcblx0ICovXG5cdHVwZGF0ZU9uRGVsZXRlKHZpZXc6IFZpZXcsIG1lc3NhZ2U6IE1lc3NhZ2UpOiB2b2lkIHtcblx0XHRjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuZ2V0Q3VycmVudFBhZ2Uodmlldyk7XG5cdFx0Y29uc3QgY3VycmVudENvbnRleHQgPSBjdXJyZW50UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Y29uc3QgZGVsZXRlZE9iamVjdFBhdGhzID0gbWVzc2FnZS5jbGllbnRDb250ZW50LnNwbGl0KFwifFwiKTtcblxuXHRcdC8vIGNoZWNrIGlmIHVzZXIgY3VycmVudGx5IGRpc3BsYXlzIGEgZGVsZXRlZCBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50c1xuXHRcdGNvbnN0IGRlbGV0ZWRQYXRoSW5Vc2UgPSBkZWxldGVkT2JqZWN0UGF0aHMuZmluZCgoZGVsZXRlZFBhdGgpID0+IGN1cnJlbnRQYXRoLnN0YXJ0c1dpdGgoZGVsZXRlZFBhdGgpKTtcblx0XHRpZiAoZGVsZXRlZFBhdGhJblVzZSkge1xuXHRcdFx0Ly8gYW55IG90aGVyIHVzZXIgZGVsZXRlZCB0aGUgb2JqZWN0IEknbSBjdXJyZW50bHkgbG9va2luZyBhdC4gSW5mb3JtIHRoZSB1c2VyIHdlIHdpbGwgbmF2aWdhdGUgdG8gcm9vdCBub3dcblx0XHRcdE1lc3NhZ2VCb3guaW5mb3JtYXRpb24oQ29sbGFib3JhdGlvblV0aWxzLmdldFRleHQoXCJDX0NPTExBQk9SQVRJT05EUkFGVF9ERUxFVEVcIiwgbWVzc2FnZS51c2VyRGVzY3JpcHRpb24pLCB7XG5cdFx0XHRcdG9uQ2xvc2U6ICgpID0+IHtcblx0XHRcdFx0XHQvLyBXZSByZXRyaWV2ZSB0aGUgZGVsZXRlZCBjb250ZXh0IGFzIGEga2VlcC1hbGl2ZSwgYW5kIGRpc2FibGUgaXRzIGtlZXBhbGl2ZSBzdGF0dXMsXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBpdCBpcyBwcm9wZXJseSBkZXN0cm95ZWQgd2hlbiByZWZyZXNoaW5nIGRhdGFcblx0XHRcdFx0XHRjb25zdCB0YXJnZXRDb250ZXh0ID0gY3VycmVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KGRlbGV0ZWRQYXRoSW5Vc2UpO1xuXHRcdFx0XHRcdHRhcmdldENvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHRcdFx0XHRjb25zdCByZXF1ZXN0UHJvbWlzZSA9IHRoaXMuYXBwbHlVcGRhdGVzRm9yQ29sbGVjdGlvbih2aWV3LCBkZWxldGVkT2JqZWN0UGF0aHNbMF0pO1xuXHRcdFx0XHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5lZGl0Rmxvdy51cGRhdGVEb2N1bWVudChjdXJyZW50UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpLCByZXF1ZXN0UHJvbWlzZSk7XG5cdFx0XHRcdFx0Y3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHRhcmdldENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcmVxdWVzdFByb21pc2UgPSB0aGlzLmFwcGx5VXBkYXRlc0ZvckNvbGxlY3Rpb24odmlldywgZGVsZXRlZE9iamVjdFBhdGhzWzBdKTtcblx0XHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5lZGl0Rmxvdy51cGRhdGVEb2N1bWVudChjdXJyZW50UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpLCByZXF1ZXN0UHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgZGF0YSB3aGVuIGEgQ1JFQVRFIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIHdlYnNvY2tldFxuXHQgKi9cblx0dXBkYXRlT25DcmVhdGUodmlldzogVmlldywgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWQge1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5nZXRDdXJyZW50UGFnZSh2aWV3KTtcblx0XHRjb25zdCBjcmVhdGVkT2JqZWN0UGF0aHMgPSBtZXNzYWdlLmNsaWVudENvbnRlbnQuc3BsaXQoXCJ8XCIpO1xuXG5cdFx0Y29uc3QgcmVxdWVzdFByb21pc2UgPSB0aGlzLmFwcGx5VXBkYXRlc0ZvckNvbGxlY3Rpb24odmlldywgY3JlYXRlZE9iamVjdFBhdGhzWzBdKTtcblx0XHQvLyBTaW11bGF0ZSBhIGNoYW5nZSBzbyB0aGUgZWRpdCBmbG93IHNob3dzIHRoZSBkcmFmdCBpbmRpY2F0b3IgYW5kIHNldHMgdGhlIHBhZ2UgdG8gZGlydHlcblx0XHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuZWRpdEZsb3cudXBkYXRlRG9jdW1lbnQoY3VycmVudFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSwgcmVxdWVzdFByb21pc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgZGF0YSBpbiBhIGNvbGxlY3Rpb24uXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqIEBwYXJhbSBwYXRoSW5Db2xsZWN0aW9uIEEgcGF0aCB0byBhbiBlbnRpdHkgaW4gdGhlIGNvbGxlY3Rpb25cblx0ICovXG5cdGFzeW5jIGFwcGx5VXBkYXRlc0ZvckNvbGxlY3Rpb24odmlldzogVmlldywgcGF0aEluQ29sbGVjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29sbGFib3JhdGlvblV0aWxzLmdldEFwcENvbXBvbmVudCh2aWV3KTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gcGF0aEluQ29sbGVjdGlvbi5zdWJzdHJpbmcoMCwgcGF0aEluQ29sbGVjdGlvbi5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSB0aGlzLmZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXcsIHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKHBhcmVudENvbnRleHQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzUHJvbWlzZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuXG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHBhcmVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgbWV0YVBhdGhGb3JVcGRhdGUgPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgocGF0aEluQ29sbGVjdGlvbik7XG5cdFx0XHRcdGNvbnN0IHBhcmVudE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gbWV0YVBhdGhGb3JVcGRhdGUucmVwbGFjZShgJHtwYXJlbnRNZXRhUGF0aH0vYCwgXCJcIik7XG5cblx0XHRcdFx0Ly8gUmVsb2FkIHRoZSBjb2xsZWN0aW9uXG5cdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdFx0c2lkZUVmZmVjdHNQcm9taXNlcy5wdXNoKHNpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3JlbGF0aXZlUGF0aF0sIHBhcmVudENvbnRleHQsIFNZTkNHUk9VUElEKSk7XG5cblx0XHRcdFx0Ly8gUmVxdWVzdCB0aGUgc2lkZSBlZmZlY3RzIGZvciB0aGUgY29sbGVjdGlvblxuXHRcdFx0XHRzaWRlRWZmZWN0c1Byb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShyZWxhdGl2ZVBhdGgsIHBhcmVudENvbnRleHQsIFNZTkNHUk9VUElELCB0cnVlKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHNpZGVFZmZlY3RzUHJvbWlzZXMpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgZGF0YSBhZnRlciBjb2xsZWN0aW9uIHVwZGF0ZTpcIiArIGVycik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgZGF0YSB3aGVuIGEgQUNUSU9OIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIHdlYnNvY2tldFxuXHQgKi9cblx0dXBkYXRlT25BY3Rpb24odmlldzogRkVWaWV3LCBtZXNzYWdlOiBNZXNzYWdlKTogdm9pZCB7XG5cdFx0Y29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLmdldEN1cnJlbnRQYWdlKHZpZXcpO1xuXHRcdGNvbnN0IHBhdGhzRm9yQWN0aW9uID0gbWVzc2FnZS5jbGllbnRDb250ZW50LnNwbGl0KFwifFwiKTtcblx0XHRjb25zdCBhY3Rpb25OYW1lID0gbWVzc2FnZS5jbGllbnRUcmlnZ2VyZWRBY3Rpb25OYW1lIHx8IFwiXCI7XG5cdFx0Y29uc3QgcmVxdWVzdGVkUHJvcGVydGllcyA9IG1lc3NhZ2UuY2xpZW50UmVxdWVzdGVkUHJvcGVydGllcz8uc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IHJlZnJlc2hMaXN0QmluZGluZyA9IG1lc3NhZ2UuY2xpZW50UmVmcmVzaExpc3RCaW5kaW5nID09PSBcInRydWVcIjtcblxuXHRcdGxldCByZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG5cdFx0aWYgKHJlZnJlc2hMaXN0QmluZGluZykge1xuXHRcdFx0cmVxdWVzdFByb21pc2VzLnB1c2godGhpcy5hcHBseVVwZGF0ZXNGb3JDb2xsZWN0aW9uKHZpZXcsIHBhdGhzRm9yQWN0aW9uWzBdKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlcXVlc3RQcm9taXNlcyA9IHBhdGhzRm9yQWN0aW9uLm1hcChhc3luYyAocGF0aCkgPT4gdGhpcy5yZXF1ZXN0VXBkYXRlRm9yQWN0aW9uKHZpZXcsIHBhdGgsIGFjdGlvbk5hbWUsIHJlcXVlc3RlZFByb3BlcnRpZXMpKTtcblx0XHR9XG5cblx0XHQvLyBTaW11bGF0ZSBhbnkgY2hhbmdlIHNvIHRoZSBlZGl0IGZsb3cgc2hvd3MgdGhlIGRyYWZ0IGluZGljYXRvciBhbmQgc2V0cyB0aGUgcGFnZSB0byBkaXJ0eVxuXHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5lZGl0Rmxvdy51cGRhdGVEb2N1bWVudChjdXJyZW50UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpLCBQcm9taXNlLmFsbChyZXF1ZXN0UHJvbWlzZXMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHNpZGUtZWZmZWN0cyBkYXRhIHdoZW4gYW4gYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBvbiBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqIEBwYXJhbSBwYXRoRm9yQWN0aW9uIFBhdGggb2YgdGhlIGNvbnRleHQgdG8gYXBwbHkgdGhlIGFjdGlvbiB0b1xuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHJlcXVlc3RlZFByb3BlcnRpZXNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBzaWRlLWVmZmVjdHMgZGF0YSBoYXMgYmVlbiBsb2FkZWRcblx0ICovXG5cdGFzeW5jIHJlcXVlc3RVcGRhdGVGb3JBY3Rpb24odmlldzogRkVWaWV3LCBwYXRoRm9yQWN0aW9uOiBzdHJpbmcsIGFjdGlvbk5hbWU6IHN0cmluZywgcmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udGV4dCA9IHRoaXMuZmluZENvbnRleHRGb3JVcGRhdGUodmlldywgcGF0aEZvckFjdGlvbik7XG5cdFx0aWYgKCF0YXJnZXRDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29sbGFib3JhdGlvblV0aWxzLmdldEFwcENvbXBvbmVudCh2aWV3KTtcblx0XHRjb25zdCBzaWRlRWZmZWN0U2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzaWRlRWZmZWN0c0Zyb21BY3Rpb24gPSBzaWRlRWZmZWN0U2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWUsIHRhcmdldENvbnRleHQpO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RQcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG5cdFx0aWYgKHNpZGVFZmZlY3RzRnJvbUFjdGlvbikge1xuXHRcdFx0aWYgKHNpZGVFZmZlY3RzRnJvbUFjdGlvbi5wYXRoRXhwcmVzc2lvbnM/Lmxlbmd0aCkge1xuXHRcdFx0XHRzaWRlRWZmZWN0UHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNGcm9tQWN0aW9uLnBhdGhFeHByZXNzaW9ucywgdGFyZ2V0Q29udGV4dCwgU1lOQ0dST1VQSUQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChyZXF1ZXN0ZWRQcm9wZXJ0aWVzICYmIHJlcXVlc3RlZFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9jbGVhbi11cCBvZiB0aGUgcHJvcGVydGllcyB0byByZXF1ZXN0IGxpc3Q6XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB2aWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhUGF0aEZvckFjdGlvbiA9IHRoaXMuY2FsY3VsYXRlTWV0YVBhdGgodmlldywgcGF0aEZvckFjdGlvbik7XG5cdFx0XHRjb25zdCBkYXRhTW9kZWxQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0Q29udGV4dChtZXRhUGF0aEZvckFjdGlvbikpO1xuXHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzXG5cdFx0XHRcdC5tYXAoKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmlsdGVyKChwcm9wKSA9PiByZXF1ZXN0ZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3ApKTtcblx0XHRcdGlmIChwcm9wZXJ0aWVzVG9SZXF1ZXN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0c2lkZUVmZmVjdFByb21pc2VzLnB1c2goc2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKHByb3BlcnRpZXNUb1JlcXVlc3QsIHRhcmdldENvbnRleHQsIFNZTkNHUk9VUElEKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoc2lkZUVmZmVjdFByb21pc2VzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kcyBhIGNvbnRleHQgdG8gYXBwbHkgYW4gdXBkYXRlIG1lc3NhZ2UgKENIQU5HRSwgQ1JFQVRFLCBERUxFVEUgb3IgQUNUSU9OKS5cblx0ICogQHBhcmFtIHZpZXcgIFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIGJlIGZvdW5kIChzaGFsbCBwb2ludCB0byBhbiBlbnRpdHksIG5vdCBhIHByb3BlcnR5KVxuXHQgKiBAcmV0dXJucyBBIGNvbnRleHQgaWYgaXQgY291bGQgYmUgZm91bmRcblx0ICovXG5cdGZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXc6IFZpZXcsIHBhdGg6IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGlmICghcGF0aCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Ly8gRmluZCBhbGwgcG90ZW50aWFsIHBhdGhzXG5cdFx0Y29uc3QgdGFyZ2V0UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKCFwYXRoLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0dGFyZ2V0UGF0aHMudW5zaGlmdChwYXRoKTtcblx0XHRcdHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHRhcmdldFBhdGhzLnVuc2hpZnQocGF0aCk7XG5cblx0XHRjb25zdCBwYXJlbnRDb2xsZWN0aW9uUGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIoXCIpKTsgLy8gUmVtb3ZlIHRoZSBsYXN0IGtleVxuXG5cdFx0bGV0IHRhcmdldENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGN1cnJlbnRDb250ZXh0ID0gdGhpcy5nZXRDdXJyZW50UGFnZSh2aWV3KS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0d2hpbGUgKGN1cnJlbnRDb250ZXh0ICYmICF0YXJnZXRDb250ZXh0KSB7XG5cdFx0XHRpZiAodGFyZ2V0UGF0aHMuaW5jbHVkZXMoY3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0ID0gY3VycmVudENvbnRleHQ7XG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQuZ2V0QmluZGluZygpPy5nZXRDb250ZXh0KCkgYXMgQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAodGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0Ly8gRm91bmQgIVxuXHRcdFx0cmV0dXJuIHRhcmdldENvbnRleHQ7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHRvIGZpbmQgdGhlIHRhcmdldCBjb250ZXh0IGluIGEgbGlzdEJpbmRpbmdcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0Q3VycmVudFBhZ2UodmlldykuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudExpc3RCaW5kaW5nID0gbW9kZWwuZ2V0QWxsQmluZGluZ3MoKS5maW5kKChiaW5kaW5nKSA9PiB7XG5cdFx0XHRjb25zdCBiaW5kaW5nUGF0aCA9IGJpbmRpbmcuaXNSZWxhdGl2ZSgpID8gYmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSA6IGJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0cmV0dXJuIGJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiYgYmluZGluZ1BhdGggPT09IHBhcmVudENvbGxlY3Rpb25QYXRoO1xuXHRcdH0pIGFzIE9EYXRhTGlzdEJpbmRpbmcgfCB1bmRlZmluZWQ7XG5cdFx0Ly8gV2UndmUgZm91bmQgYSBsaXN0IGJpbmRpbmcgdGhhdCBjb3VsZCBjb250YWluIHRoZSB0YXJnZXQgY29udGV4dCAtLT4gbG9vayBmb3IgaXRcblx0XHR0YXJnZXRDb250ZXh0ID0gcGFyZW50TGlzdEJpbmRpbmc/LmdldEFsbEN1cnJlbnRDb250ZXh0cygpLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdHJldHVybiB0YXJnZXRQYXRocy5pbmNsdWRlcyhjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0Q29udGV4dDtcblx0fVxuXG5cdG5hdmlnYXRlKHBhdGg6IHN0cmluZywgdmlldzogRkVWaWV3KTogdm9pZCB7XG5cdFx0Ly8gVE9ETzogcm91dGluZy5uYXZpZ2F0ZSBkb2Vzbid0IGNvbnNpZGVyIHNlbWFudGljIGJvb2ttYXJraW5nXG5cdFx0Y29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLmdldEN1cnJlbnRQYWdlKHZpZXcpO1xuXHRcdGNvbnN0IHRhcmdldENvbnRleHQgPSB2aWV3LmdldE1vZGVsKCkuYmluZENvbnRleHQocGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cblx0XHRpZiAoY3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLmVkaXRGbG93LmdldENyZWF0aW9uTW9kZSgpKSB7XG5cdFx0XHQvLyBJZiB0aGUgb2JqZWN0IHdhcyBhIG5ld2x5IGNyZWF0ZWQgb25lLCB3ZSBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQodGFyZ2V0Q29udGV4dCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgY29udGV4dCwgYnV0IHdlIGZvcmNlIGl0cyByZWNyZWF0aW9uIHNvIHRoYXQgYWxsICRzZWxlY3RzIGFyZSBwcm9wZXJseSBjb21wdXRlZCBieSBpbnRlcm5hbFJvdXRpbmdcblx0XHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dCh0YXJnZXRDb250ZXh0LCB7IHJlY3JlYXRlQ29udGV4dDogdHJ1ZSB9KTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXJyZW50UGFnZSh2aWV3OiBWaWV3KTogRkVWaWV3IHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHZpZXcpO1xuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRDdXJyZW50UGFnZVZpZXcoYXBwQ29tcG9uZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBtZXRhcGF0aCBmcm9tIG9uZSBvciBtb3JlIGRhdGEgcGF0aChzKS5cblx0ICogQHBhcmFtIHZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gcGF0aCBPbmUgb3JlIG1vcmUgZGF0YSBwYXRoKHMpLCBpbiBjYXNlIG9mIG11bHRpcGxlIHBhdGhzIHNlcGFyYXRlZCBieSAnfCdcblx0ICogQHJldHVybnMgVGhlIGNhbGN1bGF0ZWQgbWV0YVBhdGhcblx0ICovXG5cdGNhbGN1bGF0ZU1ldGFQYXRoKHZpZXc6IEZFVmlldywgcGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0bGV0IG1ldGFQYXRoID0gXCJcIjtcblx0XHRpZiAocGF0aCkge1xuXHRcdFx0Ly8gaW4gY2FzZSBtb3JlIHRoYW4gb25lIHBhdGggaXMgc2VudCBhbGwgb2YgdGhlbSBoYXZlIHRvIHVzZSB0aGUgc2FtZSBtZXRhcGF0aCB0aGVyZWZvcmUgd2UganVzdCBjb25zaWRlciB0aGUgZmlyc3Qgb25lXG5cdFx0XHRjb25zdCBkYXRhUGF0aCA9IHBhdGguc3BsaXQoXCJ8XCIpWzBdO1xuXHRcdFx0bWV0YVBhdGggPSB2aWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoZGF0YVBhdGgpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWV0YVBhdGg7XG5cdH1cblxuXHRpbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGFib3JhdGl2ZURyYWZ0U2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlRmFjdG9yeT4ge1xuXHRwdWJsaWMgYXN5bmMgY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlRmFjdG9yeT4pOiBQcm9taXNlPENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2U+IHtcblx0XHRjb25zdCBjb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlID0gbmV3IENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZS5pbml0UHJvbWlzZTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztFQXlCQSxNQUFNQSxZQUFZLEdBQUcsNkJBQTZCO0VBQ2xELE1BQU1DLFdBQVcsR0FBRyw0QkFBNEI7RUFDaEQsTUFBTUMsVUFBVSxHQUFHLDJCQUEyQjtFQUM5QyxNQUFNQyxrQkFBa0IsR0FBRyw4QkFBOEI7RUFDekQsTUFBTUMscUJBQXFCLEdBQUcsaUNBQWlDO0VBQy9ELE1BQU1DLG9CQUFvQixHQUFHLGdDQUFnQztFQUM3RCxNQUFNQyxXQUFXLEdBQUcsWUFBWTtFQUVoQyxNQUFNQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFBQSxJQU9iQyx5QkFBeUIsMEJBQUFDLFFBQUE7SUFBQSxTQUFBRCwwQkFBQTtNQUFBLE9BQUFDLFFBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0lBQUE7SUFBQUMsUUFBQSxDQUFBSix5QkFBQSxHQUFBQSx5QkFBQTtJQUFBSyxjQUFBLENBQUFMLHlCQUFBLEVBQUFDLFFBQUE7SUFBQSxJQUFBSyxNQUFBLEdBQUFOLHlCQUFBLENBQUFPLFNBQUE7SUFHckM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBTENELE1BQUEsQ0FNQUUsZ0JBQWdCLEdB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
786
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNWUFDVElWSVRJRVMiLCJBQ1RJVkVVU0VSUyIsIkFDVElWSVRJRVMiLCJBU1lOQ01FU1NBR0VTUVVFVUUiLCJSRVRBSU5FREFTWU5DTUVTU0FHRVMiLCJBU1lOQ01FU1NBR0VTVElNRVJJRCIsIlNZTkNHUk9VUElEIiwiREVMQVlPTkZPQ1VTIiwiQ29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiY2hlY2tQYXRoRm9yTG9jayIsImFjdGl2aXR5TW9kZWwiLCJhY3Rpdml0eVBhdGgiLCJteUFjdGl2aXRpZXMiLCJnZXRQcm9wZXJ0eSIsImluY2x1ZGVzIiwic2V0TG9jayIsInB1c2giLCJzZXRQcm9wZXJ0eSIsInJlbW92ZUxvY2siLCJhY3Rpdml0eVBhdGhzIiwidW5kZWZpbmVkIiwicGF0aHNUb1JlbW92ZSIsIkFycmF5IiwiaXNBcnJheSIsIm15TmV3QWN0aXZpdGllcyIsImZpbHRlciIsImFjdGl2aXR5IiwibGVuZ3RoIiwiZ2V0TG9ja2VkUHJvcGVydGllcyIsImpvaW4iLCJ1cGRhdGVMb2Nrc0ZvckNvbnRleHRQYXRoIiwiZWxlbWVudCIsIm9sZENvbnRleHRQYXRoIiwibmV3Q29udGV4dFBhdGgiLCJpc0Nvbm5lY3RlZCIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsImN1cnJlbnRRdWV1ZSIsImZvckVhY2giLCJxdWV1ZUl0ZW0iLCJwYXRoIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJjaGFuZ2VkQWN0aXZpdGllcyIsInVuY2hhbmdlZEFjdGl2aXRpZXMiLCJsb2NrZWRQYXRoIiwibmV3bG9ja2VkUGF0aCIsInNlbmQiLCJhY3Rpb24iLCJBY3Rpdml0eSIsIkxvY2siLCJjb250ZW50IiwicmVzZXRBc3luY01lc3NhZ2VzVGltZXIiLCJ0aW1lcklkIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsInF1ZXVlIiwibmV3UXVldWUiLCJwYXRoc1RvUmV0YWluIiwiaXRlbSIsImRvU2VuZCIsInJldGFpbkFzeW5jTWVzc2FnZXMiLCJhZGRpdGlvbmFsUGF0aHNUb1JldGFpbiIsInJldGFpbmVkUGF0aHMiLCJyZWxlYXNlQXN5bmNNZXNzYWdlcyIsInBhdGhzVG9SZWxlYXNlIiwicmV0YWluZWRQYXRoIiwiaXNDb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwibWVzc2FnZSIsIlVubG9jayIsImRvU2VuZEFzeW5jIiwidHJpZ2dlcmVkQWN0aW9uTmFtZSIsInJlZnJlc2hMaXN0QmluZGluZyIsImFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMiLCJjbGllbnRDb250ZW50IiwicmVxdWVzdGVkUHJvcGVydGllcyIsInBhdGhGb3JMb2NrIiwicmVtb3ZlZCIsImJyb2FkY2FzdENvbGxhYm9yYXRpb25NZXNzYWdlIiwicGF0aHNUb0FkZCIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJ2aWV3IiwiYmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRNZXRhTW9kZWwiLCJjb25uZWN0IiwiZHJhZnRSb290Q29udGV4dCIsIm1lIiwiQ29sbGFib3JhdGlvblV0aWxzIiwiZ2V0TWUiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsInNEcmFmdFVVSUQiLCJyZXF1ZXN0UHJvcGVydHkiLCJpbml0aWFsaXplZCIsImluaXRpYWxpemVDb2xsYWJvcmF0aW9uIiwibWVzc2FnZVJlY2VpdmUiLCJkaXNjb25uZWN0IiwiZW5kQ29sbGFib3JhdGlvbiIsInVzZXJKb2luRHJhZnQiLCJhY3RpdmVVc2VycyIsInNlbmRlciIsImZpbmRJbmRleCIsInVzZXIiLCJpZCIsInVuc2hpZnQiLCJ1c2VyQWN0aW9uIiwiSm9pbiIsIkpvaW5FY2hvIiwiTG9ja0VjaG8iLCJ1c2VyTGVhdmVEcmFmdCIsImFsbEFjdGl2aXRpZXMiLCJyZW1vdmVVc2VyQWN0aXZpdGllcyIsImJhZyIsInAiLCJhY3Rpdml0aWVzIiwiYWN0aXZpdHlLZXkiLCJtZXRhUGF0aCIsImNhbGN1bGF0ZU1ldGFQYXRoIiwiY2xpZW50QWN0aW9uIiwidXNlcklEIiwibmFtZSIsInVzZXJEZXNjcmlwdGlvbiIsImluaXRpYWxzIiwiZm9ybWF0SW5pdGlhbHMiLCJjb2xvciIsImdldFVzZXJDb2xvciIsIm1hY3Rpdml0eSIsIkxlYXZlIiwiQ2hhbmdlIiwidXBkYXRlT25DaGFuZ2UiLCJDcmVhdGUiLCJ1cGRhdGVPbkNyZWF0ZSIsIkRlbGV0ZSIsInVwZGF0ZU9uRGVsZXRlIiwiQWN0aXZhdGUiLCJkcmFmdENsb3NlZEJ5T3RoZXJVc2VyIiwiZ2V0VGV4dCIsIkRpc2NhcmQiLCJBY3Rpb24iLCJ1cGRhdGVPbkFjdGlvbiIsImtleSIsImdldEFjdGl2aXR5S2V5RnJvbVBhdGgiLCJpbml0SlNPTk1vZGVsIiwicGFydHMiLCJzcGxpdCIsImkiLCJzbGljZSIsImEiLCJtZXNzYWdlVGV4dCIsIk1lc3NhZ2VCb3giLCJpbmZvcm1hdGlvbiIsIm9uQ2xvc2UiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwibmF2aWdhdGUiLCJlcnJvciIsIkxvZyIsInVwZGF0ZWRPYmplY3RzUGF0aHMiLCJjdXJyZW50UGFnZSIsImdldEN1cnJlbnRQYWdlIiwiY3VycmVudENvbnRleHQiLCJyZXF1ZXN0UHJvbWlzZXMiLCJtYXAiLCJhcHBseVVwZGF0ZXNGb3JDaGFuZ2UiLCJnZXRDb250cm9sbGVyIiwiZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIlByb21pc2UiLCJhbGwiLCJwcm9wZXJ0eVBhdGhGb3JVcGRhdGUiLCJtZXRhTW9kZWwiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiZGF0YU1vZGVsT2JqZWN0IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwidGFyZ2V0Q29udGV4dFBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInRhcmdldENvbnRleHQiLCJmaW5kQ29udGV4dEZvclVwZGF0ZSIsInBhcmVudENvbGxlY3Rpb25QYXRoIiwicGFyZW50Q29udGV4dFBhdGgiLCJwYXJlbnRDb250ZXh0Iiwic2lkZUVmZmVjdHNQcm9taXNlcyIsInNpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInRhcmdldE1ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwicmVsYXRpdmVNZXRhUGF0aEZvclVwZGF0ZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImZpZWxkR3JvdXBJZHMiLCJjb21wdXRlRmllbGRHcm91cElkcyIsInRhcmdldEVudGl0eVR5cGUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJ0YXJnZXRPYmplY3QiLCJwYWdlQ29udHJvbGxlciIsInNpZGVFZmZlY3RzTWFwRm9yRmllbGRHcm91cCIsIl9zaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RzTWFwRm9yRmllbGRHcm91cHMiLCJPYmplY3QiLCJrZXlzIiwic2lkZUVmZmVjdE5hbWUiLCJzaWRlRWZmZWN0Iiwic2lkZUVmZmVjdHMiLCJjb250ZXh0IiwiZXJyIiwiY3VycmVudFBhdGgiLCJkZWxldGVkT2JqZWN0UGF0aHMiLCJkZWxldGVkUGF0aEluVXNlIiwiZmluZCIsImRlbGV0ZWRQYXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInNldEtlZXBBbGl2ZSIsInJlcXVlc3RQcm9taXNlIiwiYXBwbHlVcGRhdGVzRm9yQ29sbGVjdGlvbiIsIl9yb3V0aW5nIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJjcmVhdGVkT2JqZWN0UGF0aHMiLCJwYXRoSW5Db2xsZWN0aW9uIiwiYXBwQ29tcG9uZW50IiwicGFyZW50UGF0aCIsIm1ldGFQYXRoRm9yVXBkYXRlIiwicGFyZW50TWV0YVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJwYXRoc0ZvckFjdGlvbiIsImFjdGlvbk5hbWUiLCJjbGllbnRUcmlnZ2VyZWRBY3Rpb25OYW1lIiwiY2xpZW50UmVxdWVzdGVkUHJvcGVydGllcyIsImNsaWVudFJlZnJlc2hMaXN0QmluZGluZyIsInJlcXVlc3RVcGRhdGVGb3JBY3Rpb24iLCJwYXRoRm9yQWN0aW9uIiwic2lkZUVmZmVjdFNlcnZpY2UiLCJzaWRlRWZmZWN0c0Zyb21BY3Rpb24iLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdFByb21pc2VzIiwicGF0aEV4cHJlc3Npb25zIiwibWV0YVBhdGhGb3JBY3Rpb24iLCJkYXRhTW9kZWxQYXRoIiwiZ2V0Q29udGV4dCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJlbnRpdHlQcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJwcm9wIiwidGFyZ2V0UGF0aHMiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGFyZW50TGlzdEJpbmRpbmciLCJnZXRBbGxCaW5kaW5ncyIsImJpbmRpbmciLCJiaW5kaW5nUGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJpc0EiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImdldENyZWF0aW9uTW9kZSIsIm5hdmlnYXRlVG9Db250ZXh0IiwicmVjcmVhdGVDb250ZXh0IiwiZ2V0Q3VycmVudFBhZ2VWaWV3IiwiZGF0YVBhdGgiLCJpbml0IiwiaW5pdFByb21pc2UiLCJyZXNvbHZlIiwiU2VydmljZSIsIkNvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2VGYWN0b3J5IiwiX1NlcnZpY2VGYWN0b3J5IiwiX3Byb3RvMiIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0IiwiY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSIsIlNlcnZpY2VGYWN0b3J5Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJjb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCB7XG5cdGJyb2FkY2FzdENvbGxhYm9yYXRpb25NZXNzYWdlLFxuXHRlbmRDb2xsYWJvcmF0aW9uLFxuXHRpbml0aWFsaXplQ29sbGFib3JhdGlvbixcblx0aXNDb2xsYWJvcmF0aW9uQ29ubmVjdGVkXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5QmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBVc2VyLCBVc2VyQWN0aXZpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSwgQ29sbGFib3JhdGlvblV0aWxzLCBnZXRBY3Rpdml0eUtleUZyb21QYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcblxuY29uc3QgTVlBQ1RJVklUSUVTID0gXCIvY29sbGFib3JhdGlvbi9teUFjdGl2aXRpZXNcIjtcbmNvbnN0IEFDVElWRVVTRVJTID0gXCIvY29sbGFib3JhdGlvbi9hY3RpdmVVc2Vyc1wiO1xuY29uc3QgQUNUSVZJVElFUyA9IFwiL2NvbGxhYm9yYXRpb24vYWN0aXZpdGllc1wiO1xuY29uc3QgQVNZTkNNRVNTQUdFU1FVRVVFID0gXCIvY29sbGFib3JhdGlvbi9hc3luY01zZ1F1ZXVlXCI7XG5jb25zdCBSRVRBSU5FREFTWU5DTUVTU0FHRVMgPSBcIi9jb2xsYWJvcmF0aW9uL3JldGFpbmVkTWVzc2FnZXNcIjtcbmNvbnN0IEFTWU5DTUVTU0FHRVNUSU1FUklEID0gXCIvY29sbGFib3JhdGlvbi9hc3luY01zZ1RpbWVySWRcIjtcbmNvbnN0IFNZTkNHUk9VUElEID0gXCIkYXV0by5zeW5jXCI7XG5cbmNvbnN0IERFTEFZT05GT0NVUyA9IDUwMDsgLy8gNTAwbXMgZGVsYXkgZm9yIGFzeW5jIExPQ0svVU5MT0NLIG1lc3NhZ2VzXG5cbnR5cGUgQXN5bmNNZXNzYWdlID0ge1xuXHRwYXRoOiBzdHJpbmc7XG5cdGFjdGlvbjogQWN0aXZpdHkuVW5sb2NrIHwgQWN0aXZpdHkuTG9jaztcbn07XG5cbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlRmFjdG9yeT4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZT47XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGdpdmVuIHBhdGggaXMgbG9ja2VkIGJ5IHRoZSBjdXJyZW50IHVzZXIuXG5cdCAqIEBwYXJhbSBhY3Rpdml0eU1vZGVsXG5cdCAqIEBwYXJhbSBhY3Rpdml0eVBhdGhcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGF0aCBpcyBsb2NrZWRcblx0ICovXG5cdGNoZWNrUGF0aEZvckxvY2soYWN0aXZpdHlNb2RlbDogSlNPTk1vZGVsLCBhY3Rpdml0eVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG15QWN0aXZpdGllczogc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsID0gYWN0aXZpdHlNb2RlbC5nZXRQcm9wZXJ0eShNWUFDVElWSVRJRVMpO1xuXHRcdGlmICghbXlBY3Rpdml0aWVzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBteUFjdGl2aXRpZXMuaW5jbHVkZXMoYWN0aXZpdHlQYXRoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhIHBhdGggYXMgbG9ja2VkIGZvciB0aGUgY3VycmVudCB1c2VyLlxuXHQgKiBAcGFyYW0gYWN0aXZpdHlNb2RlbFxuXHQgKiBAcGFyYW0gYWN0aXZpdHlQYXRoXG5cdCAqL1xuXHRzZXRMb2NrKGFjdGl2aXR5TW9kZWw6IEpTT05Nb2RlbCwgYWN0aXZpdHlQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBteUFjdGl2aXRpZXM6IHN0cmluZ1tdID0gYWN0aXZpdHlNb2RlbC5nZXRQcm9wZXJ0eShNWUFDVElWSVRJRVMpID8/IFtdO1xuXHRcdGlmICghbXlBY3Rpdml0aWVzLmluY2x1ZGVzKGFjdGl2aXR5UGF0aCkpIHtcblx0XHRcdG15QWN0aXZpdGllcy5wdXNoKGFjdGl2aXR5UGF0aCk7XG5cdFx0fVxuXG5cdFx0YWN0aXZpdHlNb2RlbC5zZXRQcm9wZXJ0eShNWUFDVElWSVRJRVMsIG15QWN0aXZpdGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jayBmb3IgYSBnaXZlbiBwYXRoLlxuXHQgKiBAcGFyYW0gYWN0aXZpdHlNb2RlbFxuXHQgKiBAcGFyYW0gYWN0aXZpdHlQYXRoc1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwYXRoIHdhcyBwcmV2aW91c2x5IGxvY2tlZFxuXHQgKi9cblx0cmVtb3ZlTG9jayhhY3Rpdml0eU1vZGVsOiBKU09OTW9kZWwsIGFjdGl2aXR5UGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbXlBY3Rpdml0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IG51bGwgPSBhY3Rpdml0eU1vZGVsLmdldFByb3BlcnR5KE1ZQUNUSVZJVElFUyk7XG5cdFx0aWYgKCFteUFjdGl2aXRpZXMgfHwgYWN0aXZpdHlQYXRocyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF0aHNUb1JlbW92ZSA9IEFycmF5LmlzQXJyYXkoYWN0aXZpdHlQYXRocykgPyBhY3Rpdml0eVBhdGhzIDogW2FjdGl2aXR5UGF0aHNdO1xuXHRcdGNvbnN0IG15TmV3QWN0aXZpdGllcyA9IG15QWN0aXZpdGllcy5maWx0ZXIoKGFjdGl2aXR5KSA9PiB7XG5cdFx0XHRyZXR1cm4gIXBhdGhzVG9SZW1vdmUuaW5jbHVkZXMoYWN0aXZpdHkpO1xuXHRcdH0pO1xuXHRcdGFjdGl2aXR5TW9kZWwuc2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTLCBteU5ld0FjdGl2aXRpZXMpO1xuXG5cdFx0cmV0dXJuIG15TmV3QWN0aXZpdGllcy5sZW5ndGggIT09IG15QWN0aXZpdGllcy5sZW5ndGg7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgbG9ja2VkIHBhdGhzIGZvciB0aGUgY3VycmVudCB1c2VyLlxuXHQgKiBAcGFyYW0gYWN0aXZpdHlNb2RlbFxuXHQgKiBAcmV0dXJucyBDb25jYXRlbmF0ZWQgcGF0aHMgZm9yIGFsbCBsb2NrZWQgcHJvcGVydGllc1xuXHQgKi9cblx0Z2V0TG9ja2VkUHJvcGVydGllcyhhY3Rpdml0eU1vZGVsOiBKU09OTW9kZWwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG15QWN0aXZpdGllczogc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsID0gYWN0aXZpdHlNb2RlbC5nZXRQcm9wZXJ0eShNWUFDVElWSVRJRVMpO1xuXHRcdGlmICghbXlBY3Rpdml0aWVzKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gbXlBY3Rpdml0aWVzLmpvaW4oXCJ8XCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIGFsbCBjdXJyZW50IGxvY2tzIGJ5IGNoYW5naW5nIGEgY29udGV4dCBwYXRoLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFjdGl2YXRpbmcgYSBjb250ZXh0LCB3aGVyZSB0aGUgaW5pdGlhbCBsb2NrcyB3ZXJlIHVzaW5nIHRoZSB0cmFuc2llbnQgcGF0aFxuXHQgKiBhbmQgbmVlZCB0byBiZSB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBwYXRoLlxuXHQgKiBAcGFyYW0gZWxlbWVudFxuXHQgKiBAcGFyYW0gb2xkQ29udGV4dFBhdGhcblx0ICogQHBhcmFtIG5ld0NvbnRleHRQYXRoXG5cdCAqL1xuXHR1cGRhdGVMb2Nrc0ZvckNvbnRleHRQYXRoKGVsZW1lbnQ6IFVJNUVsZW1lbnQsIG9sZENvbnRleHRQYXRoOiBzdHJpbmcsIG5ld0NvbnRleHRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuaXNDb25uZWN0ZWQoZWxlbWVudCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gZWxlbWVudC5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdC8vIFJlcGxhY2UgcGF0aHMgaW4gcGVuZGluZyBhc3luYyBtZXNzYWdlc1xuXHRcdGNvbnN0IGN1cnJlbnRRdWV1ZTogQXN5bmNNZXNzYWdlW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFTWU5DTUVTU0FHRVNRVUVVRSk7XG5cdFx0Y3VycmVudFF1ZXVlLmZvckVhY2goKHF1ZXVlSXRlbSkgPT4ge1xuXHRcdFx0aWYgKHF1ZXVlSXRlbS5wYXRoLnN0YXJ0c1dpdGgob2xkQ29udGV4dFBhdGgpKSB7XG5cdFx0XHRcdHF1ZXVlSXRlbS5wYXRoID0gcXVldWVJdGVtLnBhdGgucmVwbGFjZShvbGRDb250ZXh0UGF0aCwgbmV3Q29udGV4dFBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gUmVwbGFjZSBwYXRocyBpbiBleGlzdGluZyBsb2NrcyAoYW5kIGJyb2FkY2FzdCB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlIGlmIG5lY2Vzc2FyeSlcblx0XHRjb25zdCBteUFjdGl2aXRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoTVlBQ1RJVklUSUVTKTtcblx0XHRpZiAobXlBY3Rpdml0aWVzKSB7XG5cdFx0XHRjb25zdCBjaGFuZ2VkQWN0aXZpdGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGNvbnN0IHVuY2hhbmdlZEFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRteUFjdGl2aXRpZXMuZm9yRWFjaCgobG9ja2VkUGF0aCkgPT4ge1xuXHRcdFx0XHRpZiAobG9ja2VkUGF0aC5zdGFydHNXaXRoKG9sZENvbnRleHRQYXRoKSkge1xuXHRcdFx0XHRcdC8vIFJlcGxhY2UgdGhlIHBhdGggaW4gdGhlIGxpc3Qgb2YgbG9ja3MsIGFuZCBzdG9yZSB0aGlzIHBhdGggZm9yIHNlbmRpbmcgYSBuZXcgTE9DSyBtZXNzYWdlXG5cdFx0XHRcdFx0Y29uc3QgbmV3bG9ja2VkUGF0aCA9IGxvY2tlZFBhdGgucmVwbGFjZShvbGRDb250ZXh0UGF0aCwgbmV3Q29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdGNoYW5nZWRBY3Rpdml0aWVzLnB1c2gobmV3bG9ja2VkUGF0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dW5jaGFuZ2VkQWN0aXZpdGllcy5wdXNoKGxvY2tlZFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShNWUFDVElWSVRJRVMsIHVuY2hhbmdlZEFjdGl2aXRpZXMpO1xuXHRcdFx0aWYgKGNoYW5nZWRBY3Rpdml0aWVzLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0XHR0aGlzLnNlbmQoZWxlbWVudCwgeyBhY3Rpb246IEFjdGl2aXR5LkxvY2ssIGNvbnRlbnQ6IGNoYW5nZWRBY3Rpdml0aWVzIH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNldHMgdGhlIHRpbWVyIGZvciBzZW5kaW5nIGFzeW5jaHJvbm91cyBjb2xsYWJvcmF0aW9uIG1lc3NhZ2VzLlxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbFxuXHQgKi9cblx0cmVzZXRBc3luY01lc3NhZ2VzVGltZXIoaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsKTogdm9pZCB7XG5cdFx0bGV0IHRpbWVySWQgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFTWU5DTUVTU0FHRVNUSU1FUklEKTtcblx0XHRpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cdFx0fVxuXG5cdFx0dGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Y29uc3QgcXVldWU6IEFzeW5jTWVzc2FnZVtdIHwgdW5kZWZpbmVkID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBU1lOQ01FU1NBR0VTUVVFVUUpO1xuXHRcdFx0Y29uc3QgbmV3UXVldWU6IEFzeW5jTWVzc2FnZVtdID0gW107XG5cdFx0XHRjb25zdCBwYXRoc1RvUmV0YWluOiBzdHJpbmdbXSA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoUkVUQUlORURBU1lOQ01FU1NBR0VTKSA/PyBbXTtcblxuXHRcdFx0aWYgKCFxdWV1ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHF1ZXVlLmZvckVhY2goKGl0ZW0pID0+IHtcblx0XHRcdFx0aWYgKHBhdGhzVG9SZXRhaW4uaW5jbHVkZXMoaXRlbS5wYXRoKSkge1xuXHRcdFx0XHRcdG5ld1F1ZXVlLnB1c2goaXRlbSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kb1NlbmQoaW50ZXJuYWxNb2RlbCwgaXRlbS5hY3Rpb24sIGl0ZW0ucGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFTWU5DTUVTU0FHRVNRVUVVRSwgbmV3UXVldWUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBU1lOQ01FU1NBR0VTVElNRVJJRCwgdW5kZWZpbmVkKTtcblxuXHRcdFx0aWYgKG5ld1F1ZXVlLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBJZiBzb21lIG1lc3NhZ2VzIGFyZSBzdGlsbCBwZW5kaW5nLCByZXNjaGVkdWxlIGEgbmV3IHRpbWVyXG5cdFx0XHRcdHRoaXMucmVzZXRBc3luY01lc3NhZ2VzVGltZXIoaW50ZXJuYWxNb2RlbCk7XG5cdFx0XHR9XG5cdFx0fSwgREVMQVlPTkZPQ1VTKTtcblxuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQVNZTkNNRVNTQUdFU1RJTUVSSUQsIHRpbWVySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hcmsgc29tZSBwYXRocyBhcyBiZWluZyByZXRhaW5lZCwgaS5lLiBhc3luYyBtZXNzYWdlcyBmb3IgdGhlc2UgcGF0aHMgd29uJ3QgYmUgc2VudCBidXQga2VwdCB1bnRpbCB0aGV5J3JlIHJlbGVhc2VkLlxuXHQgKiBUaGlzIGFwcGxpZXMgdG8gZXhpc3RpbmcgYXN5bmMgbWVzc2FnZXMgaW4gdGhlIHF1ZXVlLCBidXQgYWxzbyB0byBmdXR1cmUgbWVzc2FnZXMuXG5cdCAqIEBwYXJhbSBlbGVtZW50XG5cdCAqIEBwYXJhbSBhY3Rpdml0eVBhdGhzIFRoZSBwYXRocyB0byBiZSByZXRhaW5lZFxuXHQgKi9cblx0cmV0YWluQXN5bmNNZXNzYWdlcyhlbGVtZW50OiBVSTVFbGVtZW50LCBhY3Rpdml0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoc1RvUmV0YWluID0gQXJyYXkuaXNBcnJheShhY3Rpdml0eVBhdGhzKSA/IGFjdGl2aXR5UGF0aHMgOiBbYWN0aXZpdHlQYXRoc107XG5cblx0XHRjb25zdCByZXRhaW5lZFBhdGhzOiBzdHJpbmdbXSA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoUkVUQUlORURBU1lOQ01FU1NBR0VTKTtcblx0XHRhZGRpdGlvbmFsUGF0aHNUb1JldGFpbi5mb3JFYWNoKChwYXRoKSA9PiB7XG5cdFx0XHRpZiAoIXJldGFpbmVkUGF0aHMuaW5jbHVkZXMocGF0aCkpIHtcblx0XHRcdFx0cmV0YWluZWRQYXRocy5wdXNoKHBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbGVhc2UgYXN5bmMgbWVzc2FnZXMgZm9yIHNvbWUgcGF0aHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgcmV0YWluZWQuXG5cdCAqIFRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2VzIGFyZSBub3Qgc2VudCBpbW1lZGlhdGVseSwgYnV0IHRoZSBuZXh0IHRpbWUgdGhlIGFzeW5jIHRpbWVyIHdha2VzIHVwLlxuXHQgKiBAcGFyYW0gZWxlbWVudFxuXHQgKiBAcGFyYW0gYWN0aXZpdHlQYXRocyBUaGUgcGF0aHMgdG8gYmUgcmVsZWFzZWRcblx0ICovXG5cdHJlbGVhc2VBc3luY01lc3NhZ2VzKGVsZW1lbnQ6IFVJNUVsZW1lbnQsIGFjdGl2aXR5UGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0Y29uc3QgcGF0aHNUb1JldGFpbjogc3RyaW5nW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFJFVEFJTkVEQVNZTkNNRVNTQUdFUyk7XG5cdFx0Y29uc3QgcGF0aHNUb1JlbGVhc2UgPSBBcnJheS5pc0FycmF5KGFjdGl2aXR5UGF0aHMpID8gYWN0aXZpdHlQYXRocyA6IFthY3Rpdml0eVBhdGhzXTtcblxuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRSRVRBSU5FREFTWU5DTUVTU0FHRVMsXG5cdFx0XHRwYXRoc1RvUmV0YWluLmZpbHRlcigocmV0YWluZWRQYXRoKSA9PiB7XG5cdFx0XHRcdHJldHVybiAhcGF0aHNUb1JlbGVhc2UuaW5jbHVkZXMocmV0YWluZWRQYXRoKTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb2xsYWJvcmF0aW9uIHNlc3Npb24gaXMgY3VycmVudGx5IG9wZW4uXG5cdCAqIEBwYXJhbSBlbGVtZW50XG5cdCAqIEByZXR1cm5zIFRydWUgaWYgYSBjb2xsYWJvcmF0aW9uIHNlc3Npb24gaXMgY3VycmVudGx5IG9wZW4uXG5cdCAqL1xuXHRpc0Nvbm5lY3RlZChlbGVtZW50OiBVSTVFbGVtZW50KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0cmV0dXJuIGlzQ29sbGFib3JhdGlvbkNvbm5lY3RlZChpbnRlcm5hbE1vZGVsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZW5kcyBhIGNvbGxhYm9yYXRpb24gbWVzc2FnZSB0byBvdGhlciBjb25uZWN0ZWQgdXNlcnMuXG5cdCAqIEBwYXJhbSBlbGVtZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlXG5cdCAqIEBwYXJhbSBtZXNzYWdlLmFjdGlvblxuXHQgKiBAcGFyYW0gbWVzc2FnZS5jb250ZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlLnRyaWdnZXJlZEFjdGlvbk5hbWVcblx0ICogQHBhcmFtIG1lc3NhZ2UucmVmcmVzaExpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBtZXNzYWdlLmFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXNcblx0ICovXG5cdHB1YmxpYyBzZW5kKFxuXHRcdGVsZW1lbnQ6IFVJNUVsZW1lbnQsXG5cdFx0bWVzc2FnZToge1xuXHRcdFx0YWN0aW9uOiBBY3Rpdml0eTtcblx0XHRcdGNvbnRlbnQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXHRcdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZztcblx0XHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW47XG5cdFx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdFx0fVxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc0Nvbm5lY3RlZChlbGVtZW50KSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRpZiAobWVzc2FnZS5hY3Rpb24gPT09IEFjdGl2aXR5LkxvY2sgfHwgbWVzc2FnZS5hY3Rpb24gPT09IEFjdGl2aXR5LlVubG9jaykge1xuXHRcdFx0XHQvLyBMb2NrLXJlbGF0ZWQgZXZlbnRzIGFyZSBhbHdheXMgc2VudCB3aXRoIHNvbWUgZGVsYXlcblx0XHRcdFx0dGhpcy5kb1NlbmRBc3luYyhpbnRlcm5hbE1vZGVsLCBtZXNzYWdlLmFjdGlvbiwgbWVzc2FnZS5jb250ZW50KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZG9TZW5kKFxuXHRcdFx0XHRcdGludGVybmFsTW9kZWwsXG5cdFx0XHRcdFx0bWVzc2FnZS5hY3Rpb24sXG5cdFx0XHRcdFx0bWVzc2FnZS5jb250ZW50LFxuXHRcdFx0XHRcdG1lc3NhZ2UudHJpZ2dlcmVkQWN0aW9uTmFtZSxcblx0XHRcdFx0XHRtZXNzYWdlLnJlZnJlc2hMaXN0QmluZGluZyxcblx0XHRcdFx0XHRtZXNzYWdlLmFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gc2VuZCBhIGNvbGxhYm9yYXRpb24gbWVzc2FnZSBpbW1lZGlhdGVseS5cblx0ICogQHBhcmFtIGludGVybmFsTW9kZWxcblx0ICogQHBhcmFtIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGVudFxuXHQgKiBAcGFyYW0gdHJpZ2dlcmVkQWN0aW9uTmFtZVxuXHQgKiBAcGFyYW0gcmVmcmVzaExpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzXG5cdCAqL1xuXHRkb1NlbmQoXG5cdFx0aW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLFxuXHRcdGFjdGlvbjogQWN0aXZpdHksXG5cdFx0Y29udGVudDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsXG5cdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuLFxuXHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjbGllbnRDb250ZW50ID0gKEFycmF5LmlzQXJyYXkoY29udGVudCkgPyBjb250ZW50LmpvaW4oXCJ8XCIpIDogY29udGVudCkgPz8gXCJcIjtcblx0XHRjb25zdCByZXF1ZXN0ZWRQcm9wZXJ0aWVzID0gYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz8uam9pbihcInxcIik7XG5cdFx0aWYgKGFjdGlvbiA9PT0gQWN0aXZpdHkuTG9jaykge1xuXHRcdFx0Y29uc3QgcGF0aEZvckxvY2sgPSAoQXJyYXkuaXNBcnJheShjb250ZW50KSA/IGNvbnRlbnRbMF0gOiBjb250ZW50KSA/PyBcIlwiO1xuXHRcdFx0Ly8gVG8gYXZvaWQgdW5uZWNlc3NhcnkgdHJhZmZpYyB3ZSBrZWVwIHRyYWNrIG9mIGxvY2sgY2hhbmdlcyBhbmQgc2VuZCBpdCBvbmx5IG9uY2Vcblx0XHRcdGlmICh0aGlzLmNoZWNrUGF0aEZvckxvY2soaW50ZXJuYWxNb2RlbCwgcGF0aEZvckxvY2spKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc2V0TG9jayhpbnRlcm5hbE1vZGVsLCBwYXRoRm9yTG9jayk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChhY3Rpb24gPT09IEFjdGl2aXR5LlVubG9jaykge1xuXHRcdFx0Y29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlTG9jayhpbnRlcm5hbE1vZGVsLCBjb250ZW50KTtcblx0XHRcdC8vIE5vIG5lZWQgdG8gc2VuZCBhbiBVbmxvY2sgbWVzc2FnZSBpZiBpdCB3YXMgbm90IGFscmVhZHkgbG9ja2VkXG5cdFx0XHRpZiAoIXJlbW92ZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGJyb2FkY2FzdENvbGxhYm9yYXRpb25NZXNzYWdlKGFjdGlvbiwgY2xpZW50Q29udGVudCwgaW50ZXJuYWxNb2RlbCwgdHJpZ2dlcmVkQWN0aW9uTmFtZSwgcmVmcmVzaExpc3RCaW5kaW5nLCByZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBzZW5kIGEgY29sbGFib3JhdGlvbiBtZXNzYWdlIGFzeW5jaHJvbm91c2x5LlxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbFxuXHQgKiBAcGFyYW0gYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZW50XG5cdCAqL1xuXHRkb1NlbmRBc3luYyhpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGFjdGlvbjogQWN0aXZpdHkuTG9jayB8IEFjdGl2aXR5LlVubG9jaywgY29udGVudDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGN1cnJlbnRRdWV1ZTogQXN5bmNNZXNzYWdlW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFTWU5DTUVTU0FHRVNRVUVVRSk7XG5cdFx0Y29uc3QgcGF0aHNUb0FkZCA9IEFycmF5LmlzQXJyYXkoY29udGVudCkgPyBjb250ZW50IDogW2NvbnRlbnRdO1xuXHRcdC8vIFJlbW92ZSBleGlzdGluZyBpdGVtcyBpbiB0aGUgcXVldWUgZm9yIHRoZSBwYXRocyB0aGF0IHdpbGwgYmUgYWRkZWRcblx0XHRjb25zdCBuZXdRdWV1ZSA9IGN1cnJlbnRRdWV1ZS5maWx0ZXIoKGl0ZW0pID0+IHtcblx0XHRcdHJldHVybiAhcGF0aHNUb0FkZC5pbmNsdWRlcyhpdGVtLnBhdGgpO1xuXHRcdH0pO1xuXHRcdHBhdGhzVG9BZGQuZm9yRWFjaCgocGF0aCkgPT4ge1xuXHRcdFx0bmV3UXVldWUucHVzaCh7IHBhdGgsIGFjdGlvbiB9KTtcblx0XHR9KTtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFTWU5DTUVTU0FHRVNRVUVVRSwgbmV3UXVldWUpO1xuXHRcdHRoaXMucmVzZXRBc3luY01lc3NhZ2VzVGltZXIoaW50ZXJuYWxNb2RlbCk7XG5cdH1cblxuXHRpc0NvbGxhYm9yYXRpb25FbmFibGVkKHZpZXc6IFZpZXcpOiBib29sZWFuIHtcblx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IHZpZXc/LmdldEJpbmRpbmdDb250ZXh0ICYmICh2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0cmV0dXJuICEhKGJpbmRpbmdDb250ZXh0ICYmIE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHdpdGggYSBjb2xsYWJvcmF0aXZlIGRyYWZ0IHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBkcmFmdFJvb3RDb250ZXh0IFRoZSBkcmFmdCByb290IGNvbnRleHRcblx0ICogQHBhcmFtIHZpZXcgIFRoZSB2aWV3IHRoYXQgaXMgdXNlZCB0byBjb25uZWN0IHRoZSB3ZWJzb2NrZXRcblx0ICogQHJldHVybnMgUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgY29ubmVjdChkcmFmdFJvb3RDb250ZXh0OiBDb250ZXh0LCB2aWV3OiBGRVZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdGNvbnN0IG1lID0gQ29sbGFib3JhdGlvblV0aWxzLmdldE1lKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh2aWV3KSk7XG5cblx0XHQvLyBSZXRyaWV2aW5nIE1FIGZyb20gc2hlbGwgc2VydmljZVxuXHRcdGlmICghbWUpIHtcblx0XHRcdC8vIG5vIG1lID0gbm8gc2hlbGwgPSBub3Qgc3VyZSB3aGF0IHRvIGRvXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc0RyYWZ0VVVJRCA9IGF3YWl0IGRyYWZ0Um9vdENvbnRleHQucmVxdWVzdFByb3BlcnR5KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRVVUlEXCIpO1xuXHRcdGlmICghc0RyYWZ0VVVJRCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGluaXRpYWxpemVkID0gaW5pdGlhbGl6ZUNvbGxhYm9yYXRpb24oXG5cdFx0XHRtZSxcblx0XHRcdHNEcmFmdFVVSUQsXG5cdFx0XHRpbnRlcm5hbE1vZGVsLFxuXHRcdFx0KG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0dGhpcy5tZXNzYWdlUmVjZWl2ZShtZXNzYWdlLCB2aWV3KTtcblx0XHRcdH0sXG5cdFx0XHR2aWV3XG5cdFx0KTtcblxuXHRcdGlmIChpbml0aWFsaXplZCkge1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShNWUFDVElWSVRJRVMsIFtdKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQVNZTkNNRVNTQUdFU1FVRVVFLCBbXSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFJFVEFJTkVEQVNZTkNNRVNTQUdFUywgW10pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBjbG9zZSBhIGNvbm5lY3Rpb24gd2l0aCBhIGNvbGxhYm9yYXRpdmUgZHJhZnQgc2VydmljZS5cblx0ICogQHBhcmFtIHZpZXcgQ3VycmVudCBWaWV3XG5cdCAqL1xuXHRkaXNjb25uZWN0KHZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB2aWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0ZW5kQ29sbGFib3JhdGlvbihpbnRlcm5hbE1vZGVsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byB1cGRhdGUgaW50ZXJuYWwgbW9kZWwgd2hlbiBhIHVzZXIgam9pbnMgdGhlIGRyYWZ0LlxuXHQgKiBAcGFyYW0gYWN0aXZlVXNlcnMgTGlzdCBvZiBjb25uZWN0ZWQgdXNlcnNcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgSW50ZXJuYWwgbW9kZWxcblx0ICogQHBhcmFtIHNlbmRlciBVc2VyIHNlbmRpbmcgdGhlIEpPSU4gb3IgSk9JTkVDSE8gbWVzc2FnZVxuXHQgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZVxuXHQgKiBAcGFyYW0gdmlldyBDdXJyZW50IFZpZXdcblx0ICovXG5cdHVzZXJKb2luRHJhZnQoYWN0aXZlVXNlcnM6IFVzZXJbXSwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBzZW5kZXI6IFVzZXIsIG1lc3NhZ2U6IE1lc3NhZ2UsIHZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdGlmIChhY3RpdmVVc2Vycy5maW5kSW5kZXgoKHVzZXIpID0+IHVzZXIuaWQgPT09IHNlbmRlci5pZCkgPT09IC0xKSB7XG5cdFx0XHRhY3RpdmVVc2Vycy51bnNoaWZ0KHNlbmRlcik7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFDVElWRVVTRVJTLCBhY3RpdmVVc2Vycyk7XG5cdFx0fVxuXG5cdFx0aWYgKG1lc3NhZ2UudXNlckFjdGlvbiA9PT0gQWN0aXZpdHkuSm9pbikge1xuXHRcdFx0Ly8gd2UgZWNobyBvdXIgZXhpc3RlbmNlIHRvIHRoZSBuZXdseSBlbnRlcmVkIHVzZXIgYW5kIGFsc28gc2VuZCB0aGUgY3VycmVudCBhY3Rpdml0eSBpZiB0aGVyZSBpcyBhbnlcblx0XHRcdGJyb2FkY2FzdENvbGxhYm9yYXRpb25NZXNzYWdlKEFjdGl2aXR5LkpvaW5FY2hvLCB0aGlzLmdldExvY2tlZFByb3BlcnRpZXMoaW50ZXJuYWxNb2RlbCksIGludGVybmFsTW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmIChtZXNzYWdlLnVzZXJBY3Rpb24gPT09IEFjdGl2aXR5LkpvaW5FY2hvKSB7XG5cdFx0XHRpZiAobWVzc2FnZS5jbGllbnRDb250ZW50KSB7XG5cdFx0XHRcdC8vIGFub3RoZXIgdXNlciB3YXMgYWxyZWFkeSB0eXBpbmcgdGhlcmVmb3JlIEkgd2FudCB0byBzZWUgaGlzIGFjdGl2aXR5IGltbWVkaWF0ZWx5LiBDYWxsaW5nIG1lIGFnYWluIGFzIGEgbGl2ZSBjaGFuZ2Vcblx0XHRcdFx0bWVzc2FnZS51c2VyQWN0aW9uID0gQWN0aXZpdHkuTG9ja0VjaG87XG5cdFx0XHRcdHRoaXMubWVzc2FnZVJlY2VpdmUobWVzc2FnZSwgdmlldyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIHVwZGF0ZSBpbnRlcm5hbCBtb2RlbCB3aGVuIGEgdXNlciBsZWF2ZXMgdGhlIGRyYWZ0LlxuXHQgKiBAcGFyYW0gYWN0aXZlVXNlcnMgTGlzdCBvZiBjb25uZWN0ZWQgdXNlcnNcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgSW50ZXJuYWwgbW9kZWxcblx0ICogQHBhcmFtIHNlbmRlciBVc2VyIHNlbmRpbmcgdGhlIEpPSU4gb3IgSk9JTkVDSE8gbWVzc2FnZVxuXHQgKi9cblx0dXNlckxlYXZlRHJhZnQoYWN0aXZlVXNlcnM6IFVzZXJbXSwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBzZW5kZXI6IFVzZXIpOiB2b2lkIHtcblx0XHQvLyBSZW1vdmluZyB0aGUgYWN0aXZlIHVzZXIuIE5vdCByZW1vdmluZyBcIm1lXCIgaWYgSSBoYWQgdGhlIHNjcmVlbiBvcGVuIGluIGFub3RoZXIgc2Vzc2lvblxuXHRcdGFjdGl2ZVVzZXJzID0gYWN0aXZlVXNlcnMuZmlsdGVyKCh1c2VyKSA9PiB1c2VyLmlkICE9PSBzZW5kZXIuaWQgfHwgdXNlci5tZSk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVkVVU0VSUywgYWN0aXZlVXNlcnMpO1xuXHRcdGNvbnN0IGFsbEFjdGl2aXRpZXMgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMpIHx8IHt9O1xuXHRcdGNvbnN0IHJlbW92ZVVzZXJBY3Rpdml0aWVzID0gZnVuY3Rpb24gKGJhZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBVc2VyQWN0aXZpdHlbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVXNlckFjdGl2aXR5W10ge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoYmFnKSkge1xuXHRcdFx0XHRyZXR1cm4gYmFnLmZpbHRlcigoYWN0aXZpdHkpID0+IGFjdGl2aXR5LmlkICE9PSBzZW5kZXIuaWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChjb25zdCBwIGluIGJhZykge1xuXHRcdFx0XHRcdGJhZ1twXSA9IHJlbW92ZVVzZXJBY3Rpdml0aWVzKGJhZ1twXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFVzZXJBY3Rpdml0eVtdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYmFnO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0cmVtb3ZlVXNlckFjdGl2aXRpZXMoYWxsQWN0aXZpdGllcyk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVklUSUVTLCBhbGxBY3Rpdml0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXQuXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHJlY2VpdmVkXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqL1xuXHRtZXNzYWdlUmVjZWl2ZShtZXNzYWdlOiBNZXNzYWdlLCB2aWV3OiBGRVZpZXcpOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdGNvbnN0IGFjdGl2ZVVzZXJzOiBVc2VyW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWRVVTRVJTKTtcblx0XHRsZXQgYWN0aXZpdGllczogVXNlckFjdGl2aXR5W107XG5cdFx0bGV0IGFjdGl2aXR5S2V5OiBzdHJpbmc7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSB0aGlzLmNhbGN1bGF0ZU1ldGFQYXRoKHZpZXcsIG1lc3NhZ2UuY2xpZW50Q29udGVudCk7XG5cdFx0bWVzc2FnZS51c2VyQWN0aW9uID0gbWVzc2FnZS51c2VyQWN0aW9uIHx8IG1lc3NhZ2UuY2xpZW50QWN0aW9uO1xuXG5cdFx0Y29uc3Qgc2VuZGVyOiBVc2VyID0ge1xuXHRcdFx0aWQ6IG1lc3NhZ2UudXNlcklELFxuXHRcdFx0bmFtZTogbWVzc2FnZS51c2VyRGVzY3JpcHRpb24sXG5cdFx0XHRpbml0aWFsczogQ29sbGFib3JhdGlvblV0aWxzLmZvcm1hdEluaXRpYWxzKG1lc3NhZ2UudXNlckRlc2NyaXB0aW9uKSxcblx0XHRcdGNvbG9yOiBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0VXNlckNvbG9yKG1lc3NhZ2UudXNlcklELCBhY3RpdmVVc2VycywgW10pXG5cdFx0fTtcblxuXHRcdGxldCBtYWN0aXZpdHk6IFVzZXJBY3Rpdml0eSA9IHNlbmRlcjtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2Vcblx0XHRzd2l0Y2ggKG1lc3NhZ2UudXNlckFjdGlvbikge1xuXHRcdFx0Y2FzZSBBY3Rpdml0eS5Kb2luOlxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5Kb2luRWNobzpcblx0XHRcdFx0dGhpcy51c2VySm9pbkRyYWZ0KGFjdGl2ZVVzZXJzLCBpbnRlcm5hbE1vZGVsLCBzZW5kZXIsIG1lc3NhZ2UsIHZpZXcpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5MZWF2ZTpcblx0XHRcdFx0dGhpcy51c2VyTGVhdmVEcmFmdChhY3RpdmVVc2VycywgaW50ZXJuYWxNb2RlbCwgc2VuZGVyKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWN0aXZpdHkuQ2hhbmdlOlxuXHRcdFx0XHR0aGlzLnVwZGF0ZU9uQ2hhbmdlKHZpZXcsIG1lc3NhZ2UpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5DcmVhdGU6XG5cdFx0XHRcdC8vIEZvciBjcmVhdGUgd2UgYWN0dWFsbHkganVzdCBuZWVkIHRvIHJlZnJlc2ggdGhlIHRhYmxlXG5cdFx0XHRcdHRoaXMudXBkYXRlT25DcmVhdGUodmlldywgbWVzc2FnZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFjdGl2aXR5LkRlbGV0ZTpcblx0XHRcdFx0Ly8gRm9yIG5vdyBhbHNvIHJlZnJlc2ggdGhlIHBhZ2UgYnV0IGluIGNhc2Ugb2YgZGVsZXRpb24gd2UgbmVlZCB0byBpbmZvcm0gdGhlIHVzZXJcblx0XHRcdFx0dGhpcy51cGRhdGVPbkRlbGV0ZSh2aWV3LCBtZXNzYWdlKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWN0aXZpdHkuQWN0aXZhdGU6XG5cdFx0XHRcdHRoaXMuZHJhZnRDbG9zZWRCeU90aGVyVXNlcihcblx0XHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRcdG1lc3NhZ2UuY2xpZW50Q29udGVudCxcblx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0VGV4dChcIkNfQ09MTEFCT1JBVElPTkRSQUZUX0FDVElWQVRFXCIsIHNlbmRlci5uYW1lKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5EaXNjYXJkOlxuXHRcdFx0XHR0aGlzLmRyYWZ0Q2xvc2VkQnlPdGhlclVzZXIoXG5cdFx0XHRcdFx0dmlldyxcblx0XHRcdFx0XHRtZXNzYWdlLmNsaWVudENvbnRlbnQsXG5cdFx0XHRcdFx0Q29sbGFib3JhdGlvblV0aWxzLmdldFRleHQoXCJDX0NPTExBQk9SQVRJT05EUkFGVF9ESVNDQVJEXCIsIHNlbmRlci5uYW1lKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBY3Rpdml0eS5BY3Rpb246XG5cdFx0XHRcdHRoaXMudXBkYXRlT25BY3Rpb24odmlldywgbWVzc2FnZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFjdGl2aXR5LkxvY2s6XG5cdFx0XHRjYXNlIEFjdGl2aXR5LkxvY2tFY2hvOlxuXHRcdFx0XHRtYWN0aXZpdHkgPSBzZW5kZXI7XG5cdFx0XHRcdG1hY3Rpdml0eS5rZXkgPSBnZXRBY3Rpdml0eUtleUZyb21QYXRoKG1lc3NhZ2UuY2xpZW50Q29udGVudCk7XG5cblx0XHRcdFx0Ly8gc3R1cGlkIEpTT04gbW9kZWwuLi5cblx0XHRcdFx0bGV0IGluaXRKU09OTW9kZWwgPSBcIlwiO1xuXHRcdFx0XHRjb25zdCBwYXJ0cyA9IG1ldGFQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRpbml0SlNPTk1vZGVsICs9IGAvJHtwYXJ0c1tpXX1gO1xuXHRcdFx0XHRcdGlmICghaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgaW5pdEpTT05Nb2RlbCkpIHtcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUyArIGluaXRKU09OTW9kZWwsIHt9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY3Rpdml0aWVzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgbWV0YVBhdGgpO1xuXHRcdFx0XHRhY3Rpdml0aWVzID0gYWN0aXZpdGllcz8uc2xpY2UgPyBhY3Rpdml0aWVzLnNsaWNlKCkgOiBbXTtcblx0XHRcdFx0YWN0aXZpdGllcy5wdXNoKG1hY3Rpdml0eSk7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUyArIG1ldGFQYXRoLCBhY3Rpdml0aWVzKTtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudXNlckFjdGlvbiA9PT0gQWN0aXZpdHkuTG9ja0VjaG8gJiYgdGhpcy5jaGVja1BhdGhGb3JMb2NrKGludGVybmFsTW9kZWwsIG1lc3NhZ2UuY2xpZW50Q29udGVudCkpIHtcblx0XHRcdFx0XHQvLyBUaGUgY3VycmVudCB1c2VyIGhhcyBsb2NrZWQgdGhpcyBwYXRoIHJpZ2h0IGFmdGVyIGNvbm5lY3Rpb24sIGJlZm9yZSBrbm93aW5nIGl0IHdhcyBhbHJlYWR5IGxvY2tlZCBieSBzb21lb25lIGVsc2Vcblx0XHRcdFx0XHQvLyAtLT4gcmVtb3ZlIHRoZSBjdXJyZW50IGxvY2tcblx0XHRcdFx0XHR0aGlzLmRvU2VuZChpbnRlcm5hbE1vZGVsLCBBY3Rpdml0eS5VbmxvY2ssIG1lc3NhZ2UuY2xpZW50Q29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWN0aXZpdHkuVW5sb2NrOlxuXHRcdFx0XHQvLyBUaGUgdXNlciBkaWQgYSBjaGFuZ2UgYnV0IHJldmVydGVkIGl0LCB0aGVyZWZvcmUgdW5ibG9jayB0aGUgY29udHJvbFxuXHRcdFx0XHRhY3Rpdml0aWVzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgbWV0YVBhdGgpO1xuXHRcdFx0XHRhY3Rpdml0eUtleSA9IGdldEFjdGl2aXR5S2V5RnJvbVBhdGgobWVzc2FnZS5jbGllbnRDb250ZW50KTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgbWV0YVBhdGgsIGFjdGl2aXRpZXM/LmZpbHRlcigoYSkgPT4gYS5rZXkgIT09IGFjdGl2aXR5S2V5KSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5cyBhIG1lc3NhZ2UgdGhhdCB0aGUgY3VycmVudCBkcmFmdCB3YXMgY2xvc2VkIGJlIGFub3RoZXIgdXNlciwgYW5kIG5hdmlnYXRlcyBiYWNrIHRvIGEgcHJvcGVyIHZpZXcuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIG5hdmlnYXRlIHRvXG5cdCAqIEBwYXJhbSBtZXNzYWdlVGV4dCBUaGUgbWVzc2FnZSB0byBkaXNwbGF5XG5cdCAqL1xuXHRkcmFmdENsb3NlZEJ5T3RoZXJVc2VyKHZpZXc6IEZFVmlldywgcGF0aDogc3RyaW5nLCBtZXNzYWdlVGV4dDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5kaXNjb25uZWN0KHZpZXcpO1xuXHRcdE1lc3NhZ2VCb3guaW5mb3JtYXRpb24obWVzc2FnZVRleHQsIHtcblx0XHRcdG9uQ2xvc2U6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGUocGF0aCwgdmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlBlbmRpbmcgQ2hhbmdlcyBjb3VsZCBub3QgYmUgcmVzZXQgLSBzdGlsbCBuYXZpZ2F0aW5nIHRvIGFjdGl2ZSBpbnN0YW5jZVwiKTtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlKHBhdGgsIHZpZXcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyBkYXRhIHdoZW4gYSBDSEFOR0UgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZC5cblx0ICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcblx0ICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgd2Vic29ja2V0XG5cdCAqL1xuXHR1cGRhdGVPbkNoYW5nZSh2aWV3OiBGRVZpZXcsIG1lc3NhZ2U6IE1lc3NhZ2UpOiB2b2lkIHtcblx0XHRjb25zdCB1cGRhdGVkT2JqZWN0c1BhdGhzID0gbWVzc2FnZS5jbGllbnRDb250ZW50LnNwbGl0KFwifFwiKTtcblxuXHRcdGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5nZXRDdXJyZW50UGFnZSh2aWV3KTtcblx0XHRjb25zdCBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgcmVxdWVzdFByb21pc2VzID0gdXBkYXRlZE9iamVjdHNQYXRocy5tYXAoYXN5bmMgKHBhdGgpID0+IHRoaXMuYXBwbHlVcGRhdGVzRm9yQ2hhbmdlKHZpZXcsIHBhdGgpKTtcblxuXHRcdC8vIFNpbXVsYXRlIGFueSBjaGFuZ2Ugc28gdGhlIGVkaXQgZmxvdyBzaG93cyB0aGUgZHJhZnQgaW5kaWNhdG9yIGFuZCBzZXRzIHRoZSBwYWdlIHRvIGRpcnR5XG5cdFx0Y3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLmVkaXRGbG93LnVwZGF0ZURvY3VtZW50KGN1cnJlbnRDb250ZXh0LCBQcm9taXNlLmFsbChyZXF1ZXN0UHJvbWlzZXMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIGRhdGEgY29ycmVzcG9uZGluZyB0byBhIHBhdGguXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGhGb3JVcGRhdGUgQWJzb2x1dGUgcGF0aCB0byB0aGUgdXBkYXRlZCBwcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgZGF0YSBhbmQgaXRzIHJlbGF0ZWQgc2lkZSBlZmZlY3RzIGhhdmUgYmVlbiByZWNlaXZlZFxuXHQgKi9cblx0YXN5bmMgYXBwbHlVcGRhdGVzRm9yQ2hhbmdlKHZpZXc6IEZFVmlldywgcHJvcGVydHlQYXRoRm9yVXBkYXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSB2aWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocHJvcGVydHlQYXRoRm9yVXBkYXRlKTtcblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3QgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPFByb3BlcnR5PihtZXRhQ29udGV4dCk7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udGV4dFBhdGggPSBwcm9wZXJ0eVBhdGhGb3JVcGRhdGUuc3Vic3RyaW5nKDAsIHByb3BlcnR5UGF0aEZvclVwZGF0ZS5sYXN0SW5kZXhPZihcIi9cIikpOyAvLyBSZW1vdmUgcHJvcGVydHkgbmFtZVxuXHRcdGNvbnN0IHRhcmdldENvbnRleHQgPSB0aGlzLmZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXcsIHRhcmdldENvbnRleHRQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRDb2xsZWN0aW9uUGF0aCA9IHRhcmdldENvbnRleHRQYXRoLnN1YnN0cmluZygwLCB0YXJnZXRDb250ZXh0UGF0aC5sYXN0SW5kZXhPZihcIihcIikpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRleHRQYXRoID0gcGFyZW50Q29sbGVjdGlvblBhdGguc3Vic3RyaW5nKDAsIHBhcmVudENvbGxlY3Rpb25QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IHBhcmVudENvbnRleHRQYXRoID8gdGhpcy5maW5kQ29udGV4dEZvclVwZGF0ZSh2aWV3LCBwYXJlbnRDb250ZXh0UGF0aCkgOiB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIXRhcmdldENvbnRleHQgJiYgIXBhcmVudENvbnRleHQpIHtcblx0XHRcdHJldHVybjsgLy8gTm8gY29udGV4dCBmb3IgdXBkYXRlXG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzUHJvbWlzZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNTZXJ2aWNlID0gQ29sbGFib3JhdGlvblV0aWxzLmdldEFwcENvbXBvbmVudCh2aWV3KS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblxuXHRcdFx0aWYgKHRhcmdldENvbnRleHQpIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSBhIHRhcmdldCBjb250ZXh0LCBzbyB3ZSBjYW4gcmV0cmlldmUgdGhlIHVwZGF0ZWQgcHJvcGVydHlcblx0XHRcdFx0Y29uc3QgdGFyZ2V0TWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRjb25zdCByZWxhdGl2ZU1ldGFQYXRoRm9yVXBkYXRlID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHByb3BlcnR5UGF0aEZvclVwZGF0ZSkucmVwbGFjZSh0YXJnZXRNZXRhUGF0aCwgXCJcIikuc2xpY2UoMSk7XG5cdFx0XHRcdHNpZGVFZmZlY3RzUHJvbWlzZXMucHVzaChzaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtyZWxhdGl2ZU1ldGFQYXRoRm9yVXBkYXRlXSwgdGFyZ2V0Q29udGV4dCwgU1lOQ0dST1VQSUQpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gR2V0IHRoZSBmaWVsZEdyb3VwSWRzIGNvcnJlc3BvbmRpbmcgdG8gcGF0aEZvclVwZGF0ZVxuXHRcdFx0Y29uc3QgZmllbGRHcm91cElkcyA9IHNpZGVFZmZlY3RzU2VydmljZS5jb21wdXRlRmllbGRHcm91cElkcyhcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0LnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRkYXRhTW9kZWxPYmplY3QudGFyZ2V0T2JqZWN0IS5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdCk7XG5cblx0XHRcdC8vIEV4ZWN1dGUgdGhlIHNpZGUgZWZmZWN0cyBmb3IgdGhlIGZpZWxkR3JvdXBJZHNcblx0XHRcdGlmIChmaWVsZEdyb3VwSWRzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBwYWdlQ29udHJvbGxlciA9IHZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXAgPSBwYWdlQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuZ2V0U2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3Vwcyhcblx0XHRcdFx0XHRmaWVsZEdyb3VwSWRzLFxuXHRcdFx0XHRcdHRhcmdldENvbnRleHQgfHwgcGFyZW50Q29udGV4dFxuXHRcdFx0XHQpIGFzIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cdFx0XHRcdE9iamVjdC5rZXlzKHNpZGVFZmZlY3RzTWFwRm9yRmllbGRHcm91cCkuZm9yRWFjaCgoc2lkZUVmZmVjdE5hbWUpID0+IHtcblx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0ID0gc2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3VwW3NpZGVFZmZlY3ROYW1lXTtcblx0XHRcdFx0XHRzaWRlRWZmZWN0c1Byb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRwYWdlQ29udHJvbGxlci5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0LnNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0LmNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFNZTkNHUk9VUElELFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoc2lkZUVmZmVjdHNQcm9taXNlcyk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJGYWlsZWQgdG8gdXBkYXRlIGRhdGEgYWZ0ZXIgY2hhbmdlOlwiICsgZXJyKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyBkYXRhIHdoZW4gYSBERUxFVEUgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZC5cblx0ICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcblx0ICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgd2Vic29ja2V0XG5cdCAqL1xuXHR1cGRhdGVPbkRlbGV0ZSh2aWV3OiBWaWV3LCBtZXNzYWdlOiBNZXNzYWdlKTogdm9pZCB7XG5cdFx0Y29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLmdldEN1cnJlbnRQYWdlKHZpZXcpO1xuXHRcdGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY3VycmVudFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBjdXJyZW50UGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKTtcblxuXHRcdGNvbnN0IGRlbGV0ZWRPYmplY3RQYXRocyA9IG1lc3NhZ2UuY2xpZW50Q29udGVudC5zcGxpdChcInxcIik7XG5cblx0XHQvLyBjaGVjayBpZiB1c2VyIGN1cnJlbnRseSBkaXNwbGF5cyBhIGRlbGV0ZWQgb2JqZWN0IG9yIG9uZSBvZiBpdHMgZGVzY2VuZGFudHNcblx0XHRjb25zdCBkZWxldGVkUGF0aEluVXNlID0gZGVsZXRlZE9iamVjdFBhdGhzLmZpbmQoKGRlbGV0ZWRQYXRoKSA9PiBjdXJyZW50UGF0aC5zdGFydHNXaXRoKGRlbGV0ZWRQYXRoKSk7XG5cdFx0aWYgKGRlbGV0ZWRQYXRoSW5Vc2UpIHtcblx0XHRcdC8vIGFueSBvdGhlciB1c2VyIGRlbGV0ZWQgdGhlIG9iamVjdCBJJ20gY3VycmVudGx5IGxvb2tpbmcgYXQuIEluZm9ybSB0aGUgdXNlciB3ZSB3aWxsIG5hdmlnYXRlIHRvIHJvb3Qgbm93XG5cdFx0XHRNZXNzYWdlQm94LmluZm9ybWF0aW9uKENvbGxhYm9yYXRpb25VdGlscy5nZXRUZXh0KFwiQ19DT0xMQUJPUkFUSU9ORFJBRlRfREVMRVRFXCIsIG1lc3NhZ2UudXNlckRlc2NyaXB0aW9uKSwge1xuXHRcdFx0XHRvbkNsb3NlOiAoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gV2UgcmV0cmlldmUgdGhlIGRlbGV0ZWQgY29udGV4dCBhcyBhIGtlZXAtYWxpdmUsIGFuZCBkaXNhYmxlIGl0cyBrZWVwYWxpdmUgc3RhdHVzLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVzdHJveWVkIHdoZW4gcmVmcmVzaGluZyBkYXRhXG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0S2VlcEFsaXZlQ29udGV4dChkZWxldGVkUGF0aEluVXNlKTtcblx0XHRcdFx0XHR0YXJnZXRDb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0Y29uc3QgcmVxdWVzdFByb21pc2UgPSB0aGlzLmFwcGx5VXBkYXRlc0ZvckNvbGxlY3Rpb24odmlldywgZGVsZXRlZE9iamVjdFBhdGhzWzBdKTtcblx0XHRcdFx0XHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuZWRpdEZsb3cudXBkYXRlRG9jdW1lbnQoY3VycmVudFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSwgcmVxdWVzdFByb21pc2UpO1xuXHRcdFx0XHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCh0YXJnZXRDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHJlcXVlc3RQcm9taXNlID0gdGhpcy5hcHBseVVwZGF0ZXNGb3JDb2xsZWN0aW9uKHZpZXcsIGRlbGV0ZWRPYmplY3RQYXRoc1swXSk7XG5cdFx0XHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuZWRpdEZsb3cudXBkYXRlRG9jdW1lbnQoY3VycmVudFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSwgcmVxdWVzdFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIGRhdGEgd2hlbiBhIENSRUFURSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLlxuXHQgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuXHQgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXRcblx0ICovXG5cdHVwZGF0ZU9uQ3JlYXRlKHZpZXc6IFZpZXcsIG1lc3NhZ2U6IE1lc3NhZ2UpOiB2b2lkIHtcblx0XHRjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuZ2V0Q3VycmVudFBhZ2Uodmlldyk7XG5cdFx0Y29uc3QgY3JlYXRlZE9iamVjdFBhdGhzID0gbWVzc2FnZS5jbGllbnRDb250ZW50LnNwbGl0KFwifFwiKTtcblxuXHRcdGNvbnN0IHJlcXVlc3RQcm9taXNlID0gdGhpcy5hcHBseVVwZGF0ZXNGb3JDb2xsZWN0aW9uKHZpZXcsIGNyZWF0ZWRPYmplY3RQYXRoc1swXSk7XG5cdFx0Ly8gU2ltdWxhdGUgYSBjaGFuZ2Ugc28gdGhlIGVkaXQgZmxvdyBzaG93cyB0aGUgZHJhZnQgaW5kaWNhdG9yIGFuZCBzZXRzIHRoZSBwYWdlIHRvIGRpcnR5XG5cdFx0Y3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLmVkaXRGbG93LnVwZGF0ZURvY3VtZW50KGN1cnJlbnRQYWdlLmdldEJpbmRpbmdDb250ZXh0KCksIHJlcXVlc3RQcm9taXNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIGRhdGEgaW4gYSBjb2xsZWN0aW9uLlxuXHQgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuXHQgKiBAcGFyYW0gcGF0aEluQ29sbGVjdGlvbiBBIHBhdGggdG8gYW4gZW50aXR5IGluIHRoZSBjb2xsZWN0aW9uXG5cdCAqL1xuXHRhc3luYyBhcHBseVVwZGF0ZXNGb3JDb2xsZWN0aW9uKHZpZXc6IFZpZXcsIHBhdGhJbkNvbGxlY3Rpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbGxhYm9yYXRpb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdFx0Y29uc3QgcGFyZW50UGF0aCA9IHBhdGhJbkNvbGxlY3Rpb24uc3Vic3RyaW5nKDAsIHBhdGhJbkNvbGxlY3Rpb24ubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0ID0gdGhpcy5maW5kQ29udGV4dEZvclVwZGF0ZSh2aWV3LCBwYXJlbnRQYXRoKTtcblxuXHRcdGlmIChwYXJlbnRDb250ZXh0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0c1Byb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblxuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBwYXJlbnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRoRm9yVXBkYXRlID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhdGhJbkNvbGxlY3Rpb24pO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChwYXJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IG1ldGFQYXRoRm9yVXBkYXRlLnJlcGxhY2UoYCR7cGFyZW50TWV0YVBhdGh9L2AsIFwiXCIpO1xuXG5cdFx0XHRcdC8vIFJlbG9hZCB0aGUgY29sbGVjdGlvblxuXHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRcdHNpZGVFZmZlY3RzUHJvbWlzZXMucHVzaChzaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtyZWxhdGl2ZVBhdGhdLCBwYXJlbnRDb250ZXh0LCBTWU5DR1JPVVBJRCkpO1xuXG5cdFx0XHRcdC8vIFJlcXVlc3QgdGhlIHNpZGUgZWZmZWN0cyBmb3IgdGhlIGNvbGxlY3Rpb25cblx0XHRcdFx0c2lkZUVmZmVjdHNQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkocmVsYXRpdmVQYXRoLCBwYXJlbnRDb250ZXh0LCBTWU5DR1JPVVBJRCwgdHJ1ZSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbChzaWRlRWZmZWN0c1Byb21pc2VzKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJGYWlsZWQgdG8gdXBkYXRlIGRhdGEgYWZ0ZXIgY29sbGVjdGlvbiB1cGRhdGU6XCIgKyBlcnIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIGRhdGEgd2hlbiBhIEFDVElPTiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLlxuXHQgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuXHQgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXRcblx0ICovXG5cdHVwZGF0ZU9uQWN0aW9uKHZpZXc6IEZFVmlldywgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWQge1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5nZXRDdXJyZW50UGFnZSh2aWV3KTtcblx0XHRjb25zdCBwYXRoc0ZvckFjdGlvbiA9IG1lc3NhZ2UuY2xpZW50Q29udGVudC5zcGxpdChcInxcIik7XG5cdFx0Y29uc3QgYWN0aW9uTmFtZSA9IG1lc3NhZ2UuY2xpZW50VHJpZ2dlcmVkQWN0aW9uTmFtZSB8fCBcIlwiO1xuXHRcdGNvbnN0IHJlcXVlc3RlZFByb3BlcnRpZXMgPSBtZXNzYWdlLmNsaWVudFJlcXVlc3RlZFByb3BlcnRpZXM/LnNwbGl0KFwifFwiKTtcblx0XHRjb25zdCByZWZyZXNoTGlzdEJpbmRpbmcgPSBtZXNzYWdlLmNsaWVudFJlZnJlc2hMaXN0QmluZGluZyA9PT0gXCJ0cnVlXCI7XG5cblx0XHRsZXQgcmVxdWVzdFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuXHRcdGlmIChyZWZyZXNoTGlzdEJpbmRpbmcpIHtcblx0XHRcdHJlcXVlc3RQcm9taXNlcy5wdXNoKHRoaXMuYXBwbHlVcGRhdGVzRm9yQ29sbGVjdGlvbih2aWV3LCBwYXRoc0ZvckFjdGlvblswXSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXF1ZXN0UHJvbWlzZXMgPSBwYXRoc0ZvckFjdGlvbi5tYXAoYXN5bmMgKHBhdGgpID0+IHRoaXMucmVxdWVzdFVwZGF0ZUZvckFjdGlvbih2aWV3LCBwYXRoLCBhY3Rpb25OYW1lLCByZXF1ZXN0ZWRQcm9wZXJ0aWVzKSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2ltdWxhdGUgYW55IGNoYW5nZSBzbyB0aGUgZWRpdCBmbG93IHNob3dzIHRoZSBkcmFmdCBpbmRpY2F0b3IgYW5kIHNldHMgdGhlIHBhZ2UgdG8gZGlydHlcblx0XHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuZWRpdEZsb3cudXBkYXRlRG9jdW1lbnQoY3VycmVudFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSwgUHJvbWlzZS5hbGwocmVxdWVzdFByb21pc2VzKSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyBzaWRlLWVmZmVjdHMgZGF0YSB3aGVuIGFuIGFjdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgb24gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuXHQgKiBAcGFyYW0gcGF0aEZvckFjdGlvbiBQYXRoIG9mIHRoZSBjb250ZXh0IHRvIGFwcGx5IHRoZSBhY3Rpb24gdG9cblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSByZXF1ZXN0ZWRQcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgc2lkZS1lZmZlY3RzIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG5cdCAqL1xuXHRhc3luYyByZXF1ZXN0VXBkYXRlRm9yQWN0aW9uKHZpZXc6IEZFVmlldywgcGF0aEZvckFjdGlvbjogc3RyaW5nLCBhY3Rpb25OYW1lOiBzdHJpbmcsIHJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRhcmdldENvbnRleHQgPSB0aGlzLmZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXcsIHBhdGhGb3JBY3Rpb24pO1xuXHRcdGlmICghdGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbGxhYm9yYXRpb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdFNlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNGcm9tQWN0aW9uID0gc2lkZUVmZmVjdFNlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhhY3Rpb25OYW1lLCB0YXJnZXRDb250ZXh0KTtcblx0XHRjb25zdCBzaWRlRWZmZWN0UHJvbWlzZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuXHRcdGlmIChzaWRlRWZmZWN0c0Zyb21BY3Rpb24pIHtcblx0XHRcdGlmIChzaWRlRWZmZWN0c0Zyb21BY3Rpb24ucGF0aEV4cHJlc3Npb25zPy5sZW5ndGgpIHtcblx0XHRcdFx0c2lkZUVmZmVjdFByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzRnJvbUFjdGlvbi5wYXRoRXhwcmVzc2lvbnMsIHRhcmdldENvbnRleHQsIFNZTkNHUk9VUElEKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAocmVxdWVzdGVkUHJvcGVydGllcyAmJiByZXF1ZXN0ZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY2xlYW4tdXAgb2YgdGhlIHByb3BlcnRpZXMgdG8gcmVxdWVzdCBsaXN0OlxuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YVBhdGhGb3JBY3Rpb24gPSB0aGlzLmNhbGN1bGF0ZU1ldGFQYXRoKHZpZXcsIHBhdGhGb3JBY3Rpb24pO1xuXHRcdFx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldENvbnRleHQobWV0YVBhdGhGb3JBY3Rpb24pKTtcblx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllc1xuXHRcdFx0XHQubWFwKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHkubmFtZTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbHRlcigocHJvcCkgPT4gcmVxdWVzdGVkUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wKSk7XG5cdFx0XHRpZiAocHJvcGVydGllc1RvUmVxdWVzdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHNpZGVFZmZlY3RQcm9taXNlcy5wdXNoKHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhwcm9wZXJ0aWVzVG9SZXF1ZXN0LCB0YXJnZXRDb250ZXh0LCBTWU5DR1JPVVBJRCkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKHNpZGVFZmZlY3RQcm9taXNlcyk7XG5cdH1cblxuXHQvKipcblx0ICogRmluZHMgYSBjb250ZXh0IHRvIGFwcGx5IGFuIHVwZGF0ZSBtZXNzYWdlIChDSEFOR0UsIENSRUFURSwgREVMRVRFIG9yIEFDVElPTikuXG5cdCAqIEBwYXJhbSB2aWV3ICBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuXHQgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgY29udGV4dCB0byBiZSBmb3VuZCAoc2hhbGwgcG9pbnQgdG8gYW4gZW50aXR5LCBub3QgYSBwcm9wZXJ0eSlcblx0ICogQHJldHVybnMgQSBjb250ZXh0IGlmIGl0IGNvdWxkIGJlIGZvdW5kXG5cdCAqL1xuXHRmaW5kQ29udGV4dEZvclVwZGF0ZSh2aWV3OiBWaWV3LCBwYXRoOiBzdHJpbmcpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXBhdGgpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdC8vIEZpbmQgYWxsIHBvdGVudGlhbCBwYXRoc1xuXHRcdGNvbnN0IHRhcmdldFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHdoaWxlICghcGF0aC5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdHRhcmdldFBhdGhzLnVuc2hpZnQocGF0aCk7XG5cdFx0XHRwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRcdH1cblx0XHR0YXJnZXRQYXRocy51bnNoaWZ0KHBhdGgpO1xuXG5cdFx0Y29uc3QgcGFyZW50Q29sbGVjdGlvblBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7IC8vIFJlbW92ZSB0aGUgbGFzdCBrZXlcblxuXHRcdGxldCB0YXJnZXRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGxldCBjdXJyZW50Q29udGV4dCA9IHRoaXMuZ2V0Q3VycmVudFBhZ2UodmlldykuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdHdoaWxlIChjdXJyZW50Q29udGV4dCAmJiAhdGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0aWYgKHRhcmdldFBhdGhzLmluY2x1ZGVzKGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdFx0dGFyZ2V0Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0LmdldEJpbmRpbmcoKT8uZ2V0Q29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHRhcmdldENvbnRleHQpIHtcblx0XHRcdC8vIEZvdW5kICFcblx0XHRcdHJldHVybiB0YXJnZXRDb250ZXh0O1xuXHRcdH1cblxuXHRcdC8vIFRyeSB0byBmaW5kIHRoZSB0YXJnZXQgY29udGV4dCBpbiBhIGxpc3RCaW5kaW5nXG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldEN1cnJlbnRQYWdlKHZpZXcpLmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBwYXJlbnRMaXN0QmluZGluZyA9IG1vZGVsLmdldEFsbEJpbmRpbmdzKCkuZmluZCgoYmluZGluZykgPT4ge1xuXHRcdFx0Y29uc3QgYmluZGluZ1BhdGggPSBiaW5kaW5nLmlzUmVsYXRpdmUoKSA/IGJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBiaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdHJldHVybiBiaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpICYmIGJpbmRpbmdQYXRoID09PSBwYXJlbnRDb2xsZWN0aW9uUGF0aDtcblx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdC8vIFdlJ3ZlIGZvdW5kIGEgbGlzdCBiaW5kaW5nIHRoYXQgY291bGQgY29udGFpbiB0aGUgdGFyZ2V0IGNvbnRleHQgLS0+IGxvb2sgZm9yIGl0XG5cdFx0dGFyZ2V0Q29udGV4dCA9IHBhcmVudExpc3RCaW5kaW5nPy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRyZXR1cm4gdGFyZ2V0UGF0aHMuaW5jbHVkZXMoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRhcmdldENvbnRleHQ7XG5cdH1cblxuXHRuYXZpZ2F0ZShwYXRoOiBzdHJpbmcsIHZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdC8vIFRPRE86IHJvdXRpbmcubmF2aWdhdGUgZG9lc24ndCBjb25zaWRlciBzZW1hbnRpYyBib29rbWFya2luZ1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5nZXRDdXJyZW50UGFnZSh2aWV3KTtcblx0XHRjb25zdCB0YXJnZXRDb250ZXh0ID0gdmlldy5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KHBhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdFx0aWYgKGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5lZGl0Rmxvdy5nZXRDcmVhdGlvbk1vZGUoKSkge1xuXHRcdFx0Ly8gSWYgdGhlIG9iamVjdCB3YXMgYSBuZXdseSBjcmVhdGVkIG9uZSwgd2UgbmF2aWdhdGUgYmFja1xuXHRcdFx0Y3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHRhcmdldENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlcndpc2Ugd2UgbmF2aWdhdGUgdG8gdGhlIGNvbnRleHQsIGJ1dCB3ZSBmb3JjZSBpdHMgcmVjcmVhdGlvbiBzbyB0aGF0IGFsbCAkc2VsZWN0cyBhcmUgcHJvcGVybHkgY29tcHV0ZWQgYnkgaW50ZXJuYWxSb3V0aW5nXG5cdFx0XHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuX3JvdXRpbmcubmF2aWdhdGVUb0NvbnRleHQodGFyZ2V0Q29udGV4dCwgeyByZWNyZWF0ZUNvbnRleHQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q3VycmVudFBhZ2UodmlldzogVmlldyk6IEZFVmlldyB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29sbGFib3JhdGlvblV0aWxzLmdldEFwcENvbXBvbmVudCh2aWV3KTtcblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0Q3VycmVudFBhZ2VWaWV3KGFwcENvbXBvbmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgbWV0YXBhdGggZnJvbSBvbmUgb3IgbW9yZSBkYXRhIHBhdGgocykuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSBjdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIHBhdGggT25lIG9yZSBtb3JlIGRhdGEgcGF0aChzKSwgaW4gY2FzZSBvZiBtdWx0aXBsZSBwYXRocyBzZXBhcmF0ZWQgYnkgJ3wnXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxjdWxhdGVkIG1ldGFQYXRoXG5cdCAqL1xuXHRjYWxjdWxhdGVNZXRhUGF0aCh2aWV3OiBGRVZpZXcsIHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBtZXRhUGF0aCA9IFwiXCI7XG5cdFx0aWYgKHBhdGgpIHtcblx0XHRcdC8vIGluIGNhc2UgbW9yZSB0aGFuIG9uZSBwYXRoIGlzIHNlbnQgYWxsIG9mIHRoZW0gaGF2ZSB0byB1c2UgdGhlIHNhbWUgbWV0YXBhdGggdGhlcmVmb3JlIHdlIGp1c3QgY29uc2lkZXIgdGhlIGZpcnN0IG9uZVxuXHRcdFx0Y29uc3QgZGF0YVBhdGggPSBwYXRoLnNwbGl0KFwifFwiKVswXTtcblx0XHRcdG1ldGFQYXRoID0gdmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKGRhdGFQYXRoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1ldGFQYXRoO1xuXHR9XG5cblx0aW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZUZhY3Rvcnk+IHtcblx0cHVibGljIGFzeW5jIGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZUZhY3Rvcnk+KTogUHJvbWlzZTxDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlPiB7XG5cdFx0Y29uc3QgY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSA9IG5ldyBDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIGNvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UuaW5pdFByb21pc2U7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF5QkEsTUFBTUEsWUFBWSxHQUFHLDZCQUE2QjtFQUNsRCxNQUFNQyxXQUFXLEdBQUcsNEJBQTRCO0VBQ2hELE1BQU1DLFVB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
@@ -409,7 +409,7 @@ export class CollaborativeDraftService extends Service<CollaborativeDraftService
409
409
  if (message.userAction === Activity.JoinEcho) {
410
410
  if (message.clientContent) {
411
411
  // another user was already typing therefore I want to see his activity immediately. Calling me again as a live change
412
- message.userAction = Activity.Lock;
412
+ message.userAction = Activity.LockEcho;
413
413
  this.messageReceive(message, view);
414
414
  }
415
415
  }
@@ -508,6 +508,7 @@ export class CollaborativeDraftService extends Service<CollaborativeDraftService
508
508
  break;
509
509
 
510
510
  case Activity.Lock:
511
+ case Activity.LockEcho:
511
512
  mactivity = sender;
512
513
  mactivity.key = getActivityKeyFromPath(message.clientContent);
513
514
 
@@ -525,6 +526,11 @@ export class CollaborativeDraftService extends Service<CollaborativeDraftService
525
526
  activities = activities?.slice ? activities.slice() : [];
526
527
  activities.push(mactivity);
527
528
  internalModel.setProperty(ACTIVITIES + metaPath, activities);
529
+ if (message.userAction === Activity.LockEcho && this.checkPathForLock(internalModel, message.clientContent)) {
530
+ // The current user has locked this path right after connection, before knowing it was already locked by someone else
531
+ // --> remove the current lock
532
+ this.doSend(internalModel, Activity.Unlock, message.clientContent);
533
+ }
528
534
  break;
529
535
 
530
536
  case Activity.Unlock: