@magic-xpa/engine 4.1100.0-dev4110.23 → 4.1100.0-dev4110.236
Sign up to get free protection for your applications and to get access to all the features.
- package/{esm2020 → esm2022}/index.mjs +188 -188
- package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
- package/esm2022/src/AccessHelper.mjs +15 -0
- package/esm2022/src/ClientManager.mjs +416 -0
- package/esm2022/src/CommandsProcessorBase.mjs +56 -0
- package/esm2022/src/CommandsProcessorManager.mjs +26 -0
- package/esm2022/src/CommandsTable.mjs +162 -0
- package/esm2022/src/ConstInterface.mjs +517 -0
- package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
- package/esm2022/src/FlowMonitorInterface.mjs +16 -0
- package/esm2022/src/GUIManager.mjs +62 -0
- package/esm2022/src/GlobalCommandsManager.mjs +34 -0
- package/esm2022/src/GuiEventsProcessor.mjs +156 -0
- package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +122 -0
- package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
- package/esm2022/src/bridge/MagicBridge.mjs +41 -0
- package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -26
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +260 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +20 -20
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +19 -19
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
- package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
- package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +37 -0
- package/esm2022/src/commands/ClientToServer/EventCommand.mjs +40 -0
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/{esm2020 → esm2022}/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SelectProgramCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +30 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
- package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
- package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
- package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
- package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
- package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
- package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
- package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
- package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
- package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
- package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
- package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
- package/esm2022/src/data/DataView.mjs +1613 -0
- package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
- package/esm2022/src/data/DataviewManager.mjs +28 -0
- package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
- package/esm2022/src/data/DvCache.mjs +67 -0
- package/esm2022/src/data/Field.mjs +646 -0
- package/esm2022/src/data/FieldBase.mjs +15 -0
- package/esm2022/src/data/FieldsTable.mjs +103 -0
- package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
- package/esm2022/src/data/Key.mjs +88 -0
- package/esm2022/src/data/Record.mjs +866 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/esm2022/src/data/TaskTransactionManager.mjs +103 -0
- package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
- package/{esm2020 → esm2022}/src/enums.mjs +23 -23
- package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2022/src/env/Environment.mjs +487 -0
- package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
- package/esm2022/src/env/LanguageData.mjs +227 -0
- package/esm2022/src/env/MirrorString.mjs +65 -0
- package/esm2022/src/event/ActionManager.mjs +91 -0
- package/esm2022/src/event/Event.mjs +1333 -0
- package/esm2022/src/event/EventHandler.mjs +766 -0
- package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
- package/esm2022/src/event/EventsManager.mjs +2988 -0
- package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
- package/esm2022/src/event/RunTimeEvent.mjs +399 -0
- package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
- package/esm2022/src/event/UserEventsTable.mjs +47 -0
- package/esm2022/src/exp/ExpTable.mjs +57 -0
- package/esm2022/src/exp/Expression.mjs +200 -0
- package/esm2022/src/exp/ExpressionDict.mjs +727 -0
- package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
- package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
- package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2022/src/exp/YesNoExp.mjs +36 -0
- package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
- package/esm2022/src/gui/FormsTable.mjs +66 -0
- package/esm2022/src/gui/MgControl.mjs +363 -0
- package/esm2022/src/gui/MgForm.mjs +1224 -0
- package/esm2022/src/http/HttpManager.mjs +97 -0
- package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
- package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
- package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
- package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
- package/esm2022/src/http/client/HttpUtility.mjs +84 -0
- package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
- package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +880 -0
- package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
- package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
- package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
- package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
- package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/esm2022/src/remote/ServerError.mjs +40 -0
- package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
- package/esm2022/src/rt/Argument.mjs +265 -0
- package/esm2022/src/rt/ArgumentsList.mjs +103 -0
- package/esm2022/src/rt/Boundary.mjs +152 -0
- package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
- package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
- package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
- package/esm2022/src/rt/ExecutionStack.mjs +94 -0
- package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
- package/esm2022/src/rt/HandlersTable.mjs +96 -0
- package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
- package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
- package/esm2022/src/rt/Operation.mjs +735 -0
- package/esm2022/src/rt/OperationTable.mjs +67 -0
- package/esm2022/src/rt/Recompute.mjs +355 -0
- package/esm2022/src/rt/RecomputeTable.mjs +63 -0
- package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
- package/esm2022/src/rt/ResultValue.mjs +10 -0
- package/esm2022/src/rt/TableCache.mjs +177 -0
- package/esm2022/src/rt/TableCacheManager.mjs +67 -0
- package/esm2022/src/rt/Transaction.mjs +53 -0
- package/esm2022/src/security/UserDetails.mjs +71 -0
- package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
- package/esm2022/src/tasks/MGData.mjs +552 -0
- package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
- package/esm2022/src/tasks/RCTimer.mjs +63 -0
- package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
- package/esm2022/src/tasks/Task.mjs +2499 -0
- package/esm2022/src/tasks/TaskBase.mjs +83 -0
- package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2022/src/tasks/TasksTable.mjs +80 -0
- package/esm2022/src/tasks/sort/Sort.mjs +5 -0
- package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
- package/esm2022/src/util/ConstUtils.mjs +14 -0
- package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
- package/esm2022/src/util/HeapSort.mjs +70 -0
- package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
- package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
- package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
- package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
- package/esm2022/src/util/PrmMap.mjs +152 -0
- package/esm2022/src/util/ReturnResult.mjs +46 -0
- package/esm2022/src/util/ReturnResultBase.mjs +18 -0
- package/esm2022/src/util/Scrambler.mjs +89 -0
- package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
- package/esm2022/src/util/cookie.service.mjs +92 -0
- package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29797 -29693
- package/fesm2022/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +187 -187
- package/package.json +8 -14
- package/src/AccessHelper.d.ts +20 -20
- package/src/ClientManager.d.ts +35 -32
- package/src/CommandsProcessorBase.d.ts +23 -23
- package/src/CommandsProcessorManager.d.ts +6 -6
- package/src/CommandsTable.d.ts +22 -22
- package/src/ConstInterface.d.ts +516 -515
- package/src/CurrentClientVersion.d.ts +1 -1
- package/src/FlowMonitorInterface.d.ts +15 -15
- package/src/GUIManager.d.ts +17 -17
- package/src/GlobalCommandsManager.d.ts +17 -17
- package/src/GuiEventsProcessor.d.ts +24 -24
- package/src/ICommandsTable.d.ts +9 -9
- package/src/ServerConfig.d.ts +35 -34
- package/src/bridge/IGuiEvent.d.ts +19 -19
- package/src/bridge/MagicBridge.d.ts +16 -16
- package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
- package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
- package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
- package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
- package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
- package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
- package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
- package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
- package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +15 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
- package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
- package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -7
- package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
- package/src/commands/DataViewCommandBase.d.ts +6 -6
- package/src/commands/IClientCommand.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +12 -12
- package/src/commands/IClientToServerCommandInfo.d.ts +3 -3
- package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
- package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
- package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
- package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
- package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
- package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
- package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
- package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
- package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
- package/src/communications/IConnectionStateManager.d.ts +4 -4
- package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
- package/src/data/DataSourceIdKey.d.ts +2 -2
- package/src/data/DataView.d.ts +162 -162
- package/src/data/DataViewBase.d.ts +12 -12
- package/src/data/DataviewManager.d.ts +14 -14
- package/src/data/DataviewManagerBase.d.ts +11 -11
- package/src/data/DvCache.d.ts +15 -15
- package/src/data/Field.d.ts +103 -103
- package/src/data/FieldBase.d.ts +23 -23
- package/src/data/FieldsTable.d.ts +27 -27
- package/src/data/IRecordsTable.d.ts +7 -7
- package/src/data/Key.d.ts +15 -15
- package/src/data/Record.d.ts +156 -156
- package/src/data/RecordOutOfDataViewException.d.ts +10 -10
- package/src/data/RecordsTable.d.ts +38 -38
- package/src/data/TaskTransactionManager.d.ts +17 -17
- package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
- package/src/enums.d.ts +21 -21
- package/src/env/EnvVariablesTable.d.ts +17 -17
- package/src/env/Environment.d.ts +118 -118
- package/src/env/ILanguageData.d.ts +3 -3
- package/src/env/LanguageData.d.ts +20 -20
- package/src/env/MirrorString.d.ts +15 -15
- package/src/event/ActionManager.d.ts +14 -14
- package/src/event/Event.d.ts +79 -79
- package/src/event/EventHandler.d.ts +66 -66
- package/src/event/EventHandlerPosition.d.ts +25 -25
- package/src/event/EventsManager.d.ts +205 -204
- package/src/event/IEventsManager.d.ts +77 -77
- package/src/event/RunTimeEvent.d.ts +126 -123
- package/src/event/RunTimeEventBase.d.ts +5 -5
- package/src/event/UserEventsTable.d.ts +11 -11
- package/src/exp/ExpTable.d.ts +11 -11
- package/src/exp/Expression.d.ts +37 -37
- package/src/exp/ExpressionDict.d.ts +12 -12
- package/src/exp/ExpressionEvaluator.d.ts +198 -198
- package/src/exp/ExpressionLocalJpn.d.ts +18 -18
- package/src/exp/GlobalParamsTable.d.ts +19 -19
- package/src/exp/YesNoExp.d.ts +9 -9
- package/src/gui/CreatedFormVector.d.ts +10 -10
- package/src/gui/FormsTable.d.ts +15 -15
- package/src/gui/MgControl.d.ts +60 -60
- package/src/gui/MgForm.d.ts +96 -93
- package/src/http/HttpManager.d.ts +25 -25
- package/src/http/client/HttpClientAsync.d.ts +16 -16
- package/src/http/client/HttpClientBase.d.ts +30 -30
- package/src/http/client/HttpClientEvents.d.ts +18 -18
- package/src/http/client/HttpClientSync.d.ts +17 -17
- package/src/http/client/HttpUtility.d.ts +10 -10
- package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
- package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
- package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
- package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
- package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
- package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
- package/src/remote/RemoteDataviewManager.d.ts +9 -9
- package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
- package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ServerError.d.ts +16 -16
- package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
- package/src/rt/Argument.d.ts +36 -36
- package/src/rt/ArgumentsList.d.ts +24 -24
- package/src/rt/Boundary.d.ts +27 -27
- package/src/rt/CompMainPrgTable.d.ts +10 -10
- package/src/rt/DataviewHeaderBase.d.ts +34 -34
- package/src/rt/DataviewHeaderFactory.d.ts +5 -5
- package/src/rt/DataviewHeaders.d.ts +12 -12
- package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
- package/src/rt/ExecutionStack.d.ts +22 -22
- package/src/rt/ExecutionStackEntry.d.ts +7 -7
- package/src/rt/HandlersTable.d.ts +19 -19
- package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
- package/src/rt/IDataviewHeader.d.ts +10 -10
- package/src/rt/IResultValue.d.ts +4 -4
- package/src/rt/LastFocusedManager.d.ts +23 -23
- package/src/rt/Operation.d.ts +97 -97
- package/src/rt/OperationTable.d.ts +15 -15
- package/src/rt/Recompute.d.ts +41 -41
- package/src/rt/RecomputeTable.d.ts +9 -9
- package/src/rt/RemoteDataviewHeader.d.ts +14 -14
- package/src/rt/ResultValue.d.ts +7 -7
- package/src/rt/TableCache.d.ts +29 -29
- package/src/rt/TableCacheManager.d.ts +10 -10
- package/src/rt/Transaction.d.ts +23 -23
- package/src/security/UserDetails.d.ts +16 -16
- package/src/tasks/IMGDataCollection.d.ts +26 -26
- package/src/tasks/MGData.d.ts +63 -63
- package/src/tasks/MGDataCollection.d.ts +42 -42
- package/src/tasks/RCTimer.d.ts +13 -13
- package/src/tasks/RemoteTaskService.d.ts +16 -16
- package/src/tasks/Task.d.ts +312 -312
- package/src/tasks/TaskBase.d.ts +123 -123
- package/src/tasks/TaskServiceBase.d.ts +16 -16
- package/src/tasks/TasksTable.d.ts +21 -21
- package/src/tasks/sort/Sort.d.ts +4 -4
- package/src/tasks/sort/SortCollection.d.ts +11 -11
- package/src/util/ConstUtils.d.ts +3 -3
- package/src/util/FlowMonitorQueue.d.ts +70 -70
- package/src/util/HeapSort.d.ts +6 -6
- package/src/util/IMirrorXML.d.ts +6 -6
- package/src/util/IServerConfig.d.ts +11 -11
- package/src/util/MgBlockingQueue.d.ts +5 -5
- package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
- package/src/util/MgPriorityQueue.d.ts +13 -13
- package/src/util/ParamParseResult.d.ts +6 -6
- package/src/util/PrmMap.d.ts +28 -28
- package/src/util/ReturnResult.d.ts +18 -18
- package/src/util/ReturnResultBase.d.ts +11 -11
- package/src/util/Scrambler.d.ts +10 -10
- package/src/util/UniqueIDUtils.d.ts +4 -4
- package/src/util/cookie.service.d.ts +8 -8
- package/esm2020/src/AccessHelper.mjs +0 -9
- package/esm2020/src/ClientManager.mjs +0 -399
- package/esm2020/src/CommandsProcessorBase.mjs +0 -58
- package/esm2020/src/CommandsProcessorManager.mjs +0 -26
- package/esm2020/src/CommandsTable.mjs +0 -162
- package/esm2020/src/ConstInterface.mjs +0 -516
- package/esm2020/src/FlowMonitorInterface.mjs +0 -16
- package/esm2020/src/GUIManager.mjs +0 -62
- package/esm2020/src/GlobalCommandsManager.mjs +0 -34
- package/esm2020/src/GuiEventsProcessor.mjs +0 -154
- package/esm2020/src/ServerConfig.mjs +0 -117
- package/esm2020/src/bridge/MagicBridge.mjs +0 -41
- package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +0 -40
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
- package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
- package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
- package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
- package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
- package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
- package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
- package/esm2020/src/data/DataView.mjs +0 -1610
- package/esm2020/src/data/DataviewManager.mjs +0 -28
- package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
- package/esm2020/src/data/DvCache.mjs +0 -67
- package/esm2020/src/data/Field.mjs +0 -646
- package/esm2020/src/data/FieldBase.mjs +0 -18
- package/esm2020/src/data/FieldsTable.mjs +0 -103
- package/esm2020/src/data/Key.mjs +0 -88
- package/esm2020/src/data/Record.mjs +0 -846
- package/esm2020/src/data/RecordsTable.mjs +0 -267
- package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
- package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
- package/esm2020/src/env/Environment.mjs +0 -489
- package/esm2020/src/env/LanguageData.mjs +0 -226
- package/esm2020/src/env/MirrorString.mjs +0 -65
- package/esm2020/src/event/ActionManager.mjs +0 -91
- package/esm2020/src/event/Event.mjs +0 -1333
- package/esm2020/src/event/EventHandler.mjs +0 -766
- package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
- package/esm2020/src/event/EventsManager.mjs +0 -2975
- package/esm2020/src/event/RunTimeEvent.mjs +0 -392
- package/esm2020/src/event/UserEventsTable.mjs +0 -47
- package/esm2020/src/exp/ExpTable.mjs +0 -59
- package/esm2020/src/exp/Expression.mjs +0 -200
- package/esm2020/src/exp/ExpressionDict.mjs +0 -727
- package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
- package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
- package/esm2020/src/exp/YesNoExp.mjs +0 -36
- package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
- package/esm2020/src/gui/FormsTable.mjs +0 -66
- package/esm2020/src/gui/MgControl.mjs +0 -353
- package/esm2020/src/gui/MgForm.mjs +0 -1181
- package/esm2020/src/http/HttpManager.mjs +0 -97
- package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
- package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
- package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
- package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
- package/esm2020/src/http/client/HttpUtility.mjs +0 -84
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
- package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
- package/esm2020/src/remote/ServerError.mjs +0 -40
- package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
- package/esm2020/src/rt/Argument.mjs +0 -265
- package/esm2020/src/rt/ArgumentsList.mjs +0 -103
- package/esm2020/src/rt/Boundary.mjs +0 -152
- package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
- package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
- package/esm2020/src/rt/ExecutionStack.mjs +0 -94
- package/esm2020/src/rt/HandlersTable.mjs +0 -96
- package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
- package/esm2020/src/rt/Operation.mjs +0 -735
- package/esm2020/src/rt/OperationTable.mjs +0 -67
- package/esm2020/src/rt/Recompute.mjs +0 -355
- package/esm2020/src/rt/RecomputeTable.mjs +0 -63
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
- package/esm2020/src/rt/ResultValue.mjs +0 -12
- package/esm2020/src/rt/TableCache.mjs +0 -177
- package/esm2020/src/rt/TableCacheManager.mjs +0 -67
- package/esm2020/src/rt/Transaction.mjs +0 -53
- package/esm2020/src/security/UserDetails.mjs +0 -71
- package/esm2020/src/tasks/MGData.mjs +0 -552
- package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
- package/esm2020/src/tasks/RCTimer.mjs +0 -63
- package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
- package/esm2020/src/tasks/Task.mjs +0 -2495
- package/esm2020/src/tasks/TaskBase.mjs +0 -87
- package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
- package/esm2020/src/tasks/TasksTable.mjs +0 -80
- package/esm2020/src/tasks/sort/Sort.mjs +0 -7
- package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
- package/esm2020/src/util/ConstUtils.mjs +0 -14
- package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
- package/esm2020/src/util/HeapSort.mjs +0 -70
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
- package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
- package/esm2020/src/util/PrmMap.mjs +0 -151
- package/esm2020/src/util/ReturnResult.mjs +0 -46
- package/esm2020/src/util/ReturnResultBase.mjs +0 -18
- package/esm2020/src/util/Scrambler.mjs +0 -89
- package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
- package/esm2020/src/util/cookie.service.mjs +0 -92
- package/fesm2015/magic-xpa-engine.mjs +0 -30835
- package/fesm2015/magic-xpa-engine.mjs.map +0 -1
- package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,416 @@
|
|
1
|
+
import { ApplicationException, DateTime, NString, RefParam } from '@magic-xpa/mscorelib';
|
2
|
+
import { DateTimeUtils, InternalInterface, Logger, Misc, OSEnvironment, StorageAttribute, XMLConstants } from '@magic-xpa/utils';
|
3
|
+
import { Commands, CommandType, DisplayConvertor, Events, GuiDataCollection, GuiEnvironment, Manager, PIC, PropInterface, RuntimeContextBase, Styles, ExpVal } from '@magic-xpa/gui';
|
4
|
+
import { EventsManager } from './event/EventsManager';
|
5
|
+
import { GuiEventsProcessor } from './GuiEventsProcessor';
|
6
|
+
import { Environment } from './env/Environment';
|
7
|
+
import { LanguageData } from './env/LanguageData';
|
8
|
+
import { TasksTable } from './tasks/TasksTable';
|
9
|
+
import { Task } from './tasks/Task';
|
10
|
+
import { MGDataCollection } from './tasks/MGDataCollection';
|
11
|
+
import { UniqueIDUtils } from './util/UniqueIDUtils';
|
12
|
+
import { HttpManager } from './http/HttpManager';
|
13
|
+
import { CommandsTable } from './CommandsTable';
|
14
|
+
import { RemoteCommandsProcessor } from './remote/RemoteCommandsProcessor';
|
15
|
+
import { CommandsProcessorBase_SendingInstruction } from './CommandsProcessorBase';
|
16
|
+
import { CommandsProcessorManager } from './CommandsProcessorManager';
|
17
|
+
import { MGData } from './tasks/MGData';
|
18
|
+
import { ServerError } from './remote/ServerError';
|
19
|
+
import { HttpClientEvents } from './http/client/HttpClientEvents';
|
20
|
+
import { CommandFactory } from './commands/ClientToServer/CommandFactory';
|
21
|
+
import { CurrentClientVersion } from './CurrentClientVersion';
|
22
|
+
import { LastFocusedManager } from './rt/LastFocusedManager';
|
23
|
+
import { EnvParamsTable } from './env/EnvVariablesTable';
|
24
|
+
import { GlobalParams, MirrorExpVal } from './exp/GlobalParamsTable';
|
25
|
+
import { OpenURLCommand } from './commands/ServerToClient/OpenURLCommand';
|
26
|
+
import { ServerConfig } from './ServerConfig';
|
27
|
+
import { AccessHelper } from './AccessHelper';
|
28
|
+
import { GUIManager } from "./GUIManager";
|
29
|
+
export class ClientManager {
|
30
|
+
static _instance = null;
|
31
|
+
_globalUniqueSessionId = null;
|
32
|
+
_buttonIsClicked = false;
|
33
|
+
static handlingFirstParkableControl = false;
|
34
|
+
static _executionPropertiesFileName = null;
|
35
|
+
static assetsURL = "./assets";
|
36
|
+
static get Instance() {
|
37
|
+
if (ClientManager._instance === null)
|
38
|
+
ClientManager._instance = new ClientManager();
|
39
|
+
return ClientManager._instance;
|
40
|
+
}
|
41
|
+
AddEvent(guiEvent) {
|
42
|
+
let task = MGDataCollection.Instance.GetTaskByID(guiEvent.TaskID);
|
43
|
+
let lineIdx = +guiEvent.Line;
|
44
|
+
let dvRowIdx = 0;
|
45
|
+
if (task != null) {
|
46
|
+
let control = null;
|
47
|
+
if (guiEvent.ControlName !== null)
|
48
|
+
control = task.getForm().GetCtrl(guiEvent.ControlName);
|
49
|
+
if (control != null) {
|
50
|
+
let dv = task.DataView;
|
51
|
+
if (control.IsTableChild) {
|
52
|
+
lineIdx -= dv.RecordsBeforeCurrentView;
|
53
|
+
}
|
54
|
+
switch (guiEvent.EventType) {
|
55
|
+
case "columnSort":
|
56
|
+
if (control.isColumnSortable()) {
|
57
|
+
Events.OnColumnClick(control, guiEvent.Line, guiEvent.ControlName);
|
58
|
+
}
|
59
|
+
break;
|
60
|
+
case "mousedown":
|
61
|
+
if (control.isButton() || control.isCheckBox() || (control.ConnectedControl && guiEvent.fromButton)) {
|
62
|
+
this._buttonIsClicked = true;
|
63
|
+
}
|
64
|
+
else if (!control.isSubform())
|
65
|
+
Events.GetRuntimeContext(Manager.GetCurrentContextID()).LastClickedCtrlName = control.getName();
|
66
|
+
break;
|
67
|
+
case "click":
|
68
|
+
if (control.isButton() || (control.ConnectedControl && guiEvent.fromButton)) {
|
69
|
+
Events.OnSelection("", control, lineIdx, true);
|
70
|
+
Events.GetRuntimeContext(Manager.GetCurrentContextID()).LastClickedCtrlName = control.getName();
|
71
|
+
this._buttonIsClicked = false;
|
72
|
+
}
|
73
|
+
else {
|
74
|
+
Events.OnFocus(control, lineIdx, true, false);
|
75
|
+
let produceClick = control.isButton() || control.isTextControl() || control.isLabel() || control.isTabControl() || control.isTableControl() || control.isComboBox() || control.isImageControl();
|
76
|
+
Events.OnMouseDown(control.getForm(), control, null, true, lineIdx, false, produceClick);
|
77
|
+
}
|
78
|
+
break;
|
79
|
+
case "focus":
|
80
|
+
if (this._buttonIsClicked || (control.ConnectedControl && guiEvent.fromButton))
|
81
|
+
return;
|
82
|
+
if (!ClientManager.handlingFirstParkableControl)
|
83
|
+
Events.OnFocus(control, lineIdx, true, false);
|
84
|
+
break;
|
85
|
+
case "dblclick":
|
86
|
+
Events.OnDblClick(control, lineIdx);
|
87
|
+
break;
|
88
|
+
case "selectionchanged":
|
89
|
+
Events.OnSelection(guiEvent.Value, control, lineIdx, true);
|
90
|
+
break;
|
91
|
+
case "keydown":
|
92
|
+
Events.OnKeyDown(task.getForm(), control, guiEvent.modifiers, guiEvent.keyCode, 0, 0, '', false, '', true);
|
93
|
+
break;
|
94
|
+
case "setexternalvalue":
|
95
|
+
EventsManager.Instance.AddExternalValueEvent(control, guiEvent.externalValue, guiEvent.param);
|
96
|
+
break;
|
97
|
+
default:
|
98
|
+
break;
|
99
|
+
}
|
100
|
+
}
|
101
|
+
else {
|
102
|
+
switch (guiEvent.EventType) {
|
103
|
+
case "focusOnNonMagicControl":
|
104
|
+
control = LastFocusedManager.getLastFocusedControl();
|
105
|
+
if (control !== null) {
|
106
|
+
Events.OnFocusOnNonMagicControl(control);
|
107
|
+
}
|
108
|
+
break;
|
109
|
+
case "click":
|
110
|
+
if (guiEvent.ControlName === "magicRow") {
|
111
|
+
dvRowIdx = guiEvent.Line - task.DataView.RecordsBeforeCurrentView;
|
112
|
+
EventsManager.Instance.addGuiTriggeredEventWithTaskAndCodeAndLine(task, InternalInterface.MG_ACT_REC_PREFIX, dvRowIdx);
|
113
|
+
}
|
114
|
+
break;
|
115
|
+
case "navigateInTable":
|
116
|
+
if (guiEvent.ControlName === "magicRow")
|
117
|
+
this.handleNavigateInRowEvent(task, guiEvent.Value);
|
118
|
+
break;
|
119
|
+
case "close":
|
120
|
+
if (task.IsRoute())
|
121
|
+
EventsManager.Instance.AddRouterClosedEvent(task);
|
122
|
+
else
|
123
|
+
Events.CloseFormEvent(task.getForm());
|
124
|
+
break;
|
125
|
+
case "dispose":
|
126
|
+
MGDataCollection.Instance.deleteMGDataTree(task.getMgdID());
|
127
|
+
break;
|
128
|
+
case "resize":
|
129
|
+
Events.TableResizeEvent(task.getForm().getTableCtrl(), guiEvent.PageSize);
|
130
|
+
case "getRows":
|
131
|
+
dvRowIdx = lineIdx - task.DataView.RecordsBeforeCurrentView;
|
132
|
+
let lastFocusedVal = { guiMgControl: task.getForm().getTableCtrl(), Line: dvRowIdx, Val: "" };
|
133
|
+
Events.OnGetRowsData(task.getForm().getTableCtrl(), dvRowIdx, true, lastFocusedVal);
|
134
|
+
break;
|
135
|
+
case "RouterNavigate":
|
136
|
+
EventsManager.Instance.AddRouteEvent(task, InternalInterface.MG_ACT_WEBCLIENT_ROUTE, guiEvent.RouterPath, guiEvent.RouterOutletName, guiEvent.RouterParams);
|
137
|
+
break;
|
138
|
+
case "setexternalvalue":
|
139
|
+
Logger.Instance.WriteErrorToLog(NString.Format("Unable to find {0}: Trying to set value for a non-existing control.", guiEvent.ControlName));
|
140
|
+
break;
|
141
|
+
default:
|
142
|
+
break;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
else
|
147
|
+
switch (guiEvent.EventType) {
|
148
|
+
case "confirmationClosed":
|
149
|
+
this.ConfirmationClosed(guiEvent.keyCode);
|
150
|
+
break;
|
151
|
+
}
|
152
|
+
}
|
153
|
+
handleNavigateInRowEvent(task, evt) {
|
154
|
+
let internalEvt = InternalInterface.MG_ACT_NONE;
|
155
|
+
evt = evt.toLowerCase();
|
156
|
+
switch (evt) {
|
157
|
+
case "begin-page":
|
158
|
+
internalEvt = InternalInterface.MG_ACT_TBL_BEGPAGE;
|
159
|
+
break;
|
160
|
+
case "previous-page":
|
161
|
+
internalEvt = InternalInterface.MG_ACT_TBL_PRVPAGE;
|
162
|
+
break;
|
163
|
+
case "end-page":
|
164
|
+
internalEvt = InternalInterface.MG_ACT_TBL_ENDPAGE;
|
165
|
+
break;
|
166
|
+
case "next-page":
|
167
|
+
internalEvt = InternalInterface.MG_ACT_TBL_NXTPAGE;
|
168
|
+
break;
|
169
|
+
case "previous-line":
|
170
|
+
internalEvt = InternalInterface.MG_ACT_TBL_PRVLINE;
|
171
|
+
break;
|
172
|
+
case "next-line":
|
173
|
+
internalEvt = InternalInterface.MG_ACT_TBL_NXTLINE;
|
174
|
+
break;
|
175
|
+
case "begin-table":
|
176
|
+
internalEvt = InternalInterface.MG_ACT_TBL_BEGTBL;
|
177
|
+
break;
|
178
|
+
case "end-table":
|
179
|
+
internalEvt = InternalInterface.MG_ACT_TBL_ENDTBL;
|
180
|
+
break;
|
181
|
+
}
|
182
|
+
if (internalEvt != InternalInterface.MG_ACT_NONE)
|
183
|
+
EventsManager.Instance.addGuiTriggeredEventWithTaskAndCode(task, internalEvt);
|
184
|
+
}
|
185
|
+
ConfirmationClosed(res) {
|
186
|
+
Commands.ResolvePromise(res);
|
187
|
+
}
|
188
|
+
async WorkThreadExecution() {
|
189
|
+
if (Logger.Instance.ShouldLog()) {
|
190
|
+
Logger.Instance.WriteToLog("", true);
|
191
|
+
Logger.Instance.WriteToLog("Started on " + DateTimeUtils.ToString(DateTime.Now, XMLConstants.ERROR_LOG_DATE_FORMAT, Logger.Instance), true);
|
192
|
+
this.WriteExecutionPropertiesToLog();
|
193
|
+
}
|
194
|
+
try {
|
195
|
+
if (await CommandsProcessorManager.StartSession()) {
|
196
|
+
let mgDataTab = MGDataCollection.Instance;
|
197
|
+
let startupMgData = mgDataTab.StartupMgData;
|
198
|
+
mgDataTab.currMgdID = startupMgData.GetId();
|
199
|
+
let nonInteractiveTask = null;
|
200
|
+
if (!startupMgData.IsAborting)
|
201
|
+
nonInteractiveTask = await Task.StartProgram(false, false);
|
202
|
+
if (nonInteractiveTask === null)
|
203
|
+
await EventsManager.Instance.EventsLoop(startupMgData);
|
204
|
+
else
|
205
|
+
await EventsManager.Instance.NonInteractiveEventsLoop(startupMgData, nonInteractiveTask);
|
206
|
+
EventsManager.Instance.setEndOfWork(true);
|
207
|
+
}
|
208
|
+
}
|
209
|
+
catch (ex) {
|
210
|
+
if (ex instanceof ApplicationException) {
|
211
|
+
let isNoResultError = false;
|
212
|
+
if (ex instanceof ServerError && ex.GetCode() === ServerError.INF_NO_RESULT)
|
213
|
+
isNoResultError = true;
|
214
|
+
if (!isNoResultError)
|
215
|
+
await EventsManager.Instance.ProcessAbortingError(ex);
|
216
|
+
EventsManager.Instance.setEndOfWork(true);
|
217
|
+
}
|
218
|
+
else
|
219
|
+
throw ex;
|
220
|
+
}
|
221
|
+
finally {
|
222
|
+
await EventsManager.Instance.CheckAndShowSpinner(false);
|
223
|
+
Commands.addGlobalCommand(CommandType.EXIT_MAGIC);
|
224
|
+
Commands.beginInvoke();
|
225
|
+
}
|
226
|
+
}
|
227
|
+
WriteExecutionPropertiesToLog() {
|
228
|
+
if (Logger.Instance.ShouldLogServerRelatedMessages()) {
|
229
|
+
Logger.Instance.WriteToLog("-----------------------------------------------------------------------------", true);
|
230
|
+
Logger.Instance.WriteToLog("Execution Properties:", true);
|
231
|
+
let propsString = JSON.stringify(ServerConfig.Instance);
|
232
|
+
Logger.Instance.WriteToLog(propsString, true);
|
233
|
+
Logger.Instance.WriteToLog("-----------------------------------------------------------------------------", true);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
constructor() {
|
237
|
+
ClientManager._executionPropertiesFileName = localStorage.getItem("ServerConfigURL") ?? "./assets/server-config.json";
|
238
|
+
RuntimeContextBase.Instance.Init(RemoteCommandsProcessor.RC_NO_CONTEXT_ID);
|
239
|
+
LastFocusedManager.Instance.Init(MGDataCollection.Instance);
|
240
|
+
LastFocusedManager.Instance.LastActionTime = Misc.getSystemMilliseconds();
|
241
|
+
RemoteCommandsProcessor.ShouldScrambleAndUnscrambleMessages = true;
|
242
|
+
this._globalUniqueSessionId = UniqueIDUtils.GetUniqueMachineID() + "_";
|
243
|
+
this.RegisterDelegates();
|
244
|
+
}
|
245
|
+
InitGuiManager() {
|
246
|
+
Manager.EventsManager = EventsManager.Instance;
|
247
|
+
Manager.DefaultServerName = ServerConfig.Instance.getServer();
|
248
|
+
Manager.DefaultProtocol = ServerConfig.Instance.getProtocol();
|
249
|
+
GuiEnvironment.Environment = Environment.Instance;
|
250
|
+
GuiDataCollection.MGDataTable = MGDataCollection.Instance;
|
251
|
+
RuntimeContextBase.noContextId = RemoteCommandsProcessor.RC_NO_CONTEXT_ID;
|
252
|
+
}
|
253
|
+
InitCircularReferencesBypasses() {
|
254
|
+
TasksTable.createNewtask = Task.CreateTask;
|
255
|
+
OpenURLCommand.createNewCommandsTable = CommandsTable.createCommandsTable;
|
256
|
+
AccessHelper.eventsManager = EventsManager.Instance;
|
257
|
+
AccessHelper.mgDataTable = MGDataCollection.Instance;
|
258
|
+
AccessHelper.envParamsTable = EnvParamsTable.Instance;
|
259
|
+
AccessHelper.globalParams = GlobalParams.Instance;
|
260
|
+
AccessHelper.languageData = LanguageData.Instance;
|
261
|
+
AccessHelper.environment = Environment.Instance;
|
262
|
+
}
|
263
|
+
static Main(httpClient, args) {
|
264
|
+
let val;
|
265
|
+
args.forEach((value, key) => {
|
266
|
+
val = new ExpVal(StorageAttribute.UNICODE, false, value);
|
267
|
+
GlobalParams.Instance.setValue(key, new MirrorExpVal(val), true);
|
268
|
+
});
|
269
|
+
ClientManager.StartExecution(httpClient);
|
270
|
+
Logger.Instance.Flush();
|
271
|
+
}
|
272
|
+
static async StopExecution() {
|
273
|
+
try {
|
274
|
+
HttpManager.GetInstance().IsAbortingMagicEngine = true;
|
275
|
+
MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI = true;
|
276
|
+
await MGDataCollection.Instance.StartupMgData.getFirstTask().endTask(true, false, false);
|
277
|
+
}
|
278
|
+
catch (ex3) {
|
279
|
+
if (ex3 instanceof ApplicationException) {
|
280
|
+
Logger.Instance.WriteExceptionToLog(ex3);
|
281
|
+
}
|
282
|
+
else
|
283
|
+
throw ex3;
|
284
|
+
}
|
285
|
+
}
|
286
|
+
static async StartExecution(httpClient) {
|
287
|
+
HttpManager.setNativeHttpClient(httpClient);
|
288
|
+
let loaded = await ClientManager.Instance.LoadExecutionProps();
|
289
|
+
if (loaded) {
|
290
|
+
new GuiEventsProcessor();
|
291
|
+
ClientManager.Instance.InitGuiManager();
|
292
|
+
ClientManager.Instance.InitCircularReferencesBypasses();
|
293
|
+
let versionString = CurrentClientVersion === '0.0.0.0' ? "Development mode" : "Version : " + CurrentClientVersion;
|
294
|
+
console.log("Magic Web Client. " + versionString);
|
295
|
+
HttpManager.GetInstance().HttpCommunicationTimeoutMS = ServerConfig.Instance.GetFirstHttpRequestTimeout();
|
296
|
+
EventsManager.Instance.Init();
|
297
|
+
Logger.Instance.Initialize(RemoteCommandsProcessor.GetInstance().parseLogLevel(ServerConfig.Instance.getInternalLogLevel()), false);
|
298
|
+
let mgd = new MGData(new CommandsTable(), new CommandsTable(), 0, null, false);
|
299
|
+
await MGDataCollection.Instance.addMGData(mgd, 0, true);
|
300
|
+
await ClientManager.Instance.WorkThreadExecution();
|
301
|
+
if (Logger.Instance.ShouldLog()) {
|
302
|
+
Logger.Instance.WriteToLog(OSEnvironment.EolSeq + "Ended on " + DateTimeUtils.ToString(DateTime.Now, XMLConstants.ERROR_LOG_DATE_FORMAT, Logger.Instance) + OSEnvironment.EolSeq + OSEnvironment.EolSeq, false);
|
303
|
+
}
|
304
|
+
}
|
305
|
+
else {
|
306
|
+
await GUIManager.Instance.MessageBox("Error", "Failed to load server configuration file (" + this._executionPropertiesFileName + ")", Styles.MSGBOX_ICON_ERROR | Styles.MSGBOX_BUTTON_OK);
|
307
|
+
}
|
308
|
+
}
|
309
|
+
async LoadExecutionProps() {
|
310
|
+
let response = "";
|
311
|
+
let succeeded = true;
|
312
|
+
try {
|
313
|
+
let isError = new RefParam(false);
|
314
|
+
response = await HttpManager.GetInstance().GetContent(ClientManager._executionPropertiesFileName, null, false, isError);
|
315
|
+
ServerConfig.Instance.Init(JSON.parse(response));
|
316
|
+
let assetsURL = ServerConfig.Instance.getAssetsURL();
|
317
|
+
if (assetsURL !== null) {
|
318
|
+
ClientManager.assetsURL = assetsURL;
|
319
|
+
}
|
320
|
+
window.assetsURL = ClientManager.assetsURL;
|
321
|
+
}
|
322
|
+
catch (ex) {
|
323
|
+
succeeded = false;
|
324
|
+
}
|
325
|
+
return succeeded;
|
326
|
+
}
|
327
|
+
GetGlobalUniqueSessionID() {
|
328
|
+
return this._globalUniqueSessionId;
|
329
|
+
}
|
330
|
+
static GetControlPictureMask(taskId, controlName) {
|
331
|
+
let pic = null;
|
332
|
+
let task = MGDataCollection.Instance.GetTaskByID(taskId);
|
333
|
+
let control = null;
|
334
|
+
if (controlName !== null && task != null) {
|
335
|
+
control = task.getForm().GetCtrl(controlName);
|
336
|
+
pic = control.getPIC();
|
337
|
+
}
|
338
|
+
return pic;
|
339
|
+
}
|
340
|
+
static GetFormattedValue(taskId, controlName, value, rowId) {
|
341
|
+
let pic = null;
|
342
|
+
let task = MGDataCollection.Instance.GetTaskByID(taskId);
|
343
|
+
let control = null;
|
344
|
+
let newValue = value;
|
345
|
+
if (controlName !== null && task !== null)
|
346
|
+
control = task.getForm().GetCtrl(controlName);
|
347
|
+
if (control != null && control.DataType == StorageAttribute.NUMERIC) {
|
348
|
+
if (control.isRepeatable() && control.getProp(PropInterface.PROP_TYPE_FORMAT).isExpression()) {
|
349
|
+
let picval = control.getProp(PropInterface.PROP_TYPE_FORMAT).getPrevValue(+rowId);
|
350
|
+
pic = new PIC(picval, StorageAttribute.NUMERIC, control.getForm().getTask().getCompIdx());
|
351
|
+
}
|
352
|
+
else
|
353
|
+
pic = control.getPIC();
|
354
|
+
let dispValue = String(value);
|
355
|
+
let newPic = pic.getUnformattedNumericPic();
|
356
|
+
let num = DisplayConvertor.Instance.toNum(dispValue, newPic, 0);
|
357
|
+
newValue = DisplayConvertor.Instance.fromNum(num, pic);
|
358
|
+
}
|
359
|
+
return newValue;
|
360
|
+
}
|
361
|
+
static GetRangedValue(taskId, controlName, value) {
|
362
|
+
let task = MGDataCollection.Instance.GetTaskByID(taskId);
|
363
|
+
let control = null;
|
364
|
+
if (controlName !== null) {
|
365
|
+
control = task.getForm().GetCtrl(controlName);
|
366
|
+
return control.getRangedValue(value);
|
367
|
+
}
|
368
|
+
return null;
|
369
|
+
}
|
370
|
+
static ValidateControlValue(taskId, controlName, value) {
|
371
|
+
let task = MGDataCollection.Instance.GetTaskByID(taskId);
|
372
|
+
let control = null;
|
373
|
+
if (controlName !== null) {
|
374
|
+
control = task.getForm().GetCtrl(controlName);
|
375
|
+
return control.validate(value);
|
376
|
+
}
|
377
|
+
return null;
|
378
|
+
}
|
379
|
+
static GetFldRanges(taskId, controlName) {
|
380
|
+
let task = MGDataCollection.Instance.GetTaskByID(taskId);
|
381
|
+
let control = null;
|
382
|
+
if (controlName !== null) {
|
383
|
+
control = task.getForm().GetCtrl(controlName);
|
384
|
+
return control.getRanges();
|
385
|
+
}
|
386
|
+
return null;
|
387
|
+
}
|
388
|
+
static TransCacheExists() {
|
389
|
+
let clientTransCacheExists = AccessHelper.mgDataTable.getCurrMGData().clientTransactionCacheExists();
|
390
|
+
let serverTransactionCacheExists = AccessHelper.mgDataTable.getCurrMGData().serverTransactionCacheExists();
|
391
|
+
return clientTransCacheExists || serverTransactionCacheExists;
|
392
|
+
}
|
393
|
+
RegisterDelegates() {
|
394
|
+
HttpClientEvents.GetExecutionProperty_Event = ServerConfig.Instance.GetExecutionProperty.bind(ServerConfig.Instance);
|
395
|
+
HttpClientEvents.GetRuntimeCtxID_Event = this.GetRuntimeCtxID.bind(this);
|
396
|
+
HttpClientEvents.GetGlobalUniqueSessionID_Event = this.GetGlobalUniqueSessionID.bind(this);
|
397
|
+
HttpClientEvents.ShouldDisplayGenericError_Event = ServerConfig.Instance.ShouldDisplayGenericError.bind(ServerConfig.Instance);
|
398
|
+
}
|
399
|
+
GetRuntimeCtxID() {
|
400
|
+
return RuntimeContextBase.Instance.ContextID;
|
401
|
+
}
|
402
|
+
static TerminateContextUsingFetchAPI() {
|
403
|
+
if (RemoteCommandsProcessor.IsSessionReInitializing)
|
404
|
+
return;
|
405
|
+
HttpManager.GetInstance().IsAbortingMagicEngine = true;
|
406
|
+
MGDataCollection.Instance.getCurrMGData().CmdsToServer.Clear();
|
407
|
+
let contextTerminationEventCommand = CommandFactory.
|
408
|
+
CreateContextTerminationEventCommand(MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag());
|
409
|
+
MGDataCollection.Instance.getCurrMGData().CmdsToServer.Add(contextTerminationEventCommand);
|
410
|
+
RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.ONLY_COMMANDS);
|
411
|
+
}
|
412
|
+
static GetAssetsURL() {
|
413
|
+
return ClientManager.assetsURL;
|
414
|
+
}
|
415
|
+
}
|
416
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpZW50TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvQ2xpZW50TWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RixPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixNQUFNLEVBQ04sSUFBSSxFQUNKLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNiLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsY0FBYyxFQUVkLE9BQU8sRUFFUCxHQUFHLEVBQUUsYUFBYSxFQUNsQixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLE1BQU0sRUFDUCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUc5QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFDLGFBQWEs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Q0FBQztJQUMvQyxDQUFDO0lBS0QsTUFBTSxDQUFDLDZCQUE2QjtRQUlsQyxJQUFJLHVCQUF1QixDQUFDLHVCQUF1QjtZQUNqRCxPQUFPO1FBQ1QsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUd2RCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRS9ELElBQUksOEJBQThCLEdBQW1DLGNBQWM7WUFDbkYsb0NBQW9DLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFpQiw4QkFBOEIsQ0FBQyxDQUFDO1FBRzNHLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRU0sTUFBTSxDQUFDLFlBQVk7UUFDeEIsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBEYXRlVGltZSwgTlN0cmluZywgUmVmUGFyYW19IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuXHJcbmltcG9ydCB7XHJcbiAgRGF0ZVRpbWVVdGlscyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWlzYyxcclxuICBPU0Vudmlyb25tZW50LFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgWE1MQ29uc3RhbnRzXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBFdmVudHMsXHJcbiAgR3VpRGF0YUNvbGxlY3Rpb24sXHJcbiAgR3VpRW52aXJvbm1lbnQsXHJcbiAgTGFzdEZvY3VzZWRWYWwsXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIFBJQywgUHJvcEludGVyZmFjZSxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIEV4cFZhbFxyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHtFdmVudHNNYW5hZ2VyfSBmcm9tICcuL2V2ZW50L0V2ZW50c01hbmFnZXInO1xyXG5pbXBvcnQge0d1aUV2ZW50c1Byb2Nlc3Nvcn0gZnJvbSAnLi9HdWlFdmVudHNQcm9jZXNzb3InO1xyXG5pbXBvcnQge0Vudmlyb25tZW50fSBmcm9tICcuL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFuZ3VhZ2VEYXRhfSBmcm9tICcuL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge1Rhc2tzVGFibGV9IGZyb20gJy4vdGFza3MvVGFza3NUYWJsZSc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge0lDbGllbnRDb21tYW5kfSBmcm9tICcuL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuL3Rhc2tzL1Rhc2snO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4vdGFza3MvTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7VW5pcXVlSURVdGlsc30gZnJvbSAnLi91dGlsL1VuaXF1ZUlEVXRpbHMnO1xyXG5pbXBvcnQge0h0dHBNYW5hZ2VyfSBmcm9tICcuL2h0dHAvSHR0cE1hbmFnZXInO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gJy4vQ29tbWFuZHNUYWJsZSc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gJy4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9ufSBmcm9tICcuL0NvbW1hbmRzUHJvY2Vzc29yQmFzZSc7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuL3Rhc2tzL01HRGF0YSc7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gJy4vcmVtb3RlL1NlcnZlckVycm9yJztcclxuaW1wb3J0IHtIdHRwQ2xpZW50RXZlbnRzfSBmcm9tICcuL2h0dHAvY2xpZW50L0h0dHBDbGllbnRFdmVudHMnO1xyXG5pbXBvcnQge0lHdWlFdmVudH0gZnJvbSAnLi9icmlkZ2UvSUd1aUV2ZW50JztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7Q3VycmVudENsaWVudFZlcnNpb259IGZyb20gJy4vQ3VycmVudENsaWVudFZlcnNpb24nO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tICcuL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0xhc3RGb2N1c2VkTWFuYWdlcn0gZnJvbSAnLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0VudlBhcmFtc1RhYmxlfSBmcm9tICcuL2Vudi9FbnZWYXJpYWJsZXNUYWJsZSc7XHJcbmltcG9ydCB7R2xvYmFsUGFyYW1zLCBNaXJyb3JFeHBWYWx9IGZyb20gJy4vZXhwL0dsb2JhbFBhcmFtc1RhYmxlJztcclxuaW1wb3J0IHtPcGVuVVJMQ29tbWFuZH0gZnJvbSAnLi9jb21tYW5kcy9TZXJ2ZXJUb0NsaWVudC9PcGVuVVJMQ29tbWFuZCc7XHJcbmltcG9ydCB7U2VydmVyQ29uZmlnfSBmcm9tICcuL1NlcnZlckNvbmZpZyc7XHJcbmltcG9ydCB7QWNjZXNzSGVscGVyfSBmcm9tICcuL0FjY2Vzc0hlbHBlcic7XHJcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZH0gZnJvbSAnLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQnO1xyXG5pbXBvcnQge0dVSU1hbmFnZXJ9IGZyb20gXCIuL0dVSU1hbmFnZXJcIjtcclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBDbGllbnRNYW5hZ2VyIHtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBDbGllbnRNYW5hZ2VyID0gbnVsbDtcclxuICBwcml2YXRlIF9nbG9iYWxVbmlxdWVTZXNzaW9uSWQ6IHN0cmluZyA9IG51bGw7XHJcbi8vICBwcml2YXRlIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsOyAvLyBjb250cm9sIHdoZXJlIGxhc3QgcGFya2luZyB3YXMgYXR0ZW1wdGVkIGJ1dCB3ZSBkaWQgbm90IHBhcmsgb24gaXRcclxuICBwcml2YXRlIF9idXR0b25Jc0NsaWNrZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgc3RhdGljIGhhbmRsaW5nRmlyc3RQYXJrYWJsZUNvbnRyb2wgPSBmYWxzZTtcclxuXHJcblxyXG4gIC8vIEEgc3RhdGljIHZhcmlhYmxlIHRvIGhvbGQgZXhlY3V0aW9uIHByb3BlcnRpZXMgZmlsZSBlaXRoZXIgZnJvbSB0aGUgYXNzZXRzIGZvbGRlciBvciB0aGUgVVJMIHByb3ZpZGVkIGJ5IHRoZSBjdXN0b21lci5cclxuICBwcml2YXRlIHN0YXRpYyBfZXhlY3V0aW9uUHJvcGVydGllc0ZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLyBBIHN0YXRpYyB2YXJpYWJsZSB0byBob2xkIGFzc2V0cyBVUkwsIGhhdmluZyBkZWZhdWx0IHZhbHVlIG9mIGFzc2V0cyBmb2xkZXIuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXNzZXRzVVJMOiBzdHJpbmcgPSBcIi4vYXNzZXRzXCI7XHJcblxyXG4gIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogQ2xpZW50TWFuYWdlciB7XHJcbiAgICBpZiAoQ2xpZW50TWFuYWdlci5faW5zdGFuY2UgPT09IG51bGwpXHJcbiAgICAgIENsaWVudE1hbmFnZXIuX2luc3RhbmNlID0gbmV3IENsaWVudE1hbmFnZXIoKTtcclxuXHJcbiAgICByZXR1cm4gQ2xpZW50TWFuYWdlci5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQWRkRXZlbnQoZ3VpRXZlbnQ6IElHdWlFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5NR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldFRhc2tCeUlEKGd1aUV2ZW50LlRhc2tJRCk7XHJcbiAgICBsZXQgbGluZUlkeDogbnVtYmVyID0gK2d1aUV2ZW50LkxpbmU7XHJcbiAgICBsZXQgZHZSb3dJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHRhc2sgIT0gbnVsbCkge1xyXG4gICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gICAgICBpZiAoZ3VpRXZlbnQuQ29udHJvbE5hbWUgIT09IG51bGwpXHJcbiAgICAgICAgY29udHJvbCA9IHRhc2suZ2V0Rm9ybSgpLkdldEN0cmwoZ3VpRXZlbnQuQ29udHJvbE5hbWUpO1xyXG5cclxuICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgICBpZiAoY29udHJvbC5Jc1RhYmxlQ2hpbGQpIHtcclxuICAgICAgICAgIGxpbmVJZHggLT0gZHYuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGd1aUV2ZW50LkV2ZW50VHlwZSkge1xyXG5cclxuICAgICAgICAgIGNhc2UgXCJjb2x1bW5Tb3J0XCI6XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLmlzQ29sdW1uU29ydGFibGUoKSkge1xyXG4gICAgICAgICAgICAgIEV2ZW50cy5PbkNvbHVtbkNsaWNrKGNvbnRyb2wsIGd1aUV2ZW50LkxpbmUsIGd1aUV2ZW50LkNvbnRyb2xOYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJtb3VzZWRvd25cIjpcclxuICAgICAgICAgICAgLy8gRGVmZWN0IDE1MjI4OCAmIERlZmVjdCAxNTIyNjg6IFByb2JsZW06IFdoZW4gYnV0dG9uIGlzIGNsaWNrZWQsIHdlIGdldCBmb2N1cyBldmVudCBmaXJzdCBhbmQgaWYgbWVzc2FnZUJveCBpcyBvcGVuZWQgaGVyZSBsaWtlIHZlcmlmeSwgZXRjLlxyXG4gICAgICAgICAgICAvLyB3ZSBkbyBub3QgcmVjZWl2ZSBjbGljayBldmVudC4gSGVuY2UgZXZlbnRzIGFyZSBub3QgcHJvY2Vzc2VkLiBTb2x1dGlvbjogV2UgZG8gbmVlZCBjbGljayBoYW5kbGluZyBmb3IgYnV0dG9uIGFzIGl0IGlzIGNhbGxlZCB3aGVuIHdlIHBhcmtcclxuICAgICAgICAgICAgLy8gb24gYnV0dG9uIGFuZCBwcmVzcyBzcGFjZSBrZXkuIFdlIG5lZWQgZm9jdXMgZXZlbnQgaGFuZGxpbmcgZm9yIGV4ZWN1dGluZyBDUCAmIENTIHdoZW4gcGFya2VkIG9uIGJ1dHRvbiBieSB0YWIga2V5LiBTbyB3ZSBuZWVkIHRvIG1hbmFnZVxyXG4gICAgICAgICAgICAvLyBob3cgY2xpY2sgaXMgaGFuZGxlZC4gV2UgZG8gbm90IG5lZWQgZm9jdXMgZXZlbnQgaGFuZGxpbmcgd2hlbiB3ZSBjbGljayBvbiBidXR0b24sIHNvIG9uIG1vdXNlZG93biwgc2V0IGEgZmxhZyB3aGljaCB3aWxsIGJlIHVzZWQgaW4gZm9jdXNcclxuICAgICAgICAgICAgLy8gZXZlbnQgaGFuZGxpbmcgdG8gc2tpcCBpdHMgaGFuZGxpbmcuIFRoZW4gd2Ugd2lsbCByZWNlaXZlIGNsaWNrIGV2ZW50IHdoZXJlIHRoaXMgd2lsbCBiZSBhY3R1YWxseSBoYW5kbGVkIGFuZCBoZW5jZSB3b3JrLlxyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5pc0J1dHRvbigpIHx8IGNvbnRyb2wuaXNDaGVja0JveCgpIHx8IChjb250cm9sLkNvbm5lY3RlZENvbnRyb2wgJiYgZ3VpRXZlbnQuZnJvbUJ1dHRvbikpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9idXR0b25Jc0NsaWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCFjb250cm9sLmlzU3ViZm9ybSgpKVxyXG4gICAgICAgICAgICAgIEV2ZW50cy5HZXRSdW50aW1lQ29udGV4dChNYW5hZ2VyLkdldEN1cnJlbnRDb250ZXh0SUQoKSkuTGFzdENsaWNrZWRDdHJsTmFtZSA9IGNvbnRyb2wuZ2V0TmFtZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFwiY2xpY2tcIjpcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wuaXNCdXR0b24oKSB8fCAoY29udHJvbC5Db25uZWN0ZWRDb250cm9sICYmIGd1aUV2ZW50LmZyb21CdXR0b24pKXtcclxuICAgICAgICAgICAgICBFdmVudHMuT25TZWxlY3Rpb24oXCJcIiwgY29udHJvbCwgbGluZUlkeCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgRXZlbnRzLkdldFJ1bnRpbWVDb250ZXh0KE1hbmFnZXIuR2V0Q3VycmVudENvbnRleHRJRCgpKS5MYXN0Q2xpY2tlZEN0cmxOYW1lID0gY29udHJvbC5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYnV0dG9uSXNDbGlja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvLyBzb3J0aW5nIHNob3VsZCBiZSBoYW5kbGVkIG9ubHkgb24gY29sdW1uIGNsaWNrIGFuZCBub3Qgb24gcm93RGF0YVxyXG4gICAgICAgICAgICAgIC8vIGVsc2UgaWYgKGNvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBFdmVudHMuT25Db2x1bW5DbGljayhjb250cm9sLCBndWlFdmVudC5MaW5lLCBndWlFdmVudC5Db250cm9sTmFtZSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgRXZlbnRzLk9uRm9jdXMoY29udHJvbCwgbGluZUlkeCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGxldCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4gPSBjb250cm9sLmlzQnV0dG9uKCkgfHwgY29udHJvbC5pc1RleHRDb250cm9sKCkgfHwgY29udHJvbC5pc0xhYmVsKCkgfHwgY29udHJvbC5pc1RhYkNvbnRyb2woKSB8fCBjb250cm9sLmlzVGFibGVDb250cm9sKCkgfHwgY29udHJvbC5pc0NvbWJvQm94KCkgfHwgY29udHJvbC5pc0ltYWdlQ29udHJvbCgpO1xyXG4gICAgICAgICAgICAgIEV2ZW50cy5Pbk1vdXNlRG93bihjb250cm9sLmdldEZvcm0oKSwgY29udHJvbCwgbnVsbCwgdHJ1ZSwgbGluZUlkeCwgZmFsc2UsIHByb2R1Y2VDbGljayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiZm9jdXNcIjpcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9idXR0b25Jc0NsaWNrZWQgfHwgKGNvbnRyb2wuQ29ubmVjdGVkQ29udHJvbCAmJiBndWlFdmVudC5mcm9tQnV0dG9uKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAvLyAvLyBJZiB3ZSBhdHRlbXB0IHRvIHBhcmsgb24gY29udHJvbCB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byBhbGxvdyB0byBwYXJrIGxpa2UgaWYgY29udHJvbCBoYXMgZXhwcmVzc2lvbiBvciBwYXJlbnQgdGFzayBmaWVsZCwgZG8gbm90IGFsbG93IHRvIGZvY3VzIG9uIGl0LlxyXG4gICAgICAgICAgICAvLyAvLyBTZXQgRm9jdXMgYmFjayB0byBsYXN0Rm9jdXNlZENvbnRyb2wuIFdlIG5lZWQgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCBhcyB3ZSBnZXQgZm9jdXMgZXZlbnQgb24gYSBjb250cm9sIHR3aWNlLiBTbyB0byBhdm9pZCB0byBzaG93IGVycm9yIG11bHRpcGxlIHRpbWVzLFxyXG4gICAgICAgICAgICAvLyAvLyBtYWludGFpbiBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sLlxyXG4gICAgICAgICAgICAvLyBpZiAoY29udHJvbCAhPT0gdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sICYmIGNvbnRyb2wuSGFzRXhwT3JQYXJlbnRUYXNrRmllbGQoKSkge1xyXG4gICAgICAgICAgICAvLyAgIC8vIFNob3cgZXJyb3Igb25seSBmb3IgY29udHJvbHMgaGF2aW5nIERhdGEgcHJvcGVydHkgYW5kIHBhcmthYmxlXHJcbiAgICAgICAgICAgIC8vICAgaWYoY29udHJvbC5pc0xpc3RCb3goKSB8fCBjb250cm9sLmlzQ2hlY2tCb3goKSB8fCBjb250cm9sLmlzQ29tYm9Cb3goKSB8fCBjb250cm9sLmlzVGV4dENvbnRyb2woKSB8fCBjb250cm9sLmlzUmFkaW8oKSB8fCBjb250cm9sLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBDb21tYW5kcy5tZXNzYWdlQm94KG51bGwsIFwiRXJyb3JcIiwgXCJDb250cm9sIGVpdGhlciBoYXMgZXhwcmVzc2lvbiBvciBoYXMgcGFyZW50IHRhc2sgdmFyaWFibGUgYXR0YWNoZWQgdG8gaXQuIEZhaWxlZCB0byBwYXJrIG9uIGNvbnRyb2wgd2l0aCBuYW1lOiBcIiArIGNvbnRyb2wuTmFtZSwgU3R5bGVzLk1TR0JPWF9JQ09OX0VSUk9SIHwgU3R5bGVzLk1TR0JPWF9CVVRUT05fT0spO1xyXG4gICAgICAgICAgICAvLyAgICAgLy8gRGVmZWN0IDE1MjcyODogVXNlIGxhc3QgZm9jdXNlZCB0YXNrIGluc3RlYWQgY29udHJvbCB0YXNrIGFzIGNvbnRyb2wgY2FuIGJlIGZyb20gc3ViZm9ybS5cclxuICAgICAgICAgICAgLy8gICAgIEZvY3VzTWFuYWdlci5TZXRGb2N1cyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSwgMCxcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgPT09IG51bGwgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gY29udHJvbDtcclxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICghQ2xpZW50TWFuYWdlci5oYW5kbGluZ0ZpcnN0UGFya2FibGVDb250cm9sKVxyXG4gICAgICAgICAgICAgIEV2ZW50cy5PbkZvY3VzKGNvbnRyb2wsIGxpbmVJZHgsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImRibGNsaWNrXCI6XHJcbiAgICAgICAgICAgIEV2ZW50cy5PbkRibENsaWNrKGNvbnRyb2wsIGxpbmVJZHgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFwic2VsZWN0aW9uY2hhbmdlZFwiOlxyXG4gICAgICAgICAgICBFdmVudHMuT25TZWxlY3Rpb24oZ3VpRXZlbnQuVmFsdWUsIGNvbnRyb2wsIGxpbmVJZHgsIHRydWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XHJcbiAgICAgICAgICAgIEV2ZW50cy5PbktleURvd24oIHRhc2suZ2V0Rm9ybSgpLCBjb250cm9sLCBndWlFdmVudC5tb2RpZmllcnMsIGd1aUV2ZW50LmtleUNvZGUsIDAsMCwgJycsZmFsc2UsJycsdHJ1ZSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJzZXRleHRlcm5hbHZhbHVlXCI6XHJcbiAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuQWRkRXh0ZXJuYWxWYWx1ZUV2ZW50KCg8TWdDb250cm9sPmNvbnRyb2wpLCBndWlFdmVudC5leHRlcm5hbFZhbHVlLCBndWlFdmVudC5wYXJhbSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ1bmhhbmRsZWQgZXZlbnQ6IFxcXCJcIiArIGd1aUV2ZW50LkV2ZW50VHlwZSArIFwiXFxcIlwiKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHN3aXRjaCAoZ3VpRXZlbnQuRXZlbnRUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFwiZm9jdXNPbk5vbk1hZ2ljQ29udHJvbFwiOlxyXG4gICAgICAgICAgICBjb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIEV2ZW50cy5PbkZvY3VzT25Ob25NYWdpY0NvbnRyb2woY29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiY2xpY2tcIjpcclxuICAgICAgICAgICAgaWYoZ3VpRXZlbnQuQ29udHJvbE5hbWUgPT09IFwibWFnaWNSb3dcIikge1xyXG4gICAgICAgICAgICAgIGR2Um93SWR4ID0gZ3VpRXZlbnQuTGluZSAtICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRMaW5lKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCBkdlJvd0lkeCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwibmF2aWdhdGVJblRhYmxlXCI6XHJcbiAgICAgICAgICAgIGlmIChndWlFdmVudC5Db250cm9sTmFtZSA9PT0gXCJtYWdpY1Jvd1wiKVxyXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlTmF2aWdhdGVJblJvd0V2ZW50KHRhc2ssIGd1aUV2ZW50LlZhbHVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiY2xvc2VcIjpcclxuICAgICAgICAgICAgaWYgKHRhc2suSXNSb3V0ZSgpKVxyXG4gICAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuQWRkUm91dGVyQ2xvc2VkRXZlbnQodGFzayk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBFdmVudHMuQ2xvc2VGb3JtRXZlbnQodGFzay5nZXRGb3JtKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJkaXNwb3NlXCI6XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZGVsZXRlTUdEYXRhVHJlZSh0YXNrLmdldE1nZElEKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJyZXNpemVcIjpcclxuICAgICAgICAgICAgRXZlbnRzLlRhYmxlUmVzaXplRXZlbnQodGFzay5nZXRGb3JtKCkuZ2V0VGFibGVDdHJsKCksIGd1aUV2ZW50LlBhZ2VTaXplKTtcclxuICAgICAgICAgIC8vY2FzZSAnYnJlYWsnIGlzIG1pc3NpbmcgZm9yICdyZXNpemUnIHdpdGggaW50ZW50aW9uIHRvIGV4ZWN1dGUgZ2V0Um93cyB3aXRoIHRoZSBkZXNpcmVkIGRhdGF2aWV3IHJvdyBpbmRleC5cclxuICAgICAgICAgIGNhc2UgXCJnZXRSb3dzXCI6XHJcbiAgICAgICAgICAgIGR2Um93SWR4ID0gbGluZUlkeCAtICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICAgICAgICBsZXQgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsID0ge2d1aU1nQ29udHJvbDogdGFzay5nZXRGb3JtKCkuZ2V0VGFibGVDdHJsKCksIExpbmU6IGR2Um93SWR4LCBWYWw6IFwiXCJ9O1xyXG4gICAgICAgICAgICBFdmVudHMuT25HZXRSb3dzRGF0YSh0YXNrLmdldEZvcm0oKS5nZXRUYWJsZUN0cmwoKSwgZHZSb3dJZHgsIHRydWUsIGxhc3RGb2N1c2VkVmFsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiUm91dGVyTmF2aWdhdGVcIjpcclxuICAgICAgICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5BZGRSb3V0ZUV2ZW50KHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUsIGd1aUV2ZW50LlJvdXRlclBhdGgsIGd1aUV2ZW50LlJvdXRlck91dGxldE5hbWUsXHJcbiAgICAgICAgICAgICAgZ3VpRXZlbnQuUm91dGVyUGFyYW1zKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwic2V0ZXh0ZXJuYWx2YWx1ZVwiOlxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFcnJvclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVW5hYmxlIHRvIGZpbmQgezB9OiBUcnlpbmcgdG8gc2V0IHZhbHVlIGZvciBhIG5vbi1leGlzdGluZyBjb250cm9sLlwiLCBndWlFdmVudC5Db250cm9sTmFtZSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCBcInVuaGFuZGxlZCBldmVudDogXFxcIlwiICsgZ3VpRXZlbnQuRXZlbnRUeXBlICsgXCJcXFwiXCIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgLy90YXNrID09IG51bGxcclxuICAgICAgc3dpdGNoIChndWlFdmVudC5FdmVudFR5cGUpIHtcclxuICAgICAgICBjYXNlIFwiY29uZmlybWF0aW9uQ2xvc2VkXCI6XHJcbiAgICAgICAgICB0aGlzLkNvbmZpcm1hdGlvbkNsb3NlZChndWlFdmVudC5rZXlDb2RlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRlSW5Sb3dFdmVudCh0YXNrOiBUYXNrLCBldnQ6IHN0cmluZykge1xyXG4gICAgbGV0IGludGVybmFsRXZ0ID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PTkU7XHJcbiAgICBldnQgPSBldnQudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBzd2l0Y2ggKGV2dCkge1xyXG4gICAgICBjYXNlIFwiYmVnaW4tcGFnZVwiOlxyXG4gICAgICAgIGludGVybmFsRXZ0ID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdQQUdFO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcInByZXZpb3VzLXBhZ2VcIjpcclxuICAgICAgICBpbnRlcm5hbEV2dCA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJlbmQtcGFnZVwiOlxyXG4gICAgICAgIGludGVybmFsRXZ0ID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRQQUdFO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcIm5leHQtcGFnZVwiOlxyXG4gICAgICAgIGludGVybmFsRXZ0ID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcInByZXZpb3VzLWxpbmVcIjpcclxuICAgICAgICBpbnRlcm5hbEV2dCA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJuZXh0LWxpbmVcIjpcclxuICAgICAgICBpbnRlcm5hbEV2dCA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJiZWdpbi10YWJsZVwiOlxyXG4gICAgICAgIGludGVybmFsRXZ0ID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiZW5kLXRhYmxlXCI6XHJcbiAgICAgICAgaW50ZXJuYWxFdnQgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW50ZXJuYWxFdnQgIT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PTkUpXHJcbiAgICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGUodGFzaywgaW50ZXJuYWxFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByYWlzZSBjYWxsYmFjayBvbiBjbG9zaW5nIGNvbmZpcm1hdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgQ29uZmlybWF0aW9uQ2xvc2VkKHJlczogbnVtYmVyKTogdm9pZFxyXG4gIHtcclxuICAgIENvbW1hbmRzLlJlc29sdmVQcm9taXNlKHJlcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoZSB3b3JrIHRocmVhZCdzIGVudHJ5IG1ldGhvZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgV29ya1RocmVhZEV4ZWN1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuU2hvdWxkTG9nKCkpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coXCJcIiwgdHJ1ZSk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVRvTG9nKFwiU3RhcnRlZCBvbiBcIiArIERhdGVUaW1lVXRpbHMuVG9TdHJpbmcoRGF0ZVRpbWUuTm93LCBYTUxDb25zdGFudHMuRVJST1JfTE9HX0RBVEVfRk9STUFULCBMb2dnZXIuSW5zdGFuY2UpLCB0cnVlKTtcclxuICAgICAgdGhpcy5Xcml0ZUV4ZWN1dGlvblByb3BlcnRpZXNUb0xvZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuU3RhcnRTZXNzaW9uKCkpIHtcclxuICAgICAgICBsZXQgbWdEYXRhVGFiOiBNR0RhdGFDb2xsZWN0aW9uID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZTtcclxuICAgICAgICBsZXQgc3RhcnR1cE1nRGF0YTogTUdEYXRhID0gbWdEYXRhVGFiLlN0YXJ0dXBNZ0RhdGE7XHJcbiAgICAgICAgbWdEYXRhVGFiLmN1cnJNZ2RJRCA9IHN0YXJ0dXBNZ0RhdGEuR2V0SWQoKTtcclxuXHJcbiAgICAgICAgbGV0IG5vbkludGVyYWN0aXZlVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgaWYgKCFzdGFydHVwTWdEYXRhLklzQWJvcnRpbmcpXHJcbiAgICAgICAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSBhd2FpdCBUYXNrLlN0YXJ0UHJvZ3JhbShmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrID09PSBudWxsKVxyXG4gICAgICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5FdmVudHNMb29wKHN0YXJ0dXBNZ0RhdGEpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuTm9uSW50ZXJhY3RpdmVFdmVudHNMb29wKHN0YXJ0dXBNZ0RhdGEsIG5vbkludGVyYWN0aXZlVGFzayk7XHJcblxyXG4gICAgICAgIC8vIHNldCB0aGUgXCJlbmQgb2Ygd29ya1wiIGZsYWcgb25seSBmb3IgdGhlIG1haW4gd2luZG93XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5zZXRFbmRPZldvcmsodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgIGxldCBpc05vUmVzdWx0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvciAmJiAoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT09IFNlcnZlckVycm9yLklORl9OT19SRVNVTFQpXHJcbiAgICAgICAgICBpc05vUmVzdWx0RXJyb3IgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoIWlzTm9SZXN1bHRFcnJvcilcclxuICAgICAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuUHJvY2Vzc0Fib3J0aW5nRXJyb3IoZXgpO1xyXG5cclxuICAgICAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLnNldEVuZE9mV29yayh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5DaGVja0FuZFNob3dTcGlubmVyKGZhbHNlKTtcclxuXHJcbiAgICAgIENvbW1hbmRzLmFkZEdsb2JhbENvbW1hbmQoQ29tbWFuZFR5cGUuRVhJVF9NQUdJQyk7XHJcbiAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdyaXRlIEV4ZWN1dGlvbiBwcm9wZXJ0aWVzIHRvIGxvZy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFdyaXRlRXhlY3V0aW9uUHJvcGVydGllc1RvTG9nKCk6IHZvaWQge1xyXG4gICAgaWYgKExvZ2dlci5JbnN0YW5jZS5TaG91bGRMb2dTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKSkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVUb0xvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIsIHRydWUpO1xyXG4gICAgICAvLyBXcml0ZSBoZWFkaW5nXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVRvTG9nKFwiRXhlY3V0aW9uIFByb3BlcnRpZXM6XCIsIHRydWUpO1xyXG5cclxuICAgICAgbGV0IHByb3BzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoU2VydmVyQ29uZmlnLkluc3RhbmNlKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2cocHJvcHNTdHJpbmcsIHRydWUpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIENsaWVudE1hbmFnZXIuX2V4ZWN1dGlvblByb3BlcnRpZXNGaWxlTmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiU2VydmVyQ29uZmlnVVJMXCIpID8/IFwiLi9hc3NldHMvc2VydmVyLWNvbmZpZy5qc29uXCI7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuSW5pdChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5SQ19OT19DT05URVhUX0lEKTtcclxuICAgIExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5Jbml0KE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UpO1xyXG4gICAgTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLkxhc3RBY3Rpb25UaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuXHJcblxyXG4gICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAvLyBUT0RPOiBIb3cgdG8gZ2V0IFByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKS5JZD9cclxuICAgIHRoaXMuX2dsb2JhbFVuaXF1ZVNlc3Npb25JZCA9IFVuaXF1ZUlEVXRpbHMuR2V0VW5pcXVlTWFjaGluZUlEKCkgKyBcIl9cIjsgLy8gKyBQcm9jZXNzLkdldEN1cnJlbnRQcm9jZXNzKCkuSWQ7XHJcblxyXG4gICAgdGhpcy5SZWdpc3RlckRlbGVnYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBJbml0aWFsaXplIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgZ3VpIGxpYnJhcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gQ2xpZW50TWFuYWdlciBpbnN0YW5jZTwvcmV0dXJucz5cclxuICBwcml2YXRlIEluaXRHdWlNYW5hZ2VyKCk6IHZvaWQge1xyXG4gICAgTWFuYWdlci5FdmVudHNNYW5hZ2VyID0gRXZlbnRzTWFuYWdlci5JbnN0YW5jZTtcclxuICAgIE1hbmFnZXIuRGVmYXVsdFNlcnZlck5hbWUgPSBTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0U2VydmVyKCk7XHJcbiAgICBNYW5hZ2VyLkRlZmF1bHRQcm90b2NvbCA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRQcm90b2NvbCgpO1xyXG4gICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudC5JbnN0YW5jZTtcclxuICAgIEd1aURhdGFDb2xsZWN0aW9uLk1HRGF0YVRhYmxlID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5ub0NvbnRleHRJZCA9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLlJDX05PX0NPTlRFWFRfSUQ7XHJcbiAgfVxyXG5cclxuICAvLy8gSW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBpbiBvYmplY3RzIHVzZWQgdG8gb3ZlcmNvbWUgdGhlIGNpcmN1bGFyIHJlZmVyZW5jZXMgaXNzdWVcclxuICBwcml2YXRlIEluaXRDaXJjdWxhclJlZmVyZW5jZXNCeXBhc3NlcygpIHtcclxuICAgIFRhc2tzVGFibGUuY3JlYXRlTmV3dGFzayA9IFRhc2suQ3JlYXRlVGFzaztcclxuICAgIE9wZW5VUkxDb21tYW5kLmNyZWF0ZU5ld0NvbW1hbmRzVGFibGUgPSBDb21tYW5kc1RhYmxlLmNyZWF0ZUNvbW1hbmRzVGFibGU7XHJcblxyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIgPSBFdmVudHNNYW5hZ2VyLkluc3RhbmNlO1xyXG4gICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZTtcclxuICAgIEFjY2Vzc0hlbHBlci5lbnZQYXJhbXNUYWJsZSA9IEVudlBhcmFtc1RhYmxlLkluc3RhbmNlO1xyXG4gICAgQWNjZXNzSGVscGVyLmdsb2JhbFBhcmFtcyA9IEdsb2JhbFBhcmFtcy5JbnN0YW5jZTtcclxuICAgIEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2U7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudC5JbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gRW50cnkgcG9pbnQgdG8gdGhlIFdlYiBDbGllbnQgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFyZ3NcIj5hcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzPC9wYXJhbT5cclxuICBzdGF0aWMgTWFpbihodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBhcmdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XHJcbiAgICBsZXQgdmFsOiBFeHBWYWw7XHJcblxyXG4gICAgYXJncy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgIHZhbCA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFLCBmYWxzZSwgdmFsdWUpO1xyXG4gICAgICBHbG9iYWxQYXJhbXMuSW5zdGFuY2Uuc2V0VmFsdWUoa2V5LCBuZXcgTWlycm9yRXhwVmFsKHZhbCksIHRydWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVE9ETyA6IENoZWNrIGhvdyB0byBsb2FkIGZyb20gU3R1ZGlvIGkuZS4gRjdcclxuICAgIC8vIGlmIChhcmdzLmxlbmd0aCAhPT0gMCAmJiBOU3RyaW5nLlN0YXJ0c1dpdGgoYXJnc1swXSwgXCIvc3Bhd25haGVhZFwiKSkge1xyXG4gICAgLy8gICBDbGllbnRNYW5hZ2VyLl9zdGFydGVkRnJvbVN0dWRpbyA9IHRydWU7XHJcbiAgICAvLyAgIFN0dWRpb0xhdW5jaGVyLkluaXQoYXJncyk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlXHJcbiAgICBDbGllbnRNYW5hZ2VyLlN0YXJ0RXhlY3V0aW9uKGh0dHBDbGllbnQpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5GbHVzaCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBUZXJtaW5hdGUgdGhlIGNsaWVudCBhbmQgdGVybWluYXRlIHRoZSBjb250ZXh0IDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgU3RvcEV4ZWN1dGlvbigpOiBQcm9taXNlIDx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBIdHRwTWFuYWdlci5HZXRJbnN0YW5jZSgpLklzQWJvcnRpbmdNYWdpY0VuZ2luZSA9IHRydWU7XHJcbiAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJID0gdHJ1ZTtcclxuXHJcbiAgICAgIGF3YWl0IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5lbmRUYXNrKHRydWUsIGZhbHNlLFxyXG4gICAgICAgIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleDMpIHtcclxuICAgICAgaWYgKGV4MyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgzKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXgzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIFN0YXJ0RXhlY3V0aW9uKGh0dHBDbGllbnQ6SHR0cENsaWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgSHR0cE1hbmFnZXIuc2V0TmF0aXZlSHR0cENsaWVudChodHRwQ2xpZW50KTtcclxuICAgIGxldCBsb2FkZWQ6IGJvb2xlYW4gPSBhd2FpdCBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLkxvYWRFeGVjdXRpb25Qcm9wcygpO1xyXG5cclxuICAgIGlmIChsb2FkZWQpIHtcclxuICAgICAgbmV3IEd1aUV2ZW50c1Byb2Nlc3NvcigpO1xyXG4gICAgICBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLkluaXRHdWlNYW5hZ2VyKCk7XHJcbiAgICAgIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuSW5pdENpcmN1bGFyUmVmZXJlbmNlc0J5cGFzc2VzKCk7XHJcbiAgICAgIGxldCB2ZXJzaW9uU3RyaW5nID0gQ3VycmVudENsaWVudFZlcnNpb24gPT09ICAnMC4wLjAuMCcgPyBcIkRldmVsb3BtZW50IG1vZGVcIiA6IFwiVmVyc2lvbiA6IFwiICsgQ3VycmVudENsaWVudFZlcnNpb24gO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXCJNYWdpYyBXZWIgQ2xpZW50LiBcIiArIHZlcnNpb25TdHJpbmcpO1xyXG5cclxuICAgICAgSHR0cE1hbmFnZXIuR2V0SW5zdGFuY2UoKS5IdHRwQ29tbXVuaWNhdGlvblRpbWVvdXRNUyA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5HZXRGaXJzdEh0dHBSZXF1ZXN0VGltZW91dCgpO1xyXG5cclxuICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5Jbml0KCk7XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuSW5pdGlhbGl6ZShSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLnBhcnNlTG9nTGV2ZWwoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldEludGVybmFsTG9nTGV2ZWwoKSksZmFsc2UpO1xyXG5cclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gbmV3IE1HRGF0YShcclxuICAgICAgICBuZXcgQ29tbWFuZHNUYWJsZSgpLFxyXG4gICAgICAgIG5ldyBDb21tYW5kc1RhYmxlKCksXHJcbiAgICAgICAgMCwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICBhd2FpdCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmFkZE1HRGF0YShtZ2QsIDAsIHRydWUpO1xyXG5cclxuICAgICAgYXdhaXQgQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5Xb3JrVGhyZWFkRXhlY3V0aW9uKCk7XHJcblxyXG4gICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZygpKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBcIkVuZGVkIG9uIFwiICsgRGF0ZVRpbWVVdGlscy5Ub1N0cmluZyhEYXRlVGltZS5Ob3csIFhNTENvbnN0YW50cy5FUlJPUl9MT0dfREFURV9GT1JNQVQsIExvZ2dlci5JbnN0YW5jZSkgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KFwiRXJyb3JcIiwgXCJGYWlsZWQgdG8gbG9hZCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlIChcIiArIHRoaXMuX2V4ZWN1dGlvblByb3BlcnRpZXNGaWxlTmFtZSArIFwiKVwiLCBTdHlsZXMuTVNHQk9YX0lDT05fRVJST1IgfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9PSyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IExvYWRzIHRoZSBleGVjdXRpb24gcHJvcGVydGllcyBmaWxlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlcixcclxuICAvLy8gYXBwbGljYXRpb24gYW5kIHByb2dyYW0gdG8gZXhlY3V0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgTG9hZEV4ZWN1dGlvblByb3BzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXHJcbiAgICBsZXQgcmVzcG9uc2U6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgc3VjY2VlZGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBpc0Vycm9yIGNhbm5vdCBiZSB0cnVlIGhlcmUsIGJlY2F1c2UgaXQgaXMgcmV0dXJuZWQgYnkgcnVudGltZSBlbmdpbmUgYW5kIHRvIHJlYWQgZXhlY3V0aW9uIHByb3BlcnRpZXMsIHdlIGRvIG5vdCByZWFjaCB0aGUgZW5naW5lLlxyXG4gICAgICBsZXQgaXNFcnJvcjogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZmFsc2UpO1xyXG4gICAgICByZXNwb25zZSA9IGF3YWl0IEh0dHBNYW5hZ2VyLkdldEluc3RhbmNlKCkuR2V0Q29udGVudChDbGllbnRNYW5hZ2VyLl9leGVjdXRpb25Qcm9wZXJ0aWVzRmlsZU5hbWUsIG51bGwsIGZhbHNlLCBpc0Vycm9yKTtcclxuICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLkluaXQoSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG5cclxuICAgICAgbGV0IGFzc2V0c1VSTCA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRBc3NldHNVUkwoKTtcclxuXHJcbiAgICAgIGlmKGFzc2V0c1VSTCAhPT0gbnVsbCl7XHJcbiAgICAgICAgQ2xpZW50TWFuYWdlci5hc3NldHNVUkwgPSBhc3NldHNVUkw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgd2luZG93LmFzc2V0c1VSTCA9IENsaWVudE1hbmFnZXIuYXNzZXRzVVJMO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xyXG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2Ugd3JpdGUgdGhlIGVycm9yIG1lc3NhZ2UgdG8gbG9nP1xyXG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBicm93c2VyP1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nbG9iYWwgdW5pcXVlIElEIG9mIHRoZSBzZXNzaW9uID0gJ21hY2hpbmUgdW5pcXVlIElEJyArICdwcm9jZXNzIElEJzwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEdsb2JhbFVuaXF1ZVNlc3Npb25JRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbFVuaXF1ZVNlc3Npb25JZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGNvbnRyb2wncyBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyAgR2V0Q29udHJvbFBpY3R1cmVNYXNrKHRhc2tJZDogc3RyaW5nLCBjb250cm9sTmFtZTogc3RyaW5nKTogUElDXHJcbiAge1xyXG4gICAgbGV0IHBpYzogUElDID0gbnVsbDtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+TUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRUYXNrQnlJRCh0YXNrSWQpO1xyXG5cclxuICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAoY29udHJvbE5hbWUgIT09IG51bGwgJiYgdGFzayAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnRyb2wgPSB0YXNrLmdldEZvcm0oKS5HZXRDdHJsKGNvbnRyb2xOYW1lKTtcclxuICAgICAgcGljID0gY29udHJvbC5nZXRQSUMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGljO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBmb3JtYXR0ZWQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljICBHZXRGb3JtYXR0ZWRWYWx1ZSh0YXNrSWQ6IHN0cmluZywgY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgcm93SWQ/OiBzdHJpbmcpOiBzdHJpbmdcclxuICB7XHJcbiAgICBsZXQgcGljOiBQSUMgPSBudWxsO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5NR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldFRhc2tCeUlEKHRhc2tJZCk7XHJcblxyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gICAgbGV0IG5ld1ZhbHVlOiBhbnkgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAoY29udHJvbE5hbWUgIT09IG51bGwgICYmIHRhc2sgIT09IG51bGwpXHJcbiAgICAgIGNvbnRyb2wgPSB0YXNrLmdldEZvcm0oKS5HZXRDdHJsKGNvbnRyb2xOYW1lKTtcclxuICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbC5EYXRhVHlwZSA9PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpIHtcclxuICAgICAgaWYgKGNvbnRyb2wuaXNSZXBlYXRhYmxlKCkgJiYgIGNvbnRyb2wuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQpLmlzRXhwcmVzc2lvbigpKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IHBpY3ZhbCA9IGNvbnRyb2wuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQpLmdldFByZXZWYWx1ZSgrcm93SWQpO1xyXG4gICAgICAgIHBpYyA9IG5ldyBQSUMgKHBpY3ZhbCwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCAgY29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSlcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcGljID0gY29udHJvbC5nZXRQSUMoKTtcclxuXHJcbiAgICAgIGxldCBkaXNwVmFsdWUgPSBTdHJpbmcodmFsdWUpO1xyXG4gICAgICBsZXQgIG5ld1BpYyA9IHBpYy5nZXRVbmZvcm1hdHRlZE51bWVyaWNQaWMoKTtcclxuXHJcbiAgICAgIGxldCBudW0gPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLnRvTnVtKGRpc3BWYWx1ZSwgbmV3UGljLCAwKTtcclxuICAgICAgbmV3VmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZyb21OdW0obnVtLCBwaWMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCByYW5nZWQgdmFsdWUgZm9yIGlucHV0IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgIEdldFJhbmdlZFZhbHVlKHRhc2tJZDogc3RyaW5nLCBjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nXHJcbiAge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5NR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldFRhc2tCeUlEKHRhc2tJZCk7XHJcblxyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICAgIGlmIChjb250cm9sTmFtZSAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgY29udHJvbCA9ICB0YXNrLmdldEZvcm0oKS5HZXRDdHJsKGNvbnRyb2xOYW1lKTtcclxuICAgICAgcmV0dXJuIGNvbnRyb2wuZ2V0UmFuZ2VkVmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgdXNlciBpbnB1dCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljICBWYWxpZGF0ZUNvbnRyb2xWYWx1ZSh0YXNrSWQ6IHN0cmluZywgY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHN0cmluZ1xyXG4gIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+TUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRUYXNrQnlJRCh0YXNrSWQpO1xyXG5cclxuICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGlmIChjb250cm9sTmFtZSAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgY29udHJvbCA9ICB0YXNrLmdldEZvcm0oKS5HZXRDdHJsKGNvbnRyb2xOYW1lKSBhcyBNZ0NvbnRyb2w7XHJcbiAgICAgIHJldHVybiBjb250cm9sLnZhbGlkYXRlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBmbGQgcmFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgR2V0RmxkUmFuZ2VzKHRhc2tJZDogc3RyaW5nLCBjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+TUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRUYXNrQnlJRCh0YXNrSWQpO1xyXG5cclxuICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGlmIChjb250cm9sTmFtZSAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgY29udHJvbCA9ICB0YXNrLmdldEZvcm0oKS5HZXRDdHJsKGNvbnRyb2xOYW1lKSBhcyBNZ0NvbnRyb2w7XHJcbiAgICAgIHJldHVybiBjb250cm9sLmdldFJhbmdlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJucyB3aGV0aGVyIGNsaWVudC9zZXJ2ZXIgY2FjaGUgZXhpc3RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgVHJhbnNDYWNoZUV4aXN0cygpOiBib29sZWFuIHtcclxuICAgIGxldCBjbGllbnRUcmFuc0NhY2hlRXhpc3RzOiBib29sZWFuID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKS5jbGllbnRUcmFuc2FjdGlvbkNhY2hlRXhpc3RzKCk7XHJcbiAgICBsZXQgc2VydmVyVHJhbnNhY3Rpb25DYWNoZUV4aXN0czogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCkuc2VydmVyVHJhbnNhY3Rpb25DYWNoZUV4aXN0cygpO1xyXG5cclxuICAgIHJldHVybiBjbGllbnRUcmFuc0NhY2hlRXhpc3RzIHx8IHNlcnZlclRyYW5zYWN0aW9uQ2FjaGVFeGlzdHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFN1YnNjcmliZSBmb3IgZXZlbnRzIGRlZmluZWQgYXQgSHR0cENsaWVudEV2ZW50cyBhbmRcclxuICAvLy8gYXR0YWNoIGFwcHJvcHJpYXRlIGV2ZW50IGhhbmRsZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFJlZ2lzdGVyRGVsZWdhdGVzKCk6IHZvaWQge1xyXG4gICAgSHR0cENsaWVudEV2ZW50cy5HZXRFeGVjdXRpb25Qcm9wZXJ0eV9FdmVudCA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5HZXRFeGVjdXRpb25Qcm9wZXJ0eS5iaW5kKFNlcnZlckNvbmZpZy5JbnN0YW5jZSk7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLkdldFJ1bnRpbWVDdHhJRF9FdmVudCA9IHRoaXMuR2V0UnVudGltZUN0eElELmJpbmQodGhpcyk7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLkdldEdsb2JhbFVuaXF1ZVNlc3Npb25JRF9FdmVudCA9IHRoaXMuR2V0R2xvYmFsVW5pcXVlU2Vzc2lvbklELmJpbmQodGhpcyk7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLlNob3VsZERpc3BsYXlHZW5lcmljRXJyb3JfRXZlbnQgPSBTZXJ2ZXJDb25maWcuSW5zdGFuY2UuU2hvdWxkRGlzcGxheUdlbmVyaWNFcnJvci5iaW5kKFNlcnZlckNvbmZpZy5JbnN0YW5jZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHJpZXZlcyBydW50aW1lIGNvbnRleHQgSURcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UnVudGltZUN0eElEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2VuZCBhIHJlcXVlc3QgdG8gc2VydmVyIHRvIHRlcm1pbmF0ZSB0aGUgY29udGV4dCB1c2luZyBmZXRjaCBBUEkgd2l0aCBrZWVwLWFsaXZlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgVGVybWluYXRlQ29udGV4dFVzaW5nRmV0Y2hBUEkoKTogdm9pZCB7XHJcblxyXG4gICAgLy8gSWYgU2Vzc2lvbiBpcyByZS1pbml0aWFsaXppbmcgbWVhbnMgdGhlIGNvbnRleHQgaXMgbm90IGZvdW5kIGF0IHNlcnZlci5cclxuICAgIC8vIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gdGVybWluYXRpbmcgY29udGV4dC5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZylcclxuICAgICAgcmV0dXJuO1xyXG4gICAgSHR0cE1hbmFnZXIuR2V0SW5zdGFuY2UoKS5Jc0Fib3J0aW5nTWFnaWNFbmdpbmUgPSB0cnVlO1xyXG5cclxuICAgIC8vIER1ZSB0byBwYXlsb2FkIGxpbWl0IG9mIGZldGNoIEFQSSwgc2VuZCBvbmx5IHRoZSBjb250ZXh0IHRlcm1pbmF0aW9uIGNvbW1hbmQgdG8gc2VydmVyXHJcbiAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQ2xlYXIoKTtcclxuXHJcbiAgICBsZXQgY29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kOiBDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5cclxuICAgIENyZWF0ZUNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpKTtcclxuXHJcbiAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKDxJQ2xpZW50Q29tbWFuZD5jb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQpO1xyXG5cclxuICAgIC8vIHJlc3BvbnNlIG5lZWQgbm90IHRvIGJlIGhhbmRsZWQgYXMgdGhlIGJyb3dzZXIgdW5sb2FkIGNhbm5vdCBiZSBzdG9wcGVkLCBzbyBubyBuZWVkIHRvIHdhaXRcclxuICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLk9OTFlfQ09NTUFORFMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBHZXRBc3NldHNVUkwoKTogc3RyaW5ne1xyXG4gICAgcmV0dXJuIENsaWVudE1hbmFnZXIuYXNzZXRzVVJMO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import { XMLConstants } from '@magic-xpa/utils';
|
2
|
+
import { Scrambler } from './util/Scrambler';
|
3
|
+
import { isNullOrUndefined } from '@magic-xpa/mscorelib';
|
4
|
+
export var CommandsProcessorBase_SessionStage;
|
5
|
+
(function (CommandsProcessorBase_SessionStage) {
|
6
|
+
CommandsProcessorBase_SessionStage[CommandsProcessorBase_SessionStage["HANDSHAKE"] = 1] = "HANDSHAKE";
|
7
|
+
CommandsProcessorBase_SessionStage[CommandsProcessorBase_SessionStage["INITIAL"] = 2] = "INITIAL";
|
8
|
+
CommandsProcessorBase_SessionStage[CommandsProcessorBase_SessionStage["NORMAL"] = 3] = "NORMAL";
|
9
|
+
})(CommandsProcessorBase_SessionStage || (CommandsProcessorBase_SessionStage = {}));
|
10
|
+
export var CommandsProcessorBase_SendingInstruction;
|
11
|
+
(function (CommandsProcessorBase_SendingInstruction) {
|
12
|
+
CommandsProcessorBase_SendingInstruction[CommandsProcessorBase_SendingInstruction["NO_TASKS_OR_COMMANDS"] = 0] = "NO_TASKS_OR_COMMANDS";
|
13
|
+
CommandsProcessorBase_SendingInstruction[CommandsProcessorBase_SendingInstruction["ONLY_COMMANDS"] = 1] = "ONLY_COMMANDS";
|
14
|
+
CommandsProcessorBase_SendingInstruction[CommandsProcessorBase_SendingInstruction["TASKS_AND_COMMANDS"] = 2] = "TASKS_AND_COMMANDS";
|
15
|
+
})(CommandsProcessorBase_SendingInstruction || (CommandsProcessorBase_SendingInstruction = {}));
|
16
|
+
export class CommandsProcessorBase {
|
17
|
+
_sessionCounter = 0;
|
18
|
+
GetSessionCounter() {
|
19
|
+
return this._sessionCounter;
|
20
|
+
}
|
21
|
+
async StartSession() {
|
22
|
+
return Promise.resolve(true);
|
23
|
+
}
|
24
|
+
async Execute(sendingInstruction, sessionStage, res) {
|
25
|
+
if (isNullOrUndefined(sessionStage)) {
|
26
|
+
await this.Execute_0(sendingInstruction);
|
27
|
+
return;
|
28
|
+
}
|
29
|
+
await this.Execute_1(sendingInstruction, sessionStage, res);
|
30
|
+
}
|
31
|
+
async Execute_0(sendingInstruction) {
|
32
|
+
await this.Execute_1(sendingInstruction, CommandsProcessorBase_SessionStage.NORMAL, null);
|
33
|
+
}
|
34
|
+
async Execute_1(sendingInstruction, sessionStage, res) {
|
35
|
+
return Promise.resolve();
|
36
|
+
}
|
37
|
+
async GetContent(requestedURL, useCache) {
|
38
|
+
return Promise.resolve('');
|
39
|
+
}
|
40
|
+
static UnScramble(respBuf) {
|
41
|
+
let openTagLocation = respBuf.indexOf(XMLConstants.MG_TAG_OPEN);
|
42
|
+
let core;
|
43
|
+
if (openTagLocation !== -1) {
|
44
|
+
let start = openTagLocation + XMLConstants.MG_TAG_OPEN.length;
|
45
|
+
let openTag = respBuf.substr(0, start);
|
46
|
+
let finish = respBuf.lastIndexOf(XMLConstants.TAG_OPEN);
|
47
|
+
let closeTag = respBuf.substr(finish);
|
48
|
+
core = openTag + Scrambler.UnScramble(respBuf, start, finish - 1) + closeTag;
|
49
|
+
}
|
50
|
+
else {
|
51
|
+
core = Scrambler.UnScramble(respBuf, 0, respBuf.length - 1);
|
52
|
+
}
|
53
|
+
return core;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWFuZHNQcm9jZXNzb3JCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9Db21tYW5kc1Byb2Nlc3NvckJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd6RCxNQUFNLENBQU4sSUFBWSxrQ0FLWDtBQUxELFdBQVksa0NBQWtDO0lBRTVDLHFHQUFhLENBQUE7SUFDYixpR0FBTyxDQUFBO0lBQ1AsK0ZBQU0sQ0FBQTtBQUNSLENBQUMsRUFMVyxrQ0FBa0MsS0FBbEMsa0NBQWtDLFFBSzdDO0FBR0QsTUFBTSxDQUFOLElBQVksd0NBSVg7QUFKRCxXQUFZLHdDQUF3QztJQUNsRCx1SUFBb0IsQ0FBQTtJQUNwQix5SEFBYSxDQUFBO0lBQ2IsbUlBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUpXLHdDQUF3QyxLQUF4Qyx3Q0FBd0MsUUFJbkQ7QUFHRCxNQUFNLE9BQWdCLHFCQUFxQjtJQUN6QyxlQUFlLEdBQVcsQ0FBQyxDQUFDO0lBRTVCLGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBTUQsS0FBSyxDQUFDLFlBQVk7UUFDaEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFRRCxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUE0RCxFQUFFLFlBQWlELEVBQUUsR0FBa0I7UUFDL0ksSUFBSSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBSU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxrQkFBNEQ7UUFDbEYsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLGtDQUFrQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBTUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxrQkFBNEQsRUFBRSxZQUFnRCxFQUFFLEdBQWlCO1FBQy9JLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFLRCxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQW9CLEVBQUUsUUFBaUI7UUFDdEQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFPRCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQWU7UUFDL0IsSUFBSSxlQUFlLEdBQVcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEUsSUFBSSxJQUFZLENBQUM7UUFFakIsSUFBSSxlQUFlLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLEtBQUssR0FBVyxlQUFlLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDdEUsSUFBSSxPQUFPLEdBQVcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFL0MsSUFBSSxNQUFNLEdBQVcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEUsSUFBSSxRQUFRLEdBQVcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU5QyxJQUFJLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQy9FLENBQUM7YUFDSSxDQUFDO1lBRUosSUFBSSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFhNTENvbnN0YW50cyB9IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBJUmVzdWx0VmFsdWUgfSBmcm9tICcuL3J0L0lSZXN1bHRWYWx1ZSc7XHJcbmltcG9ydCB7IFNjcmFtYmxlciB9IGZyb20gJy4vdXRpbC9TY3JhbWJsZXInO1xyXG5pbXBvcnQgeyBpc051bGxPclVuZGVmaW5lZCB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuXHJcbi8vIFRoZSBzdGFnZSBpbiB0aGUgc2Vzc2lvbiB0aGlzIGV4ZWN1dGlvbiBiZWxvbmdzIHRvXHJcbmV4cG9ydCBlbnVtIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2Vcclxue1xyXG4gIEhBTkRTSEFLRSA9IDEsXHJcbiAgSU5JVElBTCxcclxuICBOT1JNQUxcclxufVxyXG5cclxuLy8gaW5zdHJ1Y3Rpb24gd2hhdCB0byBzZW5kIGR1cmluZyBleGVjdXRpb25cclxuZXhwb3J0IGVudW0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbiB7XHJcbiAgTk9fVEFTS1NfT1JfQ09NTUFORFMsXHJcbiAgT05MWV9DT01NQU5EUyxcclxuICBUQVNLU19BTkRfQ09NTUFORFNcclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PiB0aGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgYW5kIGhhbmRsaW5nIHRoZSBzZXJ2ZXIgbWVzc2FnZXM8L3N1bW1hcnk+XHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21tYW5kc1Byb2Nlc3NvckJhc2Uge1xyXG4gIF9zZXNzaW9uQ291bnRlcjogbnVtYmVyID0gMDsgLy8gdGhlIHNlc3Npb24gY291bnRlciB0aGF0IHNob3VsZCBiZSB1c2VkIG9uIHRoZSBuZXh0IGFjY2VzcyB0byB0aGUgc2VydmVyLlxyXG5cclxuICBHZXRTZXNzaW9uQ291bnRlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25Db3VudGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCB0aGUgc2Vzc2lvbiAtIGUuZy4gZXhjaGFuZ2UgaGFuZHNoYWtlIHJlcXVlc3RzIHdpdGggdGhlIFNlcnZlciwgaWYgY29ubmVjdGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgb25seSBpZiB0aGUgQ2xpZW50IHNob3VsZCBjb250aW51ZSB0byBzdGFydCB0aGUgYWN0dWFsIHJlcXVlc3RlZCBwcm9ncmFtLjwvcmV0dXJucz5cclxuICBhc3luYyBTdGFydFNlc3Npb24oKTogUHJvbWlzZTxib29sZWFuPntcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+YnVpbGQgdGhlIHhtbCByZXF1ZXN0OyBzZW5kIGl0IHRvIHRoZSBydW50aW1lLWVuZ2luZTsgcmVjZWl2ZSBhIHJlc3BvbnNlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlbmRpbmdJbnN0cnVjdGlvblwiPmluc3RydWN0aW9uIHdoYXQgdG8gc2VuZCBkdXJpbmcgZXhlY3V0aW9uIC0gTk9fVEFTS1NfT1JfQ09NTUFORFMgLyBPTkxZX0NPTU1BTkRTIC8gVEFTS1NfQU5EX0NPTU1BTkRTLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvblN0YWdlXCI+SEFORFNIQUtFIC8gSU5JVElBTCAvIE5PUk1BTC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1wiPnJlc3VsdCBvdCBiZSAgcmVhZCBhZnRlciBwYXJzaW5nIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuPC9wYXJhbT5cclxuICBhc3luYyBFeGVjdXRlKHNlbmRpbmdJbnN0cnVjdGlvbjogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbik6IFByb21pc2U8dm9pZD47XHJcbiAgYXN5bmMgRXhlY3V0ZShzZW5kaW5nSW5zdHJ1Y3Rpb246IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24sIHNlc3Npb25TdGFnZTogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZSwgcmVzOiBJUmVzdWx0VmFsdWUpOiBQcm9taXNlPHZvaWQ+O1xyXG4gIGFzeW5jIEV4ZWN1dGUoc2VuZGluZ0luc3RydWN0aW9uOiBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLCBzZXNzaW9uU3RhZ2U/OiBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLCByZXM/OiBJUmVzdWx0VmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChzZXNzaW9uU3RhZ2UpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZV8wKHNlbmRpbmdJbnN0cnVjdGlvbik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuRXhlY3V0ZV8xKHNlbmRpbmdJbnN0cnVjdGlvbiwgc2Vzc2lvblN0YWdlLCByZXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmJ1aWxkIHRoZSB4bWwgcmVxdWVzdDsgc2VuZCBpdCB0byB0aGUgcnVudGltZS1lbmdpbmU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VuZGluZ0luc3RydWN0aW9uXCI+aW5zdHJ1Y3Rpb24gd2hhdCB0byBzZW5kIGR1cmluZyBleGVjdXRpb24gLSBOT19UQVNLU19PUl9DT01NQU5EUyAvIE9OTFlfQ09NTUFORFMgLyBUQVNLU19BTkRfQ09NTUFORFMuPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIEV4ZWN1dGVfMChzZW5kaW5nSW5zdHJ1Y3Rpb246IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuRXhlY3V0ZV8xKHNlbmRpbmdJbnN0cnVjdGlvbiwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5OT1JNQUwsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmJ1aWxkIHRoZSB4bWwgcmVxdWVzdDsgc2VuZCBpdCB0byB0aGUgcnVudGltZS1lbmdpbmU7IHJlY2VpdmUgYSByZXNwb25zZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZW5kaW5nSW5zdHJ1Y3Rpb25cIj5pbnN0cnVjdGlvbiB3aGF0IHRvIHNlbmQgZHVyaW5nIGV4ZWN1dGlvbiAtIE5PX1RBU0tTX09SX0NPTU1BTkRTIC8gT05MWV9DT01NQU5EUyAvIFRBU0tTX0FORF9DT01NQU5EUy48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlc3Npb25TdGFnZVwiPkhBTkRTSEFLRSAvIElOSVRJQUwgLyBOT1JNQUwuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNcIj5yZXN1bHQgb3QgYmUgIHJlYWQgYWZ0ZXIgcGFyc2luZyB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLjwvcGFyYW0+XHJcbiAgYXN5bmMgRXhlY3V0ZV8xKHNlbmRpbmdJbnN0cnVjdGlvbjogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbiwgc2Vzc2lvblN0YWdlOiBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLCByZXM6IElSZXN1bHRWYWx1ZSk6IFByb21pc2U8dm9pZD57XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEludm9rZSB0aGUgcmVxdWVzdCBVUkwgJiByZXR1cm4gdGhlIHJlc3BvbnNlLjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXF1ZXN0ZWRVUkxcIj5VUkwgdG8gYmUgYWNjZXNzZWQuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+cmVzcG9uc2UgKGZyb20gdGhlIHNlcnZlcikuPC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldENvbnRlbnQocmVxdWVzdGVkVVJMOiBzdHJpbmcsIHVzZUNhY2hlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+e1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgnJyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2VuZCBNb25pdG9yIG1lc3NhZ2luZyB0byB0aGUgc2VydmVyPC9zdW1tYXJ5PlxyXG4gIGFic3RyYWN0IFNlbmRNb25pdG9yT25seSgpOiB2b2lkIDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB1bnNjcmFtYmxlIHNlcnZlcnMgcmVzcG9uc2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnVuc2NyYW1ibGVkIGNvbnRlbnQ8L3JldHVybnM+XHJcbiAgc3RhdGljIFVuU2NyYW1ibGUocmVzcEJ1Zjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBvcGVuVGFnTG9jYXRpb246IG51bWJlciA9IHJlc3BCdWYuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX09QRU4pO1xyXG4gICAgbGV0IGNvcmU6IHN0cmluZztcclxuXHJcbiAgICBpZiAob3BlblRhZ0xvY2F0aW9uICE9PSAtMSkge1xyXG4gICAgICBsZXQgc3RhcnQ6IG51bWJlciA9IG9wZW5UYWdMb2NhdGlvbiArIFhNTENvbnN0YW50cy5NR19UQUdfT1BFTi5sZW5ndGg7XHJcbiAgICAgIGxldCBvcGVuVGFnOiBzdHJpbmcgPSByZXNwQnVmLnN1YnN0cigwLCBzdGFydCk7XHJcblxyXG4gICAgICBsZXQgZmluaXNoOiBudW1iZXIgPSByZXNwQnVmLmxhc3RJbmRleE9mKFhNTENvbnN0YW50cy5UQUdfT1BFTik7XHJcbiAgICAgIGxldCBjbG9zZVRhZzogc3RyaW5nID0gcmVzcEJ1Zi5zdWJzdHIoZmluaXNoKTtcclxuXHJcbiAgICAgIGNvcmUgPSBvcGVuVGFnICsgU2NyYW1ibGVyLlVuU2NyYW1ibGUocmVzcEJ1Ziwgc3RhcnQsIGZpbmlzaCAtIDEpICsgY2xvc2VUYWc7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gV2UgZ290IGEgc2NyYW1ibGVkIGVycm9yIG1lc3NhZ2UsIHRoZXJlIGlzIG5vIG9wZW4gdGFnXHJcbiAgICAgIGNvcmUgPSBTY3JhbWJsZXIuVW5TY3JhbWJsZShyZXNwQnVmLCAwLCByZXNwQnVmLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcmU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|