@magic-xpa/engine 4.800.0-dev480.94 → 4.801.0-dev000.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/esm2020/index.mjs +190 -0
  2. package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
  3. package/esm2020/src/AccessHelper.mjs +3 -0
  4. package/esm2020/src/ClientManager.mjs +403 -0
  5. package/esm2020/src/CommandsProcessorBase.mjs +58 -0
  6. package/esm2020/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2020/src/CommandsTable.mjs +163 -0
  8. package/esm2020/src/ConstInterface.mjs +729 -0
  9. package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
  10. package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
  11. package/esm2020/src/GUIManager.mjs +63 -0
  12. package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
  13. package/esm2020/src/GuiEventsProcessor.mjs +171 -0
  14. package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
  15. package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
  16. package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
  17. package/esm2020/src/bridge/MagicBridge.mjs +41 -0
  18. package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
  19. package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
  20. package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
  21. package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
  22. package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -0
  23. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs +15 -0
  24. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -0
  26. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
  27. package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
  28. package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -0
  29. package/esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +21 -0
  30. package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +20 -0
  31. package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
  32. package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
  33. package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +2 -2
  34. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +36 -0
  35. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +40 -0
  36. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
  37. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
  38. package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
  39. package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
  40. package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -0
  41. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
  42. package/esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -0
  43. package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +21 -0
  44. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
  45. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
  46. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
  47. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +39 -0
  48. package/esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs +15 -0
  49. package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
  50. package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -0
  51. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
  52. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +28 -0
  53. package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
  54. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  55. package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
  56. package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
  57. package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
  58. package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
  59. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
  61. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
  64. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
  65. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
  67. package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
  68. package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
  69. package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
  70. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
  72. package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
  73. package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
  74. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
  75. package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
  76. package/esm2020/src/data/DataView.mjs +1634 -0
  77. package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
  78. package/esm2020/src/data/DataviewManager.mjs +28 -0
  79. package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
  80. package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
  81. package/esm2020/src/data/Field.mjs +645 -0
  82. package/esm2020/src/data/FieldBase.mjs +18 -0
  83. package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
  84. package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
  85. package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
  86. package/esm2020/src/data/Record.mjs +846 -0
  87. package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
  88. package/esm2020/src/data/RecordsTable.mjs +267 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
  91. package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
  92. package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2020/src/env/Environment.mjs +554 -0
  94. package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
  95. package/esm2020/src/env/LanguageData.mjs +222 -0
  96. package/esm2020/src/env/MirrorString.mjs +66 -0
  97. package/esm2020/src/event/ActionManager.mjs +94 -0
  98. package/esm2020/src/event/Event.mjs +1436 -0
  99. package/esm2020/src/event/EventHandler.mjs +773 -0
  100. package/esm2020/src/event/EventHandlerPosition.mjs +201 -0
  101. package/esm2020/src/event/EventsManager.mjs +2983 -0
  102. package/esm2020/src/event/IEventsManager.mjs +7 -0
  103. package/esm2020/src/event/RunTimeEvent.mjs +406 -0
  104. package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
  105. package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
  106. package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
  107. package/esm2020/src/exp/Expression.mjs +200 -0
  108. package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +3 -1
  109. package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
  110. package/esm2020/src/exp/ExpressionLocalJpn.mjs +314 -0
  111. package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
  112. package/esm2020/src/exp/YesNoExp.mjs +41 -0
  113. package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
  114. package/esm2020/src/gui/FormsTable.mjs +66 -0
  115. package/esm2020/src/gui/MgControl.mjs +357 -0
  116. package/esm2020/src/gui/MgForm.mjs +1195 -0
  117. package/esm2020/src/http/HttpManager.mjs +97 -0
  118. package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
  119. package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
  120. package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
  121. package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
  122. package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
  123. package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
  124. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
  128. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
  131. package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
  132. package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
  133. package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
  134. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
  136. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/esm2020/src/remote/ServerError.mjs +44 -0
  138. package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
  139. package/esm2020/src/rt/Argument.mjs +274 -0
  140. package/esm2020/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2020/src/rt/Boundary.mjs +158 -0
  142. package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
  143. package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
  144. package/esm2020/src/rt/DataviewHeaderFactory.mjs +7 -0
  145. package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
  146. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +39 -0
  147. package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
  148. package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
  149. package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
  150. package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
  151. package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
  152. package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
  153. package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
  154. package/esm2020/src/rt/Operation.mjs +745 -0
  155. package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
  156. package/esm2020/src/rt/Recompute.mjs +355 -0
  157. package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
  158. package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
  159. package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
  160. package/esm2020/src/rt/TableCache.mjs +177 -0
  161. package/esm2020/src/rt/TableCacheManager.mjs +67 -0
  162. package/esm2020/src/rt/Transaction.mjs +54 -0
  163. package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
  164. package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
  165. package/esm2020/src/tasks/MGData.mjs +552 -0
  166. package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
  167. package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
  168. package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
  169. package/esm2020/src/tasks/RemoteTaskService.mjs +45 -0
  170. package/esm2020/src/tasks/Task.mjs +2501 -0
  171. package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
  172. package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
  173. package/esm2020/src/tasks/TasksTable.mjs +80 -0
  174. package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
  175. package/esm2020/src/tasks/sort/SortCollection.mjs +72 -0
  176. package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
  177. package/{esm2015/src/util/FlowMonitorQueue.js → esm2020/src/util/FlowMonitorQueue.mjs} +15 -18
  178. package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
  179. package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +2 -1
  180. package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
  181. package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
  182. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
  183. package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
  184. package/esm2020/src/util/ParamParseResult.mjs +8 -0
  185. package/esm2020/src/util/PrmMap.mjs +151 -0
  186. package/esm2020/src/util/Process.mjs +7 -0
  187. package/esm2020/src/util/ReturnResult.mjs +46 -0
  188. package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
  189. package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
  190. package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
  191. package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
  192. package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +613 -420
  193. package/fesm2015/magic-xpa-engine.mjs.map +1 -0
  194. package/fesm2020/magic-xpa-engine.mjs +30705 -0
  195. package/fesm2020/magic-xpa-engine.mjs.map +1 -0
  196. package/index.d.ts +3 -0
  197. package/package.json +27 -13
  198. package/src/AccessHelper.d.ts +1 -1
  199. package/src/CommandsProcessorBase.d.ts +3 -3
  200. package/src/ConstInterface.d.ts +6 -2
  201. package/src/GuiEventsProcessor.d.ts +1 -1
  202. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +1 -2
  203. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +1 -2
  204. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +1 -2
  205. package/src/commands/ClientToServer/CommandFactory.d.ts +1 -0
  206. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +1 -2
  207. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +1 -2
  208. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +1 -2
  209. package/src/commands/ClientToServer/DataviewCommand.d.ts +1 -2
  210. package/src/commands/ClientToServer/EvaluateCommand.d.ts +1 -2
  211. package/src/commands/ClientToServer/EventCommand.d.ts +1 -2
  212. package/src/commands/ClientToServer/ExecOperCommand.d.ts +3 -3
  213. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +1 -2
  214. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +1 -2
  215. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +1 -2
  216. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +1 -2
  217. package/src/commands/ClientToServer/QueryCommand.d.ts +1 -2
  218. package/src/commands/ClientToServer/RecomputeCommand.d.ts +1 -2
  219. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +1 -2
  220. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +1 -2
  221. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +1 -2
  222. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -0
  223. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +1 -2
  224. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +1 -2
  225. package/src/commands/ClientToServer/TransactionCommand.d.ts +1 -2
  226. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +1 -2
  227. package/src/commands/DataViewCommandBase.d.ts +2 -2
  228. package/src/commands/IClientTargetedCommand.d.ts +1 -1
  229. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
  230. package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +0 -1
  231. package/src/data/FieldBase.d.ts +3 -3
  232. package/src/data/Record.d.ts +2 -9
  233. package/src/data/RecordsTable.d.ts +1 -2
  234. package/src/data/XMLBasedDcValuesBuilder.d.ts +1 -1
  235. package/src/env/EnvVariablesTable.d.ts +2 -15
  236. package/src/env/Environment.d.ts +3 -3
  237. package/src/env/MirrorString.d.ts +15 -0
  238. package/src/event/Event.d.ts +0 -3
  239. package/src/event/EventsManager.d.ts +18 -9
  240. package/src/event/IEventsManager.d.ts +6 -6
  241. package/src/exp/ExpressionEvaluator.d.ts +3 -2
  242. package/src/exp/ExpressionLocalJpn.d.ts +2 -2
  243. package/src/exp/GlobalParamsTable.d.ts +2 -1
  244. package/src/gui/MgControl.d.ts +0 -2
  245. package/src/gui/MgForm.d.ts +5 -5
  246. package/src/http/client/HttpClientAsync.d.ts +2 -2
  247. package/src/http/client/HttpClientBase.d.ts +3 -3
  248. package/src/http/client/HttpClientSync.d.ts +2 -2
  249. package/src/remote/RemoteCommandsProcessor.d.ts +1 -1
  250. package/src/rt/DataviewHeaderBase.d.ts +2 -2
  251. package/src/rt/DataviewHeaderFactory.d.ts +1 -1
  252. package/src/rt/Operation.d.ts +3 -4
  253. package/src/rt/RemoteDataviewHeader.d.ts +1 -2
  254. package/src/rt/Transaction.d.ts +1 -1
  255. package/src/tasks/MGData.d.ts +2 -0
  256. package/src/tasks/MGDataCollection.d.ts +1 -0
  257. package/src/tasks/RemoteTaskService.d.ts +2 -3
  258. package/src/tasks/Task.d.ts +1 -2
  259. package/src/tasks/TaskBase.d.ts +7 -7
  260. package/src/tasks/TaskServiceBase.d.ts +2 -4
  261. package/src/tasks/sort/SortCollection.d.ts +2 -3
  262. package/src/util/FlowMonitorQueue.d.ts +1 -1
  263. package/src/util/IMirrorXML.d.ts +1 -1
  264. package/src/util/ParamParseResult.d.ts +6 -0
  265. package/src/util/PrmMap.d.ts +1 -6
  266. package/src/util/Process.d.ts +1 -1
  267. package/bundles/magic-xpa-engine.umd.js +0 -37878
  268. package/bundles/magic-xpa-engine.umd.js.map +0 -1
  269. package/bundles/magic-xpa-engine.umd.min.js +0 -16
  270. package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
  271. package/esm2015/index.js +0 -187
  272. package/esm2015/src/AccessHelper.js +0 -3
  273. package/esm2015/src/ClientManager.js +0 -412
  274. package/esm2015/src/CommandsProcessorBase.js +0 -54
  275. package/esm2015/src/CommandsProcessorManager.js +0 -31
  276. package/esm2015/src/CommandsTable.js +0 -166
  277. package/esm2015/src/ConstInterface.js +0 -725
  278. package/esm2015/src/GUIManager.js +0 -72
  279. package/esm2015/src/GuiEventsProcessor.js +0 -171
  280. package/esm2015/src/bridge/MagicBridge.js +0 -44
  281. package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +0 -24
  282. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js +0 -15
  283. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js +0 -60
  284. package/esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js +0 -26
  285. package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -269
  286. package/esm2015/src/commands/ClientToServer/ComputeEventCommand.js +0 -23
  287. package/esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js +0 -21
  288. package/esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js +0 -20
  289. package/esm2015/src/commands/ClientToServer/EvaluateCommand.js +0 -36
  290. package/esm2015/src/commands/ClientToServer/EventCommand.js +0 -40
  291. package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +0 -64
  292. package/esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js +0 -22
  293. package/esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js +0 -21
  294. package/esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js +0 -23
  295. package/esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js +0 -23
  296. package/esm2015/src/commands/ClientToServer/QueryCommand.js +0 -21
  297. package/esm2015/src/commands/ClientToServer/RecomputeCommand.js +0 -27
  298. package/esm2015/src/commands/ClientToServer/RefreshEventCommand.js +0 -27
  299. package/esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js +0 -24
  300. package/esm2015/src/commands/ClientToServer/RollbackEventCommand.js +0 -39
  301. package/esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js +0 -21
  302. package/esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js +0 -24
  303. package/esm2015/src/commands/ClientToServer/TransactionCommand.js +0 -28
  304. package/esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js +0 -18
  305. package/esm2015/src/commands/DataViewCommandBase.js +0 -6
  306. package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
  307. package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
  308. package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
  309. package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
  310. package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
  311. package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
  312. package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -54
  313. package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
  314. package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
  315. package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
  316. package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
  317. package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
  318. package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
  319. package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
  320. package/esm2015/src/data/DataView.js +0 -1693
  321. package/esm2015/src/data/DataviewManager.js +0 -31
  322. package/esm2015/src/data/DataviewManagerBase.js +0 -18
  323. package/esm2015/src/data/Field.js +0 -672
  324. package/esm2015/src/data/FieldBase.js +0 -9
  325. package/esm2015/src/data/Record.js +0 -914
  326. package/esm2015/src/data/RecordsTable.js +0 -267
  327. package/esm2015/src/data/TaskTransactionManager.js +0 -110
  328. package/esm2015/src/data/XMLBasedDcValuesBuilder.js +0 -74
  329. package/esm2015/src/env/EnvVariablesTable.js +0 -408
  330. package/esm2015/src/env/Environment.js +0 -553
  331. package/esm2015/src/env/LanguageData.js +0 -230
  332. package/esm2015/src/event/ActionManager.js +0 -93
  333. package/esm2015/src/event/Event.js +0 -1449
  334. package/esm2015/src/event/EventHandler.js +0 -781
  335. package/esm2015/src/event/EventHandlerPosition.js +0 -201
  336. package/esm2015/src/event/EventsManager.js +0 -3007
  337. package/esm2015/src/event/IEventsManager.js +0 -7
  338. package/esm2015/src/event/RunTimeEvent.js +0 -406
  339. package/esm2015/src/exp/Expression.js +0 -209
  340. package/esm2015/src/exp/ExpressionEvaluator.js +0 -4430
  341. package/esm2015/src/exp/ExpressionLocalJpn.js +0 -314
  342. package/esm2015/src/exp/GlobalParamsTable.js +0 -84
  343. package/esm2015/src/exp/YesNoExp.js +0 -44
  344. package/esm2015/src/gui/FormsTable.js +0 -73
  345. package/esm2015/src/gui/MgControl.js +0 -438
  346. package/esm2015/src/gui/MgForm.js +0 -1300
  347. package/esm2015/src/http/HttpManager.js +0 -100
  348. package/esm2015/src/http/client/HttpClientAsync.js +0 -72
  349. package/esm2015/src/http/client/HttpClientBase.js +0 -148
  350. package/esm2015/src/http/client/HttpClientSync.js +0 -47
  351. package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
  352. package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
  353. package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
  354. package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -876
  355. package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
  356. package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
  357. package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
  358. package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
  359. package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
  360. package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
  361. package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
  362. package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
  363. package/esm2015/src/remote/ServerError.js +0 -45
  364. package/esm2015/src/rt/Argument.js +0 -281
  365. package/esm2015/src/rt/ArgumentsList.js +0 -108
  366. package/esm2015/src/rt/Boundary.js +0 -161
  367. package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
  368. package/esm2015/src/rt/DataviewHeaderFactory.js +0 -7
  369. package/esm2015/src/rt/DataviewHeadersSaxHandler.js +0 -40
  370. package/esm2015/src/rt/Operation.js +0 -792
  371. package/esm2015/src/rt/Recompute.js +0 -372
  372. package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
  373. package/esm2015/src/rt/TableCache.js +0 -182
  374. package/esm2015/src/rt/TableCacheManager.js +0 -70
  375. package/esm2015/src/rt/Transaction.js +0 -54
  376. package/esm2015/src/tasks/MGData.js +0 -551
  377. package/esm2015/src/tasks/MGDataCollection.js +0 -260
  378. package/esm2015/src/tasks/RemoteTaskService.js +0 -45
  379. package/esm2015/src/tasks/Task.js +0 -2593
  380. package/esm2015/src/tasks/TaskServiceBase.js +0 -30
  381. package/esm2015/src/tasks/TasksTable.js +0 -87
  382. package/esm2015/src/tasks/sort/SortCollection.js +0 -72
  383. package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
  384. package/esm2015/src/util/PrmMap.js +0 -147
  385. package/esm2015/src/util/Process.js +0 -7
  386. package/esm2015/src/util/ReturnResult.js +0 -46
  387. package/fesm2015/magic-xpa-engine.js.map +0 -1
@@ -1,2593 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Debug, HashUtils, List, NNumber, NString, RefParam, Stack, StringBuilder } from '@magic-xpa/mscorelib';
3
- import { Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttribute, StrUtil, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
4
- import { Commands, DataModificationTypes, DisplayConvertor, GuiDataCollection, Manager, NUM_TYPE, PIC, PropInterface, RecordUtils, RuntimeContextBase, Styles, TaskDefinitionId, Events, Helps } from '@magic-xpa/gui';
5
- import { DataView } from '../data/DataView';
6
- import { DvCache } from '../data/DvCache';
7
- import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
8
- import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
9
- import { TaskServiceBase } from './TaskServiceBase';
10
- import { TaskTransactionManager } from '../data/TaskTransactionManager';
11
- import { DataviewManager } from '../data/DataviewManager';
12
- import { SortCollection } from './sort/SortCollection';
13
- import { MgForm } from '../gui/MgForm';
14
- import { RemoteTaskService } from './RemoteTaskService';
15
- import { ReturnResult } from '../util/ReturnResult';
16
- import { RunTimeEvent } from '../event/RunTimeEvent';
17
- import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
18
- import { DataviewHeaders } from '../rt/DataviewHeaders';
19
- import { Transaction } from '../rt/Transaction';
20
- import { TasksTable } from './TasksTable';
21
- import { HandlersTable } from '../rt/HandlersTable';
22
- import { RecomputeTable } from '../rt/RecomputeTable';
23
- import { ExpTable } from '../exp/ExpTable';
24
- import { UserEventsTable } from '../event/UserEventsTable';
25
- import { FormsTable } from '../gui/FormsTable';
26
- import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
27
- import { ActionManager } from '../event/ActionManager';
28
- import { ConstInterface } from '../ConstInterface';
29
- import { GUIManager } from '../GUIManager';
30
- import { CommandsProcessorManager } from '../CommandsProcessorManager';
31
- import { EventSubType } from '../enums';
32
- import { OpeningTaskDetails, Task_SubformExecModeEnum, TaskBase } from './TaskBase';
33
- import { LanguageData } from '../env/LanguageData';
34
- import { Environment } from '../env/Environment';
35
- import { LastFocusedManager } from '../rt/LastFocusedManager';
36
- import { GlobalCommandsManager } from '../GlobalCommandsManager';
37
- import { EventsAllowedType } from '../event/IEventsManager';
38
- import { AccessHelper } from '../AccessHelper';
39
- import { isNullOrUndefined } from 'util';
40
- import { MGDataCollection } from './MGDataCollection';
41
- import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
42
- import { EventHandlerPosition } from '../event/EventHandlerPosition';
43
- export var Task_Flow;
44
- (function (Task_Flow) {
45
- Task_Flow[Task_Flow["NONE"] = 0] = "NONE";
46
- Task_Flow[Task_Flow["STEP"] = 1] = "STEP";
47
- Task_Flow[Task_Flow["FAST"] = 2] = "FAST";
48
- })(Task_Flow || (Task_Flow = {}));
49
- export var Task_Direction;
50
- (function (Task_Direction) {
51
- Task_Direction[Task_Direction["BACK"] = -1] = "BACK";
52
- Task_Direction[Task_Direction["NONE"] = 0] = "NONE";
53
- Task_Direction[Task_Direction["FORE"] = 1] = "FORE";
54
- })(Task_Direction || (Task_Direction = {}));
55
- var FlowModeDir;
56
- (function (FlowModeDir) {
57
- FlowModeDir["NONE"] = " ";
58
- FlowModeDir["FAST_BACKWARD"] = "R";
59
- FlowModeDir["FAST_FORWARD"] = "F";
60
- FlowModeDir["STEP_BACKWARD"] = "P";
61
- FlowModeDir["STEP_FORWARD"] = "N";
62
- })(FlowModeDir || (FlowModeDir = {}));
63
- export class Task extends TaskBase {
64
- constructor(parent) {
65
- super();
66
- this._dvCache = null;
67
- this._mgData = null;
68
- this._aborting = false;
69
- this._bExecEndTask = false;
70
- this._isStarted = false;
71
- this._evalOldValues = false;
72
- this._inRecordSuffix = false;
73
- this._cancelWasRaised = false;
74
- this._counter = 0;
75
- this._currStartProgLevel = 0;
76
- this._destinationSubform = false;
77
- this._enableZoomHandler = false;
78
- this._firstRecordCycle = false;
79
- this._originalTaskMode = ' ';
80
- this._inCreateLine = false;
81
- this.InSelect = false;
82
- this.InStartProcess = false;
83
- this._isDestinationCall = false;
84
- this._knownToServer = true;
85
- this._loopStack = null;
86
- this.DelayCommandExecution = false;
87
- this._parentTask = null;
88
- this.ContextTask = null;
89
- this._triggeringTask = null;
90
- this.PathParentTask = null;
91
- this._preventControlChange = false;
92
- this._preventRecordSuffix = false;
93
- this._taskPath = null;
94
- this._tryingToCommit = false;
95
- this._useLoopStack = false;
96
- this._inProcessingTopMostEndTaskSaved = false;
97
- this.InHandleActCancel = false;
98
- this.RuntimeSorts = null;
99
- this.VewFirst = 0;
100
- this.dataViewContent = null;
101
- this.PerformParentRecordPrefix = false;
102
- this.ModeAsParent = false;
103
- this.TaskTransactionManager = null;
104
- this.ExecuteClientSubformRefresh = false;
105
- this.InCommonHandlerBeforeRP = false;
106
- this._taskService = null;
107
- this.hasLocate = false;
108
- this.taskDefinitionId = null;
109
- this.ArgumentsList = null;
110
- this.ConfirmUpdateNo = false;
111
- this.DataSynced = false;
112
- this.UniqueSort = null;
113
- this.RefreshOnVars = null;
114
- this.DvPosDescriptor = null;
115
- this.SubTasks = null;
116
- this.ExpTab = null;
117
- this.UserEvtTab = null;
118
- this.DataviewHeadersTable = null;
119
- this.HandlersTab = null;
120
- this._forms = null;
121
- this.Name = null;
122
- this.PublicName = null;
123
- this.TaskSuffixExecuted = false;
124
- this.RetrunValueExp = 0;
125
- this.SubformControl = null;
126
- if (isNullOrUndefined(parent)) {
127
- this.constructor_0();
128
- return;
129
- }
130
- this.constructor_1(parent);
131
- }
132
- get ParentTask() {
133
- return this._parentTask;
134
- }
135
- set TryingToCommit(value) {
136
- this._tryingToCommit = value;
137
- }
138
- get TryingToCommit() {
139
- return this._tryingToCommit;
140
- }
141
- get TaskService() {
142
- if (this._taskService == null)
143
- this._taskService = new RemoteTaskService();
144
- return this._taskService;
145
- }
146
- static get CommandsProcessor() {
147
- return CommandsProcessorManager.GetCommandsProcessor();
148
- }
149
- get LogicalStudioParentTask() {
150
- if (this.StudioParentTask === null && !super.isMainProg()) {
151
- return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, this._ctlIdx);
152
- }
153
- return this.StudioParentTask;
154
- }
155
- get KnownToServer() {
156
- return this._knownToServer;
157
- }
158
- set Transaction(value) {
159
- this.DataviewManager.CurrentDataviewManager.Transaction = value;
160
- }
161
- get Transaction() {
162
- return this.DataviewManager.CurrentDataviewManager.Transaction;
163
- }
164
- get TaskDefinitionId() {
165
- if (this.taskDefinitionId === null) {
166
- this.taskDefinitionId = new TaskDefinitionId(this._ctlIdx, this.ProgramIsn, this.TaskIsn, this._isPrg);
167
- }
168
- return this.taskDefinitionId;
169
- }
170
- static get IsBlockingBatch() {
171
- return false;
172
- }
173
- constructor_0() {
174
- this.ActionManager = new ActionManager(this);
175
- this.DataView = new DataView(this);
176
- this._flowMonitor = FlowMonitorQueue.Instance;
177
- this.ContextTask = this;
178
- this._dvCache = new DvCache(this);
179
- this.PerformParentRecordPrefix = true;
180
- this.DataviewManager = new DataviewManager(this);
181
- this.allowRemoteCmdExecution = true;
182
- this.TaskTransactionManager = new TaskTransactionManager(this);
183
- }
184
- Init() {
185
- this.DataView.Init();
186
- }
187
- constructor_1(parent) {
188
- this.constructor_0();
189
- this.PathParentTask = parent;
190
- this._parentTask = parent;
191
- this._triggeringTask = null;
192
- this.buildTaskPath();
193
- }
194
- static CreateTask() {
195
- let task = new Task();
196
- task.Init();
197
- return task;
198
- }
199
- isAborting() {
200
- return this._aborting;
201
- }
202
- buildTaskPath() {
203
- this._taskPath = new List();
204
- if (this._parentTask._taskPath !== null)
205
- this._taskPath.AddRange(this._parentTask._taskPath.GetEnumerator());
206
- this._taskPath.push(this);
207
- }
208
- fillData(mgd, openingTaskDetails) {
209
- const _super = Object.create(null, {
210
- isMainProg: { get: () => super.isMainProg }
211
- });
212
- return __awaiter(this, void 0, void 0, function* () {
213
- if (!_super.isMainProg.call(this)) {
214
- if (this._parentTask === null && openingTaskDetails.CallingTask !== null) {
215
- this._parentTask = openingTaskDetails.CallingTask;
216
- this.buildTaskPath();
217
- openingTaskDetails.CallingTask.addSubTask(this);
218
- }
219
- if (this.PathParentTask === null && openingTaskDetails.PathParentTask !== null) {
220
- this.PathParentTask = openingTaskDetails.PathParentTask;
221
- }
222
- }
223
- if (this._parentTask !== null && this._parentTask.getEnableZoomHandler()) {
224
- this.setEnableZoomHandler();
225
- }
226
- this._mgData = mgd;
227
- this.fillAttributes();
228
- this._mgData.addTask(this);
229
- let parentForm = (this._parentTask !== null) ? this._parentTask.getForm() : null;
230
- while (yield this.initInnerObjects(RuntimeContextBase.Instance.Parser.getNextTag(), parentForm)) {
231
- }
232
- this.TaskTransactionManager.PrepareTransactionProperties(this.DataviewManager.RemoteDataviewManager.Transaction, false);
233
- this.HandleTriggerTask();
234
- this.HandlePreviouslyActiveTaskId();
235
- this.CheckAndSetSubForm();
236
- if (this.IsSubForm) {
237
- let subFormCtrl = this.getParent().getForm().getSubFormCtrlForTask(this._taskTag);
238
- if (subFormCtrl !== null) {
239
- subFormCtrl.setSubformTaskId(this._taskTag);
240
- }
241
- if (this.Form !== null) {
242
- this.Form.setSubFormCtrl(subFormCtrl);
243
- }
244
- }
245
- });
246
- }
247
- HandlePreviouslyActiveTaskId() {
248
- if (this._parentTask !== null && this._parentTask.GetContextTask() !== null && this._mgData !== this._parentTask.getMGData())
249
- this.PreviouslyActiveTaskId = (this._parentTask.GetContextTask()).getTaskTag();
250
- else if (this._parentTask !== null)
251
- this.PreviouslyActiveTaskId = this._parentTask.getTaskTag();
252
- }
253
- HandleTriggerTask() {
254
- this._triggeringTask = this._parentTask;
255
- }
256
- FillTaskTables(taskTablesData) {
257
- if (arguments.length === 1) {
258
- this.FillTaskTables_0(taskTablesData);
259
- return;
260
- }
261
- this.FillTaskTables_1();
262
- }
263
- FillTaskTables_0(taskTablesData) {
264
- }
265
- fillAttributes() {
266
- let parser = RuntimeContextBase.Instance.Parser;
267
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
268
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
269
- super.fillAttributes(parser);
270
- if (super.isMainProg())
271
- this._mgData = AccessHelper.mgDataTable.getMGData(0);
272
- }
273
- else {
274
- Logger.Instance.WriteExceptionToLogWithMsg("in Task.fillAttributes() out of string bounds");
275
- }
276
- }
277
- setAttribute(attribute, valueStr) {
278
- let isTagProcessed;
279
- isTagProcessed = super.setAttribute(attribute, valueStr);
280
- if (!isTagProcessed) {
281
- isTagProcessed = true;
282
- switch (attribute) {
283
- case ConstInterface.MG_ATTR_REFRESHON:
284
- if (!(valueStr.trim() === ""))
285
- this.SetRefreshOnVars(valueStr);
286
- break;
287
- case XMLConstants.MG_ATTR_NAME:
288
- this.Name = valueStr;
289
- break;
290
- case ConstInterface.MG_ATTR_DVPOS_DEC:
291
- if (!(valueStr.trim() === ""))
292
- this.setDescriptor(valueStr);
293
- break;
294
- case ConstInterface.MG_ATTR_HAS_LOCATE:
295
- this.hasLocate = true;
296
- break;
297
- case ConstInterface.MG_ATTR_AS_PARENT:
298
- this.ModeAsParent = true;
299
- break;
300
- case ConstInterface.MG_ATTR_TASK_UNIQUE_SORT:
301
- this.UniqueSort = valueStr[0];
302
- break;
303
- case ConstInterface.MG_ATTR_TRANS_ID:
304
- this.setRemoteTransaction(valueStr);
305
- break;
306
- case ConstInterface.MG_ATTR_PUBLIC:
307
- this.PublicName = XmlParser.unescape(valueStr);
308
- break;
309
- case XMLConstants.MG_ATTR_IS_OFFLINE:
310
- this.IsOffline = XmlParser.getBoolean(valueStr);
311
- break;
312
- case XMLConstants.MG_ATTR_RETURN_VALUE_EXP:
313
- this.RetrunValueExp = XmlParser.getInt(valueStr);
314
- break;
315
- case XMLConstants.MG_ATTR_MENUS_FILE_NAME:
316
- break;
317
- default:
318
- isTagProcessed = false;
319
- break;
320
- }
321
- }
322
- if (!isTagProcessed)
323
- Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
324
- return true;
325
- }
326
- initInnerObjects(foundTagName, parentForm) {
327
- return __awaiter(this, void 0, void 0, function* () {
328
- if (foundTagName == null)
329
- return false;
330
- let parser = RuntimeContextBase.Instance.Parser;
331
- switch (foundTagName) {
332
- case XMLConstants.MG_TAG_HELPTABLE:
333
- if (this._helpTab == null)
334
- this._helpTab = new Helps();
335
- if (Events.ShouldLog(Logger_LogLevels.Development))
336
- Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
337
- this._helpTab.fillData(parser);
338
- break;
339
- case XMLConstants.MG_TAG_DVHEADER:
340
- if (Events.ShouldLog(Logger_LogLevels.Development))
341
- Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
342
- this.DataView.fillHeaderData(parser);
343
- break;
344
- case XMLConstants.MG_TAG_PROP:
345
- this._propTab.fillData(this, 'T', parser);
346
- break;
347
- case XMLConstants.MG_TAG_FORM:
348
- this.Form = this.FormInitData(parentForm);
349
- break;
350
- case XMLConstants.MG_ATTR_MENU_CONTENT:
351
- break;
352
- case "assemblies":
353
- let start = parser.getCurrIndex();
354
- let endContext = parser.getXMLdata().indexOf('/assemblies', parser.getCurrIndex());
355
- parser.setCurrIndex(endContext);
356
- parser.setCurrIndex2EndOfTag();
357
- break;
358
- case XMLConstants.MG_TAG_FORMS:
359
- this._forms = new FormsTable(this, parentForm);
360
- Logger.Instance.WriteDevToLog(NString.Format("{0} ...", foundTagName));
361
- yield this._forms.fillData();
362
- break;
363
- case XMLConstants.MG_TAG_TASK:
364
- if (this.SubTasks == null)
365
- this.SubTasks = new TasksTable();
366
- let subtask = new Task(this);
367
- subtask.Init();
368
- this.SubTasks.addTask(subtask);
369
- let mgd = this._mgData;
370
- if (this.isMainProg())
371
- mgd = AccessHelper.mgDataTable.GetMGDataForStartupProgram();
372
- yield subtask.fillData(mgd, new OpeningTaskDetails());
373
- break;
374
- case ConstInterface.MG_TAG_TASKURL:
375
- yield Task.ProcessTaskURL();
376
- break;
377
- case ConstInterface.MG_TAG_EXPTABLE:
378
- if (this.ExpTab == null)
379
- this.ExpTab = new ExpTable();
380
- Logger.Instance.WriteDevToLog("goes to exp");
381
- this.ExpTab.fillData(this, parser);
382
- break;
383
- case ConstInterface.MG_TAG_USER_EVENTS:
384
- if (this.UserEvtTab == null)
385
- this.UserEvtTab = new UserEventsTable();
386
- Logger.Instance.WriteDevToLog("goes to user event tab");
387
- this.UserEvtTab.fillData(this, parser);
388
- break;
389
- case ConstInterface.MG_TAG_LINKS:
390
- this.DataviewHeadersTable = new DataviewHeaders(this);
391
- this.DataviewHeadersTable.fillData(parser);
392
- break;
393
- case ConstInterface.MG_TAG_SORTS:
394
- this.RuntimeSorts = new SortCollection();
395
- this.RuntimeSorts.fillData(this, parser);
396
- break;
397
- case ConstInterface.MG_TAG_TASK_TABLES:
398
- this.FillTaskTables();
399
- break;
400
- case XMLConstants.MG_TAG_RECOMPUTE:
401
- Logger.Instance.WriteDevToLog("goes to recompute");
402
- this.RecomputeFillData(parser);
403
- break;
404
- case ConstInterface.MG_TAG_EVENTHANDLERS:
405
- Logger.Instance.WriteDevToLog("goes to eventhandlers");
406
- if (this.HandlersTab == null)
407
- this.HandlersTab = new HandlersTable();
408
- this.HandlersTab.fillData(this, parser);
409
- this.addExpHandlersToMGData();
410
- break;
411
- default:
412
- if (foundTagName === ("/" + XMLConstants.MG_TAG_TASK)) {
413
- RuntimeContextBase.Instance.Parser.setCurrIndex2EndOfTag();
414
- return false;
415
- }
416
- else {
417
- Logger.Instance.WriteDevToLog("There is no such tag in Task.initInnerObjects . Enter case for " + foundTagName);
418
- return false;
419
- }
420
- }
421
- return true;
422
- });
423
- }
424
- RecomputeFillData(parser) {
425
- let recomputeTable = new RecomputeTable();
426
- recomputeTable.fillData_1(this.DataView, this, parser);
427
- }
428
- FillTaskTables_1() {
429
- let parser = RuntimeContextBase.Instance.Parser;
430
- let endContext = parser.getXMLdata().indexOf(ConstInterface.MG_TAG_TASK_TABLES_END, parser.getCurrIndex());
431
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, endContext) + XMLConstants.TAG_CLOSE.length;
432
- let taskTablesData = parser.getXMLsubstring(endContext);
433
- this.FillTaskTables(taskTablesData);
434
- parser.setCurrIndex(endContext);
435
- }
436
- addExpHandlersToMGData() {
437
- let idx = 0;
438
- for (let i = this.HandlersTab.getSize() - 1; i >= 0; i--) {
439
- let handler = this.HandlersTab.getHandler(i);
440
- let evt = handler.getEvent();
441
- if (evt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION ||
442
- (evt.getType() === ConstInterface.EVENT_TYPE_USER && evt.getUserEventType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
443
- this._mgData.addExpHandler(handler, idx);
444
- idx++;
445
- }
446
- }
447
- }
448
- SetRefreshOnVars(variables) {
449
- let strTok = StrUtil.tokenize(variables, ",");
450
- let fldNum;
451
- let intVals = new List();
452
- let i;
453
- for (i = 0; i < strTok.length; i++) {
454
- fldNum = NNumber.Parse(strTok[i]);
455
- intVals.push(fldNum);
456
- }
457
- this.RefreshOnVars = new Array(intVals.length);
458
- for (i = 0; i < intVals.length; i++) {
459
- fldNum = intVals.get_Item(i);
460
- this.RefreshOnVars[i] = fldNum;
461
- }
462
- }
463
- setDataSynced(synced) {
464
- this.DataSynced = synced;
465
- }
466
- getField(fldName) {
467
- return this.DataView.getFieldByName(fldName);
468
- }
469
- getExpById(id) {
470
- if (this.ExpTab !== null)
471
- return this.ExpTab.getExpById(id);
472
- else
473
- Logger.Instance.WriteExceptionToLogWithMsg("in Task.GetExpById(): no expression table");
474
- return null;
475
- }
476
- getExpObjectById(id) {
477
- return this.getExpById(id);
478
- }
479
- GetExpressionStorage(expId) {
480
- let result = null;
481
- if (expId > 0) {
482
- let expById = this.getExpById(expId);
483
- Debug.Assert(expById !== null);
484
- result = expById.GetStorageAttribute();
485
- }
486
- return result;
487
- }
488
- CalculateExpression(expId, resType, length, contentTypeUnicode, resCellType) {
489
- return __awaiter(this, void 0, void 0, function* () {
490
- let result = null;
491
- if (expId > 0) {
492
- let expById = this.getExpById(expId);
493
- Debug.Assert(expById !== null);
494
- result = yield expById.evaluateWithResultTypeAndLength(resType, length);
495
- }
496
- return result;
497
- });
498
- }
499
- insertRecordTable(invalidate, parser) {
500
- return __awaiter(this, void 0, void 0, function* () {
501
- if (yield this.isCached()) {
502
- let firstTime = this.DataView.getFirstDv();
503
- if (!firstTime && invalidate) {
504
- if (!this.hasLocate) {
505
- if (this.DataView.IncludesFirst()) {
506
- if (!this.DataView.getChanged())
507
- this._dvCache.putInCache(this.DataView.replicate());
508
- else
509
- this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
510
- }
511
- }
512
- else
513
- this.locatePutInCache();
514
- }
515
- }
516
- yield this.DataView.fillData(parser);
517
- if (invalidate)
518
- this.DataView.setChanged(false);
519
- });
520
- }
521
- getHandlersTab() {
522
- return this.HandlersTab;
523
- }
524
- buildXML(message) {
525
- return __awaiter(this, void 0, void 0, function* () {
526
- this.IsAfterRetryBeforeBuildXML = this.getAfterRetry();
527
- if (this.KnownToServer && !this.IsOffline) {
528
- message.Append(XMLConstants.START_TAG + XMLConstants.MG_TAG_TASK);
529
- message.Append(" " + XMLConstants.MG_ATTR_TASKID + "=\"" + this.getTaskTag() + "\"");
530
- message.Append(" " + ConstInterface.MG_ATTR_TASK_MAINLEVEL + "=\"" + this.getMainLevel() + "\"");
531
- message.Append(XMLConstants.TAG_CLOSE);
532
- yield this.DataView.buildXML(message);
533
- if (this.Form != null && this.Form.Opened)
534
- message.Append(this.Form.GetHiddenControlListXML());
535
- message.Append("\n </" + XMLConstants.MG_TAG_TASK + XMLConstants.TAG_CLOSE);
536
- }
537
- });
538
- }
539
- buildXMLForRngs(message, UserRanges, locate) {
540
- let i;
541
- let fld;
542
- let cellAttr = StorageAttribute.SKIP;
543
- let toBase64 = (Environment.Instance.GetDebugLevel() <= 1);
544
- message.Append(XMLConstants.TAG_CLOSE);
545
- for (i = 0; i < UserRanges.length; i++) {
546
- message.Append(XMLConstants.START_TAG + ConstInterface.USER_RNG);
547
- let rng = UserRanges.get_Item(i);
548
- message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + rng.veeIdx + "\"");
549
- fld = this.DataView.getField(rng.veeIdx - 1);
550
- let fldAttr = fld.getType();
551
- if (rng.nullMin)
552
- message.Append(" " + ConstInterface.NULL_MIN_RNG + "=\"1\"");
553
- if (!rng.discardMin && rng.min != null) {
554
- let val = RecordUtils.itemValToXML(rng.min, fldAttr, cellAttr, toBase64);
555
- message.Append(" " + ConstInterface.MIN_RNG + "=\"" + val + "\"");
556
- }
557
- if (rng.nullMax)
558
- message.Append(" " + ConstInterface.NULL_MAX_RNG + "=\"1\"");
559
- if (!rng.discardMax && rng.max != null) {
560
- let val = RecordUtils.itemValToXML(rng.max, fldAttr, cellAttr, toBase64);
561
- message.Append(" " + ConstInterface.MAX_RNG + "=\"" + val + "\"");
562
- }
563
- message.Append(XMLConstants.TAG_TERM);
564
- }
565
- if (locate)
566
- message.Append(XMLConstants.END_TAG + ConstInterface.USER_LOCATES + XMLConstants.TAG_CLOSE);
567
- else
568
- message.Append(XMLConstants.END_TAG + ConstInterface.USER_RANGES + XMLConstants.TAG_CLOSE);
569
- }
570
- buildXMLForSorts(message) {
571
- if (this.UserSorts != null && this.UserSorts.length > 0) {
572
- let i;
573
- for (i = 0; i < this.UserSorts.length; i++) {
574
- message.Append(XMLConstants.TAG_CLOSE);
575
- let srt = this.UserSorts.get_Item(i);
576
- message.Append(XMLConstants.START_TAG + ConstInterface.SORT);
577
- message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + srt.fldIdx + "\"");
578
- if (srt.dir)
579
- message.Append(" " + ConstInterface.MG_ATTR_DIR + "=\"1\"");
580
- message.Append(XMLConstants.TAG_TERM);
581
- }
582
- this.UserSorts.Clear();
583
- this.UserSorts = null;
584
- message.Append(XMLConstants.END_TAG + ConstInterface.MG_TAG_SORTS + XMLConstants.TAG_CLOSE);
585
- }
586
- }
587
- getUserEvent(idx) {
588
- Debug.Assert(this.UserEvtTab !== null);
589
- let retEvent = null;
590
- if (this.UserEvtTab !== null)
591
- retEvent = this.UserEvtTab.getEvent(idx);
592
- return retEvent;
593
- }
594
- SetMoveToFirstControl(moveToFirstControl) {
595
- if (moveToFirstControl || !this.IsSubForm) {
596
- if (this.Form !== null) {
597
- let alreadyMoved = this.Form.alreadyMovedToFirstControl();
598
- if (!alreadyMoved)
599
- this.Form.MovedToFirstControl = true;
600
- }
601
- }
602
- }
603
- Start(moveToFirstControl, callByDestSubForm) {
604
- return __awaiter(this, void 0, void 0, function* () {
605
- let nonInteractiveTask = null;
606
- if (!this._isStarted) {
607
- this._isStarted = true;
608
- this.InitializeExecution();
609
- this.InStartProcess = true;
610
- let result = yield this.Setup();
611
- if (!result.Success)
612
- return null;
613
- this._inProcessingTopMostEndTaskSaved = AccessHelper.eventsManager.getProcessingTopMostEndTask();
614
- AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
615
- yield this.EnableActions();
616
- result = yield this.InitializeForm(moveToFirstControl);
617
- if (!result.Success)
618
- return null;
619
- if (!this.IsInteractive && !this._isMainPrg)
620
- nonInteractiveTask = this;
621
- this.DataViewWasRetrieved = true;
622
- let subTasks = this.SubTasks;
623
- if (this.isMainProg())
624
- this.SubTasks = null;
625
- if (this.isMainProg())
626
- this.SubTasks = subTasks;
627
- if (!result.Success)
628
- return null;
629
- if (this._aborting)
630
- return null;
631
- let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.FirstChunk);
632
- result = yield this.DataviewManager.Execute(dataViewCommand);
633
- if (!result.Success)
634
- return null;
635
- this.ResumeSubformLayout();
636
- }
637
- nonInteractiveTask = yield this.StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm);
638
- this.InStartProcess = false;
639
- return nonInteractiveTask;
640
- });
641
- }
642
- CanResumeSubformLayout() {
643
- return this.DataViewWasRetrieved;
644
- }
645
- InitializeExecution() {
646
- super.setBrkLevel(ConstInterface.BRK_LEVEL_REC_MAIN, -1);
647
- this._firstRecordCycle = true;
648
- this._currStartProgLevel = ((this.IsSubForm && this.getParent().getForm().alreadyMovedToFirstControl())
649
- ? this.getParent()._currStartProgLevel
650
- : Task.StartProgLevel);
651
- }
652
- InitializeForm(moveToFirstControl) {
653
- return __awaiter(this, void 0, void 0, function* () {
654
- if (this.Form !== null) {
655
- this.SetMoveToFirstControl(moveToFirstControl);
656
- AccessHelper.eventsManager.pushNewExecStacks();
657
- this.routeParams = this.DataView.GetRouteParams();
658
- yield this.InitForm();
659
- AccessHelper.eventsManager.popNewExecStacks();
660
- this.getMGData().StartTimers();
661
- Commands.beginInvoke();
662
- }
663
- return new ReturnResult();
664
- });
665
- }
666
- StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm) {
667
- return __awaiter(this, void 0, void 0, function* () {
668
- if (this.hasSubTasks()) {
669
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
670
- let task = this.SubTasks.getTask(i);
671
- let tmpNonInteractiveTask = yield task.Start(moveToFirstControl, callByDestSubForm);
672
- if (nonInteractiveTask === null)
673
- nonInteractiveTask = tmpNonInteractiveTask;
674
- else if (tmpNonInteractiveTask !== null)
675
- Debug.Assert(false, "more than 1 non interactive in task.start");
676
- }
677
- }
678
- return nonInteractiveTask;
679
- });
680
- }
681
- EnableActions() {
682
- return __awaiter(this, void 0, void 0, function* () {
683
- let actList = ActionManager.actEnabled;
684
- this.ActionManager.enableList(actList, true, false);
685
- if (this.IsSubForm)
686
- this.ActionManager.enable(InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT, true);
687
- if (this.Form != null && (yield this.Form.getDefaultButton(false)) != null)
688
- this.ActionManager.enable(InternalInterface.MG_ACT_DEFAULT_BUTTON, true);
689
- yield this.enableModes();
690
- if (yield this.checkProp(PropInterface.PROP_TYPE_SELECTION, false)) {
691
- if ((yield ((this.Form.getProp(PropInterface.PROP_TYPE_DEFAULT_BUTTON))).getValue()) !== "") {
692
- let defaultButtonName = yield (this.Form.getProp(PropInterface.PROP_TYPE_DEFAULT_BUTTON)).getValue();
693
- let ctrl = this.Form.getCtrlByCtrlName(defaultButtonName);
694
- let aRtEvt = new RunTimeEvent(ctrl);
695
- if (aRtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL &&
696
- aRtEvt.getInternalCode() === InternalInterface.MG_ACT_SELECT)
697
- this.ActionManager.enable(InternalInterface.MG_ACT_SELECT, true);
698
- }
699
- else
700
- this.ActionManager.enable(InternalInterface.MG_ACT_SELECT, true);
701
- }
702
- let enablePrintdata = yield this.checkProp(PropInterface.PROP_TYPE_PRINT_DATA, false);
703
- this.ActionManager.enable(InternalInterface.MG_ACT_PRINT_DATA, enablePrintdata);
704
- if (this.getEnableZoomHandler())
705
- this.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
706
- });
707
- }
708
- ShowError(text) {
709
- return __awaiter(this, void 0, void 0, function* () {
710
- let mlsTransText = LanguageData.Instance.translate(text);
711
- let mlsTransTitle = LanguageData.Instance.translate(ConstInterface.ERROR_STRING);
712
- yield GUIManager.Instance.MessageBox(mlsTransTitle, mlsTransText, Styles.MSGBOX_ICON_ERROR | Styles.MSGBOX_BUTTON_OK);
713
- });
714
- }
715
- EndTaskOnError(result, displayError) {
716
- return __awaiter(this, void 0, void 0, function* () {
717
- if (!result.Success && !this.isAborting()) {
718
- if (this.InStartProcess) {
719
- yield this.endTask(false, false, false);
720
- if (displayError)
721
- yield this.ShowError(result.ErrorDescription);
722
- this.InStartProcess = false;
723
- return true;
724
- }
725
- else {
726
- if (displayError)
727
- yield this.ShowError(result.ErrorDescription);
728
- yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_EXIT);
729
- }
730
- }
731
- return false;
732
- });
733
- }
734
- Setup() {
735
- return __awaiter(this, void 0, void 0, function* () {
736
- let result;
737
- this.TaskService.InitTaskPrefixExecutedFlag(this);
738
- this.TaskSuffixExecuted = false;
739
- TaskServiceBase.CreateFirstRecord(this);
740
- let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Init);
741
- result = yield this.DataviewManager.Execute(dataViewCommand);
742
- if (!result.Success)
743
- return result;
744
- if (result.Success) {
745
- let commands = GlobalCommandsManager.Instance.getCommandsExecutedAfterTaskStarted();
746
- for (let cmdIdx = 0; cmdIdx < commands.length; cmdIdx++) {
747
- let command = (commands.get_Item(cmdIdx));
748
- if (command.TaskTag === this.getTaskTag()) {
749
- yield command.Execute(null);
750
- GlobalCommandsManager.Instance.removeCommandsExecutedAfterTaskStarted(command);
751
- }
752
- }
753
- dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Prepare);
754
- result = yield this.DataviewManager.Execute(dataViewCommand);
755
- }
756
- if (result.Success) {
757
- result = this.TaskService.PrepareTask(this);
758
- if (!result.Success)
759
- yield this.EndTaskOnError(result, true);
760
- }
761
- if (result.Success) {
762
- dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.InitDataControlViews);
763
- result = yield this.DataviewManager.Execute(dataViewCommand);
764
- }
765
- return result;
766
- });
767
- }
768
- doFirstRecordCycle() {
769
- return __awaiter(this, void 0, void 0, function* () {
770
- if (!this._isMainPrg) {
771
- AccessHelper.eventsManager.pushNewExecStacks();
772
- this.SubformExecMode = Task_SubformExecModeEnum.FIRST_TIME;
773
- yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(this, InternalInterface.MG_ACT_REC_PREFIX, this.IsSubForm);
774
- if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
775
- if (this.IsSubForm) {
776
- if (this.hasSubTasks())
777
- for (let i = 0; i < this.SubTasks.getSize(); i++) {
778
- let subTask = this.SubTasks.getTask(i);
779
- if (subTask.IsSubForm) {
780
- subTask.getForm().IgnoreFirstRecordCycle = true;
781
- yield subTask.doFirstRecordCycle();
782
- }
783
- }
784
- yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
785
- }
786
- }
787
- this.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
788
- AccessHelper.eventsManager.popNewExecStacks();
789
- }
790
- });
791
- }
792
- CheckAndSetSubForm() {
793
- this.IsSubForm = (!super.isMainProg() && this !== this._mgData.getFirstTask());
794
- }
795
- IsRoute() {
796
- return (this.RouterPath != null);
797
- }
798
- stop() {
799
- return __awaiter(this, void 0, void 0, function* () {
800
- let task;
801
- let form = this.getForm();
802
- if (this._aborting)
803
- return;
804
- if (this.hasSubTasks()) {
805
- while ((task = this.SubTasks.getTask(0)) != null) {
806
- task.setDestinationSubform(this._destinationSubform);
807
- yield task.stop();
808
- }
809
- }
810
- if (!this._isMainPrg)
811
- this._aborting = true;
812
- if (this._parentTask != null) {
813
- this._parentTask.removeSubTask(this);
814
- if (this.IsSubForm) {
815
- let oldTimers = new List(), newTimers = new List();
816
- let mgd = this.getMGData();
817
- if (mgd.getTimerHandlers() != null)
818
- oldTimers = mgd.getTimerHandlers().getTimersVector();
819
- mgd.removeTimerHandler(this);
820
- mgd.removeExpressionHandler(this);
821
- if (mgd.getTimerHandlers() != null)
822
- newTimers = mgd.getTimerHandlers().getTimersVector();
823
- mgd.changeTimers(oldTimers, newTimers);
824
- mgd.removeTask(this);
825
- GUIManager.Instance.abort(this.getForm());
826
- }
827
- }
828
- this.AbortTransaction();
829
- if (this.getClickedControl() != null)
830
- RuntimeContextBase.Instance.CurrentClickedCtrl = null;
831
- if (this.Form != null)
832
- this.Form.removeRefsToCtrls();
833
- if (this.IsSubForm) {
834
- let subForm = this.Form.getSubFormCtrl();
835
- subForm.setSubformTaskId(null);
836
- subForm.initSubformTask();
837
- if (LastFocusedManager.Instance.getLastFocusedTask() === this)
838
- LastFocusedManager.Instance.setLastFocusedTask(this._parentTask);
839
- if (subForm.SubformLoaded)
840
- yield (subForm.getProp(PropInterface.PROP_TYPE_VISIBLE)).RefreshDisplay(true);
841
- }
842
- let clearDataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Clear);
843
- yield this.DataviewManager.Execute(clearDataViewCommand);
844
- });
845
- }
846
- abort() {
847
- this.getMGData().abort();
848
- }
849
- hasSubTasks() {
850
- return this.SubTasks !== null && this.SubTasks.getSize() > 0;
851
- }
852
- getTaskDepth(byParentOrder) {
853
- if (byParentOrder)
854
- return this.getTaskDepth_(byParentOrder);
855
- let depth = this.GetContextTask().getTaskDepth_(byParentOrder);
856
- if (this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
857
- depth = depth + 1;
858
- return depth;
859
- }
860
- getTaskDepth_(byParentOrder) {
861
- let tmpTask = this.getTriggeringTask();
862
- if (tmpTask == null || byParentOrder)
863
- if (this._parentTask == null)
864
- return 1;
865
- else {
866
- if (byParentOrder && this.getCtlIdx() !== this._parentTask.getCtlIdx())
867
- return 2 + this._parentTask.getTaskDepth_(byParentOrder);
868
- return 1 + this._parentTask.getTaskDepth_(byParentOrder);
869
- }
870
- return 1 + (tmpTask).getTaskDepth_(byParentOrder);
871
- }
872
- GetTaskAncestor(generation) {
873
- return this.getTaskAncestor_(generation);
874
- }
875
- getTaskAncestor_(generation) {
876
- let retTask = null;
877
- if (generation === 0)
878
- retTask = this;
879
- else {
880
- let tmpTask = this.getTriggeringTask();
881
- if (tmpTask === null)
882
- tmpTask = this._parentTask;
883
- if (tmpTask !== null)
884
- retTask = tmpTask.getTaskAncestor_(--generation);
885
- }
886
- return retTask;
887
- }
888
- GetTaskDepth() {
889
- return this.getTaskDepth(false);
890
- }
891
- pathContains(task) {
892
- return this._taskPath.Contains(task);
893
- }
894
- SetContextTask(context) {
895
- this.ContextTask = context;
896
- }
897
- GetContextTask() {
898
- let currRec = (this.DataView.getCurrRec());
899
- if (this.InStartProcess
900
- || currRec !== null && (currRec.InCompute || currRec.InRecompute)
901
- || this.Form !== null && this.Form.inRefreshDisplay())
902
- return this;
903
- return this.ContextTask;
904
- }
905
- getTriggeringTask() {
906
- if (this._triggeringTask !== null && this._triggeringTask.getMGData().IsAborting)
907
- this._triggeringTask = this._parentTask;
908
- return this._triggeringTask;
909
- }
910
- setLastParkedCtrl(ctrl) {
911
- super.setLastParkedCtrl(ctrl);
912
- LastFocusedManager.setLastFocusedControl(this, ctrl);
913
- }
914
- queryTaskPath() {
915
- let insertedNames = 0;
916
- let result = new StringBuilder(7936);
917
- let treeRoute = new Array(this.getTaskDepth(false));
918
- this.pathToRoot(treeRoute, false);
919
- for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
920
- let currTsk = treeRoute[tsk];
921
- if (currTsk.isMainProg())
922
- continue;
923
- let nameProp = currTsk.getProp(PropInterface.PROP_TYPE_NAME);
924
- if (nameProp == null)
925
- continue;
926
- let name = nameProp.GetComputedValue();
927
- if (!NString.IsNullOrEmpty(name)) {
928
- if (insertedNames++ !== 0)
929
- result.Append(';');
930
- result.Append(name);
931
- }
932
- }
933
- return result;
934
- }
935
- ctl_itm_2_parent_vee(itm) {
936
- let currTsk;
937
- let currItm = 0;
938
- let lastItm = 0;
939
- let treeRoute = new Array(this.getTaskDepth(true));
940
- this.pathToRoot(treeRoute, true);
941
- for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
942
- currTsk = treeRoute[tsk];
943
- currItm += currTsk.DataView.GetFieldsTab().getSize();
944
- if (itm < currItm) {
945
- itm -= lastItm;
946
- return currTsk.DataView.getField(itm);
947
- }
948
- lastItm = currItm;
949
- }
950
- return null;
951
- }
952
- GetControlIDFromVarItem(item) {
953
- let currTask;
954
- let currItem = 0;
955
- let lastItem = 0;
956
- let noOfControlsBeforeCurrTask = 0;
957
- let treeRoute = new Array(this.getTaskDepth(true));
958
- this.pathToRoot(treeRoute, true);
959
- for (let task = treeRoute.length - 1; task >= 0; task--) {
960
- currTask = treeRoute[task];
961
- currItem += currTask.DataView.GetFieldsTab().getSize();
962
- if (item < currItem) {
963
- item -= lastItem;
964
- let field = currTask.DataView.getField(item);
965
- if (field.getCtrl() != null)
966
- return noOfControlsBeforeCurrTask = noOfControlsBeforeCurrTask + currTask.Form.getControlIdx(field.getCtrl()) + 1;
967
- return 0;
968
- }
969
- if (currTask.Form != null)
970
- noOfControlsBeforeCurrTask += currTask.Form.getCtrlCount();
971
- lastItem = currItem;
972
- }
973
- return 0;
974
- }
975
- GetControlFromControlID(controlID, parent) {
976
- let control = null;
977
- parent.value = -1;
978
- if (controlID >= 0) {
979
- let currTask = null;
980
- let callerTask = null;
981
- let noOfControlsInCurrtask = 0;
982
- let noOfControlsBeforeCurrTask = 0;
983
- let controlIdx = 0;
984
- let treeRoute = new Array(this.getTaskDepth(true));
985
- this.pathToRoot(treeRoute, true);
986
- for (let task = treeRoute.length - 1; task >= 0; task--) {
987
- currTask = treeRoute[task];
988
- if (currTask.Form != null) {
989
- noOfControlsInCurrtask = currTask.Form.getCtrlCount();
990
- if (controlID < (noOfControlsBeforeCurrTask + noOfControlsInCurrtask)) {
991
- controlIdx = controlID - noOfControlsBeforeCurrTask;
992
- control = currTask.Form.CtrlTab.getCtrl(controlIdx);
993
- callerTask = currTask;
994
- break;
995
- }
996
- noOfControlsBeforeCurrTask += noOfControlsInCurrtask;
997
- }
998
- }
999
- if (control != null) {
1000
- parent.value = 0;
1001
- let prevCtlIdx = treeRoute[0].TaskDefinitionId.CtlIndex;
1002
- for (let task = 0; task < treeRoute.length - 1; task++) {
1003
- currTask = treeRoute[task];
1004
- if (prevCtlIdx !== currTask.TaskDefinitionId.CtlIndex)
1005
- parent.value++;
1006
- if (callerTask.TaskDefinitionId.CtlIndex === currTask.TaskDefinitionId.CtlIndex)
1007
- break;
1008
- prevCtlIdx = currTask.TaskDefinitionId.CtlIndex;
1009
- }
1010
- }
1011
- }
1012
- return control;
1013
- }
1014
- ctl_itm_4_parent_vee(parent, vee) {
1015
- let tsk;
1016
- let depth = this.getTaskDepth(true);
1017
- if (parent !== TaskBase.MAIN_PRG_PARENT_ID && depth <= parent)
1018
- return vee;
1019
- let treeRoute = new Array(depth);
1020
- if (vee !== 0) {
1021
- this.pathToRoot(treeRoute, true);
1022
- let indOfParentInTaskTree = this.getIndOfParentInTaskTree(parent, treeRoute);
1023
- let i;
1024
- for (i = treeRoute.length - 1; i > indOfParentInTaskTree; i--) {
1025
- tsk = treeRoute[i];
1026
- vee += tsk.DataView.GetFieldsTab().getSize();
1027
- }
1028
- }
1029
- return vee;
1030
- }
1031
- getIndOfParentInTaskTree(parent, taskTree) {
1032
- let indOfParentInTaskTree = 0;
1033
- if (parent === TaskBase.MAIN_PRG_PARENT_ID) {
1034
- for (let i = 1; i < taskTree.length; i = i + 1) {
1035
- if (taskTree[i].isMainProg() && this._ctlIdx === taskTree[i].getCtlIdx()) {
1036
- indOfParentInTaskTree = i;
1037
- break;
1038
- }
1039
- }
1040
- }
1041
- else
1042
- indOfParentInTaskTree = parent;
1043
- return indOfParentInTaskTree;
1044
- }
1045
- getFieldByName(fldName) {
1046
- return (this.GetContextTask()).getFieldByName_(fldName);
1047
- }
1048
- getFieldByName_(fldName) {
1049
- let tmpTask;
1050
- if (fldName == null)
1051
- return null;
1052
- let fld = this.getField(fldName);
1053
- if (fld == null) {
1054
- tmpTask = this.getTriggeringTask() != null ? this.getTriggeringTask() : this._parentTask;
1055
- if (tmpTask != null) {
1056
- if (!this.isMainProg() && this.getCtlIdx() !== tmpTask.getCtlIdx()) {
1057
- let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, this.getCtlIdx());
1058
- fld = mainPrg.getFieldByName_(fldName);
1059
- }
1060
- if (fld == null)
1061
- fld = tmpTask.getFieldByName_(fldName);
1062
- }
1063
- }
1064
- return fld;
1065
- }
1066
- getIndexOfFieldByName(fldName) {
1067
- let depth = this.getTaskDepth(true);
1068
- let index = 0;
1069
- let fld = this.getFieldByName(fldName);
1070
- let fldTab;
1071
- if (fld == null)
1072
- return 0;
1073
- let treeRoute = new Array(depth);
1074
- this.pathToRoot(treeRoute, true);
1075
- for (let curr = depth - 1; curr >= 0; curr--) {
1076
- let currTask = treeRoute[curr];
1077
- if (currTask === fld.getTask()) {
1078
- curr = fld.getId();
1079
- index += ++curr;
1080
- break;
1081
- }
1082
- fldTab = currTask.DataView.GetFieldsTab();
1083
- index += fldTab.getSize();
1084
- }
1085
- return index;
1086
- }
1087
- pathToRoot(path, byParentOrder) {
1088
- let task = (byParentOrder ? this : this.GetContextTask());
1089
- for (let i = 0; i < path.length; i++) {
1090
- path[i] = task;
1091
- let ctlIdx = task.getCtlIdx();
1092
- let tmpTask = byParentOrder ? null : task.getTriggeringTask();
1093
- if (tmpTask != null)
1094
- task = tmpTask;
1095
- else {
1096
- task = task.getParent();
1097
- if (task == null) {
1098
- if (!byParentOrder && this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
1099
- path[i + 1] = this;
1100
- break;
1101
- }
1102
- if (byParentOrder && ctlIdx !== task.getCtlIdx())
1103
- path[++i] = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
1104
- }
1105
- }
1106
- }
1107
- shouldBeRefreshed() {
1108
- let dataView = this._parentTask.DataView;
1109
- let result = false;
1110
- if (this._parentTask === null || dataView.isPrevCurrRecNull() ||
1111
- (this.RefreshOnVars !== null && !dataView.currEqualsPrev(this.RefreshOnVars)))
1112
- result = true;
1113
- return result;
1114
- }
1115
- CheckRefreshSubTasks() {
1116
- return __awaiter(this, void 0, void 0, function* () {
1117
- let ret = false;
1118
- if (this._enteredRecLevel) {
1119
- let subformsToRefresh = yield this.GetSubformsToRefresh();
1120
- if (subformsToRefresh.length > 0)
1121
- ret = true;
1122
- }
1123
- return ret;
1124
- });
1125
- }
1126
- GetSubTasks() {
1127
- let subTasks = new List();
1128
- if (this.hasSubTasks()) {
1129
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1)
1130
- subTasks.push(this.SubTasks.getTask(i));
1131
- }
1132
- return subTasks;
1133
- }
1134
- GetSubformsToRefresh() {
1135
- return __awaiter(this, void 0, void 0, function* () {
1136
- let subTasks = this.GetSubTasks();
1137
- let subTasksToRefresh = new List();
1138
- for (let i = 0; i < subTasks.length; i++) {
1139
- let subTask = subTasks.get_Item(i);
1140
- if (yield this.ShouldRefreshSubformTask(subTask))
1141
- subTasksToRefresh.push(subTask);
1142
- }
1143
- return subTasksToRefresh;
1144
- });
1145
- }
1146
- ShouldRefreshSubformTask(subTask) {
1147
- return __awaiter(this, void 0, void 0, function* () {
1148
- let refresh = false;
1149
- let subformCtrl = subTask.getForm().getSubFormCtrl();
1150
- subTask.DoSubformPrefixSuffix = false;
1151
- if (subformCtrl != null && !subTask.InSelect && subTask.AfterFirstRecordPrefix) {
1152
- let parentMode = this.getMode();
1153
- let modeProperty = (parentMode === Constants.TASK_MODE_QUERY ? PropInterface.PROP_TYPE_ALLOW_QUERY
1154
- : parentMode === Constants.TASK_MODE_MODIFY
1155
- ? PropInterface.PROP_TYPE_ALLOW_MODIFY
1156
- : PropInterface.PROP_TYPE_ALLOW_CREATE);
1157
- if (subTask.ModeAsParent && parentMode !== subTask.getMode() &&
1158
- this.getLevel() === Constants.TASK_LEVEL_RECORD &&
1159
- (yield (subTask.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) &&
1160
- (yield subTask.checkProp(modeProperty, true))) {
1161
- if (!subformCtrl.isVisible() &&
1162
- !(yield subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false))) {
1163
- subformCtrl.RefreshOnVisible = true;
1164
- refresh = false;
1165
- }
1166
- else
1167
- refresh = true;
1168
- yield subTask.SetModeAsParent(parentMode);
1169
- }
1170
- else {
1171
- refresh = (yield subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true)) && subTask.shouldBeRefreshed();
1172
- if (refresh) {
1173
- if (!subformCtrl.isVisible() &&
1174
- !(yield subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false))) {
1175
- subformCtrl.RefreshOnVisible = true;
1176
- refresh = false;
1177
- }
1178
- }
1179
- }
1180
- if (refresh)
1181
- subTask.DoSubformPrefixSuffix = true;
1182
- }
1183
- return refresh;
1184
- });
1185
- }
1186
- SetModeAsParent(parentMode) {
1187
- return __awaiter(this, void 0, void 0, function* () {
1188
- yield this.enableModes();
1189
- if (parentMode === Constants.TASK_MODE_CREATE) {
1190
- let cmd = CommandFactory.CreateEventCommand(this.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
1191
- yield this.DataviewManager.Execute(cmd);
1192
- }
1193
- else if (this.getMode() === Constants.TASK_MODE_CREATE) {
1194
- this.setPreventRecordSuffix(true);
1195
- this.setPreventControlChange(true);
1196
- yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
1197
- this.setPreventRecordSuffix(false);
1198
- this.setPreventControlChange(false);
1199
- let subTaskDv = this.DataView;
1200
- if (!subTaskDv.isEmpty() && (subTaskDv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
1201
- this.setMode(parentMode);
1202
- else
1203
- this.setMode(Constants.TASK_MODE_CREATE);
1204
- yield this.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1205
- }
1206
- else
1207
- this.setMode(parentMode);
1208
- this.setOriginalTaskMode(parentMode);
1209
- yield this.setCreateDeleteActsEnableState();
1210
- });
1211
- }
1212
- doSubformRecPrefixSuffix() {
1213
- return __awaiter(this, void 0, void 0, function* () {
1214
- let subTasks = this.GetSubTasks();
1215
- for (let i = 0; i < subTasks.length; i++) {
1216
- let subTask = subTasks.get_Item(i);
1217
- if (subTask.DoSubformPrefixSuffix) {
1218
- yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subTask, InternalInterface.MG_ACT_REC_PREFIX, true);
1219
- if (!AccessHelper.eventsManager.GetStopExecutionFlag())
1220
- yield AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_REC_SUFFIX);
1221
- }
1222
- }
1223
- });
1224
- }
1225
- CleanDoSubformPrefixSuffix() {
1226
- let subTasks = this.GetSubTasks();
1227
- for (let i = 0; i < subTasks.length; i++) {
1228
- let subTask = subTasks.get_Item(i);
1229
- subTask.DoSubformPrefixSuffix = false;
1230
- }
1231
- }
1232
- mustConfirmInDeleteMode() {
1233
- let prop = this.getProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE);
1234
- return !prop.isExpression();
1235
- }
1236
- addSubTask(subTask) {
1237
- if (this.SubTasks === null)
1238
- this.SubTasks = new TasksTable();
1239
- this.SubTasks.addTask(subTask);
1240
- }
1241
- removeSubTask(subTask) {
1242
- if (this.SubTasks !== null)
1243
- this.SubTasks.removeTask(subTask);
1244
- }
1245
- setTransactionFailed(val) {
1246
- this._transactionFailed = val;
1247
- if (!val)
1248
- this.TransactionErrorHandlingsRetry = null;
1249
- }
1250
- transactionFailed(level) {
1251
- if (level === ConstInterface.TRANS_NONE ||
1252
- (this.Transaction != null && this.Transaction.getLevel() === level))
1253
- return this._transactionFailed;
1254
- else if (level === ConstInterface.TRANS_NONE ||
1255
- (this.TransactionErrorHandlingsRetry != null && this.TransactionErrorHandlingsRetry.getLevel() === level))
1256
- return this._transactionFailed;
1257
- return false;
1258
- }
1259
- setAfterRetry(val) {
1260
- if (this.Transaction != null)
1261
- this.Transaction.setAfterRetry(val);
1262
- else if (this.TransactionErrorHandlingsRetry != null) {
1263
- if (val === ConstInterface.RECOVERY_NONE)
1264
- this.TransactionErrorHandlingsRetry = null;
1265
- else
1266
- this.TransactionErrorHandlingsRetry.setAfterRetry(val);
1267
- }
1268
- }
1269
- getAfterRetry(recovery) {
1270
- if (arguments.length === 0) {
1271
- return this.getAfterRetry_0();
1272
- }
1273
- return this.getAfterRetry_1(recovery);
1274
- }
1275
- getAfterRetry_0() {
1276
- if (this.Transaction != null)
1277
- return this.Transaction.getAfterRetry();
1278
- else if (this.TransactionErrorHandlingsRetry != null)
1279
- return this.TransactionErrorHandlingsRetry.getAfterRetry();
1280
- return false;
1281
- }
1282
- getAfterRetry_1(recovery) {
1283
- if (this.Transaction != null)
1284
- return this.Transaction.getAfterRetry(recovery);
1285
- else if (this.TransactionErrorHandlingsRetry != null)
1286
- return this.TransactionErrorHandlingsRetry.getAfterRetry(recovery);
1287
- return false;
1288
- }
1289
- getExecEndTask() {
1290
- return this._bExecEndTask;
1291
- }
1292
- resetExecEndTask() {
1293
- this._bExecEndTask = false;
1294
- }
1295
- setExecEndTask() {
1296
- this._bExecEndTask = true;
1297
- }
1298
- evalEndCond(mode) {
1299
- return __awaiter(this, void 0, void 0, function* () {
1300
- let endTaskCondProp;
1301
- let evalEndCondProp = this.getProp(PropInterface.PROP_TYPE_EVAL_END_CONDITION);
1302
- if (this.InEndTask)
1303
- return false;
1304
- if (this._bExecEndTask)
1305
- return true;
1306
- if (evalEndCondProp != null && (NString.Compare(yield evalEndCondProp.getValue(), ConstInterface.END_COND_EVAL_IMMIDIATE, true) === 0 || ((yield evalEndCondProp.getValue()).toLowerCase() === mode.toLowerCase()))) {
1307
- endTaskCondProp = this.getProp(PropInterface.PROP_TYPE_END_CONDITION);
1308
- if (endTaskCondProp == null)
1309
- return false;
1310
- let endTask = yield endTaskCondProp.getValue();
1311
- if (DisplayConvertor.toBoolean(endTask)) {
1312
- this._bExecEndTask = true;
1313
- return true;
1314
- }
1315
- return false;
1316
- }
1317
- return false;
1318
- });
1319
- }
1320
- setTryingToStop(val) {
1321
- if (this.hasSubTasks()) {
1322
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
1323
- let task = this.SubTasks.getTask(i);
1324
- task.setTryingToStop(val);
1325
- }
1326
- }
1327
- this.IsTryingToStop = val;
1328
- }
1329
- getInRecordSuffix() {
1330
- return this._inRecordSuffix;
1331
- }
1332
- setInRecordSuffix(bValue) {
1333
- if (bValue !== this._inRecordSuffix) {
1334
- this._inRecordSuffix = bValue;
1335
- return true;
1336
- }
1337
- return false;
1338
- }
1339
- setEvalOldValues(bFlag) {
1340
- if (bFlag !== this._evalOldValues) {
1341
- this._evalOldValues = bFlag;
1342
- return true;
1343
- }
1344
- return false;
1345
- }
1346
- getEvalOldValues() {
1347
- return this._evalOldValues;
1348
- }
1349
- endTask(reversibleExit, onlyDescs, dueToVerifyError, subformDestination) {
1350
- return __awaiter(this, void 0, void 0, function* () {
1351
- if (isNullOrUndefined(subformDestination))
1352
- return yield this.endTask_1(reversibleExit, onlyDescs, false, dueToVerifyError);
1353
- else
1354
- return yield this.endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError);
1355
- });
1356
- }
1357
- endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError) {
1358
- return __awaiter(this, void 0, void 0, function* () {
1359
- let succeeded = true;
1360
- let closedSubForm = false;
1361
- let subTask;
1362
- let mgdTab = AccessHelper.mgDataTable;
1363
- if ((this.IsSubForm && !subformDestination) && !this._parentTask.InEndTask) {
1364
- succeeded = yield this._parentTask.endTask(reversibleExit, onlyDescs, dueToVerifyError);
1365
- }
1366
- else if (!this.isAborting() && !this.InEndTask) {
1367
- try {
1368
- this.InEndTask = true;
1369
- if ((MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI) && AccessHelper.eventsManager.GetStopExecutionFlag()) {
1370
- let cmd = CommandFactory.CreateUnloadCommand();
1371
- MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
1372
- yield CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1373
- return;
1374
- }
1375
- if (!this.IsTryingToStop)
1376
- this.setTryingToStop(true);
1377
- let i;
1378
- if (reversibleExit) {
1379
- if (this.hasSubTasks()) {
1380
- if (!RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
1381
- let pendingTransactions = true;
1382
- let clientOperExist = this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_TASK_SUFFIX);
1383
- if (!clientOperExist) {
1384
- clientOperExist = this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_REC_SUFFIX);
1385
- if (!clientOperExist)
1386
- pendingTransactions = this.CheckIfPendingTransactions(this);
1387
- }
1388
- if (!clientOperExist && !pendingTransactions) {
1389
- this.allowRemoteCmdExecution = false;
1390
- this.SetServerSideTaskSuffix(this);
1391
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
1392
- }
1393
- }
1394
- else
1395
- this.SetServerSideTaskSuffix(this);
1396
- for (i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
1397
- subTask = this.SubTasks.getTask(i);
1398
- closedSubForm = closedSubForm || subTask.IsSubForm;
1399
- yield AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_EXIT);
1400
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1401
- }
1402
- }
1403
- if (this === mgdTab.StartupMgData.getFirstTask()) {
1404
- for (i = mgdTab.getSize() - 1; i > 0 && succeeded; i--) {
1405
- if (mgdTab.getMGData(i) != null) {
1406
- yield AccessHelper.eventsManager.handleInternalEventWithTask(mgdTab.getMGData(i).getFirstTask(), InternalInterface.MG_ACT_EXIT);
1407
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1408
- }
1409
- }
1410
- }
1411
- }
1412
- if (succeeded) {
1413
- if (reversibleExit && !dueToVerifyError) {
1414
- let forceSuffix = yield this.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
1415
- if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
1416
- this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "0");
1417
- yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
1418
- if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
1419
- this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "1");
1420
- }
1421
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1422
- if (succeeded && !onlyDescs)
1423
- this.HandleTransactionInfo();
1424
- let preTskSuffix = succeeded;
1425
- if (succeeded && !onlyDescs && reversibleExit && !dueToVerifyError &&
1426
- (!this.IsSubForm || subformDestination) &&
1427
- this.TaskPrefixExecuted && !this.TaskSuffixExecuted)
1428
- succeeded = yield this.handleTaskSuffix(true);
1429
- if (reversibleExit && this.hasSubTasks())
1430
- for (i = 0; i < this.SubTasks.getSize(); i++) {
1431
- subTask = this.SubTasks.getTask(i);
1432
- if (!subTask.IsSubForm)
1433
- yield AccessHelper.eventsManager.handleNonReversibleEvent(subTask, InternalInterface.MG_ACT_EXIT);
1434
- }
1435
- if (reversibleExit)
1436
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1437
- if (preTskSuffix)
1438
- AccessHelper.eventsManager.setStopExecution(false);
1439
- this.setAfterRetry(ConstInterface.RECOVERY_NONE);
1440
- if (!this.isAborting() && succeeded && !onlyDescs) {
1441
- if (reversibleExit) {
1442
- this.setTransactionFailed(false);
1443
- yield this.TaskTransactionManager.checkAndCommit(false, ConstInterface.TRANS_TASK_PREFIX, false);
1444
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError) && !this.isAborting() && !this.transactionFailed(ConstInterface.TRANS_TASK_PREFIX);
1445
- }
1446
- this.setAfterRetry(ConstInterface.RECOVERY_NONE);
1447
- if (succeeded) {
1448
- if (!this.allowRemoteCmdExecution) {
1449
- this.allowRemoteCmdExecution = true;
1450
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
1451
- }
1452
- else if (this.DelayCommandExecution) {
1453
- this.DelayCommandExecution = false;
1454
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
1455
- }
1456
- let baseMgd = AccessHelper.mgDataTable.StartupMgData;
1457
- if (reversibleExit && baseMgd.getFirstTask().getTaskTag() === this.getTaskTag()) {
1458
- AccessHelper.eventsManager.setProcessingTopMostEndTask(true);
1459
- yield AccessHelper.eventsManager.handleEvents(baseMgd, 0);
1460
- AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
1461
- if (this.isAborting())
1462
- return true;
1463
- }
1464
- yield TaskServiceBase.Exit(this, reversibleExit, subformDestination);
1465
- if (this._parentTask != null && this._parentTask.isMainProg()) {
1466
- let mgd = AccessHelper.mgDataTable.getMGData(0);
1467
- let mainPrgTask = mgd.getMainProg(0);
1468
- let rootTask = AccessHelper.mgDataTable.StartupMgData.getFirstTask();
1469
- let endMainPrg = yield mainPrgTask.checkProp(PropInterface.PROP_TYPE_END_CONDITION, false);
1470
- if (this !== rootTask && endMainPrg) {
1471
- let rtEvt = new RunTimeEvent(rootTask);
1472
- rtEvt.setInternal(InternalInterface.MG_ACT_CLOSE);
1473
- rtEvt.setCtrl(null);
1474
- rtEvt.setArgList(null);
1475
- AccessHelper.eventsManager.addToTail(rtEvt);
1476
- }
1477
- }
1478
- MgForm.CreatedForms.remove(this.Form);
1479
- }
1480
- }
1481
- }
1482
- }
1483
- finally {
1484
- if (!this.IsSubForm || subformDestination)
1485
- this.handleFinallyEndTask(succeeded, reversibleExit);
1486
- }
1487
- }
1488
- else if (this.InEndTask)
1489
- succeeded = false;
1490
- AccessHelper.eventsManager.setProcessingTopMostEndTask(this._inProcessingTopMostEndTaskSaved);
1491
- return succeeded;
1492
- });
1493
- }
1494
- SetServerSideTaskSuffix(task) {
1495
- let clientOperationExist = false;
1496
- var rtEvt = new RunTimeEvent(task);
1497
- rtEvt.setInternal(InternalInterface.MG_ACT_TASK_SUFFIX);
1498
- let handler = null;
1499
- var evtHanPos = new EventHandlerPosition();
1500
- evtHanPos.init(rtEvt);
1501
- handler = evtHanPos.getNext();
1502
- if (handler != null) {
1503
- for (let i = 0; i < handler.getOperationTab().getSize(); i++) {
1504
- let oper = handler.getOperationTab().getOperation(i);
1505
- oper.setExecOnServer(true);
1506
- }
1507
- }
1508
- if (task.hasSubTasks()) {
1509
- for (let i = 0; i < task.GetSubTasks().length; i++) {
1510
- let subTask = task.SubTasks.getTask(i);
1511
- this.SetServerSideTaskSuffix(subTask);
1512
- }
1513
- }
1514
- }
1515
- CheckIfClientOperationExistsInSubformTasks(task, eventCode) {
1516
- let clientOperationExist = false;
1517
- var rtEvt = new RunTimeEvent(task);
1518
- rtEvt.setInternal(eventCode);
1519
- let handler = null;
1520
- var evtHanPos = new EventHandlerPosition();
1521
- evtHanPos.init(rtEvt);
1522
- handler = evtHanPos.getNext();
1523
- let pendingTransactions = false;
1524
- if (eventCode == InternalInterface.MG_ACT_REC_SUFFIX) {
1525
- let currRecord = task.DataView.getCurrRec();
1526
- if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
1527
- pendingTransactions = true;
1528
- }
1529
- if (handler != null && pendingTransactions == true) {
1530
- let cnt = handler.getOperationTab().getSize();
1531
- for (let i = 0; i < cnt; i++) {
1532
- let oper = handler.getOperationTab().getOperation(i);
1533
- if (oper.getExecOnClient()) {
1534
- clientOperationExist = true;
1535
- break;
1536
- }
1537
- }
1538
- }
1539
- if (!clientOperationExist && task.hasSubTasks()) {
1540
- for (let i = 0; (!clientOperationExist && i < task.getSubTasks().getSize()); i++) {
1541
- let subTask = task.SubTasks.getTask(i);
1542
- clientOperationExist = this.CheckIfClientOperationExistsInSubformTasks(subTask, eventCode);
1543
- }
1544
- }
1545
- return clientOperationExist;
1546
- }
1547
- CheckIfPendingTransactions(task) {
1548
- let pendingTransactions = false;
1549
- let currRecord = task.DataView.getCurrRec();
1550
- if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
1551
- pendingTransactions = true;
1552
- if (!pendingTransactions && task.hasSubTasks()) {
1553
- for (let i = 0; (!pendingTransactions && i < task.getSubTasks().getSize()); i++) {
1554
- let subTask = task.SubTasks.getTask(i);
1555
- pendingTransactions = this.CheckIfPendingTransactions(subTask);
1556
- }
1557
- }
1558
- return pendingTransactions;
1559
- }
1560
- HandleTransactionInfo() {
1561
- let transaction = this.DataviewManager.RemoteDataviewManager.Transaction;
1562
- if (transaction !== null && transaction.isOwner(this) && transaction.getLevel() === 'P') {
1563
- this.DataviewManager.RemoteDataviewManager.Transaction = null;
1564
- this.DataView.setTransCleared();
1565
- }
1566
- }
1567
- Exit(reversibleExit, subformDestination) {
1568
- return __awaiter(this, void 0, void 0, function* () {
1569
- let cmd = reversibleExit ?
1570
- CommandFactory.CreateBrowserEscEventCommand(this.getTaskTag(), subformDestination) :
1571
- CommandFactory.CreateNonReversibleExitCommand(this.getTaskTag(), subformDestination);
1572
- this._mgData.CmdsToServer.Add(cmd);
1573
- if (!subformDestination) {
1574
- try {
1575
- if (this.getTaskTag() == MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag() ||
1576
- !(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI))
1577
- yield Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1578
- }
1579
- catch (err) {
1580
- if (this.isMainProg()) {
1581
- this._mgData.CmdsToServer.Add(cmd);
1582
- }
1583
- else
1584
- throw err;
1585
- }
1586
- }
1587
- });
1588
- }
1589
- handleFinallyEndTask(succeeded, reversibleExit) {
1590
- let subTask;
1591
- if (this.hasSubTasks()) {
1592
- for (let i = 0; i < this.SubTasks.getSize(); i++) {
1593
- subTask = this.SubTasks.getTask(i);
1594
- subTask.handleFinallyEndTask(succeeded, reversibleExit);
1595
- }
1596
- }
1597
- this.InEndTask = false;
1598
- if (succeeded)
1599
- this._isStarted = false;
1600
- if (!succeeded && reversibleExit && this.IsTryingToStop)
1601
- this.setTryingToStop(false);
1602
- }
1603
- handleTaskSuffix(withSubTasks) {
1604
- return __awaiter(this, void 0, void 0, function* () {
1605
- let succeeded = true;
1606
- let subTask;
1607
- if (withSubTasks) {
1608
- if (this.hasSubTasks()) {
1609
- for (let i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
1610
- subTask = this.SubTasks.getTask(i);
1611
- succeeded = yield subTask.handleTaskSuffix(withSubTasks);
1612
- }
1613
- }
1614
- }
1615
- if (succeeded)
1616
- yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_TASK_SUFFIX);
1617
- succeeded = !AccessHelper.eventsManager.GetStopExecutionFlag();
1618
- this.TaskSuffixExecuted = true;
1619
- return succeeded;
1620
- });
1621
- }
1622
- setInCreateLine(inCreateLine) {
1623
- this._inCreateLine = inCreateLine;
1624
- }
1625
- getInCreateLine() {
1626
- return this._inCreateLine;
1627
- }
1628
- handleEventOnSlaveTasks(internalEvtCode) {
1629
- return __awaiter(this, void 0, void 0, function* () {
1630
- let i;
1631
- let task = null;
1632
- let failureTask = null;
1633
- let mgdTab = AccessHelper.mgDataTable;
1634
- let triggeredTasks = mgdTab.getTriggeredTasks(this);
1635
- let orphans = null;
1636
- let sameTrans;
1637
- let hasSlaves = false;
1638
- let isOwner = this.Transaction != null && this.Transaction.isOwner(this);
1639
- if (isOwner) {
1640
- AccessHelper.eventsManager.setEventScopeTrans();
1641
- orphans = new List();
1642
- mgdTab.startTasksIteration();
1643
- while ((task = mgdTab.getNextTask()) != null) {
1644
- sameTrans = task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
1645
- if (task !== this && sameTrans && task.PreviouslyActiveTaskId != null && mgdTab.GetTaskByID(task.PreviouslyActiveTaskId) == null)
1646
- orphans.push(task);
1647
- }
1648
- }
1649
- let scopeTrans = AccessHelper.eventsManager.isEventScopeTrans();
1650
- for (i = 0; i < triggeredTasks.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
1651
- task = triggeredTasks.get_Item(i);
1652
- sameTrans = this.Transaction != null && task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
1653
- if (!task.IsSubForm && (scopeTrans && sameTrans) && task.isStarted()) {
1654
- if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
1655
- yield task.DataView.currRecCompute(false);
1656
- yield AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
1657
- hasSlaves = true;
1658
- }
1659
- }
1660
- for (; isOwner && i < orphans.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
1661
- task = orphans.get_Item(i);
1662
- if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
1663
- yield task.DataView.currRecCompute(false);
1664
- yield AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
1665
- hasSlaves = true;
1666
- }
1667
- if (hasSlaves && AccessHelper.eventsManager.GetStopExecutionFlag())
1668
- failureTask = task;
1669
- if (isOwner)
1670
- AccessHelper.eventsManager.clearEventScope();
1671
- return failureTask;
1672
- });
1673
- }
1674
- enableRecordActions() {
1675
- return __awaiter(this, void 0, void 0, function* () {
1676
- let dataview = this.DataView;
1677
- yield this.setCreateDeleteActsEnableState();
1678
- if (dataview.IncludesFirst() || dataview.IsOneWayKey) {
1679
- if (dataview.isEmptyDataview() || dataview.getCurrRecIdx() === 0) {
1680
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, false);
1681
- if (dataview.IsOneWayKey)
1682
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1683
- else
1684
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, false);
1685
- if (this.Form.isScreenMode())
1686
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
1687
- }
1688
- else {
1689
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
1690
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1691
- if (this.Form.isScreenMode())
1692
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1693
- }
1694
- if (!this.Form.isScreenMode())
1695
- if (dataview.isEmptyDataview() || (dataview.getCurrRecIdx() === 0) || (dataview.getTopRecIdx() === 0))
1696
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
1697
- else
1698
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1699
- }
1700
- else {
1701
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1702
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1703
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
1704
- }
1705
- if (dataview.IncludesLast()) {
1706
- if (((this.getMode() === Constants.TASK_MODE_QUERY) || dataview.isEmptyDataview() ||
1707
- ((this.getMode() === Constants.TASK_MODE_MODIFY) &&
1708
- (!Environment.Instance.allowCreateInModifyMode(this.getCompIdx()) ||
1709
- !(yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true))))) && (dataview.getCurrRecIdx() + 1) === dataview.getSize()) {
1710
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, false);
1711
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, false);
1712
- if (this.Form.isScreenMode())
1713
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
1714
- }
1715
- else {
1716
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
1717
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
1718
- if (this.Form.isScreenMode())
1719
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1720
- }
1721
- if (!this.Form.isScreenMode()) {
1722
- if (dataview.isEmptyDataview() || ((dataview.getSize() - dataview.getTopRecIdx()) <= this.Form.getRowsInPage()))
1723
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
1724
- else
1725
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1726
- }
1727
- }
1728
- else {
1729
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
1730
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1731
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
1732
- }
1733
- if (dataview.isEmptyDataview())
1734
- this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, false);
1735
- else
1736
- this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, true);
1737
- this.ActionManager.enable(InternalInterface.MG_ACT_ENTER_ROW_EDITING, true);
1738
- this.ActionManager.enable(InternalInterface.MG_ACT_NO_PROG_EXE_RIGHTS, true);
1739
- });
1740
- }
1741
- isStarted() {
1742
- return this._isStarted;
1743
- }
1744
- getSubTasks() {
1745
- return this.SubTasks;
1746
- }
1747
- refreshesOn(fldId) {
1748
- let result = false;
1749
- for (let i = 0; !result && this.RefreshOnVars !== null && i < this.RefreshOnVars.length; i++) {
1750
- result = (this.RefreshOnVars[i] === fldId);
1751
- }
1752
- return result;
1753
- }
1754
- AbortTransaction() {
1755
- this.DataviewManager.RemoteDataviewManager.Transaction = null;
1756
- }
1757
- setPreventRecordSuffix(val) {
1758
- this._preventRecordSuffix = val;
1759
- }
1760
- getPreventRecordSuffix() {
1761
- return this._preventRecordSuffix;
1762
- }
1763
- setPreventControlChange(val) {
1764
- this._preventControlChange = val;
1765
- }
1766
- getPreventControlChange() {
1767
- return this._preventControlChange;
1768
- }
1769
- resetKnownToServer() {
1770
- this._knownToServer = false;
1771
- }
1772
- evaluateDescriptor() {
1773
- let result = "";
1774
- let res;
1775
- if (this.DvPosDescriptor == null)
1776
- return HashUtils.GetHashCode(result);
1777
- let first = true;
1778
- for (let i = 0; i < this.DvPosDescriptor.length; i++) {
1779
- if (!first)
1780
- result += ";";
1781
- let currentCell = this.DvPosDescriptor.get_Item(i);
1782
- let currentTag = currentCell[0];
1783
- let currentVeeIdx = NNumber.Parse(currentCell[1]);
1784
- let currentTask = AccessHelper.mgDataTable.GetTaskByID(currentTag);
1785
- let currentField = currentTask.DataView.getField(currentVeeIdx);
1786
- let dispVal = currentField.getDispValue();
1787
- if (currentField.isNull())
1788
- dispVal = "";
1789
- let pic;
1790
- switch (currentField.getType()) {
1791
- case StorageAttribute.BOOLEAN:
1792
- case StorageAttribute.ALPHA:
1793
- case StorageAttribute.UNICODE:
1794
- case StorageAttribute.BLOB:
1795
- case StorageAttribute.BLOB_VECTOR:
1796
- result += dispVal;
1797
- break;
1798
- case StorageAttribute.DATE:
1799
- case StorageAttribute.TIME:
1800
- if (dispVal !== "") {
1801
- pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
1802
- let conv = DisplayConvertor.Instance;
1803
- result += conv.mg2disp(dispVal, "", pic, false, this.getCompIdx(), false);
1804
- }
1805
- break;
1806
- case StorageAttribute.NUMERIC:
1807
- if (dispVal !== "") {
1808
- res = new NUM_TYPE(dispVal);
1809
- pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
1810
- result += res.to_a(pic);
1811
- }
1812
- break;
1813
- }
1814
- first = false;
1815
- }
1816
- let tmpStr2 = StrUtil.stringToHexaDump(result, 4);
1817
- return HashUtils.GetHashCode(tmpStr2);
1818
- }
1819
- setDescriptor(newDesc) {
1820
- if (!(newDesc.trim() === "")) {
1821
- let desc = StrUtil.tokenize(newDesc, ";");
1822
- this.DvPosDescriptor = new List();
1823
- for (let i = 0; i < desc.length; i = i + 1) {
1824
- let cell = new Array(2);
1825
- let tagVeePair = StrUtil.tokenize(desc[i], ",");
1826
- cell[0] = tagVeePair[0];
1827
- cell[1] = tagVeePair[1];
1828
- this.DvPosDescriptor.push(cell);
1829
- }
1830
- }
1831
- }
1832
- getTaskCache() {
1833
- return this._dvCache;
1834
- }
1835
- prepareCache(ignoreCurr) {
1836
- return __awaiter(this, void 0, void 0, function* () {
1837
- let success = true;
1838
- if (!ignoreCurr) {
1839
- if (yield this.isCached()) {
1840
- if (this.DataView.getChanged()) {
1841
- this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
1842
- success = false;
1843
- }
1844
- }
1845
- else {
1846
- if (this.IsSubForm && !(yield this.isCached())) {
1847
- success = false;
1848
- }
1849
- }
1850
- }
1851
- let curretTask;
1852
- if (this.hasSubTasks()) {
1853
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
1854
- curretTask = this.SubTasks.getTask(i);
1855
- if (!(yield curretTask.prepareCache(false))) {
1856
- success = false;
1857
- }
1858
- }
1859
- }
1860
- return success;
1861
- });
1862
- }
1863
- testAndSet(ignoreCurr) {
1864
- return __awaiter(this, void 0, void 0, function* () {
1865
- if (!ignoreCurr && (yield this.isCached())) {
1866
- let requestedDv = this.evaluateDescriptor();
1867
- if (requestedDv !== this.DataView.getDvPosValue()) {
1868
- let fromCache = this._dvCache.getCachedDataView(requestedDv);
1869
- if (fromCache == null)
1870
- return false;
1871
- yield this.changeDv(fromCache);
1872
- }
1873
- this.DoSubformPrefixSuffix = true;
1874
- }
1875
- if (this.hasSubTasks()) {
1876
- for (let i = 0; i < this.SubTasks.getSize(); i++) {
1877
- if (!(yield this.SubTasks.getTask(i).testAndSet(false)))
1878
- return false;
1879
- }
1880
- }
1881
- return true;
1882
- });
1883
- }
1884
- changeDv(fromCache) {
1885
- return __awaiter(this, void 0, void 0, function* () {
1886
- let dataview = this.DataView;
1887
- if (!this.hasLocate) {
1888
- if (!dataview.getChanged() && dataview.IncludesFirst())
1889
- this._dvCache.putInCache(dataview.replicate());
1890
- }
1891
- else
1892
- this.locatePutInCache();
1893
- yield dataview.setSameAs(fromCache);
1894
- dataview.takeFldValsFromCurrRec();
1895
- this.Form.SetTableItemsCount(0, true);
1896
- this.Form.setTableItemsCount(false);
1897
- yield this.Form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
1898
- this.setOriginalTaskMode(this.getMode());
1899
- });
1900
- }
1901
- setOriginalTaskMode(originalTaskMode) {
1902
- this._originalTaskMode = originalTaskMode.charAt(0);
1903
- }
1904
- getOriginalTaskMode() {
1905
- return this._originalTaskMode;
1906
- }
1907
- isCached() {
1908
- return __awaiter(this, void 0, void 0, function* () {
1909
- return this.IsSubForm && (yield this.Form.getSubFormCtrl().checkProp(PropInterface.PROP_TYPE_IS_CACHED, false));
1910
- });
1911
- }
1912
- locatePutInCache() {
1913
- let cached = this._dvCache.getCachedDataView(this.DataView.getDvPosValue());
1914
- if (cached != null) {
1915
- if (this.DataView.checkFirst(cached.getLocateFirstRec()) && !this.DataView.getChanged()) {
1916
- this.DataView.setLocateFirstRec(cached.getLocateFirstRec());
1917
- this._dvCache.putInCache(this.DataView.replicate());
1918
- }
1919
- else
1920
- this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
1921
- }
1922
- else {
1923
- if (!this.DataView.getChanged())
1924
- this._dvCache.putInCache(this.DataView.replicate());
1925
- }
1926
- }
1927
- HasLoacte() {
1928
- return this.hasLocate;
1929
- }
1930
- setRemoteTransaction(transId) {
1931
- let mgdTab = AccessHelper.mgDataTable;
1932
- let transTask;
1933
- let isFind = false;
1934
- mgdTab.startTasksIteration();
1935
- while ((transTask = mgdTab.getNextTask()) != null) {
1936
- if (transTask.DataviewManager.RemoteDataviewManager.Transaction != null &&
1937
- transTask.DataviewManager.RemoteDataviewManager.Transaction.getTransId() === transId) {
1938
- isFind = true;
1939
- break;
1940
- }
1941
- }
1942
- this.DataviewManager.RemoteDataviewManager.Transaction = (isFind ?
1943
- transTask.DataviewManager.RemoteDataviewManager.Transaction :
1944
- new Transaction(this, transId, false));
1945
- }
1946
- setTransOwnerTask() {
1947
- this.Transaction.setOwnerTask(this);
1948
- this.Transaction.setTransBegin('T');
1949
- }
1950
- getLoopCounter() {
1951
- let result = 0;
1952
- if (this._useLoopStack && this._loopStack !== null && !(this._loopStack.count() === 0)) {
1953
- result = this._loopStack.peek();
1954
- }
1955
- return result;
1956
- }
1957
- enterLoop() {
1958
- if (this._loopStack === null)
1959
- this._loopStack = new Stack();
1960
- this._loopStack.push(0);
1961
- }
1962
- leaveLoop() {
1963
- this.popLoopCounter();
1964
- }
1965
- popLoopCounter() {
1966
- let result = 0;
1967
- if (this._loopStack !== null && !(this._loopStack.count() === 0))
1968
- result = this._loopStack.pop();
1969
- return result;
1970
- }
1971
- increaseLoopCounter() {
1972
- this._loopStack.push(this.popLoopCounter() + 1);
1973
- }
1974
- getLoopStackSize() {
1975
- if (this._loopStack !== null)
1976
- return this._loopStack.count();
1977
- return 0;
1978
- }
1979
- setUseLoopStack(val) {
1980
- this._useLoopStack = val;
1981
- }
1982
- getDataviewHeaders() {
1983
- return this.DataviewHeadersTable;
1984
- }
1985
- isFirstRecordCycle(Value_) {
1986
- if (arguments.length === 0) {
1987
- return this.isFirstRecordCycle_0();
1988
- }
1989
- return this.isFirstRecordCycle_1(Value_);
1990
- }
1991
- isFirstRecordCycle_0() {
1992
- return this._firstRecordCycle;
1993
- }
1994
- isFirstRecordCycle_1(Value_) {
1995
- this._firstRecordCycle = Value_;
1996
- }
1997
- getPublicName() {
1998
- return this.PublicName;
1999
- }
2000
- isAllowEvents() {
2001
- return __awaiter(this, void 0, void 0, function* () {
2002
- let prop = this.getProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS);
2003
- return yield prop.getValueBoolean();
2004
- });
2005
- }
2006
- getExternalTaskId() {
2007
- let taskId = "";
2008
- let prop = this.getProp(PropInterface.PROP_TYPE_TASK_ID);
2009
- if (prop != null)
2010
- taskId = prop.GetComputedValue();
2011
- return taskId;
2012
- }
2013
- isTransactionOwner() {
2014
- let isTransOwner = false;
2015
- if (this.Transaction != null && this.Transaction.isOwner(this))
2016
- isTransOwner = true;
2017
- return isTransOwner;
2018
- }
2019
- isTransactionOnLevel(level) {
2020
- return this.isTransactionOwner() && this.Transaction.getLevel() === level;
2021
- }
2022
- isProgram() {
2023
- return this._isPrg;
2024
- }
2025
- enableModes() {
2026
- return __awaiter(this, void 0, void 0, function* () {
2027
- let enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
2028
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_MODIFY, enable);
2029
- enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true);
2030
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_CREATE, enable);
2031
- enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_QUERY, true);
2032
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_QUERY, enable);
2033
- enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_RANGE, true);
2034
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_RANGE, enable);
2035
- enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE, true);
2036
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_LOCATE, enable);
2037
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_SEARCH, enable);
2038
- enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_SORT, true);
2039
- this.ActionManager.enable(InternalInterface.MG_ACT_SORT_RECORDS, enable);
2040
- enable = yield this.checkProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX, true);
2041
- this.ActionManager.enable(InternalInterface.MG_ACT_VIEW_BY_KEY, enable);
2042
- });
2043
- }
2044
- setEnableZoomHandler() {
2045
- this._enableZoomHandler = true;
2046
- }
2047
- getEnableZoomHandler() {
2048
- return this._enableZoomHandler;
2049
- }
2050
- isDestinationSubform() {
2051
- return this._destinationSubform;
2052
- }
2053
- setDestinationSubform(destinationSubform) {
2054
- this._destinationSubform = destinationSubform;
2055
- }
2056
- getIsDestinationCall() {
2057
- return this._isDestinationCall;
2058
- }
2059
- setIsDestinationCall(isDestinationCall) {
2060
- this._isDestinationCall = isDestinationCall;
2061
- }
2062
- setCancelWasRaised(val) {
2063
- this._cancelWasRaised = val;
2064
- }
2065
- cancelWasRaised() {
2066
- return this._cancelWasRaised;
2067
- }
2068
- enableCreateActs(val) {
2069
- this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE, val);
2070
- this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE_ABOVE, (this.getForm().HasTable()) ? val : false);
2071
- }
2072
- setCreateDeleteActsEnableState() {
2073
- return __awaiter(this, void 0, void 0, function* () {
2074
- if (!(this.DataView).isEmptyDataview() && (yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true)) &&
2075
- this.getMode() === Constants.TASK_MODE_MODIFY && this.DataView.HasMainTable)
2076
- this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, true);
2077
- else
2078
- this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
2079
- if ((yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) &&
2080
- (this.DataView.HasMainTable &&
2081
- (this.getMode() === Constants.TASK_MODE_MODIFY && Environment.Instance.allowCreateInModifyMode(this.getCompIdx())) ||
2082
- (this.getMode() === Constants.TASK_MODE_CREATE)))
2083
- this.enableCreateActs(true);
2084
- else
2085
- this.enableCreateActs(false);
2086
- });
2087
- }
2088
- setEmptyDataview(emptyDataview) {
2089
- this.DataView.setEmptyDataview(emptyDataview);
2090
- }
2091
- getName() {
2092
- return this.Name;
2093
- }
2094
- emptyDataviewOpen(subformRefresh) {
2095
- return __awaiter(this, void 0, void 0, function* () {
2096
- if (this.getLevel() === Constants.TASK_LEVEL_TASK) {
2097
- this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, true);
2098
- if (this.IsSubForm) {
2099
- let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
2100
- if ((rtEvnt != null && rtEvnt.getInternalCode() == InternalInterface.MG_ACT_RT_REFRESH_VIEW) || subformRefresh) {
2101
- let rtEvt = new RunTimeEvent(this);
2102
- rtEvt.setInternal(InternalInterface.MG_ACT_EMPTY_DATAVIEW);
2103
- rtEvt.SetEventSubType(EventSubType.Normal);
2104
- yield AccessHelper.eventsManager.handleEvent(rtEvt, false);
2105
- }
2106
- }
2107
- else
2108
- AccessHelper.eventsManager.addInternalEventWithItaskAndCode(this, InternalInterface.MG_ACT_EMPTY_DATAVIEW);
2109
- this.setLevel(Constants.TASK_LEVEL_RECORD);
2110
- if (this.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME && subformRefresh && (yield this.CheckRefreshSubTasks())) {
2111
- yield this.DataView.computeSubForms();
2112
- yield this.doSubformRecPrefixSuffix();
2113
- }
2114
- yield this.enableRecordActions();
2115
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, false);
2116
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, false);
2117
- }
2118
- });
2119
- }
2120
- emptyDataviewClose() {
2121
- this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, false);
2122
- this.setLevel(Constants.TASK_LEVEL_TASK);
2123
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, true);
2124
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, true);
2125
- }
2126
- SubformRefresh(subformTask, explicitSubformRefresh) {
2127
- return __awaiter(this, void 0, void 0, function* () {
2128
- let currTask = LastFocusedManager.Instance.getLastFocusedTask();
2129
- let isInside = yield subformTask.ExecuteNestedRS(currTask);
2130
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2131
- return;
2132
- if (subformTask.getLevel() !== Constants.TASK_LEVEL_TASK && !AccessHelper.eventsManager.GetStopExecutionFlag()) {
2133
- AccessHelper.eventsManager.pushNewExecStacks();
2134
- yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_SUFFIX, true);
2135
- AccessHelper.eventsManager.popNewExecStacks();
2136
- isInside = true;
2137
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2138
- return;
2139
- }
2140
- let cmd = CommandFactory.CreateSubformRefreshCommand(this.getTaskTag(), subformTask.getTaskTag(), explicitSubformRefresh);
2141
- yield subformTask.DataviewManager.Execute(cmd);
2142
- if (subformTask.isAborting())
2143
- return;
2144
- if (explicitSubformRefresh) {
2145
- AccessHelper.eventsManager.pushNewExecStacks();
2146
- let performParentRecordPrefixOrg = subformTask.PerformParentRecordPrefix;
2147
- subformTask.PerformParentRecordPrefix = false;
2148
- yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_PREFIX, true);
2149
- subformTask.PerformParentRecordPrefix = performParentRecordPrefixOrg;
2150
- AccessHelper.eventsManager.popNewExecStacks();
2151
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2152
- return;
2153
- }
2154
- if (isInside) {
2155
- }
2156
- else {
2157
- if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
2158
- if (explicitSubformRefresh) {
2159
- yield AccessHelper.eventsManager.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_SUFFIX);
2160
- if (currTask != null)
2161
- currTask.DataView.setPrevCurrRec();
2162
- subformTask.DoSubformPrefixSuffix = false;
2163
- }
2164
- }
2165
- }
2166
- });
2167
- }
2168
- ExecuteNestedRS(lastTask) {
2169
- return __awaiter(this, void 0, void 0, function* () {
2170
- let isExecuteNestedRS = false;
2171
- if (lastTask == null)
2172
- return isExecuteNestedRS;
2173
- if (this.getLevel() !== Constants.TASK_LEVEL_TASK && lastTask.getMgdID() !== this.getMgdID())
2174
- return isExecuteNestedRS;
2175
- for (let task = lastTask; task !== this && task.pathContains(this) && task.getLevel() !== Constants.TASK_LEVEL_TASK; task = task.getParent()) {
2176
- AccessHelper.eventsManager.pushNewExecStacks();
2177
- yield AccessHelper.eventsManager.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2178
- AccessHelper.eventsManager.popNewExecStacks();
2179
- isExecuteNestedRS = true;
2180
- }
2181
- return isExecuteNestedRS;
2182
- });
2183
- }
2184
- execSubformRecSuffix(newTask) {
2185
- return __awaiter(this, void 0, void 0, function* () {
2186
- let subfTask;
2187
- let i, idx = 0;
2188
- for (i = this._taskPath.length; i > 0; i--) {
2189
- subfTask = this._taskPath.get_Item(i - 1);
2190
- if (!newTask._taskPath.Contains(subfTask)) {
2191
- yield AccessHelper.eventsManager.handleInternalEventWithTask(subfTask, InternalInterface.MG_ACT_REC_SUFFIX);
2192
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2193
- break;
2194
- if (subfTask.getMode() === Constants.TASK_MODE_CREATE && !(subfTask.DataView.getCurrRec()).isNewRec())
2195
- subfTask.setMode(Constants.TASK_MODE_MODIFY);
2196
- }
2197
- else {
2198
- idx = newTask._taskPath.indexOf(subfTask);
2199
- break;
2200
- }
2201
- }
2202
- Debug.Assert(i > 0);
2203
- return idx;
2204
- });
2205
- }
2206
- getCounter() {
2207
- return this._counter;
2208
- }
2209
- increaseCounter() {
2210
- this._counter = this._counter + 1;
2211
- }
2212
- setCounter(cnt) {
2213
- this._counter = cnt;
2214
- }
2215
- isCurrentStartProgLevel() {
2216
- return this._currStartProgLevel === Task.StartProgLevel;
2217
- }
2218
- static isMainProgramField(fieldStr) {
2219
- let Field = XmlParser.getTokens(fieldStr, ',');
2220
- let mainProgField = false;
2221
- if (Field.length === 2) {
2222
- let parent = NNumber.Parse(Field.get_Item(0));
2223
- if (parent === TaskBase.MAIN_PRG_PARENT_ID)
2224
- mainProgField = true;
2225
- }
2226
- return mainProgField;
2227
- }
2228
- getTaskInfo() {
2229
- let taskName = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
2230
- return NString.Format('{0} {1}', this.isProgram() ? 'Program' : 'Subtask', taskName);
2231
- }
2232
- toString() {
2233
- return NString.Format("(task {0}-\"{1}\"{2})", this._taskTag, this.Name, super.isMainProg() ? (" ctl " + this._ctlIdx) : "");
2234
- }
2235
- ConstructMgForm(alreadySetParentForm) {
2236
- let form = new MgForm();
2237
- let parentForm = (this.ParentTask != null ? this.ParentTask.getForm() : null);
2238
- while (parentForm != null && !parentForm.getTask().isOpenWin()) {
2239
- parentForm = parentForm.ParentForm;
2240
- }
2241
- form.ParentForm = parentForm;
2242
- alreadySetParentForm.value = true;
2243
- return form;
2244
- }
2245
- getMgdID() {
2246
- return this._mgData.GetId();
2247
- }
2248
- getMGData() {
2249
- return this._mgData;
2250
- }
2251
- RefreshDisplay() {
2252
- return __awaiter(this, void 0, void 0, function* () {
2253
- if (this.Form !== null && !this.isAborting() && this.isStarted()) {
2254
- Logger.Instance.WriteDevToLog("Start task.RefreshDisplay()");
2255
- if (this._refreshType !== Constants.TASK_REFRESH_NONE) {
2256
- let form = this.Form;
2257
- let wasRefreshed = yield form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
2258
- if (wasRefreshed) {
2259
- this._refreshType = Constants.TASK_REFRESH_NONE;
2260
- }
2261
- }
2262
- Logger.Instance.WriteDevToLog("End task.RefreshDisplay()");
2263
- }
2264
- });
2265
- }
2266
- getFieldDisplayValue(fieldDef, value, isNull) {
2267
- value.value = fieldDef.getDispValue();
2268
- isNull.value = fieldDef.isNull();
2269
- }
2270
- UpdateFieldValueAndStartRecompute(fieldDef, value, isNull) {
2271
- return __awaiter(this, void 0, void 0, function* () {
2272
- if (this.TaskPrefixExecuted) {
2273
- yield fieldDef.setValueAndStartRecompute(value, isNull, true, false, false);
2274
- }
2275
- });
2276
- }
2277
- ShouldNonInteractiveChildBeModal() {
2278
- return this.ShouldChildBeModal();
2279
- }
2280
- ShouldChildBeModal() {
2281
- let childShouldBehaveAsModal = false;
2282
- if ((this.Form.ConcreteWindowType === WindowType.Overlay) && this.getForm().Opened)
2283
- childShouldBehaveAsModal = true;
2284
- else if (!this.IsInteractive) {
2285
- childShouldBehaveAsModal = true;
2286
- }
2287
- return childShouldBehaveAsModal;
2288
- }
2289
- getParent() {
2290
- return this._parentTask;
2291
- }
2292
- isDescendentOf(chkTask) {
2293
- if (chkTask === this)
2294
- return true;
2295
- else if (chkTask === null || this._parentTask === null)
2296
- return false;
2297
- return this._parentTask.isDescendentOf(chkTask);
2298
- }
2299
- GetSubformModalParentTask() {
2300
- let currTask = this;
2301
- while (currTask._parentTask != null && currTask._parentTask.getIsDestinationCall()) {
2302
- let subformCtrl = (currTask._parentTask.getForm().getSubFormCtrl());
2303
- if (subformCtrl.IsModal()) {
2304
- return subformCtrl;
2305
- }
2306
- currTask = currTask._parentTask;
2307
- }
2308
- return null;
2309
- }
2310
- ShouldEvaluatePropertyLocally(propId) {
2311
- return this.TaskService.ShouldEvaluatePropertyLocally(propId);
2312
- }
2313
- EnsureValidForm() {
2314
- if (this._isMainPrg && this.Form !== null) {
2315
- if (!this._openWin || !this.Form.isLegalForm) {
2316
- this.Form = null;
2317
- }
2318
- }
2319
- }
2320
- ComputeMainDisplay() {
2321
- let propMainDisplay = this.getProp(PropInterface.PROP_TYPE_MAIN_DISPLAY);
2322
- let mainDisplayIndex = propMainDisplay.GetComputedValueInteger();
2323
- mainDisplayIndex = this.GetRealMainDisplayIndexOnCurrentTask(mainDisplayIndex);
2324
- this._forms.InitFormFromXmlString(mainDisplayIndex);
2325
- this.EnsureValidForm();
2326
- }
2327
- PrepareTaskForm() {
2328
- return __awaiter(this, void 0, void 0, function* () {
2329
- yield TaskServiceBase.PreparePropOpenTaskWindow(this);
2330
- return RemoteTaskService.PreparePropMainDisplay(this);
2331
- });
2332
- }
2333
- FormIsLegal() {
2334
- let isFormIsLegal = super.isMainProg();
2335
- return isFormIsLegal || super.getForm().isLegalForm;
2336
- }
2337
- GetRealMainDisplayIndexOnDepth(mainDspIdx) {
2338
- let task = this.LogicalStudioParentTask;
2339
- while (task != null) {
2340
- mainDspIdx += task._forms.Count;
2341
- task = task.LogicalStudioParentTask;
2342
- }
2343
- return mainDspIdx;
2344
- }
2345
- GetRealMainDisplayIndexOnCurrentTask(mainDspIdx) {
2346
- if (mainDspIdx > 1) {
2347
- let task = this.LogicalStudioParentTask;
2348
- while (task != null) {
2349
- mainDspIdx -= task._forms.Count;
2350
- task = task.LogicalStudioParentTask;
2351
- }
2352
- }
2353
- return mainDspIdx;
2354
- }
2355
- GetAncestorTaskByTaskDefinitionId(findTaskDefinitionId) {
2356
- let currentTask = this;
2357
- if (findTaskDefinitionId.IsMainProgram())
2358
- return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, findTaskDefinitionId.CtlIndex);
2359
- while (currentTask != null) {
2360
- if (currentTask.TaskDefinitionId.Equals(findTaskDefinitionId))
2361
- return currentTask;
2362
- currentTask = currentTask._parentTask;
2363
- }
2364
- return null;
2365
- }
2366
- SetDataControlValuesReference(controlId, dcValuesId) {
2367
- let ctrl = super.getForm().getCtrl(controlId);
2368
- ctrl.setDcValId(dcValuesId);
2369
- }
2370
- DisplayMessageToStatusBar(text) {
2371
- let taskToVerifyOn = this.GetContextTask();
2372
- if (taskToVerifyOn.getForm() == null)
2373
- taskToVerifyOn = LastFocusedManager.Instance.getLastFocusedTask();
2374
- taskToVerifyOn.WriteToMessagePane(text, true);
2375
- }
2376
- isTableWithAbsolutesScrollbar() {
2377
- let isTableWithAbsolutesScrollbar = false;
2378
- if (this.getForm() != null)
2379
- isTableWithAbsolutesScrollbar = this.getForm().isTableWithAbsoluteScrollbar();
2380
- return isTableWithAbsolutesScrollbar;
2381
- }
2382
- GetTaskDetails() {
2383
- let names = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
2384
- let task = this;
2385
- while (task.ParentTask !== null && !task.ParentTask.isMainProg()) {
2386
- task = task.ParentTask;
2387
- names = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + "." + names;
2388
- }
2389
- return names;
2390
- }
2391
- static ProcessTaskURL() {
2392
- return __awaiter(this, void 0, void 0, function* () {
2393
- let xmlData = RuntimeContextBase.Instance.Parser.getXMLdata();
2394
- let endTaskUrlIdx = xmlData.indexOf(XMLConstants.TAG_CLOSE, RuntimeContextBase.Instance.Parser.getCurrIndex());
2395
- Debug.Assert(endTaskUrlIdx !== -1 && endTaskUrlIdx < xmlData.length);
2396
- let tag = RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx);
2397
- RuntimeContextBase.Instance.Parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_TASKURL) + ConstInterface.MG_TAG_TASKURL.length);
2398
- let tokensVector = XmlParser.getTokens(RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx), XMLConstants.XML_ATTR_DELIM);
2399
- let taskCacheURL = tokensVector.get_Item(1);
2400
- let refListStr = tokensVector.get_Item(3);
2401
- let taskContentOriginal = yield Task.CommandsProcessor.GetContent(taskCacheURL, true);
2402
- let taskContentFinal = new StringBuilder(xmlData.substr(0, RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1)), taskContentOriginal.length);
2403
- let reflist = this.getReflist(refListStr, ';', true, -1);
2404
- let refListIdx = 0;
2405
- let currIdx = taskContentOriginal.indexOf("[:");
2406
- let prevIdx = 0;
2407
- while (currIdx !== -1) {
2408
- taskContentFinal.Append(taskContentOriginal.substr(prevIdx, currIdx - prevIdx));
2409
- taskContentFinal.Append(reflist.get_Item(refListIdx++));
2410
- currIdx += 2;
2411
- prevIdx = currIdx;
2412
- currIdx = taskContentOriginal.indexOf("[:", prevIdx);
2413
- }
2414
- taskContentFinal.Append(taskContentOriginal.substr(prevIdx));
2415
- taskContentFinal.Append(xmlData.substr(xmlData.indexOf(XMLConstants.TAG_CLOSE, endTaskUrlIdx + 1) + 1));
2416
- xmlData = taskContentFinal.ToString();
2417
- Logger.Instance.WriteDevToLog(NString.Format("{0} -------> {1}", taskCacheURL, xmlData));
2418
- RuntimeContextBase.Instance.Parser.setXMLdata(xmlData);
2419
- RuntimeContextBase.Instance.Parser.setCurrIndex(RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1));
2420
- });
2421
- }
2422
- static getReflist(data, delim, trunc, maxTokens) {
2423
- let currStr = new StringBuilder();
2424
- let list = new List();
2425
- let tokensCnt = 0;
2426
- for (let i = 1; i < data.length; i++) {
2427
- let curr = data.charAt(i);
2428
- if (curr !== '\\' && curr !== delim)
2429
- currStr.Append(curr);
2430
- else if (curr === delim) {
2431
- list.push(currStr.ToString());
2432
- currStr = new StringBuilder();
2433
- tokensCnt++;
2434
- if (tokensCnt === maxTokens)
2435
- break;
2436
- }
2437
- else if (curr === '\\') {
2438
- if (!trunc && data.charAt(i + 1) !== delim)
2439
- currStr.Append(data.charAt(i));
2440
- i++;
2441
- currStr.Append(data.charAt(i));
2442
- }
2443
- }
2444
- list.push(currStr.ToString());
2445
- return list;
2446
- }
2447
- static StartProgram(callByDestSubForm, moveToFirstControl) {
2448
- return __awaiter(this, void 0, void 0, function* () {
2449
- let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
2450
- let nonInteractiveTaskAlreadyExecuted = null;
2451
- let allowEvents = AccessHelper.eventsManager.getAllowEvents();
2452
- AccessHelper.eventsManager.setAllowEvents(EventsAllowedType.ALL);
2453
- Logger.Instance.WriteDevToLog("Start \"startProg\"");
2454
- Task.StartProgLevel++;
2455
- AccessHelper.eventsManager.setStopExecution(false);
2456
- nonInteractiveTaskAlreadyExecuted = yield this.ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl);
2457
- let nonInteractiveTaskAlreadyExecutedRef = new RefParam(nonInteractiveTaskAlreadyExecuted);
2458
- let currentNonInteractiveTaskRef = new RefParam(null);
2459
- yield Task.ExecuteMainProgram(0, callByDestSubForm, moveToFirstControl, nonInteractiveTaskAlreadyExecutedRef, currentNonInteractiveTaskRef, AccessHelper.mgDataTable);
2460
- nonInteractiveTaskAlreadyExecuted = nonInteractiveTaskAlreadyExecutedRef.value;
2461
- if (!Task._idleTimerStarted) {
2462
- GUIManager.Instance.startTimer(AccessHelper.mgDataTable.getMGData(0), Environment.Instance.getIdleTime(0), true);
2463
- Task._idleTimerStarted = true;
2464
- }
2465
- yield this.OpenForms(callByDestSubForm);
2466
- yield this.DoFirstRecordCycle();
2467
- yield this.MoveToFirstControls(callByDestSubForm);
2468
- if (Task.StartProgLevel === 1) {
2469
- let resetAllowEvents = false;
2470
- let canExecuteEvents = true;
2471
- if (nonInteractiveTaskAlreadyExecuted !== null && nonInteractiveTaskAlreadyExecuted.isStarted()) {
2472
- resetAllowEvents = true;
2473
- AccessHelper.eventsManager.setNonInteractiveAllowEvents(yield nonInteractiveTaskAlreadyExecuted.isAllowEvents(), nonInteractiveTaskAlreadyExecuted);
2474
- canExecuteEvents = yield nonInteractiveTaskAlreadyExecuted.isAllowEvents();
2475
- }
2476
- if (LastFocusedManager.Instance.getLastFocusedTask() !== null && canExecuteEvents) {
2477
- AccessHelper.eventsManager.pushNewExecStacks();
2478
- yield AccessHelper.eventsManager.handleEvents(AccessHelper.mgDataTable.getCurrMGData(), 0);
2479
- AccessHelper.eventsManager.popNewExecStacks();
2480
- }
2481
- if (resetAllowEvents)
2482
- AccessHelper.eventsManager.setAllowEvents(allowEvents);
2483
- }
2484
- Task.StartProgLevel--;
2485
- Logger.Instance.WriteDevToLog("End \"startProg\"");
2486
- if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
2487
- if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
2488
- AccessHelper.eventsManager.setStopExecution(orgStopExecution);
2489
- return nonInteractiveTaskAlreadyExecuted;
2490
- });
2491
- }
2492
- static ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl) {
2493
- return __awaiter(this, void 0, void 0, function* () {
2494
- let currentNonInteractiveTask = new RefParam(null);
2495
- let nonInteractiveTaskAlreadyExecuted = new RefParam(null);
2496
- let maxCtlIdx = AccessHelper.mgDataTable.getMGData(0).getMaxCtlIdx();
2497
- for (let i = 1; i <= maxCtlIdx; i = i + 1) {
2498
- let componentMainProgram = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, i);
2499
- if (componentMainProgram !== null)
2500
- yield Task.ExecuteMainProgram(i, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, AccessHelper.mgDataTable);
2501
- }
2502
- return nonInteractiveTaskAlreadyExecuted.value;
2503
- });
2504
- }
2505
- static ExecuteMainProgram(CtlIndex, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, mgDataTable) {
2506
- return __awaiter(this, void 0, void 0, function* () {
2507
- let mainProgramTask = mgDataTable.GetMainProgByCtlIdx(-1, CtlIndex);
2508
- Logger.Instance.WriteDevToLog(NString.Format(" ClientManager.startProg: ctlIdx={0}, task={1}", CtlIndex, mainProgramTask));
2509
- currentNonInteractiveTask.value = (yield mainProgramTask.Start(moveToFirstControl, callByDestSubForm));
2510
- if (nonInteractiveTaskAlreadyExecuted.value === null)
2511
- nonInteractiveTaskAlreadyExecuted.value = currentNonInteractiveTask.value;
2512
- else if (currentNonInteractiveTask.value !== null) {
2513
- Debug.Assert(false, "more than 1 non interactive tasks in startProg");
2514
- }
2515
- });
2516
- }
2517
- static OpenForms(callByDestSubForm) {
2518
- return __awaiter(this, void 0, void 0, function* () {
2519
- let createdForms = MgForm.CreatedForms;
2520
- let outMostForm = null;
2521
- if (createdForms.Count() > 0) {
2522
- let i = 0;
2523
- while (i < createdForms.Count()) {
2524
- let mgForm = createdForms.get(i);
2525
- let canOpen = false;
2526
- if (mgForm.isSubForm()) {
2527
- let opened = mgForm.getSubFormCtrl().getForm().Opened;
2528
- if (opened) {
2529
- canOpen = true;
2530
- }
2531
- }
2532
- else {
2533
- if (mgForm.getTask().isCurrentStartProgLevel()) {
2534
- canOpen = true;
2535
- }
2536
- }
2537
- if (canOpen) {
2538
- Manager.OpenForm(mgForm);
2539
- yield Manager.DoFirstRefreshTable(mgForm);
2540
- }
2541
- if (mgForm.Opened) {
2542
- if (callByDestSubForm && mgForm.isSubForm())
2543
- outMostForm = mgForm.getTopMostForm();
2544
- createdForms.remove(mgForm);
2545
- }
2546
- else
2547
- i++;
2548
- }
2549
- }
2550
- });
2551
- }
2552
- static DoFirstRecordCycle() {
2553
- return __awaiter(this, void 0, void 0, function* () {
2554
- for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
2555
- let mgd = AccessHelper.mgDataTable.getMGData(i);
2556
- if (mgd === null || mgd.IsAborting)
2557
- continue;
2558
- for (let j = 0; j < mgd.getTasksCount(); j++) {
2559
- let task = mgd.getTask(j);
2560
- if (task !== null) {
2561
- let mgForm = task.getForm();
2562
- if (mgForm !== null && task.isCurrentStartProgLevel() && !mgForm.IgnoreFirstRecordCycle) {
2563
- mgForm.IgnoreFirstRecordCycle = true;
2564
- yield task.doFirstRecordCycle();
2565
- }
2566
- }
2567
- }
2568
- }
2569
- });
2570
- }
2571
- static MoveToFirstControls(callByDestSubForm) {
2572
- return __awaiter(this, void 0, void 0, function* () {
2573
- for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
2574
- let mgd = AccessHelper.mgDataTable.getMGData(i);
2575
- if (mgd === null || mgd.IsAborting)
2576
- continue;
2577
- let tasksCount = mgd.getTasksCount();
2578
- for (let j = 0; j < tasksCount; j++) {
2579
- let task = mgd.getTask(j);
2580
- let mgForm = task.getForm();
2581
- if (task.isCurrentStartProgLevel() && mgForm !== null && mgForm.MovedToFirstControl) {
2582
- mgForm.MovedToFirstControl = false;
2583
- if (!callByDestSubForm)
2584
- yield AccessHelper.eventsManager.HandleNonParkableControls(task);
2585
- }
2586
- }
2587
- }
2588
- });
2589
- }
2590
- }
2591
- Task.StartProgLevel = 0;
2592
- Task._idleTimerStarted = false;
2593
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoSCxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQUUsZ0JBQWdCLEVBQ3hCLGdCQUFnQixFQUNoQixPQUFPLEVBRVAsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFFaEIsaUJBQWlCLEVBRWpCLE9BQU8sRUFHUCxRQUFRLEVBQ1IsR0FBRyxFQUVILGFBQWEsRUFDYixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLEtBQUssRUFDTixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUF5Qix3Q0FBd0MsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFB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LE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV0RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV0RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRSxDQUFD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QixHQUFZLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlYnVnLCBIYXNoVXRpbHMsIExpc3QsIE5OdW1iZXIsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlciB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLCBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVbmlxdWVUc2tTb3J0LFxyXG4gIFdpbmRvd1R5cGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBEaXNwbGF5Q29udmVydG9yLFxyXG4gIEZpZWxkRGVmLFxyXG4gIEd1aURhdGFDb2xsZWN0aW9uLFxyXG4gIElUYXNrLFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIE5VTV9UWVBFLFxyXG4gIFBJQyxcclxuICBQcm9wZXJ0eSxcclxuICBQcm9wSW50ZXJmYWNlLFxyXG4gIFJlY29yZFV0aWxzLFxyXG4gIFJ1bnRpbWVDb250ZXh0QmFzZSxcclxuICBTdHlsZXMsXHJcbiAgVGFza0RlZmluaXRpb25JZCxcclxuICBFdmVudHMsXHJcbiAgSGVscHNcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi4vZXZlbnQvRXZlbnQnO1xyXG5pbXBvcnQgeyBEYXRhVmlldyB9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQgeyBEdkNhY2hlIH0gZnJvbSAnLi4vZGF0YS9EdkNhY2hlJztcclxuaW1wb3J0IHsgTUdEYXRhIH0gZnJvbSAnLi9NR0RhdGEnO1xyXG5pbXBvcnQgeyBEYXRhVmlld0NvbW1hbmRUeXBlIH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHsgQ29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uIH0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHsgVGFza1NlcnZpY2VCYXNlIH0gZnJvbSAnLi9UYXNrU2VydmljZUJhc2UnO1xyXG5pbXBvcnQgeyBBcmd1bWVudHNMaXN0IH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9kYXRhL1Rhc2tUcmFuc2FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQgeyBEYXRhdmlld01hbmFnZXIgfSBmcm9tICcuLi9kYXRhL0RhdGF2aWV3TWFuYWdlcic7XHJcbmltcG9ydCB7IFNvcnRDb2xsZWN0aW9uIH0gZnJvbSAnLi9zb3J0L1NvcnRDb2xsZWN0aW9uJztcclxuaW1wb3J0IHsgU29ydCB9IGZyb20gJy4vc29ydC9Tb3J0JztcclxuaW1wb3J0IHsgTWdGb3JtIH0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBSZW1vdGVUYXNrU2VydmljZSB9IGZyb20gJy4vUmVtb3RlVGFza1NlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXR1cm5SZXN1bHQgfSBmcm9tICcuLi91dGlsL1JldHVyblJlc3VsdCc7XHJcbmltcG9ydCB7IFJ1blRpbWVFdmVudCB9IGZyb20gJy4uL2V2ZW50L1J1blRpbWVFdmVudCc7XHJcbmltcG9ydCB7IElDbGllbnRDb21tYW5kIH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQgeyBDb21tYW5kRmFjdG9yeSB9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0NvbW1hbmRGYWN0b3J5JztcclxuaW1wb3J0IHsgRGF0YXZpZXdIZWFkZXJzIH0gZnJvbSAnLi4vcnQvRGF0YXZpZXdIZWFkZXJzJztcclxuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9ydC9UcmFuc2FjdGlvbic7XHJcbmltcG9ydCB7IFRhc2tzVGFibGUgfSBmcm9tICcuL1Rhc2tzVGFibGUnO1xyXG5pbXBvcnQgeyBJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kIH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudFRhcmdldGVkQ29tbWFuZCc7XHJcbmltcG9ydCB7IEhhbmRsZXJzVGFibGUgfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHsgUmVjb21wdXRlVGFibGUgfSBmcm9tICcuLi9ydC9SZWNvbXB1dGVUYWJsZSc7XHJcbmltcG9ydCB7IEV4cFRhYmxlIH0gZnJvbSAnLi4vZXhwL0V4cFRhYmxlJztcclxuaW1wb3J0IHsgVXNlckV2ZW50c1RhYmxlIH0gZnJvbSAnLi4vZXZlbnQvVXNlckV2ZW50c1RhYmxlJztcclxuaW1wb3J0IHsgRm9ybXNUYWJsZSB9IGZyb20gJy4uL2d1aS9Gb3Jtc1RhYmxlJztcclxuaW1wb3J0IHsgRmxvd01vbml0b3JRdWV1ZSB9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vZGF0YS9GaWVsZCc7XHJcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9ldmVudC9BY3Rpb25NYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHAvRXhwcmVzc2lvbic7XHJcbmltcG9ydCB7IEZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlIH0gZnJvbSAnLi4vZGF0YS9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7IEdVSU1hbmFnZXIgfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyIH0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQgeyBFdmVudFN1YlR5cGUgfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7IE9wZW5pbmdUYXNrRGV0YWlscywgVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZSwgVXNlclJhbmdlIH0gZnJvbSAnLi9UYXNrQmFzZSc7XHJcbmltcG9ydCB7IExhbmd1YWdlRGF0YSB9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IExhc3RGb2N1c2VkTWFuYWdlciB9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7IEdsb2JhbENvbW1hbmRzTWFuYWdlciB9IGZyb20gJy4uL0dsb2JhbENvbW1hbmRzTWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50c0FsbG93ZWRUeXBlIH0gZnJvbSAnLi4vZXZlbnQvSUV2ZW50c01hbmFnZXInO1xyXG5pbXBvcnQgeyBDcmVhdGVkRm9ybVZlY3RvciB9IGZyb20gJy4uL2d1aS9DcmVhdGVkRm9ybVZlY3Rvcic7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcbmltcG9ydCB7IElNR0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9JTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAndXRpbCc7XHJcbmltcG9ydCB7IE1HRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQgeyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5pbXBvcnQgeyBFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi4vZXZlbnQvRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5cclxuZXhwb3J0IGVudW0gVGFza19GbG93IHtcclxuICBOT05FLFxyXG4gIFNURVAsXHJcbiAgRkFTVFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUYXNrX0RpcmVjdGlvbiB7XHJcbiAgQkFDSyA9IC0xLFxyXG4gIE5PTkUsXHJcbiAgRk9SRVxyXG59XHJcblxyXG5lbnVtIEZsb3dNb2RlRGlyIHtcclxuICBOT05FID0gJyAnLFxyXG4gIEZBU1RfQkFDS1dBUkQgPSAnUicsXHJcbiAgRkFTVF9GT1JXQVJEID0gJ0YnLFxyXG4gIFNURVBfQkFDS1dBUkQgPSAnUCcsXHJcbiAgU1RFUF9GT1JXQVJEID0gJ04nXHJcbn1cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBUYXNrIGV4dGVuZHMgVGFza0Jhc2Uge1xyXG4gIHByaXZhdGUgX2R2Q2FjaGU6IER2Q2FjaGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX21nRGF0YTogTUdEYXRhID0gbnVsbDtcclxuICBwcml2YXRlIF9hYm9ydGluZzogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGFuIGFib3J0IGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZvciB0aGlzIHRhc2sgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnNcclxuICBwcml2YXRlIF9iRXhlY0VuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmFsT2xkVmFsdWVzOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgZm9yIHRoZSBnZXQgdmFsdWUgdG8gZ2V0IHRoZSBvbGQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2UgYXJlIGluIHJlY29yZCBzdWZmaXggKGhhbmRsZSBiZWZvcmUpXHJcbiAgcHJpdmF0ZSBfY2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgLy8gd2FzIGNhbmNlbC9xdWl0IGV2ZW50IHJhaXNlZCA/XHJcbiAgcHJpdmF0ZSBfY291bnRlcjogbnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2VzIG9ubHkgaW4gbm9uIGludGVydmFsIHRhc2tzLlxyXG4gIHByaXZhdGUgX2N1cnJTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBzdGFydFByb2cgcmVxdWVzdCBpbiB3aGljaCB3ZSB0YXNrIGlzIHN0YXJ0ZWRcclxuICBwcml2YXRlIF9kZXN0aW5hdGlvblN1YmZvcm06IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIHByaXZhdGUgX2VuYWJsZVpvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBmaXJzdCByZWNvcmQgY3ljbGVcclxuICBwcml2YXRlIF9vcmlnaW5hbFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgcHJpdmF0ZSBfaW5DcmVhdGVMaW5lOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8gaXMgdGhlIHRhc2sgaW50byBwcm9jZXNzaW5nIENSRUFURSBMSU5FXHJcbiAgcHVibGljIEluU2VsZWN0OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgd2hlbiB0aGUgdGFzayBpcyBleGVjdXRpbmcgYSBTRUxFQ1QgaW50ZXJuYWwgZXZlbnRcclxuICBwdWJsaWMgSW5TdGFydFByb2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzayBieSBjYWxsIG9wZXJhdGlvblxyXG4gIHByaXZhdGUgX2tub3duVG9TZXJ2ZXI6IGJvb2xlYW4gPSB0cnVlOyAgICAgICAgICAgICAgIC8vIEZhbHNlIGlmIHRoZSBzZXJ2ZXIgaGFzXHJcbiAgcHJpdmF0ZSBfbG9vcFN0YWNrOiBTdGFjazxudW1iZXI+ID0gbnVsbDtcclxuICBwcml2YXRlIGFsbG93UmVtb3RlQ21kRXhlY3V0aW9uOiBib29sZWFuO1xyXG4gIHB1YmxpYyBEZWxheUNvbW1hbmRFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBjb250YWluaW5nIHRoZSBDYWxsIG9wZXJhdGlvbi5cclxuICAvLy8gVGhpcyBtZW1iZXIgaXMgdXNlZCBmb3Igc2VhcmNoaW5nIHRoZSB2YXJpYWJsZXMgbGlrZSBWYXJJbmRleCgpLCBldGNcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfcGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnZXQgUGFyZW50VGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb250ZXh0VGFzazogVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBjb250ZXh0IG9mIHdoaWNoIHRhc2sgdGhpcyB0YXNrIGlzIGN1cnJlbnRseSBydW5uaW5nXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHNhbWUgYXMgX3BhcmVudFRhc2sgZXhjZXB0IGZvciBNb2RhbCB0YXNrcy4gSW4gY2FzZSwgdGhlIGN1cnJlbnQgdGFzayBpcyBtb2RhbCwgX3RyaWdnZXJpbmdUYXNrIHJlZmVycyB0b1xyXG4gIC8vLyAgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBvZiB0aGUgX3BhcmVudFRhc2suIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIGFsbCBnZW5lcmF0aW9uLWJhc2VkIGZ1bmN0aW9ucyBhbmQgUHJvZygpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdHJpZ2dlcmluZ1Rhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBpcyB0aGUgdGFzayB3aGljaCBjb250YWluZWQgdGhlIENhbGwgb3BlcmF0aW9uLiBJZiB0aGUgdGFzayB3YXMgZXhlY3V0ZWQgd2l0aG91dCBjYWxsXHJcbiAgLy8vICAgb3BlcmF0aW9uIGVnLiB0aGUgTVAsIHRoZSBzdGFydHVwIHByb2dyYW0sIGV0Yy4sIGl0IHJlZmVycyB0byBpdHNlbGYuIFRoaXMgbWVtYmVyIHVzZWQgdG8gc2VhcmNoIGZvciB0aGUgZXZlbnQgaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBQYXRoUGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZlbnRDb250cm9sQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcHJldmVudFJlY29yZFN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Rhc2tQYXRoOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuXHJcbiAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIGN1cnJlbnRseSB0cnlpbmcgdG8gY29tbWl0IGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIHByaXZhdGUgX3RyeWluZ1RvQ29tbWl0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNldCBUcnlpbmdUb0NvbW1pdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdHJ5aW5nVG9Db21taXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBUcnlpbmdUb0NvbW1pdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cnlpbmdUb0NvbW1pdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZUxvb3BTdGFjazogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIChMT09QQ09VTlRFUigpKSBpcyBpbiB0aGUgc2NvcGUgb2YgQmxvY2sgTG9vcC5cclxuICBwcml2YXRlIF9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBJbkhhbmRsZUFjdENhbmNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBSdW50aW1lU29ydHM6IFNvcnRDb2xsZWN0aW9uID0gbnVsbDtcclxuICBwdWJsaWMgVmV3Rmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIGRhdGFWaWV3Q29udGVudDogc3RyaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgLy8gZGF0YVZpZXdDb250ZW50IHJldHJpZXZlZCBieSBHZXREYXRhVmlld0NvbnRlbnQgY29tbWFuZC5cclxuICBwdWJsaWMgUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDogYm9vbGVhbiA9IGZhbHNlOyAgICAvLyBJbiByZWNvcmQgcHJlZml4IChjb21tb25IYW5kbGVyQmVmb3JlKSB3ZSBleGVjdXRlIHJlY29yZCBwcmVmaXggb2YgYWxsIGZhdGhlcnMuXHJcblxyXG4gIC8vIEJ1dCB3ZSBkbyBub3QgbmVlZCBpdCBpbiBhbGwgY2FzZXMuXHJcbiAgLy8gV2hlbiB3ZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIGl0LlxyXG4gIC8vIFdoZW4gd2UgY2xpY2sgb24gdGhlIG5lc3RlZCBzdWJmb3JtIHdlIG5lZWQgaXQuXHJcbiAgLy8gaWYgdHJ1ZSwgZG8gdGhlIHBhcmVudCBzdWJmb3JtIHJlY29yZCBwcmVmaXhcclxuXHJcbiAgLy8gLTEg4oCTIFRoZSB0YXNrIGlzIG5vdCBleGVjdXRlZCBhcyBhIHN1YmZvcm1cclxuICAvLyAgMCDigJMgVGhlIHRhc2sgaXMgZXhlY3V0ZWQgYnkgc2V0dGluZyB0aGUgZm9jdXMgb24gaXRcclxuICAvLyAgMSDigJMgVGhlIHN1YnRhc2sgaXMgZXhlY3V0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgLy8gIDIg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJlY2F1c2UgdGhlIEF1dG9tYXRpYyBSZWZyZXNoIHByb3BlcnR5XHJcbiAgLy8gICAgICBvciB0aGUgU3ViZm9ybSBSZWZyZXNoIGV2ZW50IGhhcyBiZWVuIHRyaWdnZXJlZFxyXG4gIHB1YmxpYyBNb2RlQXNQYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXNrIG1vZGUgaXMgJ0FzIFBhcmVudCcgd2UgbmVlZCB0byBjYXJlIG91dCBpdCBzcGVjaWZpY2FsbHlcclxuICBwdWJsaWMgVGFza1RyYW5zYWN0aW9uTWFuYWdlcjogVGFza1RyYW5zYWN0aW9uTWFuYWdlciA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkIG9uIHRoZSBjbGllbnQuXHJcbiAgLy8vIFJlbGV2YW50IG9ubHkgZm9yIG5vbi1vZmZsaW5lIHdpdGggbG9jYWwgZGF0YS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBFeGVjdXRlQ2xpZW50U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBleGVjdXRlcyBDb21tb25IYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gRm9yIHN1YmZvcm1zIHdlIGRvIG5vdCBleGVjdXRlIGl0J3MgUlAgaWYgdGhlIHBhcmVudCBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgLy8vIGl0J3MgQ29tbWFuZEhhbmRsZXJCZWZvcmUgbWV0aG9kLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEluQ29tbW9uSGFuZGxlckJlZm9yZVJQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0cmlldmUgYW5kIHJldHVybiBhIHNlcnZpY2Ugb2JqZWN0IGNvbnRhaW5pbmcgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIGRpZmZlcmVudCBpbiB0aGUgdGFzayBsZXZlbCBiZXR3ZWVuIGNvbm5lY3RlZCBhbmQgb2ZmbGluZSBzdGF0ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIF90YXNrU2VydmljZTogVGFza1NlcnZpY2VCYXNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlQmFzZSB7XHJcbiAgICBpZiAodGhpcy5fdGFza1NlcnZpY2UgPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFza1NlcnZpY2UgPSBuZXcgUmVtb3RlVGFza1NlcnZpY2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBjb21tYW5kcyBwcm9jZXNzb3IgZGVwZW5kaW5nIG9uIHRhc2sgdHlwZSBhbmQgc3RhdGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgZ2V0IENvbW1hbmRzUHJvY2Vzc29yKCk6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSB7XHJcbiAgICByZXR1cm4gQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0xvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCA9IG51bGw7XHJcbiAgcHVibGljIEFyZ3VtZW50c0xpc3Q6IEFyZ3VtZW50c0xpc3QgPSBudWxsOyAgICAgICAgICAgLy8gb2ZmLWxpbmUgZXhlY3V0aW9uIC0gdGFzayBhcmd1bWVudCwgdG8gZW5hYmxlIHRoZSB1cGRhdGUgb2YgZmllbGQgdmFsdWVzXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcGFyZW50IHRhc2sgb2YgdGhlIHN1YnRhc2sgYnkgdG9vbGtpdCB0cmVlIGluY2x1ZGUgdGhlIG1haW4gcHJvZ3JhbS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMb2dpY2FsU3R1ZGlvUGFyZW50VGFzaygpOiBUYXNrIHtcclxuICAgIGlmICh0aGlzLlN0dWRpb1BhcmVudFRhc2sgPT09IG51bGwgJiYgIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgdGhpcy5fY3RsSWR4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gPFRhc2s+dGhpcy5TdHVkaW9QYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IEtub3duVG9TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fa25vd25Ub1NlcnZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb25maXJtVXBkYXRlTm86IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAvLyBvbmx5IGZvciBjb25maXJtcyB1cGRhdGVcclxuICBwdWJsaWMgRGF0YVN5bmNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBVbmlxdWVTb3J0OiBVbmlxdWVUc2tTb3J0ID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdGhlIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgb24gdGhlIGRhdGEgdmlldyBtYW5hZ2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXQgVHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uKSB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgUmVmcmVzaE9uVmFyczogbnVtYmVyW10gPSBudWxsO1xyXG4gIHB1YmxpYyBEdlBvc0Rlc2NyaXB0b3I6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDtcclxuICBwdWJsaWMgU3ViVGFza3M6IFRhc2tzVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBFeHBUYWI6IEV4cFRhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgVXNlckV2dFRhYjogVXNlckV2ZW50c1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRGF0YXZpZXdIZWFkZXJzVGFibGU6IERhdGF2aWV3SGVhZGVycyA9IG51bGw7XHJcbiAgcHVibGljIEhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgX2Zvcm1zOiBGb3Jtc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwdWJsaWMgUHVibGljTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBzdWZmaXggd2FzIHBlcmZvcm1lZCBmb3IgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgVGFza1N1ZmZpeEV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgaWYgKHRoaXMudGFza0RlZmluaXRpb25JZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnRhc2tEZWZpbml0aW9uSWQgPSBuZXcgVGFza0RlZmluaXRpb25JZCh0aGlzLl9jdGxJZHgsIHRoaXMuUHJvZ3JhbUlzbiwgdGhpcy5UYXNrSXNuLCB0aGlzLl9pc1ByZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJldHJ1blZhbHVlRXhwOiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBTdWJmb3JtQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIFN0YXJ0UHJvZ0xldmVsOiBudW1iZXIgPSAwOyAgLy8gcmVjdXJzaXZlIGxldmVsIG9mIFwic3RhcnRQcm9nXCIgaW52b2NhdGlvbnNcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2lkbGVUaW1lclN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc3RhdGljIGdldCBJc0Jsb2NraW5nQmF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50OiBUYXNrKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBUYXNrKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChwYXJlbnQpKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEocGFyZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKHRoaXMpO1xyXG4gICAgdGhpcy5EYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzKTtcclxuICAgIHRoaXMuX2Zsb3dNb25pdG9yID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSB0aGlzO1xyXG4gICAgdGhpcy5fZHZDYWNoZSA9IG5ldyBEdkNhY2hlKHRoaXMpO1xyXG4gICAgdGhpcy5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gdHJ1ZTtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyID0gbmV3IERhdGF2aWV3TWFuYWdlcih0aGlzKTtcclxuICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyID0gbmV3IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHBhcmVudDogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLlBhdGhQYXJlbnRUYXNrID0gcGFyZW50O1xyXG4gICAgdGhpcy5fcGFyZW50VGFzayA9IHBhcmVudDtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gbnVsbDtcclxuICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIENyZWF0ZVRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgbGV0IHRhc2sgPSAgbmV3IFRhc2soKTtcclxuICAgIHRhc2suSW5pdCgpO1xyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLyBJVGFzayBNZW1iZXJzXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlbGxzIHdoZXRoZXIgdGhlIHRhc2sgaXMgYWJvcnRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQWJvcnRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWJvcnRpbmc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkVGFza1BhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrUGF0aCA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzay5fdGFza1BhdGggIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tQYXRoLkFkZFJhbmdlKHRoaXMuX3BhcmVudFRhc2suX3Rhc2tQYXRoLkdldEVudW1lcmF0b3IoKSk7XHJcbiAgICB0aGlzLl90YXNrUGF0aC5wdXNoKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBkYXRhIGJ5IHBhcnNpbmcgdGhlIHhtbCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+cmVmZXJlbmNlIHRvIE1HRGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIGFzeW5jIGZpbGxEYXRhKG1nZDogTUdEYXRhLCBvcGVuaW5nVGFza0RldGFpbHM6IE9wZW5pbmdUYXNrRGV0YWlscyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gSWYgdGhpcyB0YXNrIHdhcyBvcGVuZWQgYnkgYW4gXCJvcGVuIHdpbmRvd1wiIGNvbW1hbmQgLSBjb25uZWN0IGhpbSB0byBpdHMgcGFyZW50XHJcbiAgICBpZiAoIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCAmJiBvcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2sgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRUYXNrID0gPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gICAgICAgICg8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2spLmFkZFN1YlRhc2sodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuUGF0aFBhcmVudFRhc2sgPT09IG51bGwgJiYgb3BlbmluZ1Rhc2tEZXRhaWxzLlBhdGhQYXJlbnRUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5QYXRoUGFyZW50VGFzayA9IDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5QYXRoUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZm9yIE1HX0FDVF9aT09NIGFjdGlvbiBlbmFibGVcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSkge1xyXG4gICAgICB0aGlzLnNldEVuYWJsZVpvb21IYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhID0gbWdkO1xyXG4gICAgdGhpcy5maWxsQXR0cmlidXRlcygpO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5hZGRUYXNrKHRoaXMpO1xyXG5cclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwpID8gdGhpcy5fcGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsO1xyXG5cclxuICAgIHdoaWxlIChhd2FpdCB0aGlzLmluaXRJbm5lck9iamVjdHMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudEZvcm0pKSB7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLlByZXBhcmVUcmFuc2FjdGlvblByb3BlcnRpZXModGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5IYW5kbGVUcmlnZ2VyVGFzaygpO1xyXG4gICAgdGhpcy5IYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk7XHJcblxyXG4gICAgLy8gU2V0IGlzU3ViZm9ybSBmbGFnXHJcbiAgICB0aGlzLkNoZWNrQW5kU2V0U3ViRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAvLyBnZXQgdGhlIHN1YmZvcm0gY29udHJvbCBmcm9tIHRoZSBwYXJlbnQgdGFza1xyXG4gICAgICBsZXQgc3ViRm9ybUN0cmw6IE1nQ29udHJvbCA9ICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5nZXRTdWJGb3JtQ3RybEZvclRhc2sodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIGlmIChzdWJGb3JtQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHN1YkZvcm1DdHJsLnNldFN1YmZvcm1UYXNrSWQodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHVwZGF0ZSB0aGUgZm9ybSB3aXRoIHRoZSBzdWJmb3JtIGNvbnRyb2wgZnJvbSB0aGUgcGFyZW50IHRhc2tcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gaGFuZGxlIHRoZSBQcmV2aW91c2x5QWN0aXZlVGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5HZXRDb250ZXh0VGFzaygpICE9PSBudWxsICYmIHRoaXMuX21nRGF0YSAhPT0gdGhpcy5fcGFyZW50VGFzay5nZXRNR0RhdGEoKSlcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gKHRoaXMuX3BhcmVudFRhc2suR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza1RhZygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbClcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gdGhpcy5fcGFyZW50VGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGhhbmRsZSB0aGUgdHJpZ2dlciB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVUcmlnZ2VyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIEZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcpOiB2b2lkO1xyXG4gIEZpbGxUYXNrVGFibGVzKCk6IHZvaWQ7XHJcbiAgRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGE/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMCh0YXNrVGFibGVzRGF0YSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsVGFza1RhYmxlc18wKHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICBzdXBlci5maWxsQXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgLy8gUUNSICM3NTk5MTE6IG1wcmcgbXVzdCBiZWxvbmcgdG8gdGhlIG1haW4gYXBwbGljYXRpb24ncyBNR0RhdGEuXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdCB3aWxsIG5vdCBiZSBkaXNjYXJkZWQgdW50aWwgdGhlIGVuZCBvZiBleGVjdXRpb24uXHJcbiAgICAgIGlmIChzdXBlci5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5fbWdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLmZpbGxBdHRyaWJ1dGVzKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0YXNrIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhZ1Byb2Nlc3NlZDogYm9vbGVhbjtcclxuICAgIGlzVGFnUHJvY2Vzc2VkID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBpc1RhZ1Byb2Nlc3NlZCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFRlJFU0hPTjpcclxuICAgICAgICAgIGlmICghKHZhbHVlU3RyLnRyaW0oKSA9PT0gXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMuU2V0UmVmcmVzaE9uVmFycyh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6XHJcbiAgICAgICAgICB0aGlzLk5hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPU19ERUM6XHJcbiAgICAgICAgICBpZiAoISh2YWx1ZVN0ci50cmltKCkgPT09IFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLnNldERlc2NyaXB0b3IodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBU19MT0NBVEU6XHJcbiAgICAgICAgICB0aGlzLmhhc0xvY2F0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQVNfUEFSRU5UOlxyXG4gICAgICAgICAgdGhpcy5Nb2RlQXNQYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfVU5JUVVFX1NPUlQ6XHJcbiAgICAgICAgICB0aGlzLlVuaXF1ZVNvcnQgPSA8VW5pcXVlVHNrU29ydD52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19JRDpcclxuICAgICAgICAgIHRoaXMuc2V0UmVtb3RlVHJhbnNhY3Rpb24odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BVQkxJQzpcclxuICAgICAgICAgIHRoaXMuUHVibGljTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX09GRkxJTkU6XHJcbiAgICAgICAgICB0aGlzLklzT2ZmbGluZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUkVUVVJOX1ZBTFVFX0VYUDpcclxuICAgICAgICAgIHRoaXMuUmV0cnVuVmFsdWVFeHAgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVVNfRklMRV9OQU1FOlxyXG4gICAgICAgICAgLy8gVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICd7MH0nXCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+cG9zc2libGUgdGFnIG5hbWUgLCBuYW1lIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIGFzeW5jIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudEZvcm06IE1nRm9ybUJhc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIHN3aXRjaCAoZm91bmRUYWdOYW1lKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQVEFCTEU6XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlbHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2hlbHBUYWIgPSBuZXcgSGVscHMoKTtcclxuXHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlbHBUYWIuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUjpcclxuICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC4uLlwiLCBmb3VuZFRhZ05hbWUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5EYXRhVmlldy5maWxsSGVhZGVyRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1A6XHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYi5maWxsRGF0YSh0aGlzLCAnVCcsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STTpcclxuICAgICAgICB0aGlzLkZvcm0gPSB0aGlzLkZvcm1Jbml0RGF0YShwYXJlbnRGb3JtKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVV9DT05URU5UOlxyXG4gICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiYXNzZW1ibGllc1wiOlxyXG4gICAgICAgIGxldCBzdGFydDogbnVtYmVyID0gcGFyc2VyLmdldEN1cnJJbmRleCgpO1xyXG4gICAgICAgIGxldCBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKCcvYXNzZW1ibGllcycsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STVM6XHJcbiAgICAgICAgdGhpcy5fZm9ybXMgPSBuZXcgRm9ybXNUYWJsZSh0aGlzLCBwYXJlbnRGb3JtKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybXMuZmlsbERhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0s6XHJcbiAgICAgICAgaWYgKHRoaXMuU3ViVGFza3MgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgICAgIGxldCBzdWJ0YXNrID0gbmV3IFRhc2sodGhpcyk7XHJcbiAgICAgICAgc3VidGFzay5Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YnRhc2spO1xyXG4gICAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX21nRGF0YTtcclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgICBtZ2QgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TUdEYXRhRm9yU3RhcnR1cFByb2dyYW0oKTtcclxuICAgICAgICBhd2FpdCBzdWJ0YXNrLmZpbGxEYXRhKG1nZCwgbmV3IE9wZW5pbmdUYXNrRGV0YWlscygpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTDpcclxuICAgICAgICBhd2FpdCBUYXNrLlByb2Nlc3NUYXNrVVJMKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLkV4cFRhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5FeHBUYWIgPSBuZXcgRXhwVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXhwXCIpO1xyXG4gICAgICAgIHRoaXMuRXhwVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1VTRVJfRVZFTlRTOlxyXG4gICAgICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuVXNlckV2dFRhYiA9IG5ldyBVc2VyRXZlbnRzVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gdXNlciBldmVudCB0YWJcIik7XHJcbiAgICAgICAgdGhpcy5Vc2VyRXZ0VGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0xJTktTOlxyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUgPSBuZXcgRGF0YXZpZXdIZWFkZXJzKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFM6XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMgPSBuZXcgU29ydENvbGxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLlJ1bnRpbWVTb3J0cy5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLX1RBQkxFUzpcclxuICAgICAgICB0aGlzLkZpbGxUYXNrVGFibGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19SRUNPTVBVVEU6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIHJlY29tcHV0ZVwiKTtcclxuICAgICAgICB0aGlzLlJlY29tcHV0ZUZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5USEFORExFUlM6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGV2ZW50aGFuZGxlcnNcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuSGFuZGxlcnNUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuSGFuZGxlcnNUYWIgPSBuZXcgSGFuZGxlcnNUYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuSGFuZGxlcnNUYWIuZmlsbERhdGEodGhpcywgcGFyc2VyKTtcclxuICAgICAgICB0aGlzLmFkZEV4cEhhbmRsZXJzVG9NR0RhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZiAoZm91bmRUYWdOYW1lID09PSAoXCIvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0spKSB7XHJcbiAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gVGFzay5pbml0SW5uZXJPYmplY3RzIC4gRW50ZXIgY2FzZSBmb3IgXCIgKyBmb3VuZFRhZ05hbWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgUmVjb21wdXRlRmlsbERhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCByZWNvbXB1dGVUYWJsZTogUmVjb21wdXRlVGFibGUgPSBuZXcgUmVjb21wdXRlVGFibGUoKTtcclxuICAgIHJlY29tcHV0ZVRhYmxlLmZpbGxEYXRhXzEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcsIHRoaXMsIHBhcnNlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxUYXNrVGFibGVzXzEoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgLy8gR2V0IHRoZSBlbmQgb2YgdGhlIHRhc2sgdGFibGUgZWxlbWVudFxyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS19UQUJMRVNfRU5ELCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBlbmRDb250ZXh0KSArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UubGVuZ3RoO1xyXG4gICAgLy8gZ2V0IHRoZSB0YXNrIHRhYmxlIHhtbCBzdHJpbmdcclxuICAgIGxldCB0YXNrVGFibGVzRGF0YTogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgIHRoaXMuRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGEpO1xyXG4gICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGhhbmRsZXJzIHRyaWdnZXJlZCBieSBleHByZXNzaW9ucyB0byBtZ2RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYWRkRXhwSGFuZGxlcnNUb01HRGF0YSgpOiB2b2lkIHtcclxuICAgIGxldCBpZHg6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLkhhbmRsZXJzVGFiLmdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSB0aGlzLkhhbmRsZXJzVGFiLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgIGxldCBldnQ6IEV2ZW50ID0gaGFuZGxlci5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OIHx8XHJcbiAgICAgICAgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04pKSB7XHJcbiAgICAgICAgdGhpcy5fbWdEYXRhLmFkZEV4cEhhbmRsZXIoaGFuZGxlciwgaWR4KTtcclxuICAgICAgICBpZHgrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcmVmcmVzaCBvbiB2YXJpYWJsZSBsaXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgU2V0UmVmcmVzaE9uVmFycyh2YXJpYWJsZXM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHN0clRvazogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhcmlhYmxlcywgXCIsXCIpO1xyXG4gICAgbGV0IGZsZE51bTogbnVtYmVyO1xyXG4gICAgbGV0IGludFZhbHMgPSBuZXcgTGlzdDxudW1iZXI+KCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHN0clRvay5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmbGROdW0gPSBOTnVtYmVyLlBhcnNlKHN0clRva1tpXSk7XHJcbiAgICAgIGludFZhbHMucHVzaChmbGROdW0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5SZWZyZXNoT25WYXJzID0gbmV3IEFycmF5KGludFZhbHMubGVuZ3RoKTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBpbnRWYWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZsZE51bSA9IGludFZhbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHRoaXMuUmVmcmVzaE9uVmFyc1tpXSA9IGZsZE51bTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIERhdGFTeW5jZWQgcHJvcGVydHkgb2YgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGF0YVN5bmNlZChzeW5jZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVN5bmNlZCA9IHN5bmNlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCBieSBpdHMgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGROYW1lXCI+b2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBmaWVsZCBieSBpdHMgbmFtZTwvcmV0dXJucz5cclxuICBnZXRGaWVsZChmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRGaWVsZEJ5TmFtZShmbGROYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYW4gZXhwcmVzc2lvbiBieSBpdHMgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5pZCBvZiB0aGUgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgZ2V0RXhwQnlJZChpZDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XHJcbiAgICBpZiAodGhpcy5FeHBUYWIgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLkV4cFRhYi5nZXRFeHBCeUlkKGlkKTtcclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gVGFzay5HZXRFeHBCeUlkKCk6IG5vIGV4cHJlc3Npb24gdGFibGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldEV4cE9iamVjdEJ5SWQoaWQ6IG51bWJlcik6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRFeHBCeUlkKGlkKTtcclxuICB9XHJcblxyXG4gIEdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgbGV0IGV4cEJ5SWQ6IEV4cHJlc3Npb24gPSB0aGlzLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZXhwQnlJZCAhPT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IGV4cEJ5SWQuR2V0U3RvcmFnZUF0dHJpYnV0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2FsY3VsYXRlIGV4cHJlc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhwSWRcIj5UaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzVHlwZVwiPlRoZSBleHBlY3RlZCByZXN1bHQgdHlwZS48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbmd0aFwiPlRoZSBleHBlY3RlZCBsZW5ndGggb2YgdGhlIHJlc3VsdC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPkRlbm90ZXMgd2hldGhlciB0aGUgcmVzdWx0IGlzIGV4cGVjdGVkIHRvIGJlIGEgdW5pY29kZSBzdHJpbmcuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNDZWxsVHlwZVwiPk5vdCB1c2VkLjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDYWxjdWxhdGVFeHByZXNzaW9uKGV4cElkOiBudW1iZXIsIHJlc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbmd0aDogbnVtYmVyLCBjb250ZW50VHlwZVVuaWNvZGU6IGJvb2xlYW4sIHJlc0NlbGxUeXBlOiBTdG9yYWdlQXR0cmlidXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCBleHBCeUlkOiBFeHByZXNzaW9uID0gdGhpcy5nZXRFeHBCeUlkKGV4cElkKTtcclxuICAgICAgRGVidWcuQXNzZXJ0KGV4cEJ5SWQgIT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBleHBCeUlkLmV2YWx1YXRlV2l0aFJlc3VsdFR5cGVBbmRMZW5ndGgocmVzVHlwZSwgbGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSW5zZXJ0IFJlY29yZCBUYWJsZSB0byBkYXRhdmlldyBvZiB0aGUgdGFzayBpZiBpdCBjYW1lIGFmdGVyIGNsb3NpbmcgdGFzayB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGluc2VydFJlY29yZFRhYmxlKGludmFsaWRhdGU6IGJvb2xlYW4sIHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBjaGVjayBjYWNoZSBsb2dpYyBvbmx5IGZvciBzdWItZm9ybXNcclxuICAgIGlmIChhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgbGV0IGZpcnN0VGltZTogYm9vbGVhbiA9ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Rmlyc3REdigpO1xyXG4gICAgICAvLyBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgdGFzayBnZXQgZHYgb3IgdGhlIG9sZCBkdiBpcyBub3QgaW52YWxpZGF0ZWQgb3JcclxuICAgICAgLy8gdGhlIG9sZCBkdiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBmaXJzdCByZWNvcmQgZG8gbm90IHB1dCBpbiBjYWNoZVxyXG4gICAgICBpZiAoIWZpcnN0VGltZSAmJiBpbnZhbGlkYXRlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0xvY2F0ZSkge1xyXG4gICAgICAgICAgLy8gdGhlIG9sZCBkLnYgd2FzIG5vdCB1cGRhdGVkIHB1dCBpdCBpbiBjYWNoZSAoaXRzIHJlcGxpY2F0ZSlcclxuICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkluY2x1ZGVzRmlyc3QoKSkge1xyXG4gICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHRoaXMubG9jYXRlUHV0SW5DYWNoZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBwYXJzZSB0aGUgbmV3IGRhdGF2aWV3XHJcbiAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmZpbGxEYXRhKHBhcnNlcik7XHJcblxyXG4gICAgaWYgKGludmFsaWRhdGUpXHJcbiAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0Q2hhbmdlZChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBoYW5kbGVycyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SGFuZGxlcnNUYWIoKTogSGFuZGxlcnNUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5IYW5kbGVyc1RhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLklzQWZ0ZXJSZXRyeUJlZm9yZUJ1aWxkWE1MID0gdGhpcy5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICBpZiAodGhpcy5Lbm93blRvU2VydmVyICYmICF0aGlzLklzT2ZmbGluZSkge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQgKyBcIj1cXFwiXCIgKyB0aGlzLmdldFRhc2tUYWcoKSArIFwiXFxcIlwiKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfTUFJTkxFVkVMICsgXCI9XFxcIlwiICsgdGhpcy5nZXRNYWluTGV2ZWwoKSArIFwiXFxcIlwiKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuYnVpbGRYTUwobWVzc2FnZSk7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT0gbnVsbCAmJiB0aGlzLkZvcm0uT3BlbmVkKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCg8TWdGb3JtPnRoaXMuRm9ybSkuR2V0SGlkZGVuQ29udHJvbExpc3RYTUwoKSk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxuICAgPC9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgcmFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFhNTEZvclJuZ3MobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgVXNlclJhbmdlczogTGlzdDxVc2VyUmFuZ2U+LCBsb2NhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZmxkOiBGaWVsZDtcclxuICAgIGxldCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUDtcclxuICAgIGxldCB0b0Jhc2U2NDogYm9vbGVhbiA9IChFbnZpcm9ubWVudC5JbnN0YW5jZS5HZXREZWJ1Z0xldmVsKCkgPD0gMSk7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgVXNlclJhbmdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9STkcpO1xyXG5cclxuICAgICAgbGV0IHJuZzogVXNlclJhbmdlID0gVXNlclJhbmdlcy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GTEQgKyBcIj1cXFwiXCIgKyBybmcudmVlSWR4ICsgXCJcXFwiXCIpO1xyXG5cclxuICAgICAgZmxkID0gPEZpZWxkPnRoaXMuRGF0YVZpZXcuZ2V0RmllbGQoPG51bWJlcj5ybmcudmVlSWR4IC0gMSk7XHJcbiAgICAgIGxldCBmbGRBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gZmxkLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChybmcubnVsbE1pbilcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk5VTExfTUlOX1JORyArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgIGlmICghcm5nLmRpc2NhcmRNaW4gJiYgcm5nLm1pbiAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gUmVjb3JkVXRpbHMuaXRlbVZhbFRvWE1MKHJuZy5taW4sIGZsZEF0dHIsIGNlbGxBdHRyLCB0b0Jhc2U2NCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NSU5fUk5HICsgXCI9XFxcIlwiICsgdmFsICsgXCJcXFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocm5nLm51bGxNYXgpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5OVUxMX01BWF9STkcgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAoIXJuZy5kaXNjYXJkTWF4ICYmIHJuZy5tYXggIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IFJlY29yZFV0aWxzLml0ZW1WYWxUb1hNTChybmcubWF4LCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUFYX1JORyArIFwiPVxcXCJcIiArIHZhbCArIFwiXFxcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhdGUpXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9MT0NBVEVTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9SQU5HRVMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIHVzZXIgYWRkZWQgc29ydHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkWE1MRm9yU29ydHMobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuVXNlclNvcnRzICE9IG51bGwgJiYgdGhpcy5Vc2VyU29ydHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5Vc2VyU29ydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgICAgICBsZXQgc3J0OiBTb3J0ID0gdGhpcy5Vc2VyU29ydHMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5TT1JUKTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEICsgXCI9XFxcIlwiICsgc3J0LmZsZElkeCArIFwiXFxcIlwiKTtcclxuICAgICAgICBpZiAoc3J0LmRpcilcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9ESVIgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5Vc2VyU29ydHMuQ2xlYXIoKTtcclxuICAgICAgdGhpcy5Vc2VyU29ydHMgPSBudWxsO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19TT1JUUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSB1c2VyIGV2ZW50IGJ5IGl0cyBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBldmVudDwvcGFyYW0+XHJcbiAgZ2V0VXNlckV2ZW50KGlkeDogbnVtYmVyKTogRXZlbnQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuVXNlckV2dFRhYiAhPT0gbnVsbCk7XHJcbiAgICBsZXQgcmV0RXZlbnQ6IEV2ZW50ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgIT09IG51bGwpXHJcbiAgICAgIHJldEV2ZW50ID0gdGhpcy5Vc2VyRXZ0VGFiLmdldEV2ZW50KGlkeCk7XHJcbiAgICByZXR1cm4gcmV0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFNldCB0aGUgTW92ZVRvRmlyc3RDb250cm9sIGZsYWcgb24gdGhlIGZvcm0uIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0TW92ZVRvRmlyc3RDb250cm9sKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKG1vdmVUb0ZpcnN0Q29udHJvbCB8fCAhdGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgYSBjYWxsIGRlc3RpbmF0aW9uLyBzdWJmb3JtIGNhbGxcclxuICAgICAgICAvLyBXZSBwZXJmb3JtIG1vdmUgdG8gZmlyc3QgY29udHJvbCBvbmx5IHRvIG9uZSBjb250cm9sIGZvcm0gcGVyIHJlcXVlc3QgLSB0aGUgZmlyc3Qgb25lIHRoYXQgd2UgcmVjZWl2ZVxyXG4gICAgICAgIGxldCBhbHJlYWR5TW92ZWQ6IGJvb2xlYW4gPSAoPE1nRm9ybT50aGlzLkZvcm0pLmFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk7XHJcbiAgICAgICAgaWYgKCFhbHJlYWR5TW92ZWQpXHJcbiAgICAgICAgICAoPE1nRm9ybT50aGlzLkZvcm0pLk1vdmVkVG9GaXJzdENvbnRyb2wgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayBhbmQgaXRzIHN1YlRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBTdGFydChtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTxJVGFzaz4ge1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc1N0YXJ0ZWQpIHtcclxuICAgICAgdGhpcy5faXNTdGFydGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuSW5pdGlhbGl6ZUV4ZWN1dGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IHRydWU7XHJcbiAgICAgIGxldCByZXN1bHQ6IFJldHVyblJlc3VsdCA9IGF3YWl0IHRoaXMuU2V0dXAoKTtcclxuXHJcbiAgICAgIC8vIHRhc2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gY2xvc2UgdGhlIHRhc2tcclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIHRoaXMuX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGZhbHNlKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuRW5hYmxlQWN0aW9ucygpO1xyXG5cclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5Jbml0aWFsaXplRm9ybShtb3ZlVG9GaXJzdENvbnRyb2wpO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmICF0aGlzLl9pc01haW5QcmcpXHJcbiAgICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gdGhpcztcclxuXHJcbiAgICAgIHRoaXMuRGF0YVZpZXdXYXNSZXRyaWV2ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gUUNSICMgMTY3MzMyIDpcclxuICAgICAgLy8gSWYgd2Ugc3RhcnQgcG9yZ3JhbSBQMSwgZm9yIHdoaWNoIE1QIGlzIHN0YXJ0ZWQuIE1QIGlzIGNhbGxpbmcgUDIgZnJvbSBpdCdzIFRQLiBTbywgd2hlbiBpdCBjYWxscyBQMlxyXG4gICAgICAvLyBhZ2FpbiBpdCBzdGFydHMgTVAsIGJ1dCBmcm9tIE1QIGl0IGFnYWluIHN0YXJ0cyBQMS4gYXMgUDEgaXMgaW4gaXQncyBzdWJ0YXNrIGFuZCBpdCBpcyBub3QgeWV0IHN0YXJ0ZWQuXHJcbiAgICAgIC8vIFNvLCBpdCdzIHdyb25nIHRvIHN0YXJ0IFAxIHdoaWxlIGV4ZWN1dGluZyBUUCBvZiBNUC4gSXQgc2hvdWxkIGV4ZWN1dGUgb25seSBQMi5cclxuICAgICAgLy8gU28sIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMsIHNldCBNUCdzIHN1YnRhc2tzIHRvIG51bGwgYmVmb3JlIGVudGVyaW5nIFRQLiBhbmQgYWdhaW4gcmVzdG9yZSBpdCBiYWNrLCBpbiBvcmRlciB0b1xyXG4gICAgICAvLyBzdGFydCBQMSBwcm9wZXJseS5cclxuICAgICAgbGV0IHN1YlRhc2tzOiBUYXNrc1RhYmxlID0gdGhpcy5TdWJUYXNrcztcclxuICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuU3ViVGFza3MgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcyA9IHN1YlRhc2tzO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuX2Fib3J0aW5nKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRmlyc3RDaHVuayk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICB0aGlzLlJlc3VtZVN1YmZvcm1MYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSBhd2FpdCB0aGlzLlN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2ssIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICBDYW5SZXN1bWVTdWJmb3JtTGF5b3V0KCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gd2FpdCB0aWxsIHdlIHJldHJpdmUgZGF0YXZpZXcgKHJlbGV2YW50IGZvciBsb2NhbCkgYmVmb3JlIHJlc3VtaW5nIGxheW91dFxyXG4gICAgLy8gbnVtYmVyIG9mIHJlY29yZHMgYWZmZWN0IHZpc2liaWxpdHkgb2Ygc2Nyb2xsYmFyIGFuZCBpbml0aWFsIHRhYmxlIHBhY2VtZW50XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhVmlld1dhc1JldHJpZXZlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5pdGlhbGl6ZSBleGVjdXRpb24tcmVsYXRlZCBzdHVmZi5cclxuICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBPTkxZIGZyb20gVGFzay5TdGFydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0aWFsaXplRXhlY3V0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gY3VycmVudGx5IHRoZSBpcyBubyBjb250cm9sIGV4ZWN1dGluZyB0aGVyZSBmb3IgdGhlXHJcbiAgICAvLyBjdXJyZW50IGV4ZWN1dGluZyBjb250cm9sIGluZGV4IGlzIHNldCB0byAtMVxyXG4gICAgc3VwZXIuc2V0QnJrTGV2ZWwoQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX1JFQ19NQUlOLCAtMSk7XHJcbiAgICB0aGlzLl9maXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTsgICAgICAvLyBXaGlsZSBzdGFydGluZyBhIFRhc2ssIHNldCBmaXJzdFJlY29yZEN5Y2xlID0gVFJVRVxyXG5cclxuICAgIHRoaXMuX2N1cnJTdGFydFByb2dMZXZlbCA9ICgodGhpcy5Jc1N1YkZvcm0gJiYgKDxNZ0Zvcm0+dGhpcy5nZXRQYXJlbnQoKS5nZXRGb3JtKCkpLmFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCkpXHJcbiAgICAgID8gKDxUYXNrPnRoaXMuZ2V0UGFyZW50KCkpLl9jdXJyU3RhcnRQcm9nTGV2ZWxcclxuICAgICAgOiBUYXNrLlN0YXJ0UHJvZ0xldmVsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdGlhbGl6ZSBmb3JtLXJlbGF0ZWQgc3R1ZmZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEluaXRpYWxpemVGb3JtKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIHNldCBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZyBvbiB0aGUgZm9ybS5cclxuICAgICAgdGhpcy5TZXRNb3ZlVG9GaXJzdENvbnRyb2wobW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAgIC8vIHRoZSBJbml0Rm9ybSBtaWdodCBjYXVzZSBleGVjdXRpb24gb2YgY29kZSAodmFyaWFibGUgY2hhbmdlKSBzbyB3ZSBzaG91bGQgZG8gaXQgd2l0aCBhIG5ldyBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlUGFyYW1zID0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5HZXRSb3V0ZVBhcmFtcygpO1xyXG5cclxuICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY3VycmVudCB0YXNrJ3MgZm9ybS5cclxuICAgICAgYXdhaXQgdGhpcy5Jbml0Rm9ybSgpO1xyXG5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgdGhpcy5nZXRNR0RhdGEoKS5TdGFydFRpbWVycygpO1xyXG4gICAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUmV0dXJuUmVzdWx0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHN0YXJ0IHN1YiB0YXNrcyBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9uSW50ZXJhY3RpdmVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgU3RhcnRTdWJUYXNrcyhtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIG5vbkludGVyYWN0aXZlVGFzazogVGFzaywgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBsZXQgdG1wTm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrID0gIDxUYXNrPiBhd2FpdCB0YXNrLlN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbCwgY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG4gICAgICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2sgPT09IG51bGwpXHJcbiAgICAgICAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSB0bXBOb25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgICAgICAgZWxzZSBpZiAodG1wTm9uSW50ZXJhY3RpdmVUYXNrICE9PSBudWxsKVxyXG4gICAgICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlLCBcIm1vcmUgdGhhbiAxIG5vbiBpbnRlcmFjdGl2ZSBpbiB0YXNrLnN0YXJ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFzaztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgRW5hYmxlQWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBhY3RMaXN0OiBudW1iZXJbXSA9IEFjdGlvbk1hbmFnZXIuYWN0RW5hYmxlZDtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGVMaXN0KGFjdExpc3QsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQsIHRydWUpO1xyXG5cclxuXHJcbiAgICAvLyB3aGVuIHdlIGhhdmUgZGVmYXVsdCBidXR0b24gdGhlbiBlbmFibGUgdGhlIGFjdGlvblxyXG4gICAgaWYgKHRoaXMuRm9ybSAhPSBudWxsICYmIGF3YWl0ICg8TWdGb3JtPnRoaXMuRm9ybSkuZ2V0RGVmYXVsdEJ1dHRvbihmYWxzZSkgIT0gbnVsbClcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVGQVVMVF9CVVRUT04sIHRydWUpO1xyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGRlcGVuZGluZyBvbiB0YXNrIHByb3BlcnRpZXNcclxuICAgIGF3YWl0IHRoaXMuZW5hYmxlTW9kZXMoKTtcclxuICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKSkge1xyXG4gICAgICBpZiAoYXdhaXQoICh0aGlzLkZvcm0uZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0JVVFRPTikpKS5nZXRWYWx1ZSgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRCdXR0b25OYW1lOiBzdHJpbmcgPSAgYXdhaXQgKHRoaXMuRm9ybS5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfQlVUVE9OKSkuZ2V0VmFsdWUoKTtcclxuICAgICAgICBsZXQgY3RybDogTWdDb250cm9sID0gKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5nZXRDdHJsQnlDdHJsTmFtZShkZWZhdWx0QnV0dG9uTmFtZSk7XHJcbiAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgaWYgKGFSdEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiZcclxuICAgICAgICAgIGFSdEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVClcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBlbmFibGVQcmludGRhdGE6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUklOVF9EQVRBLCBmYWxzZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QUklOVF9EQVRBLCBlbmFibGVQcmludGRhdGEpO1xyXG5cclxuXHJcbiAgICBpZiAodGhpcy5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2hvdyBlcnJvciBvbiB0YXNrJ3MgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2hvd0Vycm9yKHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1sc1RyYW5zVGV4dDogc3RyaW5nID0gTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLnRyYW5zbGF0ZSh0ZXh0KTtcclxuICAgIGxldCBtbHNUcmFuc1RpdGxlOiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKENvbnN0SW50ZXJmYWNlLkVSUk9SX1NUUklORyk7XHJcbiAgICAvLyBtbHMgPz8/XHJcbiAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3gobWxzVHJhbnNUaXRsZSwgbWxzVHJhbnNUZXh0LCBTdHlsZXMuTVNHQk9YX0lDT05fRVJST1IgfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9PSyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIHRoZSByZXN1bHQuIElmIGZhaWxlZCAtIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2Vib3ggYW5kIGVuZCB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEVuZFRhc2tPbkVycm9yKHJlc3VsdDogUmV0dXJuUmVzdWx0LCBkaXNwbGF5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MgJiYgIXRoaXMuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRUYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBTZXR1cCgpOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgbGV0IHJlc3VsdDogUmV0dXJuUmVzdWx0O1xyXG4gICAgdGhpcy5UYXNrU2VydmljZS5Jbml0VGFza1ByZWZpeEV4ZWN1dGVkRmxhZyh0aGlzKTtcclxuICAgIHRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkID0gZmFsc2U7XHJcblxyXG4gICAgVGFza1NlcnZpY2VCYXNlLkNyZWF0ZUZpcnN0UmVjb3JkKHRoaXMpO1xyXG5cclxuICAgIC8vIGluaXQgZGF0YSB2aWV3XHJcbiAgICAvLyBOb3RlOiBFdmVuIGlmIHRoZSByZXN1bHRJbml0TW9kZSBpcyBmYWxzZSB3ZSBNVVNUIGluaXQgdGhlIGRhdGEgdmlld1xyXG4gICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdCk7XHJcbiAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcblxyXG4gICAgLy8gbmVlZCB0byBjaGVjayByZXN1bHQob2YgdGhlIGRhdGEgdmlldyBpbml0IGFuZCBpZiBub3Qgc3VjY2VzcyB0aGVuIHJldHVybiB0aGlzIGVycm9yXHJcbiAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kLCB3aG9zZSBleGVjdXRpb24gd2FzIGRlbGF5ZWQgYmVjdWFzZSB0YXNrIHdhcyBub3Qgc3RhcnRlZC4gU28gRXhjdXRlIHRob3NlIGNvbW1hbmRzIGFmdGVyIHRhc2sgc3RhcnRlZC5cclxuICAgICAgbGV0IGNvbW1hbmRzOiBMaXN0PElDbGllbnRUYXJnZXRlZENvbW1hbmQ+ID0gR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLmdldENvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjbWRJZHg6IG51bWJlciA9IDA7IGNtZElkeCA8IGNvbW1hbmRzLmxlbmd0aDsgY21kSWR4KyspIHtcclxuICAgICAgICBsZXQgY29tbWFuZDogSUNsaWVudFRhcmdldGVkQ29tbWFuZCA9IChjb21tYW5kcy5nZXRfSXRlbShjbWRJZHgpKTtcclxuICAgICAgICBpZiAoY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZC5FeGVjdXRlKG51bGwpO1xyXG4gICAgICAgICAgR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLnJlbW92ZUNvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKGNvbW1hbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZGF0YVZpZXdDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLlByZXBhcmUpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuVGFza1NlcnZpY2UuUHJlcGFyZVRhc2sodGhpcyk7XHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5FbmRUYXNrT25FcnJvcihyZXN1bHQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdERhdGFDb250cm9sVmlld3MpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gZmlyc3QgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgb25seSBmb3IgY29ubmVjdGVkIHRhc2suXHJcbiAgLy8vICAgRm9yIG9mZmxpbmUgdGFzayB3ZSBydW4gRW50ZXJGaXJzdFJlY29yZCBmdW5jdGlvbi4gVGhlcmUgd2UgZXhlY3V0ZSBSUCBhbmQgb3BlbiBzdWJmb3Jtcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5faXNNYWluUHJnKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUU7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0aGlzLklzU3ViRm9ybSk7XHJcblxyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgaWYgKHN1YlRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICAoPE1nRm9ybT5zdWJUYXNrLmdldEZvcm0oKSkuSWdub3JlRmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzdWJUYXNrLmRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUztcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgYSBzdWIgZm9ybSBieSBpdHMgbWdkIGRlZmluaXRpb24gKHVzZWQgb25seSB3aGlsZSBpbml0aWF0aW5nIHRhc2sgZm9yIHNldHRpbmcgaXNTdWJmb3JtKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBDaGVja0FuZFNldFN1YkZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLklzU3ViRm9ybSA9ICghc3VwZXIuaXNNYWluUHJvZygpICYmIHRoaXMgIT09IHRoaXMuX21nRGF0YS5nZXRGaXJzdFRhc2soKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgSXNSb3V0ZSgpIHtcclxuICAgIHJldHVybiAodGhpcy5Sb3V0ZXJQYXRoICE9IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzaztcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm1CYXNlID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2Fib3J0aW5nKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICB3aGlsZSAoKHRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soMCkpICE9IG51bGwpIHtcclxuICAgICAgICB0YXNrLnNldERlc3RpbmF0aW9uU3ViZm9ybSh0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0pO1xyXG4gICAgICAgIGF3YWl0IHRhc2suc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpXHJcbiAgICAgIHRoaXMuX2Fib3J0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIHRhc2sgYW5kIGl0cyBwYXJlbnQgYXJlIGZyb20gZGlmZmVyZW50IE1HREFUQSBvYmplY3RzIHRoZW4gZGlzY29ubmVjdFxyXG4gICAgLy8gdGhlbSBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgdGFzayBmcm9tIGl0cyBwYXJlbnRcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGFyZW50VGFzay5yZW1vdmVTdWJUYXNrKHRoaXMpO1xyXG4gICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgb2xkVGltZXJzOiBMaXN0PG51bWJlcj4gPSBuZXcgTGlzdDxudW1iZXI+KCksIG5ld1RpbWVycyA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgICAgICBsZXQgbWdkID0gdGhpcy5nZXRNR0RhdGEoKTtcclxuXHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG9sZFRpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLnJlbW92ZVRpbWVySGFuZGxlcih0aGlzKTtcclxuICAgICAgICBtZ2QucmVtb3ZlRXhwcmVzc2lvbkhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG5ld1RpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLmNoYW5nZVRpbWVycyhvbGRUaW1lcnMsIG5ld1RpbWVycyk7XHJcblxyXG4gICAgICAgIG1nZC5yZW1vdmVUYXNrKHRoaXMpO1xyXG4gICAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuYWJvcnQoPE1nRm9ybT50aGlzLmdldEZvcm0oKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFib3J0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgdGFzayBnb3QgY2xvc2VkIGR1ZSB0byBhIGNsaWNrIG9uIHNhbWUgdGFzaywgdGhlbiBzZXQgQ3VycmVudENsaWNrZWRDdHJsIHRvIG51bGxcclxuICAgIGlmICh0aGlzLmdldENsaWNrZWRDb250cm9sKCkgIT0gbnVsbClcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9IG51bGwpXHJcbiAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkucmVtb3ZlUmVmc1RvQ3RybHMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgbGV0IHN1YkZvcm0gPSA8TWdDb250cm9sPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG5cclxuICAgICAgc3ViRm9ybS5zZXRTdWJmb3JtVGFza0lkKG51bGwpO1xyXG4gICAgICBzdWJGb3JtLmluaXRTdWJmb3JtVGFzaygpO1xyXG5cclxuICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSA9PT0gdGhpcylcclxuICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2Uuc2V0TGFzdEZvY3VzZWRUYXNrKHRoaXMuX3BhcmVudFRhc2spO1xyXG5cclxuICAgICAgLy8gUUNSICMzMTAxMTMuIElmIHRoZSBzdWJmb3JtIHRhc2sgZm9yIHdhcyBub3QgbG9hZGVkIHlldCwgZG8gbm90IHJlZnJlc2ggaXQuXHJcbiAgICAgIGlmIChzdWJGb3JtLlN1YmZvcm1Mb2FkZWQpXHJcbiAgICAgICAgYXdhaXQgKHN1YkZvcm0uZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKSkuUmVmcmVzaERpc3BsYXkodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNsZWFyRGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5DbGVhcik7XHJcbiAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNsZWFyRGF0YVZpZXdDb21tYW5kKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYWJvcnQgdGhlIE1nRGF0YSB0byB3aGljaCB0aGUgdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhYm9ydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0TUdEYXRhKCkuYWJvcnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIHN1Yi10YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaGFzU3ViVGFza3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcyAhPT0gbnVsbCAmJiB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQSBudW1iZXIsIDEtMjQsIHRoZSBjdXJyZW50IHRhc2sncyBkZXB0aCBpbiB0aGUgdGFzayBleGVjdXRpb24gaGllcmFyY2h5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGRlcHRoIG9mIHRoZSB0YXNrLCAxIGlmIGNhbGxlZCBmcm9tIHRoZSByb290IHRhc2s8L3JldHVybnM+XHJcbiAgZ2V0VGFza0RlcHRoKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG5cclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gKDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG4gICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgIGlmICh0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICBkZXB0aCA9IGRlcHRoICsgMTtcclxuXHJcbiAgICByZXR1cm4gZGVwdGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIGdldFRhc2tEZXB0aCByZWN1cnNpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHByaXZhdGUgZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgaWYgKHRtcFRhc2sgPT0gbnVsbCB8fCBieVBhcmVudE9yZGVyKVxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvKiBpZiB0aGUgY3RsSWR4IG9mIHRoZSBjdXJyZW50IHRhc2sgYW5kIHRoZSBwYXJlbnQgYXJlIGRpZmZlcmVudCwgICAqL1xyXG4gICAgICAgIC8qIHRoYXQgaXMgdGhlIGN1cnJlbnQgdGFzayBpcyBmcm9tIGEgY29tcG9uZW50LCBhZGQgdGhlIGNvbXBvbmVudCdzICovXHJcbiAgICAgICAgLyogTWFpbiBQcmcgYXMgd2VsbC4gKi9cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0aGlzLl9wYXJlbnRUYXNrLmdldEN0bElkeCgpKVxyXG4gICAgICAgICAgcmV0dXJuIDIgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgIH1cclxuICAgIHJldHVybiAxICsgKHRtcFRhc2spLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhbmNlc3RvciBvZiB0aGUgVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+b2YgdGhlIGFuY2VzdG9yIHRhc2s8L3BhcmFtPlxyXG4gIEdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uOiBudW1iZXIpOiBJVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIGxldCByZXRUYXNrOiBJVGFzayA9IG51bGw7XHJcblxyXG4gICAgaWYgKGdlbmVyYXRpb24gPT09IDApXHJcbiAgICAgIHJldFRhc2sgPSB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgICBpZiAodG1wVGFzayA9PT0gbnVsbClcclxuICAgICAgICB0bXBUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICAgICAgaWYgKHRtcFRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgcmV0VGFzayA9IHRtcFRhc2suZ2V0VGFza0FuY2VzdG9yXygtLWdlbmVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRhc2sgZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0VGFza0RlcHRoKCk6IG51bWJlcntcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZmYgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgdGFzayBjb250YWlucyB0aGUgdGFzayBwYXNzZWQgYXMgcGFyYW1ldGVyPC9yZXR1cm5zPlxyXG4gIHBhdGhDb250YWlucyh0YXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tQYXRoLkNvbnRhaW5zKDxUYXNrPnRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGNvbnRleHQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29udGV4dFwiPnRoZSBuZXcgY29udGV4dCB0YXNrIG9mIHRoZSBjdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIFNldENvbnRleHRUYXNrKGNvbnRleHQ6IFRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLkNvbnRleHRUYXNrID0gPFRhc2s+Y29udGV4dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB0YXNrIHdoaWNoIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGhhbmRsZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRDb250ZXh0VGFzaygpOiBJVGFzayB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q3VyclJlYygpKTtcclxuXHJcbiAgICBpZiAodGhpcy5JblN0YXJ0UHJvY2Vzc1xyXG4gICAgICB8fCBjdXJyUmVjICE9PSBudWxsICYmIChjdXJyUmVjLkluQ29tcHV0ZSB8fCBjdXJyUmVjLkluUmVjb21wdXRlKVxyXG4gICAgICB8fCB0aGlzLkZvcm0gIT09IG51bGwgJiYgdGhpcy5Gb3JtLmluUmVmcmVzaERpc3BsYXkoKSlcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuQ29udGV4dFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRyaWdnZXJpbmdUYXNrKCk6IFRhc2sge1xyXG4gICAgLy8gVGhpcyBpcyBhIHNlbWkgcGF0Y2ggd2hpY2ggZml4ZXMgcHJvYmxlbXMgc3VjaCBhcyB0aGUgb25lcyBpbiBRQ1IgIzI5NjQyOFxyXG4gICAgLy8gV2hlbiBhIG1vZGFsIHRhc2sgZ2V0cyBvcGVuZWQsIGl0IG1pZ2h0IHNldCBpdHMgdHJpZ2dlcmluZyB0YXNrIHRvIGEgdGFza1xyXG4gICAgLy8gd2hvc2UgJ2Fib3J0JyBjb21tYW5kIGFycml2ZWQgYW5kIGlzIHBlbmRpbmcgZm9yIGV4ZWN1dGlvbi4gVW5kZXIgdGhlc2VcclxuICAgIC8vIGNpcmN1bXN0YW5jZXMsIHdlIG11c3QgY2hlY2sgZXZlcnkgYWNjZXNzIHRvIHRyaWdnZXJpbmdUYXNrIGFuZCBtYWtlIHN1cmVcclxuICAgIC8vIGl0IHBvaW50cyB0byBhIHZhbGlkIHRhc2suXHJcbiAgICBpZiAodGhpcy5fdHJpZ2dlcmluZ1Rhc2sgIT09IG51bGwgJiYgdGhpcy5fdHJpZ2dlcmluZ1Rhc2suZ2V0TUdEYXRhKCkuSXNBYm9ydGluZylcclxuICAgICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl90cmlnZ2VyaW5nVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaW4gdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5sYXN0IGZvY3VzZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgc2V0TGFzdFBhcmtlZEN0cmwoY3RybDogTWdDb250cm9sQmFzZSk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0TGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKHRoaXMsIGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFF1ZXJ5IFRhc2sgUGF0aCBSZXR1cm5zIHRoZSB0YXNrIHBhdGggdGhhdCBsZWFkcyB0byB0aGUgY3VycmVudCB0YXNrLiBUaGUgcmVzdWx0aW5nIGFscGhhIHN0cmluZ1xyXG4gIC8vLyAgIGNvbnRhaW5zIHRoZSB0YXNrIG5hbWVzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG5hbWUgb2YgdGhlIHRhc2suIE5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlICc7J1xyXG4gIC8vLyAgIGNoYXJhY3Rlci4gRm9yIFBST0coKSB1c2luZy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHF1ZXJ5VGFza1BhdGgoKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICBsZXQgaW5zZXJ0ZWROYW1lczogbnVtYmVyID0gMDsgICAgICAgIC8vIGhvdyBtYWNoIG5hbWVzIGluc2VydGVkIHRvIHRoZSBvdXRwdXQgc3RyaW5nXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoNzkzNik7IC8vIDMxICogMjU2ICovXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKSk7XHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCBmYWxzZSk7XHJcbiAgICBmb3IgKGxldCB0c2s6IG51bWJlciA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0c2sgPj0gMDsgdHNrLS0pIHtcclxuICAgICAgbGV0IGN1cnJUc2s6IFRhc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuICAgICAgaWYgKGN1cnJUc2suaXNNYWluUHJvZygpKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZVByb3A6IFByb3BlcnR5ID0gY3VyclRzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpO1xyXG4gICAgICBpZiAobmFtZVByb3AgPT0gbnVsbClcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IG5hbWVQcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZSkpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IDEgbmFtZSAtPiBkb24ndCBpbnNlcnQgJzsnXHJcbiAgICAgICAgLy8gYWZ0ZXIgbGFzdCBuYW1lIGRvbid0IGluc2VydCAnOycgdG9vLlxyXG4gICAgICAgIGlmIChpbnNlcnRlZE5hbWVzKysgIT09IDApXHJcbiAgICAgICAgICByZXN1bHQuQXBwZW5kKCc7Jyk7XHJcbiAgICAgICAgcmVzdWx0LkFwcGVuZChuYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgRmllbGQgd2hpY2ggY29udGFpbiBpdGVtIG51bWJlciBpdG1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fMl9wYXJlbnRfdmVlKGl0bTogbnVtYmVyKTogRmllbGQge1xyXG4gICAgbGV0IGN1cnJUc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0bTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRtOiBudW1iZXIgPSAwOyAgICAgIC8vIHN0YXJ0IG9mIHRoZSBmaWVsZCBpbiBmaWVsZGVUYWIgbnVtYmVyIGZvciBjaGVja2VkIHRhc2tcclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGgtMV1cclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBjdXJyVHNrID0gdHJlZVJvdXRlW3Rza107XHJcblxyXG4gICAgICBjdXJySXRtICs9IGN1cnJUc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgLy8gZm91bmQgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGZpZWxkXHJcbiAgICAgIGlmIChpdG0gPCBjdXJySXRtKSB7XHJcbiAgICAgICAgLy8gbnVtYmVyIG9mIEZpZWxkIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdG0gLT0gbGFzdEl0bTtcclxuICAgICAgICByZXR1cm4gPEZpZWxkPmN1cnJUc2suRGF0YVZpZXcuZ2V0RmllbGQoaXRtKTtcclxuICAgICAgfVxyXG4gICAgICBsYXN0SXRtID0gY3Vyckl0bTtcclxuICAgIH1cclxuICAgIC8vIG5vdCBmb3VuZCB0aGUgZmllbGRcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbnRyb2wgaWQgd2hpY2ggY29udGFpbiBmaWVsZCBhdHRhY2hlZCB0byBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGVtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xJREZyb21WYXJJdGVtKGl0ZW06IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0ZW06IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbGFzdEl0ZW06IG51bWJlciA9IDA7ICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGggLSAxXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcbiAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG4gICAgICBjdXJySXRlbSArPSBjdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2wgJiBmaWVsZFxyXG4gICAgICBpZiAoaXRlbSA8IGN1cnJJdGVtKSB7XHJcbiAgICAgICAgLy8gTnVtYmVyIG9mIGZpZWxkcyBpbiBmb3VuZCB0YXNrXHJcbiAgICAgICAgaXRlbSAtPSBsYXN0SXRlbTtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdXJyVGFzay5EYXRhVmlldy5nZXRGaWVsZChpdGVtKTtcclxuICAgICAgICBpZiAoZmllbGQuZ2V0Q3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgPSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIGN1cnJUYXNrLkZvcm0uZ2V0Q29udHJvbElkeChmaWVsZC5nZXRDdHJsKCkpICsgMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpXHJcbiAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgIGxhc3RJdGVtID0gY3Vyckl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBhdHRhY2hlZCB0byB0aGUgdmFyaWFibGUgaW4gc2FtZSB0YXNrIG5vdCBmb3VuZFxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBmcm9tIGNvbnRyb2xJRFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xGcm9tQ29udHJvbElEKGNvbnRyb2xJRDogbnVtYmVyLCBwYXJlbnQ6IFJlZlBhcmFtPG51bWJlcj4pOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBwYXJlbnQudmFsdWUgPSAtMTtcclxuXHJcbiAgICBpZiAoY29udHJvbElEID49IDApIHtcclxuICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgICAgbGV0IGNhbGxlclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzSW5DdXJydGFzazogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgY29udHJvbElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcblxyXG4gICAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcblxyXG4gICAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG5cclxuICAgICAgICBpZiAoY3VyclRhc2suRm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBub09mQ29udHJvbHNJbkN1cnJ0YXNrID0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2xcclxuICAgICAgICAgIGlmIChjb250cm9sSUQgPCAobm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKyBub09mQ29udHJvbHNJbkN1cnJ0YXNrKSkge1xyXG4gICAgICAgICAgICAvLyBJZHggb2YgdGhlIGNvbnRyb2wgaW4gY3VycmVudCB0YXNrXHJcbiAgICAgICAgICAgIGNvbnRyb2xJZHggPSBjb250cm9sSUQgLSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzaztcclxuICAgICAgICAgICAgY29udHJvbCA9IDxNZ0NvbnRyb2w+Y3VyclRhc2suRm9ybS5DdHJsVGFiLmdldEN0cmwoY29udHJvbElkeCk7XHJcbiAgICAgICAgICAgIGNhbGxlclRhc2sgPSBjdXJyVGFzaztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gbm9PZkNvbnRyb2xzSW5DdXJydGFzaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEdldCBwYXJlbnRcclxuICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmVudC52YWx1ZSA9IDA7XHJcbiAgICAgICAgbGV0IHByZXZDdGxJZHg6IG51bWJlciA9IHRyZWVSb3V0ZVswXS5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSAwOyB0YXNrIDwgdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2srKykge1xyXG4gICAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgICAgaWYgKHByZXZDdGxJZHggIT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIHBhcmVudC52YWx1ZSsrO1xyXG5cclxuICAgICAgICAgIGlmIChjYWxsZXJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXggPT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIHByZXZDdGxJZHggPSBjdXJyVGFzay5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnRyb2wgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIENvbnRyb2xJRFxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjdGxfaXRtXzRfcGFyZW50X3ZlZShwYXJlbnQ6IG51bWJlciwgdmVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHRzazogVGFzaztcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcblxyXG4gICAgaWYgKHBhcmVudCAhPT0gVGFza0Jhc2UuTUFJTl9QUkdfUEFSRU5UX0lEICYmIGRlcHRoIDw9IHBhcmVudClcclxuICAgICAgcmV0dXJuIHZlZTtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuXHJcbiAgICBpZiAodmVlICE9PSAwKSB7XHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgLy8gZ2V0IHRoZSBpbmRleCBvZiBwYXJlbnQgaW4gdGhlIHRhc2sgdHJlZVxyXG4gICAgICBsZXQgaW5kT2ZQYXJlbnRJblRhc2tUcmVlOiBudW1iZXIgPSB0aGlzLmdldEluZE9mUGFyZW50SW5UYXNrVHJlZShwYXJlbnQsIHRyZWVSb3V0ZSk7XHJcblxyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgaSA+IGluZE9mUGFyZW50SW5UYXNrVHJlZTsgaS0tKSB7XHJcbiAgICAgICAgdHNrID0gdHJlZVJvdXRlW2ldO1xyXG4gICAgICAgIHZlZSArPSB0c2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1RyZWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudDogbnVtYmVyLCB0YXNrVHJlZTogVGFza1tdKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IHRhc2tUcmVlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKHRhc2tUcmVlW2ldLmlzTWFpblByb2coKSAmJiB0aGlzLl9jdGxJZHggPT09IHRhc2tUcmVlW2ldLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBpbmRPZlBhcmVudEluVGFza1RyZWUgPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IHBhcmVudDtcclxuXHJcbiAgICByZXR1cm4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVudHJ5IHBvaW50IHRvIHRoZSByZWN1cnNpb24gaW5kdWNlZCBieSBnZXRGaWVsZEJ5TmFtZV8uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGEgZmllbGQgd2hpY2ggYmVsb25ncyB0byBtZSBvciB0byBteSBwYXJlbnRzIHdpdGggdGhlIG1hdGNoaW5nIG5hbWU8L3JldHVybnM+XHJcbiAgZ2V0RmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG4gICAgcmV0dXJuICg8VGFzaz4gKHRoaXMuR2V0Q29udGV4dFRhc2soKSkpLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIGZpZWxkIHdpdGggdGhlIG5hbWUgaW4gdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lLCB0aGUgbmFtZSBjYW4gYmUgZW1wdHkgc3RyaW5nIHRvbzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyBub3QgZm91bmQgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTC48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZTogc3RyaW5nKTogRmllbGR7XHJcbiAgICBsZXQgdG1wVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAoZmxkTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCBmbGQ6IEZpZWxkID0gdGhpcy5nZXRGaWVsZChmbGROYW1lKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgZmllbGQgaXMgbm90IG91cnMgLSByZWN1cnNpdmUgY2hlY2sgdGhlIGFuY2VzdG9yc1xyXG4gICAgaWYgKGZsZCA9PSBudWxsKSB7XHJcbiAgICAgIHRtcFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCkgIT0gbnVsbCA/IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSA6IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0bXBUYXNrLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBsZXQgbWFpblByZzogVGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCB0aGlzLmdldEN0bElkeCgpKTtcclxuICAgICAgICAgIGZsZCA9IG1haW5QcmcuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICAgICAgZmxkID0gdG1wVGFzay5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGluZGV4IG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gWmVyby48L3JldHVybnM+XHJcbiAgZ2V0SW5kZXhPZkZpZWxkQnlOYW1lKGZsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9IHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpO1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpO1xyXG4gICAgbGV0IGZsZFRhYjogRmllbGRzVGFibGU7XHJcblxyXG4gICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gMDtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG4gICAgZm9yIChsZXQgY3VycjogbnVtYmVyID0gZGVwdGggLSAxOyBjdXJyID49IDA7IGN1cnItLSkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0cmVlUm91dGVbY3Vycl07XHJcbiAgICAgIGlmIChjdXJyVGFzayA9PT0gZmxkLmdldFRhc2soKSkge1xyXG4gICAgICAgIGN1cnIgPSBmbGQuZ2V0SWQoKTtcclxuICAgICAgICBpbmRleCArPSArK2N1cnI7ICAgICAgICAgLy8gc3RhcnQgaW5kZXggaW4gTWFnaWMgZnJvbSAxIGFuZCBub3QgZnJvbSAwXHJcbiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgIC8vIGdldCBvdXQgb2YgdGhlIHRhc2sgdHJlZSAtIHRoZSBpbmRleCBpcyBmb3VuZFxyXG4gICAgICB9XHJcbiAgICAgIGZsZFRhYiA9IDxGaWVsZHNUYWJsZT5jdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKTtcclxuICAgICAgaW5kZXggKz0gZmxkVGFiLmdldFNpemUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgdGhlIHBhdGggZnJvbSB0aGlzIHRhc2sgdG8gdGhlIHJvb3Qgb2YgdGhlIHRhc2tzIHRyZWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGF0aFwiPmFycmF5IG9mIHRhc2tzLCB0aGUgcm91dGUgdXAuIFRoZSAwIGl0ZW0gaXMgc3RhcnQgcG9pbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICBwYXRoVG9Sb290KHBhdGg6IFRhc2tbXSwgYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSAoYnlQYXJlbnRPcmRlciA/IHRoaXMgOiA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwYXRoW2ldID0gdGFzaztcclxuICAgICAgbGV0IGN0bElkeDogbnVtYmVyID0gdGFzay5nZXRDdGxJZHgoKTtcclxuXHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gYnlQYXJlbnRPcmRlciA/IG51bGwgOiB0YXNrLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKVxyXG4gICAgICAgIHRhc2sgPSB0bXBUYXNrO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgZ2xvYmFsIGhhbmRsZXIgYWRkIGl0IHRvIHRoZSBwYXRoXHJcbiAgICAgICAgICBpZiAoIWJ5UGFyZW50T3JkZXIgJiYgdGhpcy5pc01haW5Qcm9nKCkgJiYgdGhpcy5nZXRDdGxJZHgoKSAhPT0gQ29uc3RJbnRlcmZhY2UuVE9QX0xFVkVMX0NPTlRBSU5FUilcclxuICAgICAgICAgICAgcGF0aFtpICsgMV0gPSB0aGlzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiBjdGxJZHggIT09IHRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICBwYXRoWysraV0gPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgY3RsSWR4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgdGFzayBzaG91bGQgYmUgcmVmcmVzaGVkIC0gY29tcGFyZSB0aGUgXCJyZWZyZXNoIG9uXCIgZmllbGRzIG9mIHRoZSBjdXJyZW50IHJlY29yZCB0byB0aGVcclxuICAvLy8gICBwcmV2aW91cyByZWNvcmQgYW5kIGlmIGRpZmZlcmVudCB2YWx1ZXMgYXJlIGZvdW5kIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzaG91bGRCZVJlZnJlc2hlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBkYXRhVmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fcGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcmV2Q3VyclJlYyBpcyBudWxsIG9ubHkgaWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgb3IgYWZ0ZXIgQ2FuY2VsLlxyXG4gICAgLy8gQWZ0ZXIgQ2FuY2VsIGluIHRoZSBwYXJlbnQgdGFzayBTdWJmb3JtIHJlZnJlc2ggbXVzdCBiZSBkb25lIGFsd2F5c1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgPT09IG51bGwgfHwgZGF0YVZpZXcuaXNQcmV2Q3VyclJlY051bGwoKSB8fFxyXG4gICAgICAodGhpcy5SZWZyZXNoT25WYXJzICE9PSBudWxsICYmICFkYXRhVmlldy5jdXJyRXF1YWxzUHJldih0aGlzLlJlZnJlc2hPblZhcnMpKSlcclxuICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3ViVGFza3MgKHN1YmZvcm1zKSBzaG91bGQgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBDaGVja1JlZnJlc2hTdWJUYXNrcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBkbyBub3QgcmVmcmVzaCBzdWJmb3JtcyBiZWZvcmUgdGhlIGZpcnN0IHJlY29yZCBwcmVmaXguIFRoZSBzZXJ2ZXIgc2VudCB1cyB0aGVpciBkYXRhdmlldyFcclxuICAgIGlmICh0aGlzLl9lbnRlcmVkUmVjTGV2ZWwpIHtcclxuICAgICAgbGV0IHN1YmZvcm1zVG9SZWZyZXNoOiBMaXN0PFRhc2s+ID0gYXdhaXQgdGhpcy5HZXRTdWJmb3Jtc1RvUmVmcmVzaCgpO1xyXG5cclxuICAgICAgaWYgKHN1YmZvcm1zVG9SZWZyZXNoLmxlbmd0aCA+IDApXHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgYSBsaXN0IG9mIHN1YnRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+YSBsaXN0IG9mIHN1YnRhc2tzPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0U3ViVGFza3MoKTogTGlzdDxUYXNrPiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpXHJcbiAgICAgICAgc3ViVGFza3MucHVzaCg8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2YgdGhvc2Ugc3ViZm9ybXMgdGhhdCBtdXN0IGJlIHJlZnJlc2hlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5saXN0IG9mIHN1YmZvcm1zIHRvIHJlZnJlc2g8L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0U3ViZm9ybXNUb1JlZnJlc2goKTogUHJvbWlzZTxMaXN0PFRhc2s+PiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSB0aGlzLkdldFN1YlRhc2tzKCk7XHJcbiAgICBsZXQgc3ViVGFza3NUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5TaG91bGRSZWZyZXNoU3ViZm9ybVRhc2soc3ViVGFzaykpXHJcbiAgICAgICAgc3ViVGFza3NUb1JlZnJlc2gucHVzaChzdWJUYXNrKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrc1RvUmVmcmVzaDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIHRoZSBzcGVjaWZpYyBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIFNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnN1YlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIC8vIERlZmVjdCA3Njk3OS4gU3ViZm9ybSBjYW4gZXhlY3V0ZSByZWZyZXNoIG9ubHkgYWZ0ZXIgaXQgaGFzIFRhc2tWaWV3LlxyXG4gICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgIXN1YlRhc2suSW5TZWxlY3QgJiYgc3ViVGFzay5BZnRlckZpcnN0UmVjb3JkUHJlZml4KSB7XHJcbiAgICAgIGxldCBwYXJlbnRNb2RlOiBzdHJpbmcgPSB0aGlzLmdldE1vZGUoKTtcclxuICAgICAgbGV0IG1vZGVQcm9wZXJ0eTogbnVtYmVyID0gKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWVxyXG4gICAgICAgIDogcGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUpO1xyXG5cclxuICAgICAgLy8gRm9yIGEgc3ViZm9ybSB3aXRoICdBc1BhcmVudCcgbW9kZSB3ZSBhbHNvIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybVxyXG4gICAgICAvLyBhZnRlciB0aGUgcGFyZW50IHJlY29yZCBwcmVmaXguIElmIHRoZSBzcGVjaWZpYyBtb2RlIGlzIG5vdCBhbGxvd2VkXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGNvbnRpbnVlcyBpbiB0aGUgb2xkIG1vZGUuXHJcbiAgICAgIGlmIChzdWJUYXNrLk1vZGVBc1BhcmVudCAmJiBwYXJlbnRNb2RlICE9PSBzdWJUYXNrLmdldE1vZGUoKSAmJlxyXG4gICAgICAgIHRoaXMuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEICYmXHJcbiAgICAgICAgYXdhaXQgKHN1YlRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSAmJlxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suY2hlY2tQcm9wKG1vZGVQcm9wZXJ0eSwgdHJ1ZSkpIHtcclxuICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgc3ViZm9ybUN0cmwuUmVmcmVzaE9uVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xyXG5cclxuICAgICAgICBhd2FpdCBzdWJUYXNrLlNldE1vZGVBc1BhcmVudChwYXJlbnRNb2RlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZWZyZXNoID0gYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fUkVGUkVTSCwgdHJ1ZSkgJiYgc3ViVGFzay5zaG91bGRCZVJlZnJlc2hlZCgpO1xyXG5cclxuICAgICAgICBpZiAocmVmcmVzaCkge1xyXG4gICAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5pc1Zpc2libGUoKSAmJlxyXG4gICAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVmcmVzaCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlZnJlc2gpXHJcbiAgICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlZnJlc2g7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldHMgdGhlIHRhc2sgbW9kZSBhcyBwYXJlbnQgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TW9kZVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKHRydWUpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UoZmFsc2UpO1xyXG4gICAgICBsZXQgc3ViVGFza0R2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgICBpZiAoIXN1YlRhc2tEdi5pc0VtcHR5KCkgJiYgKHN1YlRhc2tEdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICB0aGlzLnNldE1vZGUocGFyZW50TW9kZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICBhd2FpdCAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuXHJcbiAgICB0aGlzLnNldE9yaWdpbmFsVGFza01vZGUocGFyZW50TW9kZSk7XHJcbiAgICBhd2FpdCB0aGlzLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gYWZ0ZXIgY29tcHV0ZSBkbyBzdWJmb3JtIHRhc2sgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIGFzeW5jIGRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCkge1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0cnVlKTtcclxuICAgICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENsZWFuIGZsYWcgZm9yIFN1YmZvcm0gcmVjb3JkIGN5Y2xlIDwvc3VtbWFyeT5cclxuICBDbGVhbkRvU3ViZm9ybVByZWZpeFN1ZmZpeCgpOiB2b2lkIHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgbXVzdCBkaXNwbGF5IGNvbmZpcm1hdGlvbiB3aW5kb3cgcHJpb3IgdG8gZGVsZXRpbmcgYSByZWNvcmQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBtdXN0Q29uZmlybUluRGVsZXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSk7XHJcblxyXG4gICAgLy8gQXMgc3RyYW5nZSBhcyBpdCBzb3VuZHMsIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0b1xyXG4gICAgLy8gRmFsc2UsIHRoZW4gbm8gbmVlZCB0byBkaXNwbGF5IGNvbmZpcm1hdGlvbi4uLlxyXG4gICAgcmV0dXJuICFwcm9wLmlzRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHN1Yi10YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YlRhc2tcIj50aGUgc3ViIHRhc2sgdG8gYWRkPC9wYXJhbT5cclxuICBhZGRTdWJUYXNrKHN1YlRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlN1YlRhc2tzID09PSBudWxsKVxyXG4gICAgICB0aGlzLlN1YlRhc2tzID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgIHRoaXMuU3ViVGFza3MuYWRkVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgb25lIG9mIHRoaXMgdGFza3Mgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSBzdWItdGFzayB0byByZW1vdmU8L3BhcmFtPlxyXG4gIHJlbW92ZVN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MucmVtb3ZlVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcmFuc2FjdGlvbkZhaWxlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkID0gdmFsO1xyXG5cclxuICAgIGlmICghdmFsKVxyXG4gICAgICB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxldmVsXCI+aXMgdGhlIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2hlY2tpbmcuIFRSQU5TX05PTkUgLS0+IGNoZWNrIGZvciBhbnlcclxuICAvLy8gICBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGxldmVsIGZhaWx1cmUgVFJBTlNfUkVDT1JEL1RBU0tfUFJFRklYIC0tPiBjaGVjayBmb3IgYSBmYWlsdXJlIGluIHRoYXQgc3BlY2lmaWNcclxuICAvLy8gICBsZXZlbDwvcGFyYW0+XHJcbiAgdHJhbnNhY3Rpb25GYWlsZWQobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbCkpXHJcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbkZhaWxlZDtcclxuICAgIGVsc2UgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgZmxhZyBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gcmV0cnkgb24gdGhlIHRhc2sncyBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnZhbHVlIG9mIGZsYWc8L3BhcmFtPlxyXG4gIHNldEFmdGVyUmV0cnkodmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgIT0gbnVsbCkge1xyXG4gICAgICBpZiAodmFsID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LnNldEFmdGVyUmV0cnkodmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFmdGVyUmV0cnkoKTogYm9vbGVhbjtcclxuICBnZXRBZnRlclJldHJ5KHJlY292ZXJ5OiBzdHJpbmcpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEFmdGVyUmV0cnlfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8xKHJlY292ZXJ5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgcGFydCBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gY3VycmVudGx5IGJlaW5nIHJldHJpZWQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzAoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZCB3aXRoIGEgc3BlY2lmaWMgcmVjb3Zlcnk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzEocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNhY3Rpb24uZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBFeGVjRW5kVGFzayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBfYkV4ZWNFbmRUYXNrIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV4ZWNFbmRUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JFeGVjRW5kVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJleGVjdXRlIGVuZCB0YXNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibW9kZVwiPnRoZSBtb2RlIHRvIGNvbXBhcmUgdG88L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc2hvdWxkIHdlIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uPzwvcmV0dXJucz5cclxuICBhc3luYyBldmFsRW5kQ29uZChtb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBlbmRUYXNrQ29uZFByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IGV2YWxFbmRDb25kUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OKTtcclxuXHJcbiAgICAvLyBEb250IGV2YWx1YXRlIGVuZCBjb25kaXRpb24gaWYgd2UgYXJlIGFscmVhZHkgY2xvc2luZyB0aGUgdGFza1xyXG4gICAgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2JFeGVjRW5kVGFzaylcclxuICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgaWYgKGV2YWxFbmRDb25kUHJvcCAhPSBudWxsICYmICggTlN0cmluZy5Db21wYXJlKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpLCBDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSxcclxuICAgICAgICB0cnVlKSA9PT0gMCB8fCAoKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpKS50b0xvd2VyQ2FzZSgpID09PSBtb2RlLnRvTG93ZXJDYXNlKCkpKSkge1xyXG4gICAgICAvLyBjaGVjayB0aGUgZW5kIGNvbmRpdGlvblxyXG4gICAgICBlbmRUYXNrQ29uZFByb3AgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTik7XHJcbiAgICAgIGlmIChlbmRUYXNrQ29uZFByb3AgPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGxldCBlbmRUYXNrOiBzdHJpbmcgPSBhd2FpdCBlbmRUYXNrQ29uZFByb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgLy8gc2lnbmFsIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBlbmQgdGFzayBhZnRlciB3ZSBnZXQgb3V0IG9mIHRoZSBsb29wXHJcbiAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihlbmRUYXNrKSkge1xyXG4gICAgICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJ0cnlpbmcgdG8gc3RvcFwiIGZsYWcgZm9yIHRoZSB0YXNrIGFuZCBpdCdzIHN1YlRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcnlpbmdUb1N0b3AodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgdGFzay5zZXRUcnlpbmdUb1N0b3AodmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5Jc1RyeWluZ1RvU3RvcCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBnZXRJblJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlY29yZFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW5SZWNvcmRTdWZmaXgoYlZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYlZhbHVlICE9PSB0aGlzLl9pblJlY29yZFN1ZmZpeCkge1xyXG4gICAgICB0aGlzLl9pblJlY29yZFN1ZmZpeCA9IGJWYWx1ZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBiRXZhbE9sZFZhbHVlcyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJGbGFnXCI+dHJ1ZS9mYWxzZSB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlL2ZsYXNlIC0gdmFsdWUgdXBkYXRlZDwvcmV0dXJucz5cclxuICBzZXRFdmFsT2xkVmFsdWVzKGJGbGFnOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYkZsYWcgIT09IHRoaXMuX2V2YWxPbGRWYWx1ZXMpIHtcclxuICAgICAgdGhpcy5fZXZhbE9sZFZhbHVlcyA9IGJGbGFnO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJFdmFsT2xkVmFsdWVzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmFsc2UgLSBsb29rIGF0IG9sZCB2YWx1ZXMgd2hlbiBnZXR0aW5nIHRoZSBmaWVsZCB2YWx1ZTwvcmV0dXJucz5cclxuICBnZXRFdmFsT2xkVmFsdWVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2YWxPbGRWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAgYXN5bmMgZW5kVGFzayhyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBkdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb24/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc3ViZm9ybURlc3RpbmF0aW9uKSlcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGZhbHNlLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIHN1YmZvcm1EZXN0aW5hdGlvbiwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRlZCBpbiBlbmRpbmcgdGhlIHRhc2sgYW5kIGl0cyBzdWIgdGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV2ZXJzaWJsZUV4aXRcIj5pZiB0cnVlIHRoZW4gdGhlIGV4aXQgaXMgcmV2ZXJzaWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5RGVzY3NcIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhlIHN1YiB0YXNrcyBhbmQgaGFuZGxlIHJlYyBzdWZmaXggZm9yIHRoaXMgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtRGVzdGluYXRpb25cIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhpcyB0YXNrPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGVuZFRhc2tfMShyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb246IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGNsb3NlZFN1YkZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcblxyXG4gICAgaWYgKCh0aGlzLklzU3ViRm9ybSAmJiAhc3ViZm9ybURlc3RpbmF0aW9uKSAmJiAhdGhpcy5fcGFyZW50VGFzay5JbkVuZFRhc2spIHtcclxuICAgICAgLy8gaWYgdGhpcyB0YXNrIGlzIGEgc3ViZm9ybSBhbmQgaXRzIHBhcmVudCBpcyBub3QgdHJ5aW5nIHRvIHN0b3AgdGhlblxyXG4gICAgICAvLyBzdGFydCBzdG9wcGluZyB0aGUgdGFza3Mgc3ViIHRyZWUgZnJvbSB0aGUgcGFyZW50IGZvcm1cclxuICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5fcGFyZW50VGFzay5lbmRUYXNrKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLkluRW5kVGFzaykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuSW5FbmRUYXNrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBlcnJvciBhbmQgYnJvd3NlciBjbG9zZSwgaW50aW1hdGUgc2VydmVyIGFib3V0IGJyb3dzZXIgY2xvc2VcclxuICAgICAgICBpZigoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkgJiYgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVVubG9hZENvbW1hbmQoKTtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICAgICAgdGhpcy5zZXRUcnlpbmdUb1N0b3AodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIGV4aXQgZnJvbSBzdWJUYXNrcyBpbiBhIHByZWZpeCBtYW5uZXJcclxuICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBzdWIgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgbGV0IGNsaWVudE9wZXJFeGlzdDogYm9vbGVhbiA9IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyRXhpc3QgPSB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyh0aGlzLFxyXG4gICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpXHJcbiAgICAgICAgICAgICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHRoaXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdCAmJiAhcGVuZGluZ1RyYW5zYWN0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgICAgIGNsb3NlZFN1YkZvcm0gPSBjbG9zZWRTdWJGb3JtIHx8IHN1YlRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZXhpdCBmb3IgdGhlIGZpcnN0IHRhc2sgbXVzdCBlbmQgYWxsIHRhc2tzXHJcbiAgICAgICAgICBpZiAodGhpcyA9PT0gbWdkVGFiLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpIHtcclxuICAgICAgICAgICAgZm9yIChpID0gbWdkVGFiLmdldFNpemUoKSAtIDE7IGkgPiAwICYmIHN1Y2NlZWRlZDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG1nZFRhYi5nZXRNR0RhdGEoaSkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKG1nZFRhYi5nZXRNR0RhdGEoaSkuZ2V0Rmlyc3RUYXNrKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG4gICAgICAgICAgLy8gaWYgY2xvc2luZyB0aGUgc3ViIHRhc2tzIHdhcyBzdWNjZXNzZnVsIHRoZW4gZXhlY3V0ZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIHR1cm4gb2ZmIHRoZSBmb3JjZSByZWNvcmQgc3VmZml4LFxyXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgYW4gdW53YW50ZWQgdXBkYXRlIG1pZ2h0IGJlIHNlbnQgd2hlbiB0YXNrIGVuZHMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjBcIik7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgZm9yY2Ugc3VmZml4LCBmb3IganVzdCBpbiBjYXNlLlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiBmb3JjZVN1ZmZpeCA9PT0gdHJ1ZSAmJiB0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgXCIxXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpXHJcbiAgICAgICAgICAgIHRoaXMuSGFuZGxlVHJhbnNhY3Rpb25JbmZvKCk7XHJcblxyXG4gICAgICAgICAgbGV0IHByZVRza1N1ZmZpeDogYm9vbGVhbiA9IHN1Y2NlZWRlZDtcclxuXHJcbiAgICAgICAgICAvLyBub3cgcGVyZm9ybSB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHN1Y2NlZWRlZCAmJiAhb25seURlc2NzICYmIHJldmVyc2libGVFeGl0ICYmICFkdWVUb1ZlcmlmeUVycm9yICYmXHJcbiAgICAgICAgICAgICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKSAmJlxyXG4gICAgICAgICAgICB0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCAmJiAhdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQpXHJcbiAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGF3YWl0IHRoaXMuaGFuZGxlVGFza1N1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gZXhpdCBmcm9tIGFueSBzdWJUYXNrcyBvcGVuZWQgZHVyaW5nIHRoZSBsYXN0IHJlYy1zdWZmaXggb3IgdGFzayBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiB0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghc3ViVGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQoc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZG9udCBjb250aW51ZSB3aXRoIHRhc2sgZXhpdCBpZiBhIGRhdGEgZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGFzayBzdWZmaXggKGUuZy4gcm9sbGJhY2soKSlcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIC8vIHRhc2sgc3VmZml4IG9ubHkgc3RvcHMgZXhlY3V0aW9uIGZvciBjdXJyZW50IHRhc2ssIHdoaWNoIGlzIGJlaW5nIGNsb3NlZFxyXG4gICAgICAgICAgaWYgKHByZVRza1N1ZmZpeClcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpIHtcclxuICAgICAgICAgICAgLy8gVHJ5IGNsb3NpbmcgYW55IHRhc2sgbGV2ZWwgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoZmFsc2UsIENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiAhdGhpcy50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19UQVNLX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWNjZWVkZWQpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGJhc2VNZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhO1xyXG4gICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBjbG9zaW5nIHRoZSB0b3Btb3N0IHRhc2sgLSBkb250IGxvb3NlIGFueSBldmVudHMsIGxlZnQgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIGJhc2VNZ2QuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnRzKGJhc2VNZ2QsIDApO1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgc3QgPSBuZXcgU2Vzc2lvblN0YXRpc3RpY3NGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzdC5Xcml0ZVRvRmxvd01vbml0b3IoKEZsb3dNb25pdG9yUXVldWUpX2Zsb3dNb25pdG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgVGFza1NlcnZpY2VCYXNlLkV4aXQodGhpcywgcmV2ZXJzaWJsZUV4aXQsIHN1YmZvcm1EZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFdoZW4gY2xvc2luZyBhIHRhc2sgd2hvc2UgcGFyZW50IGlzIGEgbWFpbiBwcm9ncmFtLCBjaGVjayB0aGUgbWFpbiBwcm9ncmFtJ3MgZW5kXHJcbiAgICAgICAgICAgICAgLy8gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgICAgICAgICAgICAgIGxldCBtYWluUHJnVGFzazogVGFzayA9IG1nZC5nZXRNYWluUHJvZygwKTtcclxuICAgICAgICAgICAgICAgIGxldCByb290VGFzazogVGFzayA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuZE1haW5Qcmc6IGJvb2xlYW4gPSBhd2FpdCBtYWluUHJnVGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZW5kIHRoZSByb290IHRhc2sgaWYgd2UgYXJlIGFscmVhZHkgZG9pbmcgaXQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcyAhPT0gcm9vdFRhc2sgJiYgZW5kTWFpblByZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHJvb3RUYXNrKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0Q3RybChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgTWdGb3JtLkNyZWF0ZWRGb3Jtcy5yZW1vdmUoPE1nRm9ybT50aGlzLkZvcm0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICBpZiAoIXRoaXMuSXNTdWJGb3JtIHx8IHN1YmZvcm1EZXN0aW5hdGlvbilcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkLCByZXZlcnNpYmxlRXhpdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRY3IgIzkxNDY0NSA6IHJldHVybiBmYWxzZSBpbiBhIHJlY3Vyc2l2ZSBjYWxsLlxyXG4gICAgLy8gb3RoZXJ3aXNlIGNvbW1vbkhhbmRsZXJBZnRlcihldmVudE1hbmFnZXIpIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmIHRoZSBjYWxsIGlzIHJlY3Vyc2l2ZWx5IG1hZGUgZnJvbSBoYW5kbGVFdmVudC5cclxuICAgIC8vIGZvciBleGFtcGxlIDogdGFzayBjb25kIGZ1bGZpbGxlZC4gaGFuZGxlSW50ZXJuYWxFdmVudCh0aGlzLCBNR19BQ1RfUkVDX1NVRkZJWCkgaXMgY2FsbGVkLlxyXG4gICAgLy8gd2hpbGUgaW4gcmVjIHN1ZiBoYW5kbGVyLCBlbmRUYXNrIGlzIGNhbGxlZCBhZ2Fpbi4uaWYgd2UgcmV0dXJuIHRydWUgdGhlbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIGlzIG5vdCBleGVjdXRlZC5cclxuICAgIC8vIGlmIHRoZSByZWMgc3VmZml4IGhhbmRsZXIgZGlkIG5vdCBleGlzdCwgdGhlcmUgd2lsbCBiZSBubyBjYWxsIHRvIGVuZFRhc2sgYW5kIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgd2lsbCBiZSBleGVjdXRlZC5cclxuICAgIC8vIFRoZSBuYW1lICdzdWNjZWVkZWQnIGlzIGEgYml0IG1pc2xlYWRpbmcuLml0cyBtb3JlIGxpa2UgJ2V4ZWN1dGVkJy4uYnV0IHdlIGRlY2lkZWQgdG8ga2VlcCBpdC5cclxuICAgIGVsc2UgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyByZXN0b3JlIHRoZSBmbGFnLlxyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRoaXMuX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQpO1xyXG5cclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldFNlcnZlclNpZGVUYXNrU3VmZml4KClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0U2VydmVyU2lkZVRhc2tTdWZmaXggKHRhc2sgOiBUYXNrKSA6IHZvaWRcclxuICB7XHJcbiAgICBsZXQgY2xpZW50T3BlcmF0aW9uRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG5cclxuICAgIGxldCAgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIC8vIGZpbmQgaWYgTUdfQUNUX1RBU0tfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgIGkgPSAwOyBpIDwgaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgb3Blci5zZXRFeGVjT25TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXNrLmhhc1N1YlRhc2tzKCkpICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2suR2V0U3ViVGFza3MoKS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyAodGFzazogVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjbGllbnRPcGVyYXRpb25FeGlzdCA9IGZhbHNlO1xyXG4gICAgdmFyIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcblxyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICAvLyBmaW5kIGlmIE1HX0FDVF9UQVNLX1NVRkZJWCAvIE1HX0FDVF9SRUNfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcbiAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgaWYgKGV2ZW50Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCkge1xyXG4gICAgICBsZXQgY3VyclJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFuZGxlciAhPSBudWxsICYmIHBlbmRpbmdUcmFuc2FjdGlvbnMgPT0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBjbnQgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbnQ7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG9wZXIgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldE9wZXJhdGlvbihpKTtcclxuICAgICAgICAgIGlmIChvcGVyLmdldEV4ZWNPbkNsaWVudCgpKSB7XHJcbiAgICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWNsaWVudE9wZXJhdGlvbkV4aXN0ICYmIHRhc2suaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAoIWNsaWVudE9wZXJhdGlvbkV4aXN0ICYmIGkgPCB0YXNrLmdldFN1YlRhc2tzKCkuZ2V0U2l6ZSgpKTsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgc3ViVGFzayA9IDxUYXNrPnRhc2suU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3Moc3ViVGFzaywgZXZlbnRDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBjbGllbnRPcGVyYXRpb25FeGlzdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnModGFzayA6IFRhc2spOiBib29sZWFuXHJcbiAge1xyXG4gICAgbGV0IHBlbmRpbmdUcmFuc2FjdGlvbnMgPSBmYWxzZTtcclxuICAgIGxldCBjdXJyUmVjb3JkID0gICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpXHJcbiAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0cnVlO1xyXG5cclxuICAgIGlmICghcGVuZGluZ1RyYW5zYWN0aW9ucyAmJiB0YXNrLmhhc1N1YlRhc2tzKCkpXHJcbiAgICB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyAoIXBlbmRpbmdUcmFuc2FjdGlvbnMgJiYgaSA8IHRhc2suZ2V0U3ViVGFza3MoKS5nZXRTaXplKCkpOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgc3ViVGFzayA9IDxUYXNrPnRhc2suU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdGhpcy5DaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyhzdWJUYXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwZW5kaW5nVHJhbnNhY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25seURlc2NzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWNjZWVkZWRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSGFuZGxlVHJhbnNhY3Rpb25JbmZvKCk6IHZvaWQge1xyXG4gICAgLy8gd2hpbGUgcmVtb3RlIHRhc2sgd2l0aG91dCBsb2NhbCBkYXRhLCBoYXMgc3ViZm9ybSB0aGF0IGhhcyBsb2NhbCBkYXRhIDogUmVtb3RlIHRyYW5zYWN0aW9uIGlzIHNldCBvbiB0aGUgcGFyZW50IHRhc2sgYW5kIGxvY2FsIFRyYW5zYWN0aW9uIGlzIHNldCBvbiBzdWJmb3JtLlxyXG4gICAgLy8gVGhlIG1lbWJlciB0YXNrLlRyYW5zYWN0aW9uIGlzIGdldCB0aGUgRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb25cclxuICAgIC8vIGZvciBzdWJmb3JtIDogIHRoZSBDdXJyZW50RGF0YXZpZXdNYW5hZ2VyIGlzIHRoZSBsb2NhbERhdGF2aWV3IHNvIHRoZSB0cmFuc2FjdGlvbiBpcyB0aGUgbG9jYWwgdHJhbnNhY3Rpb24gdGhhdCB0aGUgc3ViZm9ybSBpcyB0aGUgb3duZXIgYnV0IG5vdCB0aGUgb3duZXIgb2YgdGhlIHJlbW90ZSB0cmFuc2FjdGlvblxyXG4gICAgLy8gVGhlIG1ldGhvZCBzZXRUcmFuc0NsZWFyZWQoKSBuZWVkIHRvIGJlIGNhbGxlZCBvbmx5IGZvciByZW1vdGUgdHJhbnNhY3Rpb24gdGhhdCBpcyB0aGUgb3duZXIgdGFzayAuIChfdHJhbnNDbGVhcmVkIGlzIHNlbmQgdG8gdGhlIHNlcnZlciApXHJcblxyXG4gICAgLy8gY2hlY2sgdGhlIHJlbW90ZSB0cmFuc2FjdGlvblxyXG4gICAgbGV0IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbjtcclxuICAgIGlmICh0cmFuc2FjdGlvbiAhPT0gbnVsbCAmJiB0cmFuc2FjdGlvbi5pc093bmVyKHRoaXMpICYmIHRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09ICdQJykge1xyXG4gICAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSBudWxsO1xyXG4gICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldFRyYW5zQ2xlYXJlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGV4aXQgY29tbWFuZCwgYWRkcyBpdCB0byBjb21tYW5kcyBmb3IgZXhlY3V0aW9uIGFuZCBleGVjdXRlIGl0IGlmIGl0J3MgbmVlZGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXZlcnNpYmxlRXhpdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybURlc3RpbmF0aW9uXCI+PC9wYXJhbT5cclxuICBhc3luYyBFeGl0KHJldmVyc2libGVFeGl0OiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb246IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHJlY29yZCBzdWZmaXggd2FzIHN1Y2Nlc3NmdWwgYW5kIHRoaXMgdGFzayBpcyBub3QgYSBzdWIgZm9ybVxyXG4gICAgLy8gdGhlbiBlbmQgdGhlIHRhc2sgYXQgdGhlIHNlcnZlciBzaWRlXHJcblxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSByZXZlcnNpYmxlRXhpdCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ2xpZW50Q29tbWFuZD5Db21tYW5kRmFjdG9yeS5DcmVhdGVCcm93c2VyRXNjRXZlbnRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtRGVzdGluYXRpb24pIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDbGllbnRDb21tYW5kPkNvbW1hbmRGYWN0b3J5LkNyZWF0ZU5vblJldmVyc2libGVFeGl0Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybURlc3RpbmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLl9tZ0RhdGEuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgaWYgKCFzdWJmb3JtRGVzdGluYXRpb24pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBCcm93ZXJFc2NDb21tYW5kIGltbWVkaWF0ZWx5IG9ubHkgaWZcclxuICAgICAgICAvLyAxLiBJZiB3ZSBhcmUgdHJ5aW5nIHRvIGNsb3NlIHRoZSBicm93c2VyIGFuZCB0aGUgdG9wbW9zdCB0YXNrIGlzIGNsb3NpbmdcclxuICAgICAgICAvLyAyLiBJZiB1c2VyIGV4cGxpY2l0bHkgY2xvc2VzIHRoZSBjdXJyZW50IHRhc2sgKGxpa2UgY2xvc2luZyBvdmVybGF5KVxyXG4gICAgICAgIC8vIEZvciBhbGwgb3RoZXIgRXhpdCgpIGNvbW1hbmRzLCBqdXN0IGFkZCB0aGUgQnJvd3NlckVzY0NvbW1hbmQgdG8gQ21kc1RvU2VydmVyLlxyXG4gICAgICAgIGlmKHRoaXMuZ2V0VGFza1RhZygpID09IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkgfHxcclxuICAgICAgICAgICAhKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5JbkVuZFRhc2sgJiYgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkNsb3NpbmdGb3JtVUkpKVxyXG4gICAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIGNsb3Npbmcgb2YgTWFpbiBQcm9ncmFtIGRpZG4ndCBzdWNjZWVkIG9uIHNlcnZlciwgY2xvc2UgaXQgaGVyZSAtLS0gb2Zjb3Vyc2UgaXRcclxuICAgICAgICAvLyBpbmNsdWRlcyB0aGUgZXhlY3V0aW9uIG9mIFRTIGFzIHdlbGwuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZ0RhdGEuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBmaW5hbGx5IG9wZXJhdGlvbiBvZiBlbmRUYXNrIGZ1bmN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1Y2NlZWRlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXZlcnNpYmxlRXhpdFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkOiBib29sZWFuLCByZXZlcnNpYmxlRXhpdDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgc3ViVGFzay5oYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQsIHJldmVyc2libGVFeGl0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuSW5FbmRUYXNrID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHN1Y2NlZWRlZClcclxuICAgICAgdGhpcy5faXNTdGFydGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCFzdWNjZWVkZWQgJiYgcmV2ZXJzaWJsZUV4aXQgJiYgdGhpcy5Jc1RyeWluZ1RvU3RvcClcclxuICAgICAgdGhpcy5zZXRUcnlpbmdUb1N0b3AoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJlY3Vyc2l2ZSBmdW5jdGlvbiBmb3IgVGFzayBQcmVmaXggZXhlY3V0aW9uIGZvciBhbGwgc3ViZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgaGFuZGxlVGFza1N1ZmZpeCh3aXRoU3ViVGFza3M6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcblxyXG4gICAgaWYgKHdpdGhTdWJUYXNrcykge1xyXG4gICAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpICYmIHN1Y2NlZWRlZDsgaSsrKSB7XHJcbiAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgc3VjY2VlZGVkID0gYXdhaXQgc3ViVGFzay5oYW5kbGVUYXNrU3VmZml4KHdpdGhTdWJUYXNrcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1Y2NlZWRlZClcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcbiAgICBzdWNjZWVkZWQgPSAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIHRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBpZiB0aGUgdGFzayBpbnRvIGNyZWF0ZSBsaW5lIHByb2Nlc3Npbmcgb3Igbm90XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJbkNyZWF0ZUxpbmUoaW5DcmVhdGVMaW5lOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbkNyZWF0ZUxpbmUgPSBpbkNyZWF0ZUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGlmIHRoZSB0YXNrIGlzIGludG8gQ3JlYXRlIGxpbmUgcHJvY2Vzc2luZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SW5DcmVhdGVMaW5lKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luQ3JlYXRlTGluZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIGFuIGludGVybmFsIGV2ZW50IG9uIHRoaXMgdGFza3Mgc2xhdmUgdGFza3MuIFNsYXZlIHRhc2tzIGFyZTogKDEpIElmIHRoaXMgdGFzayBpcyBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gICBvd25lciAtIGFsbCB0YXNrcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSB0cmFuc2FjdGlvbnMgYXJlIGl0cyBzbGF2ZXMuICgyKSBJZiB0aGlzIHRhc2sgaXMgbm90IGFuIG93bmVyIC1cclxuICAvLy8gICBhbGwgaXRzIHN1YmZvcm1zIGFyZSBjb25zaWRlcmVkIHNsYXZlcy4gaWYgb25lIG9mIHRoZSBzdWIgdGFza3MgZmFpbGVkIGhhbmRsaW5nIHRoZSBldmVudCB0aGVuIGFcclxuICAvLy8gICByZWZlcmVuY2UgdG8gdGhhdCB0YXNrIGlzIHJldHVybmVkIG90aGVyd2lzZSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgbnVsbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRlcm5hbEV2dENvZGVcIj50aGUgY29kZSBvZiB0aGUgaW50ZXJuYWwgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhpbnRlcm5hbEV2dENvZGU6IG51bWJlcik6IFByb21pc2U8VGFzaz4ge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBmYWlsdXJlVGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuICAgIGxldCB0cmlnZ2VyZWRUYXNrczogTGlzdDxUYXNrQmFzZT4gPSBtZ2RUYWIuZ2V0VHJpZ2dlcmVkVGFza3ModGhpcyk7XHJcbiAgICBsZXQgb3JwaGFuczogTGlzdDxUYXNrPiA9IG51bGw7XHJcbiAgICBsZXQgc2FtZVRyYW5zOiBib29sZWFuO1xyXG4gICAgbGV0IGhhc1NsYXZlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGlzT3duZXI6IGJvb2xlYW4gPSB0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5pc093bmVyKHRoaXMpO1xyXG5cclxuICAgIC8vIGV2ZW50IG9uIHRyYW5zLW93bmVyIHNob3VsZCBiZSBwcm9wb2dhdGVkIHRvIGFsbCBvdGhlciB0YXNrcyBpbiB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbi5cclxuICAgIGlmIChpc093bmVyKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldEV2ZW50U2NvcGVUcmFucygpO1xyXG4gICAgICBvcnBoYW5zID0gbmV3IExpc3Q8VGFzaz4oKTtcclxuXHJcbiAgICAgIC8vIEluIGNhc2UgYSBjaGFuZ2Ugb2YgdHJhbnMtb3duZXJzaGlwIHByZXZpb3VzbHkgdG9vayBwbGFjZSwgdGhlcmUgbWlnaHQgYmUgdGFza3NcclxuICAgICAgLy8gd2hpY2ggYmVsb25nIHRvIHRoZSBjdXJyZW50IGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gYnV0IHRoZWlyIHBhcmVudCBpcyBnb25lLiBUaGVzZSBhcmUgb3JwaGFuIHRhc2tzXHJcbiAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHByb3BvZ2F0ZSB0aGUgZXZlbnQgdG8gdGhlbSB0b28uXHJcbiAgICAgIG1nZFRhYi5zdGFydFRhc2tzSXRlcmF0aW9uKCk7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrPm1nZFRhYi5nZXROZXh0VGFzaygpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgc2FtZVRyYW5zID0gdGFzay5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0YXNrLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKTtcclxuICAgICAgICBpZiAodGFzayAhPT0gdGhpcyAmJiBzYW1lVHJhbnMgJiYgdGFzay5QcmV2aW91c2x5QWN0aXZlVGFza0lkICE9IG51bGwgJiYgbWdkVGFiLkdldFRhc2tCeUlEKHRhc2suUHJldmlvdXNseUFjdGl2ZVRhc2tJZCkgPT0gbnVsbClcclxuICAgICAgICAgIG9ycGhhbnMucHVzaCh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBzY29wZVRyYW5zOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaXNFdmVudFNjb3BlVHJhbnMoKTtcclxuXHJcbiAgICAvLyBQcm9wYWdhdGUgdGhlIGV2ZW50IGFjY29yZGluZyB0byB0aGUgc2NvcGUsIG9uIGFsbCB0YXNrcyB0cmlnZ2VyZWQgYnkgbWVcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlnZ2VyZWRUYXNrcy5sZW5ndGggJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7IGkrKykge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dHJpZ2dlcmVkVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHNhbWVUcmFucyA9IHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0YXNrLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRhc2suVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpO1xyXG5cclxuICAgICAgaWYgKCF0YXNrLklzU3ViRm9ybSAmJiAoc2NvcGVUcmFucyAmJiBzYW1lVHJhbnMpICYmIHRhc2suaXNTdGFydGVkKCkpIHtcclxuICAgICAgICAvLyBRQ1IgNDM4NTMwIEd1YXJhbnRlZSB0aGF0IGJlZm9yZSBwcmVmaXggY29tcHV0ZSB3aWxsIGJlIGV4ZWN1dGVkXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpLkZvcm1SZWZyZXNoZWQgJiYgaW50ZXJuYWxFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKGZhbHNlKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgaW50ZXJuYWxFdnRDb2RlKTtcclxuICAgICAgICBoYXNTbGF2ZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvcGFnYXRlIHRoZSBldmVudCBvbiBvcnBoYW5zIHRvby5cclxuICAgIGZvciAoOyBpc093bmVyICYmIGkgPCBvcnBoYW5zLmxlbmd0aCAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTsgaSsrKSB7XHJcbiAgICAgIHRhc2sgPSBvcnBoYW5zLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgLy8gUUNSIDQzODUzMCBHdWFyYW50ZWUgdGhhdCBiZWZvcmUgcHJlZml4IGNvbXB1dGUgd2lsbCBiZSBleGVjdXRlZFxyXG4gICAgICBpZiAodGFzay5nZXRGb3JtKCkuRm9ybVJlZnJlc2hlZCAmJiBpbnRlcm5hbEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKGZhbHNlKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIGludGVybmFsRXZ0Q29kZSk7XHJcbiAgICAgIGhhc1NsYXZlcyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc1NsYXZlcyAmJiBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBmYWlsdXJlVGFzayA9IHRhc2s7XHJcblxyXG4gICAgaWYgKGlzT3duZXIpXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmNsZWFyRXZlbnRTY29wZSgpO1xyXG5cclxuICAgIHJldHVybiBmYWlsdXJlVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBhIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW5hYmxlUmVjb3JkQWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkYXRhdmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5EYXRhVmlldztcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG5cclxuICAgIGlmIChkYXRhdmlldy5JbmNsdWRlc0ZpcnN0KCkgfHwgZGF0YXZpZXcuSXNPbmVXYXlLZXkpIHtcclxuICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8IGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LklzT25lV2F5S2V5KVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8IChkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgPT09IDApIHx8IChkYXRhdmlldy5nZXRUb3BSZWNJZHgoKSA9PT0gMCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuSW5jbHVkZXNMYXN0KCkpIHtcclxuICAgICAgaWYgKCgodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpIHx8IGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8XHJcbiAgICAgICAgICAoKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSkgJiZcclxuICAgICAgICAgICAgKCFFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd0NyZWF0ZUluTW9kaWZ5TW9kZSh0aGlzLmdldENvbXBJZHgoKSkgfHxcclxuICAgICAgICAgICAgICAhYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkpKSAmJiAoZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpICsgMSkgPT09IGRhdGF2aWV3LmdldFNpemUoKSkge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCB0cnVlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCAoKGRhdGF2aWV3LmdldFNpemUoKSAtIGRhdGF2aWV3LmdldFRvcFJlY0lkeCgpKSA8PSB0aGlzLkZvcm0uZ2V0Um93c0luUGFnZSgpKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIGZhbHNlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTlRFUl9ST1dfRURJVElORywgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9fUFJPR19FWEVfUklHSFRTLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaXMgc3RhcnRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzU3RhcnRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBzdWIgdGFza3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFN1YlRhc2tzKCk6IFRhc2tzVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuU3ViVGFza3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgdGFza3MgcmVmcmVzaGVzIG9uIGEgY2hhbmdlIG9mIG9uZSBvZiBpdHMgcGFyZW50IGZpZWxkcyB3aXRoIHRoZSBnaXZlbiBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZFwiPnRoZSBpZCBvZiB0aGUgcGFyZW50IGZpZWxkPC9wYXJhbT5cclxuICByZWZyZXNoZXNPbihmbGRJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgIXJlc3VsdCAmJiB0aGlzLlJlZnJlc2hPblZhcnMgIT09IG51bGwgJiYgaSA8IHRoaXMuUmVmcmVzaE9uVmFycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZXN1bHQgPSAodGhpcy5SZWZyZXNoT25WYXJzW2ldID09PSBmbGRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciB0aGlzIHRhc2sgZnJvbSB0aGUgYWN0aXZlIHRyYW5zYWN0aW9ucyBhY2NvdW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEFib3J0VHJhbnNhY3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB2YWx1ZSBvZiBwcmV2ZW50UmVjb3JkU3VmZml4IHRvIHZhbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50cnVlIGlmIHdlIGFscmVhZHkgcGVyZm9ybWVkIHJlY29yZCBzdWZmaXg8L3BhcmFtPlxyXG4gIHNldFByZXZlbnRSZWNvcmRTdWZmaXgodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ZW50UmVjb3JkU3VmZml4ID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB2YWx1ZSBvZiBwcmV2ZW50UmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGdldFByZXZlbnRSZWNvcmRTdWZmaXgoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldmVudFJlY29yZFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIHNldFByZXZlbnRDb250cm9sQ2hhbmdlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldmVudENvbnRyb2xDaGFuZ2UgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2ZW50Q29udHJvbENoYW5nZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzaWduYWwgdGhlIHNlcnZlciBjbG9zZWQgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldEtub3duVG9TZXJ2ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9rbm93blRvU2VydmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZHZQb3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiLVwiPmV2YWx1YXRlcyB0aGUgZGVyY3JpcHRvciBhbmQgcmV0dXJuIHRoZSBub24taGF2ZSBkdlBvcyB2YWx1ZTwvcGFyYW0+XHJcbiAgZXZhbHVhdGVEZXNjcmlwdG9yKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHJlczogTlVNX1RZUEU7XHJcbiAgICBpZiAodGhpcy5EdlBvc0Rlc2NyaXB0b3IgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIEhhc2hVdGlscy5HZXRIYXNoQ29kZShyZXN1bHQpO1xyXG5cclxuICAgIGxldCBmaXJzdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gZ28gb3ZlciB0aGUgbGlzdCBvZiB0aGUgZGVzY3JpcHRvclxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuRHZQb3NEZXNjcmlwdG9yLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghZmlyc3QpXHJcbiAgICAgICAgcmVzdWx0ICs9IFwiO1wiO1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRDZWxsOiBzdHJpbmdbXSA9IHRoaXMuRHZQb3NEZXNjcmlwdG9yLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgLy8gcGFyc2UgdGhlIGN1cnJlbnQgdGFzayBhbmQgZmllbGQgbnVtYmVyXHJcbiAgICAgIGxldCBjdXJyZW50VGFnOiBzdHJpbmcgPSBjdXJyZW50Q2VsbFswXTtcclxuICAgICAgbGV0IGN1cnJlbnRWZWVJZHg6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VycmVudENlbGxbMV0pO1xyXG4gICAgICBsZXQgY3VycmVudFRhc2sgPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0VGFza0J5SUQoY3VycmVudFRhZyk7XHJcbiAgICAgIGxldCBjdXJyZW50RmllbGQgPSA8RmllbGQ+Y3VycmVudFRhc2suRGF0YVZpZXcuZ2V0RmllbGQoY3VycmVudFZlZUlkeCk7XHJcbiAgICAgIGxldCBkaXNwVmFsOiBzdHJpbmcgPSBjdXJyZW50RmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcblxyXG4gICAgICAvLyBRQ1IgOTc4NTY2XHJcbiAgICAgIGlmIChjdXJyZW50RmllbGQuaXNOdWxsKCkpXHJcbiAgICAgICAgZGlzcFZhbCA9IFwiXCI7XHJcblxyXG4gICAgICAvLyBRQ1IgNzQzMjkwXHJcbiAgICAgIGxldCBwaWM6IFBJQztcclxuICAgICAgc3dpdGNoIChjdXJyZW50RmllbGQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgLy8gYm9vbGVhbiBpcyBzdG9yZWQgYXMgXCJvXCIgb3IgXCIxXCIgc28gd2UganVzdCBhZGQgdGhlbSBhcyB3ZVxyXG4gICAgICAgIC8vIGRvIGluIHRoZSBzZXJ2ZXJcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgcmVzdWx0ICs9IGRpc3BWYWw7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAvLyBRQ1IgNzQyOTY2IGRhdGUgYW5kIHRpbWUgc3BlY2lhbCB0cmVhdG1lbnRcclxuICAgICAgICAgIGlmIChkaXNwVmFsICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHBpYyA9IG5ldyBQSUMoY3VycmVudEZpZWxkLmdldFBpY3R1cmUoKSwgY3VycmVudEZpZWxkLmdldFR5cGUoKSwgMCk7XHJcbiAgICAgICAgICAgIGxldCBjb252OiBEaXNwbGF5Q29udmVydG9yID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IGNvbnYubWcyZGlzcChkaXNwVmFsLCBcIlwiLCBwaWMsIGZhbHNlLCB0aGlzLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgLy8gUUNSIDU0MzIwNCB3aGVuIHRoZXJlIGlzIGFuIGVtcHR5IHN0cmluZyAoYWxwaGEpYXBwZW5kIG5vdGhpbmdcclxuICAgICAgICAgIGlmIChkaXNwVmFsICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IG5ldyBOVU1fVFlQRShkaXNwVmFsKTtcclxuICAgICAgICAgICAgcGljID0gbmV3IFBJQyhjdXJyZW50RmllbGQuZ2V0UGljdHVyZSgpLCBjdXJyZW50RmllbGQuZ2V0VHlwZSgpLCAwKTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IHJlcy50b19hKHBpYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdG1wU3RyMjogc3RyaW5nID0gU3RyVXRpbC5zdHJpbmdUb0hleGFEdW1wKHJlc3VsdCwgNCk7XHJcblxyXG4gICAgcmV0dXJuIEhhc2hVdGlscy5HZXRIYXNoQ29kZSh0bXBTdHIyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZHMgdGhlIGR2UG9zIGRlc2NyaXB0b3IgdmVjdG9yIGVhY2ggb2YgdGhlIGR2UG9zRGVzY3JpcHRvciB2ZWN0b3IgZWxlbWVudHMgaXMgYSBTdHJpbmcgYXJyYXkgb2Ygc2l6ZVxyXG4gIC8vLyAgIDIgaW4gdGhlIGZpcnN0IGNlbGwgb2YgZWFjaCBhcnJheSB3ZSBoYXZlIHRoZSB0YWcgYW5kIGluIHRoZSBzZWNvbmQgd2UgaGF2ZSB0aGUgdmVlIGlpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGVzY3JpcHRvcihuZXdEZXNjOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghKG5ld0Rlc2MudHJpbSgpID09PSBcIlwiKSkge1xyXG4gICAgICBsZXQgZGVzYzogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKG5ld0Rlc2MsIFwiO1wiKTtcclxuICAgICAgdGhpcy5EdlBvc0Rlc2NyaXB0b3IgPSBuZXcgTGlzdDxzdHJpbmdbXT4oKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkZXNjLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGNlbGw6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMik7XHJcbiAgICAgICAgbGV0IHRhZ1ZlZVBhaXI6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShkZXNjW2ldLCBcIixcIik7XHJcbiAgICAgICAgY2VsbFswXSA9IHRhZ1ZlZVBhaXJbMF07XHJcbiAgICAgICAgY2VsbFsxXSA9IHRhZ1ZlZVBhaXJbMV07XHJcblxyXG4gICAgICAgIC8vIHB1dCB0aGUgY2VsbCB2YWx1ZSBpbnRvIHRoZSB2ZWN0b3JcclxuICAgICAgICB0aGlzLkR2UG9zRGVzY3JpcHRvci5wdXNoKGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2FjaGUgb2JqZWN0IG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFza0NhY2hlKCk6IER2Q2FjaGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R2Q2FjaGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJlcGFyZSBhbGwgc3ViLWZvcm0gdHJlZSdzIHRvIGVpdGhlciBnbyB0byBzZXJ2ZXIgKGFmdGVyIGRlbGV0aW5nIHJlbGV2YW50IGVudHJpZXMpIG9yIHRvIHRha2UgZC52IGZyb21cclxuICAvLy8gICBjYWNoZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIGFsbCBzdWJmb3JtIGNhbiBkbyBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgYmVjYXVzZSBvZiB1cGRhdGVzPC9yZXR1cm5zPlxyXG4gIGFzeW5jIHByZXBhcmVDYWNoZShpZ25vcmVDdXJyOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3VjY2VzczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gY2hlY2tpbmcgbXlzZWxmIGlmIGkgYW0gYSBzdWJmb3JtXHJcbiAgICBpZiAoIWlnbm9yZUN1cnIpIHtcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSkge1xyXG4gICAgICAgICAgLy8gaXMgdGhlIGN1cnJlbnQgdXBkYXRlIGRhdGF2aWV3IHdlcmUgcHJldmlvdXNseSB0YWtlbiBmcm9tIGNhY2hlXHJcbiAgICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gY2hlY2tzIHRoYXQgaSBhbSBhIHN1YiBmb3JtIGJ1dCBpIGFtIG5vdCBjYWNoZWRcclxuICAgICAgICBpZiAodGhpcy5Jc1N1YkZvcm0gJiYgISBhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgY3VycmV0VGFzazogVGFzaztcclxuXHJcbiAgICAvLyBjaGVjayBhbGwgbXkgc3ViIGZvcm1zXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIC8vIHRoaXMgbG9vcCBtdXN0IHJ1biB0byBpdHMgZW5kIHNvIGFsbCB1cGRhdGVkIGQudiB3aWxsIGJlIGRlbGV0ZWRcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBjdXJyZXRUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIC8vIGlmIG9uZSBvZiBteSBzdWItZm9ybXMgbmVlZHMgdG8gZ28gdG8gdGhlIHNlcnZlciAtIHNvIGRvIGlcclxuICAgICAgICBpZiAoISBhd2FpdCBjdXJyZXRUYXNrLnByZXBhcmVDYWNoZShmYWxzZSkpIHtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBpZiB3ZSBjYW4gdGFrZSB0aGUgZC52IG9mIHRoZSB0YXNrIGFuZCBhbGwgaGlzIHN1Yi1mb3JtcyBmcm9tIGNhY2hlIGlzIHdlIGNhbiAtIHRha2UgdGhlbSBhbmRcclxuICAvLy8gICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgY3VycmVudCBkLnYgb2YgZWFjaCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgYWxsIGQudidzIHdlcmUgZm91bmQgYW5kIHNldDwvcmV0dXJucz5cclxuICBhc3luYyB0ZXN0QW5kU2V0KGlnbm9yZUN1cnI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIGNoZWNrIGN1cnJlbnQgdGFza1xyXG4gICAgaWYgKCFpZ25vcmVDdXJyICYmIGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICBsZXQgcmVxdWVzdGVkRHY6IG51bWJlciA9IHRoaXMuZXZhbHVhdGVEZXNjcmlwdG9yKCk7XHJcblxyXG4gICAgICAvLyB0cnkgdG8gdGFrZSBmcm9tIGNhY2hlIG9ubHkgaWYgcmVxdWVzdGVkIGlzIG5vdCBjdXJyZW50XHJcbiAgICAgIGlmIChyZXF1ZXN0ZWREdiAhPT0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCkpIHtcclxuICAgICAgICBsZXQgZnJvbUNhY2hlOiBEYXRhVmlldyA9IHRoaXMuX2R2Q2FjaGUuZ2V0Q2FjaGVkRGF0YVZpZXcocmVxdWVzdGVkRHYpO1xyXG4gICAgICAgIGlmIChmcm9tQ2FjaGUgPT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUR2KGZyb21DYWNoZSk7ICAgICAvLyBjaGFuZ2VzIHRoZSBjdXJyZW50IGQudiB3aXRoIHRoZSBvbmUgdGFrZW4gZnJvbSBjYWNoZSBkbyBub3QgZm9yZ2V0IHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIGNhY2hlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFFDUiAjNDMwMDQ1LiBJbmRpY2F0ZSB0aGF0IFJQIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZ2V0IGZyb20gdGhlIGNhY2hlLlxyXG4gICAgICB0aGlzLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIHN1Yi1mb3JtcyB0YXNrc2RcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgLy8gdGhpcyBsb29wIGRvZXMgbm90IG5lZWQgdG8gcmVhY2ggaXRzIGVuZFxyXG4gICAgICAvLyB0aGUgbW9tZW50IG9uZSB0aGF0IG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBpcyBkaXNjb3ZlcmVkIGFsbCBuZWVkIHRvIGdvIGFsc29cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICAvLyBkb2VzIHRoZSBpLXRoIHNvbiBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKS50ZXN0QW5kU2V0KGZhbHNlKSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgZC52IHdpdGggb25lIHRha2VuIGZyb20gY2FjaGUgaW4gdGhpcyBtZXRob2Qgd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdXBkYXRlc1xyXG4gIC8vLyAgIG9mIHRoZSBjdXJyZW50IGRhdGF2aWV3IHNpbmNlIHRoZSBtZXRob2QgaXMgb25seSBjYWxsZWQgZnJvbSB0ZXN0QW5kU2V0IHRoYXQgaW4gdHVybiBpcyBvbmx5IHVzZWQgYWZ0ZXJcclxuICAvLy8gICBhIFN1Y2Nlc3NmdWwgcnVuIHByYXByZUNhY2hlIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBmb3IgdXBkYXRlcyBpbiB0aGUgY3VycmVudCBkYXRhdmlldyBvZlxyXG4gIC8vLyAgIGVhY2ggcmVsYXRlZCB0YXNrLiBob3dldmVyIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgd2UgY2hlY2sgaXQgYW55d2F5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZyb21DYWNoZVwiPnRoZSBuZXcgZC52PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNoYW5nZUR2KGZyb21DYWNoZTogRGF0YVZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkYXRhdmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5EYXRhVmlldztcclxuICAgIC8vIHRoZSBkYXRhIHZpZXcgd2UgcmVjZWl2ZSBpcyBDZXJ0YWlubHkgZnJvbSB0aGUgY2FjaGVcclxuXHJcbiAgICBpZiAoIXRoaXMuaGFzTG9jYXRlKSB7XHJcbiAgICAgIGlmICghZGF0YXZpZXcuZ2V0Q2hhbmdlZCgpICYmIGRhdGF2aWV3LkluY2x1ZGVzRmlyc3QoKSlcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoZGF0YXZpZXcucmVwbGljYXRlKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxvY2F0ZVB1dEluQ2FjaGUoKTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIGRhdGEgdmlldyBmcm9tIHRoZSBjYWNoZSBhcyB0aGUgY3VycmVudFxyXG4gICAgYXdhaXQgZGF0YXZpZXcuc2V0U2FtZUFzKGZyb21DYWNoZSk7XHJcbiAgICBkYXRhdmlldy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcblxyXG4gICAgdGhpcy5Gb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuXHJcbiAgICBhd2FpdCAoPE1nRm9ybT50aGlzLkZvcm0pLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcblxyXG4gICAgLy8gUUNSIDkyNDgwOTRcclxuICAgIHRoaXMuc2V0T3JpZ2luYWxUYXNrTW9kZSh0aGlzLmdldE1vZGUoKSk7XHJcbiAgfVxyXG5cclxuICBzZXRPcmlnaW5hbFRhc2tNb2RlKG9yaWdpbmFsVGFza01vZGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JpZ2luYWxUYXNrTW9kZSA9IG9yaWdpbmFsVGFza01vZGUuY2hhckF0KDApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgbW9kZSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRPcmlnaW5hbFRhc2tNb2RlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxUYXNrTW9kZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpcyBDYWNoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgc3ViIGZvcm0gY29udHJvbCB0aGlzIHRhc2sgQ29ycmVsYXRlcyB3aXRoIHRoaXMgbWV0aG9kXHJcbiAgLy8vICAgYWN0dWFsbHkgY29tYmluZXMgdHdvIHRlc3QgZmlyc3QgdGhhdCB0aGUgdGFzayBpcyBhIHN1YiBmb3JtIHNlY29uZCB0aGF0IHRoZSBzdWIgdGhhdCB0aGUgc3ViIGZvcm0gaGFzXHJcbiAgLy8vICAgdGhlIGlzIGNhY2hlZCBwcm9wZXJ0eSBzZXQgdG8geWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpc0NhY2hlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLklzU3ViRm9ybSAmJiBhd2FpdCAoPE1nQ29udHJvbEJhc2U+dGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCkpLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19DQUNIRUQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkb2VzIHRoZSBpbnNlcnQgaW4gY2FjaGUgbG9naWMgaW4gY2FzZSB0aGUgdGFzayBoYXMgbG9jYXRlIGV4cHJlc3Npb25zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGxvY2F0ZVB1dEluQ2FjaGUoKTogdm9pZCB7XHJcbiAgICBsZXQgY2FjaGVkOiBEYXRhVmlldyA9IHRoaXMuX2R2Q2FjaGUuZ2V0Q2FjaGVkRGF0YVZpZXcoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCkpO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgZGF0YSB2aWV3IGhhcyBiZWVuIGluc2VydGVkIHRvIHRoZSBjYWNoZSBiZWZvcmVcclxuICAgIGlmIChjYWNoZWQgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5jaGVja0ZpcnN0KGNhY2hlZC5nZXRMb2NhdGVGaXJzdFJlYygpKSAmJiAhKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpIHtcclxuICAgICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldExvY2F0ZUZpcnN0UmVjKGNhY2hlZC5nZXRMb2NhdGVGaXJzdFJlYygpKTtcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gcHV0IGl0IGluIHRoZSBjYWNoZSBpZiBpdCBpcyBub3QgdXBkYXRlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGhhc0xvY2F0ZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYXNMb2FjdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNMb2NhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgb3BlbnMgYSBuZXcgVHJhbnNhY3Rpb24gb3Igc2V0IHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgVHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0UmVtb3RlVHJhbnNhY3Rpb24odHJhbnNJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuICAgIGxldCB0cmFuc1Rhc2s6IFRhc2s7XHJcbiAgICBsZXQgaXNGaW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgbWdkVGFiLnN0YXJ0VGFza3NJdGVyYXRpb24oKTtcclxuICAgIHdoaWxlICgodHJhbnNUYXNrID0gPFRhc2s+bWdkVGFiLmdldE5leHRUYXNrKCkpICE9IG51bGwpIHtcclxuICAgICAgLy8gdHJhbnNhY3Rpb24gbWlnaHQgYmUgbnVsbCB3aGVuIHRhc2sgaXMgYWJvcnRpbmcgYnV0IG5vdCB5ZXQgdW5sb2FkZWQuXHJcbiAgICAgIGlmICh0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiAhPSBudWxsICYmXHJcbiAgICAgICAgdHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0cmFuc0lkKSB7XHJcbiAgICAgICAgaXNGaW5kID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IChpc0ZpbmQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24odGhpcywgdHJhbnNJZCwgZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBuZXcgVHJhbnNhY3Rpb24gT3duZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFRyYW5zT3duZXJUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRPd25lclRhc2sodGhpcyk7XHJcbiAgICB0aGlzLlRyYW5zYWN0aW9uLnNldFRyYW5zQmVnaW4oJ1QnKS8qJ1QnKi87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBhY2NvcmRpbmcgdG8gdGhlIHRvcG1vc3QgdmFsdWUgaW4gdGhlIHN0YWNrIGFuZCB0aGUgc3RhdHVzIG9mIHRoZVxyXG4gIC8vLyAgIFwidXNlTG9vcFN0YWNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5fdXNlTG9vcFN0YWNrICYmIHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSkge1xyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wZWVrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyB0aGUgdmFsdWUgMCBvbiB0aGUgdG9wIG9mIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbnRlckxvb3AoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9sb29wU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB0b3Btb3N0IGVudHJ5IGZyb20gdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGxlYXZlTG9vcCgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9wTG9vcENvdW50ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBjb3VudGVyIGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm5zIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwb3BMb29wQ291bnRlcigpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsICYmICEodGhpcy5fbG9vcFN0YWNrLmNvdW50KCkgPT09IDApKVxyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wb3AoKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluY3JlYXNlcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5jcmVhc2VMb29wQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvb3BTdGFjay5wdXNoKHRoaXMucG9wTG9vcENvdW50ZXIoKSArIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMb29wU3RhY2tTaXplKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5fbG9vcFN0YWNrLmNvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJ1c2UgbG9vcCBzdGFja1wiIHZhcmlhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgdG8gc2V0PC9wYXJhbT5cclxuICBzZXRVc2VMb29wU3RhY2sodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl91c2VMb29wU3RhY2sgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsaW5rcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGF0YXZpZXdIZWFkZXJzKCk6IERhdGF2aWV3SGVhZGVycyB7XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhdmlld0hlYWRlcnNUYWJsZTtcclxuICB9XHJcblxyXG4gIGlzRmlyc3RSZWNvcmRDeWNsZShWYWx1ZV8/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzRmlyc3RSZWNvcmRDeWNsZV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlY29yZEN5Y2xlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpcnN0UmVjb3JkQ3ljbGUgPSBWYWx1ZV87XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIGludGVybmFsIG5hbWU8L3N1bW1hcnk+XHJcbiAgZ2V0UHVibGljTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuUHVibGljTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgQWxsb3dFdmVudHM8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNBbGxvd0V2ZW50cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTKTtcclxuICAgIHJldHVybiBhd2FpdCBwcm9wLmdldFZhbHVlQm9vbGVhbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSB0YXNrIGlkPC9zdW1tYXJ5PlxyXG4gIGdldEV4dGVybmFsVGFza0lkKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGFza0lkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfSUQpO1xyXG5cclxuICAgIGlmIChwcm9wICE9IG51bGwpXHJcbiAgICAgIHRhc2tJZCA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG5cclxuICAgIHJldHVybiB0YXNrSWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiB0aGlzIHRhc2sgb3ducyBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVHJhbnNhY3Rpb25Pd25lcigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RyYW5zT3duZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKSlcclxuICAgICAgaXNUcmFuc093bmVyID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gaXNUcmFuc093bmVyO1xyXG4gIH1cclxuXHJcbiAgaXNUcmFuc2FjdGlvbk9uTGV2ZWwobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2FjdGlvbk93bmVyKCkgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgd2hldGhlciB0aGUgdGFzayBpcyB0aGUgUHJvZ3JhbSAoaS5lLiBub3QgYSBzdWJ0YXNrKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNQcm9ncmFtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzUHJnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIHRhc2sgbW9kZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVuYWJsZU1vZGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGVuYWJsZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTU9ESUZZLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUkFOR0UsIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19MT0NBVEUsIGVuYWJsZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNILCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU09SVF9SRUNPUkRTLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WSUVXX0JZX0tFWSwgZW5hYmxlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgaGFzWm9vbUhhbmRsZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbmFibGVab29tSGFuZGxlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgaGFzWm9vbUhhbmRsZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldEVuYWJsZVpvb21IYW5kbGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZVpvb21IYW5kbGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBpc0Rlc3RpbmF0aW9uU3ViZm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGZvciBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzdGluYXRpb25TdWJmb3JtXCI+PC9wYXJhbT5cclxuICBzZXREZXN0aW5hdGlvblN1YmZvcm0oZGVzdGluYXRpb25TdWJmb3JtOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0gPSBkZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IGlzIHRoZSB0YXNrIGlzIGEgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrPC9yZXR1cm5zPlxyXG4gIGdldElzRGVzdGluYXRpb25DYWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzRGVzdGluYXRpb25DYWxsXCI+PC9wYXJhbT5cclxuICBzZXRJc0Rlc3RpbmF0aW9uQ2FsbChpc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faXNEZXN0aW5hdGlvbkNhbGwgPSBpc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHNldENhbmNlbFdhc1JhaXNlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhbmNlbFdhc1JhaXNlZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGNhbmNlbFdhc1JhaXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW5jZWxXYXNSYWlzZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVDcmVhdGVBY3RzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSwgdmFsKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFLCAgKHRoaXMuZ2V0Rm9ybSgpLkhhc1RhYmxlKCkgKSA/IHZhbCA6IGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIGVuYWJsZS9kaXNhYmxlIHN0YXR1cyBvZiBjcmVhdGUgYW5kIGRlbGV0ZSBhY3Rpb25zXHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGFzeW5jIHNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKHRoaXMuRGF0YVZpZXcpLmlzRW1wdHlEYXRhdmlldygpICYmIGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURSwgdHJ1ZSkgJiZcclxuICAgICAgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZICYmICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxMSU5FLCB0cnVlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICgoYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkgJiZcclxuICAgICAgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlICYmXHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiBFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd0NyZWF0ZUluTW9kaWZ5TW9kZSh0aGlzLmdldENvbXBJZHgoKSkpIHx8XHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpKVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHModHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVtcHR5RGF0YXZpZXdcIj50aGUgZW1wdHlEYXRhdmlldyB0byBzZXQgPC9wYXJhbT5cclxuICBzZXRFbXB0eURhdGF2aWV3KGVtcHR5RGF0YXZpZXc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgc3RhcnRzIGl0cyBleGVjdXRpb24gaW4gRW1wdHkgRGF0YXZpZXcgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW1wdHlEYXRhdmlld09wZW4oc3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG4gICAgICAvLyBpZiB0aGUgdGFzayBpcyBhIHN1YmZvcm0gYW5kIHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLCBzbyBleGVjdXRlIHRoZSBlbXB0eSBkYXRhdHZpZXcgaGFuZGxlcixcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgbm90IGEgc3ViZm9ybSwgcHV0IHRoZSBlbXB0eSBkYXRhdmlldyBldmVudCBvbiB0aGUgcXVldWVcclxuICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IHJ0RXZudCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgaWYgKChydEV2bnQgIT0gbnVsbCAmJiBydEV2bnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVykgfHwgc3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRoaXMpO1xyXG4gICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuICAgICAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEl0YXNrQW5kQ29kZSh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcpO1xyXG5cclxuICAgICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgLy8gZm9yIHN1YmZvcm0gbW9kZSAnQXNQYXJlbnQnLiBJZiB0aGUgcGFyZW50IHRhc2sgdGhhdCBpbiAnRW1wdHkgRGF0YXZpZXcnIHN0YXRlIGNoYW5nZXMgaXRzIG1vZGVcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gYWxzbyBtdXN0IGNoYW5nZSBtb2RlLlxyXG4gICAgICAvLyBRQ1IgIzI4MTg2Mi4gSWYgdGhlIHN1YmZvcm0gdGFzayBpcyBvcGVuZWQgaW4gdGhlIGZpcnN0IHRpbWUgZG8gbm90IHJlZnJlc2ggaXQncyBzdWJmb3JtcyxcclxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3ZlIHJlY2VpdmVkIHRoZWlyIGRhdGF2aWV3cyBhbHJlYWR5LlxyXG4gICAgICAvLyBXZSBtdXN0IHJlZnJlc2ggdGhlbSB3aGVuIHRoZSBzdWJmb3JtIHRhc2sgcGFzc2VzIHRvIGVtcHR5IERWLlxyXG4gICAgICBpZiAodGhpcy5TdWJmb3JtRXhlY01vZGUgIT09IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FICYmIHN1YmZvcm1SZWZyZXNoICYmIGF3YWl0IHRoaXMuQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuY29tcHV0ZVN1YkZvcm1zKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5lbmFibGVSZWNvcmRBY3Rpb25zKCk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgZW5kcyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGVtcHR5RGF0YXZpZXdDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1UYXNrXCI+PC9wYXJhbT5cclxuICBhc3luYyBTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzazogVGFza0Jhc2UsIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgIGxldCBpc0luc2lkZTogYm9vbGVhbiA9IGF3YWl0ICg8VGFzaz5zdWJmb3JtVGFzaykuRXhlY3V0ZU5lc3RlZFJTKGN1cnJUYXNrKTtcclxuXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiAjNDM0NDY3LiBFeGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHN1YmZvcm0gaWYgaXQncyB0aGUgY3VycmVudCAobGFzdCBmb2N1c2VkKSB0YXNrLlxyXG4gICAgaWYgKHN1YmZvcm1UYXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCB0cnVlKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0luc2lkZSA9IHRydWU7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgNzc0ODMuIERvIG5vdCBjb250aW51ZSBpZiB0aGUgcmVjb3JkIHN1ZmZpeCBleGVjdXRpb24gaXMgZmFpbGVkLlxyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGNvbW1hbmQgZm9yIHRoZSBzZXJ2ZXJcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU3ViZm9ybVJlZnJlc2hDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCksIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIGlmIChzdWJmb3JtVGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAvLyBRQ1IgIzQyOTExMi4gUHVzaCBleGVjdXRpb24gc3RhY2sgYmVmb3JlIFJQIGV4ZWN1dGlvbi5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIC8vIERlZmVjdCAjNzcwNDkuIERvIG5vdCBleGVjdXRlIHBhcmVudCBSUC4gV2UgbmVlZCBpdCBvbmx5IHdoZW4gY2xpY2sgb24gc3ViZm9ybXdhcyBkb25lLlxyXG4gICAgICBsZXQgcGVyZm9ybVBhcmVudFJlY29yZFByZWZpeE9yZzogYm9vbGVhbiA9ICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDtcclxuICAgICAgKDxUYXNrPnN1YmZvcm1UYXNrKS5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgdHJ1ZSk7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIFN1YmZvcm1SZWZyZXNoIGV2ZW50IHRvIGl0c2VsZiBzbyB0aGUgY3Vyc29yIG11c3QgYmUgb24gdGhlIGZpcnN0IGNvbnRyb2wgb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAvLyBhcyBmb3IgVmlld1JlZnJlc2ggZXZlbnQuXHJcbiAgICBpZiAoaXNJbnNpZGUpIHtcclxuICAgICAgLy8gRGVmZWN0IDExNTc5My4gY3VyclRhc2sgY2FuJ3QgYmUgbnVsbC5cclxuICAgICAgLy8gaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICFzdWJmb3JtVGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpICYmIGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgIC8vICAgY3VyclRhc2subW92ZVRvRmlyc3RDdHJsKGZhbHNlKTtcclxuICAgICAgLy8gVE9ETzogVGFiYmluZyAmIEZvY3VzaW5nOiBIYW5kbGUgdGhpcyBzaXR1YXRpb25cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAoY3VyclRhc2sgIT0gbnVsbClcclxuICAgICAgICAgICAgKDxEYXRhVmlldz5jdXJyVGFzay5EYXRhVmlldykuc2V0UHJldkN1cnJSZWMoKTtcclxuICAgICAgICAgIHN1YmZvcm1UYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlcyBSZWNvcmQgU3VmZml4ZXMgb2YgYWxsIG5lc3RlZCBzdWJmb3JtcyBmcm9tIGJvdHRvbSB0byB0b3AuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRXhlY3V0ZU5lc3RlZFJTKGxhc3RUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaXNFeGVjdXRlTmVzdGVkUlM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBRQ1IgIzE2ODM0Mi4gQSBuZXcgdGFzayBpcyBzZXQgYXMgZm9jdXNlZCB0YXNrIGFmdGVyIHRoZSBmaXJzdCBDUC5cclxuICAgIC8vIFNvIGlmIGluIENQIFVwZGF0ZSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgY3VyclRhc2sgaXMgbnVsbC4gQnV0IHdlIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybS5cclxuICAgIGlmIChsYXN0VGFzayA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgLy8gRG8gbm90IGV4ZWN1dGUgc3ViZm9ybSByZWZyZXNoIHdoZW4gdGhlIGZvY3VzZWQgdGFzayBpcyBub3Qgb3BlbmVkIGFzIGEgc3ViZm9ybSAoaXQgd2FzIG9wZW5lZCBmcm9tIGNhbGwgb3BlcmF0aW9uKSxcclxuICAgIC8vIGJ1dCB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHN1YmZvcm0gdGFzay4gU2VlIGZvciBleGFtcGxlIFFDUiAjNDMxODUwLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyAmJiBsYXN0VGFzay5nZXRNZ2RJRCgpICE9PSB0aGlzLmdldE1nZElEKCkpXHJcbiAgICAgIHJldHVybiBpc0V4ZWN1dGVOZXN0ZWRSUztcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBUYXNrID0gbGFzdFRhc2s7IHRhc2sgIT09IHRoaXMgJiYgdGFzay5wYXRoQ29udGFpbnModGhpcykgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLOyB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlzRXhlY3V0ZU5lc3RlZFJTID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgUmVjIHN1ZmZpeCBmb3IgYWxsIG5lc3RlZCBzdWJmb3JtcyB1bnRpbGwgc3ViZm9ybSB0YXNrIHRoYXQgY29udGFpbnMgdGhlc2UgMiBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV4ZWNTdWJmb3JtUmVjU3VmZml4KG5ld1Rhc2s6IFRhc2spOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHN1YmZUYXNrOiBUYXNrO1xyXG4gICAgbGV0IGk6IG51bWJlciwgaWR4ID0gMDtcclxuICAgIGZvciAoaSA9IHRoaXMuX3Rhc2tQYXRoLmxlbmd0aDsgaSA+IDA7IGktLSkge1xyXG4gICAgICBzdWJmVGFzayA9IHRoaXMuX3Rhc2tQYXRoLmdldF9JdGVtKGkgLSAxKTtcclxuICAgICAgaWYgKCFuZXdUYXNrLl90YXNrUGF0aC5Db250YWlucyhzdWJmVGFzaykpIHtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBDaGFuZ2UgdGhlIENyZWF0ZSBtb2RlIHRvIE1vZGlmeSBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgbm90IGEgbmV3IHJlY29yZC5cclxuICAgICAgICAvLyBTbyB0aGUgbW9kZSBpcyBjaGFuZ2VkIG9ubHkgZm9yIHRoZSBmaXJzdCByZWNvcmQgdGhhdCB3YXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgaWYgKHN1YmZUYXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgISgoPERhdGFWaWV3PnN1YmZUYXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLmlzTmV3UmVjKCkpXHJcbiAgICAgICAgICBzdWJmVGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZHggPSBuZXdUYXNrLl90YXNrUGF0aC5pbmRleE9mKHN1YmZUYXNrKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgRGVidWcuQXNzZXJ0KGkgPiAwKTtcclxuICAgIHJldHVybiBpZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjb3VudGVyIG9mIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+Y291bnRlcjwvcmV0dXJucz5cclxuICBnZXRDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZSB0aGUgdGFza3MgY291bnRlciBieSAxLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgaW5jcmVhc2VDb3VudGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IHRoaXMuX2NvdW50ZXIgKyAxO1xyXG4gIH1cclxuXHJcbiAgc2V0Q291bnRlcihjbnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IGNudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICAhIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPT09IFRhc2suU3RhcnRQcm9nTGV2ZWw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENoZWNrIGlmIHJlZmVyZW5jZSB0byBtYWluIHByb2dyYW0gZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRTdHJcIj5hIHJlZmVyZW5jZSB0byB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzTWFpblByb2dyYW1GaWVsZChmaWVsZFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgRmllbGQ6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoZmllbGRTdHIsICcsJyk7XHJcbiAgICBsZXQgbWFpblByb2dGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChGaWVsZC5sZW5ndGggPT09IDIpIHtcclxuICAgICAgbGV0IHBhcmVudDogbnVtYmVyID0gTk51bWJlci5QYXJzZShGaWVsZC5nZXRfSXRlbSgwKSk7XHJcbiAgICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRClcclxuICAgICAgICBtYWluUHJvZ0ZpZWxkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpblByb2dGaWVsZDtcclxuICB9XHJcblxyXG4gIGdldFRhc2tJbmZvKCk6IHN0cmluZyB7XHJcbiAgICAvLyBHZXQgdGhlIHRhc2sgbmFtZSB1c2luZyB0aGUgZ2V0UHJvcCgpIGFzIG5hbWUgaXMgb25seSBzZXJpYWxpemVkIGZvciBkZWJ1Z1xyXG4gICAgbGV0IHRhc2tOYW1lOiBzdHJpbmcgPSAodGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoJ3swfSB7MX0nLHRoaXMuaXNQcm9ncmFtKCkgPyAnUHJvZ3JhbSc6ICdTdWJ0YXNrJywgdGFza05hbWUpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIih0YXNrIHswfS1cXFwiezF9XFxcInsyfSlcIiwgdGhpcy5fdGFza1RhZywgdGhpcy5OYW1lLCBzdXBlci5pc01haW5Qcm9nKCkgPyAoXCIgY3RsIFwiICsgdGhpcy5fY3RsSWR4KSA6IFwiXCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ29uc3RydWN0TWdGb3JtKGFscmVhZHlTZXRQYXJlbnRGb3JtOiBSZWZQYXJhbTxib29sZWFuPik6IE1nRm9ybUJhc2Uge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IG5ldyBNZ0Zvcm0oKTtcclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuUGFyZW50VGFzayAhPSBudWxsID8gdGhpcy5QYXJlbnRUYXNrLmdldEZvcm0oKSA6IG51bGwpO1xyXG5cclxuICAgIC8vIFBhcmVudEZvcm0gb2YgYW55IGZvcm0gc2hvdWxkIGJlIGEgdmlzaWJsZSBvbmUuIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSBQYXJlbnRUYXNrXHJcbiAgICAvLyBpcyBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIHdpdGggT3BlbldpbmRvdz1Oby4gSW4gdGhpcyBjYXNlLCB0aGUgUGFyZW50IG9mIHRoZSBub24taW50ZXJhY3RpdmVcclxuICAgIC8vIHRhc2ssIHNob3VsZCBiZSB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IGZvcm0uXHJcbiAgICB3aGlsZSAocGFyZW50Rm9ybSAhPSBudWxsICYmICFwYXJlbnRGb3JtLmdldFRhc2soKS5pc09wZW5XaW4oKSkge1xyXG4gICAgICBwYXJlbnRGb3JtID0gcGFyZW50Rm9ybS5QYXJlbnRGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm0uUGFyZW50Rm9ybSA9IHBhcmVudEZvcm07XHJcbiAgICBhbHJlYWR5U2V0UGFyZW50Rm9ybS52YWx1ZSA9IHRydWU7XHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBtZ2RhdGEgSUQgdG8gd2hpY2ggdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNZ2RJRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YS5HZXRJZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCByZWZlcmVuY2UgdG8gY3VycmVudCBNR0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1HRGF0YSgpOiBNR0RhdGEge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmVmcmVzaCB0aGUgZGlzcGxheSwgcGFpbnQgdGhlIGNvbnRyb2xzIGFuZCB0aGVpciBwcm9wZXJ0aWVzIGFnYWluIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmIHRoaXMuaXNTdGFydGVkKCkpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJTdGFydCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcblxyXG4gICAgICAvLyByZWNvcmRzIGZyb20gdGhlIERhdGFWaWV3IGFuZCByZWZyZXNoZXMgdGhlIHJvd3MuXHJcbiAgICAgIC8vIE5vdywgVGFzay5SZWZyZXNoRGlzcGxheSgpIGlzIGNhbGxlZCBmcm9tIDIgcGxhY2VzOlxyXG4gICAgICAvLyAxLiB3aGlsZSBpbml0aW5nIHRoZSBmb3JtXHJcbiAgICAgIC8vIDIuIHdoZW4gY29taW5nIGJhY2sgZnJvbSBzZXJ2ZXJcclxuICAgICAgLy8gSW4gY2FzZSAjMSwgd2UgZG8gbm90IG5lZWQgdG8gcmVmcmVzaCB0aGUgdGFibGUgYXMgaXQgaXMgZG9uZSBmcm9tIGZpcnN0VGFibGVSZWZyZXNoKCkuXHJcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2FuIGJlIGVsaW1pbmF0ZWQuXHJcbiAgICAgIGlmICh0aGlzLl9yZWZyZXNoVHlwZSAhPT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FKSB7XHJcbiAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5Gb3JtO1xyXG4gICAgICAgIGxldCB3YXNSZWZyZXNoZWQ6IGJvb2xlYW4gPSBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgaWYgKHdhc1JlZnJlc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5fcmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIHRhc2suUmVmcmVzaERpc3BsYXkoKVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vIFRPRE8gc2FkaGFuIHJlbW92ZSB1bnVzZWRcclxuICAvLyBhc3luYyBnZXRGaWVsZFZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIHZhbHVlLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gIC8vICAgaXNOdWxsLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgZGlzcGxheSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIGdldEZpZWxkRGlzcGxheVZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiB2b2lkIHtcclxuICAgIHZhbHVlLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICBpc051bGwudmFsdWUgPSAoPEZpZWxkPmZpZWxkRGVmKS5pc051bGwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdXBkYXRlcyB0aGUgZmllbGQncyB2YWx1ZSBhbmQgc3RhcnRzIHJlY29tcHV0ZS4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBhc3luYyBVcGRhdGVGaWVsZFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCkge1xyXG4gICAgICBhd2FpdCAoPEZpZWxkPmZpZWxkRGVmKS5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbHVlLCBpc051bGwsIHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBhIHJpY2hjbGllbnQgdGFza3MsIGNoZWNrIGlmIE5vbi1JbnRlcmFjdGl2ZSB0YXNrIGNoaWxkIHNob3VsZCBiZSBNb2RhbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlPC9yZXR1cm5zPlxyXG4gIFNob3VsZE5vbkludGVyYWN0aXZlQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuU2hvdWxkQ2hpbGRCZU1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIGEgdGFza3MgY2hpbGQgc2hvdWxkIGJlIG1vZGFsXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHdpbmRvdyBpcyBvcGVuZWQgYW5kIG9mIG1vZGFsIHR5cGUgKGRvZXNuJ3QgbWF0dGVyIGlmIGludGVyYWN0aXZlIG9yIG5vdClcclxuICAgIGlmICgodGhpcy5Gb3JtLkNvbmNyZXRlV2luZG93VHlwZSA9PT0gV2luZG93VHlwZS5PdmVybGF5KSAmJiB0aGlzLmdldEZvcm0oKS5PcGVuZWQpXHJcbiAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBwYXJlbnQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBhcmVudCgpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyB0YXNrIGlzIHRoZSBjaGVja2VkIHRhc2sgb3IgYSBkZXNjZW5kYW50IG9mIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0Rlc2NlbmRlbnRPZihjaGtUYXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNoa1Rhc2sgPT09IHRoaXMpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgZWxzZSBpZiAoY2hrVGFzayA9PT0gbnVsbCB8fCB0aGlzLl9wYXJlbnRUYXNrID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2suaXNEZXNjZW5kZW50T2YoY2hrVGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBzdWJmb3JtQ3RybCB3aGljaCBpcyBNb2RhbCBpbiBjdXJyZW50IHJ1bnRpbWUgdHJlZSBpZiB0aGVyZSBpcyBhbnk/LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEdldFN1YmZvcm1Nb2RhbFBhcmVudFRhc2soKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRoaXM7XHJcbiAgICB3aGlsZSAoY3VyclRhc2suX3BhcmVudFRhc2sgIT0gbnVsbCAmJiBjdXJyVGFzay5fcGFyZW50VGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKSB7XHJcbiAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD4oY3VyclRhc2suX3BhcmVudFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkpO1xyXG4gICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0dXJuIHN1YmZvcm1DdHJsO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJUYXNrID0gY3VyclRhc2suX3BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGZvciByZW1vdGUgdGFzayBmb3IgZXhwcmVzc2lvbiB0aGF0IHdhcyBjb21wdXRlZCBvbmNlIG9uIHNlcnZlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuVGFza1NlcnZpY2UuU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2QgcnVucyBhY3Rpb25zIGFmdGVyIHRoZSAnZm9ybScgdGFnIGlzIGhhbmRsZWQuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBFbnN1cmVWYWxpZEZvcm0oKTogdm9pZCB7XHJcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2Q6XHJcbiAgICAvLyBJZiB0aGlzIHRhc2sgaXMgdGhlIG1haW4gcHJvZ3JhbSBhbmQgX29wZW5XaW4gZXZhbHVhdGVzIHRvICdmYWxzZScsIHRoZW5cclxuICAgIC8vIHByZXZlbnQgdGhlIGRpc3BsYXkgb2YgdGhlIGZvcm0sIGJ5IHNldHRpbmcgaXQgdG8gJ251bGwnLlxyXG4gICAgaWYgKHRoaXMuX2lzTWFpblByZyAmJiB0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgaWYgKCF0aGlzLl9vcGVuV2luIHx8ICF0aGlzLkZvcm0uaXNMZWdhbEZvcm0pIHsgICAvLyBUaGlzIGNhbiBiZSBtZGkgZnJhbWVcclxuICAgICAgICB0aGlzLkZvcm0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbXB1dGUgdGhlIG1haW4gZGlzcGxheSBvbmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENvbXB1dGVNYWluRGlzcGxheSgpOiB2b2lkIHtcclxuICAgIGxldCBwcm9wTWFpbkRpc3BsYXk6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01BSU5fRElTUExBWSk7XHJcbiAgICBsZXQgbWFpbkRpc3BsYXlJbmRleDogbnVtYmVyID0gcHJvcE1haW5EaXNwbGF5LkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk7XHJcblxyXG4gICAgbWFpbkRpc3BsYXlJbmRleCA9IHRoaXMuR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5EaXNwbGF5SW5kZXgpO1xyXG5cclxuICAgIHRoaXMuX2Zvcm1zLkluaXRGb3JtRnJvbVhtbFN0cmluZyhtYWluRGlzcGxheUluZGV4KTtcclxuICAgIHRoaXMuRW5zdXJlVmFsaWRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHByZXBhcmUgdGFzayBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBQcmVwYXJlVGFza0Zvcm0oKTogUHJvbWlzZTxSZXR1cm5SZXN1bHQ+IHtcclxuICAgIGF3YWl0IFRhc2tTZXJ2aWNlQmFzZS5QcmVwYXJlUHJvcE9wZW5UYXNrV2luZG93KHRoaXMpO1xyXG4gICAgcmV0dXJuIFJlbW90ZVRhc2tTZXJ2aWNlLlByZXBhcmVQcm9wTWFpbkRpc3BsYXkodGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGZvcm0gaXMgbGVnYWxcclxuICAvLy8gd2UgYXJlIG5vdCBnZXQgdG8gdGhhdCBtZXRob2QgZm9yIG1haW4gZGlzcGxheSB0aGF0IG9wZW4gd2luZG93IGlzIGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEZvcm1Jc0xlZ2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzRm9ybUlzTGVnYWw6IGJvb2xlYW4gPSBzdXBlci5pc01haW5Qcm9nKCk7XHJcbiAgICByZXR1cm4gaXNGb3JtSXNMZWdhbCB8fCBzdXBlci5nZXRGb3JtKCkuaXNMZWdhbEZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgbWFpbiBkaXNwbGF5IG9uIHN0dWRpbyBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWFpbkRzcElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uRGVwdGgobWFpbkRzcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICB3aGlsZSAodGFzayAhPSBudWxsKSB7XHJcbiAgICAgIG1haW5Ec3BJZHggKz0gdGFzay5fZm9ybXMuQ291bnQ7XHJcbiAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluRHNwSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIG1haW4gZGlzcGxheSBvbiBzdHVkaW8gZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1haW5Ec3BJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5Ec3BJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAobWFpbkRzcElkeCA+IDEpIHtcclxuXHJcbiAgICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICAgIHdoaWxlICh0YXNrICE9IG51bGwpIHtcclxuICAgICAgICBtYWluRHNwSWR4IC09IHRhc2suX2Zvcm1zLkNvdW50O1xyXG4gICAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Ec3BJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBBbmNlc3RvciB0YXNrIChvbiBydW50aW1lIHRyZWUpIG9mIHRoZSBzZW5kIHRhc2sgZGVmaW5pdGlvbiBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmluZFRhc2tEZWZpbml0aW9uSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0QW5jZXN0b3JUYXNrQnlUYXNrRGVmaW5pdGlvbklkKGZpbmRUYXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkKTogVGFzayB7XHJcbiAgICBsZXQgY3VycmVudFRhc2s6IFRhc2sgPSB0aGlzO1xyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjOjE3Mjk1OVxyXG4gICAgLy8gaWYgdGhlIGZpbmRUYXNrRGVmaW5pdGlvbklkIGlzIG1haW4gcHJvZ3JhbSAoY2FuIGJlIG9mIGNvbXBvbmVudCkgd2Ugd2lsbCBub3QgZm91bmQgaXQgaW4gdGhlIF9wYXJlbnRUYXNrXHJcbiAgICAvLyBzbyB3ZSB3aWxsIHRha2UgdGhlIHRhc2sgZnJvbSB0aGUgTUdEYXRhVGFibGVcclxuICAgIGlmIChmaW5kVGFza0RlZmluaXRpb25JZC5Jc01haW5Qcm9ncmFtKCkpXHJcbiAgICAgIHJldHVybiA8VGFzaz5HdWlEYXRhQ29sbGVjdGlvbi5NR0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KHRoaXMuQ29udGV4dElELCBmaW5kVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCk7XHJcblxyXG4gICAgd2hpbGUgKGN1cnJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgaWYgKGN1cnJlbnRUYXNrLlRhc2tEZWZpbml0aW9uSWQuRXF1YWxzKGZpbmRUYXNrRGVmaW5pdGlvbklkKSlcclxuICAgICAgICByZXR1cm4gY3VycmVudFRhc2s7XHJcblxyXG4gICAgICBjdXJyZW50VGFzayA9IGN1cnJlbnRUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgU2V0RGF0YUNvbnRyb2xWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkOiBudW1iZXIsIGRjVmFsdWVzSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSBzdXBlci5nZXRGb3JtKCkuZ2V0Q3RybChjb250cm9sSWQpO1xyXG4gICAgY3RybC5zZXREY1ZhbElkKGRjVmFsdWVzSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkaXNwbGF5IHRlc3Qgb24gc3RhdHVzIGJhclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgRGlzcGxheU1lc3NhZ2VUb1N0YXR1c0Jhcih0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIFFjciAjNzk4MzExLiBpZiBzZXJ2ZXIgc2lkZSBoYWQgTVAgZG9pbmcgdmVyaWZ5IHRvIHBhbmUgYW5kIE1QIGhhcyBubyBmb3JtXHJcbiAgICAvLyB3ZSB3aWxsIGdldCBhbiBleGNlcHRpb24uIHNvIGluIGNhc2Ugb2Ygbm8gZm9ybSwgZ2V0IGl0IGZyb20gbGFzdCBmb2N1c2VkIHRhc2suXHJcbiAgICBsZXQgdGFza1RvVmVyaWZ5T246IFRhc2sgPSA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgaWYgKHRhc2tUb1ZlcmlmeU9uLmdldEZvcm0oKSA9PSBudWxsKVxyXG4gICAgICB0YXNrVG9WZXJpZnlPbiA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuXHJcbiAgICB0YXNrVG9WZXJpZnlPbi5Xcml0ZVRvTWVzc2FnZVBhbmUodGV4dCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIgPSAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIEdldFRhc2tEZXRhaWxzKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZXMgPSAgKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKHRhc2suUGFyZW50VGFzayAhPT0gbnVsbCAmJiAhdGFzay5QYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dGFzay5QYXJlbnRUYXNrO1xyXG4gICAgICBuYW1lcyA9ICAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCkgKyBcIi5cIiArIG5hbWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuYW1lcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBhcnNlcyB0aGUgdGFza1VSTCB0YWdcclxuICAvLy8gZXZlcnkgdGFza1VSTCB0YWcgaXMgcmVwbGFjZWQgYnkgdGhlIGRhdGEgb2YgdGhlIHhtbCBpc2xhbmQgaXQgcmVmZXJzIHRvPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBQcm9jZXNzVGFza1VSTCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB4bWxEYXRhOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTGRhdGEoKTtcclxuICAgIGxldCBlbmRUYXNrVXJsSWR4OiBudW1iZXIgPSB4bWxEYXRhLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoZW5kVGFza1VybElkeCAhPT0gLTEgJiYgZW5kVGFza1VybElkeCA8IHhtbERhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAvLyBleHRyYWN0IHRoZSB0YXNrIHVybCBhbmQgdGhlIHJlZiBsaXN0XHJcbiAgICBsZXQgdGFnOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRUYXNrVXJsSWR4KTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTCkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGgpO1xyXG5cclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kVGFza1VybElkeCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICBsZXQgdGFza0NhY2hlVVJMOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oMSk7XHJcbiAgICBsZXQgcmVmTGlzdFN0cjogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKDMpO1xyXG5cclxuICAgIC8vIGJyaW5nIHRoZSBkYXRhXHJcbiAgICBsZXQgdGFza0NvbnRlbnRPcmlnaW5hbDogc3RyaW5nID0gYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5HZXRDb250ZW50KHRhc2tDYWNoZVVSTCwgdHJ1ZSk7XHJcblxyXG4gICAgLy8gcHJlZml4IHRoZSBvcmlnaW5hbCBkYXRhIHRpbGwgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IDx0YXNrVVJMPlxyXG4gICAgbGV0IHRhc2tDb250ZW50RmluYWw6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih4bWxEYXRhLnN1YnN0cigwLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKSwgdGFza0NvbnRlbnRPcmlnaW5hbC5sZW5ndGgpO1xyXG4gICAgLy8gdGhlIG51bWJlciBvZiB0b2tlbnMgaW4gcmVmTGlzdCBhbmQgdGhlIG51bWJlciBvZiBsb2NhdGlvbiBpbiB0aGUgeG1sIHRvIGJlIHJlcGxhY2VkIChpLmUuIHRoZSBwbGFjZXMgd2l0aCBbOikgc2hvdWxkIGJlIGVxdWFsXHJcbiAgICBsZXQgcmVmbGlzdDogTGlzdDxzdHJpbmc+ID0gdGhpcy5nZXRSZWZsaXN0KHJlZkxpc3RTdHIsICc7JywgdHJ1ZSwgLTEpO1xyXG4gICAgbGV0IHJlZkxpc3RJZHggPSAwO1xyXG5cclxuICAgIGxldCBjdXJySWR4OiBudW1iZXIgPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiKTtcclxuICAgIGxldCBwcmV2SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgd2hpbGUgKGN1cnJJZHggIT09IC0xKSB7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgsIGN1cnJJZHggLSBwcmV2SWR4KSk7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHJlZmxpc3QuZ2V0X0l0ZW0ocmVmTGlzdElkeCsrKSk7XHJcbiAgICAgIGN1cnJJZHggKz0gMjtcclxuICAgICAgcHJldklkeCA9IGN1cnJJZHg7XHJcbiAgICAgIGN1cnJJZHggPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiLCBwcmV2SWR4KTtcclxuICAgIH1cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgpKTtcclxuXHJcbiAgICAvLyBzdWZmaXggdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHhtbCBmcm9tIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgPC90YXNrVVJMPlxyXG4gICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQoeG1sRGF0YS5zdWJzdHIoeG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZFRhc2tVcmxJZHggKyAxKSArIDEpKTtcclxuICAgIHhtbERhdGEgPSB0YXNrQ29udGVudEZpbmFsLlRvU3RyaW5nKCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLS0tLS0tLT4gezF9XCIsIHRhc2tDYWNoZVVSTCwgeG1sRGF0YSkpO1xyXG5cclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YSh4bWxEYXRhKTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4KFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkgLSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoICsgMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIGRhdGEgYWNvcmRpbmcgdG8gdGhlIGRlbGltZXRlciBhbmQgdGhlIHJlZmxpc3QgZGVsaW1ldGVycyBsb2dpYzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHJ1bmNcIj5pZiB0cnVlIHRydWNhdGUgZmlyc3QgJ1xcXFwnIChpbiB1c2UgZm9yIGlzbGFuZCBkYXRhIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFRva2Vuc1wiPmlmIC0xIGFsbCB0b2tlbnMgYXZpYWxhYmxlIGVsc2UgdGhlIG51bWJlciBvZiB0b2tlbnMgdG8gc2VhcmNoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRSZWZsaXN0KGRhdGE6IHN0cmluZywgZGVsaW06IHN0cmluZywgdHJ1bmM6IGJvb2xlYW4sIG1heFRva2VuczogbnVtYmVyKTogTGlzdDxzdHJpbmc+IHtcclxuICAgIGxldCBjdXJyU3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBsaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdG9rZW5zQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNpbmNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYWx3YXlzICc7JyB3ZSBzdGFydCBmcm9tIDFcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjdXJyOiBzdHJpbmcgPSBkYXRhLmNoYXJBdChpKTtcclxuXHJcbiAgICAgIGlmIChjdXJyICE9PSAnXFxcXCcgJiYgY3VyciAhPT0gZGVsaW0pXHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoY3Vycik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09IGRlbGltKSB7XHJcbiAgICAgICAgbGlzdC5wdXNoKGN1cnJTdHIuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgY3VyclN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgdG9rZW5zQ250Kys7XHJcblxyXG4gICAgICAgIGlmICh0b2tlbnNDbnQgPT09IG1heFRva2VucylcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09ICdcXFxcJykge1xyXG4gICAgICAgIC8vIHRoZSBmb3JtYXQgJ1xcXFxkZWxpbWl0ZXInIGlzIGFsd2F5cyB0cnVuY2F0ZWRcclxuICAgICAgICBpZiAoIXRydW5jICYmIGRhdGEuY2hhckF0KGkgKyAxKSAhPT0gZGVsaW0pXHJcbiAgICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgIGkrKztcclxuICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcmVmIGxpc3RcclxuICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBzZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgU3RhcnRQcm9ncmFtKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGxldCBvcmdTdG9wRXhlY3V0aW9uOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldEFsbG93RXZlbnRzKCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsKys7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTsgLy8gUUNSICM3Njk3MzQgLSBub3RoaW5nIGNhbiBzdG9wIGEgdGFzayBmcm9tIHN0YXJ0aW5nIHVwLlxyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjMjgzNjQ3IGV4ZWN1dGUgY29tcG9uZW50cyBtYWluIHByb2dyYW1zIC0gIGluIHRoZSBzZXJ2ZXIgd2UgZXhlY3V0ZSB0aGUgc2FtZSBzZWUgaW5pLmNwcCBtZXRob2QgZXhlY3V0ZV9tYWluX3Byb2dzKClcclxuICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCA9IGF3YWl0IHRoaXMuRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAvLyBleGVjdXRlIGludGVybmFsIG1haW4gcHJvZ3JhbXNcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCk7XHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFza1JlZjogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbSgwLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWYsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKCFUYXNrLl9pZGxlVGltZXJTdGFydGVkKSB7XHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2Uuc3RhcnRUaW1lcihBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLCBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRJZGxlVGltZSgwKSwgdHJ1ZSk7XHJcbiAgICAgIFRhc2suX2lkbGVUaW1lclN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIGF3YWl0IHRoaXMuRG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICBhd2FpdCB0aGlzLk1vdmVUb0ZpcnN0Q29udHJvbHMoY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG5cclxuXHJcbiAgICAvLyBIYW5kbGUgdGhlIGV2ZW50cyBvbmx5IHdoZW4gYWxsIHRoZSB0YXNrcyBhbmQgdGhlaXIgZm9ybXMgYXJlIG9wZW5lZC5cclxuICAgIGlmIChUYXNrLlN0YXJ0UHJvZ0xldmVsID09PSAxKSB7XHJcbiAgICAgIGxldCByZXNldEFsbG93RXZlbnRzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBjYW5FeGVjdXRlRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIHNldCB0aGUgd2l0aGluIG5vbiBpbnRlcmFjdGl2ZSBzaW5jZSB0aGUgaGFuZGxlRXZlbnRzIG1pZ2h0IHRyeSB0byBleGVjdXRlIGFuIGV2ZW50XHJcbiAgICAgIC8vIHRoYXQgd2FzIHJhaXNlZCBpbiB0aGUgMXN0IHJlYyBwcmVmIChhZGRlZCBpbiBtb3ZlVG9GaXJzdGNvbnRyb2xzKS5cclxuICAgICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCAhPT0gbnVsbCAmJiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNTdGFydGVkKCkpIHtcclxuICAgICAgICByZXNldEFsbG93RXZlbnRzID0gdHJ1ZTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCksIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCk7XHJcblxyXG4gICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSB0YXNrIHdpdGggYWxsb3cgZXZlbnRzID0gTk8gaXMgYWJvdXQgdG8gcnVuLlxyXG4gICAgICAgIC8vIGRvbid0IHRyeSB0byBleGVjdXRlIHRoZSBldmVudHMgYmVmb3JlIGl0IHN0YXJ0cyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBsb3N0LiAoIzEzODQ5MylcclxuICAgICAgICBjYW5FeGVjdXRlRXZlbnRzID0gYXdhaXQgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHRoZSBpdCBpcyBhIHN1YmZvcm0gd2l0aCB2aXNpYmlsaXR5IGV4cHJlc3Npb24gZXZhbHVhdGVkIHRvIFRSVUUsXHJcbiAgICAgIC8vIHNvIGFmdGVyIHJldHVybiBmcm9tIHRoZSBzZXJ2ZXIgZG8gbm90IGV4ZWN1dGUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlLlxyXG4gICAgICAvLyBUaGVzZSBldmVudHMgd2lsbCBiZSBleGVjdXRlZCBmcm9tIHRoZSAnc3RhcnRQcm9nJyBvZiB0aGUgcGFyZW50IHRhc2suXHJcbiAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgIT09IG51bGwgJiYgY2FuRXhlY3V0ZUV2ZW50cykge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnRzKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCksIDApO1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzdG9yZS4ganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLiBpdCB3aWxsIGJlIHNldCBhZ2FpbiBvbmNlIGluIHRoZSBjb3JyZWN0IGV2ZW50c0xvb3AuXHJcbiAgICAgIGlmIChyZXNldEFsbG93RXZlbnRzKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldEFsbG93RXZlbnRzKGFsbG93RXZlbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsLS07XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJFbmQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcblxyXG4gICAgLy8gSWYgb3JpZ2luYWxseSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gc3RvcCBldmVudHMgZXhlY3V0aW9uLCB0aGVuIHJlc3RvcmUgdGhpc1xyXG4gICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24gJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGlmIChvcmdTdG9wRXhlY3V0aW9uICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24ob3JnU3RvcEV4ZWN1dGlvbik7XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgY29tcG9uZW50J3MgbWFpbiBwcm9ncmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjYWxsQnlEZXN0U3ViRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIG5vbiBpbnRlcmFjdGl2ZSB0YXNrIGlmIGFueSB0aGF0IGV4ZWN1dGVkPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBhc3luYyBFeGVjdXRlQ29tcG9uZW50TWFpblByb2dyYW1zKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHsgLy8gZ28gd2l0aCBTdGFydFByb2dyYW1cclxuICAgIGxldCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG5cclxuICAgIGxldCBtYXhDdGxJZHg6IG51bWJlciA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCkuZ2V0TWF4Q3RsSWR4KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBtYXhDdGxJZHg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgY29tcG9uZW50TWFpblByb2dyYW06IFRhc2sgPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgaSk7XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50TWFpblByb2dyYW0gIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgVGFzay5FeGVjdXRlTWFpblByb2dyYW0oaSwgY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCwgY3VycmVudE5vbkludGVyYWN0aXZlVGFzaywgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIG1haW4gcHJvZ3JhbSBvZiBDdGxJbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQ3RsSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNhbGxCeURlc3RTdWJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgRXhlY3V0ZU1haW5Qcm9ncmFtKEN0bEluZGV4OiBudW1iZXIsIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2s6IFJlZlBhcmFtPFRhc2s+LCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFJlZlBhcmFtPFRhc2s+LCBtZ0RhdGFUYWJsZTogSU1HRGF0YUNvbGxlY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtYWluUHJvZ3JhbVRhc2s6IFRhc2sgPSA8VGFzaz5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBDdGxJbmRleCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCIgIENsaWVudE1hbmFnZXIuc3RhcnRQcm9nOiBjdGxJZHg9ezB9LCB0YXNrPXsxfVwiLCBDdGxJbmRleCwgbWFpblByb2dyYW1UYXNrKSk7XHJcblxyXG4gICAgY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZSA9ICA8VGFzaz4oYXdhaXQgbWFpblByb2dyYW1UYXNrLlN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbCwgY2FsbEJ5RGVzdFN1YkZvcm0pKTtcclxuICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWUgPT09IG51bGwpXHJcbiAgICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZSA9IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWU7XHJcbiAgICBlbHNlIGlmIChjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIERlYnVnLkFzc2VydChmYWxzZSwgXCJtb3JlIHRoYW4gMSBub24gaW50ZXJhY3RpdmUgdGFza3MgaW4gc3RhcnRQcm9nXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBPcGVuIGFsbCB0aGUgZm9ybSB0aGF0IGFyZSBwZW5kaW5nIGluIENyZWF0ZWRGb3JtcyB2ZWN0b3IuIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IE1nRm9ybS5DcmVhdGVkRm9ybXM7XHJcbiAgICBsZXQgb3V0TW9zdEZvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG5cclxuICAgIGlmIChjcmVhdGVkRm9ybXMuQ291bnQoKSA+IDApIHtcclxuICAgICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICAgIHdoaWxlIChpIDwgY3JlYXRlZEZvcm1zLkNvdW50KCkpIHtcclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSBjcmVhdGVkRm9ybXMuZ2V0KGkpO1xyXG4gICAgICAgIGxldCBjYW5PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIE9wZW4gYSBzdWJmb3JtIG9ubHkgaWYgaXRzIGNvbnRhaW5lciBmb3JtIGlzIE9wZW5lZC5cclxuICAgICAgICAvLyBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpIGRvZXNuJ3QgZ28gd2VsbCBmb3Igc3ViZm9ybXMgKFFDUiAjOTE5MTE5KS5cclxuICAgICAgICBpZiAobWdGb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgICBsZXQgb3BlbmVkOiBib29sZWFuID0gKDxNZ0Zvcm1CYXNlPm1nRm9ybS5nZXRTdWJGb3JtQ3RybCgpLmdldEZvcm0oKSkuT3BlbmVkO1xyXG4gICAgICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgICAgICBjYW5PcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoKDxUYXNrPm1nRm9ybS5nZXRUYXNrKCkpLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkpIHtcclxuICAgICAgICAgICAgY2FuT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FuT3Blbikge1xyXG4gICAgICAgICAgTWFuYWdlci5PcGVuRm9ybShtZ0Zvcm0pO1xyXG4gICAgICAgICAgYXdhaXQgTWFuYWdlci5Eb0ZpcnN0UmVmcmVzaFRhYmxlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWdGb3JtLk9wZW5lZCkge1xyXG4gICAgICAgICAgaWYgKGNhbGxCeURlc3RTdWJGb3JtICYmIG1nRm9ybS5pc1N1YkZvcm0oKSlcclxuICAgICAgICAgICAgb3V0TW9zdEZvcm0gPSBtZ0Zvcm0uZ2V0VG9wTW9zdEZvcm0oKTtcclxuXHJcbiAgICAgICAgICBjcmVhdGVkRm9ybXMucmVtb3ZlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHb2VzIG92ZXIgZm9ybXMgaXMgY3JlYXRlZEZvcm1WZWMgYW5kIHBlcmZvcm1zIG1vdmUgdG8gZmlyc3QgcmVjb3JkIGN5Y2xlIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIERvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoaSk7XHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbWdkLmdldFRhc2tzQ291bnQoKTsgaisrKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBtZ2QuZ2V0VGFzayhqKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgICAgICAgaWYgKG1nRm9ybSAhPT0gbnVsbCAmJiB0YXNrLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgJiYgIW1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlKSB7XHJcbiAgICAgICAgICAgIG1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5kb0ZpcnN0UmVjb3JkQ3ljbGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRm9yIGV2ZXJ5IG1nZGF0YSBwZXJmb3JtIG1vdmUgdG8gZmlyc3QgY29udHJvbCB0byB0aGUgZm9ybVxyXG4gIC8vLyB0aGF0IHdlIG1hcmtlZCBiZWZvcmUgd2l0aCBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgTW92ZVRvRmlyc3RDb250cm9scyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShpKTtcclxuXHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBsZXQgdGFza3NDb3VudDogbnVtYmVyID0gbWdkLmdldFRhc2tzQ291bnQoKTtcclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRhc2tzQ291bnQ7IGorKykge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gbWdkLmdldFRhc2soaik7XHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2suaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSAmJiBtZ0Zvcm0gIT09IG51bGwgJiYgbWdGb3JtLk1vdmVkVG9GaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgIG1nRm9ybS5Nb3ZlZFRvRmlyc3RDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIWNhbGxCeURlc3RTdWJGb3JtKVxyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==