@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,372 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { PropInterface, PropTable } from "@magic-xpa/gui";
3
- import { FieldBase } from "../data/FieldBase";
4
- import { List } from "@magic-xpa/mscorelib";
5
- import { CommandsProcessorBase_SendingInstruction } from "../CommandsProcessorBase";
6
- import { Constants, InternalInterface, Logger, XMLConstants, XmlParser } from "@magic-xpa/utils";
7
- import { Record } from "../data/Record";
8
- import { CommandFactory } from "../commands/ClientToServer/CommandFactory";
9
- import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
10
- import { DataviewHeaderBase } from "./DataviewHeaderBase";
11
- import { FlowMonitorQueue } from "../util/FlowMonitorQueue";
12
- import { ConstInterface } from "../ConstInterface";
13
- import { Environment } from "../env/Environment";
14
- import { AccessHelper } from "../AccessHelper";
15
- export var Recompute_RcmpBy;
16
- (function (Recompute_RcmpBy) {
17
- Recompute_RcmpBy["CLIENT"] = "C";
18
- Recompute_RcmpBy["SERVER_ON_CHANGE"] = "O";
19
- })(Recompute_RcmpBy || (Recompute_RcmpBy = {}));
20
- export class Recompute {
21
- constructor() {
22
- this._ctrlProps = null;
23
- this._formProps = null;
24
- this._isOwnerFld = true;
25
- this.OwnerFld = null;
26
- this._rcmpOrder = null;
27
- this._subForms = null;
28
- this._subFormsOnlyRecomp = false;
29
- this._hasServerLinksRecomputes = false;
30
- this.RcmpMode = null;
31
- this.Task = null;
32
- }
33
- fillData(dataView, taskRef, parser) {
34
- this.Task = taskRef;
35
- this._isOwnerFld = true;
36
- while (this.initInnerObjects(parser, parser.getNextTag(), dataView)) {
37
- }
38
- }
39
- initInnerObjects(parser, foundTagName, dataView) {
40
- switch (foundTagName) {
41
- case XMLConstants.MG_TAG_FLD:
42
- if (this._isOwnerFld) {
43
- this.fillFldField(parser, dataView);
44
- this._isOwnerFld = false;
45
- }
46
- else
47
- this.fillFldField(parser, dataView);
48
- break;
49
- case ConstInterface.MG_TAG_LINK:
50
- this.fillLink(parser, dataView);
51
- break;
52
- case XMLConstants.MG_TAG_CONTROL:
53
- if (this._ctrlProps == null)
54
- this._ctrlProps = new PropTable();
55
- this._ctrlProps.fillDataByExists(this.Task, parser);
56
- if (this._ctrlProps.getCtrlRef() != null && this._ctrlProps.getCtrlRef().IsRepeatable && this.OwnerFld.IsVirtual &&
57
- !(this.OwnerFld.hasInitExp()))
58
- this.OwnerFld.causeTableInvalidation(true);
59
- break;
60
- case XMLConstants.MG_TAG_FORM_PROPERTIES:
61
- if (this._formProps == null)
62
- this._formProps = new PropTable();
63
- this._formProps.fillDataByExists(this.Task, parser);
64
- break;
65
- case ConstInterface.MG_TAG_FLD_END:
66
- parser.setCurrIndex2EndOfTag();
67
- return false;
68
- default:
69
- Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in Recompute. Insert else if to Recompute.initInnerObjects for " + foundTagName);
70
- return false;
71
- }
72
- return true;
73
- }
74
- AddRecomputeItem(item) {
75
- if (this._rcmpOrder === null)
76
- this._rcmpOrder = new List();
77
- this._rcmpOrder.push(item);
78
- }
79
- fillLink(parser, dataView) {
80
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
81
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
82
- let tag = parser.getXMLsubstring(endContext);
83
- parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_LINK) + ConstInterface.MG_TAG_LINK.length);
84
- let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
85
- for (let j = 0; j < tokensVector.length; j += 2) {
86
- let attribute = (tokensVector.get_Item(j));
87
- let valueStr = (tokensVector.get_Item(j + 1));
88
- if (attribute === XMLConstants.MG_ATTR_ID)
89
- this.AddRecomputeItem(dataView.getTask().getDataviewHeaders().getDataviewHeaderById(XmlParser.getInt(valueStr)));
90
- else
91
- Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in Recompute class. Insert case to Recompute.fillLink for " + attribute);
92
- }
93
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
94
- return;
95
- }
96
- else
97
- Logger.Instance.WriteExceptionToLogWithMsg("in Recompute.fillLink() out of bounds");
98
- }
99
- fillFldField(parser, dataView) {
100
- let endContext = parser.getXMLdata().indexOf(this._isOwnerFld
101
- ? XMLConstants.TAG_CLOSE
102
- : XMLConstants.TAG_TERM, parser.getCurrIndex());
103
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
104
- let tag = parser.getXMLsubstring(endContext);
105
- parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_FLD) + XMLConstants.MG_TAG_FLD.length);
106
- let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
107
- this.initElements(tokensVector, dataView);
108
- if (this._isOwnerFld) {
109
- parser.setCurrIndex(++endContext);
110
- return;
111
- }
112
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
113
- return;
114
- }
115
- Logger.Instance.WriteExceptionToLogWithMsg("in Command.FillData() out of bounds");
116
- }
117
- initElements(tokensVector, dataView) {
118
- for (let j = 0; j < tokensVector.length; j += 2) {
119
- let attribute = (tokensVector.get_Item(j));
120
- let valueStr = (tokensVector.get_Item(j + 1));
121
- switch (attribute) {
122
- case XMLConstants.MG_ATTR_ID: {
123
- let fldId = XmlParser.getInt(valueStr);
124
- let fld = dataView.getField(fldId);
125
- if (this._isOwnerFld) {
126
- this.OwnerFld = fld;
127
- this.OwnerFld.setRecompute(this);
128
- }
129
- else {
130
- fld.setRecomputed();
131
- this.AddRecomputeItem(fld);
132
- }
133
- break;
134
- }
135
- case ConstInterface.MG_ATTR_RECOMPUTEBY:
136
- this.RcmpMode = valueStr[0];
137
- break;
138
- case ConstInterface.MG_ATTR_SUB_FORM_RCMP:
139
- this._subFormsOnlyRecomp = true;
140
- break;
141
- case ConstInterface.MG_ATTR_HAS_LINK_RECOMPUTES:
142
- this._hasServerLinksRecomputes = true;
143
- break;
144
- case XMLConstants.MG_ATTR_NAME:
145
- break;
146
- default:
147
- Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in Recompute class. Insert case to Recompute.initElements for " + attribute);
148
- break;
149
- }
150
- }
151
- }
152
- execute(rec) {
153
- return __awaiter(this, void 0, void 0, function* () {
154
- let i;
155
- let fld;
156
- let cmdsToServer = this.Task.getMGData().CmdsToServer;
157
- let cmd;
158
- try {
159
- rec.setInRecompute(true);
160
- this.Task.SetInRecompute(true);
161
- this.SetSubformsInRecompute(true);
162
- let allowServerRecompute = this._hasServerLinksRecomputes ||
163
- (this.Task.getForm().AllowedSubformRecompute && (yield this.checkRefreshSubForms()));
164
- if (this.RcmpMode !== Recompute_RcmpBy.CLIENT && allowServerRecompute) {
165
- let inClient = this._subFormsOnlyRecomp;
166
- this.Task.ExecuteClientSubformRefresh = false;
167
- if (inClient) {
168
- inClient = yield this.Task.prepareCache(true);
169
- if (inClient)
170
- inClient = yield this.Task.testAndSet(true);
171
- }
172
- if (!inClient) {
173
- this.Task.DataView.GetFieldsTab().setServerRcmp(true);
174
- cmd = CommandFactory.CreateRecomputeCommand(this.Task.getTaskTag(), this.OwnerFld.getId(), !this.Task.getForm().AllowedSubformRecompute);
175
- cmdsToServer.Add(cmd);
176
- yield RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
177
- }
178
- if (this.Task.ExecuteClientSubformRefresh)
179
- yield this.RefreshSubforms();
180
- else {
181
- if (yield this.recPrefixSubForms())
182
- yield this.recSuffixSubForms();
183
- this.Task.CleanDoSubformPrefixSuffix();
184
- }
185
- }
186
- else {
187
- try {
188
- FlowMonitorQueue.Instance.addRecompute(this.OwnerFld.getVarName(), this.Task.GetTaskDetails());
189
- if (this._formProps != null)
190
- yield this._formProps.RefreshDisplay(false, false);
191
- if (this._ctrlProps != null)
192
- yield this._ctrlProps.RefreshDisplay(false, false);
193
- if (this._rcmpOrder != null) {
194
- for (i = 0; i < this._rcmpOrder.length; i++) {
195
- if (this._rcmpOrder.get_Item(i) instanceof FieldBase) {
196
- fld = this._rcmpOrder.get_Item(i);
197
- yield this.fldRcmp(fld, true);
198
- }
199
- else if (this._rcmpOrder.get_Item(i) instanceof DataviewHeaderBase) {
200
- let curLnk = this._rcmpOrder.get_Item(i);
201
- yield curLnk.getLinkedRecord(rec);
202
- let linkFields = this.Task.DataView.GetFieldsTab().getLinkFields(curLnk.Id);
203
- rec.setInCompute(true);
204
- let saveInForceUpdate = rec.InForceUpdate;
205
- rec.InForceUpdate = false;
206
- for (let j = 0; j < linkFields.length; j++) {
207
- yield this.fldRcmp(linkFields.get_Item(j), false);
208
- rec.clearFlag((linkFields.get_Item(j)).getId(), Record.FLAG_UPDATED);
209
- rec.clearFlag((linkFields.get_Item(j)).getId(), Record.FLAG_MODIFIED);
210
- rec.clearFlag((linkFields.get_Item(j)).getId(), Record.FLAG_CRSR_MODIFIED);
211
- rec.clearHistoryFlag((linkFields.get_Item(j)).getId());
212
- }
213
- rec.InForceUpdate = saveInForceUpdate;
214
- let retFld = curLnk.ReturnField;
215
- if (retFld != null)
216
- yield this.fldRcmp(retFld, false);
217
- rec.setInCompute(false);
218
- rec.setForceSaveOrg(true);
219
- }
220
- }
221
- }
222
- yield this.RefreshSubforms();
223
- }
224
- catch (e) {
225
- Logger.Instance.WriteExceptionToLogWithMsg("in Recompute.execute(): " + e.Message);
226
- }
227
- }
228
- this.Task.SetInRecompute(false);
229
- this.SetSubformsInRecompute(false);
230
- }
231
- finally {
232
- rec.buildLinksPosStr();
233
- rec.setInRecompute(false);
234
- }
235
- });
236
- }
237
- RefreshSubforms() {
238
- return __awaiter(this, void 0, void 0, function* () {
239
- if (this.Task.getForm().AllowedSubformRecompute) {
240
- let subformsToRefresh = yield this.GetSubformsToRefresh();
241
- for (let i = 0; i < subformsToRefresh.length; i++) {
242
- let subformTask = subformsToRefresh.get_Item(i);
243
- yield this.Task.SubformRefresh(subformTask, true);
244
- }
245
- }
246
- });
247
- }
248
- SetSubformsInRecompute(inRecompute) {
249
- return __awaiter(this, void 0, void 0, function* () {
250
- let subformsToRefresh = yield this.GetSubformsToRefresh();
251
- for (let i = 0; i < subformsToRefresh.length; i++) {
252
- let subformTask = subformsToRefresh.get_Item(i);
253
- subformTask.SetInRecompute(inRecompute);
254
- }
255
- });
256
- }
257
- fldRcmp(fld, computeField) {
258
- return __awaiter(this, void 0, void 0, function* () {
259
- if (fld.IsVirtual
260
- || ((this.Task.getMode() !== Constants.TASK_MODE_QUERY ||
261
- Environment.Instance.allowUpdateInQueryMode(this.Task.getCompIdx())))) {
262
- if (!fld.isInEvalProcess()) {
263
- if (computeField)
264
- yield fld.compute(true);
265
- else
266
- yield fld.setValueAndStartRecompute(fld.getValue(false), fld.isNull(), true, false, false);
267
- yield fld.updateDisplay();
268
- }
269
- }
270
- });
271
- }
272
- buildSubFormList() {
273
- if (this._subForms === null) {
274
- this._subForms = new List();
275
- let subTasksTab = this.Task.getSubTasks();
276
- if (subTasksTab !== null) {
277
- for (let i = 0; i < subTasksTab.getSize(); i = i + 1) {
278
- let subForm = subTasksTab.getTask(i);
279
- if (subForm.getForm().getSubFormCtrl() !== null && subForm.refreshesOn(this.OwnerFld.getId())) {
280
- this._subForms.push(subForm);
281
- }
282
- }
283
- }
284
- }
285
- }
286
- RemoveSubform(subformTask) {
287
- this._subForms.Remove(subformTask);
288
- }
289
- AddSubform(subformTask) {
290
- if (this._subForms === null)
291
- this._subForms = new List();
292
- if (!this._subForms.Contains(subformTask))
293
- this._subForms.push(subformTask);
294
- }
295
- recSuffixSubForms() {
296
- return __awaiter(this, void 0, void 0, function* () {
297
- let i;
298
- let subForm;
299
- let successful = true;
300
- let subformCtrl;
301
- this.buildSubFormList();
302
- for (i = 0; successful && i < this._subForms.length; i++) {
303
- subForm = this._subForms.get_Item(i);
304
- subformCtrl = subForm.getForm().getSubFormCtrl();
305
- if (subForm.isStarted() && !subformCtrl.RefreshOnVisible &&
306
- (yield subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true)) && !subForm.InSelect
307
- && subForm.DoSubformPrefixSuffix) {
308
- yield AccessHelper.eventsManager.handleInternalEventWithTask(subForm, InternalInterface.MG_ACT_REC_SUFFIX);
309
- successful = !AccessHelper.eventsManager.GetStopExecutionFlag();
310
- }
311
- }
312
- this.Task.DataView.setPrevCurrRec();
313
- return (successful);
314
- });
315
- }
316
- checkRefreshSubForms() {
317
- return __awaiter(this, void 0, void 0, function* () {
318
- let refresh = !this._subFormsOnlyRecomp;
319
- let subformsToRefresh = yield this.GetSubformsToRefresh();
320
- if (subformsToRefresh.length > 0)
321
- refresh = true;
322
- return refresh;
323
- });
324
- }
325
- GetSubformsToRefresh() {
326
- return __awaiter(this, void 0, void 0, function* () {
327
- let subTasks = new List();
328
- let subformCtrl;
329
- this.buildSubFormList();
330
- for (let i = 0; i < this._subForms.length; i++) {
331
- let subTask = this._subForms[i];
332
- subformCtrl = subTask.getForm().getSubFormCtrl();
333
- if (subTask.isStarted() && (yield subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true)) &&
334
- !subTask.InSelect && !subTask.InEndTask) {
335
- yield subformCtrl.checkProp(PropInterface.PROP_TYPE_VISIBLE, true);
336
- if (!subformCtrl.isVisible() && !(yield subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)))
337
- subformCtrl.RefreshOnVisible = true;
338
- else
339
- subTasks.push(subTask);
340
- }
341
- }
342
- return subTasks;
343
- });
344
- }
345
- recPrefixSubForms() {
346
- return __awaiter(this, void 0, void 0, function* () {
347
- let i;
348
- let subForm;
349
- let successful = true;
350
- let subformCtrl;
351
- this.buildSubFormList();
352
- for (i = 0; successful && i < this._subForms.length; i++) {
353
- subForm = this._subForms.get_Item(i);
354
- subformCtrl = subForm.getForm().getSubFormCtrl();
355
- if (subForm.isStarted() && !subformCtrl.RefreshOnVisible
356
- && (yield subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true))
357
- && !subForm.InSelect && subForm.DoSubformPrefixSuffix) {
358
- yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subForm, InternalInterface.MG_ACT_REC_PREFIX, true);
359
- successful = !AccessHelper.eventsManager.GetStopExecutionFlag();
360
- }
361
- }
362
- return successful;
363
- });
364
- }
365
- notifyServerOnChange() {
366
- return this.RcmpMode === Recompute_RcmpBy.SERVER_ON_CHANGE;
367
- }
368
- isServerRcmp() {
369
- return this.RcmpMode !== Recompute_RcmpBy.CLIENT;
370
- }
371
- }
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb21wdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ydC9SZWNvbXB1dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUUxQyxPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRixPQUFPLEVBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0YsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3RDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUkxRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxNQUFNLENBQU4sSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQzFCLGdDQUFZLENBQUE7SUFDWiwwQ0FBc0IsQ0FBQTtBQUN4QixDQUFDLEVBSFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUczQjtBQUVELE1BQU0sT0FBTyxTQUFT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eEQsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxXQUFXLEdBQWMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7d0JBQ25ELE1BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUE7dUJBQ3hFLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7b0JBQ3ZELE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyw0Q0FBNEMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ2xJLFVBQVUsR0FBRyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztpQkFDakU7YUFDRjtZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7S0FBQTtJQUVELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7SUFDN0QsQ0FBQztJQUdELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxDQUFDO0lBQ25ELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UHJvcEludGVyZmFjZSwgUHJvcFRhYmxlfSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuaW1wb3J0IHtGaWVsZEJhc2V9IGZyb20gXCIuLi9kYXRhL0ZpZWxkQmFzZVwiO1xyXG5pbXBvcnQge0xpc3R9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuLi90YXNrcy9UYXNrXCI7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSBcIi4uL0NvbW1hbmRzUHJvY2Vzc29yQmFzZVwiO1xyXG5pbXBvcnQge0NvbnN0YW50cywgSW50ZXJuYWxJbnRlcmZhY2UsIExvZ2dlciwgWE1MQ29uc3RhbnRzLCBYbWxQYXJzZXJ9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tIFwiLi4vZGF0YS9SZWNvcmRcIjtcclxuaW1wb3J0IHtDb21tYW5kc1RhYmxlfSBmcm9tIFwiLi4vQ29tbWFuZHNUYWJsZVwiO1xyXG5pbXBvcnQge0lDbGllbnRDb21tYW5kfSBmcm9tIFwiLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmRcIjtcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSBcIi4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0NvbW1hbmRGYWN0b3J5XCI7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gXCIuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3JcIjtcclxuaW1wb3J0IHtEYXRhdmlld0hlYWRlckJhc2V9IGZyb20gXCIuL0RhdGF2aWV3SGVhZGVyQmFzZVwiO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gXCIuLi91dGlsL0Zsb3dNb25pdG9yUXVldWVcIjtcclxuaW1wb3J0IHtGaWVsZHNUYWJsZUV4dCBhcyBGaWVsZHNUYWJsZSB9IGZyb20gXCIuLi9kYXRhL0ZpZWxkc1RhYmxlXCI7XHJcbmltcG9ydCB7VGFza3NUYWJsZX0gZnJvbSBcIi4uL3Rhc2tzL1Rhc2tzVGFibGVcIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gXCIuLi9ndWkvTWdDb250cm9sXCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tIFwiLi4vZGF0YS9EYXRhVmlld1wiO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gXCIuLi9lbnYvRW52aXJvbm1lbnRcIjtcclxuaW1wb3J0IHsgQWNjZXNzSGVscGVyIH0gZnJvbSBcIi4uL0FjY2Vzc0hlbHBlclwiO1xyXG5cclxuZXhwb3J0IGVudW0gUmVjb21wdXRlX1JjbXBCeSB7XHJcbiAgQ0xJRU5UID0gJ0MnLFxyXG4gIFNFUlZFUl9PTl9DSEFOR0UgPSAnTydcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29tcHV0ZSB7XHJcbiAgcHJpdmF0ZSBfY3RybFByb3BzOiBQcm9wVGFibGUgPSBudWxsOyAvLyBhZmZlY3RlZCBjb250cm9sIHByb3BlcnRpZXNcclxuICBwcml2YXRlIF9mb3JtUHJvcHM6IFByb3BUYWJsZSA9IG51bGw7IC8vIGFmZmVjdGVkIGZvcm0gcHJvcGVydGllc1xyXG4gIHByaXZhdGUgX2lzT3duZXJGbGQ6IGJvb2xlYW4gPSB0cnVlOyAvLyBkZW5vdGVzIGlmIHRoZSBjdXJyZW50IHBhcnNlZCBmaWVsZCB0YWcgaXMgdGhlIG93bmVyIGZpZWxkXHJcbiAgT3duZXJGbGQ6IEZpZWxkQmFzZSA9IG51bGw7IC8vIHRoZSBmaWVsZCB0aGF0IG93bnMgdGhpcyByZWNvbXB1dGUgc3RydWN0dXJlXHJcblxyXG4gIHByaXZhdGUgX3JjbXBPcmRlcjogTGlzdDxGaWVsZEJhc2UgfCBEYXRhdmlld0hlYWRlckJhc2U+ID0gbnVsbDsgLy8gYWZmZWN0ZWQgZmllbGRzIGFuZCBsaW5rcy4gQ2FuJ3QgdXNlIExpc3Q8VD4gLSBob2xkcyBib3RoIGZpZWxkcyBhbmQgbGlua3NcclxuICBwcml2YXRlIF9zdWJGb3JtczogTGlzdDxUYXNrPiA9IG51bGw7IC8vIHN1YmZvcm1zICh0YXNrcykgYWZmZWN0ZWQgYnkgdGhpcyByZWNvbXB1dGVcclxuICBwcml2YXRlIF9zdWJGb3Jtc09ubHlSZWNvbXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9oYXNTZXJ2ZXJMaW5rc1JlY29tcHV0ZXM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSwgaWYgdGhlIGZpZWxkIGhhcyBhbnkgbGluayByZWNvbXB1dGVzIGFuZCBpdCBpcyBhIHNlcnZlciByZWNvbXB1dGVcclxuICBSY21wTW9kZTogUmVjb21wdXRlX1JjbXBCeSA9IG51bGw7ICAvLyBXaG8gKGFuZCB3aGVuKSBwZXJmb3JtcyByY21wIChieSBjbGllbnQsXHJcblxyXG4gIFRhc2s6IFRhc2sgPSBudWxsOyAvLyBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayBvZiB0aGlzIFJlY29tcHV0ZVxyXG5cclxuICBjb25zdHJ1Y3Rvcigpe1xyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdG8gZmlsbCBhbGwgcmVsZXZhbnQgZGF0YSBmb3IgPGZsZCAuLi4+IC4uLjwvZmxkPiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVZpZXdcIj5yZWZlcmVuY2UgdG8gYWxsIERhdGFWaWV3IG9iamVjdCwgd2hpY2ggY29uc2lzdCByZWxldmFudCBmaWVsZHMgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj50byBwYXJlbnQgdGFzaywgd2hpY2ggbmVlZCBiZSBpbml0aWFsaXplZCBpbiBDb250cm9sVGFibGUuQ29udHJvbC50YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbmRleCBvZiB0aGUgZW5kIG9mIGN1cnJlbnQgPGZsZCAuLi4+PT4gPC9mbGQ+IDwvcmV0dXJucz5cclxuICBmaWxsRGF0YShkYXRhVmlldzogRGF0YVZpZXcsIHRhc2tSZWY6IFRhc2ssIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5UYXNrID0gdGFza1JlZjtcclxuICAgIHRoaXMuX2lzT3duZXJGbGQgPSB0cnVlOyAvLyBzdGFydCBvZiBuZXcgPGZsZD4gdGFnXHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSwgZGF0YVZpZXcpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCBpbm5lciBtZW1iZXJzIGFuZCBuZWVkZWQgbGlua3MgZm9yIHRoZSBjdXJyZW50ICdmbGQnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIigoRGF0YVZpZXcpZGF0YVZpZXcpXCI+cmVmZXJlbmNlIHRvIGFsbCBEYXRhVmlldyBvYmplY3QsIHdoaWNoIGNvbnNpc3QgcmVsZXZhbnQgZmllbGRzIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IHN0cmluZywgZGF0YVZpZXc6IERhdGFWaWV3KTogYm9vbGVhbiB7XHJcbiAgICBzd2l0Y2ggKGZvdW5kVGFnTmFtZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRkxEOlxyXG4gICAgICAgIC8vIGluaXQgPGZsZCBpZCA9IHJlY29tcHV0ZV9ieT0+IGZpcnN0IHRpbWUsIGluaXQgcmVmZXJlbmNlIGJ5IGlkXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzT3duZXJGbGQpIHtcclxuICAgICAgICAgIHRoaXMuZmlsbEZsZEZpZWxkKHBhcnNlciwgZGF0YVZpZXcpO1xyXG4gICAgICAgICAgdGhpcy5faXNPd25lckZsZCA9IGZhbHNlOyAvLyBtdXN0IHRvIGJlIGFmdGVyIEZpbGxGbGRGaWVsZFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLmZpbGxGbGRGaWVsZChwYXJzZXIsIGRhdGFWaWV3KTsgLy8gaXQncyBub3QgbmVlZCAoKERhdGFWaWV3KWRhdGFWaWV3KSwgaXQncyBub3QgZmlyc3QgPGZsZCA+XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19MSU5LOlxyXG4gICAgICAgIHRoaXMuZmlsbExpbmsocGFyc2VyLCBkYXRhVmlldyk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTDpcclxuICAgICAgICBpZiAodGhpcy5fY3RybFByb3BzID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9jdHJsUHJvcHMgPSBuZXcgUHJvcFRhYmxlKCk7XHJcblxyXG4gICAgICAgIC8vIGZpbGwgdGhlIHByb3AgdGFibGUgdXNpbmcgdGhlIGV4aXN0aW5nIHByb3BlcnRpZXNcclxuICAgICAgICB0aGlzLl9jdHJsUHJvcHMuZmlsbERhdGFCeUV4aXN0cyh0aGlzLlRhc2ssIHBhcnNlcik7XHJcblxyXG4gICAgICAgIC8vIGlmIHZpcnR1YWwgZmllbGQgY2F1c2VzIHJlY29tcHV0ZSBvZiByZXBlYXRhYmxlIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5fY3RybFByb3BzLmdldEN0cmxSZWYoKSAhPSBudWxsICYmIHRoaXMuX2N0cmxQcm9wcy5nZXRDdHJsUmVmKCkuSXNSZXBlYXRhYmxlICYmIHRoaXMuT3duZXJGbGQuSXNWaXJ0dWFsICYmXHJcbiAgICAgICAgICAhKHRoaXMuT3duZXJGbGQuaGFzSW5pdEV4cCgpKSlcclxuICAgICAgICAgIHRoaXMuT3duZXJGbGQuY2F1c2VUYWJsZUludmFsaWRhdGlvbih0cnVlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19GT1JNX1BST1BFUlRJRVM6XHJcbiAgICAgICAgaWYgKHRoaXMuX2Zvcm1Qcm9wcyA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5fZm9ybVByb3BzID0gbmV3IFByb3BUYWJsZSgpO1xyXG5cclxuICAgICAgICAvLyBmaWxsIHRoZSBwcm9wIHRhYmxlIHVzaW5nIHRoZSBleGlzdGluZyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdGhpcy5fZm9ybVByb3BzLmZpbGxEYXRhQnlFeGlzdHModGhpcy5UYXNrLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfRkxEX0VORDpcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBSZWNvbXB1dGUuIEluc2VydCBlbHNlIGlmIHRvIFJlY29tcHV0ZS5pbml0SW5uZXJPYmplY3RzIGZvciBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEFkZFJlY29tcHV0ZUl0ZW0oaXRlbTogRmllbGRCYXNlIHwgRGF0YXZpZXdIZWFkZXJCYXNlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcmNtcE9yZGVyID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9yY21wT3JkZXIgPSBuZXcgTGlzdCgpO1xyXG4gICAgdGhpcy5fcmNtcE9yZGVyLnB1c2goaXRlbSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCB0aGUgcmVjb21wdXRlZCBsaW5rIGRhdGEgKG9ubHkgaWQpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxMaW5rKHBhcnNlcjogWG1sUGFyc2VyLCBkYXRhVmlldzogRGF0YVZpZXcpOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogU3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0xJTkspICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0xJTksubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGopKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQpXHJcbiAgICAgICAgICB0aGlzLkFkZFJlY29tcHV0ZUl0ZW0oKDxUYXNrPmRhdGFWaWV3LmdldFRhc2soKSkuZ2V0RGF0YXZpZXdIZWFkZXJzKCkuZ2V0RGF0YXZpZXdIZWFkZXJCeUlkKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKSk7XHJcblxyXG4gICAgICAgIGVsc2UgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gUmVjb21wdXRlIGNsYXNzLiBJbnNlcnQgY2FzZSB0byBSZWNvbXB1dGUuZmlsbExpbmsgZm9yIFwiICsgYXR0cmlidXRlKTtcclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTsgLy8gdG8gZGVsZXRlIFwiLz5cIiB0b29cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvbXB1dGUuZmlsbExpbmsoKSBvdXQgb2YgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXQgUmVjb21wdXRlQnkgbWVtYmVyIGFuZCBpbml0IHJlZmVyZW5jZSBmcm9tIHRoZSBGaWVsZFJvb3QgdG8gdGhlIFJlY29tcHV0ZSBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwieG1sUGFyc2VyLmdldFhNTGRhdGEoKVwiPiwgaW5wdXQgc3RyaW5nIGZ1bGwgWE1MLmlubmVyVGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwieG1sUGFyc2VyLmdldEN1cnJJbmRleCgpXCI+LCBpbmRleCBvZiBzdGFydCBmaXJzdCA8ZmxkIC4uLj4gdGFnIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCIoKERhdGFWaWV3KWRhdGFWaWV3KVwiPnJlZmVyZW5jZSB0byBhbGwgRGF0YVZpZXcgb2JqZWN0LCB3aGljaCBjb25zaXN0IHJlbGV2YW50IGZpZWxkcyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaW5kZXggb2YgZW5kIG9mIDxmbGQgLi4uPiB0YWcgPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbEZsZEZpZWxkKHBhcnNlcjogWG1sUGFyc2VyLCBkYXRhVmlldzogRGF0YVZpZXcpOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YodGhpcy5faXNPd25lckZsZFxyXG4gICAgICA/IFhNTENvbnN0YW50cy5UQUdfQ0xPU0VcclxuICAgICAgOiBYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG5cclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IFN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfRkxEKSArIFhNTENvbnN0YW50cy5NR19UQUdfRkxELmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksXHJcbiAgICAgICAgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgdGhpcy5pbml0RWxlbWVudHModG9rZW5zVmVjdG9yLCBkYXRhVmlldyk7XHJcbiAgICAgIGlmICh0aGlzLl9pc093bmVyRmxkKSB7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gQ29tbWFuZC5GaWxsRGF0YSgpIG91dCBvZiBib3VuZHNcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTWFrZSBpbml0aWFsaXphdGlvbiBvZiBwcml2YXRlIGVsZW1lbnRzIGJ5IGZvdW5kIHRva2Vuc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5mb3VuZCB0b2tlbnMsIHdoaWNoIGNvbnNpc3QgYXR0cmlidXRlL3ZhbHVlIG9mIGV2ZXJ5IGZvdW5kIGVsZW1lbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIigoRGF0YVZpZXcpZGF0YVZpZXcpXCI+cmVmZXJlbmNlIHRvIGZpZWxkIG9iamVjdHMsIGZvciA8ZmxkIGlkID0gLi4uPlxyXG4gIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoRGF0YVZpZXcpZGF0YVZpZXcpPT1udWxsPT4gaXQncyBmaXJzdCBmb3VuZCBmaWVsZCwgbmVlZCB0byBpbml0IHJlZmVyZW5jZVxyXG4gIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIEZpZWxkUm9vdFxyXG4gIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoRGF0YVZpZXcpZGF0YVZpZXcpIT1udWxsPT4gYWRkIHRoZSBkYXRhIHRvIGN1cnJpZW50IFJlY29yZCwgaXQncyBub3QgZmlyc3QgPGZsZD5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiwgZGF0YVZpZXc6IERhdGFWaWV3KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDoge1xyXG4gICAgICAgICAgbGV0IGZsZElkOiBudW1iZXIgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGxldCBmbGQgPSA8RmllbGRCYXNlPmRhdGFWaWV3LmdldEZpZWxkKGZsZElkKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9pc093bmVyRmxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuT3duZXJGbGQgPSBmbGQ7XHJcbiAgICAgICAgICAgIHRoaXMuT3duZXJGbGQuc2V0UmVjb21wdXRlKHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZsZC5zZXRSZWNvbXB1dGVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkUmVjb21wdXRlSXRlbShmbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRUNPTVBVVEVCWTpcclxuICAgICAgICAgIHRoaXMuUmNtcE1vZGUgPSA8UmVjb21wdXRlX1JjbXBCeT52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU1VCX0ZPUk1fUkNNUDpcclxuICAgICAgICAgIHRoaXMuX3N1YkZvcm1zT25seVJlY29tcCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBU19MSU5LX1JFQ09NUFVURVM6XHJcbiAgICAgICAgICB0aGlzLl9oYXNTZXJ2ZXJMaW5rc1JlY29tcHV0ZXMgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIC8qIGlnbm9yZSB0aGUgbmFtZSAqL1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBSZWNvbXB1dGUgY2xhc3MuIEluc2VydCBjYXNlIHRvIFJlY29tcHV0ZS5pbml0RWxlbWVudHMgZm9yIFwiICsgYXR0cmlidXRlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSByZWNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHJlY29yZCBvbiB3aGljaCB0aGUgcmVjb21wdXRlIGlzIGV4ZWN1dGVkPC9wYXJhbT5cclxuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShyZWM6IFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmbGQ6IEZpZWxkQmFzZTtcclxuICAgIGxldCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUgPSA8Q29tbWFuZHNUYWJsZT50aGlzLlRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyO1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmVjLnNldEluUmVjb21wdXRlKHRydWUpO1xyXG4gICAgICB0aGlzLlRhc2suU2V0SW5SZWNvbXB1dGUgKHRydWUpO1xyXG4gICAgICB0aGlzLlNldFN1YmZvcm1zSW5SZWNvbXB1dGUodHJ1ZSk7XHJcbiAgICAgIGxldCBhbGxvd1NlcnZlclJlY29tcHV0ZTogYm9vbGVhbiA9IHRoaXMuX2hhc1NlcnZlckxpbmtzUmVjb21wdXRlcyB8fFxyXG4gICAgICAgICAgKHRoaXMuVGFzay5nZXRGb3JtKCkuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgJiYgYXdhaXQgdGhpcy5jaGVja1JlZnJlc2hTdWJGb3JtcygpKTtcclxuXHJcbiAgICAgIC8vIFNFUlZFUlxyXG4gICAgICBpZiAodGhpcy5SY21wTW9kZSAhPT0gUmVjb21wdXRlX1JjbXBCeS5DTElFTlQgJiYgYWxsb3dTZXJ2ZXJSZWNvbXB1dGUpIHtcclxuICAgICAgICBsZXQgaW5DbGllbnQ6IGJvb2xlYW4gPSB0aGlzLl9zdWJGb3Jtc09ubHlSZWNvbXA7XHJcbiAgICAgICAgdGhpcy5UYXNrLkV4ZWN1dGVDbGllbnRTdWJmb3JtUmVmcmVzaCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBpZiB0aGUgcmVjb21wdXRlIGlzIG5vdCBvbmx5IGR1ZSB0byBzdWItZm9ybXMgZ28gdG8gc2VydmVyXHJcbiAgICAgICAgaWYgKGluQ2xpZW50KSB7XHJcbiAgICAgICAgICBpbkNsaWVudCA9IGF3YWl0IHRoaXMuVGFzay5wcmVwYXJlQ2FjaGUodHJ1ZSk7XHJcbiAgICAgICAgICAvLyBpZiBhbGwgc3ViLWZvcm0gYXJlIG5vdCB1cGRhdGVcclxuICAgICAgICAgIGlmIChpbkNsaWVudClcclxuICAgICAgICAgICAgaW5DbGllbnQgPSBhd2FpdCB0aGlzLlRhc2sudGVzdEFuZFNldCh0cnVlKTsgLy8gdHJ5IHRvIHRha2UgZGF0YXZpZXdzIGZyb20gY2FjaGVcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpbkNsaWVudCkge1xyXG4gICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLlRhc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkpLnNldFNlcnZlclJjbXAodHJ1ZSk7XHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVSZWNvbXB1dGVDb21tYW5kKHRoaXMuVGFzay5nZXRUYXNrVGFnKCksIHRoaXMuT3duZXJGbGQuZ2V0SWQoKSwgIXRoaXMuVGFzay5nZXRGb3JtKCkuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUpO1xyXG4gICAgICAgICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgYXdhaXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuVGFzay5FeGVjdXRlQ2xpZW50U3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hTdWJmb3JtcygpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMucmVjUHJlZml4U3ViRm9ybXMoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNTdWZmaXhTdWJGb3JtcygpO1xyXG4gICAgICAgICAgdGhpcy5UYXNrLkNsZWFuRG9TdWJmb3JtUHJlZml4U3VmZml4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIENMSUVOVFxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZS5hZGRSZWNvbXB1dGUodGhpcy5Pd25lckZsZC5nZXRWYXJOYW1lKCksIHRoaXMuVGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuXHJcbiAgICAgICAgICAvLyBGT1JNIFBST1BFUlRJRVNcclxuICAgICAgICAgIGlmICh0aGlzLl9mb3JtUHJvcHMgIT0gbnVsbClcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZm9ybVByb3BzLlJlZnJlc2hEaXNwbGF5KGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gQ1RSTCBQUk9QRVJUSUVTXHJcbiAgICAgICAgICBpZiAodGhpcy5fY3RybFByb3BzICE9IG51bGwpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N0cmxQcm9wcy5SZWZyZXNoRGlzcGxheShmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIHJlLWN1bXB1dGUgY2xpZW50IHNpZGUgZmllbGRzIGFuZCBsaW5rc1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3JjbXBPcmRlciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9yY21wT3JkZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fcmNtcE9yZGVyLmdldF9JdGVtKGkpIGluc3RhbmNlb2YgRmllbGRCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICBmbGQgPSA8RmllbGRCYXNlPnRoaXMuX3JjbXBPcmRlci5nZXRfSXRlbShpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmxkUmNtcChmbGQsIHRydWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9yY21wT3JkZXIuZ2V0X0l0ZW0oaSkgaW5zdGFuY2VvZiBEYXRhdmlld0hlYWRlckJhc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJMbmsgPSA8RGF0YXZpZXdIZWFkZXJCYXNlPnRoaXMuX3JjbXBPcmRlci5nZXRfSXRlbShpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGN1ckxuay5nZXRMaW5rZWRSZWNvcmQocmVjKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHJlY29tcHV0ZWQgYSBsaW5rIHdlIHNob3VsZCBhbHNvIHN0YXJ0IHRoZSByZWNvbXB1dGUgcHJvY2VzcyBvbiBhbGwgb2YgaXRzIGZpZWxkc1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpbmtGaWVsZHM6IExpc3Q8RmllbGRCYXNlPiA9ICg8RmllbGRzVGFibGU+dGhpcy5UYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpKS5nZXRMaW5rRmllbGRzKGN1ckxuay5JZCk7XHJcbiAgICAgICAgICAgICAgICByZWMuc2V0SW5Db21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNhdmVJbkZvcmNlVXBkYXRlOiBib29sZWFuID0gcmVjLkluRm9yY2VVcGRhdGU7XHJcbiAgICAgICAgICAgICAgICByZWMuSW5Gb3JjZVVwZGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBsaW5rRmllbGRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmxkUmNtcChsaW5rRmllbGRzLmdldF9JdGVtKGopLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHJlYy5jbGVhckZsYWcoKGxpbmtGaWVsZHMuZ2V0X0l0ZW0oaikpLmdldElkKCksIFJlY29yZC5GTEFHX1VQREFURUQpO1xyXG4gICAgICAgICAgICAgICAgICByZWMuY2xlYXJGbGFnKChsaW5rRmllbGRzLmdldF9JdGVtKGopKS5nZXRJZCgpLCBSZWNvcmQuRkxBR19NT0RJRklFRCk7XHJcbiAgICAgICAgICAgICAgICAgIHJlYy5jbGVhckZsYWcoKGxpbmtGaWVsZHMuZ2V0X0l0ZW0oaikpLmdldElkKCksIFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQpO1xyXG4gICAgICAgICAgICAgICAgICByZWMuY2xlYXJIaXN0b3J5RmxhZygobGlua0ZpZWxkcy5nZXRfSXRlbShqKSkuZ2V0SWQoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZWMuSW5Gb3JjZVVwZGF0ZSA9IHNhdmVJbkZvcmNlVXBkYXRlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHJlY29tcHV0ZSBwcm9jZXNzIG9uIHRoZSByZXQgdmFsIG9mIHRoZSBsaW5rXHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0RmxkOiBGaWVsZEJhc2UgPSBjdXJMbmsuUmV0dXJuRmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocmV0RmxkICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmxkUmNtcChyZXRGbGQsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZWMuc2V0SW5Db21wdXRlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHJlYy5zZXRGb3JjZVNhdmVPcmcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hTdWJmb3JtcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb21wdXRlLmV4ZWN1dGUoKTogXCIgKyBlLk1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0gIC8vIEVORCBDTElFTlQgQkxPQ0tcclxuICAgICAgdGhpcy5UYXNrLlNldEluUmVjb21wdXRlIChmYWxzZSk7XHJcbiAgICAgIHRoaXMuU2V0U3ViZm9ybXNJblJlY29tcHV0ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHJlYy5idWlsZExpbmtzUG9zU3RyKCk7XHJcbiAgICAgIHJlYy5zZXRJblJlY29tcHV0ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8gU3ViZm9ybXMgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIFJlZnJlc2hTdWJmb3JtcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLlRhc2suZ2V0Rm9ybSgpLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlKSB7XHJcbiAgICAgIGxldCBzdWJmb3Jtc1RvUmVmcmVzaDogTGlzdDxUYXNrPiA9IGF3YWl0IHRoaXMuR2V0U3ViZm9ybXNUb1JlZnJlc2goKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YmZvcm1zVG9SZWZyZXNoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gc3ViZm9ybXNUb1JlZnJlc2guZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5UYXNrLlN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgU2V0U3ViZm9ybXNJblJlY29tcHV0ZShpblJlY29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgICAgbGV0IHN1YmZvcm1zVG9SZWZyZXNoOiBMaXN0PFRhc2s+ID0gYXdhaXQgdGhpcy5HZXRTdWJmb3Jtc1RvUmVmcmVzaCgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViZm9ybXNUb1JlZnJlc2gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSBzdWJmb3Jtc1RvUmVmcmVzaC5nZXRfSXRlbShpKTtcclxuICAgICAgICAgIHN1YmZvcm1UYXNrLlNldEluUmVjb21wdXRlKGluUmVjb21wdXRlKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHJlY29tcHV0ZSBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkXCI+LSB0aGUgZmllZGwgdG8gcmVjb21wdXRlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGZsZFJjbXAoZmxkOiBGaWVsZEJhc2UsIGNvbXB1dGVGaWVsZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGZsZC5Jc1ZpcnR1YWxcclxuICAgICAgfHwgKCh0aGlzLlRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZIHx8XHJcbiAgICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0aGlzLlRhc2suZ2V0Q29tcElkeCgpKSkpKSB7XHJcbiAgICAgIGlmICghZmxkLmlzSW5FdmFsUHJvY2VzcygpKSB7XHJcbiAgICAgICAgaWYgKGNvbXB1dGVGaWVsZClcclxuICAgICAgICAgIGF3YWl0IGZsZC5jb21wdXRlKHRydWUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IGZsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZsZC5nZXRWYWx1ZShmYWxzZSksIGZsZC5pc051bGwoKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICBhd2FpdCBmbGQudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJ1aWxkU3ViRm9ybUxpc3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc3ViRm9ybXMgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fc3ViRm9ybXMgPSBuZXcgTGlzdDxUYXNrPigpO1xyXG4gICAgICBsZXQgc3ViVGFza3NUYWI6IFRhc2tzVGFibGUgPSB0aGlzLlRhc2suZ2V0U3ViVGFza3MoKTtcclxuXHJcbiAgICAgIGlmIChzdWJUYXNrc1RhYiAhPT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrc1RhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IHN1YkZvcm06IFRhc2sgPSA8VGFzaz5zdWJUYXNrc1RhYi5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgLy8gUUNSICMyOTkxNTMuIEFkZCBvbmx5IHN1YmZvcm1zIChub3Qgc3VidGFza3MpLlxyXG4gICAgICAgICAgaWYgKHN1YkZvcm0uZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkgIT09IG51bGwgJiYgc3ViRm9ybS5yZWZyZXNoZXNPbih0aGlzLk93bmVyRmxkLmdldElkKCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1YkZvcm1zLnB1c2goc3ViRm9ybSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlbW92ZXMgdGhlIHNwZWNpZmljIHRhc2sgZnJvbSBzdWJmb3JtcyBsaXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgUmVtb3ZlU3ViZm9ybShzdWJmb3JtVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3ViRm9ybXMuUmVtb3ZlKHN1YmZvcm1UYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5zZXJ0cyB0aGUgc3BlY2lmaWMgc3ViZm9ybSB0YXNrIGludG8gdGhlIHN1YmZvcm0gbGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIEFkZFN1YmZvcm0oc3ViZm9ybVRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zdWJGb3JtcyA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fc3ViRm9ybXMgPSBuZXcgTGlzdDxUYXNrPigpO1xyXG4gICAgaWYgKCF0aGlzLl9zdWJGb3Jtcy5Db250YWlucyhzdWJmb3JtVGFzaykpXHJcbiAgICAgIHRoaXMuX3N1YkZvcm1zLnB1c2goc3ViZm9ybVRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgcmVjb3JkIHN1ZmZpeCBmb3IgdGhlIGFmZmVjdGVkIHN1YmZvcm1zIGlmIFJlZnJlc2ggaXMgbmVlZGVkXHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgaXQgaXMgbmVlZGVkIHRvIHJlZnJlc2hcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgcmVjU3VmZml4U3ViRm9ybXMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHN1YkZvcm06IFRhc2s7XHJcbiAgICBsZXQgc3VjY2Vzc2Z1bDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbDtcclxuXHJcbiAgICAvLyBidWlsZCB0aGUgc3ViZm9ybXMgbGlzdCBhbmQgc2F2ZSBpdCBmb3IgZnV0dXJlIHVzZVxyXG4gICAgdGhpcy5idWlsZFN1YkZvcm1MaXN0KCk7XHJcblxyXG4gICAgLy8gZXhlY3V0ZSBcInJlY29yZCBzdWZmaXhcIiBmb3IgdGhlIHN1YmZvcm1zXHJcbiAgICBmb3IgKGkgPSAwOyBzdWNjZXNzZnVsICYmIGkgPCB0aGlzLl9zdWJGb3Jtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBzdWJGb3JtID0gdGhpcy5fc3ViRm9ybXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5zdWJGb3JtLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICBpZiAoc3ViRm9ybS5pc1N0YXJ0ZWQoKSAmJiAhc3ViZm9ybUN0cmwuUmVmcmVzaE9uVmlzaWJsZSAmJlxyXG4gICAgICAgIGF3YWl0IHN1YmZvcm1DdHJsLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0gsIHRydWUpICYmICFzdWJGb3JtLkluU2VsZWN0XHJcbiAgICAgICAgJiYgc3ViRm9ybS5Eb1N1YmZvcm1QcmVmaXhTdWZmaXgpIHtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViRm9ybSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIHN1Y2Nlc3NmdWwgPSAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKDxEYXRhVmlldz50aGlzLlRhc2suRGF0YVZpZXcpLnNldFByZXZDdXJyUmVjKCk7XHJcbiAgICByZXR1cm4gKHN1Y2Nlc3NmdWwpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2hlY2sgaWYgZG8gcmVmcmVzaCBmb3IgYW55IHN1YmZvcm0gdGhhdCB0aGUgZmllbGQgYWZmZWN0c1xyXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tSZWZyZXNoU3ViRm9ybXMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVmcmVzaDogYm9vbGVhbiA9ICF0aGlzLl9zdWJGb3Jtc09ubHlSZWNvbXA7XHJcbiAgICBsZXQgc3ViZm9ybXNUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBhd2FpdCB0aGlzLkdldFN1YmZvcm1zVG9SZWZyZXNoKCk7XHJcbiAgICBpZiAoc3ViZm9ybXNUb1JlZnJlc2gubGVuZ3RoID4gMClcclxuICAgICAgcmVmcmVzaCA9IHRydWU7XHJcbiAgICByZXR1cm4gcmVmcmVzaDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2YgdGhvc2Ugc3ViZm9ybXMgdGhhdCBtdXN0IGJlIHJlZnJlc2hlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5saXN0IG9mIHN1YmZvcm1zIHRvIHJlZnJlc2g8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBHZXRTdWJmb3Jtc1RvUmVmcmVzaCgpOiBQcm9taXNlPExpc3Q8VGFzaz4+IHtcclxuXHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG4gICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICAvLyBidWlsZCB0aGUgc3ViZm9ybXMgbGlzdCBhbmQgc2F2ZSBpdCBmb3IgZnV0dXJlIHVzZVxyXG4gICAgdGhpcy5idWlsZFN1YkZvcm1MaXN0KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGk8dGhpcy5fc3ViRm9ybXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGxldCBzdWJUYXNrID0gdGhpcy5fc3ViRm9ybXNbaV07XHJcbiAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5zdWJUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICBpZiAoc3ViVGFzay5pc1N0YXJ0ZWQoKSAmJiBhd2FpdCAgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fUkVGUkVTSCwgdHJ1ZSkgJiZcclxuICAgICAgICAhc3ViVGFzay5JblNlbGVjdCAmJiAhc3ViVGFzay5JbkVuZFRhc2spIHtcclxuXHJcbiAgICAgICAgLy8gY29tcHV0ZSB0aGUgdmlzaWJpbGl0eSBwcm9wZXJ0eSBmb3IgdGhlIHN1YmZvcm0gY29udHJvbCBiZWZvcmUgdXNlIGl0IGluIGlzVmlzaWJsZSgpIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IHN1YmZvcm1DdHJsLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCB0cnVlKTtcclxuICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKVxyXG4gICAgICAgICAgc3ViZm9ybUN0cmwuUmVmcmVzaE9uVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgZWxzZSBzdWJUYXNrcy5wdXNoKHN1YlRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3ViVGFza3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSByZWNvcmQgcHJlZml4IGZvciB0aGUgYWZmZWN0ZWQgc3ViZm9ybXMgaWYgUmVmcmVzaCBpcyBuZWVkZWRcclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IGFuZCBpdCBpcyBuZWVkZWQgdG8gcmVmcmVzaFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWNQcmVmaXhTdWJGb3JtcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgc3ViRm9ybTogVGFzaztcclxuICAgIGxldCBzdWNjZXNzZnVsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sO1xyXG5cclxuICAgIC8vIGJ1aWxkIHRoZSBzdWJmb3JtcyBsaXN0IGFuZCBzYXZlIGl0IGZvciBmdXR1cmUgdXNlXHJcbiAgICB0aGlzLmJ1aWxkU3ViRm9ybUxpc3QoKTtcclxuXHJcbiAgICAvLyBleGVjdXRlIFwicmVjb3JkIHByZWZpeFwiIGZvciB0aGUgc3ViZm9ybXNcclxuICAgIGZvciAoaSA9IDA7IHN1Y2Nlc3NmdWwgJiYgaSA8IHRoaXMuX3N1YkZvcm1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHN1YkZvcm0gPSB0aGlzLl9zdWJGb3Jtcy5nZXRfSXRlbShpKTtcclxuICAgICAgc3ViZm9ybUN0cmwgPSA8TWdDb250cm9sPnN1YkZvcm0uZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgIGlmIChzdWJGb3JtLmlzU3RhcnRlZCgpICYmICFzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlXHJcbiAgICAgICAgJiYgYXdhaXQgIHN1YmZvcm1DdHJsLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0gsIHRydWUpXHJcbiAgICAgICAgJiYgIXN1YkZvcm0uSW5TZWxlY3QgJiYgc3ViRm9ybS5Eb1N1YmZvcm1QcmVmaXhTdWZmaXgpIHtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChzdWJGb3JtLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgdHJ1ZSk7XHJcbiAgICAgICAgc3VjY2Vzc2Z1bCA9ICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VjY2Vzc2Z1bDtcclxuICB9XHJcblxyXG4gIG5vdGlmeVNlcnZlck9uQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuUmNtcE1vZGUgPT09IFJlY29tcHV0ZV9SY21wQnkuU0VSVkVSX09OX0NIQU5HRTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGUgY2xpZW50IGRvZXNuJ3Qga25vdyB0byByZWNvbXB1dGUgdGhpcyBmaWVsZDwvcmV0dXJucz5cclxuICBpc1NlcnZlclJjbXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5SY21wTW9kZSAhPT0gUmVjb21wdXRlX1JjbXBCeS5DTElFTlQ7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
@@ -1,114 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { List } from "@magic-xpa/mscorelib";
3
- import { StorageAttribute } from "@magic-xpa/utils";
4
- import { DisplayConvertor, PIC } from "@magic-xpa/gui";
5
- import { DataviewHeaderBase } from "./DataviewHeaderBase";
6
- import { TableCache } from "./TableCache";
7
- import { Record } from "../data/Record";
8
- import { ConstInterface } from "../ConstInterface";
9
- import { TableCacheManager } from "./TableCacheManager";
10
- import { AccessHelper } from "../AccessHelper";
11
- export class RemoteDataviewHeader extends DataviewHeaderBase {
12
- constructor(task) {
13
- super(task);
14
- this._table = null;
15
- this._lastFetchRecPos = null;
16
- }
17
- setAttribute(attribute, valueStr) {
18
- switch (attribute) {
19
- case ConstInterface.MG_ATTR_CACHED_TABLE:
20
- if (TableCacheManager.Instance.TableExists(valueStr))
21
- this._table = TableCacheManager.Instance.GetTableById(valueStr);
22
- else {
23
- this._table = new TableCache(valueStr);
24
- TableCacheManager.Instance.InsertTable(this._table);
25
- }
26
- break;
27
- case ConstInterface.MG_ATTR_IDENT:
28
- this._table.SetTableIdent(valueStr);
29
- break;
30
- default:
31
- super.setAttribute(attribute, valueStr);
32
- break;
33
- }
34
- }
35
- getLinkedRecord(curRec) {
36
- return __awaiter(this, void 0, void 0, function* () {
37
- let lnkFlds = this._task.DataView.GetFieldsTab().getLinkFields(this._id);
38
- let ret = false;
39
- if (this._cond.getVal()) {
40
- if (this.Loc == null) {
41
- this.Loc = new List();
42
- for (let i = 0; i < lnkFlds.length; i++) {
43
- let currLoc = lnkFlds.get_Item(i).Locate;
44
- if (currLoc != null) {
45
- this.Loc.push(currLoc);
46
- yield currLoc.compute(false);
47
- }
48
- }
49
- }
50
- else {
51
- for (let i = 0; i < this.Loc.length; i++)
52
- yield this.Loc.get_Item(i).compute(false);
53
- }
54
- yield this._table.SortTable(this._keyIdx, this._dir);
55
- let res = this._table.Fetch(this.Loc);
56
- if (res == null)
57
- yield this.initRec(curRec, false);
58
- else {
59
- ret = true;
60
- yield this.copyLinkFldToRec(curRec, lnkFlds, res, true);
61
- }
62
- }
63
- else
64
- yield this.initRec(curRec, false);
65
- return ret;
66
- });
67
- }
68
- copyLinkFldToRec(curRec, linkFlds, tableRec, ret) {
69
- return __awaiter(this, void 0, void 0, function* () {
70
- this._lastFetchRecPos = tableRec.getDbPosVal();
71
- for (let i = 0; i < linkFlds.length; i++) {
72
- let curFld = linkFlds.get_Item(i);
73
- curRec.setFieldValue(curFld.getId(), tableRec.GetFieldValue(curFld.CacheTableFldIdx), false);
74
- curRec.clearFlag(curFld.getId(), Record.FLAG_INVALID);
75
- curFld.invalidate(true, false);
76
- }
77
- yield this.SetReturnValue(ret, true);
78
- });
79
- }
80
- initRec(currRec, ret) {
81
- return __awaiter(this, void 0, void 0, function* () {
82
- this._lastFetchRecPos = "#";
83
- yield this.InitLinkFields(currRec);
84
- let retFld = this.ReturnField;
85
- if (retFld != null) {
86
- currRec.setFieldValue(retFld.getId(), (ret ? "1" : "0"), false);
87
- retFld.invalidate(true, false);
88
- }
89
- });
90
- }
91
- getLastFetchedDbPos() {
92
- return this._lastFetchRecPos;
93
- }
94
- SetReturnValue(ret, recompute) {
95
- return __awaiter(this, void 0, void 0, function* () {
96
- let returnField = this.ReturnField;
97
- if (returnField !== null) {
98
- let enforceVariableChange = returnField.getTask() !== this.Task;
99
- AccessHelper.eventsManager.pushNewExecStacks();
100
- let result = ret ? "1" : "0";
101
- if (returnField.getType() === StorageAttribute.NUMERIC)
102
- result = DisplayConvertor.Instance.toNum(result, new PIC(returnField.getPicture(), StorageAttribute.NUMERIC, 0), 0);
103
- yield returnField.setValueAndStartRecompute(result, false, recompute, false, false, enforceVariableChange);
104
- AccessHelper.eventsManager.popNewExecStacks();
105
- if (!recompute)
106
- returnField.setModified();
107
- returnField.invalidate(true, false);
108
- if (returnField.getTask() !== this.Task)
109
- yield returnField.updateDisplay();
110
- }
111
- });
112
- }
113
- }
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVtb3RlRGF0YXZpZXdIZWFkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL3J0L1JlbW90ZURhdGF2aWV3SGVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSXRDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFLN0MsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGtCQUFrQjtJQUkxRCxZQUFZLElBQVU7UUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBSk4sV0FBTSxHQUFlLElBQUksQ0FBQztRQUMxQixxQkFBZ0IsR0FBVyxJQUFJLENBQUM7SUFJeEMsQ0FBQztJQUVTLFlBQVksQ0FBQyxTQUFpQixFQUFFLFFBQWdCO1FBQ3hELFFBQVEsU0FBUyxFQUFFO1lBRWpCLEtBQUssY0FBYyxDQUFDLG9CQUFvQjtnQkFDdEMsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztvQkFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsWUFB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QixHQUFZLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUd6RSxZQUFZLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBSS9DLElBQUksTUFBTSxHQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JDLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixDQUFDLE9BQU87b0JBQ3BELE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV0SCxNQUFNLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7Z0JBRTNHLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFFOUMsSUFBSSxDQUFDLFNBQVM7b0JBQ1osV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUU1QixXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFHcEMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUk7b0JBQ3JDLE1BQU0sV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3JDO1FBQ0gsQ0FBQztLQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3R9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1N0b3JhZ2VBdHRyaWJ1dGV9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7RGlzcGxheUNvbnZlcnRvciwgUElDfSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuaW1wb3J0IHtEYXRhdmlld0hlYWRlckJhc2V9IGZyb20gXCIuL0RhdGF2aWV3SGVhZGVyQmFzZVwiO1xyXG5pbXBvcnQge1RhYmxlQ2FjaGV9IGZyb20gXCIuL1RhYmxlQ2FjaGVcIjtcclxuaW1wb3J0IHtUYXNrfSBmcm9tIFwiLi4vdGFza3MvVGFza1wiO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSBcIi4uL2RhdGEvUmVjb3JkXCI7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gXCIuLi9kYXRhL0ZpZWxkXCI7XHJcbmltcG9ydCB7RmllbGRzVGFibGVFeHQgYXMgRmllbGRzVGFibGV9IGZyb20gXCIuLi9kYXRhL0ZpZWxkc1RhYmxlXCI7XHJcbmltcG9ydCB7Qm91bmRhcnl9IGZyb20gXCIuL0JvdW5kYXJ5XCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge1RhYmxlQ2FjaGVNYW5hZ2VyfSBmcm9tIFwiLi9UYWJsZUNhY2hlTWFuYWdlclwiO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSBcIi4uL0FjY2Vzc0hlbHBlclwiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gbGluayB0byBSZW1vdGUgdGFibGVcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFJlbW90ZURhdGF2aWV3SGVhZGVyIGV4dGVuZHMgRGF0YXZpZXdIZWFkZXJCYXNlIHtcclxuICBwcml2YXRlIF90YWJsZTogVGFibGVDYWNoZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfbGFzdEZldGNoUmVjUG9zOiBzdHJpbmcgPSBudWxsOyAvLyB0aGUgZGIgcG9zIG9mIHRoZSBsYXN0IGZldGNoZWQgcmVjb3JkIGZyb20gdGhlIHRhYmxlIGNhY2hlXHJcblxyXG4gIGNvbnN0cnVjdG9yKHRhc2s6IFRhc2spIHtcclxuICAgIHN1cGVyKHRhc2spO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DQUNIRURfVEFCTEU6XHJcbiAgICAgICAgaWYgKFRhYmxlQ2FjaGVNYW5hZ2VyLkluc3RhbmNlLlRhYmxlRXhpc3RzKHZhbHVlU3RyKSlcclxuICAgICAgICAgIHRoaXMuX3RhYmxlID0gVGFibGVDYWNoZU1hbmFnZXIuSW5zdGFuY2UuR2V0VGFibGVCeUlkKHZhbHVlU3RyKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3RhYmxlID0gbmV3IFRhYmxlQ2FjaGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgVGFibGVDYWNoZU1hbmFnZXIuSW5zdGFuY2UuSW5zZXJ0VGFibGUodGhpcy5fdGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JREVOVDpcclxuICAgICAgICB0aGlzLl90YWJsZS5TZXRUYWJsZUlkZW50KHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHdpbGwgcmV0dXJuIHRoZSBsaW5rZWQgcmVjb3JkIGFjY29yZGluZyB0byB0aGUgbGluayBwcm9wZXJ0aWVzIGFuZCB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gICB0aGlzIG1ldGhvZCB3aWxsIGNoYW5nZSB0aGUgY3VycmVudCByZWNvcmQgZmllbGRzIHZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGFzeW5jIGdldExpbmtlZFJlY29yZChjdXJSZWM6IFJlY29yZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGxua0ZsZHMgPSAoPEZpZWxkc1RhYmxlPiB0aGlzLl90YXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpKS5nZXRMaW5rRmllbGRzKHRoaXMuX2lkKTtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fY29uZC5nZXRWYWwoKSkge1xyXG5cclxuICAgICAgLy8gYnVpbGQgbG9jYXRlIGFuZCByYW5nZSB2ZWN0b3JzXHJcbiAgICAgIGlmICh0aGlzLkxvYyA9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5Mb2MgPSBuZXcgTGlzdDxCb3VuZGFyeT4oKTtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbG5rRmxkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGN1cnJMb2M6IEJvdW5kYXJ5ID0gbG5rRmxkcy5nZXRfSXRlbShpKS5Mb2NhdGU7XHJcbiAgICAgICAgICBpZiAoY3VyckxvYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuTG9jLnB1c2goY3VyckxvYyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGN1cnJMb2MuY29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIGNvbXB1dGUgdGhlIHJhbmdlIGFuZCBsb2NhdGUgZXhwcmVzc2lvbnMgYW5ld1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkxvYy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgIGF3YWl0IHRoaXMuTG9jLmdldF9JdGVtKGkpLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHNvcnQgdGhlIHRhYmxlIChpZiB0aGUgdGFibGUgd2FzIG5vdCBsb2FkZWQgeWV0IGl0IHdpbGwgYWxzbyBsb2FkIGl0XHJcbiAgICAgIGF3YWl0IHRoaXMuX3RhYmxlLlNvcnRUYWJsZSh0aGlzLl9rZXlJZHgsIHRoaXMuX2Rpcik7XHJcbiAgICAgIC8vIHBlcmZvcm0gdGhlIGxpbmtcclxuICAgICAgbGV0IHJlczogUmVjb3JkID0gdGhpcy5fdGFibGUuRmV0Y2godGhpcy5Mb2MpO1xyXG4gICAgICBpZiAocmVzID09IG51bGwpXHJcbiAgICAgIC8vIGxpbmsgZmFpbGRcclxuICAgICAgICBhd2FpdCB0aGlzLmluaXRSZWMoY3VyUmVjLCBmYWxzZSk7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5TGlua0ZsZFRvUmVjKGN1clJlYywgbG5rRmxkcywgcmVzLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY2FsY3VsYXRlIGluaXQgZXhwcmVzc2lvbnMgaWYgdGhlcmUgYXJlIGFueSBvciBkZWZhdWx0IHZhbHVlc1xyXG4gICAgZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLmluaXRSZWMoY3VyUmVjLCAgZmFsc2UpOyAvLyBldmVyeSBzY2VuYXJpbyB3aGVyZSB0aGUgbGlua2VkIGRpZCBub3RcclxuICAgIC8vIHJldHVybmVkIGFueSByZWNvcmQgZnJvIGV4YW1wbGUgaGVyZSB3aGVuXHJcbiAgICAvLyB0aGUgbGluayBjb25kaXRpb24gaXMgZmFsc2UgdGhlbiB0aGUgbGluayBpc1xyXG4gICAgLy8gY29uc2lkZXJlZCB0byBoYXMgZmFpbGVkIGFuZCBzaG91bGQgcmV0dXJuXHJcbiAgICAvLyBmYWxzZSBhcyByZXR1cm4gdmFsdWVcclxuXHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlmIHRoZSBsaW5rIHN1Y2NlZWRlZCBjb3BpZXMgdGhlIHZhbHVlcyByZXR1cm4gZnJvbSB0aGUgbGlua2VkIHRhYmxlIHJlY29yZFxyXG4gIC8vLyAgIHRvIHRoZSBjdXJyZW50IGRhdGEgdmlldyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgY29weUxpbmtGbGRUb1JlYyhjdXJSZWM6IFJlY29yZCwgbGlua0ZsZHM6IExpc3Q8RmllbGQ+LCB0YWJsZVJlYzogUmVjb3JkLCByZXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHdlIGdvdCBoZXJlIGl0IG1lYW5zIHRoYXQgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgZmV0Y2ggYSByZWNvcmQgZnJvbSB0aGUgbGlua1xyXG4gICAgLy8gc2V0IHRoZSBsYXN0RmV0Y2hSZWNQb3MgdG8gYmUgdGhlIHBvcyBvZiB0aGUgZmV0Y2hlZCByZWNvcmRcclxuICAgIHRoaXMuX2xhc3RGZXRjaFJlY1BvcyA9IHRhYmxlUmVjLmdldERiUG9zVmFsKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxpbmtGbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjdXJGbGQ6IEZpZWxkID0gbGlua0ZsZHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGN1clJlYy5zZXRGaWVsZFZhbHVlKGN1ckZsZC5nZXRJZCgpLCB0YWJsZVJlYy5HZXRGaWVsZFZhbHVlKGN1ckZsZC5DYWNoZVRhYmxlRmxkSWR4KSwgZmFsc2UpO1xyXG5cclxuICAgICAgLy8gY2xlYXIgdGhlIGludmFsaWQgZmxhZyBpbiBjYXNlIGl0IHdhcyBzZXRcclxuICAgICAgY3VyUmVjLmNsZWFyRmxhZyhjdXJGbGQuZ2V0SWQoKSwgUmVjb3JkLkZMQUdfSU5WQUxJRCk7XHJcbiAgICAgIGN1ckZsZC5pbnZhbGlkYXRlKHRydWUsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vIHNldCB0aGUgcmV0IHZhbHVlXHJcbiAgICBhd2FpdCB0aGlzLlNldFJldHVyblZhbHVlKHJldCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW4gY2FzZSB0aGUgbGluayBmYWlscyBzZXQgdGhlIHZhbHVlIHRvIGRlZmF1bHQgb3IgdG8gdGhlIHZhbHVlIG9mIHRoZSBpbml0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgaW5pdFJlYyhjdXJyUmVjOiBSZWNvcmQsIHJldDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgd2UgYXJlIGhlcmUgaXQgbWVhbnMgdGhhdCB3ZSB0cmllZCB0byBmZXRjaCBhIHJlY29yZCBidXQgZmFpbGVkIHRvIGZpbmQgb25lIHRoZXJlZm9yXHJcbiAgICAvLyB0aGUgbGFzdEZldGNoUmVjUG9zIHNob3VsZCBiZSBtYXJrZWQgYWNjb3JkaW5nbHlcclxuICAgIHRoaXMuX2xhc3RGZXRjaFJlY1BvcyA9IFwiI1wiO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuSW5pdExpbmtGaWVsZHMoY3VyclJlYyk7XHJcblxyXG4gICAgLy8gc2V0IHRoZSByZXQgdmFsdWVcclxuICAgIGxldCByZXRGbGQgPSB0aGlzLlJldHVybkZpZWxkO1xyXG4gICAgaWYgKHJldEZsZCAhPSBudWxsKSB7XHJcbiAgICAgIGN1cnJSZWMuc2V0RmllbGRWYWx1ZShyZXRGbGQuZ2V0SWQoKSwgKHJldCA/IFwiMVwiIDogXCIwXCIpLCBmYWxzZSk7XHJcbiAgICAgIHJldEZsZC5pbnZhbGlkYXRlKHRydWUsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBsYXN0IGZldGNoIHJlY29yZCBkYiBwb3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBnZXRMYXN0RmV0Y2hlZERiUG9zKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGFzdEZldGNoUmVjUG9zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgbGluayByZXN1bHRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1clJlY1wiPmN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXRcIj5saW5rIHN1Y2Nlc3M8L3BhcmFtPlxyXG4gIGFzeW5jIFNldFJldHVyblZhbHVlKCByZXQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJldHVybkZpZWxkOiBGaWVsZCA9IHRoaXMuUmV0dXJuRmllbGQ7XHJcblxyXG4gICAgaWYgKHJldHVybkZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBlbmZvcmNlVmFyaWFibGVDaGFuZ2U6IGJvb2xlYW4gPSByZXR1cm5GaWVsZC5nZXRUYXNrKCkgIT09IHRoaXMuVGFzaztcclxuXHJcbiAgICAgIC8vIGlmIHdlIGFyZSBmZXRjaGluZyBmaXJzdCBjaHVuayB3ZSBkaWRuJ3QgdXBkYXRlZCB0aGUgZXhlY3V0dWlvbiBzdGFjayB5ZXRcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgLy8gc2FtZSBhcyBOb25SZWNvbXB1dGVWYXJDaGFuZ2VFdmVudCBvbiBzZXJ2ZXIgZmV0Y2guY3BwXHJcblxyXG4gICAgICAvLyBpZiB0aGUgcmV0dXJuIGZpZWxkIGlzIG51bWVyaWMsIHRoZW4gY29udmVydCByZXN1bHQgdmFsdWUgdG9OdW0oKSBiZWZvcmUgcGFzc2luZyB0byBzZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKCkuXHJcbiAgICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IHJldCA/IFwiMVwiIDogXCIwXCI7XHJcbiAgICAgIGlmIChyZXR1cm5GaWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQylcclxuICAgICAgICByZXN1bHQgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLnRvTnVtKHJlc3VsdCwgbmV3IFBJQyhyZXR1cm5GaWVsZC5nZXRQaWN0dXJlKCksIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgMCksIDApO1xyXG5cclxuICAgICAgYXdhaXQgcmV0dXJuRmllbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZShyZXN1bHQsIGZhbHNlLCByZWNvbXB1dGUsIGZhbHNlLCBmYWxzZSwgZW5mb3JjZVZhcmlhYmxlQ2hhbmdlKTtcclxuXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIGlmICghcmVjb21wdXRlKVxyXG4gICAgICAgIHJldHVybkZpZWxkLnNldE1vZGlmaWVkKCk7XHJcblxyXG4gICAgICByZXR1cm5GaWVsZC5pbnZhbGlkYXRlKHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgIC8vIElmIGZpZWxkIGlzIGZyb20gYW5vdGhlciB0YXNrLCBuZWVkIHRvIHVwZGF0ZSB0aGUgZGlzcGxheSBhcyB3ZWxsXHJcbiAgICAgIGlmIChyZXR1cm5GaWVsZC5nZXRUYXNrKCkgIT09IHRoaXMuVGFzaylcclxuICAgICAgICBhd2FpdCByZXR1cm5GaWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==