@magic-xpa/engine 4.1100.0-dev4110.25 → 4.1100.0-dev4110.252
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/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +29 -0
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +261 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +24 -21
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +23 -20
- 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 +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/EventCommand.mjs +43 -40
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +70 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +25 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +26 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +30 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +30 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +43 -0
- package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +19 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +34 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +18 -15
- 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 +2 -2
- 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 +880 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/esm2022/src/data/TaskTransactionManager.mjs +107 -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 +883 -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 +29883 -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 +9 -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 +11 -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 +9 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +8 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +8 -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 +16 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +16 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +24 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +9 -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 +9 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +11 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +9 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +12 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +13 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +11 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +15 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +7 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +9 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +10 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +14 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +8 -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 +4 -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 +157 -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/BrowserEscEventCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
- package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -26
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -21
- 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/SelectProgramCommand.mjs +0 -15
- package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -21
- 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,2988 @@
|
|
1
|
+
import { Constants, ForceExit, InternalInterface, Logger, Logger_LogLevels, MgControlType, Misc, MsgInterface, Priority, RaiseAt, StorageAttribute, StrUtil, SubformType } from '@magic-xpa/utils';
|
2
|
+
import { ApplicationException, Int32, List, NString, RefParam, Stack, StringBuilder, Thread, isNullOrUndefined } from '@magic-xpa/mscorelib';
|
3
|
+
import { Commands, CommandType, DataModificationTypes, ExpVal, FocusManager, GuiConstants, GuiEnvironment, KeyboardItem, Manager, Modifiers, PropInterface, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
|
4
|
+
import { EventSubType } from '../enums';
|
5
|
+
import { RollbackEventCommand_RollbackType } from '../commands/ClientToServer/RollbackEventCommand';
|
6
|
+
import { MgControl } from '../gui/MgControl';
|
7
|
+
import { MgPriorityBlockingQueue } from '../util/MgPriorityBlockingQueue';
|
8
|
+
import { RunTimeEvent } from './RunTimeEvent';
|
9
|
+
import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
|
10
|
+
import { GUIManager } from '../GUIManager';
|
11
|
+
import { Task } from '../tasks/Task';
|
12
|
+
import { Task_SubformExecModeEnum } from '../tasks/TaskBase';
|
13
|
+
import { ArgumentsList } from '../rt/ArgumentsList';
|
14
|
+
import { MGData } from '../tasks/MGData';
|
15
|
+
import { MGDataCollection } from '../tasks/MGDataCollection';
|
16
|
+
import { RecordOutOfDataViewException } from '../data/RecordOutOfDataViewException';
|
17
|
+
import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
|
18
|
+
import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
|
19
|
+
import { CommandsProcessorManager } from '../CommandsProcessorManager';
|
20
|
+
import { ClientRefreshCommand } from '../commands/ServerToClient/ClientRefreshCommand';
|
21
|
+
import { RemoteCommandsProcessor } from '../remote/RemoteCommandsProcessor';
|
22
|
+
import { ExecutionStack } from '../rt/ExecutionStack';
|
23
|
+
import { EventHandlerPosition } from './EventHandlerPosition';
|
24
|
+
import { ConstInterface } from '../ConstInterface';
|
25
|
+
import { FlowMonitorInterface } from '../FlowMonitorInterface';
|
26
|
+
import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
|
27
|
+
import { ServerError } from '../remote/ServerError';
|
28
|
+
import { Environment } from '../env/Environment';
|
29
|
+
import { LastFocusedManager } from '../rt/LastFocusedManager';
|
30
|
+
import { EventsAllowedType } from './IEventsManager';
|
31
|
+
import { LanguageData } from '../env/LanguageData';
|
32
|
+
import { Subject } from 'rxjs';
|
33
|
+
import { ClientManager } from '../ClientManager';
|
34
|
+
import { ClearEventsOnStopExecution } from '../AccessHelper';
|
35
|
+
var EventScope;
|
36
|
+
(function (EventScope) {
|
37
|
+
EventScope["NONE"] = " ";
|
38
|
+
EventScope["TRANS"] = "T";
|
39
|
+
})(EventScope || (EventScope = {}));
|
40
|
+
export class EventsManager {
|
41
|
+
static REAL_ONLY = true;
|
42
|
+
static MAX_OPER = 9999;
|
43
|
+
static userGrantedForContextActivity = true;
|
44
|
+
_eventsQueue = null;
|
45
|
+
_execStack = null;
|
46
|
+
_rtEvents = null;
|
47
|
+
_serverExecStack = null;
|
48
|
+
_allowEvents = EventsAllowedType.ALL;
|
49
|
+
_compMainPrgTab = null;
|
50
|
+
_currCtrl = null;
|
51
|
+
_currField = null;
|
52
|
+
_currKbdItem = null;
|
53
|
+
_endOfWork = false;
|
54
|
+
_eventScope = EventScope.NONE;
|
55
|
+
_forceExit = ForceExit.None;
|
56
|
+
_forceExitTask = null;
|
57
|
+
_ignoreUnknownAbort = false;
|
58
|
+
_initialized = false;
|
59
|
+
_isHandlingForceExit = false;
|
60
|
+
_isNonReversibleExit = false;
|
61
|
+
_isInRecordFlushEvent = false;
|
62
|
+
static clientInactivityTimerON = false;
|
63
|
+
static clientContextInactivityTimerAborted = false;
|
64
|
+
lastSavedRouteEvent = null;
|
65
|
+
_stopExecution = false;
|
66
|
+
_processingTopMostEndTask = false;
|
67
|
+
_stopExecutionCtrl = null;
|
68
|
+
guiPendingEvent = null;
|
69
|
+
KBI_DOWN = null;
|
70
|
+
KBI_UP = null;
|
71
|
+
confirmationDialogMsg = 'The server context serving this application is about to time out. Do you want to continue your work?';
|
72
|
+
confirmationDialogTitle = 'Session is about to be terminated!';
|
73
|
+
static Instance = new EventsManager();
|
74
|
+
_lastFailedFocusedControl = null;
|
75
|
+
isSpinnerShown = false;
|
76
|
+
isInViewRefresh = false;
|
77
|
+
SpinnerStopped = new Subject();
|
78
|
+
static clientBusyTimeStart = 0;
|
79
|
+
constructor() {
|
80
|
+
this._rtEvents = new Stack();
|
81
|
+
this._eventsQueue = new MgPriorityBlockingQueue();
|
82
|
+
this._execStack = new Stack();
|
83
|
+
this._execStack.push(new ExecutionStack());
|
84
|
+
this._serverExecStack = new Stack();
|
85
|
+
this._serverExecStack.push(null);
|
86
|
+
this.KBI_DOWN = new KeyboardItem(GuiConstants.KEY_DOWN, Modifiers.MODIFIER_NONE);
|
87
|
+
this.KBI_UP = new KeyboardItem(GuiConstants.KEY_UP, Modifiers.MODIFIER_NONE);
|
88
|
+
}
|
89
|
+
getPendingGuiEvent() {
|
90
|
+
return this.guiPendingEvent;
|
91
|
+
}
|
92
|
+
setPendingGuiEvent(guiEvent) {
|
93
|
+
this.guiPendingEvent = guiEvent;
|
94
|
+
}
|
95
|
+
addToTail(rtEvt) {
|
96
|
+
if (!rtEvt.isIdleTimer()) {
|
97
|
+
if (EventsManager.clientInactivityTimerON) {
|
98
|
+
EventsManager.clientContextInactivityTimerAborted = true;
|
99
|
+
}
|
100
|
+
}
|
101
|
+
else {
|
102
|
+
if (this.getLastSavedRouteEvent() != null) {
|
103
|
+
this.addToTail(this.getLastSavedRouteEvent());
|
104
|
+
this.setLastSavedRouteEvent(null);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
this._eventsQueue.put(rtEvt);
|
108
|
+
}
|
109
|
+
AddKeyboardEvent(mgForm, mgControl, modifier, keyCode, start, end, text, isActChar, suggestedValue, code) {
|
110
|
+
let rtEvt = (mgControl !== null) ? new RunTimeEvent(mgControl, true, false) : new RunTimeEvent(mgForm.getTask(), true);
|
111
|
+
rtEvt.setInternal(code);
|
112
|
+
let newKbItem = new KeyboardItem(keyCode, modifier);
|
113
|
+
if (isActChar && (mgControl !== null && (mgControl.isTextControl())))
|
114
|
+
newKbItem.setAction(InternalInterface.MG_ACT_CHAR);
|
115
|
+
rtEvt.setKeyboardItem(newKbItem);
|
116
|
+
if (code === InternalInterface.MG_ACT_CTRL_KEYDOWN) {
|
117
|
+
rtEvt.setEditParms(start, end, text);
|
118
|
+
}
|
119
|
+
else
|
120
|
+
rtEvt.setValue(suggestedValue);
|
121
|
+
this.addToTail(rtEvt);
|
122
|
+
return;
|
123
|
+
}
|
124
|
+
async checkParkability() {
|
125
|
+
let current = LastFocusedManager.getLastFocusedControl();
|
126
|
+
if (current !== null && (current.getForm().getTask()).getLevel() === Constants.TASK_LEVEL_CONTROL && !await current.IsParkable())
|
127
|
+
await this.HandleNonParkableControls(current.getForm().getTask());
|
128
|
+
}
|
129
|
+
async HandleParkabilityOnRowChange(itask) {
|
130
|
+
await this.HandleNonParkableControls(itask);
|
131
|
+
}
|
132
|
+
async HandleNonParkableControls(itask) {
|
133
|
+
let task = itask;
|
134
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE && task.IsInteractive) {
|
135
|
+
await task.enableModes();
|
136
|
+
let oldMode = task.getOriginalTaskMode();
|
137
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
138
|
+
if (!this.GetStopExecutionFlag()) {
|
139
|
+
if (oldMode !== Constants.TASK_MODE_CREATE) {
|
140
|
+
task.setMode(oldMode);
|
141
|
+
await task.DataView.currRecCompute(true);
|
142
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
143
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
144
|
+
task.setLastParkedCtrl(null);
|
145
|
+
await FocusManager.SetFocus(task, null, -1, true);
|
146
|
+
return;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
if (task.getLevel() === Constants.TASK_LEVEL_CONTROL)
|
151
|
+
await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
|
152
|
+
task.setLastParkedCtrl(null);
|
153
|
+
MgControl.ReturnToCtrl = null;
|
154
|
+
await FocusManager.SetFocus(task, null, -1, true);
|
155
|
+
}
|
156
|
+
async handleEvent(rtEvt, returnedFromServer) {
|
157
|
+
let handler = null;
|
158
|
+
let pos = new EventHandlerPosition();
|
159
|
+
let task = rtEvt.getTask();
|
160
|
+
let ctrl = task.getLastParkedCtrl();
|
161
|
+
let forceExitDone = false;
|
162
|
+
let endTaskError = false;
|
163
|
+
let oldRtEvt = null;
|
164
|
+
let oldForceExit = this.getForceExit();
|
165
|
+
let oldForceExitTask = this.getForceExitTask();
|
166
|
+
let oldIsHandlingForceExit = this._isHandlingForceExit;
|
167
|
+
let restoreIsForceExit = false;
|
168
|
+
let restoreCurrCtrl;
|
169
|
+
let restoreCurrField = null;
|
170
|
+
if ((rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL)) {
|
171
|
+
if (rtEvt.InternalEvent < InternalInterface.MG_ACT_TOT_CNT && (!task.ActionManager.isEnabled(rtEvt.InternalEvent) || (!rtEvt.isImmediate() && this.NoEventsAllowed())))
|
172
|
+
return;
|
173
|
+
}
|
174
|
+
else if (!rtEvt.isImmediate() && this.NoEventsAllowed())
|
175
|
+
return;
|
176
|
+
restoreCurrCtrl = this._currCtrl;
|
177
|
+
this._currCtrl = ctrl;
|
178
|
+
let propagate = rtEvt.getType() !== ConstInterface.EVENT_TYPE_INTERNAL || rtEvt.getInternalCode() < 1000;
|
179
|
+
try {
|
180
|
+
this.pushRtEvent(rtEvt);
|
181
|
+
await this.CheckAndShowSpinner(true);
|
182
|
+
let bRcBefore = await this.commonHandlerBefore(rtEvt);
|
183
|
+
restoreCurrField = this._currField;
|
184
|
+
this._currField = task.getCurrField();
|
185
|
+
if (bRcBefore) {
|
186
|
+
pos.init(rtEvt);
|
187
|
+
handler = pos.getNext();
|
188
|
+
if (handler !== null && handler.getEvent() !== null && handler.getEvent().UserEvt !== null)
|
189
|
+
this.setForceExit(handler.getEvent().UserEvt.ForceExit, task);
|
190
|
+
while (handler !== null) {
|
191
|
+
let handlerContextTask = null;
|
192
|
+
let rtEvtChanged;
|
193
|
+
try {
|
194
|
+
let enabledCndCheckedAndTrue = false;
|
195
|
+
handlerContextTask = handler.getTask().GetContextTask();
|
196
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() >= 1000 && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_VARIABLE)
|
197
|
+
handler.getTask().SetContextTask(handler.getTask());
|
198
|
+
else
|
199
|
+
handler.getTask().SetContextTask(rtEvt.getTask());
|
200
|
+
if (handler.getEvent().getType() === ConstInterface.EVENT_TYPE_USER && await handler.isEnabled()) {
|
201
|
+
enabledCndCheckedAndTrue = true;
|
202
|
+
this._isHandlingForceExit = false;
|
203
|
+
restoreIsForceExit = true;
|
204
|
+
if (await this.handleForceExitBefore(handler.getEvent(), rtEvt)) {
|
205
|
+
forceExitDone = true;
|
206
|
+
}
|
207
|
+
}
|
208
|
+
if (rtEvt !== handler.getEvent()) {
|
209
|
+
oldRtEvt = rtEvt;
|
210
|
+
rtEvt = new RunTimeEvent(handler.getEvent(), rtEvt);
|
211
|
+
rtEvtChanged = true;
|
212
|
+
this.popRtEvent();
|
213
|
+
this.pushRtEvent(rtEvt);
|
214
|
+
}
|
215
|
+
else
|
216
|
+
rtEvtChanged = false;
|
217
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_REC_SUFFIX)
|
218
|
+
rtEvt.getTask().setInRecordSuffix(true);
|
219
|
+
this.createEventArguments(rtEvt);
|
220
|
+
let handlerRetVals = await handler.execute(rtEvt, returnedFromServer, enabledCndCheckedAndTrue);
|
221
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_REC_SUFFIX)
|
222
|
+
rtEvt.getTask().setInRecordSuffix(false);
|
223
|
+
propagate = handlerRetVals.Propagate;
|
224
|
+
if (!handlerRetVals.Enabled && rtEvtChanged) {
|
225
|
+
rtEvt = oldRtEvt;
|
226
|
+
oldRtEvt = null;
|
227
|
+
rtEvtChanged = false;
|
228
|
+
this.popRtEvent();
|
229
|
+
this.pushRtEvent(rtEvt);
|
230
|
+
}
|
231
|
+
if (rtEvt.getInternalCode() !== InternalInterface.MG_ACT_TASK_PREFIX && task.isStarted() && task.getExecEndTask()) {
|
232
|
+
endTaskError = await task.endTask(true, false, false);
|
233
|
+
if (endTaskError)
|
234
|
+
break;
|
235
|
+
}
|
236
|
+
if (this.GetStopExecutionFlag()) {
|
237
|
+
if (await this.handleStopExecution(rtEvt))
|
238
|
+
break;
|
239
|
+
}
|
240
|
+
}
|
241
|
+
finally {
|
242
|
+
handler.getTask().SetContextTask(handlerContextTask);
|
243
|
+
}
|
244
|
+
if (!propagate)
|
245
|
+
break;
|
246
|
+
if (rtEvtChanged)
|
247
|
+
handler = pos.getNext(rtEvt);
|
248
|
+
else
|
249
|
+
handler = pos.getNext();
|
250
|
+
if (handler !== null)
|
251
|
+
FlowMonitorQueue.Instance.addTaskEvent(rtEvt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_PROPAGATE, task.GetTaskDetails());
|
252
|
+
}
|
253
|
+
if (propagate && !endTaskError)
|
254
|
+
await this.commonHandler(rtEvt);
|
255
|
+
}
|
256
|
+
if (!endTaskError) {
|
257
|
+
await this.commonHandlerAfter(rtEvt, bRcBefore);
|
258
|
+
}
|
259
|
+
if (forceExitDone && this._isHandlingForceExit) {
|
260
|
+
this._isHandlingForceExit = false;
|
261
|
+
await this.handleForceExitAfter(rtEvt);
|
262
|
+
}
|
263
|
+
this.setForceExit(oldForceExit, oldForceExitTask);
|
264
|
+
if (restoreIsForceExit)
|
265
|
+
this._isHandlingForceExit = oldIsHandlingForceExit;
|
266
|
+
}
|
267
|
+
finally {
|
268
|
+
this._currCtrl = restoreCurrCtrl;
|
269
|
+
this._currField = restoreCurrField;
|
270
|
+
this.popRtEvent();
|
271
|
+
}
|
272
|
+
GUIManager.Instance.execGuiCommandQueue();
|
273
|
+
}
|
274
|
+
async simulateSelection(ctrl, val, line, produceClick) {
|
275
|
+
let mgControl = ctrl;
|
276
|
+
let currTask = mgControl.getForm().getTask();
|
277
|
+
let cancelWasRaised = currTask.cancelWasRaised();
|
278
|
+
if (mgControl.Type === MgControlType.CTRL_TYPE_BUTTON) {
|
279
|
+
let aRtEvt = new RunTimeEvent(mgControl);
|
280
|
+
let raiseAt = (await (mgControl.getProp(PropInterface.PROP_TYPE_RAISE_AT)).getValueInt());
|
281
|
+
if (aRtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && (aRtEvt.InternalEvent === InternalInterface.MG_ACT_CANCEL || aRtEvt.InternalEvent === InternalInterface.MG_ACT_RT_QUIT)) {
|
282
|
+
if (raiseAt === RaiseAt.TaskInFocus)
|
283
|
+
currTask = LastFocusedManager.Instance.getLastFocusedTask();
|
284
|
+
cancelWasRaised = currTask.cancelWasRaised();
|
285
|
+
currTask.setCancelWasRaised(true);
|
286
|
+
}
|
287
|
+
if (raiseAt === RaiseAt.TaskInFocus)
|
288
|
+
mgControl.setRtEvtTask(LastFocusedManager.Instance.getLastFocusedTask());
|
289
|
+
}
|
290
|
+
await this.handleFocus(mgControl, line, produceClick, false);
|
291
|
+
currTask.setCancelWasRaised(cancelWasRaised);
|
292
|
+
if (this._stopExecution)
|
293
|
+
return;
|
294
|
+
let controlIsParkable = await mgControl.IsParkable();
|
295
|
+
if (mgControl.Type !== MgControlType.CTRL_TYPE_BUTTON || (mgControl.getField() === null || controlIsParkable)) {
|
296
|
+
if (mgControl.Type === MgControlType.CTRL_TYPE_BUTTON && !controlIsParkable) {
|
297
|
+
let subformTask = mgControl.getForm().getTask();
|
298
|
+
if (subformTask.IsSubForm) {
|
299
|
+
currTask = LastFocusedManager.Instance.getLastFocusedTask();
|
300
|
+
if (subformTask !== currTask && subformTask.pathContains(currTask)) {
|
301
|
+
if (subformTask.getLevel() === Constants.TASK_LEVEL_TASK) {
|
302
|
+
await this.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_PREFIX);
|
303
|
+
}
|
304
|
+
await this.HandleNonParkableControls(subformTask);
|
305
|
+
}
|
306
|
+
}
|
307
|
+
}
|
308
|
+
let rtEvt = new RunTimeEvent(mgControl);
|
309
|
+
RuntimeContextBase.Instance.CurrentClickedCtrl = mgControl;
|
310
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_HIT);
|
311
|
+
await this.handleEvent(rtEvt, false);
|
312
|
+
if (this._stopExecution)
|
313
|
+
return;
|
314
|
+
}
|
315
|
+
if (mgControl.Type !== MgControlType.CTRL_TYPE_BUTTON)
|
316
|
+
await this.handleSelection(mgControl, line, val);
|
317
|
+
if (this._stopExecution)
|
318
|
+
return;
|
319
|
+
await this.handleMouseUp(mgControl, line, produceClick);
|
320
|
+
}
|
321
|
+
async handleInternalEventWithTask(itask, eventCode) {
|
322
|
+
await this.handleInternalEventWithTaskAndSubformRefresh(itask, eventCode, false);
|
323
|
+
}
|
324
|
+
async handleInternalEventWithTaskAndSubformRefresh(itask, eventCode, subformRefresh) {
|
325
|
+
let task = itask;
|
326
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX && task.IsSubForm && task.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME) {
|
327
|
+
task.SubformExecMode = (subformRefresh ? Task_SubformExecModeEnum.REFRESH : Task_SubformExecModeEnum.SET_FOCUS);
|
328
|
+
}
|
329
|
+
if (subformRefresh)
|
330
|
+
await this.handleInternalEventWithTask(itask, InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT);
|
331
|
+
if (task.DataView.isEmptyDataview()) {
|
332
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX || eventCode === InternalInterface.MG_ACT_REC_SUFFIX) {
|
333
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX)
|
334
|
+
await task.emptyDataviewOpen(subformRefresh);
|
335
|
+
else
|
336
|
+
task.emptyDataviewClose();
|
337
|
+
if (task.getForm() !== null) {
|
338
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX)
|
339
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
340
|
+
task.getForm().SelectRow();
|
341
|
+
}
|
342
|
+
}
|
343
|
+
else
|
344
|
+
await this.handleInternalEventWithTaskAndEventSubtype(task, eventCode, EventSubType.Normal);
|
345
|
+
}
|
346
|
+
else
|
347
|
+
await this.handleInternalEventWithTaskAndEventSubtype(task, eventCode, EventSubType.Normal);
|
348
|
+
}
|
349
|
+
async handleInternalEventWithMgControlBase(ctrl, eventCode) {
|
350
|
+
await this.handleInternalEventWithMgControl(ctrl, eventCode, EventSubType.Normal);
|
351
|
+
}
|
352
|
+
GetStopExecutionFlag() {
|
353
|
+
return this._stopExecution;
|
354
|
+
}
|
355
|
+
getStopExecutionCtrl() {
|
356
|
+
return this._stopExecutionCtrl;
|
357
|
+
}
|
358
|
+
Init() {
|
359
|
+
if (this._initialized) {
|
360
|
+
this._isHandlingForceExit = false;
|
361
|
+
this._forceExit = ForceExit.None;
|
362
|
+
this._forceExitTask = null;
|
363
|
+
this._currField = null;
|
364
|
+
this.setEndOfWork(true);
|
365
|
+
}
|
366
|
+
this._initialized = true;
|
367
|
+
}
|
368
|
+
addInternalEventWithItaskAndCode(itask, code) {
|
369
|
+
this.addGuiTriggeredEventWithTaskAndCodeAndOnMultiMark(itask, code);
|
370
|
+
}
|
371
|
+
addInternalEventWithCtrlAndCode(ctrl, code) {
|
372
|
+
let rtEvt = new RunTimeEvent(ctrl);
|
373
|
+
rtEvt.setInternal(code);
|
374
|
+
this.addToTail(rtEvt);
|
375
|
+
}
|
376
|
+
addInternalEventWithCtrlAndDisplayLineAndCode(ctrl, DisplayLine, code) {
|
377
|
+
let rtEvt = new RunTimeEvent(ctrl, DisplayLine, false);
|
378
|
+
rtEvt.setInternal(code);
|
379
|
+
this.addToTail(rtEvt);
|
380
|
+
}
|
381
|
+
addInternalEventWithCtrlAndCodeAndPriority(ctrl, code, priority) {
|
382
|
+
let rtEvt = new RunTimeEvent(ctrl);
|
383
|
+
rtEvt.setInternal(code);
|
384
|
+
rtEvt.setPriority(priority);
|
385
|
+
this.addToTail(rtEvt);
|
386
|
+
}
|
387
|
+
addGuiTriggeredEventWithTaskAndCodeAndOnMultiMark(itask, code) {
|
388
|
+
let task = itask;
|
389
|
+
let rtEvt = new RunTimeEvent(task);
|
390
|
+
rtEvt.setInternal(code);
|
391
|
+
this.addToTail(rtEvt);
|
392
|
+
}
|
393
|
+
addGuiTriggeredEventWithCtrlAndCodeAndLineAndModifier(ctrl, code, line) {
|
394
|
+
let rtEvt = new RunTimeEvent(ctrl, line, false);
|
395
|
+
rtEvt.setInternal(code);
|
396
|
+
this.addToTail(rtEvt);
|
397
|
+
}
|
398
|
+
addGuiTriggeredEventWithTaskAndCodeAndLine(task, code, line) {
|
399
|
+
let tsk = null;
|
400
|
+
if (task !== null)
|
401
|
+
tsk = task;
|
402
|
+
let rtEvt = new RunTimeEvent(tsk);
|
403
|
+
rtEvt.setInternal(code);
|
404
|
+
rtEvt.DisplayLine = line;
|
405
|
+
this.addToTail(rtEvt);
|
406
|
+
}
|
407
|
+
AddColumnClickEvent(columnCtrl, direction, columnHeader) {
|
408
|
+
let rtEvt = new RunTimeEvent(columnCtrl, direction, 0);
|
409
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_COL_CLICK);
|
410
|
+
let argsList = new Array();
|
411
|
+
argsList[0] = new ExpVal(StorageAttribute.UNICODE, false, columnHeader);
|
412
|
+
let args = new ArgumentsList(argsList);
|
413
|
+
rtEvt.setArgList(args);
|
414
|
+
this.addToTail(rtEvt);
|
415
|
+
}
|
416
|
+
AddRouteEvent(task, code, routerpath, routerOutletName, routeParams) {
|
417
|
+
let rtEvt = new RunTimeEvent(task, true);
|
418
|
+
rtEvt.setInternal(code);
|
419
|
+
let argsList = new Array(2);
|
420
|
+
argsList[0] = new ExpVal(StorageAttribute.ALPHA, false, routerpath);
|
421
|
+
if (routerOutletName === null)
|
422
|
+
routerOutletName = '';
|
423
|
+
argsList[1] = new ExpVal(StorageAttribute.ALPHA, false, routerOutletName);
|
424
|
+
let args = new ArgumentsList(argsList);
|
425
|
+
rtEvt.setArgList(args);
|
426
|
+
rtEvt.setRouteParamList(routeParams);
|
427
|
+
this.addToTail(rtEvt);
|
428
|
+
}
|
429
|
+
AddRouterClosedEvent(task) {
|
430
|
+
let subFormControl = task.getForm().getSubFormCtrl();
|
431
|
+
let rtEvt = new RunTimeEvent(subFormControl.getForm().getTask(), true);
|
432
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_SUBFORM_CLOSE);
|
433
|
+
let argsList = new Array(1);
|
434
|
+
argsList[0] = new ExpVal(StorageAttribute.ALPHA, false, subFormControl.getName());
|
435
|
+
let args = new ArgumentsList(argsList);
|
436
|
+
rtEvt.setArgList(args);
|
437
|
+
EventsManager.Instance.addToTail(rtEvt);
|
438
|
+
}
|
439
|
+
AddLastSavedRouteEvent(srcTask, args) {
|
440
|
+
let rtEvt = new RunTimeEvent(LastFocusedManager.Instance.getLastFocusedTask(), true);
|
441
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_WEBCLIENT_ROUTE);
|
442
|
+
if (srcTask != null) {
|
443
|
+
rtEvt.setTask(srcTask);
|
444
|
+
if (args != null) {
|
445
|
+
rtEvt.setArgList(args);
|
446
|
+
}
|
447
|
+
this.setLastSavedRouteEvent(rtEvt);
|
448
|
+
}
|
449
|
+
}
|
450
|
+
AddExternalValueEvent(ctrl, value, refreshDisplay) {
|
451
|
+
let rtEvt = new RunTimeEvent(ctrl, 0, true);
|
452
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_SET_EXTERNAL_VALUE);
|
453
|
+
rtEvt.setValue(value);
|
454
|
+
let argsList = new Array(1);
|
455
|
+
argsList[0] = new ExpVal(StorageAttribute.BOOLEAN, false, refreshDisplay ? '1' : '0');
|
456
|
+
let args = new ArgumentsList(argsList);
|
457
|
+
rtEvt.setArgList(args);
|
458
|
+
this.addToTail(rtEvt);
|
459
|
+
}
|
460
|
+
addGuiTriggeredEventWithCtrlAndCodeAndLine(ctrl, code, line) {
|
461
|
+
let rtEvt = new RunTimeEvent(ctrl, line, true);
|
462
|
+
rtEvt.setInternal(code);
|
463
|
+
this.addToTail(rtEvt);
|
464
|
+
}
|
465
|
+
addGuiTriggeredEventWithCtrlAndLineAndCodeAndIsProductClick(ctrl, code, line, isProduceClick) {
|
466
|
+
let rtEvt = new RunTimeEvent(ctrl, line, true);
|
467
|
+
rtEvt.setInternal(code);
|
468
|
+
rtEvt.setProduceClick(isProduceClick);
|
469
|
+
this.addToTail(rtEvt);
|
470
|
+
}
|
471
|
+
addGuiTriggeredEventWithCtrlAndCodeAndList(ctrl, code, list) {
|
472
|
+
let rtEvt = new RunTimeEvent(ctrl, list, true);
|
473
|
+
rtEvt.setInternal(code);
|
474
|
+
this.addToTail(rtEvt);
|
475
|
+
}
|
476
|
+
addGuiTriggeredEventWithTaskAndCode(task, code) {
|
477
|
+
let rtEvt = new RunTimeEvent(task, true);
|
478
|
+
rtEvt.setInternal(code);
|
479
|
+
this.addToTail(rtEvt);
|
480
|
+
}
|
481
|
+
addGuiTriggeredEventTaskAndCodeAndRaisedBy(task, code) {
|
482
|
+
this.addGuiTriggeredEventWithTaskAndCode(task, code);
|
483
|
+
}
|
484
|
+
getEvent() {
|
485
|
+
return this._eventsQueue.poll();
|
486
|
+
}
|
487
|
+
getForceExit() {
|
488
|
+
return this._forceExit;
|
489
|
+
}
|
490
|
+
setForceExit(forceExit, task) {
|
491
|
+
this._forceExit = forceExit;
|
492
|
+
this.setForceExitTask(task);
|
493
|
+
}
|
494
|
+
getForceExitTask() {
|
495
|
+
return this._forceExitTask;
|
496
|
+
}
|
497
|
+
setForceExitTask(task) {
|
498
|
+
this._forceExitTask = task;
|
499
|
+
}
|
500
|
+
isForceExitPreRecordUpdate(task) {
|
501
|
+
return this._isHandlingForceExit && this.getForceExit() === ForceExit.PreRecordUpdate && task === this.getForceExitTask();
|
502
|
+
}
|
503
|
+
async ExecuteClientContextInactivityTimer() {
|
504
|
+
let startTime = Misc.getSystemMilliseconds();
|
505
|
+
let clientCtxInactivityTimeout = Environment.Instance.getClientContextInactivityTimeout() * 100;
|
506
|
+
EventsManager.clientInactivityTimerON = true;
|
507
|
+
while (EventsManager.clientInactivityTimerON) {
|
508
|
+
await Thread.Sleep(1000);
|
509
|
+
var timeLapsed = Misc.getSystemMilliseconds() - startTime;
|
510
|
+
if (EventsManager.clientContextInactivityTimerAborted || timeLapsed >= clientCtxInactivityTimeout) {
|
511
|
+
EventsManager.clientInactivityTimerON = false;
|
512
|
+
}
|
513
|
+
}
|
514
|
+
}
|
515
|
+
async CheckAndShowSpinner(show) {
|
516
|
+
let sendCommand = false;
|
517
|
+
if (this.getLastRtEvent() !== null && this.getLastRtEvent().getPriority() === Priority.LOWEST)
|
518
|
+
show = false;
|
519
|
+
if (show != this.isSpinnerShown) {
|
520
|
+
if (show) {
|
521
|
+
if (Misc.getSystemMilliseconds() - this.GetEventTime() > 1000) {
|
522
|
+
sendCommand = true;
|
523
|
+
EventsManager.clientBusyTimeStart = Misc.getSystemMilliseconds();
|
524
|
+
}
|
525
|
+
}
|
526
|
+
else
|
527
|
+
sendCommand = true;
|
528
|
+
if (sendCommand) {
|
529
|
+
Commands.addShowSpinner(show);
|
530
|
+
Commands.beginInvoke();
|
531
|
+
await Thread.Sleep(50);
|
532
|
+
this.isSpinnerShown = show;
|
533
|
+
if (!this.isSpinnerShown) {
|
534
|
+
let totalClientBusyTime = Misc.getSystemMilliseconds() - EventsManager.clientBusyTimeStart;
|
535
|
+
this.SpinnerStopped.next(totalClientBusyTime);
|
536
|
+
EventsManager.clientBusyTimeStart = 0;
|
537
|
+
}
|
538
|
+
}
|
539
|
+
}
|
540
|
+
}
|
541
|
+
async EventsLoop(mgData) {
|
542
|
+
let savedAllowEvents = this.getAllowEvents();
|
543
|
+
this.setAllowEvents(EventsAllowedType.ALL);
|
544
|
+
this.pushNewExecStacks();
|
545
|
+
while (!mgData.IsAborting) {
|
546
|
+
await this.CheckAndShowSpinner(false);
|
547
|
+
await this._eventsQueue.waitForElement();
|
548
|
+
await this.handleEvents(mgData, 0);
|
549
|
+
if (!mgData.IsAborting)
|
550
|
+
await this.checkParkability();
|
551
|
+
}
|
552
|
+
this.popNewExecStacks();
|
553
|
+
this.setAllowEvents(savedAllowEvents);
|
554
|
+
}
|
555
|
+
async NonInteractiveEventsLoop(mgData, taskBase) {
|
556
|
+
let task = taskBase;
|
557
|
+
let savedAllowEvents = this.getAllowEvents();
|
558
|
+
this.setNonInteractiveAllowEvents(await task.isAllowEvents());
|
559
|
+
this.pushNewExecStacks();
|
560
|
+
while (!mgData.IsAborting) {
|
561
|
+
if (task.getMode() === Constants.TASK_MODE_DELETE)
|
562
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_CYCLE_NEXT_DELETE_REC);
|
563
|
+
else
|
564
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_CYCLE_NEXT_REC);
|
565
|
+
await Thread.Sleep(10);
|
566
|
+
if (!mgData.IsAborting && await task.isAllowEvents())
|
567
|
+
await this.handleEvents(mgData, 1);
|
568
|
+
}
|
569
|
+
this.popNewExecStacks();
|
570
|
+
this.setAllowEvents(savedAllowEvents);
|
571
|
+
}
|
572
|
+
async handleEvents(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt) {
|
573
|
+
if ((baseMgDataOrHandlersTab === null || baseMgDataOrHandlersTab instanceof MGData) && (eventsToHandleCntOrRtEvt === null || eventsToHandleCntOrRtEvt.constructor === Number)) {
|
574
|
+
await this.handleEvents_0(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt);
|
575
|
+
return;
|
576
|
+
}
|
577
|
+
await this.handleEvents_1(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt);
|
578
|
+
}
|
579
|
+
async handleEvents_0(baseMgData, eventsToHandleCnt) {
|
580
|
+
let task = null;
|
581
|
+
let delta = 0;
|
582
|
+
let eventsPolledCnt = 0;
|
583
|
+
this.setStopExecution(false);
|
584
|
+
while (!this._eventsQueue.isEmpty() && !this._stopExecution && (eventsToHandleCnt === 0 || eventsPolledCnt < eventsToHandleCnt)) {
|
585
|
+
let rtEvt = this.getEvent();
|
586
|
+
if (rtEvt !== null && rtEvt.isGuiTriggeredEvent()) {
|
587
|
+
delta = Misc.getSystemMilliseconds();
|
588
|
+
this._currKbdItem = null;
|
589
|
+
let blockedByModalWindow = rtEvt.isBlockedByModalWindow(baseMgData);
|
590
|
+
if (blockedByModalWindow && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_TIMER) {
|
591
|
+
continue;
|
592
|
+
}
|
593
|
+
if (!rtEvt.isIdleTimer() && !blockedByModalWindow && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_ENABLE_EVENTS && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_DISABLE_EVENTS && rtEvt.getTask() !== null && !rtEvt.getTask().getMGData().IsAborting) {
|
594
|
+
MGDataCollection.Instance.currMgdID = rtEvt.getTask().getMGData().GetId();
|
595
|
+
}
|
596
|
+
}
|
597
|
+
let currMgd = MGDataCollection.Instance.getCurrMGData();
|
598
|
+
if (currMgd !== null) {
|
599
|
+
while (currMgd !== null && currMgd.IsAborting) {
|
600
|
+
currMgd = currMgd.getParentMGdata();
|
601
|
+
if (currMgd !== null)
|
602
|
+
MGDataCollection.Instance.currMgdID = MGDataCollection.Instance.getMgDataIdx(currMgd);
|
603
|
+
}
|
604
|
+
}
|
605
|
+
else {
|
606
|
+
task = rtEvt.getTask();
|
607
|
+
while (currMgd === null && task !== null && task.getParent() !== null) {
|
608
|
+
task = task.getParent();
|
609
|
+
currMgd = task.getMGData();
|
610
|
+
if (currMgd.IsAborting)
|
611
|
+
currMgd = null;
|
612
|
+
if (currMgd !== null)
|
613
|
+
MGDataCollection.Instance.currMgdID = MGDataCollection.Instance.getMgDataIdx(currMgd);
|
614
|
+
}
|
615
|
+
}
|
616
|
+
if (currMgd === null)
|
617
|
+
break;
|
618
|
+
if (rtEvt.getTask() === null) {
|
619
|
+
task = LastFocusedManager.Instance.getLastFocusedTask();
|
620
|
+
while (task !== null && (task.isAborting() || task.InEndTask))
|
621
|
+
task = task.getParent();
|
622
|
+
if (task !== null) {
|
623
|
+
rtEvt.setCtrl(task.getLastParkedCtrl());
|
624
|
+
rtEvt.setTask(task);
|
625
|
+
}
|
626
|
+
}
|
627
|
+
else
|
628
|
+
task = rtEvt.getTask();
|
629
|
+
if (task !== null) {
|
630
|
+
await this.handleEvent(rtEvt, false);
|
631
|
+
}
|
632
|
+
GUIManager.Instance.execGuiCommandQueue();
|
633
|
+
this._currCtrl = null;
|
634
|
+
if (task !== null)
|
635
|
+
await Task.CommandsProcessor.SendMonitorOnly();
|
636
|
+
else {
|
637
|
+
await Task.CommandsProcessor.SendMonitorOnly();
|
638
|
+
}
|
639
|
+
if (rtEvt !== null && rtEvt.isGuiTriggeredEvent()) {
|
640
|
+
if (delta > 0) {
|
641
|
+
delta = Misc.getSystemMilliseconds() - delta;
|
642
|
+
}
|
643
|
+
}
|
644
|
+
if (eventsToHandleCnt > 0 && rtEvt !== null && rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.InternalEvent < InternalInterface.MG_ACT_TOT_CNT)
|
645
|
+
eventsPolledCnt++;
|
646
|
+
}
|
647
|
+
}
|
648
|
+
async handleStopExecution(rtEvt) {
|
649
|
+
let stop = false;
|
650
|
+
if (!this.GetStopExecutionFlag())
|
651
|
+
return stop;
|
652
|
+
let task = rtEvt.getTask();
|
653
|
+
let currCtrl = rtEvt.Control;
|
654
|
+
let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
|
655
|
+
let endTaskDueToVerifyError = false;
|
656
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
657
|
+
switch (rtEvt.getInternalCode()) {
|
658
|
+
case InternalInterface.MG_ACT_TASK_PREFIX:
|
659
|
+
endTaskDueToVerifyError = true;
|
660
|
+
break;
|
661
|
+
case InternalInterface.MG_ACT_REC_PREFIX:
|
662
|
+
endTaskDueToVerifyError = true;
|
663
|
+
break;
|
664
|
+
case InternalInterface.MG_ACT_REC_SUFFIX:
|
665
|
+
this.setStopExecutionCtrl(null);
|
666
|
+
this.setStopExecutionCtrl(task.getLastParkedCtrl());
|
667
|
+
break;
|
668
|
+
case InternalInterface.MG_ACT_CTRL_PREFIX:
|
669
|
+
this.setStopExecution(false);
|
670
|
+
task.InCtrlPrefix = false;
|
671
|
+
if (lastParkedCtrl === null) {
|
672
|
+
task.setCurrField(null);
|
673
|
+
this.setStopExecutionCtrl(null);
|
674
|
+
this.setStopExecutionCtrl(currCtrl);
|
675
|
+
await this.HandleNonParkableControls(task);
|
676
|
+
}
|
677
|
+
else {
|
678
|
+
task.setCurrField(lastParkedCtrl.getField());
|
679
|
+
await FocusManager.SetFocus(lastParkedCtrl, -1);
|
680
|
+
}
|
681
|
+
this.setStopExecution(true);
|
682
|
+
break;
|
683
|
+
case InternalInterface.MG_ACT_CTRL_SUFFIX:
|
684
|
+
currCtrl.setInControlSuffix(false);
|
685
|
+
break;
|
686
|
+
}
|
687
|
+
if (endTaskDueToVerifyError) {
|
688
|
+
await task.endTask(true, false, true);
|
689
|
+
stop = true;
|
690
|
+
}
|
691
|
+
}
|
692
|
+
return stop;
|
693
|
+
}
|
694
|
+
async handleForceExitBefore(evt, rtEvt) {
|
695
|
+
let forceExit = evt.UserEvt.ForceExit;
|
696
|
+
let isNewRec = false;
|
697
|
+
let oldIdx = 0;
|
698
|
+
if (forceExit === ForceExit.None || rtEvt.isImmediate())
|
699
|
+
return false;
|
700
|
+
this._isHandlingForceExit = true;
|
701
|
+
let task = rtEvt.getTask();
|
702
|
+
let oldRec = task.DataView.getCurrRec();
|
703
|
+
if (oldRec !== null && oldRec.getMode() === DataModificationTypes.Insert && oldRec.isNewRec()) {
|
704
|
+
isNewRec = true;
|
705
|
+
oldIdx = oldRec.getId();
|
706
|
+
}
|
707
|
+
if (forceExit !== ForceExit.Editing && task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
708
|
+
let ctrl = task.getLastParkedCtrl();
|
709
|
+
if (ctrl !== null)
|
710
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
711
|
+
}
|
712
|
+
if ((forceExit === ForceExit.PreRecordUpdate || forceExit === ForceExit.PostRecordUpdate) && task.getLevel() === Constants.TASK_LEVEL_RECORD) {
|
713
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
714
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE && !this._stopExecution)
|
715
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
716
|
+
let currRec = task.DataView.getCurrRec();
|
717
|
+
if (currRec !== null && this._stopExecution && isNewRec && oldIdx === currRec.getId() && task.getMode() === Constants.TASK_MODE_CREATE) {
|
718
|
+
currRec.clearMode();
|
719
|
+
currRec.restart(DataModificationTypes.Insert);
|
720
|
+
}
|
721
|
+
}
|
722
|
+
if (forceExit === ForceExit.PostRecordUpdate && !this._stopExecution) {
|
723
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
724
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
725
|
+
}
|
726
|
+
if (forceExit === ForceExit.Editing) {
|
727
|
+
let evtCtrl = rtEvt.Control;
|
728
|
+
if (evtCtrl !== null && evtCtrl.getField() !== null) {
|
729
|
+
let ctrlVal = Manager.GetCtrlVal(evtCtrl);
|
730
|
+
await evtCtrl.validateAndSetValue(ctrlVal, true);
|
731
|
+
}
|
732
|
+
}
|
733
|
+
return true;
|
734
|
+
}
|
735
|
+
async handleForceExitAfter(rtEvt) {
|
736
|
+
let forceExit = rtEvt.UserEvt.ForceExit;
|
737
|
+
let task = rtEvt.getTask();
|
738
|
+
if (forceExit === ForceExit.PreRecordUpdate) {
|
739
|
+
await this.commitRecord(task, true);
|
740
|
+
if (!task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) && !task.isAborting()) {
|
741
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_AFTER))
|
742
|
+
await task.endTask(true, false, false);
|
743
|
+
}
|
744
|
+
}
|
745
|
+
if (forceExit !== ForceExit.PostRecordUpdate) {
|
746
|
+
task = rtEvt.getTask();
|
747
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
748
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
749
|
+
}
|
750
|
+
let ctrl = LastFocusedManager.getLastFocusedControl();
|
751
|
+
if (ctrl !== null && forceExit !== ForceExit.Editing) {
|
752
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_PREFIX);
|
753
|
+
}
|
754
|
+
if (forceExit === ForceExit.Editing) {
|
755
|
+
let evtCtrl = rtEvt.Control;
|
756
|
+
if (evtCtrl !== null && evtCtrl.getField() !== null)
|
757
|
+
await evtCtrl.getField().updateDisplay();
|
758
|
+
}
|
759
|
+
}
|
760
|
+
async handleEvents_1(handlersTab, rtEvt) {
|
761
|
+
try {
|
762
|
+
this.pushRtEvent(rtEvt);
|
763
|
+
for (let i = 0; i < handlersTab.getSize(); i++) {
|
764
|
+
let handler = handlersTab.getHandler(i);
|
765
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION || handler.isSpecificHandlerOf(rtEvt) || handler.isNonSpecificHandlerOf(rtEvt) || handler.isGlobalHandlerOf(rtEvt)) {
|
766
|
+
await handler.execute(rtEvt, false, false);
|
767
|
+
}
|
768
|
+
}
|
769
|
+
}
|
770
|
+
finally {
|
771
|
+
this.popRtEvent();
|
772
|
+
}
|
773
|
+
}
|
774
|
+
async handleKeyDown(task, ctrl, evt) {
|
775
|
+
let kbdItem = evt.getKbdItmAlways();
|
776
|
+
let keyCode = kbdItem.getKeyCode();
|
777
|
+
this._currKbdItem = kbdItem;
|
778
|
+
if (evt.IgnoreSpecifiedControl) {
|
779
|
+
ctrl = this.getCurrCtrl();
|
780
|
+
task = (((ctrl.getForm().getTask() instanceof Task) ? ctrl.getForm().getTask() : null));
|
781
|
+
if (ctrl.Type !== MgControlType.CTRL_TYPE_TEXT)
|
782
|
+
return;
|
783
|
+
}
|
784
|
+
Logger.Instance.WriteDevToLog('Start handling KEYDOWN event. Key code: ' + keyCode);
|
785
|
+
try {
|
786
|
+
if (this._currKbdItem.equals(this.KBI_DOWN) || this._currKbdItem.equals(this.KBI_UP)) {
|
787
|
+
if (ctrl !== null && (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO))
|
788
|
+
return;
|
789
|
+
}
|
790
|
+
let rtEvt = new RunTimeEvent(task, ctrl);
|
791
|
+
rtEvt.setSystem(this._currKbdItem);
|
792
|
+
rtEvt.setEditParms(evt.getStartSelection(), evt.getEndSelection(), evt.getValue());
|
793
|
+
try {
|
794
|
+
await this.handleEvent(rtEvt, false);
|
795
|
+
}
|
796
|
+
finally {
|
797
|
+
if (this._stopExecution) {
|
798
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
799
|
+
if (returnToCtrl !== null && MgControl.validReturnToCtrl())
|
800
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
801
|
+
}
|
802
|
+
}
|
803
|
+
let mgd = MGDataCollection.Instance.getCurrMGData();
|
804
|
+
if (mgd !== null && !mgd.IsAborting)
|
805
|
+
await this.handleExpressionHandlers();
|
806
|
+
Logger.Instance.WriteDevToLog('End handling KEYDOWN event. Key code: ' + keyCode);
|
807
|
+
if (ctrl !== null && ctrl.IsRepeatable && ctrl === MgControl.ReturnToCtrl) {
|
808
|
+
await ctrl.getForm().bringRecordToPage();
|
809
|
+
}
|
810
|
+
}
|
811
|
+
finally {
|
812
|
+
}
|
813
|
+
}
|
814
|
+
async handleSelection(ctrl, line, val) {
|
815
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_TAB || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_COMBO || ctrl.Type === MgControlType.CTRL_TYPE_LIST) {
|
816
|
+
let checkFocus = (ctrl.Type !== MgControlType.CTRL_TYPE_TAB && ctrl.Type !== MgControlType.CTRL_TYPE_CHECKBOX);
|
817
|
+
let allowSelection = (checkFocus ? (ctrl.getForm().getTask().getLastParkedCtrl() === ctrl) : true);
|
818
|
+
if (!allowSelection || !ctrl.isModifiable() || !await ctrl.IsParkable())
|
819
|
+
await ctrl.restoreOldValue();
|
820
|
+
else {
|
821
|
+
if (ctrl.isChoiceControl())
|
822
|
+
Commands.setGetSuggestedValueOfChoiceControlOnTagData(ctrl, ctrl.IsRepeatable ? line : 0, true);
|
823
|
+
if (ctrl.isDifferentValue(val, ctrl.IsNull, true)) {
|
824
|
+
ctrl.ModifiedByUser = true;
|
825
|
+
await this.handleCtrlModify(ctrl, InternalInterface.MG_ACT_SELECTION);
|
826
|
+
}
|
827
|
+
if (ctrl.isChoiceControl())
|
828
|
+
Commands.setGetSuggestedValueOfChoiceControlOnTagData(ctrl, ctrl.IsRepeatable ? line : 0, false);
|
829
|
+
if (!ctrl.IsMultipleSelectionListBox())
|
830
|
+
await ctrl.validateAndSetValue(val, true);
|
831
|
+
}
|
832
|
+
}
|
833
|
+
}
|
834
|
+
async handleMouseUp(ctrl, line, produceClick) {
|
835
|
+
if (ctrl === null)
|
836
|
+
return;
|
837
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO)
|
838
|
+
RuntimeContextBase.Instance.CurrentClickedRadio = ctrl;
|
839
|
+
try {
|
840
|
+
if (ctrl.Type !== MgControlType.CTRL_TYPE_TABLE) {
|
841
|
+
if (!await ctrl.checkPropWithLine(PropInterface.PROP_TYPE_ENABLED, true, line)) {
|
842
|
+
return;
|
843
|
+
}
|
844
|
+
let canGotoCtrl = this.canGoToControl(ctrl, true);
|
845
|
+
let StopFocus = ctrl.isFocusedStopExecution();
|
846
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
847
|
+
if ((!canGotoCtrl || ((this._stopExecution || StopFocus) && returnToCtrl !== ctrl)) && returnToCtrl !== null) {
|
848
|
+
MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
|
849
|
+
if (returnToCtrl.IsRepeatable)
|
850
|
+
await returnToCtrl.getForm().bringRecordToPage();
|
851
|
+
await FocusManager.SetFocus(returnToCtrl, -1);
|
852
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
853
|
+
}
|
854
|
+
if (this._stopExecution || StopFocus)
|
855
|
+
return;
|
856
|
+
}
|
857
|
+
if (produceClick && (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_LIST)) {
|
858
|
+
let rtEvt = new RunTimeEvent(ctrl);
|
859
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_WEB_CLICK);
|
860
|
+
this.addToTail(rtEvt);
|
861
|
+
}
|
862
|
+
}
|
863
|
+
finally {
|
864
|
+
RuntimeContextBase.Instance.CurrentClickedRadio = null;
|
865
|
+
}
|
866
|
+
}
|
867
|
+
checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt) {
|
868
|
+
if (aRtEvt.getType() == ConstInterface.EVENT_TYPE_INTERNAL && aRtEvt.getInternalCode() ==
|
869
|
+
InternalInterface.MG_ACT_WEBCLIENT_ROUTE && RuntimeContextBase.Instance.RemovedContextFromServer) {
|
870
|
+
this.setLastSavedRouteEvent(aRtEvt);
|
871
|
+
}
|
872
|
+
}
|
873
|
+
async handleFocus(ctrl, line, onClick, shouldHandleZoom) {
|
874
|
+
try {
|
875
|
+
if (ctrl.isStatic())
|
876
|
+
return;
|
877
|
+
if (ctrl !== this._lastFailedFocusedControl && ctrl.HasExpOrParentTaskField()) {
|
878
|
+
if (ctrl.isListBox() || ctrl.isCheckBox() || ctrl.isComboBox() || ctrl.isTextControl() || ctrl.isRadio() || ctrl.isTabControl()) {
|
879
|
+
Logger.Instance.WriteErrorToLog(NString.Format('Control either has expression or has parent task variable attached to it. Failed to park on control with name: {0}', ctrl.Name));
|
880
|
+
FocusManager.SetFocus(LastFocusedManager.Instance.getLastFocusedTask(), LastFocusedManager.getLastFocusedControl(), 0, LastFocusedManager.getLastFocusedControl() === null ? true : false);
|
881
|
+
this._lastFailedFocusedControl = ctrl;
|
882
|
+
return;
|
883
|
+
}
|
884
|
+
}
|
885
|
+
this._lastFailedFocusedControl = null;
|
886
|
+
if (onClick)
|
887
|
+
RuntimeContextBase.Instance.CurrentClickedCtrl = ctrl;
|
888
|
+
let prevCtrl = LastFocusedManager.getLastFocusedControl();
|
889
|
+
if (ctrl === prevCtrl && !ctrl.isRepeatable()) {
|
890
|
+
await ctrl.getForm().bringRecordToPage();
|
891
|
+
await this.HandleZoomIfNeeded(ctrl, line, shouldHandleZoom);
|
892
|
+
let rtEvnt = this.getLastRtEvent();
|
893
|
+
if (rtEvnt != null && rtEvnt.ShouldHandleZoom)
|
894
|
+
FocusManager.SetFocus(ctrl, -1);
|
895
|
+
return;
|
896
|
+
}
|
897
|
+
let prevTask = LastFocusedManager.Instance.getLastFocusedTask();
|
898
|
+
if (ctrl === null || ctrl.Type === MgControlType.CTRL_TYPE_TABLE) {
|
899
|
+
if (prevCtrl === null)
|
900
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
901
|
+
return;
|
902
|
+
}
|
903
|
+
let currTask;
|
904
|
+
if ((ctrl.Type === MgControlType.CTRL_TYPE_BUTTON) && ((await (ctrl.getProp(PropInterface.PROP_TYPE_RAISE_AT)).getValueInt()) === RaiseAt.TaskInFocus))
|
905
|
+
currTask = prevTask;
|
906
|
+
else
|
907
|
+
currTask = ctrl.getForm().getTask();
|
908
|
+
let canGotoCtrl = this.canGoToControl(ctrl, onClick);
|
909
|
+
if (canGotoCtrl) {
|
910
|
+
if (this.guiPendingEvent != null)
|
911
|
+
return;
|
912
|
+
let handled = await this.HandleSubformModality(ctrl, prevTask, currTask);
|
913
|
+
if (handled)
|
914
|
+
return;
|
915
|
+
let eventLine = (ctrl.isRepeatable() || ctrl.isRadio()) ? line : Int32.MinValue;
|
916
|
+
let rtEvt = new RunTimeEvent(ctrl, eventLine);
|
917
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_PREFIX);
|
918
|
+
await this.handleEvent(rtEvt, false);
|
919
|
+
}
|
920
|
+
else if (prevCtrl !== null) {
|
921
|
+
if (!prevCtrl.isModifiable()) {
|
922
|
+
if (prevCtrl.isChoiceControl())
|
923
|
+
await prevCtrl.restoreOldValue();
|
924
|
+
}
|
925
|
+
else if (!currTask.cancelWasRaised()) {
|
926
|
+
let newVal = Manager.GetCtrlVal(prevCtrl);
|
927
|
+
if (!await prevCtrl.validateAndSetValue(newVal, true))
|
928
|
+
this.setStopExecution(true);
|
929
|
+
}
|
930
|
+
MgControl.ReturnToCtrl = prevCtrl;
|
931
|
+
}
|
932
|
+
else
|
933
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
934
|
+
if (!this._stopExecution && MgControl.ReturnToCtrl === ctrl) {
|
935
|
+
LastFocusedManager.setLastFocusedControl(ctrl.getForm().getTask(), ctrl);
|
936
|
+
await this.HandleZoomIfNeeded(ctrl, line, shouldHandleZoom);
|
937
|
+
}
|
938
|
+
return;
|
939
|
+
}
|
940
|
+
finally {
|
941
|
+
ctrl.setFocusedStopExecution(this._stopExecution);
|
942
|
+
if (this._stopExecution) {
|
943
|
+
{
|
944
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
945
|
+
if (returnToCtrl !== null) {
|
946
|
+
MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
|
947
|
+
await FocusManager.SetFocus(returnToCtrl, -1);
|
948
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
949
|
+
}
|
950
|
+
}
|
951
|
+
}
|
952
|
+
}
|
953
|
+
}
|
954
|
+
async HandleSubformModality(ctrl, prevTask, currTask) {
|
955
|
+
let handledSubformModality = false;
|
956
|
+
let length = prevTask.getMGData().getTasksCount();
|
957
|
+
let topTask = prevTask.getMGData().getTask(length - 1);
|
958
|
+
if (currTask == prevTask || prevTask != topTask) {
|
959
|
+
if (topTask != null && prevTask != topTask && topTask.IsSubForm) {
|
960
|
+
let subformCtrl = topTask.getForm().getSubFormCtrl();
|
961
|
+
if (subformCtrl.IsModal())
|
962
|
+
prevTask = topTask;
|
963
|
+
}
|
964
|
+
}
|
965
|
+
if (prevTask != ctrl.getForm().getTask() && prevTask.getIsDestinationCall()) {
|
966
|
+
if (!currTask.isDescendentOf(prevTask)) {
|
967
|
+
let subformCtrl = prevTask.getForm().getSubFormCtrl();
|
968
|
+
if (!subformCtrl.IsModal() && !currTask.getIsDestinationCall())
|
969
|
+
subformCtrl = prevTask.GetSubformModalParentTask();
|
970
|
+
if (subformCtrl != null && (ctrl != subformCtrl) && subformCtrl.IsModal()) {
|
971
|
+
await this.performSubformClose(subformCtrl);
|
972
|
+
if (!this._stopExecution)
|
973
|
+
this.guiPendingEvent = this.getLastRtEvent();
|
974
|
+
handledSubformModality = true;
|
975
|
+
}
|
976
|
+
}
|
977
|
+
}
|
978
|
+
return handledSubformModality;
|
979
|
+
}
|
980
|
+
async handleFocusOnNonMagicControl(ctrl) {
|
981
|
+
try {
|
982
|
+
await EventsManager.Instance.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
983
|
+
}
|
984
|
+
finally {
|
985
|
+
ctrl.setFocusedStopExecution(this._stopExecution);
|
986
|
+
if (this._stopExecution) {
|
987
|
+
{
|
988
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
989
|
+
if (returnToCtrl !== null) {
|
990
|
+
MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
|
991
|
+
await FocusManager.SetFocus(returnToCtrl, -1);
|
992
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
993
|
+
}
|
994
|
+
}
|
995
|
+
}
|
996
|
+
}
|
997
|
+
}
|
998
|
+
async HandleZoomIfNeeded(ctrl, line, shouldHandleZoom) {
|
999
|
+
if (shouldHandleZoom) {
|
1000
|
+
var rtEvt = new RunTimeEvent(ctrl, line, true);
|
1001
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_ZOOM);
|
1002
|
+
await this.handleEvent(rtEvt, false);
|
1003
|
+
}
|
1004
|
+
}
|
1005
|
+
canGoToControl(ctrl, onClick) {
|
1006
|
+
if (onClick && (ctrl.Type === MgControlType.CTRL_TYPE_SUBFORM || ctrl.Type === MgControlType.CTRL_TYPE_BROWSER))
|
1007
|
+
return false;
|
1008
|
+
let canGotoCtrl = true;
|
1009
|
+
let currTask = ctrl.getForm().getTask();
|
1010
|
+
let lastTask = LastFocusedManager.Instance.getLastFocusedTask();
|
1011
|
+
if (!currTask.IsInteractive || (lastTask != null && lastTask.getLastParkedCtrl() != null &&
|
1012
|
+
lastTask.cancelWasRaised()))
|
1013
|
+
return false;
|
1014
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_IMAGE && !ctrl.IsRepeatable)
|
1015
|
+
canGotoCtrl = false;
|
1016
|
+
return canGotoCtrl;
|
1017
|
+
}
|
1018
|
+
async handleTimer(evt) {
|
1019
|
+
evt.setType(ConstInterface.EVENT_TYPE_TIMER);
|
1020
|
+
if (evt.isIdleTimer()) {
|
1021
|
+
await this.handleExpressionHandlers();
|
1022
|
+
await this.handleContextInactivityAlert(evt);
|
1023
|
+
}
|
1024
|
+
else {
|
1025
|
+
let mgd = MGDataCollection.Instance.getMGData(evt.getMgdID());
|
1026
|
+
await this.handleEvents(mgd.getTimerHandlers(), evt);
|
1027
|
+
}
|
1028
|
+
}
|
1029
|
+
async handleContextInactivityAlert(evt) {
|
1030
|
+
let timeNow = Misc.getSystemMilliseconds();
|
1031
|
+
let mgd = evt.getTask().getMGData();
|
1032
|
+
let lastRequestTime = RemoteCommandsProcessor.GetInstance().GetLastRequestTime;
|
1033
|
+
let contextInactivityTimeout = Environment.Instance.getContextInactivityTimeout() / 10;
|
1034
|
+
let contextInactivityWarningTime = Environment.Instance.getContextInactivityWarningTime() / 10;
|
1035
|
+
let idleTime = (timeNow - lastRequestTime) / 1000;
|
1036
|
+
if (contextInactivityTimeout == 0 || contextInactivityWarningTime == 0)
|
1037
|
+
return;
|
1038
|
+
if (EventsManager.userGrantedForContextActivity && idleTime >= (contextInactivityTimeout - contextInactivityWarningTime)) {
|
1039
|
+
let userConfirmation = await GUIManager.Instance.MessageBox(this.confirmationDialogTitle, this.confirmationDialogMsg, Styles.MSGBOX_BUTTON_YES_NO);
|
1040
|
+
if (userConfirmation == Styles.MSGBOX_RESULT_YES) {
|
1041
|
+
let cmd = CommandFactory.CreateContextTimeoutResetEventCommand();
|
1042
|
+
mgd.CmdsToServer.Add(cmd);
|
1043
|
+
await RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.ONLY_COMMANDS);
|
1044
|
+
}
|
1045
|
+
else {
|
1046
|
+
EventsManager.userGrantedForContextActivity = false;
|
1047
|
+
}
|
1048
|
+
}
|
1049
|
+
}
|
1050
|
+
async handleExpressionHandlers() {
|
1051
|
+
let rtEvt = new RunTimeEvent(LastFocusedManager.Instance.getLastFocusedTask(), LastFocusedManager.getLastFocusedControl());
|
1052
|
+
rtEvt.setExpression(null);
|
1053
|
+
rtEvt.setMainPrgCreator(rtEvt.getTask());
|
1054
|
+
for (let i = 0; i < MGDataCollection.Instance.getSize(); i++) {
|
1055
|
+
let mgd = MGDataCollection.Instance.getMGData(i);
|
1056
|
+
if (mgd !== null && !mgd.IsAborting)
|
1057
|
+
await this.handleEvents(mgd.getExpHandlers(), rtEvt);
|
1058
|
+
}
|
1059
|
+
}
|
1060
|
+
handleResize(ctrl, rowsInPage) {
|
1061
|
+
ctrl.getForm().setRowsInPage(rowsInPage);
|
1062
|
+
}
|
1063
|
+
async handleRowDataCurPage(table, desiredTopIndex, sendAll, lastFocusedVal) {
|
1064
|
+
let form = table.getForm();
|
1065
|
+
await form.setRowData(desiredTopIndex, sendAll);
|
1066
|
+
}
|
1067
|
+
async handleTransferDataToGui(ctrl) {
|
1068
|
+
let form = ctrl.getForm();
|
1069
|
+
await form.transferDataToGui();
|
1070
|
+
}
|
1071
|
+
async fetchRecordsAheadFromServer(ctrl) {
|
1072
|
+
let form = ctrl.getForm();
|
1073
|
+
await form.FetchRecordsAheadFromServer();
|
1074
|
+
}
|
1075
|
+
handleEnableEvents(evt, enable) {
|
1076
|
+
evt.getTask().ActionManager.enableList(evt.getActEnableList(), enable, true);
|
1077
|
+
}
|
1078
|
+
async handleCtrlPrefix(evt) {
|
1079
|
+
let task = evt.getTask();
|
1080
|
+
let currClickedCtrl = RuntimeContextBase.Instance.CurrentClickedCtrl;
|
1081
|
+
let form = task.getForm();
|
1082
|
+
let displayLine = evt.getDisplayLine();
|
1083
|
+
let ctrl = evt.Control;
|
1084
|
+
if (form.isLineMode()) {
|
1085
|
+
if (displayLine === Int32.MinValue || ctrl.isRadio())
|
1086
|
+
displayLine = form.DisplayLine;
|
1087
|
+
}
|
1088
|
+
else
|
1089
|
+
displayLine = Int32.MinValue;
|
1090
|
+
let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
|
1091
|
+
if (lastParkedCtrl !== null && lastParkedCtrl.getForm().getTask().getMGData().GetId() === ctrl.getForm().getTask().getMGData().GetId() && lastParkedCtrl.getForm().getTask().getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
1092
|
+
if ((ctrl !== lastParkedCtrl || (ctrl.isRepeatable() && displayLine !== ctrl.getDisplayLine(true))) && !lastParkedCtrl.isInControlSuffix()) {
|
1093
|
+
await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
1094
|
+
if (this._stopExecution) {
|
1095
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.isTabControl()) {
|
1096
|
+
ctrl.resetPrevVal();
|
1097
|
+
await ctrl.RefreshDisplay();
|
1098
|
+
}
|
1099
|
+
return false;
|
1100
|
+
}
|
1101
|
+
}
|
1102
|
+
else
|
1103
|
+
return false;
|
1104
|
+
}
|
1105
|
+
if (task.InCtrlPrefix)
|
1106
|
+
return false;
|
1107
|
+
task.InCtrlPrefix = true;
|
1108
|
+
let prevCtrl = lastParkedCtrl;
|
1109
|
+
if (currClickedCtrl !== null && currClickedCtrl.getForm().getTask().getMgdID() === ctrl.getForm().getTask().getMgdID() && ctrl.onDiffForm(currClickedCtrl))
|
1110
|
+
prevCtrl = currClickedCtrl;
|
1111
|
+
if (prevCtrl !== null && ctrl.onDiffForm(prevCtrl)) {
|
1112
|
+
let prevTask = prevCtrl.getForm().getTask();
|
1113
|
+
await prevTask.execSubformRecSuffix(ctrl.getForm().getTask());
|
1114
|
+
if (this._stopExecution) {
|
1115
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.isTabControl()) {
|
1116
|
+
ctrl.resetPrevVal();
|
1117
|
+
await ctrl.RefreshDisplay();
|
1118
|
+
}
|
1119
|
+
task.InCtrlPrefix = false;
|
1120
|
+
return false;
|
1121
|
+
}
|
1122
|
+
if (ctrl.getForm().getTask().isAborting()) {
|
1123
|
+
task.InCtrlPrefix = false;
|
1124
|
+
return false;
|
1125
|
+
}
|
1126
|
+
await EventsManager.doSyncForSubformParent(task);
|
1127
|
+
}
|
1128
|
+
if (task.DataView.isEmptyDataview())
|
1129
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1130
|
+
else {
|
1131
|
+
task.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
|
1132
|
+
let rtEvt = new RunTimeEvent(ctrl, displayLine);
|
1133
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_REC_PREFIX);
|
1134
|
+
await this.handleEvent(rtEvt, false);
|
1135
|
+
}
|
1136
|
+
if (this.GetStopExecutionFlag()) {
|
1137
|
+
task.InCtrlPrefix = false;
|
1138
|
+
return false;
|
1139
|
+
}
|
1140
|
+
if (!await ctrl.IsParkable() && ctrl !== lastParkedCtrl) {
|
1141
|
+
task.InCtrlPrefix = false;
|
1142
|
+
if (lastParkedCtrl === null || !await lastParkedCtrl.invoke())
|
1143
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
1144
|
+
return false;
|
1145
|
+
}
|
1146
|
+
Logger.Instance.WriteSupportToLog(NString.Format('{0} Entering control: control {1}, row {2}', task.GetTaskDetails(), ctrl.Name, displayLine < 0 ? 0 : displayLine), true);
|
1147
|
+
task.setLevel(Constants.TASK_LEVEL_CONTROL);
|
1148
|
+
ctrl.KeyStrokeOn = false;
|
1149
|
+
ctrl.ModifiedByUser = false;
|
1150
|
+
task.setCurrField(ctrl.getField());
|
1151
|
+
if (ctrl.IsRepeatable)
|
1152
|
+
await form.bringRecordToPage();
|
1153
|
+
if (lastParkedCtrl !== ctrl) {
|
1154
|
+
if ((lastParkedCtrl === null && ctrl.getForm().isSubForm()) || (lastParkedCtrl !== null && (ctrl.getForm().isSubForm() || lastParkedCtrl.getForm().isSubForm()))) {
|
1155
|
+
let lastParkedTask = null;
|
1156
|
+
if (lastParkedCtrl !== null)
|
1157
|
+
lastParkedTask = lastParkedCtrl.getForm().getTask();
|
1158
|
+
if (lastParkedTask !== task) {
|
1159
|
+
let firstTime = true;
|
1160
|
+
let isSonSubform;
|
1161
|
+
let parentTask;
|
1162
|
+
if (lastParkedTask !== null) {
|
1163
|
+
isSonSubform = lastParkedTask.IsSubForm;
|
1164
|
+
for (parentTask = lastParkedTask; parentTask !== null && isSonSubform; parentTask = parentTask.getParent()) {
|
1165
|
+
if (!firstTime) {
|
1166
|
+
isSonSubform = parentTask.IsSubForm;
|
1167
|
+
parentTask.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, false);
|
1168
|
+
parentTask.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
|
1169
|
+
parentTask.enableCreateActs(false);
|
1170
|
+
}
|
1171
|
+
else
|
1172
|
+
firstTime = false;
|
1173
|
+
}
|
1174
|
+
}
|
1175
|
+
isSonSubform = task.IsSubForm;
|
1176
|
+
for (parentTask = task.getParent(); (parentTask !== null) && isSonSubform; parentTask = parentTask.getParent()) {
|
1177
|
+
isSonSubform = parentTask.IsSubForm;
|
1178
|
+
if (parentTask.getEnableZoomHandler())
|
1179
|
+
parentTask.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
1180
|
+
await parentTask.setCreateDeleteActsEnableState();
|
1181
|
+
}
|
1182
|
+
await task.enableModes();
|
1183
|
+
}
|
1184
|
+
}
|
1185
|
+
}
|
1186
|
+
if (task.getEnableZoomHandler() || ctrl.useZoomHandler())
|
1187
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
1188
|
+
if (ctrl.isTextControl() || ctrl.isChoiceControl())
|
1189
|
+
ctrl.SetKeyboardLanguage();
|
1190
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON)
|
1191
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_BUTTON, true);
|
1192
|
+
await task.setCreateDeleteActsEnableState();
|
1193
|
+
let field = ctrl.getField();
|
1194
|
+
if (field !== null && field.NullAllowed && ctrl.isModifiable() && ctrl.Type !== MgControlType.CTRL_TYPE_BUTTON)
|
1195
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_RT_EDT_NULL, true);
|
1196
|
+
return true;
|
1197
|
+
}
|
1198
|
+
async commonHandlerBefore(evt) {
|
1199
|
+
let evtSave = evt;
|
1200
|
+
let task = evt.getTask();
|
1201
|
+
let rec = null;
|
1202
|
+
let prevRec = null;
|
1203
|
+
let val;
|
1204
|
+
let oldDisplayLine = Int32.MinValue;
|
1205
|
+
if (this._stopExecution)
|
1206
|
+
return false;
|
1207
|
+
if (task.isAborting())
|
1208
|
+
return false;
|
1209
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_SYSTEM) {
|
1210
|
+
let actId = this.getMatchingAction(evt.getKbdItm());
|
1211
|
+
if (actId !== 0 && evt.Control !== null) {
|
1212
|
+
evt = new RunTimeEvent(evt, evt);
|
1213
|
+
evt.setInternal(actId);
|
1214
|
+
evt.setArgList(null);
|
1215
|
+
let mgControl = evt.Control;
|
1216
|
+
evtSave.setCtrl(mgControl);
|
1217
|
+
if (mgControl === null)
|
1218
|
+
return false;
|
1219
|
+
}
|
1220
|
+
}
|
1221
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
1222
|
+
let form = task.getForm();
|
1223
|
+
let displayLine = evt.getDisplayLine();
|
1224
|
+
let dv = task.DataView;
|
1225
|
+
rec = dv.getCurrRec();
|
1226
|
+
let ctrl = evt.Control;
|
1227
|
+
let intEvtCode = evt.getInternalCode();
|
1228
|
+
let lastFocusedCtrl = LastFocusedManager.getLastFocusedControl();
|
1229
|
+
switch (intEvtCode) {
|
1230
|
+
case InternalInterface.MG_ACT_ZOOM:
|
1231
|
+
let boolval = await this.selectProg(ctrl);
|
1232
|
+
if (boolval)
|
1233
|
+
return false;
|
1234
|
+
case InternalInterface.MG_ACT_WEB_ON_DBLICK:
|
1235
|
+
break;
|
1236
|
+
case InternalInterface.MG_ACT_CTRL_FOCUS:
|
1237
|
+
await this.handleFocus(ctrl, displayLine, evt.isProduceClick(), evt.ShouldHandleZoom);
|
1238
|
+
return false;
|
1239
|
+
case InternalInterface.MG_ACT_CTRL_FOCUS_ON_NON_MAGIC_CONTROL:
|
1240
|
+
await this.handleFocusOnNonMagicControl(ctrl);
|
1241
|
+
return false;
|
1242
|
+
case InternalInterface.MG_ACT_CTRL_KEYDOWN:
|
1243
|
+
await this.handleKeyDown(task, ctrl, evt);
|
1244
|
+
return false;
|
1245
|
+
case InternalInterface.MG_ACT_CTRL_MOUSEUP:
|
1246
|
+
await this.handleMouseUp(ctrl, displayLine, evt.isProduceClick());
|
1247
|
+
return false;
|
1248
|
+
case InternalInterface.MG_ACT_SELECTION:
|
1249
|
+
await this.onActSelection(ctrl, form, evt);
|
1250
|
+
return false;
|
1251
|
+
case InternalInterface.MG_ACT_TIMER:
|
1252
|
+
await this.handleTimer(evt);
|
1253
|
+
return false;
|
1254
|
+
case InternalInterface.MG_ACT_RESIZE:
|
1255
|
+
this.handleResize(ctrl, displayLine);
|
1256
|
+
return false;
|
1257
|
+
case InternalInterface.MG_ACT_ROW_DATA_CURR_PAGE:
|
1258
|
+
await this.handleRowDataCurPage(ctrl, displayLine, evt.isSendAll(), evt.LastFocusedVal);
|
1259
|
+
return false;
|
1260
|
+
case InternalInterface.MG_ACT_DV_TO_GUI:
|
1261
|
+
await this.handleTransferDataToGui(ctrl);
|
1262
|
+
return false;
|
1263
|
+
case InternalInterface.MG_ACT_FETCH_RECORDS_AHEAD_FROM_SERVER:
|
1264
|
+
await this.fetchRecordsAheadFromServer(ctrl);
|
1265
|
+
break;
|
1266
|
+
case InternalInterface.MG_ACT_ENABLE_EVENTS:
|
1267
|
+
this.handleEnableEvents(evt, true);
|
1268
|
+
return false;
|
1269
|
+
case InternalInterface.MG_ACT_DISABLE_EVENTS:
|
1270
|
+
this.handleEnableEvents(evt, false);
|
1271
|
+
return false;
|
1272
|
+
case InternalInterface.MG_ACT_TASK_PREFIX:
|
1273
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
1274
|
+
break;
|
1275
|
+
case InternalInterface.MG_ACT_TASK_SUFFIX:
|
1276
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
1277
|
+
break;
|
1278
|
+
case InternalInterface.MG_ACT_REC_PREFIX:
|
1279
|
+
if (task.IsSubForm && task.getParent().InCommonHandlerBeforeRP)
|
1280
|
+
return false;
|
1281
|
+
task.setAfterRetry(ConstInterface.RECOVERY_NONE);
|
1282
|
+
task.DataSynced = false;
|
1283
|
+
if (!task.isStarted())
|
1284
|
+
return false;
|
1285
|
+
if (form.getRowsInPage() > Int32.MinValue && displayLine > Int32.MinValue) {
|
1286
|
+
while (!dv.recExists(displayLine) && displayLine > 0) {
|
1287
|
+
displayLine--;
|
1288
|
+
}
|
1289
|
+
if (displayLine >= 0) {
|
1290
|
+
prevRec = dv.getCurrRec();
|
1291
|
+
let oldTaskMode = task.getMode();
|
1292
|
+
let oldRecId = prevRec.getId();
|
1293
|
+
try {
|
1294
|
+
oldDisplayLine = form.DisplayLine;
|
1295
|
+
form.PrevDisplayLine = oldDisplayLine;
|
1296
|
+
await form.setCurrRowByDisplayLine(displayLine, true, false);
|
1297
|
+
if (prevRec != null && !dv.recExistsById(prevRec.getId())) {
|
1298
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_TABLE);
|
1299
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
1300
|
+
}
|
1301
|
+
rec = dv.getCurrRec();
|
1302
|
+
}
|
1303
|
+
catch (e) {
|
1304
|
+
if (e instanceof RecordOutOfDataViewException) {
|
1305
|
+
if (this._stopExecution) {
|
1306
|
+
if (oldTaskMode === Constants.TASK_MODE_CREATE && oldDisplayLine > 0 &&
|
1307
|
+
!dv.recExistsById(oldRecId)) {
|
1308
|
+
let prevLine = form.getPrevLine(oldDisplayLine);
|
1309
|
+
await form.restoreOldDisplayLine(prevLine);
|
1310
|
+
}
|
1311
|
+
else
|
1312
|
+
await form.restoreOldDisplayLine(oldDisplayLine);
|
1313
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
1314
|
+
this.setStopExecution(false);
|
1315
|
+
lastFocusedCtrl = task.getLastParkedCtrl();
|
1316
|
+
task.getLastParkedCtrl();
|
1317
|
+
if (lastFocusedCtrl != null)
|
1318
|
+
await lastFocusedCtrl.invoke();
|
1319
|
+
this.setStopExecution(true);
|
1320
|
+
return false;
|
1321
|
+
}
|
1322
|
+
else
|
1323
|
+
Logger.Instance.WriteDevToLog(e.StackTrace);
|
1324
|
+
}
|
1325
|
+
else
|
1326
|
+
throw e;
|
1327
|
+
}
|
1328
|
+
}
|
1329
|
+
else
|
1330
|
+
throw new ApplicationException('in EventsManager.commonHandlerBefore(): invalid line number: ' +
|
1331
|
+
displayLine);
|
1332
|
+
}
|
1333
|
+
if (rec == null)
|
1334
|
+
throw new ApplicationException('in EventsManager.commonHandlerBefore(): no current record available !');
|
1335
|
+
if (!task.IsInteractive && task.getLevel() === Constants.TASK_LEVEL_TASK)
|
1336
|
+
task.increaseCounter();
|
1337
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_BEFORE)) {
|
1338
|
+
await task.endTask(true, false, false);
|
1339
|
+
return false;
|
1340
|
+
}
|
1341
|
+
if (form.HasTable())
|
1342
|
+
await form.bringRecordToPage();
|
1343
|
+
if (task.getLevel() !== Constants.TASK_LEVEL_TASK)
|
1344
|
+
return false;
|
1345
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
1346
|
+
Logger.Instance.WriteDevToLog('RECORD PREFIX: ' + task.queryTaskPath());
|
1347
|
+
(dv.getCurrRec()).setForceSaveOrg(false);
|
1348
|
+
(dv.getCurrRec()).Synced = false;
|
1349
|
+
dv.saveOriginal();
|
1350
|
+
if (task.IsSubForm && task.PerformParentRecordPrefix) {
|
1351
|
+
let parentTask = task.getParent();
|
1352
|
+
while (parentTask.IsSubForm) {
|
1353
|
+
if (parentTask.getLevel() === Constants.TASK_LEVEL_TASK) {
|
1354
|
+
await this.handleInternalEventWithTask(parentTask, InternalInterface.MG_ACT_REC_PREFIX);
|
1355
|
+
parentTask = parentTask.getParent();
|
1356
|
+
if (this.GetStopExecutionFlag())
|
1357
|
+
break;
|
1358
|
+
}
|
1359
|
+
else
|
1360
|
+
break;
|
1361
|
+
}
|
1362
|
+
}
|
1363
|
+
task.InCommonHandlerBeforeRP = true;
|
1364
|
+
if (await task.CheckRefreshSubTasks())
|
1365
|
+
await dv.computeSubForms();
|
1366
|
+
task.InCommonHandlerBeforeRP = false;
|
1367
|
+
task.setLevel(Constants.TASK_LEVEL_RECORD);
|
1368
|
+
await task.enableRecordActions();
|
1369
|
+
break;
|
1370
|
+
case InternalInterface.MG_ACT_REC_SUFFIX:
|
1371
|
+
let forceSuffix = false;
|
1372
|
+
let isSelectionTable;
|
1373
|
+
task.ConfirmUpdateNo = false;
|
1374
|
+
if (rec == null)
|
1375
|
+
return false;
|
1376
|
+
forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
1377
|
+
if ((rec.Modified || forceSuffix) && rec.getMode() === DataModificationTypes.Delete &&
|
1378
|
+
task.getMode() === Constants.TASK_MODE_DELETE)
|
1379
|
+
return true;
|
1380
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
1381
|
+
return false;
|
1382
|
+
if (task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
1383
|
+
task.setInRecordSuffix(true);
|
1384
|
+
await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
|
1385
|
+
task.setInRecordSuffix(false);
|
1386
|
+
if (this._stopExecution)
|
1387
|
+
return false;
|
1388
|
+
}
|
1389
|
+
await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_SUFFIX);
|
1390
|
+
if (this._stopExecution)
|
1391
|
+
return false;
|
1392
|
+
Logger.Instance.WriteDevToLog('RECORD SUFFIX: ' + task.queryTaskPath());
|
1393
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
1394
|
+
isSelectionTable = await task.checkProp(PropInterface.PROP_TYPE_SELECTION, false);
|
1395
|
+
if (task.getMode() === Constants.TASK_MODE_QUERY && !forceSuffix && !rec.Modified &&
|
1396
|
+
!isSelectionTable)
|
1397
|
+
return false;
|
1398
|
+
if (!rec.Modified && !forceSuffix && (!isSelectionTable || !task.InSelect)) {
|
1399
|
+
if (rec.getMode() === DataModificationTypes.Delete) {
|
1400
|
+
return await this.executeControlVerification(task);
|
1401
|
+
}
|
1402
|
+
return false;
|
1403
|
+
}
|
1404
|
+
if (task.getMode() !== Constants.TASK_MODE_DELETE && rec.Modified) {
|
1405
|
+
if (!await this.updateConfirmed(task))
|
1406
|
+
return false;
|
1407
|
+
}
|
1408
|
+
let stopExecution = !await this.executeControlVerification(task);
|
1409
|
+
if (stopExecution)
|
1410
|
+
return false;
|
1411
|
+
break;
|
1412
|
+
case InternalInterface.MG_ACT_CTRL_PREFIX:
|
1413
|
+
if (await this.handleCtrlPrefix(evt))
|
1414
|
+
return true;
|
1415
|
+
else {
|
1416
|
+
evt.Control.InControl = false;
|
1417
|
+
return false;
|
1418
|
+
}
|
1419
|
+
case InternalInterface.MG_ACT_CANCEL:
|
1420
|
+
Manager.CleanMessagePane(task);
|
1421
|
+
break;
|
1422
|
+
case InternalInterface.MG_ACT_CTRL_SUFFIX:
|
1423
|
+
if (ctrl == null || this.getStopExecutionCtrl() != null)
|
1424
|
+
return false;
|
1425
|
+
if (task.getLevel() !== Constants.TASK_LEVEL_CONTROL)
|
1426
|
+
return false;
|
1427
|
+
if (!ctrl.isSubform()) {
|
1428
|
+
val = Manager.GetCtrlVal(ctrl);
|
1429
|
+
task.CurrentEditingControl = null;
|
1430
|
+
if (!task.cancelWasRaised() &&
|
1431
|
+
(ctrl.Type !== MgControlType.CTRL_TYPE_BROWSER && (!isNullOrUndefined(ctrl._field) && (ctrl._field.getType() === StorageAttribute.DATE || ctrl._field.getType() == StorageAttribute.NUMERIC) || val !== null) && typeof val != 'undefined' &&
|
1432
|
+
!await ctrl.validateAndSetValue(val, true))) {
|
1433
|
+
this.setStopExecution(true);
|
1434
|
+
return false;
|
1435
|
+
}
|
1436
|
+
}
|
1437
|
+
if (!this._stopExecution)
|
1438
|
+
Manager.CleanMessagePane(task);
|
1439
|
+
ctrl.InControl = false;
|
1440
|
+
ctrl.ClipBoardDataExists = false;
|
1441
|
+
ctrl.ValidateControl = true;
|
1442
|
+
ctrl.setInControlSuffix(true);
|
1443
|
+
break;
|
1444
|
+
}
|
1445
|
+
}
|
1446
|
+
return true;
|
1447
|
+
}
|
1448
|
+
async selectProg(ctrl) {
|
1449
|
+
let cmd;
|
1450
|
+
let value;
|
1451
|
+
let mgVal;
|
1452
|
+
let progExecuted = false;
|
1453
|
+
let task = ctrl.getForm().getTask();
|
1454
|
+
if (ctrl.HasSelectProgram()) {
|
1455
|
+
if (ctrl.IsParkable()) {
|
1456
|
+
value = Manager.GetCtrlVal(ctrl);
|
1457
|
+
if (!ctrl.validateAndSetValue(value, false))
|
1458
|
+
this.setStopExecution(true);
|
1459
|
+
else {
|
1460
|
+
let encodedVal = null;
|
1461
|
+
mgVal = await ctrl.getMgValue(value);
|
1462
|
+
var rec = task.DataView.getCurrRec();
|
1463
|
+
encodedVal = rec.getXMLForValue(ctrl.getField().getId(), mgVal);
|
1464
|
+
cmd = CommandFactory.CreateSelectProgramCommand(task.getTaskTag(), null, Int32.MinValue, ctrl.getDitIdx(), encodedVal);
|
1465
|
+
task.getMGData().CmdsToServer.Add(cmd);
|
1466
|
+
let commandsProcessorServer = CommandsProcessorManager.GetCommandsProcessor();
|
1467
|
+
await commandsProcessorServer.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
1468
|
+
progExecuted = true;
|
1469
|
+
}
|
1470
|
+
}
|
1471
|
+
}
|
1472
|
+
return progExecuted;
|
1473
|
+
}
|
1474
|
+
async executeControlVerification(task) {
|
1475
|
+
let table = task.getHandlersTab();
|
1476
|
+
for (let i = 0; i < table.getSize(); i++) {
|
1477
|
+
let handler = table.getHandler(i);
|
1478
|
+
let evt = handler.getEvent();
|
1479
|
+
if (evt.getInternalCode() === InternalInterface.MG_ACT_CTRL_VERIFICATION) {
|
1480
|
+
let control = ((task.getForm() !== null) ? task.getForm().getCtrlByCtrlName(handler.getCtrlName()) : null);
|
1481
|
+
if (!isNullOrUndefined(control)) {
|
1482
|
+
let runTimeEvent = new RunTimeEvent(control);
|
1483
|
+
runTimeEvent.setInternal(InternalInterface.MG_ACT_CTRL_VERIFICATION);
|
1484
|
+
await this.handleEvent(runTimeEvent, false);
|
1485
|
+
if (this._stopExecution) {
|
1486
|
+
LastFocusedManager.setLastFocusedControl(task, control);
|
1487
|
+
this.setStopExecutionCtrl(null);
|
1488
|
+
this.setStopExecutionCtrl(control);
|
1489
|
+
return false;
|
1490
|
+
}
|
1491
|
+
}
|
1492
|
+
}
|
1493
|
+
}
|
1494
|
+
return true;
|
1495
|
+
}
|
1496
|
+
async onActSelection(ctrl, form, evt) {
|
1497
|
+
let displayLine = evt.getDisplayLine();
|
1498
|
+
if (displayLine === Int32.MinValue)
|
1499
|
+
displayLine = form.DisplayLine;
|
1500
|
+
let simulate = ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_BUTTON || (ctrl.Type === MgControlType.CTRL_TYPE_TAB && !evt.isProduceClick());
|
1501
|
+
if (simulate)
|
1502
|
+
await this.simulateSelection(ctrl, evt.getValue(), displayLine, evt.isProduceClick());
|
1503
|
+
else
|
1504
|
+
await this.handleSelection(ctrl, displayLine, evt.getValue());
|
1505
|
+
}
|
1506
|
+
async onSubformClose(task, evt) {
|
1507
|
+
if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 1)) {
|
1508
|
+
let subformCtrl = null;
|
1509
|
+
let closingSubformName = await evt.getArgList().getArgValue(0, StorageAttribute.ALPHA, 0);
|
1510
|
+
if (closingSubformName == null)
|
1511
|
+
return;
|
1512
|
+
for (let parentTask = task; parentTask.getForm() != null && parentTask.getMgdID() === task.getMgdID(); parentTask = parentTask.getParent()) {
|
1513
|
+
subformCtrl = parentTask.getForm().getCtrlByName(closingSubformName.trim(), MgControlType.CTRL_TYPE_SUBFORM);
|
1514
|
+
if (subformCtrl != null) {
|
1515
|
+
let subformTask = subformCtrl.getSubformTask();
|
1516
|
+
if (subformTask != null && !subformTask.IsRoute()) {
|
1517
|
+
{
|
1518
|
+
await this.performSubformClose(subformCtrl);
|
1519
|
+
}
|
1520
|
+
break;
|
1521
|
+
}
|
1522
|
+
}
|
1523
|
+
}
|
1524
|
+
}
|
1525
|
+
}
|
1526
|
+
async performSubformClose(subformCtrl) {
|
1527
|
+
let subformTask = subformCtrl.getSubformTask();
|
1528
|
+
let parentTask = subformCtrl.getForm().getTask();
|
1529
|
+
let mgd = subformTask.getMGData();
|
1530
|
+
this.pushNewExecStacks();
|
1531
|
+
await subformTask.endTask(true, false, false, true);
|
1532
|
+
this.popNewExecStacks();
|
1533
|
+
if (!this._stopExecution) {
|
1534
|
+
parentTask.TaskService.RemoveRecomputes(parentTask);
|
1535
|
+
await subformTask.stop();
|
1536
|
+
subformCtrl.resetSubformTask();
|
1537
|
+
await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
1538
|
+
Commands.addClosesubform(CommandType.CLOSE_SUB_FORM, subformCtrl, subformTask.getTaskTag(), subformCtrl.getName(), subformTask.getForm().buildFormName());
|
1539
|
+
if (subformCtrl.IsModal())
|
1540
|
+
mgd.abort();
|
1541
|
+
}
|
1542
|
+
}
|
1543
|
+
createEventArguments(evt) {
|
1544
|
+
if (evt.getArgList() === null) {
|
1545
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
1546
|
+
switch (evt.getInternalCode()) {
|
1547
|
+
default:
|
1548
|
+
break;
|
1549
|
+
}
|
1550
|
+
}
|
1551
|
+
}
|
1552
|
+
}
|
1553
|
+
async DoTaskLevelRecordSuffix(task, refDoSuffix) {
|
1554
|
+
let shouldReturn = false;
|
1555
|
+
if (task.getLevel() === Constants.TASK_LEVEL_RECORD) {
|
1556
|
+
refDoSuffix.value = false;
|
1557
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
1558
|
+
if (this.GetStopExecutionFlag())
|
1559
|
+
shouldReturn = true;
|
1560
|
+
}
|
1561
|
+
return shouldReturn;
|
1562
|
+
}
|
1563
|
+
async DoTaskLevelRecordPrefix(task) {
|
1564
|
+
if (!this.GetStopExecutionFlag()) {
|
1565
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1566
|
+
}
|
1567
|
+
}
|
1568
|
+
async commonHandler(evt) {
|
1569
|
+
let task = evt.getTask();
|
1570
|
+
let mgData = task.getMGData();
|
1571
|
+
let form = task.getForm();
|
1572
|
+
let ctrl = evt.Control;
|
1573
|
+
let lastParkedCtrl;
|
1574
|
+
let doSuffix = true;
|
1575
|
+
let oldMode;
|
1576
|
+
let server = Task.CommandsProcessor;
|
1577
|
+
if (this._stopExecution)
|
1578
|
+
return;
|
1579
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_USER)
|
1580
|
+
evt = new RunTimeEvent(evt.getUserEvent(), evt);
|
1581
|
+
try {
|
1582
|
+
this.pushRtEvent(evt);
|
1583
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_SYSTEM) {
|
1584
|
+
let actId = this.getMatchingAction(evt.getKbdItm());
|
1585
|
+
if (actId !== 0) {
|
1586
|
+
evt = new RunTimeEvent(evt, evt);
|
1587
|
+
evt.setInternal(actId);
|
1588
|
+
evt.setArgList(null);
|
1589
|
+
}
|
1590
|
+
}
|
1591
|
+
let cmd;
|
1592
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && !evt.isImmediate() && this.ActAllowed(evt.getInternalCode()) && !this._processingTopMostEndTask) {
|
1593
|
+
let cmdsToServer = mgData.CmdsToServer;
|
1594
|
+
let dv = task.DataView;
|
1595
|
+
let rec = dv.getCurrRec();
|
1596
|
+
let intEvtCode = evt.getInternalCode();
|
1597
|
+
switch (intEvtCode) {
|
1598
|
+
case InternalInterface.MG_ACT_SUBFORM_CLOSE:
|
1599
|
+
await this.onSubformClose(task, evt);
|
1600
|
+
break;
|
1601
|
+
case InternalInterface.MG_ACT_BUTTON:
|
1602
|
+
case InternalInterface.MG_ACT_CTRL_HIT:
|
1603
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON &&
|
1604
|
+
(intEvtCode === InternalInterface.MG_ACT_BUTTON || !evt.isGuiTriggeredEvent() || ctrl.isParkable(true))) {
|
1605
|
+
let aRtEvt = new RunTimeEvent(ctrl);
|
1606
|
+
if (ctrl.getRtEvtTask() != null)
|
1607
|
+
aRtEvt.setTask(ctrl.getRtEvtTask());
|
1608
|
+
if (ConstInterface.EVENT_TYPE_NONE !== aRtEvt.getType()) {
|
1609
|
+
if (ctrl.useZoomHandler()) {
|
1610
|
+
let taskToEnable = aRtEvt.getTask();
|
1611
|
+
if (taskToEnable != null)
|
1612
|
+
taskToEnable.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
1613
|
+
}
|
1614
|
+
aRtEvt.setArgList(ctrl.ArgList);
|
1615
|
+
await aRtEvt.setPublicName();
|
1616
|
+
this.addToTail(aRtEvt);
|
1617
|
+
this.checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt);
|
1618
|
+
}
|
1619
|
+
}
|
1620
|
+
else if (ctrl.Type === MgControlType.CTRL_TYPE_TAB) {
|
1621
|
+
this.addInternalEventWithCtrlAndCode(ctrl, InternalInterface.MG_ACT_ZOOM);
|
1622
|
+
}
|
1623
|
+
else if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO) {
|
1624
|
+
ctrl.setControlToFocus();
|
1625
|
+
}
|
1626
|
+
break;
|
1627
|
+
case InternalInterface.MG_ACT_TOGGLE_INSERT:
|
1628
|
+
RuntimeContextBase.Instance.ToggleInsertMode();
|
1629
|
+
break;
|
1630
|
+
case InternalInterface.MG_ACT_CLOSE:
|
1631
|
+
let rtEvt = new RunTimeEvent(evt, evt);
|
1632
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_EXIT);
|
1633
|
+
this.addToTail(rtEvt);
|
1634
|
+
break;
|
1635
|
+
case InternalInterface.MG_ACT_EXIT:
|
1636
|
+
let taskToEnd = (task.isMainProg() ? MGDataCollection.Instance.StartupMgData.getFirstTask() : task);
|
1637
|
+
await taskToEnd.endTask(evt.reversibleExit(), false, evt.ExitDueToError());
|
1638
|
+
break;
|
1639
|
+
case InternalInterface.MG_ACT_EXIT_SYSTEM:
|
1640
|
+
await MGDataCollection.Instance.StartupMgData.getFirstTask().endTask(evt.reversibleExit(), false, false);
|
1641
|
+
break;
|
1642
|
+
case InternalInterface.MG_ACT_TBL_NXTLINE:
|
1643
|
+
if (form != null)
|
1644
|
+
await form.moveInView(Constants.MOVE_UNIT_ROW, Constants.MOVE_DIRECTION_NEXT);
|
1645
|
+
break;
|
1646
|
+
case InternalInterface.MG_ACT_TBL_PRVLINE:
|
1647
|
+
if (form != null)
|
1648
|
+
await form.moveInView(Constants.MOVE_UNIT_ROW, Constants.MOVE_DIRECTION_PREV);
|
1649
|
+
break;
|
1650
|
+
case InternalInterface.MG_ACT_TBL_NXTPAGE:
|
1651
|
+
if (form != null)
|
1652
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_NEXT);
|
1653
|
+
break;
|
1654
|
+
case InternalInterface.MG_ACT_TBL_PRVPAGE:
|
1655
|
+
if (form != null)
|
1656
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_PREV);
|
1657
|
+
break;
|
1658
|
+
case InternalInterface.MG_ACT_TBL_BEGPAGE:
|
1659
|
+
if (form != null)
|
1660
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_BEGIN);
|
1661
|
+
break;
|
1662
|
+
case InternalInterface.MG_ACT_TBL_ENDPAGE:
|
1663
|
+
if (form != null)
|
1664
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_END);
|
1665
|
+
break;
|
1666
|
+
case InternalInterface.MG_ACT_TBL_BEGTBL:
|
1667
|
+
lastParkedCtrl = task.getLastParkedCtrl();
|
1668
|
+
if (lastParkedCtrl == null || !lastParkedCtrl.isListBox()) {
|
1669
|
+
if (form != null)
|
1670
|
+
await form.moveInView(Constants.MOVE_UNIT_TABLE, Constants.MOVE_DIRECTION_BEGIN);
|
1671
|
+
}
|
1672
|
+
break;
|
1673
|
+
case InternalInterface.MG_ACT_TBL_ENDTBL:
|
1674
|
+
lastParkedCtrl = task.getLastParkedCtrl();
|
1675
|
+
if (lastParkedCtrl === null || !lastParkedCtrl.isListBox()) {
|
1676
|
+
if (form != null)
|
1677
|
+
await form.moveInView(Constants.MOVE_UNIT_TABLE, Constants.MOVE_DIRECTION_END);
|
1678
|
+
}
|
1679
|
+
break;
|
1680
|
+
case InternalInterface.MG_ACT_WEB_ON_DBLICK:
|
1681
|
+
{
|
1682
|
+
let ctrlType = ctrl.Type;
|
1683
|
+
let putAction = InternalInterface.MG_ACT_NONE;
|
1684
|
+
if (ctrlType !== MgControlType.CTRL_TYPE_TABLE && ctrlType !== MgControlType.CTRL_TYPE_LABEL &&
|
1685
|
+
ctrlType !== MgControlType.CTRL_TYPE_IMAGE) {
|
1686
|
+
if (ctrl.getForm().getTask().ActionManager.isEnabled(InternalInterface.MG_ACT_SELECT))
|
1687
|
+
putAction = InternalInterface.MG_ACT_SELECT;
|
1688
|
+
else {
|
1689
|
+
if (ctrl.getForm().getTask().ActionManager.isEnabled(InternalInterface.MG_ACT_ZOOM))
|
1690
|
+
putAction = InternalInterface.MG_ACT_ZOOM;
|
1691
|
+
}
|
1692
|
+
if (putAction !== InternalInterface.MG_ACT_NONE)
|
1693
|
+
this.addInternalEventWithCtrlAndCode(ctrl, putAction);
|
1694
|
+
}
|
1695
|
+
}
|
1696
|
+
break;
|
1697
|
+
case InternalInterface.MG_ACT_DELLINE:
|
1698
|
+
if (await this.HandleActionDelline(task, dv, rec, false))
|
1699
|
+
return;
|
1700
|
+
break;
|
1701
|
+
case InternalInterface.MG_ACT_CRELINE:
|
1702
|
+
case InternalInterface.MG_ACT_CRELINE_ABOVE:
|
1703
|
+
if (task.DataView.isEmptyDataview()) {
|
1704
|
+
await this.gotoCreateMode(task);
|
1705
|
+
break;
|
1706
|
+
}
|
1707
|
+
if (task.getInCreateLine())
|
1708
|
+
break;
|
1709
|
+
task.setInCreateLine(true);
|
1710
|
+
try {
|
1711
|
+
if (task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
1712
|
+
await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
|
1713
|
+
if (this.GetStopExecutionFlag())
|
1714
|
+
return;
|
1715
|
+
}
|
1716
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE && rec != null && !rec.Modified) {
|
1717
|
+
if (await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false)) {
|
1718
|
+
doSuffix = false;
|
1719
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
1720
|
+
if (this.GetStopExecutionFlag() || task.isAborting())
|
1721
|
+
return;
|
1722
|
+
}
|
1723
|
+
else {
|
1724
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
1725
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1726
|
+
if (!this.GetStopExecutionFlag() && form != null) {
|
1727
|
+
let lastParkedControl = task.getLastParkedCtrl();
|
1728
|
+
if (lastParkedControl !== null)
|
1729
|
+
await lastParkedControl.invoke();
|
1730
|
+
}
|
1731
|
+
return;
|
1732
|
+
}
|
1733
|
+
}
|
1734
|
+
let refDoSuffix = new RefParam(doSuffix);
|
1735
|
+
if (await this.DoTaskLevelRecordSuffix(task, refDoSuffix))
|
1736
|
+
return;
|
1737
|
+
doSuffix = refDoSuffix.value;
|
1738
|
+
if (form != null) {
|
1739
|
+
if ((task.getMode() !== Constants.TASK_MODE_CREATE) || !task.ConfirmUpdateNo)
|
1740
|
+
await form.addRec(doSuffix, intEvtCode == InternalInterface.MG_ACT_CRELINE_ABOVE ? true : false);
|
1741
|
+
}
|
1742
|
+
await this.DoTaskLevelRecordPrefix(task);
|
1743
|
+
await this.HandleActEnterRowEditing(task);
|
1744
|
+
}
|
1745
|
+
finally {
|
1746
|
+
task.setInCreateLine(false);
|
1747
|
+
}
|
1748
|
+
break;
|
1749
|
+
case InternalInterface.MG_ACT_CANCEL:
|
1750
|
+
await this.HandleActCancel(evt, task, form, ctrl, rec, true);
|
1751
|
+
break;
|
1752
|
+
case InternalInterface.MG_ACT_ENTER_ROW_EDITING:
|
1753
|
+
await this.HandleActEnterRowEditing(task);
|
1754
|
+
break;
|
1755
|
+
case InternalInterface.MG_ACT_RT_QUIT:
|
1756
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_QUIT);
|
1757
|
+
break;
|
1758
|
+
case InternalInterface.MG_ACT_RTO_CREATE:
|
1759
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE ||
|
1760
|
+
await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) {
|
1761
|
+
await this.gotoCreateMode(task);
|
1762
|
+
}
|
1763
|
+
break;
|
1764
|
+
case InternalInterface.MG_ACT_RTO_QUERY:
|
1765
|
+
if (task.getMode() !== Constants.TASK_MODE_QUERY &&
|
1766
|
+
(await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) === false)
|
1767
|
+
break;
|
1768
|
+
await task.enableModes();
|
1769
|
+
oldMode = task.getOriginalTaskMode();
|
1770
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
1771
|
+
if (!this.GetStopExecutionFlag()) {
|
1772
|
+
task.setMode(Constants.TASK_MODE_QUERY);
|
1773
|
+
if (oldMode !== Constants.TASK_MODE_CREATE) {
|
1774
|
+
await dv.currRecCompute(true);
|
1775
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1776
|
+
if (ctrl != null)
|
1777
|
+
await ctrl.invoke();
|
1778
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
1779
|
+
}
|
1780
|
+
else {
|
1781
|
+
task.setPreventRecordSuffix(true);
|
1782
|
+
task.setPreventControlChange(true);
|
1783
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
|
1784
|
+
if (ctrl != null)
|
1785
|
+
await ctrl.invoke();
|
1786
|
+
task.setPreventRecordSuffix(false);
|
1787
|
+
task.setPreventControlChange(false);
|
1788
|
+
if (!dv.isEmpty() && (dv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
|
1789
|
+
task.setMode(Constants.TASK_MODE_QUERY);
|
1790
|
+
else
|
1791
|
+
task.setMode(Constants.TASK_MODE_CREATE);
|
1792
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
1793
|
+
}
|
1794
|
+
task.setOriginalTaskMode(Constants.TASK_MODE_QUERY);
|
1795
|
+
await task.setCreateDeleteActsEnableState();
|
1796
|
+
}
|
1797
|
+
break;
|
1798
|
+
case InternalInterface.MG_ACT_RTO_MODIFY:
|
1799
|
+
if (task.getMode() !== Constants.TASK_MODE_MODIFY &&
|
1800
|
+
(await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) === false)
|
1801
|
+
break;
|
1802
|
+
await task.enableModes();
|
1803
|
+
oldMode = task.getOriginalTaskMode();
|
1804
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
1805
|
+
if (!this.GetStopExecutionFlag()) {
|
1806
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
1807
|
+
if (oldMode !== Constants.TASK_MODE_CREATE) {
|
1808
|
+
await dv.currRecCompute(true);
|
1809
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1810
|
+
if (ctrl != null)
|
1811
|
+
await ctrl.invoke();
|
1812
|
+
}
|
1813
|
+
else {
|
1814
|
+
task.setPreventRecordSuffix(true);
|
1815
|
+
task.setPreventControlChange(true);
|
1816
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
|
1817
|
+
if (ctrl != null)
|
1818
|
+
await ctrl.invoke();
|
1819
|
+
task.setPreventRecordSuffix(false);
|
1820
|
+
task.setPreventControlChange(false);
|
1821
|
+
if (!dv.isEmpty() && (dv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
|
1822
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
1823
|
+
else
|
1824
|
+
task.setMode(Constants.TASK_MODE_CREATE);
|
1825
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
1826
|
+
}
|
1827
|
+
task.setOriginalTaskMode(Constants.TASK_MODE_MODIFY);
|
1828
|
+
await task.setCreateDeleteActsEnableState();
|
1829
|
+
}
|
1830
|
+
break;
|
1831
|
+
case InternalInterface.MG_ACT_SELECT:
|
1832
|
+
try {
|
1833
|
+
task.InSelect = true;
|
1834
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
1835
|
+
}
|
1836
|
+
finally {
|
1837
|
+
task.InSelect = false;
|
1838
|
+
}
|
1839
|
+
if (!this._stopExecution) {
|
1840
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_EXIT);
|
1841
|
+
}
|
1842
|
+
break;
|
1843
|
+
case InternalInterface.MG_ACT_SUBFORM_REFRESH:
|
1844
|
+
if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 1)) {
|
1845
|
+
let subformCtrl = null;
|
1846
|
+
let RefreshedSubformName = await evt.getArgList().getArgValue(0, StorageAttribute.ALPHA, 0);
|
1847
|
+
if (RefreshedSubformName == null)
|
1848
|
+
break;
|
1849
|
+
for (let parentTask = task; parentTask.getForm() != null && parentTask.getMgdID() === task.getMgdID(); parentTask = parentTask.getParent()) {
|
1850
|
+
subformCtrl = parentTask.getForm().getCtrlByName(RefreshedSubformName.trim(), MgControlType.CTRL_TYPE_SUBFORM);
|
1851
|
+
if (subformCtrl != null) {
|
1852
|
+
let subformTask = subformCtrl.getSubformTask();
|
1853
|
+
if (subformTask == null) {
|
1854
|
+
if (await (subformCtrl.getProp(PropInterface.PROP_TYPE_SUBFORM_TYPE)).getValueInt() !== SubformType.None)
|
1855
|
+
await this.OpenSubform(parentTask, subformCtrl);
|
1856
|
+
}
|
1857
|
+
else
|
1858
|
+
await parentTask.SubformRefresh(subformTask, true);
|
1859
|
+
break;
|
1860
|
+
}
|
1861
|
+
}
|
1862
|
+
}
|
1863
|
+
else if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 2)) {
|
1864
|
+
let subformTask = task, parentTask;
|
1865
|
+
let taskTag = await evt.getArgList().getArgValue(1, StorageAttribute.NUMERIC, 0);
|
1866
|
+
while (subformTask.IsSubForm) {
|
1867
|
+
parentTask = subformTask.getParent();
|
1868
|
+
if (subformTask.getTaskTag() === taskTag) {
|
1869
|
+
await parentTask.SubformRefresh(subformTask, true);
|
1870
|
+
break;
|
1871
|
+
}
|
1872
|
+
subformTask = parentTask;
|
1873
|
+
}
|
1874
|
+
}
|
1875
|
+
break;
|
1876
|
+
case InternalInterface.MG_ACT_SUBFORM_OPEN:
|
1877
|
+
await this.OpenSubform(task, evt.Control);
|
1878
|
+
break;
|
1879
|
+
case InternalInterface.MG_ACT_RTO_SEARCH:
|
1880
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
1881
|
+
if (!this.GetStopExecutionFlag()) {
|
1882
|
+
cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), intEvtCode);
|
1883
|
+
task.getTaskCache().clearCache();
|
1884
|
+
await task.DataviewManager.Execute(cmd);
|
1885
|
+
if (!form.isScreenMode()) {
|
1886
|
+
dv.setTopRecIdx(0);
|
1887
|
+
if (form.HasTable()) {
|
1888
|
+
await form.restoreOldDisplayLine(form.recordIdx2DisplayLine(dv.getCurrRecIdx()));
|
1889
|
+
}
|
1890
|
+
}
|
1891
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1892
|
+
if (ctrl != null)
|
1893
|
+
await ctrl.invoke();
|
1894
|
+
}
|
1895
|
+
break;
|
1896
|
+
case InternalInterface.MG_ACT_RT_REFRESH_SCREEN:
|
1897
|
+
case InternalInterface.MG_ACT_RT_REFRESH_VIEW:
|
1898
|
+
case InternalInterface.MG_ACT_RT_REFRESH_RECORD:
|
1899
|
+
await this.handleRefreshEvents(evt);
|
1900
|
+
break;
|
1901
|
+
case InternalInterface.MG_ACT_ACT_CLOSE_APPL:
|
1902
|
+
cmd =
|
1903
|
+
CommandFactory.CreateEventCommand(MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag(), InternalInterface.MG_ACT_BROWSER_ESC);
|
1904
|
+
cmdsToServer.Add(cmd);
|
1905
|
+
await server.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
1906
|
+
break;
|
1907
|
+
case InternalInterface.MG_ACT_CONTEXT_REMOVE:
|
1908
|
+
let currRecord = LastFocusedManager.Instance.getLastFocusedTask().DataView.getCurrRec();
|
1909
|
+
if (ClientManager.TransCacheExists() || (currRecord != null && currRecord.Modified)) {
|
1910
|
+
console.log('Pending transaction/record is modified, discarded \'Context Remove\' event.');
|
1911
|
+
}
|
1912
|
+
else {
|
1913
|
+
if (Environment.Instance.getClientContextInactivityTimeout() > 0) {
|
1914
|
+
await this.ExecuteClientContextInactivityTimer();
|
1915
|
+
}
|
1916
|
+
if (!EventsManager.clientContextInactivityTimerAborted) {
|
1917
|
+
let contextTerminationEventCommand = CommandFactory.CreateContextTerminationEventCommand(MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag());
|
1918
|
+
MGDataCollection.Instance.getCurrMGData().CmdsToServer.Add(contextTerminationEventCommand);
|
1919
|
+
RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.ONLY_COMMANDS);
|
1920
|
+
console.log('Removed context from server');
|
1921
|
+
RuntimeContextBase.Instance.RemovingContextFromServer = true;
|
1922
|
+
}
|
1923
|
+
else {
|
1924
|
+
console.log('Discarded \'Context Remove\' event as user event occurred.');
|
1925
|
+
EventsManager.clientContextInactivityTimerAborted = false;
|
1926
|
+
break;
|
1927
|
+
}
|
1928
|
+
}
|
1929
|
+
break;
|
1930
|
+
case InternalInterface.MG_ACT_SERVER_TERMINATION:
|
1931
|
+
case InternalInterface.MG_ACT_DUMP_ENVIRONMENT:
|
1932
|
+
cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), intEvtCode);
|
1933
|
+
cmdsToServer.Add(cmd);
|
1934
|
+
await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
1935
|
+
break;
|
1936
|
+
case InternalInterface.MG_ACT_RT_EDT_NULL:
|
1937
|
+
if (this._currField != null && this._currField.NullAllowed) {
|
1938
|
+
await this._currField.setValueAndStartRecompute(this._currField.getMagicDefaultValue(), true, true, true, false);
|
1939
|
+
await this._currField.updateDisplay();
|
1940
|
+
}
|
1941
|
+
break;
|
1942
|
+
case InternalInterface.MG_ACT_ROLLBACK:
|
1943
|
+
await EventsManager.HandleRollbackAction(task, cmdsToServer, RollbackEventCommand_RollbackType.ROLLBACK);
|
1944
|
+
break;
|
1945
|
+
case InternalInterface.MG_ACT_OK:
|
1946
|
+
case InternalInterface.MG_ACT_INDEX_CHANGE:
|
1947
|
+
case InternalInterface.MG_ACT_COL_SORT:
|
1948
|
+
if ((intEvtCode === InternalInterface.MG_ACT_INDEX_CHANGE && task.DataviewManager.HasRemoteData) ||
|
1949
|
+
(intEvtCode === InternalInterface.MG_ACT_COL_SORT && ctrl.getField() != null)) {
|
1950
|
+
let lastFocusedTask = LastFocusedManager.Instance.getLastFocusedTask();
|
1951
|
+
let focusedCtrl = LastFocusedManager.getLastFocusedControl(LastFocusedManager.LastFocusMgdID);
|
1952
|
+
if (focusedCtrl != null)
|
1953
|
+
await this.handleInternalEventWithMgControlBase(focusedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
1954
|
+
if (!this.GetStopExecutionFlag())
|
1955
|
+
await task.ExecuteNestedRS(lastFocusedTask);
|
1956
|
+
if (!this.GetStopExecutionFlag() && task.getLevel() !== Constants.TASK_LEVEL_TASK)
|
1957
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
1958
|
+
if (!this.GetStopExecutionFlag()) {
|
1959
|
+
task.getTaskCache().clearCache();
|
1960
|
+
if (intEvtCode === InternalInterface.MG_ACT_INDEX_CHANGE) {
|
1961
|
+
let taskForm = task.getForm();
|
1962
|
+
if (taskForm.HasTable())
|
1963
|
+
form.clearTableColumnSortMark(true);
|
1964
|
+
cmd = await CommandFactory.CreateIndexChangeCommand(task.getTaskTag(), task.DataView.GetCurrentRecId(), evt.getArgList());
|
1965
|
+
}
|
1966
|
+
else {
|
1967
|
+
cmd = CommandFactory.CreateColumnSortCommand(task.getTaskTag(), evt.Direction, ctrl.getDitIdx(), ctrl.getField().getId(), task.DataView.GetCurrentRecId());
|
1968
|
+
}
|
1969
|
+
await task.DataviewManager.Execute(cmd);
|
1970
|
+
dv.setTopRecIdx(0);
|
1971
|
+
await form.restoreOldDisplayLine(0);
|
1972
|
+
if (!(task === LastFocusedManager.Instance.getLastFocusedTask() || !task.pathContains(LastFocusedManager.Instance.getLastFocusedTask()))) {
|
1973
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1974
|
+
if (!this.GetStopExecutionFlag() && !task.getPreventControlChange())
|
1975
|
+
await lastFocusedTask.ExecuteNestedRS(task);
|
1976
|
+
if (!this.GetStopExecutionFlag() && focusedCtrl != null)
|
1977
|
+
await focusedCtrl.invoke();
|
1978
|
+
}
|
1979
|
+
else
|
1980
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
1981
|
+
}
|
1982
|
+
}
|
1983
|
+
break;
|
1984
|
+
case InternalInterface.MG_ACT_COL_CLICK:
|
1985
|
+
if (!this.GetStopExecutionFlag() && evt.isGuiTriggeredEvent() && ctrl.isColumnSortable()) {
|
1986
|
+
let columnChildControl = ctrl.getColumnChildControl();
|
1987
|
+
if (columnChildControl != null) {
|
1988
|
+
let aRtEvt = new RunTimeEvent(columnChildControl, evt.Direction, 0);
|
1989
|
+
aRtEvt.setInternal(InternalInterface.MG_ACT_COL_SORT);
|
1990
|
+
this.addToTail(aRtEvt);
|
1991
|
+
}
|
1992
|
+
}
|
1993
|
+
break;
|
1994
|
+
}
|
1995
|
+
}
|
1996
|
+
}
|
1997
|
+
finally {
|
1998
|
+
this.popRtEvent();
|
1999
|
+
}
|
2000
|
+
}
|
2001
|
+
async HandleActEnterRowEditing(task) {
|
2002
|
+
if (task.getMode() === Constants.TASK_MODE_QUERY)
|
2003
|
+
task.WriteToMessagePane(`Cannot enter Row Editing when in Query Mode.`);
|
2004
|
+
else {
|
2005
|
+
let myform = task.getForm();
|
2006
|
+
await myform.startRowEditing(myform.DisplayLine);
|
2007
|
+
}
|
2008
|
+
}
|
2009
|
+
async HandleStopRowEditing(task) {
|
2010
|
+
let myform = task.getForm();
|
2011
|
+
await myform.stopRowEditing(myform.DisplayLine);
|
2012
|
+
}
|
2013
|
+
async OpenSubform(task, subformControl) {
|
2014
|
+
task.TaskService.RemoveRecomputes(task);
|
2015
|
+
let cmd = CommandFactory.CreateSubformOpenCommand(task.getTaskTag(), subformControl.getDitIdx());
|
2016
|
+
task.getMGData().CmdsToServer.Add(cmd);
|
2017
|
+
await Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
2018
|
+
}
|
2019
|
+
static async HandleRollbackAction(task, cmdsToServer, rollbackType) {
|
2020
|
+
let commandsProcessor = Task.CommandsProcessor;
|
2021
|
+
ClientRefreshCommand.ClientIsInRollbackCommand = true;
|
2022
|
+
task = task.TaskService.GetOwnerTransactionTask(task);
|
2023
|
+
let cmd = CommandFactory.CreateRollbackEventCommand(task.getTaskTag(), rollbackType);
|
2024
|
+
cmdsToServer.Add(cmd);
|
2025
|
+
await commandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
2026
|
+
ClientRefreshCommand.ClientIsInRollbackCommand = false;
|
2027
|
+
}
|
2028
|
+
async HandleActCancel(evt, task, form, ctrl, rec, isMG_ACT_CANCEL) {
|
2029
|
+
if (task.InHandleActCancel)
|
2030
|
+
return;
|
2031
|
+
task.InHandleActCancel = true;
|
2032
|
+
let oldMode = task.getMode();
|
2033
|
+
let saveDisplayLine = task.getForm().DisplayLine;
|
2034
|
+
if (oldMode !== Constants.TASK_MODE_QUERY && !rec.Updated) {
|
2035
|
+
if (isMG_ACT_CANCEL) {
|
2036
|
+
if (rec.Modified || (task.getLastParkedCtrl() !== null && task.getLastParkedCtrl().ModifiedByUser)) {
|
2037
|
+
if (await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_CANCEL, false)) {
|
2038
|
+
let confirmed = await GUIManager.Instance.confirm_bool(MsgInterface.CONFIRM_STR_CANCEL);
|
2039
|
+
if (!confirmed) {
|
2040
|
+
task.InHandleActCancel = false;
|
2041
|
+
return;
|
2042
|
+
}
|
2043
|
+
}
|
2044
|
+
}
|
2045
|
+
}
|
2046
|
+
let oldRecMode = rec.getMode();
|
2047
|
+
if (GuiEnvironment.Environment.GetSpecialCancelOnCreate() && task.getMode() == Constants.TASK_MODE_CREATE
|
2048
|
+
&& task.getOriginalTaskMode() == Constants.TASK_MODE_CREATE) {
|
2049
|
+
let enable = await task.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
|
2050
|
+
if (enable) {
|
2051
|
+
let allowEmptyDataView = await task.checkProp(PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW, true);
|
2052
|
+
if (task.DataView.getSize() == 1 && allowEmptyDataView) {
|
2053
|
+
task.setMode('M');
|
2054
|
+
task.DataView.setEmptyDataview(true);
|
2055
|
+
}
|
2056
|
+
}
|
2057
|
+
}
|
2058
|
+
if (isMG_ACT_CANCEL) {
|
2059
|
+
if (task.isTransactionOnLevel(ConstInterface.TRANS_RECORD_PREFIX) && evt.RollbackInCancel()) {
|
2060
|
+
await EventsManager.HandleRollbackAction(task, task.getMGData().CmdsToServer, RollbackEventCommand_RollbackType.CANCEL);
|
2061
|
+
}
|
2062
|
+
}
|
2063
|
+
await EventsManager.HandleCancelEdit(evt, task, form, rec, oldRecMode);
|
2064
|
+
}
|
2065
|
+
else {
|
2066
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
2067
|
+
let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
|
2068
|
+
if (lastFocusedControl !== null) {
|
2069
|
+
lastFocusedControl.getForm().getTask().setLevel(Constants.TASK_LEVEL_TASK);
|
2070
|
+
}
|
2071
|
+
if (!evt.isQuit()) {
|
2072
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
2073
|
+
await this.HandleParkabilityOnRowChange(task);
|
2074
|
+
}
|
2075
|
+
}
|
2076
|
+
if (evt.isQuit())
|
2077
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_EXIT);
|
2078
|
+
await form.stopRowEditing(saveDisplayLine);
|
2079
|
+
task.InHandleActCancel = false;
|
2080
|
+
}
|
2081
|
+
static async HandleCancelEdit(evt, task, form, rec, oldRecMode) {
|
2082
|
+
if (rec.Synced && oldRecMode === DataModificationTypes.Insert)
|
2083
|
+
rec.setMode(oldRecMode);
|
2084
|
+
if (form !== null) {
|
2085
|
+
if (task.getLastParkedCtrl() !== null)
|
2086
|
+
task.getLastParkedCtrl().resetPrevVal();
|
2087
|
+
await form.cancelEdit(true, evt.isQuit());
|
2088
|
+
}
|
2089
|
+
}
|
2090
|
+
async HandleActionDelline(task, dv, rec, nonInteractiveDelete) {
|
2091
|
+
let lastParkedCtrl;
|
2092
|
+
let myform = task.getForm();
|
2093
|
+
let saveIsRowEditing = myform.getIsRowEditingFromGui(myform.DisplayLine);
|
2094
|
+
let oldRecMode;
|
2095
|
+
if (await task.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true)) {
|
2096
|
+
lastParkedCtrl = task.getLastParkedCtrl();
|
2097
|
+
if (lastParkedCtrl !== null)
|
2098
|
+
await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
2099
|
+
if (!this.GetStopExecutionFlag()) {
|
2100
|
+
oldRecMode = rec.getMode();
|
2101
|
+
rec.clearMode();
|
2102
|
+
rec.setMode(DataModificationTypes.Delete);
|
2103
|
+
if (oldRecMode === DataModificationTypes.Insert)
|
2104
|
+
rec.setSendToServer(false);
|
2105
|
+
if (rec.Modified || await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false)) {
|
2106
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
2107
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
2108
|
+
if (this._stopExecution) {
|
2109
|
+
if (!rec.SendToServer) {
|
2110
|
+
await dv.addCurrToModified();
|
2111
|
+
rec.setSendToServer(true);
|
2112
|
+
}
|
2113
|
+
rec.clearMode();
|
2114
|
+
rec.setMode(oldRecMode);
|
2115
|
+
this.setStopExecution(false);
|
2116
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
2117
|
+
this.setStopExecution(true);
|
2118
|
+
return true;
|
2119
|
+
}
|
2120
|
+
}
|
2121
|
+
rec.setInDeleteProcess(true);
|
2122
|
+
task.setMode(Constants.TASK_MODE_DELETE);
|
2123
|
+
let skipConfirmDialog = nonInteractiveDelete;
|
2124
|
+
if (!skipConfirmDialog) {
|
2125
|
+
if (task.mustConfirmInDeleteMode() || await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE, false)) {
|
2126
|
+
let confirmed = await GUIManager.Instance.confirm_bool(MsgInterface.CONFIRM_STR_DELETE);
|
2127
|
+
if (!confirmed) {
|
2128
|
+
rec.clearMode();
|
2129
|
+
rec.setMode(oldRecMode);
|
2130
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
2131
|
+
if (lastParkedCtrl !== null)
|
2132
|
+
await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_PREFIX);
|
2133
|
+
if (saveIsRowEditing) {
|
2134
|
+
let myform = task.getForm();
|
2135
|
+
await myform.startRowEditing(myform.DisplayLine);
|
2136
|
+
}
|
2137
|
+
return true;
|
2138
|
+
}
|
2139
|
+
}
|
2140
|
+
}
|
2141
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
2142
|
+
rec.setInDeleteProcess(false);
|
2143
|
+
if (this._stopExecution) {
|
2144
|
+
if (!rec.SendToServer) {
|
2145
|
+
await dv.addCurrToModified();
|
2146
|
+
rec.setSendToServer(true);
|
2147
|
+
}
|
2148
|
+
rec.clearMode();
|
2149
|
+
rec.setMode(oldRecMode);
|
2150
|
+
this.setStopExecution(false);
|
2151
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
2152
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
2153
|
+
this.setStopExecution(true);
|
2154
|
+
return true;
|
2155
|
+
}
|
2156
|
+
if (oldRecMode === DataModificationTypes.Insert) {
|
2157
|
+
rec.clearMode();
|
2158
|
+
rec.setMode(oldRecMode);
|
2159
|
+
}
|
2160
|
+
let newCurrRec = dv.getCurrRec();
|
2161
|
+
try {
|
2162
|
+
if (rec !== newCurrRec)
|
2163
|
+
await dv.setCurrRec(rec.getId(), false);
|
2164
|
+
if (!task.isAborting())
|
2165
|
+
await this.delCurrRec(task, false);
|
2166
|
+
}
|
2167
|
+
finally {
|
2168
|
+
if (rec !== newCurrRec) {
|
2169
|
+
await dv.setCurrRec(newCurrRec.getId(), false);
|
2170
|
+
if (dv.getSize() === 1)
|
2171
|
+
task.setMode(Constants.TASK_MODE_CREATE);
|
2172
|
+
}
|
2173
|
+
if (nonInteractiveDelete)
|
2174
|
+
task.setMode(Constants.TASK_MODE_DELETE);
|
2175
|
+
}
|
2176
|
+
}
|
2177
|
+
}
|
2178
|
+
return false;
|
2179
|
+
}
|
2180
|
+
async handleRefreshEvents(evt) {
|
2181
|
+
let task = evt.getTask();
|
2182
|
+
let form = task.getForm();
|
2183
|
+
let dv = task.DataView;
|
2184
|
+
let intEvtCode = evt.getInternalCode();
|
2185
|
+
let cmd = null;
|
2186
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD)
|
2187
|
+
this._isInRecordFlushEvent = true;
|
2188
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW && task.getMode() === Constants.TASK_MODE_CREATE && !await task.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true)) {
|
2189
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_EXIT);
|
2190
|
+
}
|
2191
|
+
else {
|
2192
|
+
await task.ExecuteNestedRS(LastFocusedManager.Instance.getLastFocusedTask());
|
2193
|
+
if (!this.GetStopExecutionFlag()) {
|
2194
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
2195
|
+
}
|
2196
|
+
if (!this.GetStopExecutionFlag() && !task.InEndTask && !task.isAborting()) {
|
2197
|
+
if (intEvtCode !== InternalInterface.MG_ACT_RT_REFRESH_SCREEN) {
|
2198
|
+
let currentRow = 0;
|
2199
|
+
if (!evt.getRefreshType()) {
|
2200
|
+
if (evt.RtViewRefreshUseCurrentRow() && task.IsInteractive) {
|
2201
|
+
currentRow = form.getCurrRecPosInForm();
|
2202
|
+
}
|
2203
|
+
cmd = CommandFactory.CreateInternalRefreshCommand(task.getTaskTag(), intEvtCode, dv.CurrentRecId, currentRow);
|
2204
|
+
}
|
2205
|
+
else {
|
2206
|
+
if (task.IsInteractive)
|
2207
|
+
currentRow = form.getCurrRecPosInForm();
|
2208
|
+
let refetchRecord = true;
|
2209
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD && evt.getArgList() !== null && evt.getArgList().getSize() !== 0) {
|
2210
|
+
let refetchRecStr;
|
2211
|
+
refetchRecStr = await evt.getArgList().getArgValue(0, StorageAttribute.BOOLEAN, 0);
|
2212
|
+
refetchRecord = (isNullOrUndefined(refetchRecStr) || refetchRecStr === '1');
|
2213
|
+
}
|
2214
|
+
if (refetchRecord)
|
2215
|
+
cmd = await CommandFactory.CreateRealRefreshCommand(task.getTaskTag(), intEvtCode, currentRow, evt.getArgList(), dv.CurrentRecId);
|
2216
|
+
}
|
2217
|
+
}
|
2218
|
+
else {
|
2219
|
+
let id;
|
2220
|
+
if (task.getForm() === null)
|
2221
|
+
id = 0;
|
2222
|
+
else if (task.getForm().isScreenMode())
|
2223
|
+
id = (task.DataView.getCurrRec()).getId();
|
2224
|
+
else
|
2225
|
+
id = task.DataView.getRecByIdx(task.DataView.getTopRecIdx()).getId();
|
2226
|
+
cmd = CommandFactory.CreateScreenRefreshCommand(task.getTaskTag(), id, dv.CurrentRecId);
|
2227
|
+
}
|
2228
|
+
if (intEvtCode !== InternalInterface.MG_ACT_RT_REFRESH_SCREEN)
|
2229
|
+
task.getTaskCache().clearCache();
|
2230
|
+
if (cmd !== null)
|
2231
|
+
await task.DataviewManager.Execute(cmd);
|
2232
|
+
this._isInRecordFlushEvent = false;
|
2233
|
+
if (!this.GetStopExecutionFlag() && !task.InEndTask && !task.isAborting()) {
|
2234
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW && !form.isScreenMode()) {
|
2235
|
+
dv.setTopRecIdx(0);
|
2236
|
+
if (form.HasTable()) {
|
2237
|
+
form.clearTableColumnSortMark(true);
|
2238
|
+
await form.restoreOldDisplayLine(form.recordIdx2DisplayLine(dv.getCurrRecIdx()));
|
2239
|
+
}
|
2240
|
+
}
|
2241
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD && task.getMode() !== Constants.TASK_MODE_QUERY && !task.getAfterRetry()) {
|
2242
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE) {
|
2243
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
2244
|
+
(task.DataView.getCurrRec()).setOldRec();
|
2245
|
+
}
|
2246
|
+
await dv.currRecCompute(true);
|
2247
|
+
}
|
2248
|
+
else if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_SCREEN && task.getMode() !== Constants.TASK_MODE_QUERY && !task.getAfterRetry()) {
|
2249
|
+
await dv.currRecCompute(true);
|
2250
|
+
}
|
2251
|
+
this.setIsInViewRefresh(true);
|
2252
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
2253
|
+
if (!this.GetStopExecutionFlag() && !task.getPreventControlChange()) {
|
2254
|
+
if (!(task === LastFocusedManager.Instance.getLastFocusedTask() || !task.pathContains(LastFocusedManager.Instance.getLastFocusedTask())))
|
2255
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
2256
|
+
}
|
2257
|
+
}
|
2258
|
+
}
|
2259
|
+
}
|
2260
|
+
}
|
2261
|
+
async gotoCreateMode(task) {
|
2262
|
+
let cmd;
|
2263
|
+
await task.enableModes();
|
2264
|
+
await task.ExecuteNestedRS(LastFocusedManager.Instance.getLastFocusedTask());
|
2265
|
+
if (!this.GetStopExecutionFlag())
|
2266
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
2267
|
+
if (!this.GetStopExecutionFlag()) {
|
2268
|
+
cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
|
2269
|
+
await task.DataviewManager.Execute(cmd);
|
2270
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
2271
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
2272
|
+
await this.HandleNonParkableControls(task);
|
2273
|
+
await task.setCreateDeleteActsEnableState();
|
2274
|
+
task.setOriginalTaskMode(Constants.TASK_MODE_CREATE);
|
2275
|
+
await this.HandleActEnterRowEditing(task);
|
2276
|
+
}
|
2277
|
+
}
|
2278
|
+
async commonHandlerAfter(evt, rcBefore) {
|
2279
|
+
let task = evt.getTask();
|
2280
|
+
let dv;
|
2281
|
+
let rec = null;
|
2282
|
+
let ctrl;
|
2283
|
+
let recModified = false;
|
2284
|
+
let recModeIsDelete = false;
|
2285
|
+
let forceSuffix;
|
2286
|
+
if (this._stopExecution && evt.getInternalCode() !== InternalInterface.MG_ACT_REC_SUFFIX && evt.getInternalCode() !== InternalInterface.MG_ACT_CTRL_SUFFIX)
|
2287
|
+
return;
|
2288
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
2289
|
+
dv = task.DataView;
|
2290
|
+
rec = dv.getCurrRec();
|
2291
|
+
ctrl = evt.Control;
|
2292
|
+
switch (evt.getInternalCode()) {
|
2293
|
+
case InternalInterface.MG_ACT_REC_PREFIX:
|
2294
|
+
if (rcBefore) {
|
2295
|
+
if (await task.CheckRefreshSubTasks())
|
2296
|
+
await task.doSubformRecPrefixSuffix();
|
2297
|
+
await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_PREFIX);
|
2298
|
+
await task.enableModes();
|
2299
|
+
}
|
2300
|
+
break;
|
2301
|
+
case InternalInterface.MG_ACT_REC_SUFFIX:
|
2302
|
+
task.isFirstRecordCycle(false);
|
2303
|
+
if (task.getPreventRecordSuffix()) {
|
2304
|
+
task.setPreventRecordSuffix(false);
|
2305
|
+
return;
|
2306
|
+
}
|
2307
|
+
task.DoSubformPrefixSuffix = false;
|
2308
|
+
if (this._stopExecution) {
|
2309
|
+
if (rec.getMode() === DataModificationTypes.Delete)
|
2310
|
+
rec.clearMode();
|
2311
|
+
if (task.getLevel() !== Constants.TASK_LEVEL_CONTROL) {
|
2312
|
+
let last = this.getStopExecutionCtrl();
|
2313
|
+
if (last === null)
|
2314
|
+
last = task.getLastParkedCtrl();
|
2315
|
+
this.setStopExecution(false);
|
2316
|
+
this.setStopExecutionCtrl(null);
|
2317
|
+
if (last != null) {
|
2318
|
+
task.setLevel(Constants.TASK_LEVEL_RECORD);
|
2319
|
+
let inCtrlPrefix = task.InCtrlPrefix;
|
2320
|
+
task.InCtrlPrefix = false;
|
2321
|
+
await this.handleInternalEventWithMgControlBase(last, InternalInterface.MG_ACT_CTRL_PREFIX);
|
2322
|
+
task.InCtrlPrefix = inCtrlPrefix;
|
2323
|
+
}
|
2324
|
+
this.setStopExecution(true);
|
2325
|
+
}
|
2326
|
+
return;
|
2327
|
+
}
|
2328
|
+
else {
|
2329
|
+
await this.HandleStopRowEditing(task);
|
2330
|
+
}
|
2331
|
+
if (rec != null) {
|
2332
|
+
recModified = rec.Modified;
|
2333
|
+
if (!this._stopExecution && rec.isCauseInvalidation()) {
|
2334
|
+
task.getForm().invalidateTable();
|
2335
|
+
rec.setCauseInvalidation(false);
|
2336
|
+
}
|
2337
|
+
recModeIsDelete = (rec.getMode() === DataModificationTypes.Delete);
|
2338
|
+
forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
2339
|
+
if (recModeIsDelete && task.getMode() === Constants.TASK_MODE_DELETE ||
|
2340
|
+
!recModeIsDelete && !rec.inDeleteProcess() && (recModified || forceSuffix)) {
|
2341
|
+
rec.setMode(DataModificationTypes.Update);
|
2342
|
+
await dv.addCurrToModified();
|
2343
|
+
dv.setChanged(true);
|
2344
|
+
if (recModified && task.getMode() === Constants.TASK_MODE_QUERY) {
|
2345
|
+
if (rec.realModified() &&
|
2346
|
+
!Environment.Instance.allowUpdateInQueryMode(task.getCompIdx())) {
|
2347
|
+
await dv.cancelEdit(EventsManager.REAL_ONLY, false);
|
2348
|
+
task.WriteToMessagePanebyMsgId(MsgInterface.RT_STR_UPDATE_IN_QUERY);
|
2349
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
2350
|
+
}
|
2351
|
+
}
|
2352
|
+
}
|
2353
|
+
if (!this.isForceExitPreRecordUpdate(task) &&
|
2354
|
+
(!task.isAborting() || MGDataCollection.Instance.GetTaskByID(task.getTaskTag()) != null)) {
|
2355
|
+
if ((!recModeIsDelete || task.getMode() === Constants.TASK_MODE_DELETE))
|
2356
|
+
await this.commitRecord(task, evt.reversibleExit());
|
2357
|
+
}
|
2358
|
+
if (!task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) && !task.isAborting()) {
|
2359
|
+
if ((rec.getMode() === DataModificationTypes.Delete &&
|
2360
|
+
task.getMode() === Constants.TASK_MODE_DELETE) ||
|
2361
|
+
rec.getMode() !== DataModificationTypes.Delete)
|
2362
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_AFTER))
|
2363
|
+
await task.endTask(true, false, false);
|
2364
|
+
}
|
2365
|
+
}
|
2366
|
+
break;
|
2367
|
+
case InternalInterface.MG_ACT_CTRL_PREFIX:
|
2368
|
+
if (rcBefore) {
|
2369
|
+
if (await ctrl.IsParkable() || ctrl === LastFocusedManager.getLastFocusedControl()) {
|
2370
|
+
ctrl.InControl = true;
|
2371
|
+
if (ctrl.ShouldRefreshOnControlEnter())
|
2372
|
+
await ctrl.getField().updateDisplay();
|
2373
|
+
task.setLastParkedCtrl(ctrl);
|
2374
|
+
RuntimeContextBase.Instance.CurrentClickedCtrl = null;
|
2375
|
+
await ctrl.SetFocus(ctrl, ctrl.getDisplayLine(false), true);
|
2376
|
+
this.setStopExecutionCtrl(null);
|
2377
|
+
MgControl.ReturnToCtrl = ctrl;
|
2378
|
+
task.InCtrlPrefix = false;
|
2379
|
+
}
|
2380
|
+
else {
|
2381
|
+
task.InCtrlPrefix = false;
|
2382
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
2383
|
+
}
|
2384
|
+
}
|
2385
|
+
break;
|
2386
|
+
case InternalInterface.MG_ACT_CTRL_SUFFIX:
|
2387
|
+
if (!this.GetStopExecutionFlag()) {
|
2388
|
+
if (ctrl.isChoiceControl()) {
|
2389
|
+
ctrl.SetKeyboardLanguage();
|
2390
|
+
}
|
2391
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON)
|
2392
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_BUTTON, false);
|
2393
|
+
if (task.getEnableZoomHandler() || ctrl.useZoomHandler())
|
2394
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, false);
|
2395
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_RT_EDT_NULL, false);
|
2396
|
+
}
|
2397
|
+
if (rcBefore) {
|
2398
|
+
if (this.GetStopExecutionFlag()) {
|
2399
|
+
ctrl.InControl = true;
|
2400
|
+
return;
|
2401
|
+
}
|
2402
|
+
let fld = ctrl.getField();
|
2403
|
+
if (fld != null && (ctrl.Type === MgControlType.CTRL_TYPE_TEXT))
|
2404
|
+
await fld.updateDisplay();
|
2405
|
+
task.setLevel(Constants.TASK_LEVEL_RECORD);
|
2406
|
+
ctrl.setInControlSuffix(false);
|
2407
|
+
ctrl.IsInteractiveUpdate = false;
|
2408
|
+
if (ctrl.PropertyExists(PropInterface.PROP_TYPE_CUSTOM_VALIDATORS))
|
2409
|
+
await ctrl.getProp(PropInterface.PROP_TYPE_CUSTOM_VALIDATORS).RefreshDisplay(true);
|
2410
|
+
ctrl.ValidateControl = false;
|
2411
|
+
LastFocusedManager.setLastFocusedControl(task, null);
|
2412
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE))
|
2413
|
+
await task.endTask(true, false, false);
|
2414
|
+
}
|
2415
|
+
break;
|
2416
|
+
case InternalInterface.MG_ACT_TASK_PREFIX:
|
2417
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
2418
|
+
break;
|
2419
|
+
case InternalInterface.MG_ACT_TASK_SUFFIX:
|
2420
|
+
task.setLevel(Constants.TASK_LEVEL_NONE);
|
2421
|
+
break;
|
2422
|
+
case InternalInterface.MG_ACT_CYCLE_NEXT_REC:
|
2423
|
+
let form = task.getForm();
|
2424
|
+
if (!task.isMainProg() && form != null) {
|
2425
|
+
await form.moveInView(form.isLineMode()
|
2426
|
+
? Constants.MOVE_UNIT_ROW
|
2427
|
+
: Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_NEXT);
|
2428
|
+
if (task.getExecEndTask())
|
2429
|
+
await task.endTask(true, false, false);
|
2430
|
+
}
|
2431
|
+
break;
|
2432
|
+
case InternalInterface.MG_ACT_CYCLE_NEXT_DELETE_REC:
|
2433
|
+
if (task.DataView.isEmptyDataview())
|
2434
|
+
(task).setExecEndTask();
|
2435
|
+
else
|
2436
|
+
await this.HandleActionDelline(task, dv, rec, true);
|
2437
|
+
if (task.getExecEndTask())
|
2438
|
+
await task.endTask(true, false, false);
|
2439
|
+
break;
|
2440
|
+
case InternalInterface.MG_ACT_SET_EXTERNAL_VALUE:
|
2441
|
+
let refreshDisplay = await evt.getArgList().getArgValue(1, StorageAttribute.BOOLEAN, 0) === '1' ? true : false;
|
2442
|
+
await ctrl.validateAndSetValueIfAllowed(evt.getValue(), refreshDisplay);
|
2443
|
+
break;
|
2444
|
+
}
|
2445
|
+
}
|
2446
|
+
}
|
2447
|
+
async handleNonReversibleEvent(task, eventCode) {
|
2448
|
+
let rtEvt = new RunTimeEvent(task);
|
2449
|
+
let exitCommand = (eventCode === InternalInterface.MG_ACT_EXIT || eventCode === InternalInterface.MG_ACT_CLOSE);
|
2450
|
+
rtEvt.setInternal(eventCode);
|
2451
|
+
if (exitCommand)
|
2452
|
+
this._isNonReversibleExit = true;
|
2453
|
+
try {
|
2454
|
+
rtEvt.setNonReversibleExit();
|
2455
|
+
rtEvt.setCtrl(task.getLastParkedCtrl());
|
2456
|
+
rtEvt.setArgList(null);
|
2457
|
+
await this.handleEvent(rtEvt, false);
|
2458
|
+
}
|
2459
|
+
finally {
|
2460
|
+
if (exitCommand)
|
2461
|
+
this._isNonReversibleExit = false;
|
2462
|
+
}
|
2463
|
+
}
|
2464
|
+
async handleInternalEventWithTaskAndEventSubtype(task, eventCode, eventSubType) {
|
2465
|
+
let lastParkedCtrl = task.getLastParkedCtrl();
|
2466
|
+
let rtEvt;
|
2467
|
+
if (eventCode < InternalInterface.MG_ACT_TOT_CNT && task != null && !(eventSubType === EventSubType.CancelIsQuit) && !task.ActionManager.isEnabled(eventCode))
|
2468
|
+
return;
|
2469
|
+
if (lastParkedCtrl !== null)
|
2470
|
+
await this.handleInternalEventWithMgControl(lastParkedCtrl, eventCode, eventSubType);
|
2471
|
+
else {
|
2472
|
+
if (eventCode === InternalInterface.MG_ACT_RT_QUIT)
|
2473
|
+
await this.handleInternalEventWithTaskAndEventSubtype(task, InternalInterface.MG_ACT_CANCEL, EventSubType.CancelIsQuit);
|
2474
|
+
else {
|
2475
|
+
rtEvt = new RunTimeEvent(task);
|
2476
|
+
rtEvt.setInternal(eventCode);
|
2477
|
+
rtEvt.SetEventSubType(eventSubType);
|
2478
|
+
if (InternalInterface.BuiltinEvent(eventCode))
|
2479
|
+
await this.handleEvent(rtEvt, false);
|
2480
|
+
else
|
2481
|
+
await this.commonHandler(rtEvt);
|
2482
|
+
}
|
2483
|
+
}
|
2484
|
+
}
|
2485
|
+
async handleInternalEventWithMgControl(ctrl, eventCode, eventSubType) {
|
2486
|
+
let rtEvt;
|
2487
|
+
if (eventCode === InternalInterface.MG_ACT_RT_QUIT)
|
2488
|
+
await this.handleInternalEventWithMgControl(ctrl, InternalInterface.MG_ACT_CANCEL, EventSubType.CancelIsQuit);
|
2489
|
+
else {
|
2490
|
+
rtEvt = new RunTimeEvent(ctrl);
|
2491
|
+
rtEvt.setInternal(eventCode);
|
2492
|
+
rtEvt.SetEventSubType(eventSubType);
|
2493
|
+
if (eventCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW)
|
2494
|
+
rtEvt.setIsRealRefresh(false);
|
2495
|
+
if (InternalInterface.BuiltinEvent(eventCode))
|
2496
|
+
await this.handleEvent(rtEvt, false);
|
2497
|
+
else
|
2498
|
+
await this.commonHandler(rtEvt);
|
2499
|
+
}
|
2500
|
+
}
|
2501
|
+
getCurrField() {
|
2502
|
+
return this._currField;
|
2503
|
+
}
|
2504
|
+
getCurrCtrl() {
|
2505
|
+
return this._currCtrl;
|
2506
|
+
}
|
2507
|
+
getCurrTask() {
|
2508
|
+
if (this._currField == null)
|
2509
|
+
return null;
|
2510
|
+
return this._currField.getTask();
|
2511
|
+
}
|
2512
|
+
setStopExecution(stop, clearEventsOnStopExecution) {
|
2513
|
+
if (arguments.length === 1)
|
2514
|
+
this.setStopExecution_0(stop);
|
2515
|
+
else
|
2516
|
+
this.setStopExecution_1(stop, clearEventsOnStopExecution);
|
2517
|
+
}
|
2518
|
+
setStopExecution_0(stop) {
|
2519
|
+
this.setStopExecution(stop, ClearEventsOnStopExecution.ALL);
|
2520
|
+
}
|
2521
|
+
setStopExecution_1(stop, clearEventsOnStopExecution) {
|
2522
|
+
if (stop)
|
2523
|
+
if (clearEventsOnStopExecution == ClearEventsOnStopExecution.ALL)
|
2524
|
+
this._eventsQueue.clear();
|
2525
|
+
else if (clearEventsOnStopExecution == ClearEventsOnStopExecution.SERVER) {
|
2526
|
+
let tmpVec = new List();
|
2527
|
+
let rtEvt;
|
2528
|
+
let i;
|
2529
|
+
while (!this._eventsQueue.isEmpty()) {
|
2530
|
+
rtEvt = this._eventsQueue.poll();
|
2531
|
+
if (rtEvt.isFromServer()) {
|
2532
|
+
rtEvt.resetFromServer();
|
2533
|
+
tmpVec.push(rtEvt);
|
2534
|
+
}
|
2535
|
+
}
|
2536
|
+
for (i = 0; i < tmpVec.length; i++)
|
2537
|
+
this._eventsQueue.put(tmpVec.get_Item(i));
|
2538
|
+
}
|
2539
|
+
this._stopExecution = stop;
|
2540
|
+
}
|
2541
|
+
setStopExecutionCtrl(ctrl) {
|
2542
|
+
if (this._stopExecutionCtrl === null || ctrl === null)
|
2543
|
+
this._stopExecutionCtrl = ctrl;
|
2544
|
+
}
|
2545
|
+
async delCurrRec(task, inForceDel) {
|
2546
|
+
let dv = task.DataView;
|
2547
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
2548
|
+
await task.getForm().delCurrRec();
|
2549
|
+
if (!task.DataView.isEmptyDataview()) {
|
2550
|
+
if (dv.getCurrRecIdx() >= 0) {
|
2551
|
+
if ((dv.getCurrRec()).getMode() !== DataModificationTypes.Delete && !inForceDel) {
|
2552
|
+
let ctrl = task.getLastParkedCtrl();
|
2553
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
2554
|
+
if (!this.GetStopExecutionFlag())
|
2555
|
+
if (ctrl === null)
|
2556
|
+
await this.HandleNonParkableControls(task);
|
2557
|
+
else
|
2558
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_PREFIX);
|
2559
|
+
}
|
2560
|
+
}
|
2561
|
+
else if (!task.getInCreateLine())
|
2562
|
+
await this.handleNonReversibleEvent(task, InternalInterface.MG_ACT_EXIT);
|
2563
|
+
}
|
2564
|
+
else {
|
2565
|
+
await this.HandleNonParkableControls(task);
|
2566
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
2567
|
+
}
|
2568
|
+
}
|
2569
|
+
async updateConfirmed(task) {
|
2570
|
+
let confirm;
|
2571
|
+
let answer;
|
2572
|
+
let ans;
|
2573
|
+
if (task == null)
|
2574
|
+
return false;
|
2575
|
+
confirm = await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE, false);
|
2576
|
+
if (!this._isInRecordFlushEvent && confirm && !task.DataSynced) {
|
2577
|
+
ans = await GUIManager.Instance.confirm(MsgInterface.CRF_STR_CONF_UPD, Styles.MSGBOX_ICON_QUESTION | Styles.MSGBOX_BUTTON_YES_NO_CANCEL);
|
2578
|
+
if (ans === Styles.MSGBOX_RESULT_YES)
|
2579
|
+
answer = 'Y';
|
2580
|
+
else if (ans === Styles.MSGBOX_RESULT_NO)
|
2581
|
+
answer = 'N';
|
2582
|
+
else
|
2583
|
+
answer = 'C';
|
2584
|
+
}
|
2585
|
+
else
|
2586
|
+
answer = 'Y';
|
2587
|
+
switch (answer) {
|
2588
|
+
case 'Y':
|
2589
|
+
break;
|
2590
|
+
case 'N':
|
2591
|
+
await task.getForm().cancelEdit(false, false);
|
2592
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
2593
|
+
task.ConfirmUpdateNo = true;
|
2594
|
+
return false;
|
2595
|
+
case 'C':
|
2596
|
+
this.setStopExecution(true);
|
2597
|
+
this.setStopExecutionCtrl(LastFocusedManager.getLastFocusedControl());
|
2598
|
+
await FocusManager.SetFocus(LastFocusedManager.getLastFocusedControl(), -1);
|
2599
|
+
return false;
|
2600
|
+
default:
|
2601
|
+
Logger.Instance.WriteExceptionToLogWithMsg('in ClientManager.Instance.updateConfirmed() illegal confirmation code: ' +
|
2602
|
+
confirm);
|
2603
|
+
break;
|
2604
|
+
}
|
2605
|
+
return true;
|
2606
|
+
}
|
2607
|
+
setCompMainPrgTab(compMainPrgTable) {
|
2608
|
+
this._compMainPrgTab = compMainPrgTable;
|
2609
|
+
}
|
2610
|
+
setEndOfWork(endOfWork_) {
|
2611
|
+
this._endOfWork = endOfWork_;
|
2612
|
+
}
|
2613
|
+
getEndOfWork() {
|
2614
|
+
return this._endOfWork;
|
2615
|
+
}
|
2616
|
+
getCompMainPrgTab() {
|
2617
|
+
return this._compMainPrgTab;
|
2618
|
+
}
|
2619
|
+
inNonReversibleExit() {
|
2620
|
+
return this._isNonReversibleExit;
|
2621
|
+
}
|
2622
|
+
pushRtEvent(rtEvt) {
|
2623
|
+
this._rtEvents.push(rtEvt);
|
2624
|
+
}
|
2625
|
+
popRtEvent() {
|
2626
|
+
if (this._rtEvents.count() === 0)
|
2627
|
+
return null;
|
2628
|
+
return this._rtEvents.pop();
|
2629
|
+
}
|
2630
|
+
storeLastSavedRouteEventOnLocalStorage() {
|
2631
|
+
let dataStorage = window.localStorage;
|
2632
|
+
if (this.getLastSavedRouteEvent() != null) {
|
2633
|
+
let rtEvt = this.getLastSavedRouteEvent();
|
2634
|
+
dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT, '1');
|
2635
|
+
dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT_SRC_TSK, JSON.stringify(rtEvt.getTask().TaskDefinitionId));
|
2636
|
+
if (rtEvt.getArgList().getSize() > 0) {
|
2637
|
+
let str = new StringBuilder();
|
2638
|
+
rtEvt.getArgList().buildXML(str);
|
2639
|
+
dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT_ARG_LIST, str.toString());
|
2640
|
+
}
|
2641
|
+
}
|
2642
|
+
}
|
2643
|
+
restoreLastSavedRouteEventFromLocalStorage() {
|
2644
|
+
let dataStorage = window.localStorage;
|
2645
|
+
let lastRouteEvent = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT);
|
2646
|
+
if (lastRouteEvent === '1') {
|
2647
|
+
let srcTaskDefinitionStr = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT_SRC_TSK);
|
2648
|
+
let routeArgListStr = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT_ARG_LIST);
|
2649
|
+
let taskDefinitionId = new TaskDefinitionId();
|
2650
|
+
taskDefinitionId.fromJSON(srcTaskDefinitionStr);
|
2651
|
+
let srcTask = MGDataCollection.Instance.getCurrMGData().getTaskByTaskDefinitionID(taskDefinitionId);
|
2652
|
+
let args = null;
|
2653
|
+
if (routeArgListStr != null) {
|
2654
|
+
args = new ArgumentsList();
|
2655
|
+
args.fillList(routeArgListStr, srcTask);
|
2656
|
+
}
|
2657
|
+
EventsManager.Instance.AddLastSavedRouteEvent(srcTask, args);
|
2658
|
+
}
|
2659
|
+
}
|
2660
|
+
getLastSavedRouteEvent() {
|
2661
|
+
return this.lastSavedRouteEvent;
|
2662
|
+
}
|
2663
|
+
setLastSavedRouteEvent(rtEvt) {
|
2664
|
+
if (rtEvt == null)
|
2665
|
+
this.lastSavedRouteEvent = null;
|
2666
|
+
else
|
2667
|
+
this.lastSavedRouteEvent = rtEvt.replicate();
|
2668
|
+
}
|
2669
|
+
getLastRtEvent() {
|
2670
|
+
if (this._rtEvents.count() === 0)
|
2671
|
+
return null;
|
2672
|
+
return this._rtEvents.peek();
|
2673
|
+
}
|
2674
|
+
setIgnoreUnknownAbort(val) {
|
2675
|
+
this._ignoreUnknownAbort = val;
|
2676
|
+
}
|
2677
|
+
ignoreUnknownAbort() {
|
2678
|
+
return this._ignoreUnknownAbort;
|
2679
|
+
}
|
2680
|
+
async failTaskOverlay(taskId, mgd) {
|
2681
|
+
let cmd;
|
2682
|
+
if (taskId !== null) {
|
2683
|
+
this.setIgnoreUnknownAbort(true);
|
2684
|
+
try {
|
2685
|
+
cmd = CommandFactory.CreateNonReversibleExitCommand(taskId, false);
|
2686
|
+
mgd.CmdsToServer.Add(cmd);
|
2687
|
+
await RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
2688
|
+
}
|
2689
|
+
finally {
|
2690
|
+
this.setIgnoreUnknownAbort(false);
|
2691
|
+
}
|
2692
|
+
}
|
2693
|
+
}
|
2694
|
+
isEventScopeTrans() {
|
2695
|
+
return this._eventScope === EventScope.TRANS;
|
2696
|
+
}
|
2697
|
+
setEventScopeTrans() {
|
2698
|
+
this._eventScope = EventScope.TRANS;
|
2699
|
+
}
|
2700
|
+
clearEventScope() {
|
2701
|
+
this._eventScope = EventScope.NONE;
|
2702
|
+
}
|
2703
|
+
GetEventTime() {
|
2704
|
+
return this._eventsQueue.GetTime();
|
2705
|
+
}
|
2706
|
+
getMatchingAction(kbItm) {
|
2707
|
+
let act = 0;
|
2708
|
+
if (kbItm == null)
|
2709
|
+
return act;
|
2710
|
+
if (act === 0) {
|
2711
|
+
if (kbItm.getAction() !== 0)
|
2712
|
+
act = kbItm.getAction();
|
2713
|
+
else if (kbItm.getKeyCode() === 45 && kbItm.getModifier() === Modifiers.MODIFIER_NONE && kbItm.getStates() === 0)
|
2714
|
+
act = InternalInterface.MG_ACT_TOGGLE_INSERT;
|
2715
|
+
}
|
2716
|
+
return (act);
|
2717
|
+
}
|
2718
|
+
getExecStack() {
|
2719
|
+
return this._execStack.peek();
|
2720
|
+
}
|
2721
|
+
pushExecStack(taskId, handlerId, operIdx) {
|
2722
|
+
this._execStack.peek().push(MGDataCollection.Instance.getTaskIdById(taskId), handlerId, operIdx);
|
2723
|
+
}
|
2724
|
+
popExecStack() {
|
2725
|
+
return this._execStack.peek().pop();
|
2726
|
+
}
|
2727
|
+
pushNewExecStacks() {
|
2728
|
+
this._serverExecStack.push(null);
|
2729
|
+
this._execStack.push(new ExecutionStack());
|
2730
|
+
}
|
2731
|
+
popNewExecStacks() {
|
2732
|
+
this._serverExecStack.pop();
|
2733
|
+
this._execStack.pop();
|
2734
|
+
}
|
2735
|
+
pushServerExecStack(taskId, handlerId, operIdx) {
|
2736
|
+
if (this._serverExecStack.peek() === null) {
|
2737
|
+
this._serverExecStack.pop();
|
2738
|
+
this._serverExecStack.push(new ExecutionStack());
|
2739
|
+
}
|
2740
|
+
this._serverExecStack.peek().push(taskId, handlerId, operIdx);
|
2741
|
+
}
|
2742
|
+
clearServerExecStack() {
|
2743
|
+
if (this._serverExecStack.peek() !== null) {
|
2744
|
+
this._serverExecStack.peek().clear();
|
2745
|
+
}
|
2746
|
+
}
|
2747
|
+
reverseServerExecStack() {
|
2748
|
+
if (this._serverExecStack.peek() !== null)
|
2749
|
+
this._serverExecStack.peek().reverse();
|
2750
|
+
}
|
2751
|
+
getNextOperIdx(oper, clearWhenFound) {
|
2752
|
+
let tmpServerExecStackEntry = null;
|
2753
|
+
let nextOperIdx = -1;
|
2754
|
+
if (this._serverExecStack.count() !== 0 && this._serverExecStack.peek() !== null && !this._serverExecStack.peek().empty()) {
|
2755
|
+
if (this._serverExecStack.peek().size() > this._execStack.peek().size()) {
|
2756
|
+
let tmpServerExecStack = new ExecutionStack(this._serverExecStack.peek());
|
2757
|
+
while (tmpServerExecStack.size() > this._execStack.peek().size()) {
|
2758
|
+
tmpServerExecStackEntry = tmpServerExecStack.pop();
|
2759
|
+
}
|
2760
|
+
if (this._execStack.peek().Equals(tmpServerExecStack) && tmpServerExecStackEntry.TaskId === oper.getTaskTag() && tmpServerExecStackEntry.HandlerId === oper.getHandlerId() && tmpServerExecStackEntry.OperIdx >= oper.getServerId()) {
|
2761
|
+
nextOperIdx = tmpServerExecStackEntry.OperIdx;
|
2762
|
+
if (clearWhenFound && this._serverExecStack.peek().size() === this._execStack.peek().size() + 1) {
|
2763
|
+
this._serverExecStack.peek().clear();
|
2764
|
+
}
|
2765
|
+
}
|
2766
|
+
else
|
2767
|
+
nextOperIdx = EventsManager.MAX_OPER;
|
2768
|
+
}
|
2769
|
+
else {
|
2770
|
+
nextOperIdx = EventsManager.MAX_OPER;
|
2771
|
+
}
|
2772
|
+
}
|
2773
|
+
return nextOperIdx;
|
2774
|
+
}
|
2775
|
+
setProcessingTopMostEndTask(inProcessingTopMostEndTask) {
|
2776
|
+
this._processingTopMostEndTask = inProcessingTopMostEndTask;
|
2777
|
+
}
|
2778
|
+
getProcessingTopMostEndTask() {
|
2779
|
+
return this._processingTopMostEndTask;
|
2780
|
+
}
|
2781
|
+
setAllowEvents(AllowEvents) {
|
2782
|
+
this._allowEvents = AllowEvents;
|
2783
|
+
}
|
2784
|
+
setNonInteractiveAllowEvents(AllowEvents) {
|
2785
|
+
if (AllowEvents)
|
2786
|
+
this._allowEvents = EventsAllowedType.NON_INTERACTIVE;
|
2787
|
+
else
|
2788
|
+
this._allowEvents = EventsAllowedType.NONE;
|
2789
|
+
}
|
2790
|
+
getAllowEvents() {
|
2791
|
+
return this._allowEvents;
|
2792
|
+
}
|
2793
|
+
NoEventsAllowed() {
|
2794
|
+
return this._allowEvents === EventsAllowedType.NONE;
|
2795
|
+
}
|
2796
|
+
async handleCtrlModify(ctrl, act) {
|
2797
|
+
if (ctrl == null || !ctrl.isModifiable())
|
2798
|
+
return;
|
2799
|
+
switch (act) {
|
2800
|
+
case InternalInterface.MG_ACT_RT_EDT_NULL:
|
2801
|
+
case InternalInterface.MG_ACT_CTRL_MODIFY:
|
2802
|
+
case InternalInterface.MG_ACT_SELECTION:
|
2803
|
+
break;
|
2804
|
+
default:
|
2805
|
+
return;
|
2806
|
+
}
|
2807
|
+
let rtEvt;
|
2808
|
+
rtEvt = new RunTimeEvent(ctrl);
|
2809
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_MODIFY);
|
2810
|
+
await this.handleEvent(rtEvt, false);
|
2811
|
+
}
|
2812
|
+
ActAllowed(act) {
|
2813
|
+
let allowed = true;
|
2814
|
+
switch (this.getAllowEvents()) {
|
2815
|
+
case EventsAllowedType.ALL:
|
2816
|
+
allowed = true;
|
2817
|
+
break;
|
2818
|
+
case EventsAllowedType.NONE:
|
2819
|
+
allowed = (act === InternalInterface.MG_ACT_CRELINE);
|
2820
|
+
break;
|
2821
|
+
case EventsAllowedType.NON_INTERACTIVE:
|
2822
|
+
switch (act) {
|
2823
|
+
case InternalInterface.MG_ACT_EXIT_SYSTEM:
|
2824
|
+
case InternalInterface.MG_ACT_EXIT:
|
2825
|
+
case InternalInterface.MG_ACT_CLOSE:
|
2826
|
+
case InternalInterface.MG_ACT_CRELINE:
|
2827
|
+
case InternalInterface.MG_ACT_CRELINE_ABOVE:
|
2828
|
+
case InternalInterface.MG_ACT_ROLLBACK:
|
2829
|
+
allowed = true;
|
2830
|
+
break;
|
2831
|
+
default:
|
2832
|
+
allowed = false;
|
2833
|
+
break;
|
2834
|
+
}
|
2835
|
+
break;
|
2836
|
+
}
|
2837
|
+
return allowed;
|
2838
|
+
}
|
2839
|
+
async commitRecord(task, isReversibleExit) {
|
2840
|
+
let dv = task.DataView;
|
2841
|
+
let rec = dv.getCurrRec();
|
2842
|
+
let forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
2843
|
+
let isSelectionTable = await task.checkProp(PropInterface.PROP_TYPE_SELECTION, false);
|
2844
|
+
let isNewRec = rec.isNewRec();
|
2845
|
+
let savePrevCurrRec = true;
|
2846
|
+
let recModified = rec.Modified;
|
2847
|
+
if (!dv.recInModifiedTab(rec.getId()))
|
2848
|
+
rec.clearFlagsHistory();
|
2849
|
+
await task.TaskTransactionManager.checkAndCommit(isReversibleExit, ConstInterface.TRANS_RECORD_PREFIX, task.ConfirmUpdateNo);
|
2850
|
+
if (task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX)) {
|
2851
|
+
try {
|
2852
|
+
task.DataSynced = true;
|
2853
|
+
this.setStopExecution(false);
|
2854
|
+
await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_PREFIX);
|
2855
|
+
}
|
2856
|
+
finally {
|
2857
|
+
this.setStopExecution(true);
|
2858
|
+
}
|
2859
|
+
}
|
2860
|
+
else if (task.isAborting())
|
2861
|
+
this.setStopExecution(true);
|
2862
|
+
else {
|
2863
|
+
if (recModified)
|
2864
|
+
rec.setLateCompute(true);
|
2865
|
+
if (!this._stopExecution)
|
2866
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
2867
|
+
rec.resetUpdated();
|
2868
|
+
rec.resetModified();
|
2869
|
+
if (!recModified && !forceSuffix && (!isSelectionTable || !task.InSelect)) {
|
2870
|
+
if (isNewRec) {
|
2871
|
+
dv.setPrevCurrRec();
|
2872
|
+
savePrevCurrRec = false;
|
2873
|
+
rec.setNewRec();
|
2874
|
+
await task.getForm().cancelEdit(false, false);
|
2875
|
+
await this.HandleStopRowEditing(task);
|
2876
|
+
}
|
2877
|
+
else if (!rec.getForceSaveOrg())
|
2878
|
+
await dv.cancelEdit(EventsManager.REAL_ONLY, true);
|
2879
|
+
else
|
2880
|
+
dv.saveOriginal();
|
2881
|
+
}
|
2882
|
+
else
|
2883
|
+
dv.saveOriginal();
|
2884
|
+
}
|
2885
|
+
if (savePrevCurrRec)
|
2886
|
+
dv.setPrevCurrRec();
|
2887
|
+
}
|
2888
|
+
incLocateTimerCB(taskObj) {
|
2889
|
+
let task = taskObj;
|
2890
|
+
let rtEvt = new RunTimeEvent(task, true);
|
2891
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_INCREMENTAL_LOCATE);
|
2892
|
+
rtEvt.setMainPrgCreator(task);
|
2893
|
+
rtEvt.setCtrl(task.getLastParkedCtrl());
|
2894
|
+
this.addToTail(rtEvt);
|
2895
|
+
}
|
2896
|
+
static async doSyncForSubformParent(task) {
|
2897
|
+
let parentTask = task.getParent();
|
2898
|
+
let parentDv = parentTask.DataView;
|
2899
|
+
let parentRec = parentDv.getCurrRec();
|
2900
|
+
if (task.IsSubForm && parentRec != null && parentRec.Modified && !parentDv.isEmptyDataview()) {
|
2901
|
+
parentRec.setMode(DataModificationTypes.Update);
|
2902
|
+
await parentDv.addCurrToModified(false);
|
2903
|
+
((parentDv.getCurrRec())).Synced = true;
|
2904
|
+
parentDv.setChanged(true);
|
2905
|
+
let dataViewExecuteLocalUpdatesCommand = CommandFactory.CreateDataViewCommand(parentTask.getTaskTag(), DataViewCommandType.ExecuteLocalUpdates);
|
2906
|
+
await parentTask.DataviewManager.Execute(dataViewExecuteLocalUpdatesCommand);
|
2907
|
+
}
|
2908
|
+
}
|
2909
|
+
async ProcessAbortingError(ex) {
|
2910
|
+
let eMsg;
|
2911
|
+
let errForConsole;
|
2912
|
+
let errForMsgBox;
|
2913
|
+
if (ex instanceof ServerError)
|
2914
|
+
eMsg = ex.GetMessage();
|
2915
|
+
else
|
2916
|
+
eMsg = ((ex.Message !== null) ? ex.Message : ex.GetType());
|
2917
|
+
errForConsole = StrUtil.getConsoleErorString(eMsg);
|
2918
|
+
errForMsgBox = StrUtil.getMsgBoxErorString(eMsg);
|
2919
|
+
if (ex.InnerException !== null)
|
2920
|
+
Logger.Instance.WriteExceptionToLog(ex.InnerException, errForConsole);
|
2921
|
+
else {
|
2922
|
+
if (!(ex instanceof ServerError) || Logger.Instance.LogLevel !== Logger_LogLevels.Basic) {
|
2923
|
+
Logger.Instance.WriteExceptionToLogWithMsg(errForConsole);
|
2924
|
+
}
|
2925
|
+
}
|
2926
|
+
let sendUnloadToServer = RuntimeContextBase.Instance.ContextID !== RuntimeContextBase.noContextId;
|
2927
|
+
MGDataCollection.Instance.currMgdID = 0;
|
2928
|
+
let messageString = LanguageData.Instance.getConstMessage(MsgInterface.BRKTAB_STR_ERROR);
|
2929
|
+
let style = 16;
|
2930
|
+
if (ex.Message.startsWith('<HTML')) {
|
2931
|
+
this.processHTMLContent(ex.Message);
|
2932
|
+
}
|
2933
|
+
else {
|
2934
|
+
if (this.ShowErrorInMessageBox(ex)) {
|
2935
|
+
await GUIManager.Instance.MessageBox(messageString, errForMsgBox, style);
|
2936
|
+
}
|
2937
|
+
if (ex instanceof ServerError) {
|
2938
|
+
if (ex.GetCode() == ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED ||
|
2939
|
+
ex.GetCode() == ServerError.ERR_EXECUTED_PROGRAM_CHANGED) {
|
2940
|
+
Commands.addGlobalCommand(CommandType.RELOAD_PAGE);
|
2941
|
+
Commands.beginInvoke();
|
2942
|
+
}
|
2943
|
+
}
|
2944
|
+
}
|
2945
|
+
if (ex instanceof ServerError) {
|
2946
|
+
if (ex.GetCode() === ServerError.ERR_CTX_NOT_FOUND ||
|
2947
|
+
ex.GetCode() === ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED ||
|
2948
|
+
ex.GetCode() === ServerError.ERR_EXECUTED_PROGRAM_CHANGED) {
|
2949
|
+
sendUnloadToServer = false;
|
2950
|
+
}
|
2951
|
+
}
|
2952
|
+
if (sendUnloadToServer) {
|
2953
|
+
try {
|
2954
|
+
let cmd = CommandFactory.CreateUnloadCommand();
|
2955
|
+
MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
|
2956
|
+
await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
2957
|
+
}
|
2958
|
+
catch (ex3) {
|
2959
|
+
if (ex3 instanceof ApplicationException) {
|
2960
|
+
Logger.Instance.WriteExceptionToLog(ex3);
|
2961
|
+
}
|
2962
|
+
else
|
2963
|
+
throw ex3;
|
2964
|
+
}
|
2965
|
+
}
|
2966
|
+
GUIManager.Instance.abort();
|
2967
|
+
}
|
2968
|
+
processHTMLContent(htmlContent) {
|
2969
|
+
Commands.addShowHTMLError(CommandType.SHOW_HTML_ERROR, htmlContent);
|
2970
|
+
Commands.beginInvoke();
|
2971
|
+
}
|
2972
|
+
ShowErrorInMessageBox(ex) {
|
2973
|
+
if (!(ex instanceof ServerError))
|
2974
|
+
return true;
|
2975
|
+
if ((ex.GetCode() == ServerError.ERR_EXECUTED_PROGRAM_CHANGED ||
|
2976
|
+
ex.GetCode() == ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED) &&
|
2977
|
+
RuntimeContextBase.Instance.ContextID === RuntimeContextBase.noContextId)
|
2978
|
+
return false;
|
2979
|
+
return true;
|
2980
|
+
}
|
2981
|
+
getIsInViewRefresh() {
|
2982
|
+
return this.isInViewRefresh;
|
2983
|
+
}
|
2984
|
+
setIsInViewRefresh(inViewRefresh) {
|
2985
|
+
this.isInViewRefresh = inViewRefresh;
|
2986
|
+
}
|
2987
|
+
}
|
2988
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsSUFBSSxFQUNKLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsV0FBVyxFQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBRWQsWUFBWSxFQUVaLE9BQU8sRUFHUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFE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UUFFRCxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFHRCxrQkFBa0IsQ0FBQyxXQUFtQjtRQUNwQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUdELHFCQUFxQixDQUFDLEVBQXdCO1FBQzVDLElBQUcsQ0FBQyxDQUFDLEVBQUUsWUFBWSxXQUFXLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFJZCxJQUFHLENBQWUsRUFBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyw0QkFBNEI7WUFDMUQsRUFBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQztZQUN6RSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLGtCQUFrQixDQUFDLFdBQVc7WUFDMUUsT0FBTyxLQUFLLENBQUM7UUFFZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxhQUFzQjtRQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQztJQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgRm9yY2VFeGl0LFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUHJpb3JpdHksXHJcbiAgUmFpc2VBdCxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgU3ViZm9ybVR5cGVcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSW50MzIsIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlciwgVGhyZWFkLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIENvbW1hbmRUeXBlLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBFeHBWYWwsXHJcbiAgRm9jdXNNYW5hZ2VyLFxyXG4gIEd1aUNvbnN0YW50cyxcclxuICBHdWlFbnZpcm9ubWVudCxcclxuICBJVGFzayxcclxuICBLZXlib2FyZEl0ZW0sXHJcbiAgTGFzdEZvY3VzZWRWYWwsXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgTW9kaWZpZXJzLFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUnVudGltZUNvbnRleHRCYXNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge1JvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvUm9sbGJhY2tFdmVudENvbW1hbmQnO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbCc7XHJcbmltcG9ydCB7TWdQcmlvcml0eUJsb2NraW5nUXVldWV9IGZyb20gJy4uL3V0aWwvTWdQcmlvcml0eUJsb2NraW5nUXVldWUnO1xyXG5pbXBvcnQge0NvbXBNYWluUHJnVGFibGV9IGZyb20gJy4uL3J0L0NvbXBNYWluUHJnVGFibGUnO1xyXG5pbXBvcnQge0ZpZWxkfSBmcm9tICcuLi9kYXRhL0ZpZWxkJztcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gJy4vUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlciwgUmV0VmFsc30gZnJvbSAnLi9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSAnLi4vR1VJTWFuYWdlcic7XHJcbmltcG9ydCB7VGFza30gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcbmltcG9ydCB7VGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gJy4uL3J0L0FyZ3VtZW50c0xpc3QnO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSAnLi4vdGFza3MvTUdEYXRhJztcclxuaW1wb3J0IHtIYW5kbGVyc1RhYmxlfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHtNR0RhdGFDb2xsZWN0aW9ufSBmcm9tICcuLi90YXNrcy9NR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9ufSBmcm9tICcuLi9kYXRhL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yQmFzZSwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHtDb21tYW5kc1RhYmxlfSBmcm9tICcuLi9Db21tYW5kc1RhYmxlJztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQge0lDbGllbnRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vcnQvT3BlcmF0aW9uJztcclxuaW1wb3J0IHtDbGllbnRSZWZyZXNoQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvU2VydmVyVG9DbGllbnQvQ2xpZW50UmVmcmVzaENvbW1hbmQnO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tICcuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3InO1xyXG5pbXBvcnQge0V4ZWN1dGlvblN0YWNrfSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFjayc7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2tFbnRyeX0gZnJvbSAnLi4vcnQvRXhlY3V0aW9uU3RhY2tFbnRyeSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyUG9zaXRpb259IGZyb20gJy4vRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi9FdmVudCc7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSAnLi4vRmxvd01vbml0b3JJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0RhdGFWaWV3Q29tbWFuZFR5cGV9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0RhdGF2aWV3Q29tbWFuZCc7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gJy4uL3JlbW90ZS9TZXJ2ZXJFcnJvcic7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0V2ZW50c0FsbG93ZWRUeXBlLCBJRXZlbnRzTWFuYWdlcn0gZnJvbSAnLi9JRXZlbnRzTWFuYWdlcic7XHJcbmltcG9ydCB7TGFuZ3VhZ2VEYXRhfSBmcm9tICcuLi9lbnYvTGFuZ3VhZ2VEYXRhJztcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtDbGllbnRNYW5hZ2VyfSBmcm9tICcuLi9DbGllbnRNYW5hZ2VyJztcclxuaW1wb3J0IHtDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uIH0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuXHJcblxyXG5lbnVtIEV2ZW50U2NvcGUge1xyXG4gIE5PTkUgPSAnICcsXHJcbiAgVFJBTlMgPSAnVCdcclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIG1hbmFnZSB0aGUgZXZlbnRzLCBwdXQgdGhlbSBpbiBhIHF1ZXVlIGFuZCBoYW5kbGUgdGhlbVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRXZlbnRzTWFuYWdlciBpbXBsZW1lbnRzIElFdmVudHNNYW5hZ2VyIHtcclxuICAvLyBMT0NBTCBDT05TVEFOVFNcclxuICBwcml2YXRlIHN0YXRpYyBSRUFMX09OTFk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgc3RhdGljIE1BWF9PUEVSOiBudW1iZXIgPSA5OTk5O1xyXG4gIHByaXZhdGUgc3RhdGljIHVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gdHJ1ZTtcclxuICBwcml2YXRlIF9ldmVudHNRdWV1ZTogTWdQcmlvcml0eUJsb2NraW5nUXVldWUgPSBudWxsOyAvLyB0aGUgcXVldWUgb2YgZXZlbnRzIHRvIGV4ZWN1dGVcclxuICBwcml2YXRlIF9leGVjU3RhY2s6IFN0YWNrPEV4ZWN1dGlvblN0YWNrPiA9IG51bGw7IC8vIEV4ZWN1dGlvbiBzdGFjayBvZiByYWlzZSBldmVudCBvcGVyYXRpb24gb3IgY2FsbHMgdG8gdXNlclxyXG4gIHByaXZhdGUgX3J0RXZlbnRzOiBTdGFjazxSdW5UaW1lRXZlbnQ+ID0gbnVsbDsgLy8gQSBzdGFjayBvZiBpbi1wcm9jZXNzIHJ1bi10aW1lIGV2ZW50cyAodGhlIGxhc3Qgb25lIGlzIGF0IHRoZSB0b3ApLlxyXG4gIHByaXZhdGUgX3NlcnZlckV4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIEV4ZWN1dGlvbiBzdGFja3Mgb2Ygb3BlcmF0aW9ucyB0aGF0XHJcbiAgcHJpdmF0ZSBfYWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gRXZlbnRzQWxsb3dlZFR5cGUuQUxMO1xyXG4gIHByaXZhdGUgX2NvbXBNYWluUHJnVGFiOiBDb21wTWFpblByZ1RhYmxlID0gbnVsbDsgLy8gdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIHByaXZhdGUgX2N1cnJDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHByaXZhdGUgX2N1cnJGaWVsZDogRmllbGQgPSBudWxsOyAvLyBmb3IgZXZlcnkgZXZlbnQgZXhlY3V0ZWQgdGhpcyB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGZpZWxkIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sIG9uIHdoaWNoIHRoZSBldmVudCB3YXMgZmlyZWRcclxuICBwcml2YXRlIF9jdXJyS2JkSXRlbTogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICBwcml2YXRlIF9lbmRPZldvcms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmVudFNjb3BlOiBFdmVudFNjb3BlID0gRXZlbnRTY29wZS5OT05FOyAvLyBpbnN0cnVjdHMgaG93IHRvIHByb2Nlc3MgZXZlbnRzIHdoaWNoIGFyZSBwcm9wYWdhdGVkIHRvIHNsYXZlIHRhc2tzIGR1cmluZyBleGVjdXRpb24uXHJcbiAgcHJpdmF0ZSBfZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBGb3JjZUV4aXQuTm9uZTtcclxuICBwcml2YXRlIF9mb3JjZUV4aXRUYXNrOiBUYXNrID0gbnVsbDtcclxuICBwcml2YXRlIF9pZ25vcmVVbmtub3duQWJvcnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVFJVRSB3aGVuICdhYm9ydCcgY29tbWFuZHMgb24gdW5rbm93biB0YXNrcyBtYXkgYXJyaXZlXHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdXNlZCB0byBkZXRlY3QgcmUtaW5pdGlhbGl6YXRpb25cclxuICBwcml2YXRlIF9pc0hhbmRsaW5nRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGluZGljYXRlIHdlIGFyZSBjdXJyZW50bHkgaGFuZGxpbmcgYSBmb3JjZUV4aXQgcmVsYXRlZCBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfaXNOb25SZXZlcnNpYmxlRXhpdDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpcyB0aGUgY29tbWFuZCBub25yZXZlcnNpYmxlXHJcbiAgcHJpdmF0ZSBfaXNJblJlY29yZEZsdXNoRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiBjdXJyZW50IGFjdCBpcyBNR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkRcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdFNhdmVkUm91dGVFdmVudDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAvLyB3YXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIuIHdlIG5lZWQgYSBzdGFjayBvZiBleGVjc3RhY2tzXHJcbiAgLy8gaGVyZSBiZWNhdXNlIHdlIG1pZ2h0IGNhbGwgYSBuZXcgcHJvZ3JhbSBiZWZvcmUgd2UgaGFuZGxlZFxyXG4gIC8vIHRoZSBwcmV2aW91cyBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGlvbiB3aGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBldmVudHMgZnJvbSB0aGVcclxuICBwcml2YXRlIF9zdG9wRXhlY3V0aW9uQ3RybDogTWdDb250cm9sID0gbnVsbDsgLy8gaG9sZHMgdGhlIGN0cmwgb24gd2hpY2ggd2UgZ2V0IHRoZSBmaXJzdCBzdG9wIGV4ZWN1dGlvblxyXG5cclxuICBwdWJsaWMgZ3VpUGVuZGluZ0V2ZW50OiBhbnkgPSBudWxsO1xyXG4gIC8vIEtFWUJPQVJEIEVWRU5UUyBDT05TVEFOVFNcclxuICByZWFkb25seSBLQklfRE9XTjogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICByZWFkb25seSBLQklfVVA6IEtleWJvYXJkSXRlbSA9IG51bGw7XHJcblxyXG4gIC8vIENPTlRFWFQgVEVSTUlOQVRJT04gV0FSTklORyBDT05TVEFOVFNcclxuICByZWFkb25seSBjb25maXJtYXRpb25EaWFsb2dNc2c6IHN0cmluZyA9ICdUaGUgc2VydmVyIGNvbnRleHQgc2VydmluZyB0aGlzIGFwcGxpY2F0aW9uIGlzIGFib3V0IHRvIHRpbWUgb3V0LiBEbyB5b3Ugd2FudCB0byBjb250aW51ZSB5b3VyIHdvcms/JztcclxuICByZWFkb25seSBjb25maXJtYXRpb25EaWFsb2dUaXRsZTogc3RyaW5nID0gJ1Nlc3Npb24gaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZCEnO1xyXG5cclxuICBzdGF0aWMgSW5zdGFuY2U6IEV2ZW50c01hbmFnZXIgPSBuZXcgRXZlbnRzTWFuYWdlcigpO1xyXG5cclxuICBwcml2YXRlIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGlzU3Bpbm5lclNob3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpc0luVmlld1JlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgU3Bpbm5lclN0b3BwZWQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHN0YXRpYyBjbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJpdmF0ZSBDVE9SIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX3J0RXZlbnRzID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fZXZlbnRzUXVldWUgPSBuZXcgTWdQcmlvcml0eUJsb2NraW5nUXVldWUoKTtcclxuXHJcbiAgICB0aGlzLl9leGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuXHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG51bGwpO1xyXG5cclxuXHJcbiAgICB0aGlzLktCSV9ET1dOID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX0RPV04sIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuICAgIHRoaXMuS0JJX1VQID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX1VQLCBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UGVuZGluZ0d1aUV2ZW50KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5ndWlQZW5kaW5nRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBzZXRQZW5kaW5nR3VpRXZlbnQoZ3VpRXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSBndWlFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYW4gZXZlbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGJlIGFkZGVkIDwvcGFyYW0+XHJcbiAgYWRkVG9UYWlsKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmIGN1cnJlbnQgZXZlbnQgaXMgbm90IGlkbGUgdGltZSBldmVudCBjaGVjayBpZiB0aGVyZSBpcyBjbGllbnRJbmFjdGl2aXR5VGltZXIgcnVubmluZz9cclxuICAgIC8vIGlmIHNvICwgc3RvcCB0aGlzIGNsaWVudCBDb250ZXh0IGluYWN0aXZpdHkgdGltZXJcclxuICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSkge1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTikge1xyXG4gICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gaWYgY2xpZW50IGlzIGlkbGUgYWZ0ZXIgcmVjcmVhdGluZyBjb250ZXh0ICwgdGhlbiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudFxyXG4gICAgICBpZiAodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuYWRkVG9UYWlsKHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpKTtcclxuICAgICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZS5wdXQocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbiBrZXlib2FyZCBldmVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0Zvcm1cIj5mb3JtIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0NvbnRyb2xcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RpZmllclwiPm1vZGlmaWVyIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGFydFwiPnN0YXJ0IG9mIHNlbGVjdGVkIHRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZFwiPmVuZCBvZiBzZWxlY3RlZCB0ZXh0ICA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGV4dFwiPnRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImltXCI+aW0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQWN0Q2hhclwiPmlzIGtleWJvYXJkIGNoYXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1Z2dlc3RlZFZhbHVlXCI+c3VnZ2VzdGVkIHZhbHVlIGZvciBjaG9pY2UgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIHRvIGJlIGFkZGVkIGluIHRoZSBxdWV1ZSA8L3BhcmFtPlxyXG4gIEFkZEtleWJvYXJkRXZlbnQobWdGb3JtOiBNZ0Zvcm1CYXNlLCBtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gKG1nQ29udHJvbCAhPT0gbnVsbCkgPyBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+bWdDb250cm9sLCB0cnVlLCBmYWxzZSkgOiBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPm1nRm9ybS5nZXRUYXNrKCksIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG5cclxuICAgIGxldCBuZXdLYkl0ZW06IEtleWJvYXJkSXRlbSA9IG5ldyBLZXlib2FyZEl0ZW0oa2V5Q29kZSwgbW9kaWZpZXIpO1xyXG5cclxuICAgIGlmIChpc0FjdENoYXIgJiYgKG1nQ29udHJvbCAhPT0gbnVsbCAmJiAobWdDb250cm9sLmlzVGV4dENvbnRyb2woKSkpKVxyXG4gICAgICBuZXdLYkl0ZW0uc2V0QWN0aW9uKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DSEFSKTtcclxuXHJcbiAgICBydEV2dC5zZXRLZXlib2FyZEl0ZW0obmV3S2JJdGVtKTtcclxuXHJcbiAgICBpZiAoY29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfS0VZRE9XTikge1xyXG4gICAgICBydEV2dC5zZXRFZGl0UGFybXMoc3RhcnQsIGVuZCwgdGV4dCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgcnRFdnQuc2V0VmFsdWUoc3VnZ2VzdGVkVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBRQ1IgNzYwMzgxIGlmIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudCB0aGUgY3VycmVudCBjb250cm9sIGlzIHVucGFya2FibGUgdHJ5XHJcbiAgLy8vICAgYW4gbW92ZSB0byB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBjaGVja1BhcmthYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJlbnQ6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAvKiBRQ1IjIDkyNTQ2NC4gVGhlIHByb2JsZW0gd2FzIHRoYXQgb24gZGVsZXRpbmcgYSByZWNvcmQsIENTIG9mIHRoZSBjb250cm9sIGdldHMgZXhlY3V0ZWQuXHJcbiAgICAgKiBTbywgdGhlIHRhc2sncyBsZXZlbCBpcyBzZXQgdG8gVEFTSy4gVGhlbiB3ZSBnbyB0byBzZXJ2ZXIgYW4gb24gcmV0dXJuaW5nIGJhY2sgZnJvbSB0aGUgc2VydmVyLFxyXG4gICAgICogd2UgcmVmcmVzaCB0aGUgZm9ybS4gSGVyZSwgc2luY2UgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaS5lLiBcImZyb21cIiAobnVtZXJpYykgaXMgaGlkZGVuLFxyXG4gICAgICogd2UgdHJ5IHRvIHBhcmsgb24gdGhlIG5leHQgcGFya2FibGUgY29udHJvbCBmcm9tIFByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCkuIFRoaXMgbWFrZXMgdGhlXHJcbiAgICAgKiB0YXNrJ3MgbGV2ZWwgYXMgQ09OVFJPTC4gTm93LCB3ZSB0cnkgdG8gZXhlY3V0ZSBSUCwgYnV0IHNpbmNlIHRoZSBsZXZlbCBpcyBDT05UUk9MLFxyXG4gICAgICogd2UgZG8gbm90IGV4ZWN1dGUgaXQuIFRoZSBzb2x1dGlvbiBpcyB0aGF0IGNoZWNrUGFya2FiaWxpdHkoKSB3aGljaCBpcyBjYWxsZWQgZnJvbVxyXG4gICAgICogUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKSwgc2hvdWxkIHRyeSB0byBwYXJrIG9uIHRoZSBjb250cm9sIG9ubHkgaWYgdGhlIHRhc2sncyBsZXZlbCBpcyBDT05UUk9MLlxyXG4gICAgICovXHJcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MICYmICFhd2FpdCBjdXJyZW50LklzUGFya2FibGUoKSlcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN1cnJlbnQuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBIYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKGl0YXNrOiBJVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGl0YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgc2l0dWF0aW9uIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj48L3BhcmFtPlxyXG4gIGFzeW5jIEhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG4gICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUob2xkTW9kZSk7XHJcbiAgICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHdlIGNhbiBub3Qgc3RheSBpbiBjcmVhdGUgbW9kZSBvciBpbiBzdG9wIGV4ZWN1dGlvbiBzdGF0ZSB3aXRoIG5vIHBhcmthYmxlIGNvbnRyb2xzXHJcbiAgICAgIC8vIERvIG5vdCBnaXZlIHBhcmsgZXJyb3IsIGlmIHRhc2sgaXMgb3BlbmVkIGluIGNyZWF0ZSBtb2RlLiBUaGlzIGlzIHRlbXBvcmFyeSBjaGFuZ2UgZm9yIGN1c3RvbWVyIHByb2JsZW0uXHJcbiAgICAgIC8vdGhpcy5leGl0V2l0aEVycm9yKHRhc2ssIE1zZ0ludGVyZmFjZS5SVF9TVFJfQ1JTUl9DQU5UX1BBUkspO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoaWxlIGhhbmRsZSBub24tcGFya2FiaWxpdHkgY29uZGl0aW9uLCBlbnN1cmUgQ1MgaXMgY2FsbGVkIGZvciBjb250cm9sIGlmIGl0IGlzIGluIENvbnRyb2wgbGV2ZWwgdGhlbiBwYXJraW5nIGlzIHNldCBvbiBmb3JtLlxyXG4gICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG5cclxuICAgIHRhc2suc2V0TGFzdFBhcmtlZEN0cmwobnVsbCk7XHJcbiAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gbnVsbDtcclxuICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIGEgc2luZ2xlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlydEV2dFwiPnRoZSBldmVudCB0byBwcm9jZXNzIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgLSB0byBiZSBwYXNzZWQgdG8gaGFuZGxlci5leGVjdXRlKCkgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVFdmVudChydEV2dDogUnVuVGltZUV2ZW50LCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgbGV0IHBvczogRXZlbnRIYW5kbGVyUG9zaXRpb24gPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IGZvcmNlRXhpdERvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRUYXNrRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBvbGRSdEV2dDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAgIGxldCBvbGRGb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IHRoaXMuZ2V0Rm9yY2VFeGl0KCk7XHJcbiAgICBsZXQgb2xkRm9yY2VFeGl0VGFzazogVGFzayA9IHRoaXMuZ2V0Rm9yY2VFeGl0VGFzaygpO1xyXG4gICAgbGV0IG9sZElzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgbGV0IHJlc3RvcmVJc0ZvcmNlRXhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyRmllbGQ6IEZpZWxkID0gbnVsbDtcclxuXHJcbiAgICAvLyB0aGUgYWN0aW9uIG5lZWQgdG8gYmUgY2hlY2sgYWNjb3JkaW5nIHRvIHRoZSB0YXNrIG9uIHRoZSBldmVudC5cclxuICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgaW50ZXJuYWwgKHVuZGVyIEFDVF9UT1QpLCBkbyBub3RoaW5nIGlmIGl0cyBkaXNhYmxlZCBvciBub3QgYWxsb3dlZC5cclxuICAgIGlmICgocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSkge1xyXG4gICAgICAvLyBkbyBub3RoaW5nIGlmIGFjdGlvbiBpcyAxLiBub3QgZW5hYmxlZCAyLiB3YWl0ID09IG5vIGFuZCBldmVudHMgYXJlIG5vdCBhbGxvd2VkXHJcbiAgICAgIGlmIChydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgKCF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKHJ0RXZ0LkludGVybmFsRXZlbnQpIHx8ICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKSkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICAvLyBkbyB0aGUgaGFuZGxlcnMgd2hlbiAxLiB3YWl0ID09IHllcyBvciAyLiBldmVudHMgYXJlIGFsbG93ZWRcclxuICAgIGlmICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgcmVzdG9yZUN1cnJDdHJsID0gdGhpcy5fY3VyckN0cmw7XHJcbiAgICB0aGlzLl9jdXJyQ3RybCA9IGN0cmw7IC8vIHNhdmUgY3VycmVudCBjb250cm9sIGZvciBIQU5ETEVSX0NUUkwgZnVuY3Rpb25cclxuXHJcbiAgICBsZXQgcHJvcGFnYXRlOiBib29sZWFuID0gcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMIHx8IHJ0RXZ0LmdldEludGVybmFsQ29kZSgpIDwgMTAwMDtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBkbyBzb21lIGNvbW1vbiBwcm9jZXNzaW5nIGFuZCBpZiB0aGUgcmVzdWx0IGlzIHRydWUgdGhlbiBjb250aW51ZVxyXG4gICAgICAvLyB3aXRoIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlcnNcclxuICAgICAgbGV0IGJSY0JlZm9yZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckJlZm9yZShydEV2dCk7XHJcblxyXG4gICAgICByZXN0b3JlQ3VyckZpZWxkID0gdGhpcy5fY3VyckZpZWxkO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSA8RmllbGQ+dGFzay5nZXRDdXJyRmllbGQoKTtcclxuXHJcbiAgICAgIGlmIChiUmNCZWZvcmUpIHtcclxuICAgICAgICBwb3MuaW5pdChydEV2dCk7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkgIT09IG51bGwgJiYgaGFuZGxlci5nZXRFdmVudCgpLlVzZXJFdnQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLnNldEZvcmNlRXhpdChoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dC5Gb3JjZUV4aXQsIHRhc2spO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRoZSBjaGFpbiBvZiBoYW5kbGVycyBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIHRoZSBleGVjdXRpb25cclxuICAgICAgICAvLyBjb250aW51ZXMgdGlsbCBhbiBldmVudCBoYW5kbGVyIHJldHVybnMgZmFsc2UuXHJcbiAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0Q2hhbmdlZDogYm9vbGVhbjtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBjaGFuZ2UgdGhlIGhhbmRsZXIncyBjb250ZXh0IHRhc2sgdG8gdGhlIGV2ZW50J3MgdGFza1xyXG4gICAgICAgICAgICBoYW5kbGVyQ29udGV4dFRhc2sgPSA8VGFzaz5oYW5kbGVyLmdldFRhc2soKS5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID49IDEwMDAgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSlcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhoYW5kbGVyLmdldFRhc2soKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBoYW5kbGUgRm9yY2VFeGl0IGZvciBub24tdXNlciBldmVudHNcclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBhd2FpdCBoYW5kbGVyLmlzRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmVzdG9yZUlzRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAvLyBoYW5kbGUgZm9yY2VFeGl0IG9ubHkgb25jZVxyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEJlZm9yZShoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KSkge1xyXG4gICAgICAgICAgICAgICAgZm9yY2VFeGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBydW4gdGltZSBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZXZlbnRcclxuICAgICAgICAgICAgLy8gb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0ICE9PSBoYW5kbGVyLmdldEV2ZW50KCkpIHtcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IHJ1bnRpbWUgZXZlbnQgaXMgdGhhdCBvZiB0aGUgaGFuZGxlciBjb21iaW5lZCB3aXRoIHRoZVxyXG4gICAgICAgICAgICAgIC8vIGRhdGEgb2YgdGhlIGN1cnJlbnQgcnVudGltZSBldmVudC5cclxuICAgICAgICAgICAgICAvLyB0aGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIHByb3BhZ2F0ZSB0aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnRcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IHJ0RXZ0O1xyXG4gICAgICAgICAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KTtcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIG5ldyBydW50aW1lIGV2ZW50IHRvIGhhbmRsZSBzbyBwb3AgdGhlIG9sZCBvbmUgYW5kIHB1c2hcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IG9uZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKVxyXG4gICAgICAgICAgICAgIHJ0RXZ0LmdldFRhc2soKS5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRBcmd1bWVudHMocnRFdnQpO1xyXG4gICAgICAgICAgICBsZXQgaGFuZGxlclJldFZhbHM6IFJldFZhbHMgPSBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIHJldHVybmVkRnJvbVNlcnZlciwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlKTtcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpXHJcbiAgICAgICAgICAgICAgcnRFdnQuZ2V0VGFzaygpLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgcHJvcGFnYXRlID0gaGFuZGxlclJldFZhbHMuUHJvcGFnYXRlO1xyXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXRWYWxzLkVuYWJsZWQgJiYgcnRFdnRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgcnRFdnQgPSBvbGRSdEV2dDtcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBuZXcgcnVudGltZSBldmVudCB0byBoYW5kbGUgc28gcG9wIHRoZSBvbGQgb25lIGFuZCBwdXNoXHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmUgaW5zdGVhZC5cclxuICAgICAgICAgICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBmdWxmaWxsZWQgdGhlIGVuZCBjb25kaXRpb25cclxuICAgICAgICAgICAgLy8gQWZ0ZXIgZXhlY3V0aW5nIGEgaGFuZGxlciwgYmVmb3JlIGVuZGluZyBhIHRhc2sgKGlmIHRoZSBlbmQgY29uZGl0aW9uIGlzIFRSVUUpLFxyXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIHRhc2sgaXMgbm90IGFscmVhZHkgY2xvc2VkLiBUaGlzIGNhbiBoYXBwZW4gbGlrZSBpbiBjYXNlXHJcbiAgICAgICAgICAgIC8vIG9mIFFDUiAjNzk2NDc2IC0tLSBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIGhhcyBjYWxsZWQgYW4gaW50ZXJhY3RpdmUgdGFzayBmcm9tXHJcbiAgICAgICAgICAgIC8vIHRhc2sgc3VmZml4LiBOb3cgaWYgd2UgcHJlc3MgQWx0K0Y0LCB3ZSBnZXQgRVhJVF9TWVNURU0gYWN0LiBBbmQgc28gd2UgY2xvc2VcclxuICAgICAgICAgICAgLy8gYWxsIHRhc2tzIHN0YXJ0aW5nIGZyb20gTWFpbiBQcm9ncmFtLiBTbywgd2hlbiB3ZSBjb21lIG91dCBvZiB0aGUgVFMgaGFuZGxlclxyXG4gICAgICAgICAgICAvLyBleGVjdXRpb24sIHRoZSB0YXNrIGlzIGFscmVhZHkgY2xvc2VkLlxyXG4gICAgICAgICAgICAvLyBGb3IgT2ZmbGluZSA6IFRQIGlzIGV4ZWN1dGVkIGF0IGNsaWVudCBzaWRlLiBJZiB3ZSBhcmUgaW4gVGFzayBQcmVmaXgsIGRvbnQgY2hlY2sgZW5kVGFzayBjb25kaXRpb24gaGVyZS5cclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVggJiYgdGFzay5pc1N0YXJ0ZWQoKSAmJiB0YXNrLmdldEV4ZWNFbmRUYXNrKCkpIHtcclxuICAgICAgICAgICAgICBlbmRUYXNrRXJyb3IgPSBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAoZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0KSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAvLyByZXN0b3JpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2soaGFuZGxlckNvbnRleHRUYXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIXByb3BhZ2F0ZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgaWYgKHJ0RXZ0Q2hhbmdlZClcclxuICAgICAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KHJ0RXZ0KTtcclxuICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBoYW5kbGVyID0gcG9zLmdldE5leHQoKTtcclxuICAgICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsKVxyXG4gICAgICAgICAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmFkZFRhc2tFdmVudChydEV2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1BST1BBR0FURSwgdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BhZ2F0ZSAmJiAhZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWVuZFRhc2tFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckFmdGVyKHJ0RXZ0LCBiUmNCZWZvcmUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JjZUV4aXREb25lICYmIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQpIHtcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb3JjZUV4aXRBZnRlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRGb3JjZUV4aXQob2xkRm9yY2VFeGl0LCBvbGRGb3JjZUV4aXRUYXNrKTtcclxuICAgICAgaWYgKHJlc3RvcmVJc0ZvcmNlRXhpdClcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2N1cnJDdHJsID0gcmVzdG9yZUN1cnJDdHJsO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSByZXN0b3JlQ3VyckZpZWxkO1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmV4ZWNHdWlDb21tYW5kUXVldWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzaW11bGF0ZXMgYWxsIGV2ZW50cyB0aGF0IGFyZSBpbiBzZWxlY3Rpb24gc2VxdWVuY2Ugc3RhcnRpbmcgZnJvbSBmb2N1cyBldmVudFxyXG4gIC8vLyAgIEl0IGlzIHVzZWQgaW4gOlxyXG4gIC8vLyAgIGFjdGlvbnMgQ1RSTCtUQUIgJiYgQ1RSTCtTSElGVCtUQUIgdGhhdCBtb3ZlIHVzIHRvIHRoZSBuZXh0L3ByZXZpb3VzIGl0ZW0gaW4gVGFiIGNvbnRyb2xcclxuICAvLy8gICBjbGljayBvciBhY2NlbGVyYXRvciBvbiBwdXNoIGJ1dHRvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+Y3RybCBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPnRydWUgc2hvdWxkIHByb2R1Y2UgY2xpY2sgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2ltdWxhdGVTZWxlY3Rpb24oY3RybDogTWdDb250cm9sQmFzZSwgdmFsOiBhbnksIGxpbmU6IG51bWJlciwgcHJvZHVjZUNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmw7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSA8VGFzaz5tZ0NvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGxldCBjYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuXHJcbiAgICAvLyBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQikge1xyXG4gICAgLy8gICBpZiAoIW1nQ29udHJvbC5pc01vZGlmaWFibGUoKSB8fCAhbWdDb250cm9sLklzUGFya2FibGUoKSkge1xyXG4gICAgLy8gICAgIG1nQ29udHJvbC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgIC8vICAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBHVUlNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgLy8gICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAvLyAgICAgICBNYW5hZ2VyLlNldEZvY3VzKGxhc3RGb2N1c2VkQ29udHJvbCwgLTEpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHdoZW4gYSBwdXNoIGJ1dHRvbiBpcyBhYm91dCB0byByYWlzZSBhICdDYW5jZWwnIG9yIGEgJ1F1aXQnIGV2ZW50LiB3ZSBkbyBub3Qgd2FudCB0byBzZXQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgZmllbGQuXHJcbiAgICAvLyBUaGF0IHNldHRpbmcgbWlnaHQgY2F1c2UgYSByZWMgc3VmZml4IGFuZCBhIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSB7XHJcbiAgICAgIGxldCBhUnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobWdDb250cm9sKTtcclxuICAgICAgbGV0IHJhaXNlQXQ6IFJhaXNlQXQgPSA8UmFpc2VBdD4oYXdhaXQgKG1nQ29udHJvbC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSk7XHJcbiAgICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIChhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCB8fCBhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpKSB7XHJcbiAgICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgICBjdXJyVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICBjYW5jZWxXYXNSYWlzZWQgPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuICAgICAgICBjdXJyVGFzay5zZXRDYW5jZWxXYXNSYWlzZWQodHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyYWlzZUF0ID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKVxyXG4gICAgICAgIG1nQ29udHJvbC5zZXRSdEV2dFRhc2soTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaXJzdCB3ZSBoYW5kbGUgZm9jdXNcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMobWdDb250cm9sLCBsaW5lLCBwcm9kdWNlQ2xpY2ssIGZhbHNlKTtcclxuXHJcbiAgICBjdXJyVGFzay5zZXRDYW5jZWxXYXNSYWlzZWQoY2FuY2VsV2FzUmFpc2VkKTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiMgOTc0MDQ3IDogSWYgd2UgaGF2ZSBhIFB1c2ggQnV0dG9uIHdpdGggQWxsb3cgUGFya2luZyA9IE5vIGFuZCBmaWVsZCBpcyBhdHRhY2hlZCB0byBpdCwgZG9uJ3QgaGFuZGxlIHRoZSBldmVudC5cclxuICAgIC8vIFRoaXMgaXMgc2FtZSBhcyBvbmxpbmUuIEluIG9ubGluZSwgaWYgZmllbGQgaXMgbm90IGF0dGFjaGVkIHRvIG5vbiBwYXJrYWJsZSBwdXNoIEJ1dHRvbiwgd2UgaGFuZGxlIHRoZSBldmVudFxyXG4gICAgLy8gQnV0IGlmIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGl0LCB3ZSBkb24ndCBoYW5kbGUgZXZlbnQuXHJcbiAgICAvLyBTbyBpZiBjb250cm9sIGlzIHB1c2ggYnV0dG9uLCBleGVjdXRlIGhhbmRsZUV2ZW50IG9ubHkgd2hlbiBmaWVsZCBpcyBub3QgYXR0YWNoZWQgb3IgUGFya29uQ0xpY2sgaXMgTm8gb3JcclxuICAgIC8vIFBhcmtvbkNMaWNrIGFuZCBhbGxvd3BhcmtpbmcgaXMgYm90aCBZZXNcclxuICAgIGxldCBjb250cm9sSXNQYXJrYWJsZTogYm9vbGVhbiA9IGF3YWl0IG1nQ29udHJvbC5Jc1BhcmthYmxlKCk7XHJcbiAgICBpZiAobWdDb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCAobWdDb250cm9sLmdldEZpZWxkKCkgPT09IG51bGwgfHwgY29udHJvbElzUGFya2FibGUpKSB7XHJcblxyXG4gICAgICAvLyBRQ1IgIzMwMTY1Mi4gRm9yIG5vbi1wYXJrYWJsZSBidXR0b24gY29udHJvbCB3aXRoIGV2ZW50IHJhaXNlZCBhdCB0aGUgY29udGFpbmVyIHRhc2sgd2lsbCBiZSBjaGFuZ2VkIHNvXHJcbiAgICAgIC8vIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIHRoZW4gdGhlIHRhc2sgd2lsbCBnZXQgZm9jdXMuIChhcyBpbiBPbmxpbmUgYW5kIGFzIGlmIHRoZSBidXR0b24gd2FzIHBhcmthYmxlKS5cclxuICAgICAgLy8gVGhlIGZvY3VzIHdpbGwgYmUgb24gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgICAgIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmICFjb250cm9sSXNQYXJrYWJsZSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPm1nQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICAgIGlmIChzdWJmb3JtVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgIGN1cnJUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgICAgLy8gRGVmZWN0IDExNTQ3NC4gRm9yIHRoZSBzYW1lIHRhc2sgZG8gbm90IG1vdmUgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT09IGN1cnJUYXNrICYmIHN1YmZvcm1UYXNrLnBhdGhDb250YWlucyhjdXJyVGFzaykpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7IC8vIFRPRE86IENoZWNrIGlmIHRoaXMgY29kZSBjYW4gYmUgbW92ZWQgdG8gSGFuZGxlTm9uUGFya2FibGVDb250cm9scygpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoc3ViZm9ybVRhc2spO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIHRoZW4gQUNUX0hJVCBpcyBzZW50XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChtZ0NvbnRyb2wpO1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbWdDb250cm9sO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9ISVQpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbmQgc2VsZWN0aW9uIGlzIGhhbmRsZWQgaW4gdGhlIGVuZCBpZiBwcmV2aW91cyBhY3Rpb25zIHN1Y2NlZWRlZFxyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pXHJcbiAgICAvLyBmb3IgYnV0dG9uXFxjaGVjayB3ZSBkbyBub3QgY2FsbCB0aGlzIHRvIHByZXZlbnQgcmVjdXJzaW9uXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VsZWN0aW9uKG1nQ29udHJvbCwgbGluZSwgdmFsKTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgLy8gdGhlbiBtb3VzZSB1cFxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVNb3VzZVVwKG1nQ29udHJvbCwgbGluZSwgcHJvZHVjZUNsaWNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKGl0YXNrOiBJVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goaXRhc2ssIGV2ZW50Q29kZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtUmVmcmVzaFwiPmlkZW50aWZpZXIgaWYgdGhlIGV2ZW50IGNhbGxlZCBieSBzdWJmb3JtIHJlZnJlc2g8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKGl0YXNrOiBJVGFzaywgZXZlbnRDb2RlOiBudW1iZXIsIHN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG5cclxuICAgIC8vIHNldCBTdWJmb3JtRXhlY01vZGUgKGZvciBTdWJmb3JtRXhlY01vZGUgZnVuY3Rpb24pIG9ubHkgaW4gcmVjb3JkIHByZWZpeC5cclxuICAgIC8vIFN1YmZvcm1FeGVjTW9kZSBpcyBjaGFuZ2VkIGluIHJlY29yZCBwcmVmaXggYW5kIGl0IGlzIHRoZSBzYW1lIHVudGlsIHRoZVxyXG4gICAgLy8gbmV4dCByZWNvcmQgcHJlZml4IGV4ZWN1dGlvbiwgYmVjYXVzZSB3ZSBkbyBub3Qgb3BlbiBhIHN1YmZvcm0gdGFzayBlYWNoIHRpbWVcclxuICAgIC8vIGluIFJDIGFzIGl0IGlzIGluIE9ubGluZS4gQnV0IHdoZW4gdGhlIHN1YmZvcm0gaXMgcmVmcmVzaGVkIGZyb20gdGhlIHBhcmVudFxyXG4gICAgLy8gaXRzIHJlY29yZCBwcmVmaXggJiBzdWZmaXggYXJlIGFsc28gZXhlY3V0ZWQuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLklzU3ViRm9ybSAmJiB0YXNrLlN1YmZvcm1FeGVjTW9kZSAhPT0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUUpLy8gRklSU1RfVElNRSBpcyBzZXQgb25seSBvbmNlIGluXHJcbiAgICAvLyBkb0ZpcnN0UmVjb3JkQ3ljbGUuXHJcbiAgICB7XHJcbiAgICAgIHRhc2suU3ViZm9ybUV4ZWNNb2RlID0gKHN1YmZvcm1SZWZyZXNoID8gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlJFRlJFU0ggOiBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3IgdGhlIHN1YmZvcm0gcmVmcmVzaCBpdCBpcyBuZWVkZWQgdG8gZXhlY3V0ZSBNR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCBoYW5kbGVyIGJlZm9yZSBSRUNPUkRfUFJFRklYIGhhbmRsZXJcclxuICAgIGlmIChzdWJmb3JtUmVmcmVzaClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soaXRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5UKTtcclxuXHJcbiAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVtcHR5RGF0YXZpZXdPcGVuKHN1YmZvcm1SZWZyZXNoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0YXNrLmVtcHR5RGF0YXZpZXdDbG9zZSgpO1xyXG5cclxuICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKVxyXG4gICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICB0YXNrLmdldEZvcm0oKS5TZWxlY3RSb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybDogTWdDb250cm9sQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2woPE1nQ29udHJvbD5jdHJsLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFwic3RvcCBleGVjdXRpb25cIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRTdG9wRXhlY3V0aW9uRmxhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9wRXhlY3V0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RvcEV4ZWN1dGlvbkN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdGlhbGl6ZXMgdGhlIHN0YXRpYyBzZWN0aW9uIG9mIHRoZSBldmVudHMgbWFuYWdlci4gVXN1YWxseSBkb2VzIG5vdGhpbmcgYnV0IGluIHRoZVxyXG4gIC8vLyAgIGV2ZW50IG9mIGFwcGxldCByZS1sb2FkIChmb3IgZXhhbXBsZSwgYmVjYXVzZSBvZiBhIGJyb3dzZXIgcmVmcmVzaCkgaXQgaW5pdGlhbGl6ZXMgdGhlXHJcbiAgLy8vICAgc3RhdGljIHBhcnQgb2YgdGhpcyBjbGFzcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9mb3JjZUV4aXQgPSBGb3JjZUV4aXQuTm9uZTtcclxuICAgICAgdGhpcy5fZm9yY2VFeGl0VGFzayA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IG51bGw7XHJcbiAgICAgIHRoaXMuc2V0RW5kT2ZXb3JrKHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj50YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50PC9wYXJhbT5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEl0YXNrQW5kQ29kZShpdGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZE9uTXVsdGlNYXJrKGl0YXNrLCBjb2RlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kRGlzcGxheUxpbmVBbmRDb2RlKGN0cmw6IE1nQ29udHJvbEJhc2UsIERpc3BsYXlMaW5lOiBudW1iZXIsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCwgRGlzcGxheUxpbmUsIGZhbHNlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJpb3JpdHlcIj48L3BhcmFtPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIHByaW9yaXR5OiBQcmlvcml0eSk6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LnNldFByaW9yaXR5KHByaW9yaXR5KTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYWRkIGd1aSB0cmlnZ2VyZWQgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbk11bHRpTWFya1wiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRPbk11bHRpTWFyayhpdGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5pdGFzaztcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB3aWxsIGJlIHVzZWQgZm9yIG11bHRpbWFya2luZyBpbiB0aGUgZnV0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RpZmllcnNcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZUFuZE1vZGlmaWVyKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsLCBsaW5lLCBmYWxzZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBpbiBhIHRhYmxlIGNvbnRyb2wgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZExpbmUodGFzazogVGFzaywgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB0c2s6IFRhc2sgPSBudWxsO1xyXG4gICAgaWYgKHRhc2sgIT09IG51bGwpXHJcbiAgICAgIHRzayA9IDxUYXNrPnRhc2s7XHJcblxyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LkRpc3BsYXlMaW5lID0gbGluZTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaGFuZGxlIENvbHVtbiBDbGljayBldmVudCBvbiBDb2x1bW4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aUNvbHVtbkN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpcmVjdGlvblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29sdW1uSGVhZGVyXCI+PC9wYXJhbT5cclxuICBBZGRDb2x1bW5DbGlja0V2ZW50KGNvbHVtbkN0cmw6IE1nQ29udHJvbEJhc2UsIGRpcmVjdGlvbjogbnVtYmVyLCBjb2x1bW5IZWFkZXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y29sdW1uQ3RybCwgZGlyZWN0aW9uLCAwKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfQ0xJQ0spO1xyXG5cclxuICAgIC8vIFByZXBhcmUgYW4gYXJndW1lbnQgbGlzdCB3aXRoIGFyZ3VtZW50IGFzIGNvbHVtbkhlYWRlclN0cmluZy5cclxuICAgIGxldCBhcmdzTGlzdCA9IG5ldyBBcnJheTxFeHBWYWw+KCk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFLCBmYWxzZSwgY29sdW1uSGVhZGVyKTtcclxuICAgIGxldCBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoYXJnc0xpc3QpO1xyXG4gICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuXHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICBBZGRSb3V0ZUV2ZW50KHRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIsIHJvdXRlcnBhdGg6IHN0cmluZywgcm91dGVyT3V0bGV0TmFtZTogc3RyaW5nLCByb3V0ZVBhcmFtczogTGlzdDxhbnk+KSB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMik7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHJvdXRlcnBhdGgpO1xyXG4gICAgaWYgKHJvdXRlck91dGxldE5hbWUgPT09IG51bGwpXHJcbiAgICAgIHJvdXRlck91dGxldE5hbWUgPSAnJztcclxuICAgIGFyZ3NMaXN0WzFdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgcm91dGVyT3V0bGV0TmFtZSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgcnRFdnQuc2V0Um91dGVQYXJhbUxpc3Qocm91dGVQYXJhbXMpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIEFkZFJvdXRlckNsb3NlZEV2ZW50KHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBzdWJGb3JtQ29udHJvbDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrQmFzZT5zdWJGb3JtQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHN1YkZvcm1Db250cm9sLmdldE5hbWUoKSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3JjVGFza1N0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJnTGlzdFN0clwiPjwvcGFyYW0+XHJcbiAgQWRkTGFzdFNhdmVkUm91dGVFdmVudChzcmNUYXNrOiBUYXNrLCBhcmdzOiBBcmd1bWVudHNMaXN0KSB7XHJcbiAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrQmFzZT5MYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQkNMSUVOVF9ST1VURSk7XHJcblxyXG4gICAgaWYgKHNyY1Rhc2sgIT0gbnVsbCkge1xyXG4gICAgICBydEV2dC5zZXRUYXNrKHNyY1Rhc2spO1xyXG4gICAgICBpZiAoYXJncyAhPSBudWxsKSB7XHJcbiAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQocnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQWRkIGludGVybmFsIGV2ZW50IHJvIHNldCB0aGUgdmFsdWUgb2YgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+IGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlXCI+IHZhbHVlIG9mIGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlZnJlc2hEaXNwbGF5XCI+IHJlZnJlc2ggZGlzcGxheSA8L3BhcmFtPlxyXG4gIEFkZEV4dGVybmFsVmFsdWVFdmVudChjdHJsOiBNZ0NvbnRyb2wsIHZhbHVlOiBhbnksIHJlZnJlc2hEaXNwbGF5OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgMCwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFKTtcclxuICAgIHJ0RXZ0LnNldFZhbHVlKHZhbHVlKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCBmYWxzZSwgcmVmcmVzaERpc3BsYXkgPyAnMScgOiAnMCcpO1xyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBpbiBhIHRhYmxlIGNvbnRyb2wgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kQ29kZUFuZExpbmUoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaW5lLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSBsaW5lIGZvciBtdWx0aWxpbmUgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kTGluZUFuZENvZGVBbmRJc1Byb2R1Y3RDbGljayhjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlciwgaXNQcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaW5lLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuc2V0UHJvZHVjZUNsaWNrKGlzUHJvZHVjZUNsaWNrKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaXN0XCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kQ29kZUFuZExpc3QoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaXN0OiBMaXN0PE1nQ29udHJvbEJhc2U+KTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGlzdCwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgdG8gdGhlIHF1ZXVlIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gdGhlIHRhc2sgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGUodGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPnRhc2ssIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIHRvIHRoZSBxdWV1ZSA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmFpc2VkQnlcIj5yZWxldmFudCBvbmx5IGZvciBvbmxpbmUgKGZvciB3aGljaCBzdWJmb3JtIGFyZSBoYW5kbGVkIGFzIG9ycGhhbnMpPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFRhc2tBbmRDb2RlQW5kUmFpc2VkQnkodGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0YXNrLCBjb2RlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmaXJzdCBldmVudCBmcm9tIHRoZSBxdWV1ZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlcmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX2V2ZW50c1F1ZXVlLnBvbGwoKTtcclxuICB9XHJcblxyXG4gIGdldEZvcmNlRXhpdCgpOiBGb3JjZUV4aXQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlRXhpdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Rm9yY2VFeGl0KGZvcmNlRXhpdDogRm9yY2VFeGl0LCB0YXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb3JjZUV4aXQgPSBmb3JjZUV4aXQ7XHJcbiAgICB0aGlzLnNldEZvcmNlRXhpdFRhc2sodGFzayk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcmNlRXhpdFRhc2soKTogVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VFeGl0VGFzaztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Rm9yY2VFeGl0VGFzayh0YXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb3JjZUV4aXRUYXNrID0gdGFzaztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgRXZlbnRzTWFuYWdlciBpcyBjdXJyZW50bHkgaGFuZGxpbmcgYSB1c2VyIGV2ZW50IHdpdGhcclxuICAgKiBGb3JjZSBFeGl0ID0gJ1ByZS1SZWNvcmQgVXBkYXRlJ1xyXG4gICAqL1xyXG4gIGlzRm9yY2VFeGl0UHJlUmVjb3JkVXBkYXRlKHRhc2s6IFRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCAmJiB0aGlzLmdldEZvcmNlRXhpdCgpID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlICYmIHRhc2sgPT09IHRoaXMuZ2V0Rm9yY2VFeGl0VGFzaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlIENsaWVudENvbnRleHRJbmFjdGl2aXR5IFRpbWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBFeGVjdXRlQ2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdGFydFRpbWUgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG5cclxuICAgIC8vIGNvbnZlcnQgdGVudGhzIG9mIHNlY29uZHMgdG8gbWlsbGlzZWNvbmRzLlxyXG4gICAgbGV0IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0ID1cclxuICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lb3V0KCkgKiAxMDA7XHJcblxyXG4gICAgRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IHRydWU7XHJcbiAgICB3aGlsZSAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTikge1xyXG4gICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoMTAwMCk7XHJcbiAgICAgIHZhciB0aW1lTGFwc2VkID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIHN0YXJ0VGltZTtcclxuICAgICAgaWYgKEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgfHwgdGltZUxhcHNlZCA+PSBjbGllbnRDdHhJbmFjdGl2aXR5VGltZW91dCkge1xyXG4gICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdyBvciBoaWRlIHRoZSBzcGlubmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNob3dcIj4gPC9wYXJhbT5cclxuICBhc3luYyBDaGVja0FuZFNob3dTcGlubmVyKHNob3c6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzZW5kQ29tbWFuZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGV2ZW50IGlzIG9mIGxvd2VzdCBwcmlvcml0eSwgaXQgaXMgYWN0dWFsbHkgc2FmZSB0byBvcGVuIHVzZXIgaW50ZXJhY3Rpb24uXHJcbiAgICAvLyBTbywgc3RvcCB0aGUgc3Bpbm5lci5cclxuICAgIGlmICh0aGlzLmdldExhc3RSdEV2ZW50KCkgIT09IG51bGwgJiYgdGhpcy5nZXRMYXN0UnRFdmVudCgpLmdldFByaW9yaXR5KCkgPT09IFByaW9yaXR5LkxPV0VTVClcclxuICAgICAgc2hvdyA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChzaG93ICE9IHRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgaWYgKHNob3cpIHtcclxuICAgICAgICAvLyBTaG93IHRoZSBzcGlubmVyIG9ubHkgaWYgdGhyZXNob2xkIGlzIHJlYWNoZWQuXHJcbiAgICAgICAgLy9Ub0RvOiBEZWZpbmUgYSBjb25zdCBmb3IgMTAwMC4gQWxzbyBtYWtlIGl0IGN1c3RvbWl6YWJsZSBmcm9tIGFuZ3VsYXIgYXBwXHJcbiAgICAgICAgaWYgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSB0aGlzLkdldEV2ZW50VGltZSgpID4gMTAwMCkge1xyXG4gICAgICAgICAgc2VuZENvbW1hbmQgPSB0cnVlO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHNlbmRDb21tYW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChzZW5kQ29tbWFuZCkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFNob3dTcGlubmVyKHNob3cpO1xyXG4gICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgLy8gcmVsZWFzZSB0aGUgdGhyZWFkIHNvIHRoYXQgZnJhbWV3b3JrIGNhbiBzaG93L2hpZGUgdGhlIHNwaW5uZXJcclxuICAgICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoNTApO1xyXG5cclxuICAgICAgICB0aGlzLmlzU3Bpbm5lclNob3duID0gc2hvdztcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzU3Bpbm5lclNob3duKSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHRpbWUgZm9yIHdoaWNoIGNsaWVudCB3YXMgYnVzeVxyXG4gICAgICAgICAgbGV0IHRvdGFsQ2xpZW50QnVzeVRpbWUgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0O1xyXG4gICAgICAgICAgdGhpcy5TcGlubmVyU3RvcHBlZC5uZXh0KHRvdGFsQ2xpZW50QnVzeVRpbWUpO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWluIGV2ZW50cyBsb29wLCBydW5zIGluIHdvcmtlciB0aHJlYWQgZm9yIG1haW4gd2luZG93IGFuZCBmb3IgZXZlcnlcclxuICAvLy8gICBtb2RhbCB3aW5kb3cgUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0RhdGFcIj4gPC9wYXJhbT5cclxuICBhc3luYyBFdmVudHNMb29wKG1nRGF0YTogTUdEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZWRBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSB0aGlzLmdldEFsbG93RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICB3aGlsZSAoIW1nRGF0YS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgIC8vIEhpZGUgdGhlIHNwaW5uZXIgYmVmb3JlIG1vdmluZyB0byBpZGxlXHJcbiAgICAgIGF3YWl0IHRoaXMuQ2hlY2tBbmRTaG93U3Bpbm5lcihmYWxzZSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLl9ldmVudHNRdWV1ZS53YWl0Rm9yRWxlbWVudCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ0RhdGEsIDApO1xyXG5cclxuICAgICAgaWYgKCFtZ0RhdGEuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFya2FiaWxpdHkoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKHNhdmVkQWxsb3dFdmVudHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE5vbiBpbnRlcmFjdGl2ZSBldmVudHMgbG9vcCwgcnVucyBpbiB3b3JrZXIgdGhyZWFkIGZvciBub24gaW50ZXJhY3RpdmUgdGFza3NcclxuICAvLy8gICBSZXNwb25zaWJsZSBmb3IgY3ljbGluZyBmb3J3YXJkIG9uIHJlY29yZHMgYW5kIGhhbmRsaW5nIGV2ZW50cy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdEYXRhXCI+PC9wYXJhbT5cclxuICBhc3luYyBOb25JbnRlcmFjdGl2ZUV2ZW50c0xvb3AobWdEYXRhOiBNR0RhdGEsIHRhc2tCYXNlOiBUYXNrQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50YXNrQmFzZTtcclxuICAgIGxldCBzYXZlZEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IHRoaXMuZ2V0QWxsb3dFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnNldE5vbkludGVyYWN0aXZlQWxsb3dFdmVudHMoYXdhaXQgdGFzay5pc0FsbG93RXZlbnRzKCkpO1xyXG5cclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICB3aGlsZSAoIW1nRGF0YS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfREVMRVRFX1JFQyk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9SRUMpO1xyXG5cclxuICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDEwKTtcclxuXHJcbiAgICAgIC8vIHBvbGwgb25seSAxIGV2ZW50LlxyXG4gICAgICBpZiAoIW1nRGF0YS5Jc0Fib3J0aW5nICYmIGF3YWl0IHRhc2suaXNBbGxvd0V2ZW50cygpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nRGF0YSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKHNhdmVkQWxsb3dFdmVudHMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGJhc2VNZ0RhdGE6IE1HRGF0YSwgZXZlbnRzVG9IYW5kbGVDbnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhoYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYjogYW55LCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKChiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiA9PT0gbnVsbCB8fCBiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiBpbnN0YW5jZW9mIE1HRGF0YSkgJiYgKGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCA9PT0gbnVsbCB8fCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQuY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHNfMChiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHNfMShiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYW5kIHJlbW92ZSBldmVudHMgZnJvbSB0aGUgcXVldWUgYW5kIGhhbmRsZSB0aGVtIG9uZSBieSBvbmUgdGlsbCB0aGUgcXVldWUgaXMgZW1wdHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmFzZU1nRGF0YVwiPiBtZ2RhdGEgb2YgdGhlIHdpbmRvdyB0aGF0IG9wZW5lZGVkIHRoYXQgaGFiZGxlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkV2ZW50c1RvSGFuZGxlQ250XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV2ZW50c18wKGJhc2VNZ0RhdGE6IE1HRGF0YSwgZXZlbnRzVG9IYW5kbGVDbnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGRlbHRhOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV2ZW50c1BvbGxlZENudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG5cclxuICAgIC8vIGdldCBhbmQgcmVtb3ZlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSB0aWxsIGl0cyBlbXB0eVxyXG4gICAgd2hpbGUgKCF0aGlzLl9ldmVudHNRdWV1ZS5pc0VtcHR5KCkgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgKGV2ZW50c1RvSGFuZGxlQ250ID09PSAwIHx8IGV2ZW50c1BvbGxlZENudCA8IGV2ZW50c1RvSGFuZGxlQ250KSkge1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IHRoaXMuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSkge1xyXG4gICAgICAgIGRlbHRhID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB0aGlzLl9jdXJyS2JkSXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBibG9ja2VkQnlNb2RhbFdpbmRvdzogYm9vbGVhbiA9IHJ0RXZ0LmlzQmxvY2tlZEJ5TW9kYWxXaW5kb3coYmFzZU1nRGF0YSk7XHJcbiAgICAgICAgaWYgKGJsb2NrZWRCeU1vZGFsV2luZG93ICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVElNRVIpIC8vIFFDUiAjNzI2MTk4LCBldmVudHMgZnJvbSAuTkVUIG9iamVjdHMgd2hpY2ggYXJlIG5vdCBvbiBmb3JtXHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIGhhbmRsZWQgb24gcGFyZW50IG9mIG1vZGFsIHdpbmRvdyBhbHNvXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZGxlIHRpbWVyLCB0aW1lciBldmVudHMgYW5kIGVuYWJsZS9kaXNhYmxlIGV2ZW50cyBzaG91bGQgbm90IGNoYW5nZSB0aGUgY3VycmVudCB3aW5kb3cuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBjdXJyZW50IHdpbmRvdyBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IHRhc2sgYW5kIGNoYW5naW5nIHRoZSB0YXNrXHJcbiAgICAgICAgLy8gY2F1c2VzIHNvbWUgdGFzay1zY29wZWQgZXZlbnRzIHRvIHJ1biBvbiBzdWItdGFza3MgYXMgd2VsbC5cclxuICAgICAgICBpZiAoIXJ0RXZ0LmlzSWRsZVRpbWVyKCkgJiYgIWJsb2NrZWRCeU1vZGFsV2luZG93ICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5BQkxFX0VWRU5UUyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RJU0FCTEVfRVZFTlRTICYmIHJ0RXZ0LmdldFRhc2soKSAhPT0gbnVsbCAmJiAhcnRFdnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpLklzQWJvcnRpbmcpIHtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gcnRFdnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpLkdldElkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBjdXJyTWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpIHtcclxuICAgICAgICB3aGlsZSAoY3Vyck1nZCAhPT0gbnVsbCAmJiBjdXJyTWdkLklzQWJvcnRpbmcpIHtcclxuICAgICAgICAgIGN1cnJNZ2QgPSBjdXJyTWdkLmdldFBhcmVudE1HZGF0YSgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpXHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNZ0RhdGFJZHgoY3Vyck1nZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8qIFFDUnMgIzc3NzIxNyAmICM5NDI5NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSXQgbWlnaHQgaGFwcGVuIHRoYXQgd2UgaGF2ZSByZW1vdmVkIHRoZSBNR0RhdGEgICAgKi9cclxuICAgICAgICAvKiBmcm9tIHRoZSBNR1RhYmxlIGluIE1hbmFnZXIuQ2xvc2VFdmVudCgpLiAgKi9cclxuICAgICAgICAvKiBJdCB3YXMgZG9uZSBmb3IgZml4aW5nIFFDUiMgMjk2Mjc3IHJlbGF0aW5nIHRvIG1lbSAqL1xyXG4gICAgICAgIC8qIGxlYWtzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBtZ2Qgd291bGQgYmUgbnVsbCBoZXJlLiAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJbiBzdWNoIGEgc2NlbmFyaW8sIHRha2UgdGhlIHBhcmVudCBtZ2QgZnJvbSB0aGUgICAqL1xyXG4gICAgICAgIC8qIHJlbGF0ZWQgdGFzayBhbmQgY29udGludWUgcHJvY2Vzc2luZyB0aGUgZXZlbnRzLiAgICovXHJcbiAgICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgICB3aGlsZSAoY3Vyck1nZCA9PT0gbnVsbCAmJiB0YXNrICE9PSBudWxsICYmIHRhc2suZ2V0UGFyZW50KCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgY3Vyck1nZCA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICAgICAgICBpZiAoY3Vyck1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgICAgICBjdXJyTWdkID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbClcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1nRGF0YUlkeChjdXJyTWdkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGN1cnJNZ2QgPT09IG51bGwpXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VGFzaygpID09PSBudWxsKSB7XHJcbiAgICAgICAgdGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICB3aGlsZSAodGFzayAhPT0gbnVsbCAmJiAodGFzay5pc0Fib3J0aW5nKCkgfHwgdGFzay5JbkVuZFRhc2spKVxyXG4gICAgICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgICAgIHJ0RXZ0LnNldFRhc2sodGFzayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuZXhlY0d1aUNvbW1hbmRRdWV1ZSgpO1xyXG4gICAgICB0aGlzLl9jdXJyQ3RybCA9IG51bGw7IC8vIGRlbGV0ZSBjdXJyZW50IHByb2Nlc3NlZCBjb250cm9sXHJcblxyXG4gICAgICBpZiAodGFzayAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLlNlbmRNb25pdG9yT25seSgpO1xyXG4gICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5TZW5kTW9uaXRvck9ubHkoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSkge1xyXG4gICAgICAgIC8vIGxvZ2dpbmcgZm9yIHBlcmZvcm1hbmNlXHJcbiAgICAgICAgaWYgKGRlbHRhID4gMCkge1xyXG4gICAgICAgICAgZGVsdGEgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gZGVsdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhZHZhbmNlIEV2ZW50c1BvbGxlZCBvbmx5IGlmIHRoZSBldmVudCBpcyBpbnRlcm5hbC4gb3RoZXJ3aXNlIGludGVybmFscyB0byBiZSBleGVjdXRlZCB3aWxsIGJlIG5ldmVyIHJlYWNoZWQgYnkgbm9uIGludGVyYWN0aXZlIHRhc2tzLlxyXG4gICAgICBpZiAoZXZlbnRzVG9IYW5kbGVDbnQgPiAwICYmIHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQpXHJcbiAgICAgICAgZXZlbnRzUG9sbGVkQ250Kys7XHJcbiAgICB9IC8vIHdoaWxlICghX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSAuLi5cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHN0b3AgZXhlY3V0aW9uIHdoaWxlIGV4ZWN1dGluZyBhbnkgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVN0b3BFeGVjdXRpb24ocnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN0b3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgcmV0dXJuIHN0b3A7XHJcblxyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3VyckN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgbGV0IGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIHN3aXRjaCAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgLy8gQW4gZXJyb3IgaW4gdGhlIHJlY29yZCBwcmVmaXggc2VuZHMgdXMgcmlnaHQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZCBwcmVmaXguXHJcbiAgICAgICAgICAvLyBJdCBtaWdodCBjcmVhdGUgYW4gZW5kbGVzcyBsb29wIGJ1dCBpdCBpcyBPSyB0byBkbyBzby4gSXQgaXMgYSBkZXZlbG9wZXIgYnVnLlxyXG4gICAgICAgICAgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAvLyBpdCB3aWxsIGJlIGhhbmRsZWQgaW4gY29tbW9uaGFuZGxlcmFmdGVyXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICAvLyBFcnJvciBtaWdodCBoYXZlIG9jY3VycmVkIGluIENQLlxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgLy8gb25seSBmb3IgdGhlIGZpcnN0IHRpbWVcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGFzay5zZXRDdXJyRmllbGQobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXNldCB0aGUgc3RvcCBleGVjdXRpb24gY3RybFxyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKGN1cnJDdHJsKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENQIGdvdCBzdG9wIGV4ZWN1dGlvbiB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbnMgaW4gdGhpcyBoYW5kbGVyIGFuZCBpcyBwYXJrYWJsZS5cclxuICAgICAgICAgICAgLy8gd2UgbW92ZSB0byB0aGUgTGFzdFBhcmthYmxlIGNvbnRyb2xcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0Q3VyckZpZWxkKGxhc3RQYXJrZWRDdHJsLmdldEZpZWxkKCkpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGxhc3RQYXJrZWRDdHJsLCAtMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAvLyBJdCBtdXN0IGJlIHNldCB0byBmYWxzZSBzbyB0aGF0IG5leHQgdGltZSBmb3IgZmFzdCBtb2RlIENTIG11c3QgYmUgZXhlY3V0ZWQuXHJcbiAgICAgICAgICBjdXJyQ3RybC5zZXRJbkNvbnRyb2xTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbmRUYXNrRHVlVG9WZXJpZnlFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgY2FyZSBvZiBcIkZvcmNlIEV4aXRcIiBiZWZvcmUgdGhlIGhhbmRsZXIgZXhlY3V0ZSBpdHMgb3BlcmF0aW9ucyByZXR1cm5zIHRydWVcclxuICAvLy8gICBpZiB0aGUgZm9yY2UgZXhpdCB3YXMgaGFuZGxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudFwiPnRoZSBldmVudCBvZiB0aGUgaGFuZGxlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgcnVuLXRpbWUgZXZlbnRcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvcmNlRXhpdEJlZm9yZShldnQ6IEV2ZW50LCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBldnQuVXNlckV2dC5Gb3JjZUV4aXQ7XHJcbiAgICBsZXQgaXNOZXdSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBvbGRJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gVE9ETzogY2hlY2sgdGhlIGVmZmVjdCBvZiByZW1vdmluZyBmb3JjZUV4aXQgPT09IDxGb3JjZUV4aXQ+MFxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0Lk5vbmUgfHwgcnRFdnQuaXNJbW1lZGlhdGUoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IHRydWU7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBvbGRSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgaWYgKG9sZFJlYyAhPT0gbnVsbCAmJiBvbGRSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIG9sZFJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgIGlzTmV3UmVjID0gdHJ1ZTtcclxuICAgICAgb2xkSWR4ID0gb2xkUmVjLmdldElkKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuRWRpdGluZyAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICBpZiAoY3RybCAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNob3VsZCB3ZSBleGl0IHRoZSByZWNvcmQ/XHJcbiAgICBpZiAoKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSB8fCBmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlKSAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAvLyBJZiB3ZSBmYWlsZWQgZXhpdGluZyBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkIC0gcmVzdG9yZSBpbnNlcnQgbW9kZSBvZiB0aGUgcmVjb3JkXHJcbiAgICAgIGlmIChjdXJyUmVjICE9PSBudWxsICYmIHRoaXMuX3N0b3BFeGVjdXRpb24gJiYgaXNOZXdSZWMgJiYgb2xkSWR4ID09PSBjdXJyUmVjLmdldElkKCkgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgLy8gcmVzdG9yZSBpbnNlcnQgbW9kZSBvZiB0aGUgcmVjb3JkXHJcbiAgICAgICAgY3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICBjdXJyUmVjLnJlc3RhcnQoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiAjMzAzNzYyIC0gYWRkaXRpb25hbCBzdXBwb3J0IGZvciBmb3JjZUV4aXQgPSBlZGl0aW5nXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBsZXQgZXZ0Q3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG5cclxuICAgICAgaWYgKGV2dEN0cmwgIT09IG51bGwgJiYgZXZ0Q3RybC5nZXRGaWVsZCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGN0cmxWYWw6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3RybFZhbChldnRDdHJsKTtcclxuICAgICAgICAvLyB0ZXN0IHRoZSBuZXcgY29udHJvbCB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IGV2dEN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZShjdHJsVmFsLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSBjYXJlIG9mIFwiRm9yY2UgRXhpdFwiIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW4tdGltZSBldmVudCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9yY2VFeGl0QWZ0ZXIocnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcmNlRXhpdDogRm9yY2VFeGl0ID0gcnRFdnQuVXNlckV2dC5Gb3JjZUV4aXQ7XHJcblxyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcblxyXG4gICAgLy8gUUNSIzc3NjI5NTogZm9yIHByZSByZWNvcmQgdXBkYXRlLCBjb21taXQgdGhlIHJlY29yZCBhZnRlciBoYW5kbGVyJ3MgZXhlY3V0aW9uLlxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFJlY29yZCh0YXNrLCB0cnVlKTtcclxuICAgICAgaWYgKCF0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gYWZ0ZXIgdGhlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0FGVEVSKSlcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIHBvc3QtcmVjb3JkIHR5cGUgd2UgYWxyZWFkeSBkaWQgcmVjLXByZWZpeCBhbmQgY3RybCBwcmVmaXggaW4gdGhlIGhhbmRsZUZvcmNlRXhpdEJlZm9yZVxyXG4gICAgaWYgKGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUpIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgaWYgKGN0cmwgIT09IG51bGwgJiYgZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiA4MDE4NzMgLSB1cGRhdGUgdGhlIGRpc3BsYXkgYWZ0ZXIgaGFuZGxlciBvZiBmb3JjZSBleGl0IGVkaXRpbmdcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGxldCBldnRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcbiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgY29udHJvbCB0aGF0IGlzIGF0dGFjaGVkIHRvIGEgZmllbGRcclxuICAgICAgaWYgKGV2dEN0cmwgIT09IG51bGwgJiYgZXZ0Q3RybC5nZXRGaWVsZCgpICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0ICg8RmllbGQ+ZXZ0Q3RybC5nZXRGaWVsZCgpKS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYSBzcGVjaWFsIHJvdXRpbmUgdG8gaGFuZGxlIGRhdGEgYW5kIHRpbWVyIGV2ZW50c1xyXG4gIC8vLyAgIGl0IHJlY2VpdmVzIGEgSGFuZGxlcnNUYWJsZSBhbmQgZXhlY3V0ZSB0aGVtIG9uZSBieSBvbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcnNUYWJcIj50aGUgaGFuZGxlcnMgdGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj5hIHJlZmVyZW5uY2UgdG8gdGhlIHRpbWVyIHJ1bnRpbWUgZXZlbnQgLSBmb3IgZXhwcmVzc2lvbiBldmVudHMgaXQgbXVzdCBiZSBudWxsPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV2ZW50c18xKGhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlLCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGhhbmRsZXJzVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IGhhbmRsZXJzVGFiLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgICAgLy8gdGhlIHJ0RXZ0IGlzIHVzZWQgdG8gcGFzcyB0aGUgY3RybCwgdGhlcmVmb3IgaXQgbXVzdCBiZSB2YWxpZCAobm90IG51bGwpXHJcbiAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OIHx8IGhhbmRsZXIuaXNTcGVjaWZpY0hhbmRsZXJPZihydEV2dCkgfHwgaGFuZGxlci5pc05vblNwZWNpZmljSGFuZGxlck9mKHJ0RXZ0KSB8fCBoYW5kbGVyLmlzR2xvYmFsSGFuZGxlck9mKHJ0RXZ0KSkge1xyXG4gICAgICAgICAgYXdhaXQgaGFuZGxlci5leGVjdXRlKHJ0RXZ0LCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGFrZXMgY2FyZSBvZiBrZXlkb3duIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIHByZXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwia2JkSXRlbVwiPmtleWJvcmQgaXRlbTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVLZXlEb3duKHRhc2s6IFRhc2ssIGN0cmw6IE1nQ29udHJvbCwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBrYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBldnQuZ2V0S2JkSXRtQWx3YXlzKCk7XHJcbiAgICBsZXQga2V5Q29kZTogbnVtYmVyID0ga2JkSXRlbS5nZXRLZXlDb2RlKCk7XHJcbiAgICB0aGlzLl9jdXJyS2JkSXRlbSA9IGtiZEl0ZW07XHJcblxyXG4gICAgLy8gSWYga2V5Ym9hcmQgYnVmZmVyaW5nIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGV2ZW50LCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHJpZ2h0IGNvbnRyb2wgdG8gcmVjZWl2ZVxyXG4gICAgLy8gdGhpcyBldmVudFxyXG4gICAgaWYgKGV2dC5JZ25vcmVTcGVjaWZpZWRDb250cm9sKSB7XHJcbiAgICAgIGN0cmwgPSB0aGlzLmdldEN1cnJDdHJsKCk7XHJcbiAgICAgIHRhc2sgPSAoKChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgaW5zdGFuY2VvZiBUYXNrKSA/IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSA6IG51bGwpKTtcclxuICAgICAgLy8gVGhlIGNvbnRyb2wgcmVjZWl2aW5nIGtleXMgZnJvbSBrZXlib2FyZCBidWZmZXJpbmcgbXVzdCBiZSBhIHRleHRib3hcclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVClcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ1N0YXJ0IGhhbmRsaW5nIEtFWURPV04gZXZlbnQuIEtleSBjb2RlOiAnICsga2V5Q29kZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIC8vIERPV04gb3IgVVAgaW52b2tlZCBvbiBhIFNFTEVDVC9SQURJTyBjb250cm9sXHJcbiAgICAgIGlmICh0aGlzLl9jdXJyS2JkSXRlbS5lcXVhbHModGhpcy5LQklfRE9XTikgfHwgdGhpcy5fY3VycktiZEl0ZW0uZXF1YWxzKHRoaXMuS0JJX1VQKSkge1xyXG4gICAgICAgIGlmIChjdHJsICE9PSBudWxsICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTykpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrLCBjdHJsKTtcclxuICAgICAgcnRFdnQuc2V0U3lzdGVtKHRoaXMuX2N1cnJLYmRJdGVtKTtcclxuICAgICAgcnRFdnQuc2V0RWRpdFBhcm1zKGV2dC5nZXRTdGFydFNlbGVjdGlvbigpLCBldnQuZ2V0RW5kU2VsZWN0aW9uKCksIGV2dC5nZXRWYWx1ZSgpKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsICYmIE1nQ29udHJvbC52YWxpZFJldHVyblRvQ3RybCgpKVxyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIE1HRGF0YSBpcyBzdGlsbCBhbGl2ZSBhZnRlciBoYW5kbGluZyB0aGUgZXZlbnRzIGFib3ZlXHJcbiAgICAgIGlmIChtZ2QgIT09IG51bGwgJiYgIW1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhwcmVzc2lvbkhhbmRsZXJzKCk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdFbmQgaGFuZGxpbmcgS0VZRE9XTiBldmVudC4gS2V5IGNvZGU6ICcgKyBrZXlDb2RlKTtcclxuICAgICAgLy8gaWYgYSBrZXkgd2FzIHByZXNzZWQgb24gdGFibGUgY2hpbGQsIG1ha2Ugc3VyZSB0aGF0IGlzIGlzIHZpc2libGVcclxuICAgICAgaWYgKGN0cmwgIT09IG51bGwgJiYgY3RybC5Jc1JlcGVhdGFibGUgJiYgY3RybCA9PT0gTWdDb250cm9sLlJldHVyblRvQ3RybCkge1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkhhbmRsZSBTZWxlY3Rpb24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVwiPnZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgdmFsOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QpIHtcclxuICAgICAgbGV0IGNoZWNrRm9jdXM6IGJvb2xlYW4gPSAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCk7XHJcbiAgICAgIGxldCBhbGxvd1NlbGVjdGlvbjogYm9vbGVhbiA9IChjaGVja0ZvY3VzID8gKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMYXN0UGFya2VkQ3RybCgpID09PSBjdHJsKSA6IHRydWUpO1xyXG5cclxuICAgICAgaWYgKCFhbGxvd1NlbGVjdGlvbiB8fCAhY3RybC5pc01vZGlmaWFibGUoKSB8fCAhYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNEaWZmZXJlbnRWYWx1ZSh2YWwsIGN0cmwuSXNOdWxsLCB0cnVlKSkge1xyXG4gICAgICAgICAgLy8gIzkzMTU0NSAtIHZhciBjaGFuZ2UgbXVzdCBiZSBpbnZva2VkIGZpcnN0IGJlZm9yZSBjb250cm9sIHZlcmlmaWNhdGlvbi5cclxuICAgICAgICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDdHJsTW9kaWZ5KGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT04pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIEZvciBtdWx0aXBsZSBzZWxlY3Rpb24gTGlzdEJveCB2YWx1ZSB0byBmaWVsZCBhbmQgY3RybCB3b3VsZCBiZSBzZXQgb24gbGVhdmluZ1xyXG4gICAgICAgIC8vIGNvbnRyb2wsIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCBzdWZmaXguIFNvIHZhcmlhYmxlIGNoYW5nZSBpbnRlcm5hbCBldmVudCB3b3VsZCBiZVxyXG4gICAgICAgIC8vIGhhbmRsZWQgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC5cclxuICAgICAgICBpZiAoIWN0cmwuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKSlcclxuICAgICAgICAgIGF3YWl0IGN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIE1vdXNlIFVwIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250b2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIG9mIG11bHRpbGluZSBjb250cm9sXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9kdWNlQ2xpY2tcIj5pZiB0cnVlLCBwcm9kdWNlIGNsaWNrIGV2ZW50XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNb3VzZVVwKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSICMgNjE0NCBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIF9jdXJyQ2xpY2tlZFJhZGlvIG1lbWJlclxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pXHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZFJhZGlvID0gY3RybDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKCFhd2FpdCBjdHJsLmNoZWNrUHJvcFdpdGhMaW5lKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUsIGxpbmUpKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRoaXMuY2FuR29Ub0NvbnRyb2woY3RybCwgdHJ1ZSk7XHJcbiAgICAgICAgbGV0IFN0b3BGb2N1czogYm9vbGVhbiA9IGN0cmwuaXNGb2N1c2VkU3RvcEV4ZWN1dGlvbigpO1xyXG5cclxuICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG5cclxuICAgICAgICBpZiAoKCFjYW5Hb3RvQ3RybCB8fCAoKHRoaXMuX3N0b3BFeGVjdXRpb24gfHwgU3RvcEZvY3VzKSAmJiByZXR1cm5Ub0N0cmwgIT09IGN0cmwpKSAmJiByZXR1cm5Ub0N0cmwgIT09IG51bGwpIHtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnJldHVyblRvQ3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbiB8fCBTdG9wRm9jdXMpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChwcm9kdWNlQ2xpY2sgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUKSkge1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX0NMSUNLKTtcclxuICAgICAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZFJhZGlvID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIENoZWNrIGlmIGN0eCBpcyByZW1vdmVkIGZyb20gc2VydmVyLCBpZiBzbyBhbmQgY3VycmVudCBldmVudCBpcyByb3V0ZSBldmVudCAsIHRoZW4gc2F2ZSBpdFxyXG4gIC8vICB0byBleGVjdXRlIGFnYWluIHdoZW4gIHNlcnZlciBjdHggaXMgcmVjcmVhdGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIoYVJ0RXZ0OiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoYVJ0RXZ0LmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIGFSdEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PVxyXG4gICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFICYmIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5zZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KGFSdEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIEZvY3VzIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgb2YgbXVsdGlsaW5lIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25DbGlja1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb2N1cyhjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgb25DbGljazogYm9vbGVhbiwgc2hvdWxkSGFuZGxlWm9vbTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIGlmIChjdHJsLmlzU3RhdGljKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gSWYgd2UgYXR0ZW1wdCB0byBwYXJrIG9uIGNvbnRyb2wgd2hlcmUgd2UgZG8gbm90IHdhbnQgdG8gYWxsb3cgdG8gcGFyayBsaWtlIGlmIGNvbnRyb2wgaGFzIGV4cHJlc3Npb24gb3IgcGFyZW50IHRhc2sgZmllbGQsIGRvIG5vdCBhbGxvdyB0byBmb2N1cyBvbiBpdC5cclxuICAgICAgLy8gU2V0IEZvY3VzIGJhY2sgdG8gbGFzdEZvY3VzZWRDb250cm9sLiBXZSBuZWVkIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgYXMgd2UgZ2V0IGZvY3VzIGV2ZW50IG9uIGEgY29udHJvbCB0d2ljZS4gU28gdG8gYXZvaWQgdG8gc2hvdyBlcnJvciBtdWx0aXBsZSB0aW1lcyxcclxuICAgICAgLy8gbWFpbnRhaW4gX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbC5cclxuICAgICAgaWYgKGN0cmwgIT09IHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCAmJiBjdHJsLkhhc0V4cE9yUGFyZW50VGFza0ZpZWxkKCkpIHtcclxuICAgICAgICAvLyBTaG93IGVycm9yIG9ubHkgZm9yIGNvbnRyb2xzIGhhdmluZyBEYXRhIHByb3BlcnR5IGFuZCBwYXJrYWJsZVxyXG4gICAgICAgIGlmIChjdHJsLmlzTGlzdEJveCgpIHx8IGN0cmwuaXNDaGVja0JveCgpIHx8IGN0cmwuaXNDb21ib0JveCgpIHx8IGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coTlN0cmluZy5Gb3JtYXQoJ0NvbnRyb2wgZWl0aGVyIGhhcyBleHByZXNzaW9uIG9yIGhhcyBwYXJlbnQgdGFzayB2YXJpYWJsZSBhdHRhY2hlZCB0byBpdC4gRmFpbGVkIHRvIHBhcmsgb24gY29udHJvbCB3aXRoIG5hbWU6IHswfScsIGN0cmwuTmFtZSkpO1xyXG4gICAgICAgICAgLy8gRGVmZWN0IDE1MjcyODogVXNlIGxhc3QgZm9jdXNlZCB0YXNrIGluc3RlYWQgY29udHJvbCB0YXNrIGFzIGNvbnRyb2wgY2FuIGJlIGZyb20gc3ViZm9ybS5cclxuICAgICAgICAgIEZvY3VzTWFuYWdlci5TZXRGb2N1cyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSwgMCxcclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpID09PSBudWxsID8gdHJ1ZSA6IGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCA9IGN0cmw7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgICAgaWYgKG9uQ2xpY2spXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IGN0cmw7XHJcblxyXG4gICAgICBsZXQgcHJldkN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGN0cmwgPT09IHByZXZDdHJsICYmICFjdHJsLmlzUmVwZWF0YWJsZSgpKSB7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgICAgLy8gd2UgcmVjZWl2ZWQgZm9jdXMgdHdpY2VcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVpvb21JZk5lZWRlZChjdHJsLCBsaW5lLCBzaG91bGRIYW5kbGVab29tKTtcclxuICAgICAgICBsZXQgcnRFdm50OiBSdW5UaW1lRXZlbnQgPSB0aGlzLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgaWYgKHJ0RXZudCAhPSBudWxsICYmIHJ0RXZudC5TaG91bGRIYW5kbGVab29tKVxyXG4gICAgICAgICAgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGN0cmwsIC0xKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vY2hlY2sgaWYgbGFzdCB0YXNrIGlzIG9wZW5lZCBpbiBNb2RhbCBTdWJmb3JtLCBpZiB5ZXMsIGNsb3NlIGl0IGJlZm9yZSBmb2N1c3Npbmcgb24gcGFyZW50IHRhc2sncyBjdHJsXHJcbiAgICAgIGxldCBwcmV2VGFzazogVGFzayA9IDxUYXNrPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuXHJcblxyXG4gICAgICBpZiAoY3RybCA9PT0gbnVsbCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKHByZXZDdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICAgIGlmICgoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pICYmICg8UmFpc2VBdD4oYXdhaXQgKGN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVCkpLmdldFZhbHVlSW50KCkpID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKSlcclxuICAgICAgICBjdXJyVGFzayA9IHByZXZUYXNrO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgY3VyclRhc2sgPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0aGlzLmNhbkdvVG9Db250cm9sKGN0cmwsIG9uQ2xpY2spO1xyXG5cclxuICAgICAgLy8gR28gdG8gdGhlIGNvbnRyb2wgLSBpbnNlcnQgcHJlZml4XHJcbiAgICAgIGlmIChjYW5Hb3RvQ3RybCkge1xyXG4gICAgICAgIC8vIE1vZGFsIHN1YmZvcm0gdGFzayBjbG9zaW5nIGhhcyBhbHJlYWR5IGJlZ3VuLiBEbyBub3QgaGFuZGxlIEhhbmRsZVN1YmZvcm1Nb2RhbGl0eSgpIGFnYWluLlxyXG4gICAgICAgIGlmICh0aGlzLmd1aVBlbmRpbmdFdmVudCAhPSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBoYW5kbGVkID0gYXdhaXQgdGhpcy5IYW5kbGVTdWJmb3JtTW9kYWxpdHkoY3RybCwgcHJldlRhc2ssIGN1cnJUYXNrKTtcclxuICAgICAgICBpZiAoaGFuZGxlZClcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGV2ZW50TGluZTogbnVtYmVyID0gKGN0cmwuaXNSZXBlYXRhYmxlKCkgfHwgY3RybC5pc1JhZGlvKCkpID8gbGluZSA6IEludDMyLk1pblZhbHVlO1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBldmVudExpbmUpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByZXZDdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFwcmV2Q3RybC5pc01vZGlmaWFibGUoKSkge1xyXG4gICAgICAgICAgaWYgKHByZXZDdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgICBhd2FpdCBwcmV2Q3RybC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKSkge1xyXG4gICAgICAgICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gTWFuYWdlci5HZXRDdHJsVmFsKHByZXZDdHJsKTtcclxuICAgICAgICAgIGlmICghYXdhaXQgcHJldkN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZShuZXdWYWwsIHRydWUpKVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBwcmV2Q3RybDtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgTWdDb250cm9sLlJldHVyblRvQ3RybCA9PT0gY3RybCl7XHJcbiAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCg8VGFza0Jhc2U+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLCBjdHJsKTtcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVpvb21JZk5lZWRlZChjdHJsLCBsaW5lLCBzaG91bGRIYW5kbGVab29tKTtcclxuICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBjdHJsLnNldEZvY3VzZWRTdG9wRXhlY3V0aW9uKHRoaXMuX3N0b3BFeGVjdXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHN1YmZvcm0gbW9kYWxpdHkgYmVmb3IgZm91Y3NzaW5nIG9uIHBhcmVudCBjdHJsXHJcbiAgLy8vIDEuaWYgY3Vyc29yIGlzIHBhcmtlZCBvbiBtb2RhbCBzdWJmb3JtIHRhc2sgYW5kIHVzZXIgY2xpY2tzIG9uIGl0J3MgcGFyZW50IDogY2xvc2UgdGhlIHN1YmZvcm0gdGFzay5cclxuICAvLy8gMi5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG1vZGFsIHN1YmZvcm0gJ1MyJyB3aGljaCBpcyBvcGVuZWQgaW4gYW5vdGhlciBzdWJmb3JtIG1vZGFsICdTMScsIHRoZW4gY2xpY2tpbmcgb24gIHBhcmVudCdQMSdcclxuICAvLy8gd2lsbCBjbG9zZSBib3RoIFMyIGFuZCBTMS5cclxuICAvLy8gMy5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG5vbiBtb2RhbCBzdWJmb3JtICdTMicgd2hpY2ggaXMgb3BlbmVkIGluIHN1YmZvcm0gbW9kYWwgJ1MxJywgdGhlbiBjbGlja2luZyBvbiBTMSwgd2lsbCBub3QgY2xvc2UgUzJcclxuICAvLy8gYnV0IGNsaWNraW5nIG9uIFAxIHdpbGwgY2xvc2UgYm90aCBTMiBhbmQgUzEuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jdHJsIHRvIGJlIGZvY3Vzc2VkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByZXZUYXNrXCI+cHJldmlvdXMgdGFzayB3aGljaCB3YXMgaW4gZm9jdXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyclRhc2tcIj5jdXJyZW50IHRhc2sgd2hpY2ggaXMgdG8gYmUgZm9jdXNzZWQ8L3BhcmFtPlxyXG5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVN1YmZvcm1Nb2RhbGl0eShjdHJsOiBNZ0NvbnRyb2wsIHByZXZUYXNrOiBUYXNrLCBjdXJyVGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGhhbmRsZWRTdWJmb3JtTW9kYWxpdHkgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBldmFsdWF0ZSB0aGUgY29ycmVjdCBwcmV2VGFzayB0byBiZSBjbG9zZWQgaWYgaXQgaXMgTW9kYWwuXHJcbiAgICAvLyBpZiBuZXdseSBzdWJmb3JtIE1vZGFsIHRhc2sgaXMgb3BlbmVkIGFuZCBpdCBpcyBub3QgeWV0IGZvY3Vzc2VkLCBpbiB0aGF0IGNhc2UgY3VyciB0YXNrIGlzIHNhbWUgYXMgcHJldnRhc2suXHJcbiAgICAvLyBub3cgY2xpY2tpbmcgb24gaXQncyBwYXJlbnQgdGFzaywgc2hvdWxkIGNsb3NlIHRoZSBNb2RhbCBzdWJmb3JtIHRhc2tcclxuICAgIGxldCBsZW5ndGggPSBwcmV2VGFzay5nZXRNR0RhdGEoKS5nZXRUYXNrc0NvdW50KCk7XHJcbiAgICBsZXQgdG9wVGFzazogVGFzayA9IHByZXZUYXNrLmdldE1HRGF0YSgpLmdldFRhc2sobGVuZ3RoIC0gMSk7XHJcbiAgICBpZiAoY3VyclRhc2sgPT0gcHJldlRhc2sgfHwgcHJldlRhc2sgIT0gdG9wVGFzayAvKiBuZXN0ZWQgc3ViZm9ybSAqLykge1xyXG4gICAgICBpZiAodG9wVGFzayAhPSBudWxsICYmIHByZXZUYXNrICE9IHRvcFRhc2sgJiYgdG9wVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dG9wVGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICAgICAgcHJldlRhc2sgPSB0b3BUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2xvc2Ugc3ViZm9ybSB0YXNrIGlzIE1vZGFsIGlmIHRvIGJlIHBhcmtlZCBvbiBwYXJlbnQuXHJcbiAgICBpZiAocHJldlRhc2sgIT0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpICYmIHByZXZUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpIHtcclxuXHJcbiAgICAgIGlmICghY3VyclRhc2suaXNEZXNjZW5kZW50T2YocHJldlRhc2spKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnByZXZUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuSXNNb2RhbCgpICYmICFjdXJyVGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKVxyXG4gICAgICAgICAgc3ViZm9ybUN0cmwgPSBwcmV2VGFzay5HZXRTdWJmb3JtTW9kYWxQYXJlbnRUYXNrKCk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgKGN0cmwgIT0gc3ViZm9ybUN0cmwpICYmIHN1YmZvcm1DdHJsLklzTW9kYWwoKSkge1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVN1YmZvcm1DbG9zZSg8TWdDb250cm9sPnN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSB0aGlzLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgICBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIENhbGxzIENvbnRyb2xzIFN1ZmZpeCB3aGVuIGZvY3VzIG9uIE5vbiBtYWdpYyBjb250cm9sIGkuZS4gY29udHJvbCB3aXRoIE1hZ2ljRHVtbXlDb250cm9sIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9jdXNPbk5vbk1hZ2ljQ29udHJvbChjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBjdHJsLnNldEZvY3VzZWRTdG9wRXhlY3V0aW9uKHRoaXMuX3N0b3BFeGVjdXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByYWlzZSB0aGUgem9vbSBldmVudCBmb3IgdGhlIGNvbnRyb2wsIGlmIHJlcXVpcmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzaG91bGRIYW5kbGVab29tXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVpvb21JZk5lZWRlZChjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgc2hvdWxkSGFuZGxlWm9vbTogYm9vbGVhbik6IFByb21pc2UgPHZvaWQ+e1xyXG4gICAgICBpZiAoc2hvdWxkSGFuZGxlWm9vbSlcclxuICAgICAge1xyXG4gICAgICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGluZSwgdHJ1ZSk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB3ZSBjYW4gZ28gdG8gdGhlIGNvbnRyb2wgYW5kIHRyeSB0byBwYXJrIG9uIGluXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9uQ2xpY2tcIj5yZWFsIGNsaWNrIGlzIHBlcmZvcm1lZCwgdGhpcyBub3QgY2xpY2sgc2ltdWxhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNhbkdvVG9Db250cm9sKGN0cmw6IE1nQ29udHJvbCwgb25DbGljazogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChvbkNsaWNrICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIFY5LjRTUDRkIGNoYW5nZSBvZiBiZWhhdmlvciAtIHdlIGRvIG5vdCBcImV4aXRcIiBmcm9tIHRoZSBjdXJyZW50IGN0cmxcclxuICAgIC8vIChpLmUuIG5vdCBwZXJmb3JtaW5nIGN0cmwgc3VmZml4IG9yIGN0cmwgdmVyaWZpY2F0aW9ucykgaWYgdGhlIHRhcmdldCBjdHJsXHJcbiAgICAvLyBpcyBJTUcgb3IgaHlwZXJ0ZXh0LlxyXG4gICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIC8vIGlmIGNhbmNlbCBpcyByYWlzZWQgLCB0aGVuIGRvIG5vdCBnbyB0byBuZXh0IGNvbnRyb2wgYmVmb3JlIGhhbmRsaW5nIGNhbmNlbCBldmVudC5cclxuICAgIGxldCBsYXN0VGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgIGlmICghY3VyclRhc2suSXNJbnRlcmFjdGl2ZSB8fCAobGFzdFRhc2sgIT0gbnVsbCAmJiBsYXN0VGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9IG51bGwgJiZcclxuICAgICAgbGFzdFRhc2suY2FuY2VsV2FzUmFpc2VkKCkpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0UgJiYgIWN0cmwuSXNSZXBlYXRhYmxlKVxyXG4gICAgICBjYW5Hb3RvQ3RybCA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiBjYW5Hb3RvQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgVGltZXIgRXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnR1bnRpbWUgdGltZXIgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVGltZXIoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGV2dC5zZXRUeXBlKENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpO1xyXG4gICAgaWYgKGV2dC5pc0lkbGVUaW1lcigpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhwcmVzc2lvbkhhbmRsZXJzKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29udGV4dEluYWN0aXZpdHlBbGVydChldnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoZXZ0LmdldE1nZElEKCkpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0VGltZXJIYW5kbGVycygpLCBldnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCBpcyBhYm91dCB0byBleHBpcmUsIHJhaXNlIGEgd2FybmluZyB0byB1c2VyXHJcbiAgLy8gICAgc28gdGhhdCB0aGUgc2Vzc2lvbiBjYW4gYmUgY29udGludWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnR1bnRpbWUgdGltZXIgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ29udGV4dEluYWN0aXZpdHlBbGVydChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRpbWVOb3c6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICBsZXQgbWdkOiBNR0RhdGEgPSBldnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGxhc3RSZXF1ZXN0VGltZTogbnVtYmVyID0gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5HZXRMYXN0UmVxdWVzdFRpbWU7XHJcbiAgICBsZXQgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXIgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSAvIDEwO1xyXG4gICAgbGV0IGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWU6IG51bWJlciA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldENvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUoKSAvIDEwO1xyXG5cclxuICAgIGxldCBpZGxlVGltZSA9ICh0aW1lTm93IC0gbGFzdFJlcXVlc3RUaW1lKSAvIDEwMDA7XHJcblxyXG4gICAgLy8gRGlzcGxheSB0aGUgY29uZmlybWF0aW9uIG9ubHkgZm9yIHZhbGlkIHRpbWVvdXRzXHJcbiAgICBpZiAoY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ID09IDAgfHwgY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKEV2ZW50c01hbmFnZXIudXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgJiYgaWRsZVRpbWUgPj0gKGNvbnRleHRJbmFjdGl2aXR5VGltZW91dCAtIGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUpKSB7XHJcbiAgICAgIC8vIHJhaXNlIGFuIGFsZXJ0IHRvIG5vdGlmeSB1c2VyIHdoZW4gdGhlIGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZFxyXG4gICAgICAvLyBpZiB1c2VyIGNsaWNrcyBvbiBPSywgc2VuZCBkdW1teSByZXF1ZXN0IHRvIHNlcnZlci4gSWYgQ2FuY2VsIGlzIGNsaWNrZWQsIGRvIG5vdGhpbmcuXHJcbiAgICAgIGxldCB1c2VyQ29uZmlybWF0aW9uOiBudW1iZXIgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3godGhpcy5jb25maXJtYXRpb25EaWFsb2dUaXRsZSwgdGhpcy5jb25maXJtYXRpb25EaWFsb2dNc2csIFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OTyk7XHJcbiAgICAgIGlmICh1c2VyQ29uZmlybWF0aW9uID09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX1lFUykge1xyXG4gICAgICAgIC8vIHNlbmQgcmVxdWVzdCB0byBzZXJ2ZXIgdG8gbWFyayB0aGUgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQgdG8gemVyb1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29udGV4dFRpbWVvdXRSZXNldEV2ZW50Q29tbWFuZCgpO1xyXG4gICAgICAgIG1nZC5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgYXdhaXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uT05MWV9DT01NQU5EUyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci51c2VyR3JhbnRlZEZvckNvbnRleHRBY3Rpdml0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJvY2VzcyBleHByZXNzaW9uIGhhbmRsZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBoYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLCBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpO1xyXG4gICAgcnRFdnQuc2V0RXhwcmVzc2lvbihudWxsKTtcclxuICAgIHJ0RXZ0LnNldE1haW5QcmdDcmVhdG9yKHJ0RXZ0LmdldFRhc2soKSk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YShpKTtcclxuICAgICAgaWYgKG1nZCAhPT0gbnVsbCAmJiAhbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHMobWdkLmdldEV4cEhhbmRsZXJzKCksIHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNpemUgb2YgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+dGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93c0luUGFnZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVSZXNpemUoY3RybDogTWdDb250cm9sLCByb3dzSW5QYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5zZXRSb3dzSW5QYWdlKHJvd3NJblBhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBkYXRhIGZvciBSb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPmlmIHRydWUsIHNlbmQgYWxsIHJlY29yZHNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd1wiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUm93RGF0YUN1clBhZ2UodGFibGU6IE1nQ29udHJvbCwgZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4sIGxhc3RGb2N1c2VkVmFsOiBMYXN0Rm9jdXNlZFZhbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFibGUuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS5zZXRSb3dEYXRhKGRlc2lyZWRUb3BJbmRleCwgc2VuZEFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNmZXJzIGRhdGEgdG8gR1VJIHRocmVhZCBpbiBmcmVlIHdvcmtlciB0aHJlYWQgdGltZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVRyYW5zZmVyRGF0YVRvR3VpKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLnRyYW5zZmVyRGF0YVRvR3VpKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmV0Y2hlcyB0aGUgY2h1bmsgZnJvbSBzZXJ2ZXIsXHJcbiAgLy8vICAgSWYgdGhlIGxhc3QgcmVjb3JkcyBpcyBub3QgeWV0IGZldGNoZWQgaXQgZmV0Y2hlcyB0aGUgbmV4dCBjaHVuayxcclxuICAvLy8gICBFbHNlLCBmZXRjaGVzIHRoZSBwcmV2aW91cyBjaHVua1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT5jdHJsLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0uRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgV2hlbiBpbnRlcm5hbCBhY3QgYXNrcyBmb3IgZW5hYmxlL2Rpc2FibGUgb2YgYW4gYWN0IGxpc3QuXHJcbiAgLy8vICAgY2FsbCBlbmFibGVMaXN0IHdpdGggb25seUlmQ2hhbmdlZCA9IHRydWUgdG8gbWluaW1pemUgY2FsbHMgdG9zIHJlZnJlc2guXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuYWJsZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVFbmFibGVFdmVudHMoZXZ0OiBSdW5UaW1lRXZlbnQsIGVuYWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgZXZ0LmdldFRhc2soKS5BY3Rpb25NYW5hZ2VyLmVuYWJsZUxpc3QoZXZ0LmdldEFjdEVuYWJsZUxpc3QoKSwgZW5hYmxlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGVzIGNvbnRyb2wgUHJlZml4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUN0cmxQcmVmaXgoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBjdXJyQ2xpY2tlZEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+UnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybDtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSBldnQuZ2V0RGlzcGxheUxpbmUoKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG5cclxuICAgIGlmIChmb3JtLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICBpZiAoZGlzcGxheUxpbmUgPT09IEludDMyLk1pblZhbHVlIHx8IGN0cmwuaXNSYWRpbygpKVxyXG4gICAgICAgIGRpc3BsYXlMaW5lID0gZm9ybS5EaXNwbGF5TGluZTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBkaXNwbGF5TGluZSA9IEludDMyLk1pblZhbHVlO1xyXG5cclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgIC8vIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSBjb250cm9sXHJcbiAgICAvLyBGb3IgRmFzdCBNb2RlLCBDUyBpcyBleGVjdXRlZCBmcm9tIGhlcmUsIHdoZXJlYXMgZm9yIHN0ZXAgbW9kZSBpdCBpcyBkb25lXHJcbiAgICAvLyBpbiBtb3ZlSW5Sb3cuIHNvLCBmb3Igc3RlcCBtb2RlIGRvdWJsZSBleGVjdXRpb24gb2YgQ1MgbXVzdCBiZSBzdG9wcGVkLlxyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsICYmICg8VGFzaz5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNR0RhdGEoKS5HZXRJZCgpID09PSAoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNR0RhdGEoKS5HZXRJZCgpICYmIGxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICBpZiAoKGN0cmwgIT09IGxhc3RQYXJrZWRDdHJsIHx8IChjdHJsLmlzUmVwZWF0YWJsZSgpICYmIGRpc3BsYXlMaW5lICE9PSBjdHJsLmdldERpc3BsYXlMaW5lKHRydWUpKSkgJiYgIWxhc3RQYXJrZWRDdHJsLmlzSW5Db250cm9sU3VmZml4KCkpXHJcbiAgICAgIC8vIFFDUiAjOTcwODA2XHJcbiAgICAgIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICBjdHJsLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjdHJsLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBUT0RPOiBGb2N1cyAmIFRhYmJpbmc6IEhhbmRsZSBQYXJraW5nIGluIHRoaXMgY2FzZS4gU2hvdWxkIG5vdCByZXR1cm4gZmFsc2UgaW4gc2NyZWVuIG1vZGVcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0YXNrLkluQ3RybFByZWZpeClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHRhc2suSW5DdHJsUHJlZml4ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBtYWtlIHN1cmUgaXQgaGFzIG5vdCBjb21lIGFnYWluIHRocm91Z2ggbW92ZWlucm93LlxyXG4gICAgLy8gZWc6IGlmIGNsaWNrZWQgY3RybCBvbiBzdWJmb3JtIGlzIG5vbiBwYXJrYWJsZSwgZmlyc3QgdGltZSBpdCBleGVjdXRlcyBSUCBDViBmb3Igc3ViZm9ybXMgYW5kIHRoZW5cclxuICAgIC8vIGVudGVycyBtb3ZlaW5yb3cgZm9yIHBhcmthYmxlIGN0cmwuIHdlIHNob3VsZG5vdCBleGVjdXRlIHRoaXMgYmxvY2sgd2hlbiB3ZSBjb21lIGZvciBDUCBvZiBwYXJrYWJsZSBjdHJsLlxyXG4gICAgLy8gRm9yIHRhYiwgd2UgY29tZSBoZXJlIGRpcmVjdGx5IGZvciBwYXJrYWJsZSBjdHJsLCBhbmQgdGhpcyBibG9jayBtdXN0IGFsd2F5cyBleGVjdXRlIGlmIG9uIGRpZmYgZm9ybXMuXHJcbiAgICAvLyBpc1NvcnQgOiBpZiBjbGlja2VkIG9uIHRhYmxlIGhlYWRlciwgd2UgcGFyayBvbiBjb2xvbW4gY3RybCBhZnRlciBzb3J0LCBhbmQgd2UgbXVzdCBpbmNsdWRlIHN1YmZvcm1zXHJcbiAgICAvLyBpbiBleGVjdXRpbmcgQ1ZzXHJcblxyXG4gICAgLy8gVE9ETzogVGFiYmluZyAmIEZvY3VzaW5nOiBDaGVjayBnZXRMYXN0TW92ZUluUm93RGlyZWN0aW9uIGlzIHJlbGV2YW50LiBXaGlsZSBtb3ZpbmcgYmV0d2VlbiBjb250cm9scyBieSBUYWIgY29kZSBpbiBpZiBibG9jayB3YXMgbm90IGNhbGxlZC5cclxuICAgIC8vIEJ1dCBpdCB3YXMgY2FsbGVkIG9uIGNsaWNrIHRvIGFub3RoZXIgY29udHJvbC5cclxuICAgIC8vaWYgKHRhc2suZ2V0TGFzdE1vdmVJblJvd0RpcmVjdGlvbigpID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTk9ORSB8fCB0aGlzLl9pc1NvcnRpbmcpIHtcclxuXHJcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjdHJsIGlzIG9uIGEgc3ViZm9ybSwgdGhlbiBleGVjdXRlIGluIHNlcXVlbmNlXHJcbiAgICAvLyAxLiBSUyBvZiBuZXN0ZWQgc3ViZm9ybXMgdW50aWwgc3ViZm9ybSB0YXNrIGNvbnRhaW5nIHRoZXNlIDIgc3ViZm9ybXMuIHdlIG11c3QgYWxzbyBleGVjdXRlIFJTIGlmIGNsaWNrZWRcclxuICAgIC8vICAgIGluIHN1YmZvcm0gYW5kIHBhcmtlZCBiYWNrIG9uIGEgY3RybCdzIHRhc2suICgjNzIyMTE1LSBjdXJyQ2xpY2tlZEN0cmwgYW5kIGN0cmwgc2hvdWxkIG5vdCBiZSBvbiBkaWZmZXJlbnQgd2luZG93KVxyXG4gICAgLy8gMi4gQ1YgZXhlY3V0aW9uIG9mIExhc3RQYXJrZWRDdHJsIHRpbGwgZW5kXHJcbiAgICAvLyAzLiBSUC1DVnMgZm9yIGFsbCBpbnRlcm1lZGlhdGUgc3ViZm9ybXNcclxuICAgIGxldCBwcmV2Q3RybDogTWdDb250cm9sID0gbGFzdFBhcmtlZEN0cmw7XHJcbiAgICBpZiAoY3VyckNsaWNrZWRDdHJsICE9PSBudWxsICYmICg8VGFzaz5jdXJyQ2xpY2tlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKSA9PT0gKDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKSAmJiBjdHJsLm9uRGlmZkZvcm0oY3VyckNsaWNrZWRDdHJsKSlcclxuICAgICAgcHJldkN0cmwgPSBjdXJyQ2xpY2tlZEN0cmw7XHJcblxyXG4gICAgaWYgKHByZXZDdHJsICE9PSBudWxsICYmIGN0cmwub25EaWZmRm9ybShwcmV2Q3RybCkpIHtcclxuICAgICAgLy8gUlMgb2YgbmVzdGVkIHN1YmZvcm1zIHVudGlsIHN1YmZvcm0gdGFzayBjb250YW5pbmcgdGhlc2UgMiBzdWJmb3Jtc1xyXG4gICAgICBsZXQgcHJldlRhc2s6IFRhc2sgPSA8VGFzaz5wcmV2Q3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICBhd2FpdCBwcmV2VGFzay5leGVjU3ViZm9ybVJlY1N1ZmZpeCg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICBhd2FpdCBjdHJsLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLmRvU3luY0ZvclN1YmZvcm1QYXJlbnQodGFzayk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXhlY3V0ZSBSUCBvZiB0aGUgY3VycmVudCB0YXNrIGJlZm9yZSBleGVjdXRpbmcgdGhlIENWcyBiZWZvcmUgJ2N0cmwnXHJcbiAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRhc2suU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUztcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGRpc3BsYXlMaW5lKTtcclxuICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vfVxyXG5cclxuICAgIC8vIFFDUiMgODA2MDE1OiBJZiB3ZSBoYXZlIGEgc2luZ2xlIGZpZWxkIHdpdGggYWxsb3cgcGFya2luZyA9IFllcyBhbmQgVGFiIEludG8gPSBObywgdGhlbiBvbiBwcmVzc2luZyB0YWIgaWYgY3Vyc29yIGlzIG5vdCBtb3ZlZCwgd2UgY29tZSB0b1xyXG4gICAgLy8gcGFyayBvbiBsYXN0UGFya2VkQ3RybCh3aGljaCBpcyBzYW1lIGFzIGN0cmwpIHNpbmNlIFRhYkludG8gaXMgbm90IGFsbG93ZWQuXHJcbiAgICAvLyBTbyB0byBhdmFvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCB3ZSBzaG91bGQgbm90IGFnYWluIHRyeSB0byBwYXJrIG9uIGl0LlxyXG4gICAgaWYgKCFhd2FpdCBjdHJsLklzUGFya2FibGUoKSAmJiBjdHJsICE9PSBsYXN0UGFya2VkQ3RybCkge1xyXG4gICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsIHx8ICFhd2FpdCBsYXN0UGFya2VkQ3RybC5pbnZva2UoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2coTlN0cmluZy5Gb3JtYXQoJ3swfSBFbnRlcmluZyBjb250cm9sOiBjb250cm9sIHsxfSwgcm93IHsyfScsIHRhc2suR2V0VGFza0RldGFpbHMoKSwgY3RybC5OYW1lLCBkaXNwbGF5TGluZSA8IDAgPyAwIDogZGlzcGxheUxpbmUpLCB0cnVlKTtcclxuXHJcbiAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcCBleGVjdXRpb24gY3RybCwgd2UgbmVlZCB0byB1c2UgaXQgYXMgYSBzcmN0cmwsIG90aGVyd2lzZSB1c2VcclxuICAgIC8vIHRoZSBjdHJsIG9uIHdoaWNoIHdlIGV4ZWN1dGVkIGxhc3QgQ1MuXHJcblxyXG5cclxuICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCk7XHJcbiAgICBjdHJsLktleVN0cm9rZU9uID0gZmFsc2U7XHJcbiAgICBjdHJsLk1vZGlmaWVkQnlVc2VyID0gZmFsc2U7XHJcblxyXG4gICAgdGFzay5zZXRDdXJyRmllbGQoY3RybC5nZXRGaWVsZCgpKTtcclxuXHJcbiAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGF3YWl0IGZvcm0uYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuXHJcbiAgICAvLyBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBTdWJmb3Jtc1xyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBjdHJsKSB7XHJcbiAgICAgIGlmICgobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgJiYgY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpIHx8IChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCAmJiAoY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkgfHwgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpKSkpIHtcclxuICAgICAgICBsZXQgbGFzdFBhcmtlZFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIGxhc3RQYXJrZWRUYXNrID0gPFRhc2s+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRUYXNrICE9PSB0YXNrKSB7XHJcbiAgICAgICAgICBsZXQgZmlyc3RUaW1lOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBpc1NvblN1YmZvcm06IGJvb2xlYW47XHJcbiAgICAgICAgICBsZXQgcGFyZW50VGFzazogVGFzaztcclxuXHJcbiAgICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gbGFzdFBhcmtlZFRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gbGFzdFBhcmtlZFRhc2s7IHBhcmVudFRhc2sgIT09IG51bGwgJiYgaXNTb25TdWJmb3JtOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICAgIGlmICghZmlyc3RUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBwYXJlbnRUYXNrLklzU3ViRm9ybTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgIGZvciAocGFyZW50VGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7IChwYXJlbnRUYXNrICE9PSBudWxsKSAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50VGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFdoZW5ldmVyIHdlIGFyZSBtb3ZpbmcgYmV0d2VlbiB0YXNrcywgcmUtZXZhbHVhdGUgQWxsb3dNb2Rlcy5cclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlbmFibGUgYWN0aW9ucyBhbmQgc3RhdGVzXHJcbiAgICBpZiAodGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpIHx8IGN0cmwudXNlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgIGN0cmwuU2V0S2V5Ym9hcmRMYW5ndWFnZSgpO1xyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OLCB0cnVlKTtcclxuICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICBpZiAoZmllbGQgIT09IG51bGwgJiYgZmllbGQuTnVsbEFsbG93ZWQgJiYgY3RybC5pc01vZGlmaWFibGUoKSAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEwsIHRydWUpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYW5kIHJldHVybiB0cnVlIHRvIHRlbGwgdGhlIGNhbGxlclxyXG4gIC8vLyAgIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRlbGxzIHRoZSBjYWxsZXIgd2hldGhlciB0byBjb250aW51ZSBoYW5kbGluZyB0aGUgZXZlbnQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQmVmb3JlKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZXZ0U2F2ZTogUnVuVGltZUV2ZW50ID0gZXZ0O1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBwcmV2UmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHZhbDogc3RyaW5nO1xyXG4gICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSkge1xyXG4gICAgICBsZXQgYWN0SWQ6IG51bWJlciA9IHRoaXMuZ2V0TWF0Y2hpbmdBY3Rpb24oZXZ0LmdldEtiZEl0bSgpKTtcclxuICAgICAgaWYgKGFjdElkICE9PSAwICYmIGV2dC5Db250cm9sICE9PSBudWxsKVxyXG4gICAgICAvLyAmJiBhY3RJZCAhPSBNR19BQ1RfU0VMRUNUKVxyXG4gICAgICB7XHJcbiAgICAgICAgZXZ0ID0gbmV3IFJ1blRpbWVFdmVudChldnQsIGV2dCk7XHJcbiAgICAgICAgZXZ0LnNldEludGVybmFsKGFjdElkKTtcclxuICAgICAgICBldnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgICAgIGV2dFNhdmUuc2V0Q3RybChtZ0NvbnRyb2wpO1xyXG4gICAgICAgIGlmIChtZ0NvbnRyb2wgPT09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IjIDkzOTI1MyAtIHdlIGhhdmUgdG8gcHJvY2VzcyBjb21tb25IYW5kbGVyQmVmb3JlIGV2ZW4gZm9yIGludGVybmFsIGV2ZW50IGNvbnZlcnRlZFxyXG4gICAgLy8gZnJvbSBzeXN0ZW0gRXZlbnRcclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG5cclxuICAgICAgbGV0IGxhc3RGb2N1c2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgICAgLy8gZm9yIGludGVybmFsIGV2ZW50c1xyXG4gICAgICBzd2l0Y2ggKGludEV2dENvZGUpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NOlxyXG4gICAgICAgICAgbGV0IGJvb2x2YWwgPSBhd2FpdCB0aGlzLnNlbGVjdFByb2coY3RybCk7XHJcbiAgICAgICAgICBpZiAoYm9vbHZhbClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9GT0NVUzpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpLCBldnQuU2hvdWxkSGFuZGxlWm9vbSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfRk9DVVNfT05fTk9OX01BR0lDX0NPTlRST0w6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvY3VzT25Ob25NYWdpY0NvbnRyb2woY3RybCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfS0VZRE9XTjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlS2V5RG93bih0YXNrLCBjdHJsLCBldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PVVNFVVA6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1vdXNlVXAoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUSU9OOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbkFjdFNlbGVjdGlvbihjdHJsLCBmb3JtLCBldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9USU1FUjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVGltZXIoZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVTSVpFOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ST1dfREFUQV9DVVJSX1BBR0U6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJvd0RhdGFDdXJQYWdlKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuaXNTZW5kQWxsKCksIGV2dC5MYXN0Rm9jdXNlZFZhbCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RWX1RPX0dVSTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZFVENIX1JFQ09SRFNfQUhFQURfRlJPTV9TRVJWRVI6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTkFCTEVfRVZFTlRTOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmFibGVFdmVudHMoZXZ0LCB0cnVlKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRElTQUJMRV9FVkVOVFM6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuYWJsZUV2ZW50cyhldnQsIGZhbHNlKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgLy8gRGVmZWN0IDExNTkwMy4gRG8gbm90IGV4ZWN1dGUgUlAgaWYgdGhlIHN1YmZvcm0gcGFyZW50IHRhc2sgZGlkbid0IGZpbmlzaGVkIHlldFxyXG4gICAgICAgICAgLy8gaXQncyBDb21tb25IYW5kbGVyQmVmb3JlIGZvciBSUC5cclxuICAgICAgICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiAoPFRhc2s+dGFzay5nZXRQYXJlbnQoKSkuSW5Db21tb25IYW5kbGVyQmVmb3JlUlApXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyBSZWNvdmVyeSBmcm9tIHRyYW5zYWN0aW9uIHJlc3RhcnQgd2FzIGNvbXBsZXRlZC4gV2UgbWF5IG5vdyBjbGVhciB0aGUgZmxhZ1xyXG4gICAgICAgICAgdGFzay5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG4gICAgICAgICAgdGFzay5EYXRhU3luY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzU3RhcnRlZCgpKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBmb3JtIGNvbnRhaW5zIGEgdGFibGUgYW5kIHRoZSBjb250cm9sIHdhcyBpbiB0aGUgdGFibGVcclxuICAgICAgICAgIC8vIG1vdmUgdG8gdGhlIG5ldyByb3dcclxuICAgICAgICAgIGlmIChmb3JtLmdldFJvd3NJblBhZ2UoKSA+IEludDMyLk1pblZhbHVlICYmIGRpc3BsYXlMaW5lID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgICAgLy8gZW5zdXJlIGEgdmFsaWQgcm93XHJcbiAgICAgICAgICAgIHdoaWxlICghZHYucmVjRXhpc3RzKGRpc3BsYXlMaW5lKSAmJiBkaXNwbGF5TGluZSA+IDApIHtcclxuICAgICAgICAgICAgICBkaXNwbGF5TGluZS0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkaXNwbGF5TGluZSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgcHJldlJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgICBsZXQgb2xkVGFza01vZGU6IHN0cmluZyA9IHRhc2suZ2V0TW9kZSgpO1xyXG4gICAgICAgICAgICAgIGxldCBvbGRSZWNJZDogbnVtYmVyID0gcHJldlJlYy5nZXRJZCgpO1xyXG5cclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgb2xkRGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgICAgICAgICAgICAgLy8gb2xkRGlzcGxheUxpbmUgPSBmb3JtLmdldEN1cnJSb3coKVxyXG4gICAgICAgICAgICAgICAgZm9ybS5QcmV2RGlzcGxheUxpbmUgPSBvbGREaXNwbGF5TGluZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGRpc3BsYXkgaWYgdGhlIHByZXZpb3VzIHJlY29yZCB3YXMgZGVsZXRlZCBvciBjYW5jZWxlZFxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZSZWMgIT0gbnVsbCAmJiAhZHYucmVjRXhpc3RzQnlJZChwcmV2UmVjLmdldElkKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcmVmcmVzaCBpcyBlc3NlbnRpYWwuIElmIGl0IGZhaWxzIGJlY2F1c2Ugb2YgYW5cclxuICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHRoZW4gdGhlIG9sZCBjdXJyIHJvdyBpcyByZXN0b3JlZCAoaW4gdGhlIGNhdGNoXHJcbiAgICAgICAgICAgICAgICAgIC8vIHN0YXRlbWVudCkuIEl0IGNhbiBoYXBwZW4gd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBsaW5lIHdoaWNoXHJcbiAgICAgICAgICAgICAgICAgIC8vIGJlY29tZXMgYmxhbmsgZHVlIHRvIHRoZSBkZWxldGlvbiBvZiB0aGUgcHJldmlvdXMgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgb2xkRGlzcGxheUxpbmUgPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAhZHYucmVjRXhpc3RzQnlJZChvbGRSZWNJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2TGluZTogbnVtYmVyID0gZm9ybS5nZXRQcmV2TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShwcmV2TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdEZvY3VzZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Rm9jdXNlZEN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxhc3RGb2N1c2VkQ3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhlLlN0YWNrVHJhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBpbnZhbGlkIGxpbmUgbnVtYmVyOiAnICtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFxyXG4gICAgICAgICAgICAgICdpbiBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXJCZWZvcmUoKTogbm8gY3VycmVudCByZWNvcmQgYXZhaWxhYmxlICEnKTtcclxuXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciBub24gaW50ZXJhY3RpdmUgdGFza3MuIEluY3JlYXNlIHRoZSB0YXNrJ3MgY291bnRlciBmb3IgZXZlcnkgcmVjb3JkIHdlIHBhc3MuXHJcbiAgICAgICAgICAvLyBkbyBpdCBiZWZvcmUgdGhlIGV2YWxFbmRDb25kIHNpbmNlIGl0IG1pZ2h0IGluY2x1ZGUgY291bnRlcigwKS5cclxuICAgICAgICAgIC8vIGluY3JlYXNlIG9ubHkgaWYgZ29pbmcgaW50byB0aGUgcmVjIHByZWZpeC5cclxuICAgICAgICAgIGlmICghdGFzay5Jc0ludGVyYWN0aXZlICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgdGFzay5pbmNyZWFzZUNvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayB0aGUgXCJ0YXNrIGVuZCBjb25kaXRpb25cIiBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlY29yZFxyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9CRUZPUkUpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCBmb3JtLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcblxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ1JFQ09SRCBQUkVGSVg6ICcgKyB0YXNrLnF1ZXJ5VGFza1BhdGgoKSk7XHJcbiAgICAgICAgICAoZHYuZ2V0Q3VyclJlYygpKS5zZXRGb3JjZVNhdmVPcmcoZmFsc2UpO1xyXG4gICAgICAgICAgKGR2LmdldEN1cnJSZWMoKSkuU3luY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcblxyXG4gICAgICAgICAgLy8gZG8gUmVjb3JkIFByZWZpeCBmb3IgYWxsIGZhdGhlcnMgdGhhdCB0aGVpciBSZWNvcmQgUHJlZml4IGlzIG5vdCBkb25lIGVhcmxpZXJcclxuICAgICAgICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiB0YXNrLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXgpIHtcclxuICAgICAgICAgICAgbGV0IHBhcmVudFRhc2sgPSB0YXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICB3aGlsZSAocGFyZW50VGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICBpZiAocGFyZW50VGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhwYXJlbnRUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrID0gcGFyZW50VGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBoYW5kbGUgc3ViLWZvcm1zXHJcbiAgICAgICAgICB0YXNrLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChhd2FpdCB0YXNrLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmNvbXB1dGVTdWJGb3JtcygpO1xyXG4gICAgICAgICAgdGFzay5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgLy8gZW5hYmxlLWRpc2FibGUgYWN0aW9ucyBmb3IgYSByZWNvcmRcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlUmVjb3JkQWN0aW9ucygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAvLyBGb3JjZSByZWNvcmQgc3VmZml4OlxyXG4gICAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICBsZXQgaXNTZWxlY3Rpb25UYWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIE5vIHJlY29yZCAtPiBubyBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGZvcmNlU3VmZml4ID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gZG8gbm90IGV4ZWN1dGUgdGhlIFwiYmVmb3JlIHJlY29yZCBzdWZmaXhcIiB3aGVuIGRlbGV0aW5nIHRoZSByZWNvcmQgYW5kXHJcbiAgICAgICAgICAvLyB0aGUgdGFzayBtb2RlIGlzIGRlbGV0ZSAodGhlIHNlY29uZCByb3VuZClcclxuICAgICAgICAgIGlmICgocmVjLk1vZGlmaWVkIHx8IGZvcmNlU3VmZml4KSAmJiByZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmXHJcbiAgICAgICAgICAgIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgc3VmZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgdGFzay5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgICAgICB0YXNrLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdSRUNPUkQgU1VGRklYOiAnICsgdGFzay5xdWVyeVRhc2tQYXRoKCkpO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBpbmRpY2F0ZSBuZXh0IHZlcmlmeUN0cmwgaXMgdGhlIGZpcnN0IGN0cmwgaW4gdGhlIHJlY29yZFxyXG5cclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAgICAgaXNTZWxlY3Rpb25UYWJsZSA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIFF1ZXJ5IG1vZGUgLT4gZG8gc3VmZml4IG9ubHkgaWYgd2UgZm9yY2UgaXQgb3Igc29tZWhvdyB0aGUgcmVjb3JkIHdhcyB1cGRhdGVkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIWZvcmNlU3VmZml4ICYmICFyZWMuTW9kaWZpZWQgJiZcclxuICAgICAgICAgICAgIWlzU2VsZWN0aW9uVGFibGUpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIXJlYy5Nb2RpZmllZCAmJiAhZm9yY2VTdWZmaXggJiYgKCFpc1NlbGVjdGlvblRhYmxlIHx8ICF0YXNrLkluU2VsZWN0KSkge1xyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFICYmIHJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudXBkYXRlQ29uZmlybWVkKHRhc2spKVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9ICFhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgLy8gZG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgUlMgaWYgQ1YgcmV0dXJucyBlcnJvclxyXG4gICAgICAgICAgaWYgKHN0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUN0cmxQcmVmaXgoZXZ0KSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGlkIG5vdCBzdWNjZWVkIGluIGVudGVyaW5nIHRoZSBjdHJsXHJcbiAgICAgICAgICAgIGV2dC5Db250cm9sLkluQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTDpcclxuICAgICAgICAgIE1hbmFnZXIuQ2xlYW5NZXNzYWdlUGFuZSh0YXNrKTsgLy8gUUNSICMzNzEzMjFcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuXHJcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcGV4ZWN1dGlvbiBjdHJsIHdlIHNob3VsZCBub3QgZXhlY3V0ZSBDUy5cclxuICAgICAgICAgIGlmIChjdHJsID09IG51bGwgfHwgdGhpcy5nZXRTdG9wRXhlY3V0aW9uQ3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBzdWZmaXggb24gdGhlIHNhbWUgY29udHJvbFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghY3RybC5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICAgICB2YWwgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBhcmUgcmVzZXR0aW5nIHRoZSBmbGFnIGFzIHdlIGFyZSBtb3ZpbmcgZnJvbSBvbmUgY29udHJvbCB0byBvdGhlciBjb250cm9sLlxyXG4gICAgICAgICAgICB0YXNrLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6NzU4Nzg4LCB0aGUgYnJvd3NlciBjb250cm9sIHdpbGwgbm90IGJlIHVwZGF0ZSBmcm9tIHRoZSBmaWxlZC5cclxuICAgICAgICAgICAgLy8gUGF0Y2ggZm9yIFFDUiAjNzI5NzA2OlxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgcHV0cyB0aGUgZm9sbG93aW5nIEdVSSBjb21tYW5kczpcclxuICAgICAgICAgICAgLy8gICAgUFJPUF9TRVRfSU1BR0VfRklMRV9OQU1FIHRvIHNldCB0aGUgaW1hZ2Ugb24gdGhlIEltYWdlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX1RFWFQgdG8gc2V0IHRoZSB0ZXh0IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFNFVF9GT0NVUyB0byBmb2N1cyBvbiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3csIHdoZW4gdGhlIGV4ZWN1dGlvbiBpcyBieSBGNywgaWYgdGhlIGZpbGUgaXMgbm90IHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgLy8gKGkuZS4gaWYgdGhlcmUgaXMgNDA0IGVycm9yKSwgSHR0cENsaWVudCByZS10cmllcyB0byBnZXQgdGhlIGZpbGUgZm9yIEhUVFB0aW1lb3V0LlxyXG4gICAgICAgICAgICAvLyBEdXJpbmcgdGhpcyB0aW1lIGFsbCB0aGUgR1VJIGV2ZW50cyBpbiBHdWlDb21tYW5kc1F1ZXVlIHJlbWFpbnMgcGVuZGluZyB1bmhhbmRsZWQuXHJcbiAgICAgICAgICAgIC8vIEluIHRoZSBtZWFuIHRpbWUsIE1hZ2ljIHRocmVhZCBleGVjdXRlcyB0aGUgRXhpdCBldmVudCBhbmQgZHVyaW5nIHRoaXMsIGl0IHRyaWVzXHJcbiAgICAgICAgICAgIC8vIHRvIGV4ZWN1dGUgdGhlIEN0cmwgU3VmZml4IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIFNFVF9GT0NVUyBpcyBzdGlsbCBwZW5kaW5nIGluIHRoZSBxdWV1ZSwgdGhlIGxvZ2ljYWwgY29udHJvbCAoaWYgYWxsb3dUZXN0aW5nPU5vKVxyXG4gICAgICAgICAgICAvLyBpcyBub3QgbWFwcGVkIHdpdGggYW55IGFjdHVhbCB3aW5kb3dzIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIE5vdyB3aGVuIHdlIHRyeSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoaXMgbG9naWNhbCBjb250cm9sLCBMb2dpY2FsQ29udHJvbC5nZXRFZGl0b3JDb250cm9sKClcclxuICAgICAgICAgICAgLy8gcmV0dXJucyBudWxsIGFuZCBzbywgU3RhdGljVGV4dC5nZXRWYWx1ZSgpIHJldHVybnMgTG9naWNhbENvbnRyb2wuVGV4dCBpbnN0ZWFkIG9mIENvbnRyb2wuVGV4dFxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIFBST1BfU0VUX1RFWFQgaXMgYWxzbyBwZW5kaW5nLCBMb2dpY2FsQ29udHJvbC5UZXh0IGlzIG51bGwuXHJcbiAgICAgICAgICAgIC8vIEFuZCBzbyB0aGVyZSBpcyBhbiBleGNlcHRpb24gd2hlbiB1c2luZyBpdC5cclxuICAgICAgICAgICAgLy8gSWYgQWxsb3dUZXN0aW5nPVllcywgdGhlIHZhbCB3aWxsIGJlIGEgYmxhbmsgc3RyaW5nLiBTbywgdGhlcmUgaXMgbm8gY3Jhc2guXHJcbiAgICAgICAgICAgIC8vIEJ1dCBoZXJlIHdlIGhhdmUgYW5vdGhlciBwcm9ibGVtLiBTdXBwb3NlLCB0aGUgZmllbGQgaGFkIGFuIEluaXQgZXhwcmVzc2lvbi5cclxuICAgICAgICAgICAgLy8gTm93LCBNZ0NvbnRyb2wncyB2YWx1ZSB3b3VsZCBiZSB0aGUgaW5pdGVkIHZhbHVlIGFuZCB0aGUgdmFsIGlzIGEgYmxhbmsgc3RyaW5nLlxyXG4gICAgICAgICAgICAvLyBTbywgd2Ugd2lsbCBoYXZlIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgICAgICAgICAgLy8gU2luY2UgdGhlIHByb2JsZW0gaXMgcmVsYXRlZCB0byBhIHZlcnkgc3BlY2lmaWMgc2NlbmFyaW8gLS0gd2hlbiB0aGUgaW1hZ2UgY29udHJvbCB3YXNcclxuICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGRyb3BwZWQgY29udHJvbCBvbiB0aGUgZm9ybSwgaW1hZ2UgY2Fubm90IGJlIGFjY2Vzc2VkIGF0IHRoZSB0aW1lIG9mIHRhc2tcclxuICAgICAgICAgICAgLy8gbG9hZGluZyBhbmQgdGFzayBuZWVkcyB0byBiZSBjbG9zZWQsIHdlIGFyZSBwdXR0aW5nIGEgcGF0Y2ggaGVyZSBieSBjaGVja2luZyB2YWwgZm9yIE5VTEwuXHJcbiAgICAgICAgICAgIC8vIFRoZSBpZGVhbCBzb2x1dGlvbiB3b3VsZCBiZSAtLS0gaW5zdGVhZCBvZiBzZW5kaW5nIHRoZSBpbWFnZSBmaWxlIG5hbWUgZnJvbSBNYWdpYyB0aHJlYWRcclxuICAgICAgICAgICAgLy8gdG8gR3VpIHRocmVhZCBhbmQgbG9hZGluZyB0aGUgaW1hZ2UgZnJvbSB0aGUgR3VpIHRocmVhZCwgd2UgY2FuIGxvYWQgdGhlIGltYWdlIGZyb20gdGhlXHJcbiAgICAgICAgICAgIC8vIE1hZ2ljIHRocmVhZCAodXNpbmcgc3luYyBleGVjdXRpb24gaS5lLiB2aWEgR3VpSW50ZXJhY3RpdmUpIGFuZCBzZW5kIGl0IHRvIHRoZSBHdWkgdGhyZWFkLlxyXG4gICAgICAgICAgICBpZiAoIXRhc2suY2FuY2VsV2FzUmFpc2VkKCkgJiZcclxuICAgICAgICAgICAgICAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSICYmICghaXNOdWxsT3JVbmRlZmluZWQoY3RybC5fZmllbGQpICYmIChjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCBjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB8fCB2YWwgIT09IG51bGwpICYmIHR5cGVvZiB2YWwgIT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICAgICAgICAgICFhd2FpdCBjdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUodmFsLCB0cnVlKSkpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gd2hlbiBzdG9wIGV4ZWN1dGlvbiBpbiBvbiwgZG9uJ3QgY2xlYXIgdGhlIG1zZyBmcm9tIHN0YXR1cy5cclxuICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgTWFuYWdlci5DbGVhbk1lc3NhZ2VQYW5lKHRhc2spO1xyXG5cclxuICAgICAgICAgIC8vIHJlc2V0IEluQ29udHJvbCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgdmVyaWZpY2F0aW9uXHJcbiAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgY3RybC5DbGlwQm9hcmREYXRhRXhpc3RzID0gZmFsc2U7XHJcbiAgICAgICAgICBjdHJsLlZhbGlkYXRlQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICBjdHJsLnNldEluQ29udHJvbFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgYSBzZWxlY3QgcHJvZ3JhbSBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm9ncmFtIHdhcyBleGVjdXRlZCAgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj50aGUgc291cmNlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb21wdFwiPmlmIHRydWUgdGhlbiB0aGUgY2FsbGVyIGlzIGV4ZWN1dGluZyB0aGUgY2FsbGVkIHByb2dyYW0gYXQgdGhlIGVuZCBvZiBjb250cm9sIHByZWZpeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgYXN5bmMgc2VsZWN0UHJvZyhjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgbGV0IHZhbHVlOiBTdHJpbmc7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIGxldCBwcm9nRXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIHNlbGVjdCBwcm9ncmFtIHRvIHRoZSBjb250cm9sXHJcbiAgICBpZiAoY3RybC5IYXNTZWxlY3RQcm9ncmFtKCkpIHtcclxuICAgICAgLy9jaGVjayBpZiB0aGUgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gICAgICBpZiAoY3RybC5Jc1BhcmthYmxlKCkpIHtcclxuXHJcbiAgICAgICAgdmFsdWUgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb250cm9scyB2YWx1ZVxyXG4gICAgICAgIGlmICghY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbHVlLCBmYWxzZSkpXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZW5jb2RlZFZhbDogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICAgIG1nVmFsID0gYXdhaXQgY3RybC5nZXRNZ1ZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgIHZhciByZWMgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgIGVuY29kZWRWYWwgPSByZWMuZ2V0WE1MRm9yVmFsdWUoY3RybC5nZXRGaWVsZCgpLmdldElkKCksIG1nVmFsKTtcclxuICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVNlbGVjdFByb2dyYW1Db21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBudWxsLCBJbnQzMi5NaW5WYWx1ZSwgY3RybC5nZXREaXRJZHgoKSwgZW5jb2RlZFZhbCk7XHJcbiAgICAgICAgICB0YXNrLmdldE1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuXHJcbiAgICAgICAgICBsZXQgY29tbWFuZHNQcm9jZXNzb3JTZXJ2ZXI6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZHNQcm9jZXNzb3JTZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcblxyXG4gICAgICAgICAgcHJvZ0V4ZWN1dGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9nRXhlY3V0ZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICAvLyBjaGVjayBhbGwgaGFuZGxlcnMgaWYgaXQgaXMgY29udHJvbCB2ZXJpZmljYXRpb24uIEV4ZWN1dGUgYWxsIFNWIGhhbmRsZXJzXHJcbiAgICBsZXQgdGFibGU6IEhhbmRsZXJzVGFibGUgPSB0YXNrLmdldEhhbmRsZXJzVGFiKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IHRhYmxlLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgIGxldCBldnQ6IEV2ZW50ID0gaGFuZGxlci5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAoZXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04pIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sID0gKCh0YXNrLmdldEZvcm0oKSAhPT0gbnVsbCkgPyAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuZ2V0Q3RybEJ5Q3RybE5hbWUoaGFuZGxlci5nZXRDdHJsTmFtZSgpKSA6IG51bGwpO1xyXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoY29udHJvbCkpIHtcclxuICAgICAgICAgIGxldCBydW5UaW1lRXZlbnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY29udHJvbCk7XHJcbiAgICAgICAgICBydW5UaW1lRXZlbnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnVuVGltZUV2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBlcnJvciwgcGFyay9mb2N1cyBvbiB0aGlzIGNvbnRyb2wgd2hlcmUgZXJyb3Igb2NjdXJzIGluIENWIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCh0YXNrLCBjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChjb250cm9sKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkFjdFNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGZvcm06IE1nRm9ybSwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICBpZiAoZGlzcGxheUxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBkaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcblxyXG4gICAgbGV0IHNpbXVsYXRlOiBib29sZWFuID0gY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgIWV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGlmIChzaW11bGF0ZSlcclxuICAgICAgYXdhaXQgdGhpcy5zaW11bGF0ZVNlbGVjdGlvbihjdHJsLCBldnQuZ2V0VmFsdWUoKSwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZWxlY3Rpb24oY3RybCwgZGlzcGxheUxpbmUsIGV2dC5nZXRWYWx1ZSgpKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHRoZSBNR19BQ1RfU1VCRk9STV9DTE9TRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JtXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG9uU3ViZm9ybUNsb3NlKHRhc2s6IFRhc2ssIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKChldnQuZ2V0QXJnTGlzdCgpICE9IG51bGwpICYmIChldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSA9PT0gMSkpIHtcclxuICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICBsZXQgY2xvc2luZ1N1YmZvcm1OYW1lOiBzdHJpbmcgPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDAsIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIDApO1xyXG5cclxuICAgICAgLy8gUUNSICMyODMxMTQuIEFyZ3VtZW50IG9mICdTdWJmb3JtIHJlZnJlc2ggZXZlbnQnIGNhbiBiZSBza2lwcGVkIG9yIG5vdCBleGlzdC5cclxuICAgICAgaWYgKGNsb3NpbmdTdWJmb3JtTmFtZSA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIFJTIG11c3QgYmUgZXhlY3V0ZWQgb25seSBpZiB0aGUgY3VycmVudCBzdWJmb3JtIGlzIHJlZnJlc2hlZC5cclxuICAgICAgLy8gSWYgaXRzIGJyb3RoZXIgaXMgcmVmcmVzaGVkIHdlIGRvIG5vdCBuZWVkIHRvIGV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgdGFzay5cclxuICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgc3ViZm9ybUN0cmwgPSA8TWdDb250cm9sPnBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY2xvc2luZ1N1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgLy8gaXQncyBuZWVkZWQgdG8gb3BlbiB0aGUgc3ViZm9ybS4gUUNSICM0MTU5MTQuXHJcbiAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT0gbnVsbCAmJiAhc3ViZm9ybVRhc2suSXNSb3V0ZSgpKSB7XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBlcmZvcm1TdWJmb3JtQ2xvc2Uoc3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlcmZvcm1TdWJmb3JtQ2xvc2UoKSAgIDogQ2xvc2VzIHRoZSBzdWJmb3JtIHRhc2sgb3BlbmVkIGluIHRoZSBzdWJmb3JtQ3RybFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtQ3RybFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtU3ViZm9ybUNsb3NlKHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgbGV0IG1nZDogTUdEYXRhID0gc3ViZm9ybVRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBhd2FpdCBzdWJmb3JtVGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICBwYXJlbnRUYXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXMocGFyZW50VGFzayk7XHJcbiAgICAgIGF3YWl0IHN1YmZvcm1UYXNrLnN0b3AoKTtcclxuXHJcbiAgICAgIHN1YmZvcm1DdHJsLnJlc2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgIENvbW1hbmRzLmFkZENsb3Nlc3ViZm9ybShDb21tYW5kVHlwZS5DTE9TRV9TVUJfRk9STSwgc3ViZm9ybUN0cmwsIHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSwgKDxNZ0NvbnRyb2xCYXNlPnN1YmZvcm1DdHJsKS5nZXROYW1lKCksIHN1YmZvcm1UYXNrLmdldEZvcm0oKS5idWlsZEZvcm1OYW1lKCkpO1xyXG5cclxuICAgICAgLy8gU2V0IG1nZC5hYm9ydCgpLCBpbiBvcmRlciB0byBjbG9zZSBjdXJyZW50IGV2ZW50IGxvb3Agb2YgTW9kYWwgc3ViZm9ybS5cclxuICAgICAgLy8gYW5kIHJlc2V0IGl0IGJhY2sgdG8gZmFsc2Ugb25jZSBpdCBjb21lcyBvdXQgb2YgY3VycmVudCBldmVudHNsb29wKCkuXHJcbiAgICAgIGlmICgoPE1nQ29udHJvbEJhc2U+c3ViZm9ybUN0cmwpLklzTW9kYWwoKSlcclxuICAgICAgICBtZ2QuYWJvcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSBhcmd1bWVudHMgZm9yIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj4gPC9wYXJhbT5cclxuICBwcml2YXRlIGNyZWF0ZUV2ZW50QXJndW1lbnRzKGV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZ0LmdldEFyZ0xpc3QoKSA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRvU3VmZml4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkU3VmZml4KHRhc2s6IFRhc2tCYXNlLCByZWZEb1N1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzaG91bGRSZXR1cm46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCkge1xyXG4gICAgICByZWZEb1N1ZmZpeC52YWx1ZSA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgc2hvdWxkUmV0dXJuID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2hvdWxkUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzazogVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyB0aGUgbWFnaWMgZGVmYXVsdCBvcGVyYXRpb25zIGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwgZXZlbnQgY29kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50IDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXIoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBtZ0RhdGE6IE1HRGF0YSA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgZG9TdWZmaXg6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZztcclxuICAgIGxldCBzZXJ2ZXI6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IFRhc2suQ29tbWFuZHNQcm9jZXNzb3I7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGlzIGEgdXNlciBldmVudCB0aGF0IGNvbnZlcnRzIHRvIGEgc3lzdGVtIG9yIGludGVybmFsIGV2ZW4sIGNvbnZlcnQgaXRcclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIpXHJcbiAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LmdldFVzZXJFdmVudCgpLCBldnQpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMucHVzaFJ0RXZlbnQoZXZ0KTtcclxuXHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSkge1xyXG4gICAgICAgIGxldCBhY3RJZDogbnVtYmVyID0gdGhpcy5nZXRNYXRjaGluZ0FjdGlvbihldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICAgIGlmIChhY3RJZCAhPT0gMClcclxuICAgICAgICAvLyBoYW5kbGVkIGludGVybmFsbHlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgIGV2dC5zZXRJbnRlcm5hbChhY3RJZCk7XHJcbiAgICAgICAgICBldnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0vLyBlbmQgb2Ygc3lzdGVtIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgICAvLyBleGVjdXRlIHRoZSBjb21tb24gaGFuZGxpbmcgb2YgaW50ZXJuYWwgZXZlbnRzIG9ubHkgaWYgdGhleSBhcmUgbm90IGltbWVkaWF0ZS5cclxuICAgICAgLy8gYW4gZXZlbnQgaXMgaW1tZWRpYXRlIHdoZW4gaXQgd2FzIHJhaXNlZCBieSBhIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiB0aGF0IGl0c1xyXG4gICAgICAvLyB3YWl0IGNvbmRpdGlvbiBpcyB5ZXMgb3IgZXZhbHVhdGVzIHRvIHRydWUuXHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiAhZXZ0LmlzSW1tZWRpYXRlKCkgJiYgdGhpcy5BY3RBbGxvd2VkKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkgJiYgIXRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaykge1xyXG4gICAgICAgIGxldCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUgPSA8Q29tbWFuZHNUYWJsZT5tZ0RhdGEuQ21kc1RvU2VydmVyO1xyXG4gICAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgICBsZXQgcmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIGZvciBpbnRlcm5hbCBldmVudHNcclxuICAgICAgICBzd2l0Y2ggKGludEV2dENvZGUpIHtcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uU3ViZm9ybUNsb3NlKHRhc2ssIGV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT046XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVDpcclxuICAgICAgICAgICAgLy8gaWYgYnV0dG9uIGlzIG5vdCBwYXJrYWJsZSwgcmFpc2UgaXRzIGV2ZW50IG9ubHkgaWYgdGhlIGFjdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBieSBndWkuXHJcbiAgICAgICAgICAgIC8vIGRpcmVjdCBjbGljayBvbiB0aGUgYnV0dG9uIHdpbGwgZ2V0IGhlcmUgYXMgY3RybCBoaXQgLCBidXQgaXMgbm90IHRyaWdnZXJlZCBieSBndWkgKGdvZXMgdmlhIHNlbGVjdGlvbiBldmVudCAxc3QpXHJcbiAgICAgICAgICAgIC8vIG90aGVyIGN0cmxfaGl0IGFjdGlvbnMgc2hvdWxkIGNvbnNpZGVyIHRoZSBwYXJrYWJpbGl0eVxyXG4gICAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiZcclxuICAgICAgICAgICAgICAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiB8fCAhZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSB8fCBjdHJsLmlzUGFya2FibGUodHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0UnRFdnRUYXNrKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRUYXNrKGN0cmwuZ2V0UnRFdnRUYXNrKCkpO1xyXG4gICAgICAgICAgICAgIGlmIChDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX05PTkUgIT09IGFSdEV2dC5nZXRUeXBlKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLnVzZVpvb21IYW5kbGVyKCkpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tUb0VuYWJsZTogVGFzayA9IDxUYXNrPmFSdEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0YXNrVG9FbmFibGUgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICB0YXNrVG9FbmFibGUuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldEFyZ0xpc3QoY3RybC5BcmdMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGFSdEV2dC5zZXRQdWJsaWNOYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChhUnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIpIHtcclxuICAgICAgICAgICAgICAvLyBGaXhlZCBidWcgIzcyNDE1MDogYXMgd2UgZG9pbmcgZm9yIG9ubGluZSBmb3IgdGFiIGNvbnRyb2wgd2Ugc2VuZCBBQ1RfWk9PTSAoQ2hvaWNlaW5wLmNwcCA6OkRpdEdldCgpKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTykge1xyXG4gICAgICAgICAgICAgIGN0cmwuc2V0Q29udHJvbFRvRm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDpcclxuICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlRvZ2dsZUluc2VydE1vZGUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVDpcclxuICAgICAgICAgICAgLy8gaWYgJ2V4aXQnIGFjY2VwdGVkIG9uIE1ESSwgZXhpdCB0aGUgdG9wIG1vc3QgdGFzay4gc2FtZSBhcyB3aGVuIGV4aXRpbmcgdGhlIHN5c3RlbS5cclxuICAgICAgICAgICAgbGV0IHRhc2tUb0VuZDogVGFzayA9ICh0YXNrLmlzTWFpblByb2coKSA/IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSA6IHRhc2spO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrVG9FbmQuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsIGV2dC5FeGl0RHVlVG9FcnJvcigpKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVRfU1lTVEVNOlxyXG4gICAgICAgICAgICAvLyBlbmQgdGhlIHRvcCBtb3N0IHRhc2sgd2l0aCBmb3JtLlxyXG4gICAgICAgICAgICBhd2FpdCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBHZXRUb3BNb3N0VGFza1dpdGhGb3JtKHRhc2spLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1JPVywgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMOlxyXG4gICAgICAgICAgICAvLyAjOTE4NTg4OiBJZiBjdHJsK2hvbWUvY3RybCtlbmQgcHJlc3NlZCB3aGVuIHBhcmtlZCBvbiBsaXN0Ym94XHJcbiAgICAgICAgICAgIC8vIHRoZW4gQmVnaW4gdGFibGUgZXZlbnQgc2hvdWxkIG5vdCBiZSBoYW5kbGVkLlxyXG4gICAgICAgICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsIHx8ICFsYXN0UGFya2VkQ3RybC5pc0xpc3RCb3goKSkge1xyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzoge1xyXG4gICAgICAgICAgICAvLyBVbmxpa2UgT25saW5lLCBoZXJlIFNFTEVDVCBvciBaT09NIGNvbWVzIGFmdGVyIHRoZSBEQkNMSUNLLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIERCQ0xJQ0sgaGFuZGxlciB3aXRoIHByb3BvZ2F0ZSA9ICdOTycgLCB0aGVzZSBhY3Rpb25zIHdpbGwgbm90IGJlIHJhaXNlZC5cclxuICAgICAgICAgICAgbGV0IGN0cmxUeXBlOiBNZ0NvbnRyb2xUeXBlID0gY3RybC5UeXBlO1xyXG4gICAgICAgICAgICBsZXQgcHV0QWN0aW9uOiBudW1iZXIgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORTtcclxuICAgICAgICAgICAgaWYgKGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTEFCRUwgJiZcclxuICAgICAgICAgICAgICBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0UpIHtcclxuICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QpKVxyXG4gICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVDtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pKVxyXG4gICAgICAgICAgICAgICAgICBwdXRBY3Rpb24gPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChwdXRBY3Rpb24gIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT05FKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmwsIHB1dEFjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORTpcclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSh0YXNrLCBkdiwgcmVjLCBmYWxzZSkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRTpcclxuICAgICAgICAgICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdvdG9DcmVhdGVNb2RlKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRJbkNyZWF0ZUxpbmUoKSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5DcmVhdGVMaW5lKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCByZWNvcmQgaXMgbm90IGFscmVhZHkgYSBuZXcgb25lXHJcbiAgICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiByZWMgIT0gbnVsbCAmJiAhcmVjLk1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICAgICAgZG9TdWZmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERlZmVjdCAxNTIzNTU6IFBhcmsgb24gbGFzdFBhcmtlZENvbnRyb2wgaWYgbmV4dFNjcmVlbiBldmVudCBvY2N1cnMgaWYgYWxyZWFkeSBpbiBjcmVhdGUgbW9kZSBhbmQgcmVjb3JkIG5vdCBtb2RpZmllZFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0UGFya2VkQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDb250cm9sICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdFBhcmtlZENvbnRyb2wuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgcmVmRG9TdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGRvU3VmZml4KTtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5Eb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCh0YXNrLCByZWZEb1N1ZmZpeCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgZG9TdWZmaXggPSByZWZEb1N1ZmZpeC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB8fCAhdGFzay5Db25maXJtVXBkYXRlTm8pXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uYWRkUmVjKGRvU3VmZml4LCBpbnRFdnRDb2RlID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFID8gdHJ1ZSA6IGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzayk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0SW5DcmVhdGVMaW5lKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0Q2FuY2VsKGV2dCwgdGFzaywgZm9ybSwgY3RybCwgcmVjLCB0cnVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5URVJfUk9XX0VESVRJTkc6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEU6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgfHxcclxuICAgICAgICAgICAgICBhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nb3RvQ3JlYXRlTW9kZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1FVRVJZOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGR2LmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRPcmlnaW5hbFRhc2tNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJlxyXG4gICAgICAgICAgICAgIChhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgICAgb2xkTW9kZSA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q6XHJcbiAgICAgICAgICAgIC8qIHByZWZvcm0gcmVjIHN1ZmZpeCAqL1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5TZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgLyogY2xvc2UgdGhlIHNlbGVjdGlvbiBwcm9ncmFtICovXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX1JFRlJFU0g6XHJcbiAgICAgICAgICAgIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDEpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICAgICAgICAgIGxldCBSZWZyZXNoZWRTdWJmb3JtTmFtZTogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSICMyODMxMTQuIEFyZ3VtZW50IG9mICdTdWJmb3JtIHJlZnJlc2ggZXZlbnQnIGNhbiBiZSBza2lwcGVkIG9yIG5vdCBleGlzdC5cclxuICAgICAgICAgICAgICBpZiAoUmVmcmVzaGVkU3ViZm9ybU5hbWUgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAvLyBSUyBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgc3ViZm9ybSBpcyByZWZyZXNoZWQuXHJcbiAgICAgICAgICAgICAgLy8gSWYgaXRzIGJyb3RoZXIgaXMgcmVmcmVzaGVkIHdlIGRvIG5vdCBuZWVkIHRvIGV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgdGFzay5cclxuICAgICAgICAgICAgICBmb3IgKGxldCBwYXJlbnRUYXNrOiBUYXNrID0gdGFzazsgcGFyZW50VGFzay5nZXRGb3JtKCkgIT0gbnVsbCAmJiBwYXJlbnRUYXNrLmdldE1nZElEKCkgPT09IHRhc2suZ2V0TWdkSUQoKTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKFJlZnJlc2hlZFN1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBpdCdzIG5lZWRlZCB0byBvcGVuIHRoZSBzdWJmb3JtLiBRQ1IgIzQxNTkxNC5cclxuICAgICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI4NzU2Mi4gT3BlbiB0aGUgc3ViZm9ybSB0YXNrIG9ubHkgaWYgdGhlIHN1YmZvcm0gY29udHJvbCBpcyBjb25uZWN0ZWQgdG8gdGhlIHRhc2suXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IChzdWJmb3JtQ3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NVQkZPUk1fVFlQRSkpLmdldFZhbHVlSW50KCkgIT09IFN1YmZvcm1UeXBlLk5vbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHBhcmVudFRhc2ssIHN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGFyZW50VGFzay5TdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBpdCBpcyBTdWJmb3JtUmVmcmVzaCB0aGF0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgc28gc2VhcmNoIHRoZSB0YXNrIGFjY29yZGluZyB0byBpdHMgdGFzayBpZCAodGFnKVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDIpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gdGFzaywgcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICBsZXQgdGFza1RhZzogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgxLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIDApO1xyXG5cclxuICAgICAgICAgICAgICB3aGlsZSAoc3ViZm9ybVRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrID0gc3ViZm9ybVRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpID09PSB0YXNrVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN1YmZvcm1UYXNrID0gcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9PUEVOOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHRhc2ssIDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2wpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNIOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlKTtcclxuICAgICAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICAgICAgaWYgKCFmb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKGZvcm0ucmVjb3JkSWR4MkRpc3BsYXlMaW5lKGR2LmdldEN1cnJSZWNJZHgoKSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQ6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9BQ1RfQ0xPU0VfQVBQTDpcclxuICAgICAgICAgICAgY21kID1cclxuICAgICAgICAgICAgICBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQoXHJcbiAgICAgICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpLFxyXG4gICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JST1dTRVJfRVNDKTtcclxuICAgICAgICAgICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTlRFWFRfUkVNT1ZFOlxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgcGVuZGluZ1xyXG4gICAgICAgICAgICBsZXQgY3VyclJlY29yZCA9ICg8RGF0YVZpZXc+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgIGlmIChDbGllbnRNYW5hZ2VyLlRyYW5zQ2FjaGVFeGlzdHMoKSB8fCAoY3VyclJlY29yZCAhPSBudWxsICYmIGN1cnJSZWNvcmQuTW9kaWZpZWQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1BlbmRpbmcgdHJhbnNhY3Rpb24vcmVjb3JkIGlzIG1vZGlmaWVkLCBkaXNjYXJkZWQgXFwnQ29udGV4dCBSZW1vdmVcXCcgZXZlbnQuJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gSXMgdGhlcmUgY2xpZW50IGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0P1xyXG4gICAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZUNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXIoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmICghRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGFkZCBhIGNvbW1hbmQgdG8gdGVybWluYXRlIGNvbnRleHQgYXQgc2VydmVyIHNpZGVcclxuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQ6IENvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZFxyXG4gICAgICAgICAgICAgICAgICA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpKTtcclxuICAgICAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoPElDbGllbnRDb21tYW5kPmNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgbmVlZCBub3QgdG8gYmUgaGFuZGxlZCBhcyB0aGUgd2UgYXJlIHRlcm1pbmF0aW5nIHRoZSBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCBjb250ZXh0IGZyb20gc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgZmxhZyB0byB0aGF0IGNvbnRleHQgaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciBieSAnQ29udGV4dCBSZW1vdmUnIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZpbmdDb250ZXh0RnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaXNjYXJkZWQgXFwnQ29udGV4dCBSZW1vdmVcXCcgZXZlbnQgYXMgdXNlciBldmVudCBvY2N1cnJlZC4nKTtcclxuICAgICAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFUlZFUl9URVJNSU5BVElPTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RVTVBfRU5WSVJPTk1FTlQ6XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VyckZpZWxkICE9IG51bGwgJiYgdGhpcy5fY3VyckZpZWxkLk51bGxBbGxvd2VkKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbGluZXMgaXMgYW4gaW1taXRhdGlvbiBvZiB0aGUgYmVoYXZpb3VyIG9mIGFuIG9ubGluZSBwcm9ncmFtOlxyXG4gICAgICAgICAgICAgIC8vIDEpIHRoZSByZWNvcmQgbXVzdCBiZSB1cGRhdGVkIGluIHRoaXMgZXZlbnRcclxuICAgICAgICAgICAgICAvLyAyKSBhIFwibmV4dCBmaWVsZFwiIGV2ZW50IGlzIHJhaXNlZFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2N1cnJGaWVsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3VyckZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIC8vIGZvciBvZmZsaW5lIHdlIG5lZWQgdG8gY2FuY2VsIHRoZSBlZGl0IGFuZCB0aGVuIGdvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiwgdGhlIHNhbWUgd2UgZG9pbmcgZm9yIHJlbW92ZSB3aGlsZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIHNlZSBkYXRhdmlldy5jcyBjYXNlIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSB3aWxsIG5vdCBnZXQgdG8gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0tcclxuICAgICAgICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrLCBjbWRzVG9TZXJ2ZXIsIFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZS5ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9PSzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUOlxyXG4gICAgICAgICAgICAvLyBjYW4gc29ydCBvbmx5IG9uIGNvbHVtbiB3aXRoIGFuIGF0dGFjaGVkIGZpZWxkLlxyXG4gICAgICAgICAgICAvLyBjYW4gY2hhbmdlIGluZGV4IG9ubHkgaWYgdGhlIGRhdGF2aWV3IGlzIHJlbW90ZS5cclxuICAgICAgICAgICAgaWYgKChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFICYmIHRhc2suRGF0YXZpZXdNYW5hZ2VyLkhhc1JlbW90ZURhdGEpIHx8XHJcbiAgICAgICAgICAgICAgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVCAmJiBjdHJsLmdldEZpZWxkKCkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAvLyBRQ1IgIzI5NjMyNSAmIFFDUiAjNDMwMjg4LlxyXG4gICAgICAgICAgICAgIC8vIEV4ZWN1dGUgQ1Mgb2YgdGhlIGN1cnJlbnQgY29udHJvbCwgYmVjYXVzZSBpdCBjYW4gYmUgYSBwYXJhbWV0ZXIgZm9yIGEgc3ViZm9ybS5cclxuICAgICAgICAgICAgICAvLyBJZiBpdCdzIHZhbHVlIHdhcyBjaGFuZ2VkLCBDUyB3aWxsIHJlZnJlc2ggdGhlIHN1YmZvcm0gYmVmb3JlIHRoZSBzb3J0LlxyXG4gICAgICAgICAgICAgIGxldCBsYXN0Rm9jdXNlZFRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgbGV0IGZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKExhc3RGb2N1c2VkTWFuYWdlci5MYXN0Rm9jdXNNZ2RJRCk7XHJcbiAgICAgICAgICAgICAgaWYgKGZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShmb2N1c2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhsYXN0Rm9jdXNlZFRhc2spO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgIzQzODc1My4gRXhlY3V0ZSBSUyBvZiB0aGUgc29ydGVkIHRhc2suXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0UpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGFza0Zvcm0uSGFzVGFibGUoKSlcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUluZGV4Q2hhbmdlQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5HZXRDdXJyZW50UmVjSWQoKSwgZXZ0LmdldEFyZ0xpc3QoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb2x1bW5Tb3J0Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgZXZ0LkRpcmVjdGlvbiwgY3RybC5nZXREaXRJZHgoKSwgY3RybC5nZXRGaWVsZCgpLmdldElkKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgICAgICAgICAgICAgIGR2LnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKDApO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFFDUidzICMxNjU4MTUgJiAjMjkxOTc0LiBJZiB0aGUgZm9jdXNlZCB0YXNrIGFuZCB0aGUgc29ydGVkIHRhc2sgaXMgdGhlIHNhbWUgdGFzayBvclxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzb3J0ZWQgdGFzaywgZ28gdG8gdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGZpcnN0IGxpbmUuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9jdXNlZCB0YXNrIGlzIHRoZSBwYXJlbnQgdGFzaywgZG8gbm90IGxlYXZlIHRoZSBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICBpZiAoISh0YXNrID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgfHwgIXRhc2sucGF0aENvbnRhaW5zKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM0Mjg2OTcuIEV4ZWN1dGUgUlMgb2YgYWxsIG5lc3RlZCBzdWJmb3Jtcy5cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZFRhc2suRXhlY3V0ZU5lc3RlZFJTKHRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfQ0xJQ0s6XHJcbiAgICAgICAgICAgIC8vIGNhbiBzb3J0IG9uIGNvbHVtbiBvbmx5IGlmIGV2ZW50IGlzIHJhaXNlZCBkdWUgdG8gY2xpY2sgYWN0aW9uXHJcbiAgICAgICAgICAgIC8vIGFuZCBhIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGNvbHVtbi5cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkgJiYgY3RybC5pc0NvbHVtblNvcnRhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgY29sdW1uQ2hpbGRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmwuZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbkNoaWxkQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgU29ydCBvbiBDb2x1bW5cclxuICAgICAgICAgICAgICAgIGxldCBhUnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGNvbHVtbkNoaWxkQ29udHJvbCwgZXZ0LkRpcmVjdGlvbiwgMCk7XHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZW5kIG9mIGludGVybmFsIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4qIEhhbmRsZUFjdEVudGVyUm93RWRpdGluZ1xyXG4qIHN0YXJ0IHRoZSBlZGl0aW5nIG9uIHJvd1xyXG4qICovXHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzazogVGFzaykge1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKVxyXG4gICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZShgQ2Fubm90IGVudGVyIFJvdyBFZGl0aW5nIHdoZW4gaW4gUXVlcnkgTW9kZS5gKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBteWZvcm0uc3RvcFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgc3ViZm9ybSBvcGVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtQ29udHJvbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBPcGVuU3ViZm9ybSh0YXNrOiBUYXNrLCBzdWJmb3JtQ29udHJvbDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0YXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXModGFzayk7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1PcGVuQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgc3ViZm9ybUNvbnRyb2wuZ2V0RGl0SWR4KCkpO1xyXG4gICAgdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY21kc1RvU2VydmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyb2xsYmFja1R5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzazogVGFzaywgY21kc1RvU2VydmVyOiBDb21tYW5kc1RhYmxlLCByb2xsYmFja1R5cGU6IFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNvbW1hbmRzUHJvY2Vzc29yOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG4gICAgQ2xpZW50UmVmcmVzaENvbW1hbmQuQ2xpZW50SXNJblJvbGxiYWNrQ29tbWFuZCA9IHRydWU7XHJcbiAgICAvLyBmb3IgcmVtb3RlIHByb2dyYW0gOiAod2l0aFxcd2l0aG91dCBsb2NhbCBkYXRhKSB0aGUgcm9sbGJhY2sgZXZlbnQgaW4gdGhlIHNlcnZlciBNVVNUXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYmUgZXhlY3V0ZSBvbiB0aGUgdGFzayB0aGF0IG9wZW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBmb3Igb2ZmbGluZSBwcm9ncmFtIHRoZSByb2xsYmFjayB0cmFuc2FjdGlvbiBuZWVkIHRvIGJlIGV4ZWN1dGUgb24gdGhlIHRhc2sgdGhhdCBvcGVuIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgdGFzayA9IHRhc2suVGFza1NlcnZpY2UuR2V0T3duZXJUcmFuc2FjdGlvblRhc2sodGFzayk7XHJcblxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVSb2xsYmFja0V2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgcm9sbGJhY2tUeXBlKTtcclxuICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgIENsaWVudFJlZnJlc2hDb21tYW5kLkNsaWVudElzSW5Sb2xsYmFja0NvbW1hbmQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0UGFya2VkQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkUmVjTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdENhbmNlbChldnQ6IFJ1blRpbWVFdmVudCwgdGFzazogVGFzaywgZm9ybTogTWdGb3JtLCBjdHJsOiBNZ0NvbnRyb2wsIHJlYzogUmVjb3JkLCBpc01HX0FDVF9DQU5DRUw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFByZXZlbnQgcmVjdXJzaXZlIG1vZGVcclxuICAgIC8vIGZpeGVkIGJ1Z3MgIzoyODU0OTgsIDI5NzQ1NVxcNDI3NzAzXFxcclxuICAgIGlmICh0YXNrLkluSGFuZGxlQWN0Q2FuY2VsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IHNhdmVEaXNwbGF5TGluZSA9IHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIC8vIFdoZW4gZG8gd2Ugc2hvdyB0aGUgJ0NvbmZpcm0gQ2FuY2VsIHdpbmRvdycgPyB3aGVuIGFsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHk6XHJcbiAgICAvLyAxLiBUYXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgICAvLyAyLiByZWMgaXMgbm90IFVwZGF0ZWQuIFVwZGF0ZWQgaXMgdHJ1ZSB3aGVuIHRoZXJlIHdhcyBhbiBVcGRhdGUgb3BlcmF0aW9uIHdpdGggJ2ZvcmNlIHVwZGF0ZScuIElmIGl0IGlzIHRydWUsIHRoZW4gdGhlcmUgaXMgbm8gbWVhbmluZyB0byBzaG93IHRoZVxyXG4gICAgLy8gICAgd2luZG93IHNpbmNlIHRoZSB1cGRhdGUgc3RheXMgYW55d2F5IChsaWtlIGluIG9ubGluZSB3aGVuIHdlIGdvIHRvIENhbmNlbFdhc1RyaWdnZXJlZCkuXHJcbiAgICAvLyAzLiBUaGVyZSBtdXN0IGJlIGEgbW9kaWZpY2F0aW9uLCBvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byBjYW5jZWwuIFNvIGVpdGhlciBNb2RpZmllZCBpcyB0cnVlLCBtZWFuaW5nIGEgZmllbGQgd2FzIG1vaWRmaWVkICwgb3JcclxuICAgIC8vICAgIExhc3RQYXJrZWRDdHJsKCkubW9kaWZpZWRCeVVzZXIoKSwgbWVhbmluZyB0aGF0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nIHRoZSBmaWVsZCdzIHZhbHVlIChUaGUgbW9kaWZpZWQgaXMgZmFsc2UgdW50aWxsIHdlIGV4aXQgdGhlIGZpZWxkKS5cclxuICAgIC8vIENyZWF0ZSBtb2RlIGFsc28gZ29lcyBoZXJlIChyZWMgcmVtb3ZlZCBhbmQgbW9kZSBjaGFuZ2VzIHRvIG1vZGlmeSkgLCBidXQgYWxzbyB3aWxsIHNob3cgdGhlIGNvbmZpcm0gY2FuY2VsIG9ubHkgaWYgc29tZSBjaGFuZ2Ugd2FzIGRvbmUgdG8gdGhlIG5ldyByZWNvcmQuXHJcbiAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhcmVjLlVwZGF0ZWQpIHtcclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIGlmIChyZWMuTW9kaWZpZWQgfHwgKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSAhPT0gbnVsbCAmJiB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkuTW9kaWZpZWRCeVVzZXIpKSB7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9DQU5DRUwsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBsZXQgY29uZmlybWVkID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtX2Jvb2woTXNnSW50ZXJmYWNlLkNPTkZJUk1fU1RSX0NBTkNFTCk7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAvLyBTcGVjaWFsQ2FuY2VsT25DcmVhdGUgYmVoYXZpb3IgZm9yIEFsbG93RW1wdHlEYXRhVmlldyA9IFkgOiBXaGVuIHRoZXJlIGlzIHNpbmdsZSBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAvLyBleGlzdCBhbmQgdXNlciBjYW5jZWxzIGl0IGFuZCB0YXNrIGhhcyBBbGxvd0VtcHR5RGF0YVZpZXc9WVxyXG4gICAgICAvLyB0aGVuIGNoYW5nZSB0YXNrIG1vZGUgdG8gTW9kaWZ5IG1vZGUgc28gdGhhdCBzZXJ2ZXIgYWxsb3dzIHRoaXMgdGFzayB0byBlbnRlciBhZ2FpbiBpbiBFbXB0eURhdGFWaWV3IG1vZGUuXHJcbiAgICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSAmJiB0YXNrLmdldE1vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURVxyXG4gICAgICAgICYmIHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoZW5hYmxlKSB7XHJcbiAgICAgICAgICBsZXQgYWxsb3dFbXB0eURhdGFWaWV3OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG5cclxuICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFNpemUoKSA9PSAxICYmIGFsbG93RW1wdHlEYXRhVmlldykge1xyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoJ00nKTtcclxuICAgICAgICAgICAgdGFzay5EYXRhVmlldy5zZXRFbXB0eURhdGF2aWV3KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIC8vIFdoZW4gY2FuY2VsaW5nLCB3ZSBoYXZlIHRvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cclxuICAgICAgICAvLyBVbmxlc3MgdGhlIGV2ZW50IGRvZXMgbm90IGFsbG93IHRvIHJvbGxiYWNrIGluIGNhbmNlbC4gVGhhdCBjYW4gaGFwcGVuIGlmIHRoZSBjYW5jZWwgd2FzIGluaXRpYXRlZCBieSB0aGUgc2VydmVyJ3MncyByb2xsYmFjay5cclxuICAgICAgICBpZiAodGFzay5pc1RyYW5zYWN0aW9uT25MZXZlbChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiBldnQuUm9sbGJhY2tJbkNhbmNlbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2ssIDxDb21tYW5kc1RhYmxlPnRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuQ0FOQ0VMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlQ2FuY2VsRWRpdChldnQsIHRhc2ssIGZvcm0sIHJlYywgb2xkUmVjTW9kZSk7XHJcbiAgICB9XHJcbiAgICAvLyBRY3IgIzc0Nzg3MCBjYW5jZWwgc2hvdWxkIHBlcmZvcm0gdGhlIHJlY29yZCBwcmVmaXggaWYgbm90IHF1aXRpbmdcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgdGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vdGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZXZ0LmlzUXVpdCgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTQxMjc3OiBJZiBDYW5jZWwgZXZlbnQgaXMgY2FsbGVkIGZyb20gUXVpdCBldmVudCwgdGhlbiBkb24ndCBleGVjdXRlIEV4aXQgZXZlbnRcclxuICAgIC8vIGlmIHVzZXIgaGFzIHByZXNzZWQgJ05vJyBvbiBDb25maXJtIGNhbmNlbCBib3guXHJcbiAgICBpZiAoZXZ0LmlzUXVpdCgpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcblxyXG4gICAgLy8gcmVzZXQgaXNSb3dFZGl0aW5nXHJcbiAgICBhd2FpdCBmb3JtLnN0b3BSb3dFZGl0aW5nKHNhdmVEaXNwbGF5TGluZSk7XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYW5jZWwgdGhlIGVkaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVDYW5jZWxFZGl0KGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIHJlYzogUmVjb3JkLCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHRoZSBzeW5jZWQgcmVjb3JkIChpLmUuIHRoZSByZWNvcmQgZnJvbSB0aGUgcGFyZW50IHRhc2sgb2YgdGhlIHN1YmZvcm0pIGJlZm9yZSBSb2xsYmFjayB3YXMgaW4gJ0luc2VydCcgbW9kZSxcclxuICAgIC8vIHNvIGl0IG11c3QgYmUgaW4gJ0luc2VydCcgbW9yZSBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICBpZiAocmVjLlN5bmNlZCAmJiBvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuXHJcbiAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyByZXNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbFxyXG4gICAgICBpZiAodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9PSBudWxsKVxyXG4gICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKS5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIGF3YWl0IGZvcm0uY2FuY2VsRWRpdCh0cnVlLCBldnQuaXNRdWl0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZURlbGV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdGlvbkRlbGxpbmUodGFzazogVGFzaywgZHY6IERhdGFWaWV3LCByZWM6IFJlY29yZCwgbm9uSW50ZXJhY3RpdmVEZWxldGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBzYXZlSXNSb3dFZGl0aW5nID0gbXlmb3JtLmdldElzUm93RWRpdGluZ0Zyb21HdWkobXlmb3JtLkRpc3BsYXlMaW5lKTsgLy9Db21tYW5kcy5nZXRJc1JvdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7d0VkaXRpbmcoIHRhc2suZ2V0Rm9ybSgpLmdldE1haW5Db250cm9sKCksIHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lKTsgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcztcclxuICAgIGxldCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXM7XHJcbiAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfREVMRVRFLCB0cnVlKSkge1xyXG4gICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgb2xkUmVjTW9kZSA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIEZvcmNlIHRoZSBjaGFuZ2UgdG8gZGVsZXRlIG1vZGVcclxuICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgcmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmIChvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcihmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGFzayBzdWZmaXggaW4gTW9kaWZ5IG1vZGUgb3Igd2hlbiB0aGVyZSBpcyAnZm9yY2UgcmVjb3JkIHN1ZmZpeCcuXHJcbiAgICAgICAgaWYgKHJlYy5Nb2RpZmllZCB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSByZWNvcmQgc3VmZml4IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVjLlNlbmRUb1NlcnZlcikge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZXhlY3V0ZSByZWNvcmQgc3VmZml4IGluIERlbGV0ZSBtb2RlXHJcbiAgICAgICAgLy8gc2V0IHRoZSBJbkRlbGV0ZVByb2Nlc3MgZmxhZyAsIHNvIHdlIHdpbGwgbm90IHRyeSB0byBzZW5kIHVwZGF0ZXMgb24gdGhlIHJlY29yZCBhZnRlclxyXG4gICAgICAgIC8vIHdlIGRlbGV0ZSBpdCBpbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIChyZWMgc3VmZml4KS5cclxuICAgICAgICByZWMuc2V0SW5EZWxldGVQcm9jZXNzKHRydWUpO1xyXG5cclxuICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIC8vIG5vIGNvbmZpcm0gbWVzc2FnZSBkaWFsb2cgaWYgaW4gbm9uIGludGVyYWN0aXZlIGRlbGV0ZS5cclxuICAgICAgICBsZXQgc2tpcENvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSBub25JbnRlcmFjdGl2ZURlbGV0ZTtcclxuXHJcbiAgICAgICAgaWYgKCFza2lwQ29uZmlybURpYWxvZykge1xyXG4gICAgICAgICAgaWYgKHRhc2subXVzdENvbmZpcm1JbkRlbGV0ZU1vZGUoKSB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25maXJtZWQ6IGJvb2xlYW4gPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm1fYm9vbChNc2dJbnRlcmZhY2UuQ09ORklSTV9TVFJfREVMRVRFKTtcclxuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNhdmVJc1Jvd0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIHJlYy5zZXRJbkRlbGV0ZVByb2Nlc3MoZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgaWYgKCFyZWMuU2VuZFRvU2VydmVyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlJ3JlIGRlbGV0aW5nIGFuIGluc2VydGVkIHJlY29yZCwgdGhlIHNlcnZlciBpcyBub3QgYXdhcmUgb2YgaXRcclxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB1cG9uIGRlbGV0ZSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1vZGlmaWVkIHJlYyBsaXN0XHJcbiAgICAgICAgaWYgKG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpIHtcclxuICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5ld0N1cnJSZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1OiB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgYSByZWNvcmQsIHdoaWNoIGlzIHRoZSBzaW5nbGVcclxuICAgICAgICAgIC8vIHJlY29yZCBpbiB0aGUgZHYsIHRoZW4gd2hlbiBpdHMgcmVjb3JkIHN1ZmZpeCBpcyBleGVjdXRlZCBhbmQgdGhlXHJcbiAgICAgICAgICAvLyBzZXJ2ZXIgc2VuZHMgYSBuZXcgcmVjb3JkIHRvIHRoZSBjbGllbnQgYW5kIHNldCBpdCB0byBiZSB0aGVcclxuICAgICAgICAgIC8vIGN1cnJlbnQgcmVjb3JkLlxyXG4gICAgICAgICAgLy8gVGhpcyBmaXggbWFrZXMgdGhlIGRlbGV0ZWQgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGZvciBhXHJcbiAgICAgICAgICAvLyBtb21lbnQganVzdCB0byBkZWxldGUgaXQgZnJvbSB0aGUgY2xpZW50cyBjYWNoZS4gVGhlbiwgaXQgbWFrZXNcclxuICAgICAgICAgIC8vIHRoZSBuZXcgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGFnYWluIGFuZCBlbnRlcnMgaW50byBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgIC8vIEkgdGhpbmsgdGhhdCBhIGJldHRlciBzb2x1dGlvbiBpcyB0byBkZWNpZGUgd2hldGhlciB0aGUgY2xpZW50IGlzXHJcbiAgICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIGEgbmV3IHJlY29yZCBvciB0aGUgc2VydmVyLCBhbmQgbWFrZSBzdXJlXHJcbiAgICAgICAgICAvLyB0aGF0IGl0IGlzIGRvbmUgc3lzdGVtd2lkZS5cclxuICAgICAgICAgIC8vIEVodWQgLSAxMC8wOS8yMDAxXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5zZXRDdXJyUmVjKHJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gbm8gbmVlZCB0byBkZWwgdGhlIGN1cnIgcmVjIGFuZCBwb3NpdGlvbiBvbiB0aGUgbmV4IHJlYyBpZiB0aGUgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIC8vIFRoZSBkZWxDdXJyUmVjIG1heSBjYXVzZSBhIGNyYXNoIGlmIGl0IHRyaWVzIHRvIGdldCB0aGUgbmV4dCByZWMgZnJvbSB0aGUgbmV4dCBjaHVuay5cclxuICAgICAgICAgIGlmICghdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsQ3VyclJlYyh0YXNrLCBmYWxzZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1IC0gZml4IGNvbnRpbnVlXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LnNldEN1cnJSZWMobmV3Q3VyclJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChkdi5nZXRTaXplKCkgPT09IDEpXHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIEluIGludGVyYWN0aXZlLCB0aGUgbW9kZSBtaWdodCBjaGFuZ2UgdG8gbW9kaWZ5IG9yIGNyZWF0ZS4gSG93ZXZlciwgZm9yIG5vbiBpbnRlcmFjdGl2ZSAoZGVsZXRlIG1vZGUpXHJcbiAgICAgICAgICAvLyB0aGUgbW9kZSBzaG91bGQgYmUgc2V0IGJhY2sgdG8gZGVsZXRlIGFuZCB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgcmVjb3JkIGN5Y2xlLlxyXG4gICAgICAgICAgaWYgKG5vbkludGVyYWN0aXZlRGVsZXRlKVxyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSB2aWV3IHJlZnJlc2gsIHNjcmVlbiByZWZyZXNoIGFuZCByZWNvcmQgZmx1c2ggZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGUgd2l0aCBhbGwgaXRzIHByb3BlcnRpZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBudWxsO1xyXG5cclxuICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQpXHJcbiAgICAgIHRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ID0gdHJ1ZTtcclxuICAgIC8vIGNoZWNrIGlmIHdlIHRyeSB0byB2aWV3IHJlZnJlc2ggd2l0aCBhbGxvd19tb2RpZnk9biBpbiBjcmVhdGUgbW9kZVxyXG4gICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICFhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRhc2suRXhlY3V0ZU5lc3RlZFJTKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICBpZiAoaW50RXZ0Q29kZSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOKSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudFJvdzogbnVtYmVyID0gMDtcclxuICAgICAgICAgIGlmICghZXZ0LmdldFJlZnJlc2hUeXBlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGV2dC5SdFZpZXdSZWZyZXNoVXNlQ3VycmVudFJvdygpICYmIHRhc2suSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVJbnRlcm5hbFJlZnJlc2hDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlLCBkdi5DdXJyZW50UmVjSWQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSlcclxuICAgICAgICAgICAgICBjdXJyZW50Um93ID0gZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVmZXRjaFJlY29yZDogYm9vbGVhbiA9IHRydWU7IC8vUmVmZXRjaCByZWNvcmQgZnJvbSBzZXJ2ZXIuXHJcbiAgICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQgJiYgZXZ0LmdldEFyZ0xpc3QoKSAhPT0gbnVsbCAmJiBldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIGxldCByZWZldGNoUmVjU3RyOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgcmVmZXRjaFJlY1N0ciA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKTtcclxuICAgICAgICAgICAgICByZWZldGNoUmVjb3JkID0gKGlzTnVsbE9yVW5kZWZpbmVkKHJlZmV0Y2hSZWNTdHIpIHx8IHJlZmV0Y2hSZWNTdHIgPT09ICcxJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZWZldGNoUmVjb3JkKVxyXG4gICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJlYWxSZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSwgY3VycmVudFJvdywgZXZ0LmdldEFyZ0xpc3QoKSwgZHYuQ3VycmVudFJlY0lkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZXZlbnRcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBpZDogbnVtYmVyO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSA9PT0gbnVsbClcclxuICAgICAgICAgICAgaWQgPSAwO1xyXG4gICAgICAgICAgZWxzZSBpZiAodGFzay5nZXRGb3JtKCkuaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICAgIGlkID0gKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0UmVjQnlJZHgoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRUb3BSZWNJZHgoKSkuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTY3JlZW5SZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaWQsIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZWFsIHZpZXcgcmVmcmVzaCBjYXVzZXMgdGhlIGNhY2hlIG9mIHRoZSBjdXJyZW50IHN1YiBmb3JtIHRhc2sgdG8gYmUgY2xlYXJlZFxyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pXHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZG9lcyBub3QgY2xlYXIgdGhlIGNhY2hlXHJcbiAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgaWYgKGNtZCAhPT0gbnVsbClcclxuICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAvLyBRQ1IgIzI4OTIyMi4gRG8gbm90IGNvbnRpbnVlIHdpdGggUmVmcmVzaCBpZiB0aGUgdGFzayBtdXN0IGJlIGVuZGVkLlxyXG4gICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiAhZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEFmdGVyIHJlY29yZCBoYXMgYmVlbiBmbHVzaGVkIGl0IGlzIG5vdCBjb25zaWRlcmVkIGEgbmV3IHJlY29yZCBhbnltb3JlLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5zZXRPbGRSZWMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOICYmIHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzQzMDA1OS4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHJlZnJlc2hlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgcmVmcmVzaGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgdGhpcy5zZXRJc0luVmlld1JlZnJlc2godHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpKSB7XHJcbiAgICAgICAgICAgIGlmICghKHRhc2sgPT09IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSB8fCAhdGFzay5wYXRoQ29udGFpbnMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdvIHRvIGNyZWF0ZSBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY21kc1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBnb3RvQ3JlYXRlTW9kZSh0YXNrOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgIC8vIFFDUiAjNDE3NzMzLiBFeGVjdXRlIFJTJ3Mgb2YgdGhlIG5lc3RlZCBzdWJmb3JtcyBpZiB0aGUgY3VycmVudCB0YXNrIGlzIG9uZSBvZiB0aGUgbmVzdGVkIHN1YmZvcm1zLlxyXG4gICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFKTtcclxuICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gc29tZSBkZWZhdWx0IG9wZXJhdGlvbnMgZm9yIGFuIGV2ZW50IGFmdGVyIGFsbCB0aGUgaGFuZGxlcnMgZmluaXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmNCZWZvcmVcIj50aGUgUkMgcmV0dXJuZWQgZnJvbSB0aGUgY29tbW9uSGFuZGxlckJlZm9yZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wb2dhdGVcIj5pZiBldmVudCB3YXMgcHJvcG9nYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJFdmVudFwiPnRoZSBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tbW9uSGFuZGxlckFmdGVyKGV2dDogUnVuVGltZUV2ZW50LCByY0JlZm9yZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldztcclxuICAgIGxldCByZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IHJlY01vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVjTW9kZUlzRGVsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW47XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24gJiYgZXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCAmJiBldnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIGR2ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgY3RybCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICBzd2l0Y2ggKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIHJlY29yZCBwcmVmaXggZm9yIHRoZSBzdWIgdGFza3MgdG9vXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5kb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5pc0ZpcnN0UmVjb3JkQ3ljbGUoZmFsc2UpO1xyXG4gICAgICAgICAgLy8gT25jZSBhcmUgcmVhZHkgdG8gZW5kIHRoZSBSUywgaXQgbWVhbnMgd2UgY2Fubm90IGJlIHRoZSBGSVJTVCByZWNvcmQgY3ljbGVcclxuICAgICAgICAgIGlmICh0YXNrLmdldFByZXZlbnRSZWNvcmRTdWZmaXgoKSkge1xyXG4gICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gUUNSICMxMTU5NTEuIEV2ZW4gaWYgcmVjb3JkIHN1ZmZpeCBpcyBub3QgZXhlY3V0ZWQsIGluIHRoZSBuZXh0IHRpbWUgZG8gbm90IGV4ZWN1dGUgUlAgJiBSUyBvZiB0aGUgc3ViZm9ybS5cclxuICAgICAgICAgIHRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgLy8gUUNSICM5ODQwMzE6IGlmIHRoZSBkZWxldGUgb3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gXCJ2ZXJpZnkgZXJyb3JcIlxyXG4gICAgICAgICAgICAvLyBpbiB0aGUgcmVjb3JkIHN1ZmZpeCB0aGVuIHRoZSByZWNvcmQgbW9kZSBtdXN0IGJlIGNsZWFyZWRcclxuICAgICAgICAgICAgaWYgKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpXHJcbiAgICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAvLyBRY3IgNzgzMDM5IDogSWYgd2UgYXJlIGFscmVhZHkgaW4gY29udHJvbCBsZXZlbCBpdCBtZWFucyB0aGF0IGNvbnRyb2wgcHJlZml4IHdhcyBhbHJlYWR5IGRvbmUgb3IgdGhhdFxyXG4gICAgICAgICAgICAvLyBjb250cm9sIHN1ZmZpeCB3YXMgbm90IGRvbmUuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBjb250cm9sIHByZWZpeCBhZ2Fpbi5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gPE1nQ29udHJvbD50aGlzLmdldFN0b3BFeGVjdXRpb25DdHJsKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBsYXN0ID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSIDQyNjI4MyBpcyB3ZSBoYXZlIGEgc3ViLWZvcm0gdGhhdCB3YXMgbmV2ZXIgYmVlbiBlbnRlcmVkXHJcbiAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNvbnRyb2wgbGV2ZWwgd2lsbCBub3QgYmUgZW50ZXJlZFxyXG4gICAgICAgICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGRvbm90IHdhbnQgQ1MgdG8gYmUgY2FsbGVkIGFnYWluIGZyb20gQ1AgaW5jYXNlIG9mIHZlcmlmeSBlcnIgaW4gQ1ZcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgaW5DdHJsUHJlZml4OiBib29sZWFuID0gdGFzay5JbkN0cmxQcmVmaXg7XHJcbiAgICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gaW5DdHJsUHJlZml4O1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZSBjaGVjayB0aGUgc3RvcEV4ZWN1dGlvbiBmbGFnIGhlcmUgdG9vIGFuZCBkaXNwbGF5IGFcclxuICAgICAgICAgICAgICAvLyBjb25maXJtIGNhbmNlbCBkaWFsb2cgdGhhdCB3aWxsIGNsb3NlIHRoZSBicm93c2VyIGlmIHRoZSB2YWx1ZSBpcyB0cnVlXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIERlZmVjdCAxNTI4NzE6IFdpdGggbmV3IHdheSBvZiBlZGl0aW5nIHJvdywgUlMgaXMgbm90IGZpcmVkIGluZmluaXRlbHksIGJ1dCByb3cgc2VsZWN0aW9uIGlzIHNoaWZ0ZWQgdG8gbmV3IHJvdy4gQWxzbyByb3cgbGVhdmVzIGVkaXRpbmcgbW9kZS5cclxuICAgICAgICAgICAgLy8gU28gZW5zdXJlIHJvdyBlZGl0aW5nIGlzIGxlZnQgd2hlbiB0aGVyZSBpcyBubyB2ZXJpZnkgZXJyb3IgYW5kIG5vdCB1bmNvbmRpdGlvbmFsbHkuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzayk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlY01vZGlmaWVkID0gcmVjLk1vZGlmaWVkO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgcmVjLmlzQ2F1c2VJbnZhbGlkYXRpb24oKSkge1xyXG4gICAgICAgICAgICAgICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5pbnZhbGlkYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0Q2F1c2VJbnZhbGlkYXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlY01vZGVJc0RlbGV0ZSA9IChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKTtcclxuXHJcbiAgICAgICAgICAgIGZvcmNlU3VmZml4ID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSByZWNvcmQgaXMgZGVsZXRlZCB0aGVuIGV4ZWN1dGUgdGhlIFwicmVjIHN1ZmZpeCBhZnRlclwiIG9ubHlcclxuICAgICAgICAgICAgLy8gd2hlbiB0aGUgdGFzayBtb2RlIGlzIGRlbGV0ZSAoc2Vjb25kIHJvdW5kKVxyXG4gICAgICAgICAgICAvLyBpbkRlbGV0ZVByb2Nlc3MgOiBpZiB0aGVyZSBpcyBhbiAnRU5EIFRBU0sgQ09ORCcgd2Ugd2lsbCBoYXZlIGEgM3JkIGN5Y2xlIGluIHJlY29yZCBzdWZmaXgod2hlbiB1cGQrZGVsIG9yIGZvcmNlIHN1ZmYgKyBkZWwpLlxyXG4gICAgICAgICAgICAvLyAxc3QgY3ljbGUgOiB1cGRhZSBjeWNsZSAodGFzayBtb2RlIHdpbGwgYmUgdXBkYXRlKSwgMm5kIDogdGFzayBtb2RlIGlzIGRlbGV0ZSAsIHRoaXMgaXMgd2hlbiB3ZSBzZW5kIHRoZSBkZWxldGUgdG8gdGhlIHNlcnZlci5cclxuICAgICAgICAgICAgLy8gM3JkIC0gc3VmZml4IHRoYXQgaXMgY2FsbGVkIGZyb20gdGhlIGVuZFRhc2suIEluIHRoZSAzcmQgY3ljbGUgdGhlIHJlY01vZGVJc0RlbGV0ZSB3aWxsIGJlIGZhbHNlIGFsdGhvdWdoIHdlIGFyZSBzdGlsbCBpbiB0aGUgZGVsZXRlIHByb2Nlc3MgKHdlIGFscmVhZHkgc2VudCB0aGUgZGVsZXRlIG9wZXIpLlxyXG4gICAgICAgICAgICAvLyBBIGNvbWJpbmF0aW9uIG9mIGZvcmNlIHN1ZmZpeCArIGVuZCB0YXNrIGNvbmQgKyBkZWwgbGluZSAsIHdpbGwgY3Jhc2ggdGhlIHNlcnZlciBvbiB0aGUgM3JkIGN5Y2xlIHNpbmNlIHdlIHdpbGwgYXNrIGZvciB1cGRhdGUgb2ZmXHJcbiAgICAgICAgICAgIC8vIGEgcmVjb3JkIHRoYXQgdGhlIHNlcnZlciBoYWQgZGVsZXRlZCBvbiB0aGUgMm5kIGN5Y2xlLiBUaGF0IGl0IHdoeSB3ZSB1c2UgJ2luRGVsZXRlUHJvY2VzcycsIHNvIHdpbGwgd2lsbCBrbm93IG5vdFxyXG4gICAgICAgICAgICAvLyB0byBhZGQgdXBkYXRlIG9wZXIgb24gYW4gYWxyZWFkeSBkZWxldGVkIHJlY29yZC4gKFFjciAjNzkwMjgzKS5cclxuICAgICAgICAgICAgLy8gKiB0aGVyZSBpcyBzdGlsbCBhIHByb2JsZW0gaW4gJ3VwZGF0ZScgYW5kICdpbnNlcnQnIHdpdGggJ2VuZCB0YXNrIGNvbmQnICsgJ2ZvcmNlJyA6IGFuIGV4dHJhIHVwZGF0ZSB3aWxsIGJlIHNlbmRcclxuICAgICAgICAgICAgLy8gICB0byB0aGUgc2VydmVyIG9uIHRoZSByZWMgc3VmZml4IG9mIHRoZSBlbmQgdGFzay4gYnV0IGFwYXJ0IGZyb20gc2VydmVyIHVwZGF0ZSBpdCBjYXVzZXMgbm8gcmVhbCBwcm9ibGVtLlxyXG4gICAgICAgICAgICBpZiAocmVjTW9kZUlzRGVsZXRlICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSB8fFxyXG4gICAgICAgICAgICAgICFyZWNNb2RlSXNEZWxldGUgJiYgIXJlYy5pbkRlbGV0ZVByb2Nlc3MoKSAmJiAocmVjTW9kaWZpZWQgfHwgZm9yY2VTdWZmaXgpKSB7XHJcbiAgICAgICAgICAgICAgcmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgICBkdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAocmVjTW9kaWZpZWQgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZWMucmVhbE1vZGlmaWVkKCkgJiZcclxuICAgICAgICAgICAgICAgICAgIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93VXBkYXRlSW5RdWVyeU1vZGUodGFzay5nZXRDb21wSWR4KCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHJlYWwgZmllbGRzIHdlcmUgbW9kaWZpZWRcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZHYuY2FuY2VsRWRpdChFdmVudHNNYW5hZ2VyLlJFQUxfT05MWSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZWJ5TXNnSWQoTXNnSW50ZXJmYWNlLlJUX1NUUl9VUERBVEVfSU5fUVVFUlkpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IGNvbnRpbnVlIGhlcmUgYW5kIHRyeSB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIGJlY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIGFsc28gc29tZSBzdWIgdGFza3MgdG8gdGhpcyB0YXNrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBRQ1IjNzc2Mjk1OiBmb3IgcHJlIHJlY29yZCB1cGRhdGUsIGNvbW1pdCB0aGUgcmVjb3JkIGFmdGVyIGhhbmRsZXIncyBleGVjdXRpb24uXHJcbiAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjOjMwNjkyOSwgRm9yY2VFeGl0UHJlIGlzIHJlbGV2YW50IG9ubHkgZm9yIHRoZSB0YXNrIHRoYXQgcmFpc2VkIHRoZSBldmVudFxyXG4gICAgICAgICAgICAvLyBzZWUgYWxzbyBidWcjOjI5Mjg3NlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzaykgJiZcclxuICAgICAgICAgICAgICAvLyBEZWZlY3QgMTU0MDQ3IDogZG8gbm90IHRyeSBhbmQgY29tbWl0IGlmIHRhc2sgaXMgYWJvcnRpbmcgYW5kIHdhcyBhbHJlYWR5IHJlbW92ZWQgKG9yIGFsbCBNR0Qgd2FzIHJlbW92ZWQpLlxyXG4gICAgICAgICAgICAgICghdGFzay5pc0Fib3J0aW5nKCkgfHwgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRUYXNrQnlJRCh0YXNrLmdldFRhc2tUYWcoKSkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICBpZiAoKCFyZWNNb2RlSXNEZWxldGUgfHwgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWl0UmVjb3JkKHRhc2ssIGV2dC5yZXZlcnNpYmxlRXhpdCgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gYWZ0ZXIgdGhlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSAyIGN5Y2xlcyAodXBkYXRlL2ZvcmNlIHN1ZmZpeCArIGRlbGV0ZSksIGRvIHRoZSBlbmQgdGFzayBvbmx5IGluIHRoZSAybmQgY3ljbGUuXHJcbiAgICAgICAgICAgICAgaWYgKChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmXHJcbiAgICAgICAgICAgICAgICB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpIHx8XHJcbiAgICAgICAgICAgICAgICByZWMuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9BRlRFUikpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IC8vIHJlYyAhPSBudWxsXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgLy8gY2hlY2sgcGFya2FiaWxpdHkgb25jZSBhZ2FpbiBhcyBwcm9wZXJ0eSBtaWdodCBoYXZlIGNoYW5nZWQgaW4gdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgLy8gOTI0MTEyIC0gaWdub3JlIGRpcmVjdGlvbiAoaWYgZmxhZyBzZXQpIGFzIHdlIGFyZSBmb3JjaW5nIHBhcmsgaW5zcGl0ZSBvZiBmYWlsZWQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIC8vIFFDUiMgODA2MDE1OiBJZiB3ZSBoYXZlIGEgc2luZ2xlIGZpZWxkIHdpdGggYWxsb3cgcGFya2luZyA9IFllcyBhbmQgVGFiIEludG8gPSBObywgdGhlbiBvbiBwcmVzc2luZyB0YWIgaWYgY3Vyc29yIGlzIG5vdFxyXG4gICAgICAgICAgICAvLyBtb3ZlZCwgd2UgY29tZSB0byBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsICh3aGljaCBpcyBzYW1lIGFzIGN0cmwpIHNpbmNlIFRhYkludG8gaXMgbm90IGFsbG93ZWQuXHJcbiAgICAgICAgICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBjdHJsLklzUGFya2FibGUoKSB8fCBjdHJsID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgSW5Db250cm9sIHRydWUgYWZ0ZXIgQ29udHJvbCBQcmVmaXhcclxuICAgICAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChjdHJsLlNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgKDxGaWVsZD5jdHJsLmdldEZpZWxkKCkpLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb2RlIGlzIHJlYWNoZWQgdGhlbiBldmVyeXRoaW5nIGlzIG9rIGluIHRoZSBjb250cm9sIHByZWZpeFxyXG4gICAgICAgICAgICAgIC8vIHVzZXIgaGFuZGxlci4gTm93LCBtb3ZlIHRoZSBmb2N1cyB0byB0aGUgY29udHJvbC5cclxuICAgICAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgcGFya2VkIG9uIGEgY3RybCBzZXQgY2xpY2tlZCBjdHJsIHRvIG51bGxcclxuICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdG8gdGFrZSBjYXJlIG9mIHRlbXBvcmFyeSBlZGl0b3JcclxuICAgICAgICAgICAgICAvLyBNYW5hZ2VyLnNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICBhd2FpdCBjdHJsLlNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwYXJrZWQgb24gYSBjdHJsLCBzZXQgc2V0c3RvcGV4ZWN1dGlvbkN0cmwgdG8gbnVsbFxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBjdHJsO1xyXG4gICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIC8vIGRpc2FibGUgYWN0aW9ucyBhbmQgc3RhdGVzLiBkbyBpdCBvbmx5IGlmIHdlIGFyZSBnZXR0aW5nIG91dCBvZiB0aGUgY29udHJvbC5cclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIGN0cmwuU2V0S2V5Ym9hcmRMYW5ndWFnZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkgfHwgY3RybC51c2Vab29tSGFuZGxlcigpKVxyXG4gICAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIGZhbHNlKTtcclxuICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEwsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAvLyBJZiBjb250cm9sIHN1ZmZpeCBnZXQgJ3N0b3AgZXhlY3V0aW9uJyAoZS5nLiB2ZXJpZnkgZXJyb3IpLCB0aGUgZm9jdXMgd2lsbCBiZSByZW1haW4gb24gY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgICAgIC8vIFNvIHNldCBJbkNvbnRyb2wgdG8gdHJ1ZVxyXG4gICAgICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gdHJ1ZTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmllbGRzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGEgdGV4dCBjb250cm9sIGFuZCB3aXRoIHR5cGUgdGhhdCBoYXMgZGVmYXVsdCBkaXNwbGF5XHJcbiAgICAgICAgICAgIC8vIHZhbHVlIChudW1lcmljLCBkYXRlLCB0aW1lLCBsb2dpY2FsIGV0YylcclxuICAgICAgICAgICAgbGV0IGZsZDogRmllbGQgPSA8RmllbGQ+Y3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICAgICAgICBpZiAoZmxkICE9IG51bGwgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZmxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgICAgY3RybC5zZXRJbkNvbnRyb2xTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBjdHJsLklzSW50ZXJhY3RpdmVVcGRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGN0cmwuUHJvcGVydHlFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykuUmVmcmVzaERpc3BsYXkodHJ1ZSk7XHJcbiAgICAgICAgICAgIGN0cmwuVmFsaWRhdGVDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9OT05FKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBzaW11bGF0ZXMgdXNlciBhc2tpbmcgZm9yIHRoZSBuZXh0IHJlYy5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQzpcclxuICAgICAgICAgIGxldCBmb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgIGlmICghdGFzay5pc01haW5Qcm9nKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhmb3JtLmlzTGluZU1vZGUoKVxyXG4gICAgICAgICAgICAgID8gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1dcclxuICAgICAgICAgICAgICA6IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSxcclxuICAgICAgICAgICAgICBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCk7XHJcbiAgICAgICAgICAgIC8vIGVuZCBvZiBkYXRhIHdpbGwgc2lnbmFsIHVzIHRvIGVuZCB0aGUgdGFzayAodW5sZXNzIGluIGNyZWF0ZSBtb2RlKS5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBkZWxldGUgcmVjb3JkIGluIG5vbiBpbnRlcmFjdGl2ZSB0YXNrXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDOlxyXG4gICAgICAgICAgLy8gY2hlY2sgZW1wdHkgZGF0YXZpZXcgYmVmb3JlIHRyeWluZyB0byBkZWxldGUsIGluIGNhc2UgdGFzayBzdGFydGVkIHdpdGggZW1wdHkgZGF0YXZpZXcuXHJcbiAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgKHRhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSggdGFzaywgZHYsIHJlYywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gZW5kIG9mIGRhdGEgd2lsbCBzaWduYWwgdXMgdG8gZW5kIHRoZSB0YXNrICh1bmxlc3MgaW4gY3JlYXRlIG1vZGUpLlxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFOlxyXG4gICAgICAgICAgbGV0IHJlZnJlc2hEaXNwbGF5IDogYm9vbGVhbiA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKSA9PT0gJzEnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0NvbnRyb2w+Y3RybCkudmFsaWRhdGVBbmRTZXRWYWx1ZUlmQWxsb3dlZChldnQuZ2V0VmFsdWUoKSwgcmVmcmVzaERpc3BsYXkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5vbiByZXZlcnNpYmxlIGV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzazogVGFza0Jhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBsZXQgZXhpdENvbW1hbmQ6IGJvb2xlYW4gPSAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuXHJcbiAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHJ0RXZ0LnNldE5vblJldmVyc2libGVFeGl0KCk7XHJcbiAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgICAgdGhpcy5faXNOb25SZXZlcnNpYmxlRXhpdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBuZXcgaW50ZXJuYWwgRXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdFwiPmluZGljYXRlcyB3aGV0aGVyIE1HX0FDVF9DQU5DRUwgaXMgY2FsbGVkIGZyb20gTUdfQUNUX1JUX1FVSVQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrOiBUYXNrQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UICYmIHRhc2sgIT0gbnVsbCAmJiAhKGV2ZW50U3ViVHlwZSA9PT0gRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCkgJiYgIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoZXZlbnRDb2RlKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChsYXN0UGFya2VkQ3RybCwgZXZlbnRDb2RlLCBldmVudFN1YlR5cGUpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKGV2ZW50U3ViVHlwZSk7XHJcbiAgICAgICAgaWYgKEludGVybmFsSW50ZXJmYWNlLkJ1aWx0aW5FdmVudChldmVudENvZGUpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbmV3IGludGVybmFsIEV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRcIj5pbmRpY2F0ZXMgd2hldGhlciBNR19BQ1RfQ0FOQ0VMIGlzIGNhbGxlZCBmcm9tIE1HX0FDVF9SVF9RVUlUPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGN0cmw6IE1nQ29udHJvbCwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShldmVudFN1YlR5cGUpOyAvLyAodXNlIGZvciBhY3RfY2FuY2VsICYgYWN0X3J0X3ZpZXdfcmVmcmVzaFxyXG4gICAgICAvLyBiYXNpY2FsbHkgTUdfQUNUX1ZJRVdfUkVGUkVTSCByZXByZXNlbnQgdGhlIHZpZXcgcmVmcmVzaCBldmVudCByYWlzZWQgYnkgdGhlIHVzZXJcclxuICAgICAgLy8gaG93ZXZlciB3ZSB1c2UgaW50ZXJuYWxseSBpbiB0aGUgY29kZSB0byByZWZyZXNoIHRoZSBkaXNwbGF5IChtYWlubHkgaW4gc3ViIGZvcm1zIHJlZnJlc2hlcylcclxuICAgICAgLy8gaW4gb3JkZXIgdGhlIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHJlYWwgdXNlIGFuZCB0aGUgaW50ZXJuYWwgdXNlIHdlIHNldCB0aGlzIGZsYWcgdG8gZmFsc2VcclxuICAgICAgLy8gd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gc2luY2Ugd2UgbWFrZSBkaWZmZXJlbnQgYWN0aW9ucyB3aGVuIGNhY2hpbmcgYSBzdWJmb3JtXHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpXHJcbiAgICAgICAgcnRFdnQuc2V0SXNSZWFsUmVmcmVzaChmYWxzZSk7XHJcblxyXG4gICAgICBpZiAoSW50ZXJuYWxJbnRlcmZhY2UuQnVpbHRpbkV2ZW50KGV2ZW50Q29kZSkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyRmllbGQoKTogRmllbGQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJGaWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGN1cnJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckN0cmwoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJUYXNrKCk6IFRhc2sge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJGaWVsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8VGFzaz50aGlzLl9jdXJyRmllbGQuZ2V0VGFzaygpO1xyXG4gIH1cclxuXHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuKTogdm9pZDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uIDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uPyA6IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uXzAoc3RvcCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbl8xKHN0b3AsIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwic3RvcCBleGVjdXRpb25cIiBmbGFnIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0U3RvcEV4ZWN1dGlvbl8wKHN0b3A6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihzdG9wLCBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbi5BTEwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzEoc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb246IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoc3RvcClcclxuICAgICAgaWYgKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLkFMTClcclxuICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5jbGVhcigpO1xyXG4gICAgICBlbHNlIGlmKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLlNFUlZFUikge1xyXG4gICAgICAgIGxldCB0bXBWZWMgPSBuZXcgTGlzdDxSdW5UaW1lRXZlbnQ+KCk7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcbiAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2VyZSByZXF1ZXN0ZWQgdG8gbGVhdmUgdGhlIFwic2VydmVyIGV2ZW50c1wiIGluIHRoZSBxdWV1ZS5cclxuICAgICAgICAvLyBEbyBpdCwgYnV0IGFsc28gcmVtb3ZlIHRoZSBcInByb3RlY3Rpb25cIiBmcm9tIHRoZXNlIGV2ZW50cyBzbyBuZXh0XHJcbiAgICAgICAgLy8gdGltZSB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBxdWV1ZSB0aGV5IHdpbGwgYWxzbyBiZSBkZWxldGVkLlxyXG4gICAgICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpKSB7XHJcbiAgICAgICAgICBydEV2dCA9IDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gICAgICAgICAgaWYgKHJ0RXZ0LmlzRnJvbVNlcnZlcigpKSB7XHJcbiAgICAgICAgICAgIHJ0RXZ0LnJlc2V0RnJvbVNlcnZlcigpO1xyXG4gICAgICAgICAgICB0bXBWZWMucHVzaChydEV2dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG1wVmVjLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgdGhpcy5fZXZlbnRzUXVldWUucHV0KHRtcFZlYy5nZXRfSXRlbShpKSk7XHJcbiAgICAgIH1cclxuICAgIHRoaXMuX3N0b3BFeGVjdXRpb24gPSBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN0b3BFeGVjdXRpb25DdHJsKGN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID09PSBudWxsIHx8IGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID0gY3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWxldGUgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50aGUgdGFzayB0byByZWZlciB0byA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Gb3JjZURlbFwiPnRydWUgaWYgdGhlIGRlbGV0ZSBpcyBkb25lIGJlY2F1c2Ugb2YgZm9yY2UgZGVsZXRlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxDdXJyUmVjKHRhc2s6IFRhc2ssIGluRm9yY2VEZWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuXHJcbiAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG5cclxuICAgIC8vIGRlbGV0ZSB0aGUgcmVjb3JkIGFuZCBydW4gcmVjb3JkIHN1ZmZpeCBmb3IgdGhlIG5ldyBjdXJyZW50IHJlY29yZFxyXG4gICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmRlbEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBubyBjdXJyLXJlYyA9PT4gd2UgZGVsZXRlZCB0aGUgbGFzdCByZWNvcmQgYW5kIGZhaWxlZCB0byBjcmVhdGUgYSBuZXcgb25lIChlLmcuXHJcbiAgICAvLyBDUkVBVEUgbW9kZSBpcyBub3QgYWxsb3dlZCkgPT0+IGVuZCB0aGUgdGFzay4gQW4gZXhjZXB0aW9uIHRvIHRoZSBydWxlIGlzIHdoZW5cclxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgcmVjb3JkLlxyXG4gICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChkdi5nZXRDdXJyUmVjSWR4KCkgPj0gMCkge1xyXG4gICAgICAgIC8vIFFDUiAjNjU2NDk1OiBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCBhbmQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIHN0aWxsIHRoZVxyXG4gICAgICAgIC8vIGRlbGV0ZWQgb25lIHRoZW4gdGhlIHJlY29yZCBwcmVmaXggd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cclxuICAgICAgICBpZiAoKGR2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpbkZvcmNlRGVsKSB7XHJcbiAgICAgICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByb2Nlc3MgdXNlcnMgY29uZmlybWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50byBjaGVjayBjb25maXJtIHVwZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIC0gcHJvY2VzcyBjb21tYW5kLCBmYWxzZSAtIHN0b3AgY29tbWFuZCBwcm9jZXNzaW5nPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlybWVkKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjb25maXJtOiBib29sZWFuO1xyXG4gICAgbGV0IGFuc3dlcjogc3RyaW5nO1xyXG4gICAgbGV0IGFuczogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0YXNrID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25maXJtID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUsIGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgJiYgY29uZmlybSAmJiAhdGFzay5EYXRhU3luY2VkKSB7XHJcbiAgICAgIGFucyA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybShNc2dJbnRlcmZhY2UuQ1JGX1NUUl9DT05GX1VQRCxcclxuICAgICAgICBTdHlsZXMuTVNHQk9YX0lDT05fUVVFU1RJT04gfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk9fQ0FOQ0VMKTtcclxuICAgICAgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKVxyXG4gICAgICAgIGFuc3dlciA9ICdZJztcclxuICAgICAgLy8gWWVzXHJcbiAgICAgIGVsc2UgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfTk8pXHJcbiAgICAgICAgYW5zd2VyID0gJ04nO1xyXG4gICAgICAvLyBOb1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYW5zd2VyID0gJ0MnOyAvLyBDYW5jZWxcclxuICAgIH0gZWxzZVxyXG4gICAgICBhbnN3ZXIgPSAnWSc7XHJcblxyXG4gICAgc3dpdGNoIChhbnN3ZXIpIHtcclxuICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdOJzpcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgY29udGludWUgcmVjb3JkIHN1ZmZpeFxyXG5cclxuICAgICAgY2FzZSAnQyc6XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAtMSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzdG9wIGV2ZW50IHByb2Nlc3NpbmdcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLnVwZGF0ZUNvbmZpcm1lZCgpIGlsbGVnYWwgY29uZmlybWF0aW9uIGNvZGU6ICcgK1xyXG4gICAgICAgICAgY29uZmlybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29tcE1haW5QcmdUYWIoY29tcE1haW5QcmdUYWJsZTogQ29tcE1haW5QcmdUYWJsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcE1haW5QcmdUYWIgPSBjb21wTWFpblByZ1RhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFbmRPZldvcmsoZW5kT2ZXb3JrXzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5kT2ZXb3JrID0gZW5kT2ZXb3JrXztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZW5kIG9mIHdvcmsgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RW5kT2ZXb3JrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZE9mV29yaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29tcE1haW5QcmdUYWIoKTogQ29tcE1haW5QcmdUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcE1haW5QcmdUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZXZlcnNpYmxlIGV4aXQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5Ob25SZXZlcnNpYmxlRXhpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc05vblJldmVyc2libGVFeGl0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBydW50aW1lIGV2ZW50IHRvIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW50aW1lIGV2ZW50IHRvIHB1c2ggb24gdGhlIHN0YWNrPC9wYXJhbT5cclxuICBwdXNoUnRFdmVudChydEV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydEV2ZW50cy5wdXNoKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3AgYSBydW50aW1lIGV2ZW50IGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3JlIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IG9uIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRPbkxvY2FsU3RvcmFnZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBsZXQgcnRFdnQgPSB0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTtcclxuXHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCwgJzEnKTtcclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX1NSQ19UU0ssIEpTT04uc3RyaW5naWZ5KCg8VGFzaz5ydEV2dC5nZXRUYXNrKCkpLlRhc2tEZWZpbml0aW9uSWQpKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID4gMCkge1xyXG4gICAgICAgIGxldCBzdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIHJ0RXZ0LmdldEFyZ0xpc3QoKS5idWlsZFhNTChzdHIpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCwgIHN0ci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgZnJvbSBsb2NhbCBzdG9yYWdlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRGcm9tTG9jYWxTdG9yYWdlKCk6IHZvaWRcclxuICB7XHJcbiAgICAvL2dldCByb3V0ZSBldmVudCBpZiBzdG9yZWQgb24gbG9jYWwgc3RvcmFnZVxyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuXHJcbiAgICBsZXQgbGFzdFJvdXRlRXZlbnQgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlQpO1xyXG5cclxuICAgIGlmIChsYXN0Um91dGVFdmVudCA9PT0gJzEnKSB7XHJcbiAgICAgIGxldCBzcmNUYXNrRGVmaW5pdGlvblN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9TUkNfVFNLKTtcclxuICAgICAgbGV0IHJvdXRlQXJnTGlzdFN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcblxyXG4gICAgICAvLyBwYXJzZSBzcmNUYXNrRGVmaW5pdGlvblN0ciBhbmQgcHJlcGFyZSB0YXNrRGVmaW5pdGlvbklkXHJcbiAgICAgIGxldCB0YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQoKTtcclxuICAgICAgdGFza0RlZmluaXRpb25JZC5mcm9tSlNPTihzcmNUYXNrRGVmaW5pdGlvblN0cik7XHJcblxyXG4gICAgICAvL3NlYXJjaCBzb3VyY2UgdGFzayBpbiBuZXdseSBsb2FkZWQgdGFzayB0cmVlIGJ5IHRhc2tEZWZpbml0aW9uSWRcclxuICAgICAgbGV0IHNyY1Rhc2sgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5nZXRUYXNrQnlUYXNrRGVmaW5pdGlvbklEKHRhc2tEZWZpbml0aW9uSWQpO1xyXG4gICAgICBsZXQgYXJncyA9IG51bGw7XHJcbiAgICAgIGlmIChyb3V0ZUFyZ0xpc3RTdHIgIT0gbnVsbCkge1xyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdCgpO1xyXG4gICAgICAgIGFyZ3MuZmlsbExpc3Qocm91dGVBcmdMaXN0U3RyLCBzcmNUYXNrKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5BZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2ssIGFyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIHNhdmUgdGhlIGxhc3Qgcm91dGUgZXZlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50IChydEV2dDpSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChydEV2dCA9PSBudWxsKVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBudWxsO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBydEV2dC5yZXBsaWNhdGUoKTtcclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcnVudGltZSBldmVudCBsb2NhdGVkIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0UnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fcnRFdmVudHMucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgYSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBpZ25vcmUgdW5rbm93biBjb21tYW5kc1xyXG4gIC8vLyAgIGFycml2aW5nIGZyb20gdGhlIGVuZ2luZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldElnbm9yZVVua25vd25BYm9ydCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lnbm9yZVVua25vd25BYm9ydCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJpZ25vcmUgdW5rbm93biBhYm9ydFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlnbm9yZVVua25vd25BYm9ydCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmtub3duQWJvcnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY292ZXIgZnJvbSBhIGZhaWx1cmUgdG8gb3ZlcmxheSBhIHRhc2suIFdoZW4gdGhlIHNlcnZlciBvcmRlcnMgdGhlIGNsaWVudCB0byBydW4gYVxyXG4gIC8vLyAgIG5ldyB0YXNrIGluIGEgZnJhbWUgd2hpY2ggYWxyZWFkeSBjb250YWlucyBhbiBhY3RpdmUgdGFzaywgdGhlIGNsaWVudCB0cmllcyB0byB0ZXJtIHRoZVxyXG4gIC8vLyAgIGV4aXN0aW5nIHRhc2sgYW5kIHJlcGxhY2UgaGltLiBXaGVuIHRoaXMgYWN0aW9uIGZhaWxzLCB0aGUgY2xpZW50IGhhcyB0byBhc2sgdGhlIHNlcnZlclxyXG4gIC8vLyAgIHRvIHRlcm1pbmF0ZSB0aGUgTkVXIFRBU0ssIGFuZCBpZ25vcmUgdGhlIG92ZXJsYXkgYWN0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNraWRcIj4tIHRoZSBpZCBvZiB0aGUgTkVXIFRBU0s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+ICAgLSB0aGUgTUdEYXRhIG9mIHRoZSBPTEQgVEFTSy48L3BhcmFtPlxyXG4gIGFzeW5jIGZhaWxUYXNrT3ZlcmxheSh0YXNrSWQ6IHN0cmluZywgbWdkOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG5cclxuICAgIGlmICh0YXNrSWQgIT09IG51bGwpIHtcclxuICAgICAgLy8gVGhlIHNlcnZlciB3aWxsIHJldHVybiB1cyAnYWJvcnQnIGNvbW1hbmRzIGZvciB0aGUgbmV3IHRhc2suIElnbm9yZSB0aGVtLCBzaW5jZSBpdCB3YXNudCBzdGFydGVkIHlldFxyXG4gICAgICB0aGlzLnNldElnbm9yZVVua25vd25BYm9ydCh0cnVlKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVOb25SZXZlcnNpYmxlRXhpdENvbW1hbmQodGFza0lkLCBmYWxzZSk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0SWdub3JlVW5rbm93bkFib3J0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiBjdXJyZW50IGV2ZW50IHNob3VsZCBiZSBwcm9wb2d0YXRlZCB0byBhbGwgdGFza3MgaW4gYSBzcGVjaWZpYyB0cmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFdmVudFNjb3BlVHJhbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRTY29wZSA9PT0gRXZlbnRTY29wZS5UUkFOUztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZXZlbnQgc2NvcGUgdG8gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV2ZW50U2NvcGVUcmFucygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLlRSQU5TO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBldmVudCBzY29wZSB0byBOT04gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRXZlbnRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRpbWUgb2YgZmlzdCBldmVudCBpbiBzZXF1ZW5jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aW1lIG9mIGZpdHN0IGV2ZW50IGluIHNlcXVlbmNlPC9yZXR1cm5zPlxyXG4gIEdldEV2ZW50VGltZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50c1F1ZXVlLkdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJrYkl0bVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbGFzdCBlbmFibGVkIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmljIGtleSAoaW4ga2JJdGVtKTwvcmV0dXJucz5cclxuICAvLy8gPGNoZWNrQWNjZXNzS2V5SW5NZW51czo+ICBpZiB0byBjaGVjayB0aGUga2V5Ym9hcmQgaW4gdGhlIG1lbnUgPC9jaGVja0FjY2Vzc0tleUluTWVudXM6PlxyXG4gIHB1YmxpYyBnZXRNYXRjaGluZ0FjdGlvbiggIGtiSXRtOiBLZXlib2FyZEl0ZW0pOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBhY3Q6IG51bWJlciA9IDA7XHJcbiAgICAvLyB3aGVuIG1lbnUgaXMgZGVmaW5lIHdpdGggbm8ga2V5Ym9hcmQgZGVmaW5lLCB0aGUga2JJdGVtIGlzIHJldHVybiBudWxsO1xyXG4gICAgaWYgKGtiSXRtID09IG51bGwpXHJcbiAgICAgIHJldHVybiBhY3Q7XHJcblxyXG5cclxuICAgIC8vIFRoZXJlIHdhcyBubyBrYmQgbWFwcGluZyB0aGUgdGhhdCBrZXksIGJ1dCBpdCBzdGlsbCBiZWxvbmdzIHRvIGFuIGFjdGlvbi5cclxuICAgIC8vIHNlZSBpZiB0aGUga2JJdG0gaG9sZCBhbiBhY3Rpb24gKG9yaWdpbmFsbHkgbWFkZSBmb3IgTUdfQUNUX0NIQVIpLlxyXG4gICAgaWYgKGFjdCA9PT0gMCkge1xyXG4gICAgICAvLyBpZiBtZW51IHdhcyBmb3VuZCBhbmQgaXQgaXMgaW50ZXJuYWwgZXZlbnQgcHV0IGFjdGlvbiB0byB0aGUgcXVldWUgb25seSBpZiB0aGVyZSB3YXMgbm8ga2JkIG1hcHBpbmcgdGhlIHRoYXQga2V5LlxyXG4gICAgICBpZiAoa2JJdG0uZ2V0QWN0aW9uKCkgIT09IDApXHJcbiAgICAgICAgYWN0ID0ga2JJdG0uZ2V0QWN0aW9uKCk7XHJcbiAgICAgIC8vIHRoaXMgaXMgb25seSBURU1QIGhhcmRjb2RlZC4gdGhlIGFjdGlvbiB3aWxsIG5lZWQgdG8gYmUgaW4gdGhlIGtleWJvYXJkIG1hcHBpbmdcclxuICAgICAgLy8gYWxzbyBhIGNoYW5nZSB0byB0aGUgb25saW5lIChpZiB0aW1lIHBlcm1pdHMpIGFsc28gdG8gdHVybiB0aGUgdG9nZ2xlIGluc2VydCBpbnRvIGFuIGFjdC5cclxuICAgICAgZWxzZSBpZiAoa2JJdG0uZ2V0S2V5Q29kZSgpID09PSA0NSAmJiBrYkl0bS5nZXRNb2RpZmllcigpID09PSBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSAmJiBrYkl0bS5nZXRTdGF0ZXMoKSA9PT0gMClcclxuICAgICAgICBhY3QgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGFjdCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0dGVyIGZvciB0aGUgZXhlY1N0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjazwvcmV0dXJucz5cclxuICBnZXRFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2sge1xyXG4gICAgcmV0dXJuIDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyBvbmUgZW50cnkgb2YgYW4gb3BlcmF0aW9uIGludG8gdGhlIGV4ZWN1dGlvbiBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgY3VycmVudCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJJZFwiPi0gdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHdoaWNoIGhvbGRzIHRoZSByYWlzZSBldmVudCBjb21tYW5kIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSB0aGUgaWR4IG9mIHRoZSBjb21tYW5kIHdoaWNoIGNyZWF0ZWQgYW4gZXhlY3V0aW9uIHN0YWNrIGVudHJ5IChyYWlzZSBldmVudCBvZiBmdW5jdGlvbiBjYWxsKTwvcGFyYW0+XHJcbiAgcHVzaEV4ZWNTdGFjayh0YXNrSWQ6IHN0cmluZywgaGFuZGxlcklkOiBzdHJpbmcsIG9wZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wdXNoKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0VGFza0lkQnlJZCh0YXNrSWQpLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgb25lIGVudHJ5IGZyb20gdGhlIGV4ZWN1dGlvbiBzdGFjayAtIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIGFuIG9wZXJhdGlvbiB3aGljaCBjYW4gaG9sZFxyXG4gIC8vLyAgIG90aGVyIG9wZXJhdGlvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGVudHJ5IHRoYXQgd2FzIHBvcHBlZDwvcmV0dXJucz5cclxuICBwb3BFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2tFbnRyeSB7XHJcbiAgICByZXR1cm4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wb3AoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoIGEgbmV3IGVudHJ5IHRvIHRoZSBzdGFjayBvZiBzZXJ2ZXIgZXhlYyBzdGFja3MgLSB0aGlzIGlzIHRvIGRlZmVyIG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgbm90XHJcbiAgLy8vICAgZ2V0IGluZmx1ZW5jZXMgYnkgdGhlIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdoZW4gcGVyZm9ybWluZyB0aGUgcmVjb3JkIHByZWZpeCBvZiBhIHRhc2tcclxuICAvLy8gICB0aGF0IHdhcyBqdXN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgb3Igd2hlbiBjYWxsaW5nIGEgbW9kYWwgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVzaE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucHVzaChudWxsKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSBuZXcgZW50cnkgZnJvbSB0aGUgc3RhY2sgb2Ygc2VydmVyIGV4ZWN1dGlvbiBzdGFja3Mgd2hlbiB0aGUgc2VxdWVuY2UgdGhhdCBuZWVkcyB0byBhdm9pZFxyXG4gIC8vLyAgIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBoYXMgZW5kZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICB0aGlzLl9leGVjU3RhY2sucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaGVzIGFuIGV4ZWN1dGlvbiBzdGFjayBlbnRyeSBpbnRvIHRoZSBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgdGFzayBpbiB0aGUgZW50cnk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcklkXCI+LSBoYW5kbGVyIGlkIG9mIHRoZSBlbnRyeTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSBpZHggb2YgdGhlIG9wZXJhdGlvbiB3aGljaCB0aGUgZW50cnkgcmVmZXJzIHRvPC9wYXJhbT5cclxuICBwdXNoU2VydmVyRXhlY1N0YWNrKHRhc2tJZDogc3RyaW5nLCBoYW5kbGVySWQ6IHN0cmluZywgb3BlcklkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnB1c2godGFza0lkLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFycyB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBhZnRlciB3ZSBmb3VuZCB0aGUgY29ycmVjdCBuZXh0IG9wZXJhdGlvbiB0aGF0IHdlIG5lZWQgdG8gY29udGludWUgZnJvbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJTZXJ2ZXJFeGVjU3RhY2soKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbCkge1xyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV2ZXJzZSB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdlIGdldCBpdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIHB1c2ggaXQgaW4gdGhlIHNhbWUgb3JkZXJcclxuICAvLy8gICBpdCBpcyB3cml0dGVuIGluIHRoZSBtZXNzYWdlLCB3aGljaCBhY3R1YWxseSBtZWFucyB3ZSBoYXZlIHRvIHJldmVyc2UgaXQgaW4gb3JkZXIgdG8gaGFuZGxlIGl0IGNvcnJlY3RseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmV2ZXJzZVNlcnZlckV4ZWNTdGFjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsKVxyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnJldmVyc2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjayBvbiB0aGUgY2xpZW50ICtcclxuICAvLy8gICB0aGUgY3VycmVudCBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIG9uLCB3aGljaCBpcyB0aGUgbmV4dCBvcGVyYXRpb24gdGhhdCB3ZSBuZWVkIHRvIGV4ZWN1dGVcclxuICAvLy8gICBpbiB0aGUgY3VycmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJcIj4tIHRoZSBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbGVhcldoZW5Gb3VuZFwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBjbGVhciB0aGUgc2VydmVyIHN0YWNrIHdoZW4gd2UgcmVhY2ggaXRzIGVuZCxcclxuICAvLy8gICBvciBpZiB3ZSBqdXN0IHVzaW5nIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHdoYXQgdGhlIG5leHQgb3BlcmF0aW9uIGlzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnMgdGhlIG5leHQgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnRcclxuICAvLy8gICBpZiBpdCByZXR1cm5zIC0xIHRoZW4gdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgYXMgdXN1YWxcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldE5leHRPcGVySWR4KG9wZXI6IE9wZXJhdGlvbiwgY2xlYXJXaGVuRm91bmQ6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5OiBFeGVjdXRpb25TdGFja0VudHJ5ID0gbnVsbDtcclxuICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgLy8gaWYgdGhlIHNlcnZlciBleGVjIHN0YWNrIGlzIGVtcHJ5IGl0IG1lYW5zIHdlIGRpZCBub3QgcmV0dXJuIGZyb20gdGhlIHNlcnZlcixcclxuICAgIC8vIHNvIHdlIGhhdmUgdG8gY29udGludWUgd2l0aCBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgaGFuZGxlciBhcyB1c3VhbFxyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5jb3VudCgpICE9PSAwICYmIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwgJiYgISg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuZW1wdHkoKSkge1xyXG4gICAgICAvLyBpZiB0aGUgc2VydmVyJ3MgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgLVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBlbnRyeSBpbiB0aGUgY2xpZW50J3Mgc3RhY2sgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNlcnZlcidzIHN0YWNrIHNpemVcclxuICAgICAgaWYgKCg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpID4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkpIHtcclxuICAgICAgICAvLyB3ZSBjb3B5IHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHBvcCBmcm9tIGl0IHVudGlsIHRoZSBzaXplIG9mIHRoZSBzZXJ2ZXJcclxuICAgICAgICAvLyBhbmQgdGhlIGNsaWVudCBpcyB0aGUgc2FtZVxyXG4gICAgICAgIGxldCB0bXBTZXJ2ZXJFeGVjU3RhY2s6IEV4ZWN1dGlvblN0YWNrID0gbmV3IEV4ZWN1dGlvblN0YWNrKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKTtcclxuICAgICAgICB3aGlsZSAodG1wU2VydmVyRXhlY1N0YWNrLnNpemUoKSA+ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpKSB7XHJcbiAgICAgICAgICB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeSA9IHRtcFNlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIGFsbCBlbnRyaWVzIGJlZm9yZSB0aGUgbGFzdCBvbmUgd2UgcG9wcGVkIGFyZSB0aGUgc2FtZSBhcyBpbiB0aGUgY2xpZW50IGFuZFxyXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IGVudHJ5IGlzIG9uIHRoZSBzYW1lIGhhbmRsZXIgYXMgdGhlIHNlcnZlcidzIGxhc3QgZW50cnksXHJcbiAgICAgICAgLy8gYW5kIHRoZSBvcGVyYXRpb24gaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLFxyXG4gICAgICAgIC8vIHRoZW4gdGhpcyBlbnRyeSBpbiB0aGUgc2VydmVyIGluZGljYXRlcyB3aGljaCBpcyBvdXIgbmV4dCBvcGVyYXRpb25cclxuICAgICAgICBpZiAodGhpcy5fZXhlY1N0YWNrLnBlZWsoKS5FcXVhbHModG1wU2VydmVyRXhlY1N0YWNrKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5UYXNrSWQgPT09IG9wZXIuZ2V0VGFza1RhZygpICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5LkhhbmRsZXJJZCA9PT0gb3Blci5nZXRIYW5kbGVySWQoKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4ID49IG9wZXIuZ2V0U2VydmVySWQoKSkge1xyXG4gICAgICAgICAgbmV4dE9wZXJJZHggPSB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4O1xyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgYnkgb25seSAxLFxyXG4gICAgICAgICAgLy8gd2hpY2ggbWVhbnMgd2UgYXJlIGNoZWNraW5nIHRoZSB0b3AgbW9zdCBlbnRyeSBvbiB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrLFxyXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN0YWNrIGlzIHRoZSBzYW1lIG5vdywgc28gd2UgY2FuIGNsZWFyIHRoZSBzZXJ2ZXIncyBzdGFjayAtXHJcbiAgICAgICAgICAvLyB3ZSBnb3QgdG8gdGhlIHBvaW50IHdoaWNoIHdlIGFyZSBvbiB0aGUgZXhhY3Qgb3BlcmF0aW9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGVmdCBleGVjdXRpb24uXHJcbiAgICAgICAgICBpZiAoY2xlYXJXaGVuRm91bmQgJiYgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5zaXplKCkgPT09ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpICsgMSkge1xyXG4gICAgICAgICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICBuZXh0T3BlcklkeCA9IEV2ZW50c01hbmFnZXIuTUFYX09QRVI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBFdmVudHNNYW5hZ2VyLk1BWF9PUEVSO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dE9wZXJJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBwcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcIj48L3BhcmFtPlxyXG4gIHNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrID0gaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgQWxsb3dFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQWxsb3dFdmVudHNcIj48L3BhcmFtPlxyXG4gIHNldEFsbG93RXZlbnRzKEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWxsb3dFdmVudHMgPSBBbGxvd0V2ZW50cztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIEFsbG93RXZlbnRzIGZvciBhIG5vbiBpbnRlcmFjdGl2ZSB0YXNrLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJBbGxvd0V2ZW50c1wiPjwvcGFyYW0+XHJcbiAgc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhBbGxvd0V2ZW50czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKEFsbG93RXZlbnRzKVxyXG5cclxuICAgICAgdGhpcy5fYWxsb3dFdmVudHMgPSBFdmVudHNBbGxvd2VkVHlwZS5OT05fSU5URVJBQ1RJVkU7XHJcbiAgICAvLyBRQ1IgIzgwMjQ5NSwgVGhlIEZvcm1zIENvbnRyb2xsZXIgbWVjaGFuaXNtIGlzIGRpc2FibGUgaWYgd2UgYXJlIGluIE5vbiBpbnRlcmFjdGl2ZSB0YXNrIHdpdGggQWxsb3dFdmVudHMgPSB0cnVlIGFuZCBPcGVuIFdpbmRvdyA9IHRydWVcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX2FsbG93RXZlbnRzID0gRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIndpdGhpbk5vbkludGVyYWN0aXZlTG9vcFwiPjwvcGFyYW0+XHJcbiAgZ2V0QWxsb3dFdmVudHMoKTogRXZlbnRzQWxsb3dlZFR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FsbG93RXZlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBUUlVFIGlmIG5vIGV2ZW50cyBhcmUgYWxsb3dlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBOb0V2ZW50c0FsbG93ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dFdmVudHMgPT09IEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgYW5kIGV4ZWN1dGUgY29udHJvbCBtb2RpZnkgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhY3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybE1vZGlmeShjdHJsOiBNZ0NvbnRyb2wsIGFjdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiBjYW5ub3QgbW9kaWZ5LCBkbyBub3RoaW5nXHJcbiAgICBpZiAoY3RybCA9PSBudWxsIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgc3dpdGNoIChhY3QpIHtcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEw6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9ESUZZOlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT046XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PRElGWSk7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYWN0aW9uIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBBbGxvd2VkRXZlbnRzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEFjdEFsbG93ZWQoYWN0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBhbGxvd2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHN3aXRjaCAodGhpcy5nZXRBbGxvd0V2ZW50cygpKSB7XHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuQUxMOlxyXG4gICAgICAgIGFsbG93ZWQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5OT05FOlxyXG4gICAgICAgIC8vIGFsbG93IGNyZWxpbmUgZXZlbiBpbiBhbGxvdz1uby4gd2UgaGF2ZSBubyBjaG9pY2UuIFJDIG1lY2hhbmlzbSBpcyBkaWZmZXJlbnQgdGhlbiBiYXRjaC4gaXQgdXNlcyBBQ1RfQ1JFQUxJTkVcclxuICAgICAgICAvLyB3aGVuIGluIGNyZWF0ZSBtb2RlLiBXZSB3aWxsIG5lZWQgdG8gY2hhbmdlIGl0IGluIHRoZSBmdXR1cmUgc28gdGhhdCB3aGVuIHVzZXIgcmFpc2VzIGNyZWxpbmUgZXZlbnQgaXQgd2lsbCBub3Qgd29yay4ganVzdCBpbnRlcm5hbGx5LlxyXG4gICAgICAgIGFsbG93ZWQgPSAoYWN0ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAvLyBPbmx5IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgYWxsb3dlZCB3aGVuIHJ1bm5pbmcgaW5zaWRlIGEgbm9uIGludGVyYWN0aXZlIGxvb3Agd2hlbiBhbGxvdyBldmVudHMgPSBZRVMuXHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuTk9OX0lOVEVSQUNUSVZFOlxyXG5cclxuICAgICAgICBzd2l0Y2ggKGFjdCkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVF9TWVNURU06XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFsbG93ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBjb21taXRzIHRoZSByZWNvcmQgYW5kIHRoZW4gZGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdHJhbnNhY3Rpb24sIGl0IHBlcmZvcm1zIG90aGVyIGFjdGlvbnMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNSZXZlcnNpYmxlRXhpdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21taXRSZWNvcmQodGFzazogVGFzaywgaXNSZXZlcnNpYmxlRXhpdDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgbGV0IGlzU2VsZWN0aW9uVGFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuICAgIGxldCBpc05ld1JlYzogYm9vbGVhbiA9IHJlYy5pc05ld1JlYygpO1xyXG4gICAgbGV0IHNhdmVQcmV2Q3VyclJlYzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSByZWMuTW9kaWZpZWQ7XHJcblxyXG4gICAgaWYgKCFkdi5yZWNJbk1vZGlmaWVkVGFiKHJlYy5nZXRJZCgpKSlcclxuICAgICAgcmVjLmNsZWFyRmxhZ3NIaXN0b3J5KCk7XHJcbiAgICBhd2FpdCB0YXNrLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoaXNSZXZlcnNpYmxlRXhpdCwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCwgdGFzay5Db25maXJtVXBkYXRlTm8pO1xyXG4gICAgaWYgKHRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkpIHtcclxuICAgICAgLy8gb24gZmFpbHVyZSBvZiB0aGUgdHJhbnNhY3Rpb24gcmVlbnRlciB0aGUgcmVjb3JkIGxldmVsIGJ5XHJcbiAgICAgIC8vIGV4ZWN1dGluZyBcInJlY29yZCBwcmVmaXhcIiBmb3IgdGhlIHN1YmZvcm1zIHdoaWNoIGV4ZWN1dGVkXHJcbiAgICAgIC8vIHRoZSBzdWZmaXggc3VjY2Vzc2Z1bGx5XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGFzay5EYXRhU3luY2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChyZWNNb2RpZmllZClcclxuICAgICAgICByZWMuc2V0TGF0ZUNvbXB1dGUodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNzgzMDcxIGlmIGFmdGVyIGNoZWNrQW5kQ29tbWl0IGFsbCBpZiBPLksuIHRoZVxyXG4gICAgICAvLyByZXR1cm4gdGhlIGxldmVsIGJhY2sgdG8gdGFzayBsZXZlbCBpbiBvcmRlciB0byBsZXQgcmVjX3ByZml4IHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgICAvLyBldmVuIHRob3VnaCB0aGUgdGFzayBsZXZlbCBzaG91bGQgYmUgVEFTS19MRVZFTF9UQVNLXHJcbiAgICAgIC8vIHRoZSBjaGVja0FuZENvbW1pdCBwcm9jZXNzIGNvdWxkIGhhdmUgY2hhbmdlIGl0XHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgcmVjLnJlc2V0VXBkYXRlZCgpO1xyXG4gICAgICByZWMucmVzZXRNb2RpZmllZCgpO1xyXG5cclxuICAgICAgLy8gUUNSICM5ODMxNzg6IGNhbmNlbCB0aGUgcmVjb3JkIG9ubHkgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAgIC8vIGhhbmRsaW5nIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgcmVjb3JkIHdhc24ndFxyXG4gICAgICAvLyBtb2RpZmllZFxyXG4gICAgICBpZiAoIXJlY01vZGlmaWVkICYmICFmb3JjZVN1ZmZpeCAmJiAoIWlzU2VsZWN0aW9uVGFibGUgfHwgIXRhc2suSW5TZWxlY3QpKSB7XHJcbiAgICAgICAgaWYgKGlzTmV3UmVjKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQyODk2NTogc2F2ZSB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmQgQkVGT1JFXHJcbiAgICAgICAgICAvLyBcImNhbmNlbCBlZGl0XCIgc28gdGhlIGNvcnJlY3QgcmVjb3JkIGlzIHNhdmVkXHJcbiAgICAgICAgICBkdi5zZXRQcmV2Q3VyclJlYygpO1xyXG4gICAgICAgICAgc2F2ZVByZXZDdXJyUmVjID0gZmFsc2U7XHJcbiAgICAgICAgICByZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFyZWMuZ2V0Rm9yY2VTYXZlT3JnKCkpXHJcbiAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCB0cnVlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBRQ1IgIzk5NTIyMjogaWYgdGhlIHJlY29yZCB3YXMgbW9kaWZpZWQgdGhlbiBzYXZlIHRoZVxyXG4gICAgICAvLyBvcmlnaW5hbCByZWNvcmQgYWdhaW4gaW4gY2FzZSBhIHRhc2sgbGF2ZWwgdHJhbnNhY3Rpb25cclxuICAgICAgLy8gd2lsbCBmYWlsIHdpdGggcmV0cnkgc3RyYXRlZ3kuIEJlZm9yZSB0aGlzIGZpeCwgaWYgc3VjaFxyXG4gICAgICAvLyB0aGluZyBoYXBwZW5lZCBvbiBhIHJlY29yZCB3aGljaCB3YXNuJ3QgdGhlIGZpcnN0IHRoZW5cclxuICAgICAgLy8gdGhlIFwiYmVnaW4gdGFibGVcIiBldmVudCByYWlzZWQgYSByZWNvcmQgc3VmZml4IGV2ZW50IGFuZFxyXG4gICAgICAvLyBjYXVzZWQgXCJjYW5jZWwgZWRpdFwiLlxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNhdmVQcmV2Q3VyclJlYylcclxuICAgICAgZHYuc2V0UHJldkN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsYmFjayBmb3IgaW5jcmVtZW50YWwgbG9jYXRlIHRpbWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbmNMb2NhdGVUaW1lckNCKHRhc2tPYmo6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0YXNrT2JqO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2ssIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkNSRU1FTlRBTF9MT0NBVEUpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IodGFzayk7XHJcbiAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBkb1N5bmNGb3JTdWJmb3JtUGFyZW50KHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICBsZXQgcGFyZW50RHYgPSA8RGF0YVZpZXc+cGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCBwYXJlbnRSZWM6IFJlY29yZCA9IHBhcmVudER2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBkbyBub3QgdG91Y2ggdGhlIHBhcmVudCByZWNvcmQgaWYgdGhlIHBhcmVudCBkYXRhdmlldyBpcyAnZW1wdHkgZGF0YXZpZXcnLlxyXG4gICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHBhcmVudFJlYyAhPSBudWxsICYmIHBhcmVudFJlYy5Nb2RpZmllZCAmJiAhcGFyZW50RHYuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgcGFyZW50UmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgIGF3YWl0IHBhcmVudER2LmFkZEN1cnJUb01vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgKChwYXJlbnREdi5nZXRDdXJyUmVjKCkpKS5TeW5jZWQgPSB0cnVlO1xyXG4gICAgICBwYXJlbnREdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICBsZXQgZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQocGFyZW50VGFzay5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRXhlY3V0ZUxvY2FsVXBkYXRlcyk7XHJcbiAgICAgIGF3YWl0IHBhcmVudFRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBQcm9jZXNzQWJvcnRpbmdFcnJvcihleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlTXNnOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyRm9yQ29uc29sZTogc3RyaW5nO1xyXG4gICAgbGV0IGVyckZvck1zZ0JveDogc3RyaW5nO1xyXG5cclxuICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKVxyXG4gICAgICBlTXNnID0gKDxTZXJ2ZXJFcnJvcj5leCkuR2V0TWVzc2FnZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICBlTXNnID0gKChleC5NZXNzYWdlICE9PSBudWxsKSA/IGV4Lk1lc3NhZ2UgOiBleC5HZXRUeXBlKCkpO1xyXG5cclxuICAgIGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGVNc2cpO1xyXG4gICAgZXJyRm9yTXNnQm94ID0gU3RyVXRpbC5nZXRNc2dCb3hFcm9yU3RyaW5nKGVNc2cpO1xyXG5cclxuICAgIGlmIChleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbClcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXguSW5uZXJFeGNlcHRpb24sIGVyckZvckNvbnNvbGUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHx8IExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhlcnJGb3JDb25zb2xlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE8gOiBoYW5kbGUgZXJyb3JzXHJcbiAgICBsZXQgc2VuZFVubG9hZFRvU2VydmVyOiBib29sZWFuID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCAhPT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkOyAgLy8gdW5sb2FkIHRoZSBjb250ZXh0IGluIHRoZSBzZXJ2ZXIgb25seSBpZiBhIGNvbnRleHQgd2FzIGNyZWF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IHNlc3Npb25cclxuXHJcbiAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IDA7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2VTdHJpbmc6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLkJSS1RBQl9TVFJfRVJST1IpO1xyXG5cclxuICAgIGxldCBzdHlsZTogbnVtYmVyID0gMTY7XHJcbiAgICBpZiAoZXguTWVzc2FnZS5zdGFydHNXaXRoKCc8SFRNTCcpKSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0hUTUxDb250ZW50KGV4Lk1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgc2hvdyB0aGUgbWVzc2FnZSBib3hcclxuICAgICAgLy8gaWRlYWxseSwgdGhlIGN1cnJlbnQgcGFnZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXJyb3IgcGFnZVxyXG4gICAgICBpZiAodGhpcy5TaG93RXJyb3JJbk1lc3NhZ2VCb3goZXgpKSB7XHJcbiAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1lc3NhZ2VTdHJpbmcsIGVyckZvck1zZ0JveCwgc3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKXtcclxuICAgICAgICBpZigoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEIHx8XHJcbiAgICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpIHtcclxuICAgICAgICAgICBDb21tYW5kcy5hZGRHbG9iYWxDb21tYW5kKENvbW1hbmRUeXBlLlJFTE9BRF9QQUdFKTtcclxuICAgICAgICAgICAvLyBNdXN0IGNhbGwgYmVnaW5JbnZva2UgaGVyZTsgaW4gdGhlIGNhc2UgYSBuZXcgY29ubmVjdGlvbiB3YXMgcmVmdXNlZCwgdGhlIGJlZ2luSW52b2tlIGlzIG5ldmVyIGNhbGxlZCwgc28gd2VcclxuICAgICAgICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBjYWxsZWQgaGVyZVxyXG4gICAgICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogSG93IHRvIGNoZWNrIGlmIGl0IHdhcyBDb25uZWN0RmFpbHVyZSBvciBQcm90b2NvbEVycm9yP1xyXG4gICAgLy8gSW4gY2FzZSBpZiB3ZSBhcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgaS5lLiBzdGF0dXMgaXMgQ29ubmVjdGlvbkZhaWx1cmVcclxuICAgIC8vIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gc2VuZGluZyB1bmxvYWQgY29tbWFuZCwgYmVjYXVzZSBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQgYW5kXHJcbiAgICAvLyB3ZSB3aWxsIGluIGluZmluaXRlIGxvb3AuXHJcbiAgICAvLyBsZXQgZmxhZzg6IGJvb2xlYW4gPSBleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbCAmJiBleC5Jbm5lckV4Y2VwdGlvbi5HZXRUeXBlKCkuRnVsbE5hbWUgPT09IFwiU3lzdGVtLk5ldC5XZWJFeGNlcHRpb25cIjtcclxuICAgIC8vIGlmIChmbGFnOCkge1xyXG4gICAgLy8gICBsZXQgZXgyOiBXZWJFeGNlcHRpb24gPSA8V2ViRXhjZXB0aW9uPmV4LklubmVyRXhjZXB0aW9uO1xyXG4gICAgLy8gICBsZXQgZmxhZzk6IGJvb2xlYW4gPSBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuQ29ubmVjdEZhaWx1cmUgfHwgZXgyLlN0YXR1cyA9PT0gV2ViRXhjZXB0aW9uU3RhdHVzLlByb3RvY29sRXJyb3I7XHJcbiAgICAvLyAgIGlmIChmbGFnOSkge1xyXG4gICAgLy8gICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIHByb2dyYW0gaXMgcmVsb2FkZWQgYnkgdGhlIHNlcnZlciwgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIHVubG9hZCBpdFxyXG4gICAgICBpZiAoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfQ1RYX05PVF9GT1VORCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbmRVbmxvYWRUb1NlcnZlcikge1xyXG4gICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlIHJ1bnRpbWUuXHJcbiAgICAgIC8vIElmIHdlIHRlcm1pbmF0ZSBSVEUgYW5kIHRoZW4gY2xvc2UgUkMgd2luZG93IHRoZW4gYWxzbyB3ZSB3aWxsIGJlXHJcbiAgICAgIC8vIFByb2Nlc3NpbmcgQWJvcnQgZXJyb3IgaW4gdGhhdCBjYXNlIHNlcnZlciBpcyBhbHJlYWR5IGNsb3NlZCBzbyBjYXRjaCB0aGUgZXhjZXB0aW9uLlxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBjYXRjaCAoZXgzKSB7XHJcbiAgICAgICAgaWYgKGV4MyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleDMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXgzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NIVE1MQ29udGVudChodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRTaG93SFRNTEVycm9yKENvbW1hbmRUeXBlLlNIT1dfSFRNTF9FUlJPUiwgaHRtbENvbnRlbnQpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGRlY2lkZXMgaWYgdGhlIGVycm9yIGhhbmRsZWQgaW4gUHJvY2Vzc0Fib3J0aW5nRXJyb3Igd2lsbCBvcGVuIGEgbWVzc2FnZSBib3hcclxuICBTaG93RXJyb3JJbk1lc3NhZ2VCb3goZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZighKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiBjaGFuZ2VzIGluIHRoZSBzdHVkaW8gY2F1c2UgYSByZWxvYWQsIHNob3cgdGhlIG1lc3NhZ2Vib3ggb25seSBpZiB0aGUgdXNlciB0cmllZCB0b1xyXG4gICAgLy8gY29udGludWUgd29ya2luZyB3aXRoIGFuIG9sZCBjb250ZXh0XHJcbiAgICBpZigoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQgfHxcclxuICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQpICYmXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9PT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXRJc0luVmlld1JlZnJlc2goKTogYm9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmlzSW5WaWV3UmVmcmVzaDtcclxuICB9XHJcblxyXG4gIHNldElzSW5WaWV3UmVmcmVzaChpblZpZXdSZWZyZXNoOiBib29sZWFuKTogdm9pZHtcclxuICAgIHRoaXMuaXNJblZpZXdSZWZyZXNoID0gaW5WaWV3UmVmcmVzaDtcclxuICB9XHJcbn1cclxuIl19
|