@magic-xpa/engine 4.801.0-dev481.243 → 4.801.0-dev481.249

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 (293) 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/{esm2015/src/ConstInterface.js → esm2020/src/ConstInterface.mjs} +0 -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/{esm2015/src/GuiEventsProcessor.js → esm2020/src/GuiEventsProcessor.mjs} +0 -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/{esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js → esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs} +0 -0
  23. package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs} +0 -0
  24. package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs} +0 -0
  25. package/{esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js → esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs} +0 -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/{esm2015/src/commands/ClientToServer/ComputeEventCommand.js → esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs} +0 -0
  29. package/{esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js → esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs} +0 -0
  30. package/{esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js → esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs} +0 -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} +0 -0
  34. package/{esm2015/src/commands/ClientToServer/EvaluateCommand.js → esm2020/src/commands/ClientToServer/EvaluateCommand.mjs} +0 -0
  35. package/{esm2015/src/commands/ClientToServer/EventCommand.js → esm2020/src/commands/ClientToServer/EventCommand.mjs} +0 -0
  36. package/{esm2015/src/commands/ClientToServer/ExecOperCommand.js → esm2020/src/commands/ClientToServer/ExecOperCommand.mjs} +0 -0
  37. package/{esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js → esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs} +0 -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/{esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js → esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs} +0 -0
  41. package/{esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js → esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs} +0 -0
  42. package/{esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js → esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs} +0 -0
  43. package/{esm2015/src/commands/ClientToServer/QueryCommand.js → esm2020/src/commands/ClientToServer/QueryCommand.mjs} +0 -0
  44. package/{esm2015/src/commands/ClientToServer/RecomputeCommand.js → esm2020/src/commands/ClientToServer/RecomputeCommand.mjs} +0 -0
  45. package/{esm2015/src/commands/ClientToServer/RefreshEventCommand.js → esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs} +0 -0
  46. package/{esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js → esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs} +0 -0
  47. package/{esm2015/src/commands/ClientToServer/RollbackEventCommand.js → esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs} +0 -0
  48. package/{esm2015/src/commands/ClientToServer/SelectProgramCommand.js → esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs} +0 -0
  49. package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
  50. package/{esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js → esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs} +0 -0
  51. package/{esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js → esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs} +0 -0
  52. package/{esm2015/src/commands/ClientToServer/TransactionCommand.js → esm2020/src/commands/ClientToServer/TransactionCommand.mjs} +0 -0
  53. package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
  54. package/{esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js → esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs} +0 -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/{esm2015/src/data/Record.js → esm2020/src/data/Record.mjs} +0 -0
  87. package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
  88. package/{esm2015/src/data/RecordsTable.js → esm2020/src/data/RecordsTable.mjs} +0 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/{esm2015/src/data/XMLBasedDcValuesBuilder.js → esm2020/src/data/XMLBasedDcValuesBuilder.mjs} +0 -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/{esm2015/src/event/ActionManager.js → esm2020/src/event/ActionManager.mjs} +0 -0
  98. package/esm2020/src/event/Event.mjs +1436 -0
  99. package/esm2020/src/event/EventHandler.mjs +773 -0
  100. package/{esm2015/src/event/EventHandlerPosition.js → esm2020/src/event/EventHandlerPosition.mjs} +0 -0
  101. package/esm2020/src/event/EventsManager.mjs +2983 -0
  102. package/{esm2015/src/event/IEventsManager.js → esm2020/src/event/IEventsManager.mjs} +0 -0
  103. package/{esm2015/src/event/RunTimeEvent.js → esm2020/src/event/RunTimeEvent.mjs} +0 -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} +0 -0
  109. package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
  110. package/{esm2015/src/exp/ExpressionLocalJpn.js → esm2020/src/exp/ExpressionLocalJpn.mjs} +0 -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/{esm2015/src/remote/ServerError.js → esm2020/src/remote/ServerError.mjs} +0 -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/{esm2015/src/rt/DataviewHeaderFactory.js → esm2020/src/rt/DataviewHeaderFactory.mjs} +0 -0
  145. package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
  146. package/{esm2015/src/rt/DataviewHeadersSaxHandler.js → esm2020/src/rt/DataviewHeadersSaxHandler.mjs} +0 -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/{esm2015/src/rt/Transaction.js → esm2020/src/rt/Transaction.mjs} +0 -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/{esm2015/src/tasks/RemoteTaskService.js → esm2020/src/tasks/RemoteTaskService.mjs} +0 -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/{esm2015/src/tasks/sort/SortCollection.js → esm2020/src/tasks/sort/SortCollection.mjs} +0 -0
  176. package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
  177. package/esm2020/src/util/FlowMonitorQueue.mjs +361 -0
  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/{esm2015/src/util/Process.js → esm2020/src/util/Process.mjs} +0 -0
  187. package/{esm2015/src/util/ReturnResult.js → esm2020/src/util/ReturnResult.mjs} +0 -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} +102 -5
  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 +2 -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/commands/DataViewCommandBase.d.ts +2 -2
  201. package/src/commands/IClientTargetedCommand.d.ts +1 -1
  202. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
  203. package/src/data/FieldBase.d.ts +3 -3
  204. package/src/env/EnvVariablesTable.d.ts +2 -15
  205. package/src/env/MirrorString.d.ts +15 -0
  206. package/src/exp/GlobalParamsTable.d.ts +2 -1
  207. package/src/http/client/HttpClientBase.d.ts +2 -2
  208. package/src/rt/DataviewHeaderBase.d.ts +1 -1
  209. package/src/tasks/TaskBase.d.ts +7 -7
  210. package/src/util/IMirrorXML.d.ts +1 -1
  211. package/src/util/ParamParseResult.d.ts +6 -0
  212. package/src/util/PrmMap.d.ts +0 -6
  213. package/bundles/magic-xpa-engine.umd.js +0 -37983
  214. package/bundles/magic-xpa-engine.umd.js.map +0 -1
  215. package/bundles/magic-xpa-engine.umd.min.js +0 -16
  216. package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
  217. package/esm2015/index.js +0 -188
  218. package/esm2015/src/AccessHelper.js +0 -3
  219. package/esm2015/src/ClientManager.js +0 -412
  220. package/esm2015/src/CommandsProcessorBase.js +0 -54
  221. package/esm2015/src/CommandsProcessorManager.js +0 -31
  222. package/esm2015/src/CommandsTable.js +0 -166
  223. package/esm2015/src/GUIManager.js +0 -72
  224. package/esm2015/src/bridge/MagicBridge.js +0 -44
  225. package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
  226. package/esm2015/src/commands/DataViewCommandBase.js +0 -6
  227. package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
  228. package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
  229. package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
  230. package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
  231. package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
  232. package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
  233. package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
  234. package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
  235. package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
  236. package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
  237. package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
  238. package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
  239. package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
  240. package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
  241. package/esm2015/src/data/DataView.js +0 -1692
  242. package/esm2015/src/data/DataviewManager.js +0 -31
  243. package/esm2015/src/data/DataviewManagerBase.js +0 -18
  244. package/esm2015/src/data/Field.js +0 -671
  245. package/esm2015/src/data/FieldBase.js +0 -9
  246. package/esm2015/src/data/TaskTransactionManager.js +0 -110
  247. package/esm2015/src/env/EnvVariablesTable.js +0 -408
  248. package/esm2015/src/env/Environment.js +0 -557
  249. package/esm2015/src/env/LanguageData.js +0 -229
  250. package/esm2015/src/event/Event.js +0 -1441
  251. package/esm2015/src/event/EventHandler.js +0 -786
  252. package/esm2015/src/event/EventsManager.js +0 -3106
  253. package/esm2015/src/exp/Expression.js +0 -209
  254. package/esm2015/src/exp/ExpressionEvaluator.js +0 -4440
  255. package/esm2015/src/exp/GlobalParamsTable.js +0 -84
  256. package/esm2015/src/exp/YesNoExp.js +0 -44
  257. package/esm2015/src/gui/FormsTable.js +0 -73
  258. package/esm2015/src/gui/MgControl.js +0 -424
  259. package/esm2015/src/gui/MgForm.js +0 -1291
  260. package/esm2015/src/http/HttpManager.js +0 -100
  261. package/esm2015/src/http/client/HttpClientAsync.js +0 -72
  262. package/esm2015/src/http/client/HttpClientBase.js +0 -147
  263. package/esm2015/src/http/client/HttpClientSync.js +0 -47
  264. package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
  265. package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
  266. package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
  267. package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -901
  268. package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
  269. package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
  270. package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
  271. package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
  272. package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
  273. package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
  274. package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
  275. package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
  276. package/esm2015/src/rt/Argument.js +0 -281
  277. package/esm2015/src/rt/ArgumentsList.js +0 -108
  278. package/esm2015/src/rt/Boundary.js +0 -161
  279. package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
  280. package/esm2015/src/rt/Operation.js +0 -772
  281. package/esm2015/src/rt/Recompute.js +0 -372
  282. package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
  283. package/esm2015/src/rt/TableCache.js +0 -182
  284. package/esm2015/src/rt/TableCacheManager.js +0 -70
  285. package/esm2015/src/tasks/MGData.js +0 -561
  286. package/esm2015/src/tasks/MGDataCollection.js +0 -270
  287. package/esm2015/src/tasks/Task.js +0 -2601
  288. package/esm2015/src/tasks/TaskServiceBase.js +0 -30
  289. package/esm2015/src/tasks/TasksTable.js +0 -87
  290. package/esm2015/src/util/FlowMonitorQueue.js +0 -364
  291. package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
  292. package/esm2015/src/util/PrmMap.js +0 -157
  293. package/fesm2015/magic-xpa-engine.js.map +0 -1
@@ -1,424 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Commands, CommandType, GuiDataCollection, HtmlProperties, MgControlBase, PropInterface } from '@magic-xpa/gui';
3
- import { InternalInterface, Logger, MgControlType, ScrollBarThumbType, StorageAttribute, SubformType, TableBehaviour } from '@magic-xpa/utils';
4
- import { Debug, NString } from '@magic-xpa/mscorelib';
5
- import { ArgumentsList } from '../rt/ArgumentsList';
6
- import { TaskBase } from '../tasks/TaskBase';
7
- import { ConstInterface } from '../ConstInterface';
8
- import { LastFocusedManager } from '../rt/LastFocusedManager';
9
- import { AccessHelper } from '../AccessHelper';
10
- export class MgControl extends MgControlBase {
11
- constructor(type, taskOrParentMgForm, parentControlOrParentControlIdx) {
12
- if (arguments.length === 0)
13
- super();
14
- else if (arguments.length === 3 && (type === null || type.constructor === Number) && (taskOrParentMgForm === null || taskOrParentMgForm instanceof TaskBase) && (parentControlOrParentControlIdx === null || parentControlOrParentControlIdx.constructor === Number))
15
- super(type, taskOrParentMgForm.getForm(), parentControlOrParentControlIdx);
16
- else
17
- super(type, taskOrParentMgForm, parentControlOrParentControlIdx);
18
- this.initialize();
19
- }
20
- initialize() {
21
- this._focusedStopExecution = false;
22
- this._inControlSuffix = false;
23
- this._rtEvtTask = null;
24
- this._subformTaskId = null;
25
- this._subformTask = null;
26
- this.IsInteractiveUpdate = false;
27
- this.refreshOnString = null;
28
- this.SubformLoaded = false;
29
- this.HasZoomHandler = false;
30
- this.ArgList = null;
31
- }
32
- GetVarIndex() {
33
- return super.getForm().getTask().DataView.Dvcount + this.veeIndx;
34
- }
35
- fillData(mgForm, ditIdx, parser) {
36
- const _super = Object.create(null, {
37
- fillData: { get: () => super.fillData }
38
- });
39
- return __awaiter(this, void 0, void 0, function* () {
40
- _super.fillData.call(this, mgForm, ditIdx, parser);
41
- this.ArgList = yield this.GetArgumentList();
42
- });
43
- }
44
- SetAttribute(attribute, valueStr) {
45
- let isTagProcessed = super.SetAttribute(attribute, valueStr);
46
- if (!isTagProcessed) {
47
- switch (attribute) {
48
- case ConstInterface.MG_ATTR_SUBFORM_TASK:
49
- this._subformTaskId = valueStr;
50
- break;
51
- case ConstInterface.MG_ATTR_REFRESHON:
52
- this.refreshOnString = valueStr.trim();
53
- break;
54
- default:
55
- isTagProcessed = false;
56
- Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
57
- break;
58
- }
59
- }
60
- return isTagProcessed;
61
- }
62
- GetArgumentList() {
63
- const _super = Object.create(null, {
64
- getForm: { get: () => super.getForm }
65
- });
66
- return __awaiter(this, void 0, void 0, function* () {
67
- let argList = null;
68
- if (this._propTab === null)
69
- return argList;
70
- let ArgListProp = this._propTab.getPropById(PropInterface.PROP_TYPE_PARAMETERS);
71
- if (ArgListProp === null)
72
- return argList;
73
- let parms = yield ArgListProp.getValue();
74
- if (parms !== null) {
75
- argList = new ArgumentsList();
76
- argList.fillList(parms, _super.getForm.call(this).getTask());
77
- if (this.refreshOnString !== null)
78
- argList.RefreshOnString = this.refreshOnString;
79
- }
80
- return argList;
81
- });
82
- }
83
- isDescendent(parentForm) {
84
- let isDescendent = false;
85
- let checkCurrentForm = super.getForm();
86
- Debug.Assert(parentForm !== null);
87
- while (!isDescendent && checkCurrentForm !== null) {
88
- if (parentForm === checkCurrentForm)
89
- isDescendent = true;
90
- else {
91
- let currTask = checkCurrentForm.getTask();
92
- if (currTask.getParent() !== null)
93
- checkCurrentForm = currTask.getParent().getForm();
94
- else
95
- break;
96
- }
97
- }
98
- return isDescendent;
99
- }
100
- refreshOnExpression() {
101
- return __awaiter(this, void 0, void 0, function* () {
102
- let i;
103
- let size = (this._propTab === null ? 0 : this._propTab.getSize());
104
- let prop;
105
- let refresh = false;
106
- for (i = 0; i < size && !refresh; i++) {
107
- prop = this._propTab.getProp(i);
108
- switch (prop.getID()) {
109
- case PropInterface.PROP_TYPE_DATA:
110
- if (!prop.isExpression() && this._field !== null && this._field.getTask() !== this.getForm().getTask()) {
111
- refresh = true;
112
- break;
113
- }
114
- case PropInterface.PROP_TYPE_FORMAT:
115
- case PropInterface.PROP_TYPE_VISIBLE:
116
- case PropInterface.PROP_TYPE_ENABLED:
117
- case PropInterface.PROP_TYPE_RANGE:
118
- case PropInterface.PROP_TYPE_TRANSLATOR:
119
- if (prop.isExpression())
120
- refresh = true;
121
- break;
122
- default:
123
- break;
124
- }
125
- if (refresh)
126
- yield this.RefreshDisplay();
127
- }
128
- });
129
- }
130
- invoke() {
131
- return __awaiter(this, void 0, void 0, function* () {
132
- let invoked = false;
133
- if (yield this.isParkable(true)) {
134
- yield AccessHelper.eventsManager.handleInternalEventWithMgControlBase(this, InternalInterface.MG_ACT_CTRL_PREFIX);
135
- invoked = true;
136
- }
137
- return invoked;
138
- });
139
- }
140
- isParkable(checkEnabledAndVisible) {
141
- const _super = Object.create(null, {
142
- isImageControl: { get: () => super.isImageControl },
143
- checkProp: { get: () => super.checkProp },
144
- isParkable: { get: () => super.isParkable }
145
- });
146
- return __awaiter(this, void 0, void 0, function* () {
147
- let result = !_super.isImageControl.call(this);
148
- if (result) {
149
- yield _super.checkProp.call(this, PropInterface.PROP_TYPE_ENABLED, true);
150
- yield _super.checkProp.call(this, PropInterface.PROP_TYPE_VISIBLE, true);
151
- result = yield _super.isParkable.call(this, checkEnabledAndVisible);
152
- }
153
- return result;
154
- });
155
- }
156
- getSubformTaskId() {
157
- return this._subformTaskId;
158
- }
159
- initSubformTask() {
160
- if (super.isSubform())
161
- this._subformTask = GuiDataCollection.MGDataTable.GetTaskByID(this._subformTaskId);
162
- }
163
- getParentTable() {
164
- return this._parentTable;
165
- }
166
- restoreOldValue() {
167
- const _super = Object.create(null, {
168
- resetPrevVal: { get: () => super.resetPrevVal },
169
- SetAndRefreshDisplayValue: { get: () => super.SetAndRefreshDisplayValue }
170
- });
171
- return __awaiter(this, void 0, void 0, function* () {
172
- if (this._field !== null)
173
- yield this._field.updateDisplay();
174
- else {
175
- _super.resetPrevVal.call(this);
176
- yield _super.SetAndRefreshDisplayValue.call(this, yield this.getMgValue(this.Value), this.IsNull);
177
- }
178
- });
179
- }
180
- setRtEvtTask(curTask) {
181
- this._rtEvtTask = curTask;
182
- }
183
- getRtEvtTask() {
184
- return this._rtEvtTask;
185
- }
186
- setSubformTaskId(taskId) {
187
- this._subformTaskId = taskId;
188
- }
189
- isFocusedStopExecution() {
190
- return this._focusedStopExecution;
191
- }
192
- setFocusedStopExecution(focusedStopExecution) {
193
- this._focusedStopExecution = focusedStopExecution;
194
- }
195
- onTheSameSubFormControl(ctrl) {
196
- let retValue = false;
197
- if (ctrl !== null) {
198
- if (super.getForm().isSubForm() && ctrl.getForm().isSubForm()) {
199
- if (super.getForm().getTask() === ctrl.getForm().getTask())
200
- retValue = true;
201
- }
202
- }
203
- return retValue;
204
- }
205
- onDiffForm(ctrl) {
206
- let isSubform = super.getForm().isSubForm() || ctrl.getForm().isSubForm();
207
- let isOnDiffForm = (isSubform) && !this.onTheSameSubFormControl(ctrl);
208
- return isOnDiffForm;
209
- }
210
- isInControlSuffix() {
211
- return this._inControlSuffix;
212
- }
213
- setInControlSuffix(inControlSuffix) {
214
- this._inControlSuffix = inControlSuffix;
215
- }
216
- HasSelectProgram() {
217
- let HasSelectProgram = false;
218
- let selectProgProp = super.GetComputedProperty(PropInterface.PROP_TYPE_SELECT_PROGRAM);
219
- if (selectProgProp !== null && selectProgProp.GetComputedValue() !== null)
220
- HasSelectProgram = true;
221
- return HasSelectProgram;
222
- }
223
- useZoomHandler() {
224
- return this.HasZoomHandler || (super.getField() !== null && (super.getField().getHasZoomHandler() || (this.HasSelectProgram())));
225
- }
226
- updatePropertyLogicNesting(propId, commandType, val, updateThis) {
227
- const _super = Object.create(null, {
228
- haveToCheckParentValue: { get: () => super.haveToCheckParentValue },
229
- isParentPropValue: { get: () => super.isParentPropValue },
230
- isSubform: { get: () => super.isSubform },
231
- getDisplayLine: { get: () => super.getDisplayLine },
232
- updateChildrenPropValue: { get: () => super.updateChildrenPropValue }
233
- });
234
- return __awaiter(this, void 0, void 0, function* () {
235
- if (val && _super.haveToCheckParentValue.call(this))
236
- val = _super.isParentPropValue.call(this, propId);
237
- if (val && _super.isSubform.call(this) && commandType === CommandType.PROP_SET_VISIBLE && this.ShouldSetSubformInvisible())
238
- val = false;
239
- if (updateThis) {
240
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, _super.getDisplayLine.call(this, false), commandType === CommandType.PROP_SET_VISIBLE ? HtmlProperties.Visible : HtmlProperties.Enabled, val);
241
- }
242
- yield _super.updateChildrenPropValue.call(this, propId, commandType, val);
243
- });
244
- }
245
- ShouldSetSubformInvisible() {
246
- let setInvisible = false;
247
- let subformType = super.GetComputedProperty(PropInterface.PROP_TYPE_SUBFORM_TYPE).GetComputedValueInteger();
248
- if (subformType === SubformType.None && this.getSubformTaskId() === null)
249
- setInvisible = true;
250
- return setInvisible;
251
- }
252
- updateSubformChildrenPropValue(propId, commandType, val) {
253
- const _super = Object.create(null, {
254
- isSubform: { get: () => super.isSubform },
255
- getForm: { get: () => super.getForm },
256
- GetComputedProperty: { get: () => super.GetComputedProperty }
257
- });
258
- return __awaiter(this, void 0, void 0, function* () {
259
- Debug.Assert(_super.isSubform.call(this));
260
- if (!_super.getForm.call(this).getTask().AfterFirstRecordPrefix)
261
- return;
262
- let subformType = _super.GetComputedProperty.call(this, PropInterface.PROP_TYPE_SUBFORM_TYPE).GetComputedValueInteger();
263
- if (this._subformTaskId !== null || subformType === SubformType.None) {
264
- if (this._subformTask !== null && this._subformTask.isStarted()) {
265
- this.SubformLoaded = true;
266
- if (commandType === CommandType.PROP_SET_VISIBLE && val && this.RefreshOnVisible) {
267
- this.RefreshOnVisible = false;
268
- yield _super.getForm.call(this).getTask().SubformRefresh(this._subformTask, true);
269
- }
270
- let subformForm = this._subformTask.getForm();
271
- for (let i = 0; i < subformForm.getCtrlCount(); i++) {
272
- let child = subformForm.getCtrl(i);
273
- if (!child.isColumnControl())
274
- continue;
275
- let childValue = (yield child.checkProp(propId, true)) && val;
276
- if (childValue)
277
- childValue = child.isParentPropValue(propId);
278
- yield child.updateChildrenPropValue(propId, commandType, childValue);
279
- }
280
- }
281
- }
282
- else if ((commandType === CommandType.PROP_SET_VISIBLE && val) && !this.SubformLoaded) {
283
- this.SubformLoaded = true;
284
- yield AccessHelper.eventsManager.handleInternalEventWithMgControlBase(this, InternalInterface.MG_ACT_SUBFORM_OPEN);
285
- }
286
- });
287
- }
288
- Init() {
289
- this.initSubformTask();
290
- }
291
- GetTableBehaviour() {
292
- return TableBehaviour.UnlimitedItems;
293
- }
294
- validateAndSetValue(NewValue, updateCtrl) {
295
- const _super = Object.create(null, {
296
- UpdateModifiedByUser: { get: () => super.UpdateModifiedByUser },
297
- getPIC: { get: () => super.getPIC },
298
- buildPicture: { get: () => super.buildPicture },
299
- getForm: { get: () => super.getForm }
300
- });
301
- return __awaiter(this, void 0, void 0, function* () {
302
- _super.UpdateModifiedByUser.call(this, NewValue);
303
- if (this.ModifiedByUser) {
304
- let ctrlCurrValue = this.Value;
305
- let vd;
306
- if (_super.getPIC.call(this) === null)
307
- return true;
308
- vd = _super.buildPicture.call(this, ctrlCurrValue, NewValue);
309
- vd.evaluate();
310
- if (vd.ValidationFailed) {
311
- this.ModifiedByUser = false;
312
- return false;
313
- }
314
- this.IsInteractiveUpdate = true;
315
- _super.getForm.call(this).getTask().setDataSynced(false);
316
- if (updateCtrl) {
317
- if (this._field !== null && this._field.getType() === StorageAttribute.NUMERIC && typeof NewValue === 'string' && NewValue.trim().length > 0)
318
- vd.setValue(NewValue);
319
- yield this.setValue(vd);
320
- }
321
- }
322
- return true;
323
- });
324
- }
325
- setValue(vd) {
326
- const _super = Object.create(null, {
327
- getMgValue: { get: () => super.getMgValue },
328
- isCheckBox: { get: () => super.isCheckBox },
329
- SetAndRefreshDisplayValue: { get: () => super.SetAndRefreshDisplayValue }
330
- });
331
- return __awaiter(this, void 0, void 0, function* () {
332
- let isNull = vd.getIsNull();
333
- let newValue = vd.getDispValue();
334
- let mgVal;
335
- if (!isNull || !this._field.hasNullDisplayValue())
336
- mgVal = yield _super.getMgValue.call(this, newValue);
337
- else
338
- mgVal = ((this._field.getType() === StorageAttribute.BLOB_VECTOR) ? this._field.getCellDefualtValue() : this._field.getDefaultValue());
339
- if (mgVal !== null) {
340
- if (this._field !== null && (!(newValue === this.Value) || this.KeyStrokeOn || this.IsNull !== isNull)) {
341
- yield this._field.setValueAndStartRecompute(mgVal, isNull, true, true, false);
342
- if (_super.isCheckBox.call(this)) {
343
- this.forceRefresh = true;
344
- mgVal = this._field.getValue(false);
345
- }
346
- }
347
- if ((this._field !== null && isNull) && this._field.hasNullDisplayValue())
348
- mgVal = newValue;
349
- yield _super.SetAndRefreshDisplayValue.call(this, mgVal, isNull);
350
- this.forceRefresh = false;
351
- this.KeyStrokeOn = false;
352
- }
353
- });
354
- }
355
- refreshAndSetItemsListForRadioButton(line, execComputeChoice) {
356
- const _super = Object.create(null, {
357
- refreshAndSetItemsListForRadioButton: { get: () => super.refreshAndSetItemsListForRadioButton },
358
- getForm: { get: () => super.getForm }
359
- });
360
- return __awaiter(this, void 0, void 0, function* () {
361
- yield _super.refreshAndSetItemsListForRadioButton.call(this, line, execComputeChoice);
362
- let lastFocusedTask = LastFocusedManager.Instance.getLastFocusedTask(_super.getForm.call(this).getTask().getMgdID());
363
- });
364
- }
365
- getSubformTask() {
366
- return this._subformTask;
367
- }
368
- resetSubformTask() {
369
- this._subformTask = null;
370
- this._subformTaskId = "0";
371
- }
372
- GetSubformMgForm() {
373
- let form = null;
374
- if (this._subformTask !== null)
375
- form = this._subformTask.getForm();
376
- return form;
377
- }
378
- IsTableWithAbsoluteScrollbar() {
379
- let tableWithAbsoluteScrollbar = false;
380
- Debug.Assert(this.Type === MgControlType.CTRL_TYPE_TABLE, "In MgControl.IsTableWithAbsoluteScrollbar(): Not a table control.");
381
- if (this._propTab.propExists(PropInterface.PROP_TYPE_SCROLL_BAR_THUMB))
382
- tableWithAbsoluteScrollbar = (this._propTab.getPropById(PropInterface.PROP_TYPE_SCROLL_BAR_THUMB).GetComputedValueInteger() === ScrollBarThumbType.Absolute);
383
- return tableWithAbsoluteScrollbar;
384
- }
385
- static validReturnToCtrl() {
386
- if (MgControl.ReturnToCtrl !== null && MgControl.ReturnToCtrl.getForm().getTask().isAborting())
387
- return false;
388
- return true;
389
- }
390
- maySetValue() {
391
- switch (this.Type) {
392
- case MgControlType.CTRL_TYPE_CHECKBOX:
393
- case MgControlType.CTRL_TYPE_TEXT:
394
- case MgControlType.CTRL_TYPE_COMBO:
395
- case MgControlType.CTRL_TYPE_LIST:
396
- case MgControlType.CTRL_TYPE_RADIO:
397
- case MgControlType.CTRL_TYPE_TAB:
398
- break;
399
- default:
400
- return false;
401
- }
402
- if (this._field === null || this._valExpId > 0)
403
- return false;
404
- return this.isModifiable();
405
- }
406
- validateAndSetValueIfAllowed(NewValue, refreshDisplay) {
407
- return __awaiter(this, void 0, void 0, function* () {
408
- if (!this.maySetValue()) {
409
- Logger.Instance.WriteErrorToLog(NString.Format("Unable to change value of control {0}: The control is read-only.", this.Name));
410
- return false;
411
- }
412
- let retVal = yield this.validateAndSetValue(NewValue, true);
413
- if (!retVal)
414
- Logger.Instance.WriteErrorToLog(NString.Format("Value validation failed for {0}.", this.Name));
415
- if (refreshDisplay) {
416
- Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
417
- Commands.invoke();
418
- }
419
- return retVal;
420
- });
421
- }
422
- }
423
- MgControl.ReturnToCtrl = null;
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdDb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGFBQWEsRUFHYixhQUFhLEVBR2QsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsY0FBYyxFQUVmLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSzNDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFRN0MsTUFBTSxPQUFPLFNBQVUsU0FBUSxhQUFhO0lBb0MxQyxZQUFZLElBQW9CLEVBQUUsa0JBQXdCLEVBQUUsK0JBQXdDO1FBQ2xHLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3hCLEtBQUssRUFBRSxDQUFDO2FBQ0wsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxrQkFBa0IsWUFBWSxRQUFRLENBQUMs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T0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsTUFBTTtnQkFDVCxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRWpHLElBQUksY0FBYyxFQUFFO2dCQUNsQixRQUFRLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ25FLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNuQjtZQUdELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FBQTs7QUEva0JNLHNCQUFZLEdBQWMsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBDb21tYW5kVHlwZSxcclxuICBHdWlEYXRhQ29sbGVjdGlvbixcclxuICBIdG1sUHJvcGVydGllcyxcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgUHJvcGVydHksXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBQcm9wUGFyZW50SW50ZXJmYWNlLFxyXG4gIFZhbGlkYXRpb25EZXRhaWxzXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIFNjcm9sbEJhclRodW1iVHlwZSxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN1YmZvcm1UeXBlLFxyXG4gIFRhYmxlQmVoYXZpb3VyLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0RlYnVnLCBOU3RyaW5nfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7VGFza0Jhc2V9IGZyb20gJy4uL3Rhc2tzL1Rhc2tCYXNlJztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4vTWdGb3JtJztcclxuaW1wb3J0IHtGaWVsZH0gZnJvbSAnLi4vZGF0YS9GaWVsZCc7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGNvbnRyb2w+IC4uLjwvY29udHJvbD4gdGFnXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8YXV0aG9yPiAgZWh1ZG1cclxuLy8vXHJcbi8vLyA8L2F1dGhvcj5cclxuZXhwb3J0IGNsYXNzIE1nQ29udHJvbCBleHRlbmRzIE1nQ29udHJvbEJhc2UgaW1wbGVtZW50cyBQcm9wUGFyZW50SW50ZXJmYWNlIHtcclxuICBwcml2YXRlIF9mb2N1c2VkU3RvcEV4ZWN1dGlvbjogYm9vbGVhbjsgLy8gdXNlZCB0byByZW1lbWJlciBzdG9wRXhlY3V0aW9uIGZsYWcgaW4gdGhlIGVuZCBvZlxyXG4gIHByaXZhdGUgX2luQ29udHJvbFN1ZmZpeDogYm9vbGVhbjsgLy8gdHJ1ZSwgaXMgY29udHJvbCBpcyBpbiBjb250cm9sIHN1ZmZpeFxyXG4gIHByaXZhdGUgX3J0RXZ0VGFzazogVGFza0Jhc2U7XHJcblxyXG4gIHByaXZhdGUgX3N1YmZvcm1UYXNrSWQ6IHN0cmluZzsgLy8gdGhlIHRhc2sgaWQgb2YgdGhlIHN1YiBmb3JtIHRhc2sgKGlmIHRoaXNcclxuICBwcml2YXRlIF9zdWJmb3JtVGFzazogVGFza0Jhc2U7IC8vIHJlZmVyZW5jZSB0byB0YXNrIG9mIHRoZSBzdWIgZm9ybSB0YXNrXHJcblxyXG4gIElzSW50ZXJhY3RpdmVVcGRhdGU6IGJvb2xlYW47IC8vIHRydWUgaWYgdGhpcyBjb250cm9sIHdhcyBtb2RpZmllZCBieSB1c2VyXHJcbiAgcHJpdmF0ZSByZWZyZXNoT25TdHJpbmc6IHN0cmluZzsgLy8gT25seSBmb3Igb2ZmbGluZS4gR2V0IGl0IGZyb20gWE1MIGFuZCBwdXQgaXQgb24gdGhlIHN1YmZvcm0gdGFzayB3aGVuIHRoZSBzdWJmb3JtIHRhc2sgaXMgb3BlbmVkXHJcbiAgU3ViZm9ybUxvYWRlZDogYm9vbGVhbjsgLy8gdHJ1ZSwgaWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbG9hZGVkIGFscmVhZHlcclxuICBIYXNab29tSGFuZGxlcjogYm9vbGVhbjsgLy8gaWYgVFJVRSwgdGhlcmUgaXMgYSB6b29tIGhhbmRsZXIgb24gdGhpcyBjdHJsXHJcbiAgQXJnTGlzdDogQXJndW1lbnRzTGlzdDsgLy8gYXJndW1lbnQgbGlzdCBidWlsdCBmcm9tIHRoZSBwcm9wZXJ0eVxyXG5cclxuICBzdGF0aWMgUmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemUoKSB7XHJcbiAgICB0aGlzLl9mb2N1c2VkU3RvcEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5faW5Db250cm9sU3VmZml4ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9ydEV2dFRhc2sgPSBudWxsO1xyXG4gICAgdGhpcy5fc3ViZm9ybVRhc2tJZCA9IG51bGw7XHJcbiAgICB0aGlzLl9zdWJmb3JtVGFzayA9IG51bGw7XHJcbiAgICB0aGlzLklzSW50ZXJhY3RpdmVVcGRhdGUgPSBmYWxzZTtcclxuICAgIHRoaXMucmVmcmVzaE9uU3RyaW5nID0gbnVsbDtcclxuICAgIHRoaXMuU3ViZm9ybUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5IYXNab29tSGFuZGxlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5BcmdMaXN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IE1nQ29udHJvbFR5cGUpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHRhc2s6IFRhc2tCYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3Rvcih0eXBlPzogTWdDb250cm9sVHlwZSwgdGFza09yUGFyZW50TWdGb3JtPzogYW55LCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4PzogbnVtYmVyKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcclxuICAgICAgc3VwZXIoKTtcclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgKHR5cGUgPT09IG51bGwgfHwgdHlwZS5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAodGFza09yUGFyZW50TWdGb3JtID09PSBudWxsIHx8IHRhc2tPclBhcmVudE1nRm9ybSBpbnN0YW5jZW9mIFRhc2tCYXNlKSAmJiAocGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeCA9PT0gbnVsbCB8fCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKVxyXG4gICAgICBzdXBlcih0eXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0uZ2V0Rm9ybSgpLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICAgIGVsc2VcclxuICAgICAgc3VwZXIodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcclxuICB9XHJcblxyXG4gIEdldFZhckluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKDxEYXRhVmlldz5zdXBlci5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3KS5EdmNvdW50ICsgdGhpcy52ZWVJbmR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgYXJndW1lbnRzIGZyb20gdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpdElkeFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgZmlsbERhdGEobWdGb3JtOiBNZ0Zvcm1CYXNlLCBkaXRJZHg6IG51bWJlciwgcGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHN1cGVyLmZpbGxEYXRhKG1nRm9ybSwgZGl0SWR4LCBwYXJzZXIpO1xyXG4gICAgdGhpcy5BcmdMaXN0ID0gYXdhaXQgdGhpcy5HZXRBcmd1bWVudExpc3QoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGNvbnRyb2wgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW4gPSBzdXBlci5TZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZVN0cik7XHJcbiAgICBpZiAoIWlzVGFnUHJvY2Vzc2VkKSB7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1NVQkZPUk1fVEFTSzpcclxuICAgICAgICAgIHRoaXMuX3N1YmZvcm1UYXNrSWQgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRUZSRVNIT046XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hPblN0cmluZyA9IHZhbHVlU3RyLnRyaW0oKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBidWlsZCBBcmd1bWVudCBsaXN0IGZyb20gdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIEdldEFyZ3VtZW50TGlzdCgpOiBQcm9taXNlPEFyZ3VtZW50c0xpc3Q+IHtcclxuICAgIGxldCBhcmdMaXN0OiBBcmd1bWVudHNMaXN0ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9wcm9wVGFiID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gYXJnTGlzdDtcclxuICAgIGxldCBBcmdMaXN0UHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBUkFNRVRFUlMpO1xyXG4gICAgaWYgKEFyZ0xpc3RQcm9wID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gYXJnTGlzdDtcclxuXHJcbiAgICBsZXQgcGFybXM6IHN0cmluZyA9IGF3YWl0IEFyZ0xpc3RQcm9wLmdldFZhbHVlKCk7XHJcbiAgICBpZiAocGFybXMgIT09IG51bGwpIHtcclxuICAgICAgYXJnTGlzdCA9IG5ldyBBcmd1bWVudHNMaXN0KCk7XHJcbiAgICAgIGFyZ0xpc3QuZmlsbExpc3QocGFybXMsIDxUYXNrQmFzZT5zdXBlci5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgaWYgKHRoaXMucmVmcmVzaE9uU3RyaW5nICE9PSBudWxsKVxyXG4gICAgICAgIGFyZ0xpc3QuUmVmcmVzaE9uU3RyaW5nID0gdGhpcy5yZWZyZXNoT25TdHJpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJnTGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRyb2wgaXMgZGVzY2VuZGFudCBvZiB0aGUgcGFyZW50Rm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRGVzY2VuZGVudChwYXJlbnRGb3JtOiBNZ0Zvcm0pOiBib29sZWFuIHtcclxuICAgIGxldCBpc0Rlc2NlbmRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBjaGVja0N1cnJlbnRGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnN1cGVyLmdldEZvcm0oKTtcclxuXHJcbiAgICBEZWJ1Zy5Bc3NlcnQocGFyZW50Rm9ybSAhPT0gbnVsbCk7XHJcblxyXG4gICAgd2hpbGUgKCFpc0Rlc2NlbmRlbnQgJiYgY2hlY2tDdXJyZW50Rm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAocGFyZW50Rm9ybSA9PT0gY2hlY2tDdXJyZW50Rm9ybSlcclxuICAgICAgICBpc0Rlc2NlbmRlbnQgPSB0cnVlO1xyXG5cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT5jaGVja0N1cnJlbnRGb3JtLmdldFRhc2soKTtcclxuICAgICAgICBpZiAoY3VyclRhc2suZ2V0UGFyZW50KCkgIT09IG51bGwpXHJcbiAgICAgICAgICBjaGVja0N1cnJlbnRGb3JtID0gPE1nRm9ybT5jdXJyVGFzay5nZXRQYXJlbnQoKS5nZXRGb3JtKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc0Rlc2NlbmRlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVmcmVzaCBjb250cm9sIGRpc3BsYXkgaWYgaXQgaGFzIGEgcHJvcGVydHkgd2hpY2ggaXMgYW4gZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGFzeW5jIHJlZnJlc2hPbkV4cHJlc3Npb24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9ICh0aGlzLl9wcm9wVGFiID09PSBudWxsID8gMCA6IHRoaXMuX3Byb3BUYWIuZ2V0U2l6ZSgpKTtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eTtcclxuICAgIGxldCByZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHNpemUgJiYgIXJlZnJlc2g7IGkrKykge1xyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wKGkpO1xyXG5cclxuICAgICAgc3dpdGNoIChwcm9wLmdldElEKCkpIHtcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEE6XHJcbiAgICAgICAgICBpZiAoIXByb3AuaXNFeHByZXNzaW9uKCkgJiYgdGhpcy5fZmllbGQgIT09IG51bGwgJiYgdGhpcy5fZmllbGQuZ2V0VGFzaygpICE9PSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkpIHtcclxuICAgICAgICAgICAgcmVmcmVzaCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIC8qICBmYWxscyB0aHJvdWdoICovXHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQ6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRDpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBTkdFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBTlNMQVRPUjpcclxuICAgICAgICAgIGlmIChwcm9wLmlzRXhwcmVzc2lvbigpKVxyXG4gICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVmcmVzaClcclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbnZva2UoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaW52b2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBjb250cm9sIGlzIG5vdCB2aXNpYmxlLCBub3QgZW5hYmxlZCBvciBub3QgcGFya2FibGUgc2tpcCB0aGlzIGNvbnRyb2xcclxuICAgIGlmIChhd2FpdCB0aGlzLmlzUGFya2FibGUodHJ1ZSkpIHtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgIGludm9rZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGludm9rZWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpc1BhcmthYmxlKGNoZWNrRW5hYmxlZEFuZFZpc2libGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSAhc3VwZXIuaXNJbWFnZUNvbnRyb2woKTtcclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgYXdhaXQgc3VwZXIuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpO1xyXG5cclxuICAgICAgYXdhaXQgc3VwZXIuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBzdXBlci5pc1BhcmthYmxlKGNoZWNrRW5hYmxlZEFuZFZpc2libGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgc3ViZm9ybSB0YXNrIGlkIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTdWJmb3JtVGFza0lkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3ViZm9ybVRhc2tJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIHRoZSBzdWJmb3JtIHRhc2sgYWNjb3JkaW5nIHRvIGl0cyBpZCBhbmQgc2F2ZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5pdFN1YmZvcm1UYXNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHN1cGVyLmlzU3ViZm9ybSgpKVxyXG4gICAgICB0aGlzLl9zdWJmb3JtVGFzayA9IDxUYXNrQmFzZT5HdWlEYXRhQ29sbGVjdGlvbi5NR0RhdGFUYWJsZS5HZXRUYXNrQnlJRCh0aGlzLl9zdWJmb3JtVGFza0lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGNvbnRyb2wncyBwYXJlbnRUYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UGFyZW50VGFibGUoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiA8TWdDb250cm9sPnRoaXMuX3BhcmVudFRhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgYW5kIGRpc3BsYXkgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgY29udHJvbCB1c2VkIHdoZW4gdGhlIGNvbnRyb2wgaXMgbm90IG1vZGlmaWFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlc3RvcmVPbGRWYWx1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbClcclxuICAgICAgYXdhaXQgKDxGaWVsZD50aGlzLl9maWVsZCkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHN1cGVyLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICBhd2FpdCBzdXBlci5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGF3YWl0IHRoaXMuZ2V0TWdWYWx1ZSh0aGlzLlZhbHVlKSwgdGhpcy5Jc051bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGV2ZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFJ0RXZ0VGFzayhjdXJUYXNrOiBUYXNrQmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fcnRFdnRUYXNrID0gY3VyVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBldmVudCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSdEV2dFRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3J0RXZ0VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBzdWJmb3JtIHRhc2sgaWQgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN1YmZvcm1UYXNrSWQodGFza0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1YmZvcm1UYXNrSWQgPSB0YXNrSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBzdG9wRXhlY3V0aW9uIGZsYWcgaW4gdGhlIGVuZCBvZiBoYW5kbGUgZm9jdXMgb24gdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNGb2N1c2VkU3RvcEV4ZWN1dGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mb2N1c2VkU3RvcEV4ZWN1dGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1lbWJlciBzdG9wRXhlY3V0aW9uIGZsYWcgaW4gdGhlIGVuZCBvZiBoYW5kbGUgZm9jdXMgb24gdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9jdXNlZFN0b3BFeGVjdXRpb25cIj48L3BhcmFtPlxyXG4gIHNldEZvY3VzZWRTdG9wRXhlY3V0aW9uKGZvY3VzZWRTdG9wRXhlY3V0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb2N1c2VkU3RvcEV4ZWN1dGlvbiA9IGZvY3VzZWRTdG9wRXhlY3V0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsLVwiPlRoZSBjdHJsIHRvIGNoZWNrLiBjYW4gYmUgZnJhbWUgZm9ybSBhbmQgYWxzbyBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIG9uVGhlU2FtZVN1YkZvcm1Db250cm9sKGN0cmw6IE1nQ29udHJvbCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldFZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoY3RybCAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAoc3VwZXIuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpICYmIGN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgaWYgKHN1cGVyLmdldEZvcm0oKS5nZXRUYXNrKCkgPT09IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSlcclxuICAgICAgICAgIHJldFZhbHVlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRydWUgaWYgdGhlIGN0cmxzIGFyZSBvbiBkaWZmZXJlbnQgZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBvbkRpZmZGb3JtKGN0cmw6IE1nQ29udHJvbCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzU3ViZm9ybTogYm9vbGVhbiA9IHN1cGVyLmdldEZvcm0oKS5pc1N1YkZvcm0oKSB8fCBjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKTtcclxuICAgIGxldCBpc09uRGlmZkZvcm06IGJvb2xlYW4gPSAoaXNTdWJmb3JtICkgJiYgIXRoaXMub25UaGVTYW1lU3ViRm9ybUNvbnRyb2woY3RybCk7XHJcblxyXG4gICAgcmV0dXJuIGlzT25EaWZmRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cnVlIGlmIGNvbnRyb2wgaXMgaW4gY29udHJvbCBzdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNJbkNvbnRyb2xTdWZmaXgoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5Db250cm9sU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0cnVlIGlmIGNvbnRyb2wgaXMgaW4gY29udHJvbCBzdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Db250cm9sU3VmZml4XCI+PC9wYXJhbT5cclxuICBzZXRJbkNvbnRyb2xTdWZmaXgoaW5Db250cm9sU3VmZml4OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbkNvbnRyb2xTdWZmaXggPSBpbkNvbnRyb2xTdWZmaXg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRyb2wgaGFzIHNlbGVjdCBwcm9ncmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYXNTZWxlY3RQcm9ncmFtKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IEhhc1NlbGVjdFByb2dyYW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzZWxlY3RQcm9nUHJvcDogUHJvcGVydHkgPSBzdXBlci5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVF9QUk9HUkFNKTtcclxuICAgIGlmIChzZWxlY3RQcm9nUHJvcCAhPT0gbnVsbCAmJiBzZWxlY3RQcm9nUHJvcC5HZXRDb21wdXRlZFZhbHVlKCkgIT09IG51bGwpXHJcbiAgICAgIEhhc1NlbGVjdFByb2dyYW0gPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiBIYXNTZWxlY3RQcm9ncmFtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoZSBjb250cm9sIHVzZSB0aGUgaGFuZGxlciBaT09NIChmb3Igc2VsZWN0IHByb2dyYW0gb3IgWm9vbSBoYW5kbGVyKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICB1c2Vab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkhhc1pvb21IYW5kbGVyIHx8IChzdXBlci5nZXRGaWVsZCgpICE9PSBudWxsICYmICgoPEZpZWxkPnN1cGVyLmdldEZpZWxkKCkpLmdldEhhc1pvb21IYW5kbGVyKCkgfHwgKHRoaXMuSGFzU2VsZWN0UHJvZ3JhbSgpKSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZSBib29sZWFuIHByb3BlcnR5KGV4OnZpc2libGVcXGVuYWJsZSkgb2YgY29udHJvbCBhbmQgaXQncyBjaGlsZHJlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5wcm9wZXJ0eSBpZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj5jb21tYW5kIHR5cGUgdGhhdCBiZWxvbmcgdG8gdGhlIHByb3AgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVwZGF0ZVRoaXNcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHVwZGF0ZVByb3BlcnR5TG9naWNOZXN0aW5nKHByb3BJZDogbnVtYmVyLCBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUsIHZhbDogYm9vbGVhbiwgdXBkYXRlVGhpczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHZhbCAmJiBzdXBlci5oYXZlVG9DaGVja1BhcmVudFZhbHVlKCkpXHJcbiAgICAgIHZhbCA9IHN1cGVyLmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCk7XHJcblxyXG4gICAgLy8gaWYgdGhlIHN1YmZvcm0gbXVzdCBiZSBpbnZpc2libGUgKENUUkxfU1VCRk9STV9OT05FKSB3ZSBjaGFuZ2UgaXRzIHZpc2liaWxpdHkgdG8gZmFsc2VcclxuICAgIGlmICh2YWwgJiYgc3VwZXIuaXNTdWJmb3JtKCkgJiYgY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUgJiYgdGhpcy5TaG91bGRTZXRTdWJmb3JtSW52aXNpYmxlKCkpXHJcbiAgICAgIHZhbCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh1cGRhdGVUaGlzKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgc3VwZXIuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kVHlwZSA9PT0gQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSA/IEh0bWxQcm9wZXJ0aWVzLlZpc2libGUgOiBIdG1sUHJvcGVydGllcy5FbmFibGVkLCB2YWwpO1xyXG5cclxuICAgIH1cclxuICAgIGF3YWl0IHN1cGVyLnVwZGF0ZUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIHZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIElmIHRoZSBzdWJmb3JtIG11c3QgYmUgaW52aXNpYmxlIChmb3IgZXhhbXBsZSBDVFJMX1NVQkZPUk1fTk9ORSkgcmV0dXJucyB0cnVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNldFN1YmZvcm1JbnZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2V0SW52aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc3ViZm9ybVR5cGU6IFN1YmZvcm1UeXBlID0gPFN1YmZvcm1UeXBlPnN1cGVyLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFKS5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgaWYgKHN1YmZvcm1UeXBlID09PSBTdWJmb3JtVHlwZS5Ob25lICYmIHRoaXMuZ2V0U3ViZm9ybVRhc2tJZCgpID09PSBudWxsKVxyXG4gICAgICBzZXRJbnZpc2libGUgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHNldEludmlzaWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGVzIHZpc2liaWxpdHkgb3IgZW5hYmxlIHByb3BlcnR5IG9mIHN1YmZvcm0gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+SWQgb2YgdmlzaWJpbGl0eSBvciBlbmFibGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj50eXBlIG9mIHRoZSBHVUkgY29tbWFuZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj52YWx1ZSBmb3IgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBhc3luYyB1cGRhdGVTdWJmb3JtQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoc3VwZXIuaXNTdWJmb3JtKCkpO1xyXG5cclxuICAgIGlmICghKDxUYXNrQmFzZT5zdXBlci5nZXRGb3JtKCkuZ2V0VGFzaygpKS5BZnRlckZpcnN0UmVjb3JkUHJlZml4KVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IHN1YmZvcm1UeXBlOiBTdWJmb3JtVHlwZSA9IDxTdWJmb3JtVHlwZT5zdXBlci5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NVQkZPUk1fVFlQRSkuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgIGlmICh0aGlzLl9zdWJmb3JtVGFza0lkICE9PSBudWxsIHx8IHN1YmZvcm1UeXBlID09PSBTdWJmb3JtVHlwZS5Ob25lKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zdWJmb3JtVGFzayAhPT0gbnVsbCAmJiB0aGlzLl9zdWJmb3JtVGFzay5pc1N0YXJ0ZWQoKSkge1xyXG4gICAgICAgIHRoaXMuU3ViZm9ybUxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNvbW1hbmRUeXBlID09PSBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFICYmIHZhbCAmJiB0aGlzLlJlZnJlc2hPblZpc2libGUpIHtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaE9uVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgYXdhaXQgKDxUYXNrQmFzZT5zdXBlci5nZXRGb3JtKCkuZ2V0VGFzaygpKS5TdWJmb3JtUmVmcmVzaCh0aGlzLl9zdWJmb3JtVGFzaywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3ViZm9ybUZvcm06IE1nRm9ybUJhc2UgPSB0aGlzLl9zdWJmb3JtVGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YmZvcm1Gb3JtLmdldEN0cmxDb3VudCgpOyBpKyspIHtcclxuICAgICAgICAgIGxldCBjaGlsZDogTWdDb250cm9sQmFzZSA9IHN1YmZvcm1Gb3JtLmdldEN0cmwoaSk7XHJcbiAgICAgICAgICAvLyBRQ1IgIzk4MTU1NSwgV2Ugc2hvdWxkIG5vdCBhZmZlY3QgdmlzaWJpbGl0eSBvZiB0aGUgVGFibGVDb2x1bW5zIHNpbmNlIGl0IGlzIG1hbmFnZWQgYnkgdGhlIHRhYmxlLlNldHRpbmcgdmlzaWJpbGl0eVxyXG4gICAgICAgICAgLy8gb2YgYWxsIGNvbHVtbnMgdG8gZmFsc2UgcHJldmVudHMgdGFibGUgcGxhY2VtZW50XHJcbiAgICAgICAgICBpZiAoIWNoaWxkLmlzQ29sdW1uQ29udHJvbCgpKVxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIGxldCBjaGlsZFZhbHVlOiBib29sZWFuID0gYXdhaXQgY2hpbGQuY2hlY2tQcm9wKHByb3BJZCwgdHJ1ZSkgJiYgdmFsO1xyXG4gICAgICAgICAgaWYgKGNoaWxkVmFsdWUpXHJcbiAgICAgICAgICAgIGNoaWxkVmFsdWUgPSBjaGlsZC5pc1BhcmVudFByb3BWYWx1ZShwcm9wSWQpO1xyXG5cclxuICAgICAgICAgIC8vIGlmICh0aGlzLl9zdWJmb3JtVGFzay5pc1N0YXJ0ZWQoKSlcclxuICAgICAgICAgIC8vICAgQ29tbWFuZHMuYWRkQXN5bmMoY29tbWFuZFR5cGUsIGNoaWxkLCBjaGlsZC5nZXREaXNwbGF5TGluZShmYWxzZSksIGNoaWxkVmFsdWUpO1xyXG4gICAgICAgICAgYXdhaXQgY2hpbGQudXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgY2hpbGRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgoY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUgJiYgdmFsKSAmJiAhdGhpcy5TdWJmb3JtTG9hZGVkKSB7XHJcbiAgICAgIHRoaXMuU3ViZm9ybUxvYWRlZCA9IHRydWU7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9PUEVOKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0IHN1YmZvcm0gdGFzayBpZCBmb3IgYSBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRTdWJmb3JtVGFzaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGJlaGF2aW91ciBmb3IgdGhlIHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0VGFibGVCZWhhdmlvdXIoKTogVGFibGVCZWhhdmlvdXIge1xyXG4gICAgcmV0dXJuIFRhYmxlQmVoYXZpb3VyLlVubGltaXRlZEl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHZhbGlkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhbmQgc2V0IGl0J3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiTmV3VmFsdWVcIj50aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidXBkYXRlQ3RybFwiPmlmIHRydWUgdGhlbiB0aGUgY29udHJvbCB3aWxsIGJlIHVwZGF0ZWQgdXBvbiBzdWNjZXNzZnVsIGNoZWNrPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+cmV0dXJucyBpZiB2YWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWw8L3JldHVybnM+XHJcbiAgYXN5bmMgdmFsaWRhdGVBbmRTZXRWYWx1ZShOZXdWYWx1ZTogYW55LCB1cGRhdGVDdHJsOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBzdXBlci5VcGRhdGVNb2RpZmllZEJ5VXNlcihOZXdWYWx1ZSk7XHJcblxyXG4gICAgLy8gaWYgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGlzIG51bGwgb3Igd2FzIGNoYW5nZWRcclxuICAgIC8vIGNoZWNrIHZhbGlkYXRpb24gYW5kIHVwZGF0ZSB0aGUgY29udHJvbCB2YWx1ZVxyXG4gICAgaWYgKHRoaXMuTW9kaWZpZWRCeVVzZXIpIHtcclxuICAgICAgbGV0IGN0cmxDdXJyVmFsdWU6IGFueSA9IHRoaXMuVmFsdWU7XHJcbiAgICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcblxyXG4gICAgICBpZiAoc3VwZXIuZ2V0UElDKCkgPT09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIHZkID0gc3VwZXIuYnVpbGRQaWN0dXJlKGN0cmxDdXJyVmFsdWUsIE5ld1ZhbHVlKTtcclxuXHJcbiAgICAgIHZkLmV2YWx1YXRlKCk7XHJcblxyXG4gICAgICAvLyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRzIHZhbHVlIHdhcyB3cm9uZ1xyXG4gICAgICBpZiAodmQuVmFsaWRhdGlvbkZhaWxlZCkge1xyXG4gICAgICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuSXNJbnRlcmFjdGl2ZVVwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgICBzdXBlci5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldERhdGFTeW5jZWQoZmFsc2UpO1xyXG5cclxuICAgICAgLy8gc2V0IHRoZSB2YWx1ZSAoaGFuZGxlIHJlY29tcHV0ZSwgZXRjLilcclxuICAgICAgaWYgKHVwZGF0ZUN0cmwpIHtcclxuICAgICAgICAvLyBRQ1IjNDQxMDIwOkFmdGVyIHZhbGlkYXRpbmcgZGlzcGxheSB2YWx1ZSwgdGFrZSB0aGUgc2FtZSBjdHJsJ3MgdmFsdWUgZm9yIG1nIHZhbHVlIGNvbnZlcnNpb24uXHJcbiAgICAgICAgLy8gVXNpbmcgZGlzcGxheSB2YWx1ZSBnZW5lcmF0ZWQgZnJvbSBNZ1ZhbHVlLCBtaWdodCBoYXZlIHByb2JsZW0gdG8gY29udmVydCBiYWNrIHRvIE1nVmFsIHVzaW5nIHBpY3R1cmUgZHVlIHRvIGFsaWdubWVudCAoY2hhbmdlZCBhbGlnbm1lbnQgKS5cclxuICAgICAgICAvLyBUaGlzIHByb2JsZW0gb2NjdXJzIGZvciBudW1lcmljLlxyXG4gICAgICAgIC8vIFRoZSBmaXggc2hvdWxkIGJlIGFwcGxpY2FibGUgZm9yIG51bWVyaWMgdHlwZSBvbmx5LiBCZWNhdXNlIGRhdGUgYW5kIHRpbWUgZmllbGQgd2l0aCBjb21wbGV4IG1hc2tpbmcgaGF2ZSBwcm9ibGVtIG9uIHVzaW5nIGN0cmwncyB2YWx1ZS5cclxuICAgICAgICAvLyBSZWZlciBkYXRlIHFjcnM6ICMyOTE2NjYsICMzMDczNTMsICM0MzQyNDEgYW5kIGZvciB0aW1lLCBjaGVjayBkZWZhdWx0IHZhbHVlIHdoZW4gZm9ybWF0IGlzICdISC1NTS1TUyBQTVpAJ1xyXG4gICAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyAmJiB0eXBlb2YgTmV3VmFsdWUgPT09ICdzdHJpbmcnICYmIE5ld1ZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgdmQuc2V0VmFsdWUoTmV3VmFsdWUpO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLnNldFZhbHVlKHZkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSB1c2VyIGlucHV0IGFmdGVyIHZhbGlkYXRpb24gYW5kIHVwZGF0ZSB0aGUgZmllbGQgY29ubmVjdGVkIHRvIHRoaXNcclxuICAvLy8gICBjb250cm9sIChpZiBleGlzdHMpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZkXCI+dGhlIHZhbGlkYXRpb24gZGV0YWlscyBvYmplY3Q8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2V0VmFsdWUodmQ6IFZhbGlkYXRpb25EZXRhaWxzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgaXNOdWxsOiBib29sZWFuID0gdmQuZ2V0SXNOdWxsKCk7XHJcbiAgICBsZXQgbmV3VmFsdWU6IGFueSA9IHZkLmdldERpc3BWYWx1ZSgpO1xyXG4gICAgbGV0IG1nVmFsOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKCFpc051bGwgfHwgIXRoaXMuX2ZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSlcclxuICAgICAgbWdWYWwgPSBhd2FpdCBzdXBlci5nZXRNZ1ZhbHVlKG5ld1ZhbHVlKTtcclxuICAgIC8vIGl0J3MgaW5uZXIgdmFsdWUgLT4gdHJhbnNsYXRlIGl0IHRvIHRoZSBkaXNwbGF5XHJcbiAgICBlbHNlXHJcbiAgICAgIG1nVmFsID0gKCh0aGlzLl9maWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gdGhpcy5fZmllbGQuZ2V0Q2VsbERlZnVhbHRWYWx1ZSgpIDogdGhpcy5fZmllbGQuZ2V0RGVmYXVsdFZhbHVlKCkpO1xyXG4gICAgaWYgKG1nVmFsICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiAoIShuZXdWYWx1ZSA9PT0gdGhpcy5WYWx1ZSkgfHwgdGhpcy5LZXlTdHJva2VPbiB8fCB0aGlzLklzTnVsbCAhPT0gaXNOdWxsKSkge1xyXG4gICAgICAgIGF3YWl0ICg8RmllbGQ+dGhpcy5fZmllbGQpLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUobWdWYWwsIGlzTnVsbCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAvLyBkZWZlY3QgMTI3NzM0IDogdmFsdWUgb2YgdGhlIGZpZWxkIG1pZ2h0IGJlIGNoYW5nZWQgYWxyZWFkeSBpbnNpZGUgYSBjb250cm9sIGNoYW5nZSBoYW5kbGVyXHJcbiAgICAgICAgLy8gdG8gYXZvaWQgdXBkYXRpbmcgb2xkIHZhbHVlIGFuZCBvdmVycnVubmluZyB0aGUgdmFsdWUgZnIwbSB0aGUgY29udHJvbCBjaGFuZ2VcclxuICAgICAgICAvLyBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGZpZWxkLiAobmVlZCB0byBiZSBkb25lIGZvciBjb21ibyBhbmQgbGlzdCBib3gsIGJ1dCBpdCdzIHRvbyByaXNreVxyXG4gICAgICAgIC8vIGFuZCB1bmxpa2VseSB0byBoYXBwZW4sIHNvIHRoZSBmaXggd2lsbCBiZSBmb3IgY2hlY2sgYm94IG9ubHkpXHJcblxyXG4gICAgICAgIGlmIChzdXBlci5pc0NoZWNrQm94KCkpIHtcclxuICAgICAgICAgIHRoaXMuZm9yY2VSZWZyZXNoID0gdHJ1ZTtcclxuICAgICAgICAgIG1nVmFsID0gKDxGaWVsZD50aGlzLl9maWVsZCkuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgZmllbGQgdmFsdWUgaXMgbnVsbCAmIGhhcyBudWxsIGRpc3BsYXkgdmFsdWUsIHRha2UgZXZhbHVhdGVkIG51bGwgZGlzcGxheSB2YWx1ZS5cclxuICAgICAgaWYgKCh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiBpc051bGwpICYmIHRoaXMuX2ZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSlcclxuICAgICAgICBtZ1ZhbCA9IG5ld1ZhbHVlO1xyXG5cclxuICAgICAgYXdhaXQgc3VwZXIuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbCwgaXNOdWxsKTtcclxuICAgICAgdGhpcy5mb3JjZVJlZnJlc2ggPSBmYWxzZTtcclxuICAgICAgLy8gUUNSICM0Mzg3NTMuIFByZXZlbnQgUlAmUlMgY3ljbGUsIHdoZW4gaXQncyBub3QgbmVlZGVkLlxyXG4gICAgICB0aGlzLktleVN0cm9rZU9uID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJlZnJlc2ggdGhlIGl0ZW0gbGlzdCBvZiByYWRpbyBidXR0b24gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4ZWNDb21wdXRlQ2hvaWNlXCI+PC9wYXJhbT5cclxuICBhc3luYyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0Rm9yUmFkaW9CdXR0b24obGluZTogbnVtYmVyLCBleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgc3VwZXIucmVmcmVzaEFuZFNldEl0ZW1zTGlzdEZvclJhZGlvQnV0dG9uKGxpbmUsIGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgcGFya2luZyB3YXMgb24gdGhlIHJhZGlvIGNvbnRyb2wsIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGZvY3VzIGJlY2F1c2VcclxuICAgIC8vIHRoZSBvbGQgY29udHJvbHMgd2VyZSBkaXNwb3NlZCBhbmQgdGhlIG5ldyBvbmVzIGFyZSBjcmVhdGVkLlxyXG4gICAgbGV0IGxhc3RGb2N1c2VkVGFzazogVGFza0Jhc2UgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCg8VGFza0Jhc2U+c3VwZXIuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKSk7XHJcbiAgICAvLyBpZiAobGFzdEZvY3VzZWRUYXNrICE9PSBudWxsICYmIHRoaXMgPT09IGxhc3RGb2N1c2VkVGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKVxyXG4gICAgLy8gICBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5TRVRfRk9DVVMsIHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHN1YmZvcm0gdGFzayBvZiB0aGlzIHN1YmZvcm0gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U3ViZm9ybVRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1YmZvcm1UYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHN1YmZvcm0gdGFzayBvZiB0aGlzIHN1YmZvcm0gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRTdWJmb3JtVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1YmZvcm1UYXNrID0gbnVsbDtcclxuICAgIHRoaXMuX3N1YmZvcm1UYXNrSWQgPSBcIjBcIjtcclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIE1nRm9ybSBvZiB0aGUgc3ViZm9ybSBjb250cm9sIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldFN1YmZvcm1NZ0Zvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5fc3ViZm9ybVRhc2sgIT09IG51bGwpXHJcbiAgICAgIGZvcm0gPSB0aGlzLl9zdWJmb3JtVGFzay5nZXRGb3JtKCk7XHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgd2hldGhlciB0YWJsZSBiZWluZyB1c2VkIHdpdGggYWJzb2x1dGUgc2Nyb2xsYmFyIHRodW1iLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpOiBib29sZWFuIHtcclxuICAgIGxldCB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUsIFwiSW4gTWdDb250cm9sLklzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogTm90IGEgdGFibGUgY29udHJvbC5cIik7XHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYi5wcm9wRXhpc3RzKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVJfVEhVTUIpKVxyXG4gICAgICB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhciA9ICh0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVJfVEhVTUIpLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCkgPT09IDxudW1iZXI+U2Nyb2xsQmFyVGh1bWJUeXBlLkFic29sdXRlKTtcclxuXHJcbiAgICByZXR1cm4gdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBjaGVjayBpZiB0aGUgcmV0dXJuLXRvLWNvbnRyb2wgcG9pbnRzIHRvIGFuIGV4aXN0aW5nIHRhc2suPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyB2YWxpZFJldHVyblRvQ3RybCgpOiBib29sZWFuIHtcclxuICAgIGlmIChNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsICE9PSBudWxsICYmIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2sgaWYgb25lIG1heSBkaXJlY3RseSAobm90IHZpYSB0aGUgZ3VpKSBzZXQgYSB2YWx1ZSBvbiB0aGlzIGNvbnRyb2wuPC9zdW1tYXJ5PlxyXG4gIG1heVNldFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgc3dpdGNoICh0aGlzLlR5cGUpIHtcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWDpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1Q6XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU86XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJldmVudCB2YWx1ZSBzZXR0aW5nIGlmIHRoZSBjb250cm9sIGRvZXNuJ3QgaGF2ZSBhIGZpZWxkLCBvciBpZiBpdCBnZXRzIGl0cyB2YWx1ZSBmcm9tIGFuIGV4cHJlc3Npb25cclxuICAgIGlmICh0aGlzLl9maWVsZCA9PT0gbnVsbCB8fCB0aGlzLl92YWxFeHBJZCA+IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5pc01vZGlmaWFibGUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVja3MgaWYgYSB2YWx1ZSBtYXkgYmUgc2V0LCBhbmQgdHJpZXMgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJOZXdWYWx1ZVwiPnRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1cGRhdGVDdHJsXCI+aWYgdHJ1ZSB0aGVuIHRoZSBjb250cm9sIHdpbGwgYmUgdXBkYXRlZCB1cG9uIHN1Y2Nlc3NmdWwgY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5yZXR1cm5zIGlmIHZhbHVlIHNldHRpbmcgd2FzIHN1Y2Nlc3NmdWwgPC9yZXR1cm5zPlxyXG4gIGFzeW5jIHZhbGlkYXRlQW5kU2V0VmFsdWVJZkFsbG93ZWQoTmV3VmFsdWU6IGFueSwgcmVmcmVzaERpc3BsYXk6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghdGhpcy5tYXlTZXRWYWx1ZSgpKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJVbmFibGUgdG8gY2hhbmdlIHZhbHVlIG9mIGNvbnRyb2wgezB9OiBUaGUgY29udHJvbCBpcyByZWFkLW9ubHkuXCIsIHRoaXMuTmFtZSkpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJldFZhbCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRTZXRWYWx1ZShOZXdWYWx1ZSwgdHJ1ZSk7XHJcbiAgICBpZiAoIXJldFZhbClcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlZhbHVlIHZhbGlkYXRpb24gZmFpbGVkIGZvciB7MH0uXCIsIHRoaXMuTmFtZSkpO1xyXG5cclxuICAgIGlmIChyZWZyZXNoRGlzcGxheSkge1xyXG4gICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgICAgIENvbW1hbmRzLmludm9rZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vcmVmcmVzaCB0YXNrXHJcbiAgICByZXR1cm4gcmV0VmFsO1xyXG4gIH1cclxufVxyXG4iXX0=