@magic-xpa/engine 4.800.0 → 4.801.0-dev000.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/index.mjs +190 -0
- package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
- package/esm2020/src/AccessHelper.mjs +3 -0
- package/esm2020/src/ClientManager.mjs +403 -0
- package/esm2020/src/CommandsProcessorBase.mjs +58 -0
- package/esm2020/src/CommandsProcessorManager.mjs +26 -0
- package/esm2020/src/CommandsTable.mjs +163 -0
- package/{esm2015/src/ConstInterface.js → esm2020/src/ConstInterface.mjs} +0 -0
- package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
- package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
- package/esm2020/src/GUIManager.mjs +63 -0
- package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
- package/esm2020/src/GuiEventsProcessor.mjs +171 -0
- package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
- package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
- package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
- package/esm2020/src/bridge/MagicBridge.mjs +41 -0
- package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs +15 -0
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -0
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
- package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +20 -0
- package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +2 -2
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +36 -0
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +40 -0
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
- package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
- package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
- package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
- package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
- package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +39 -0
- package/{esm2015/src/commands/ClientToServer/SelectProgramCommand.js → esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +28 -0
- package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
- package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
- package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
- package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
- package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
- package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
- package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
- package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
- package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
- package/esm2020/src/data/DataView.mjs +1634 -0
- package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
- package/esm2020/src/data/DataviewManager.mjs +28 -0
- package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
- package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
- package/esm2020/src/data/Field.mjs +645 -0
- package/esm2020/src/data/FieldBase.mjs +18 -0
- package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
- package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
- package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
- package/esm2020/src/data/Record.mjs +846 -0
- package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
- package/esm2020/src/data/RecordsTable.mjs +267 -0
- package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
- package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
- package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2020/src/env/Environment.mjs +554 -0
- package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
- package/esm2020/src/env/LanguageData.mjs +222 -0
- package/esm2020/src/env/MirrorString.mjs +66 -0
- package/{esm2015/src/event/ActionManager.js → esm2020/src/event/ActionManager.mjs} +0 -0
- package/esm2020/src/event/Event.mjs +1436 -0
- package/esm2020/src/event/EventHandler.mjs +773 -0
- package/esm2020/src/event/EventHandlerPosition.mjs +201 -0
- package/esm2020/src/event/EventsManager.mjs +2983 -0
- package/esm2020/src/event/IEventsManager.mjs +7 -0
- package/esm2020/src/event/RunTimeEvent.mjs +406 -0
- package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
- package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
- package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
- package/esm2020/src/exp/Expression.mjs +200 -0
- package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +0 -0
- package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +314 -0
- package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2020/src/exp/YesNoExp.mjs +41 -0
- package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
- package/esm2020/src/gui/FormsTable.mjs +66 -0
- package/esm2020/src/gui/MgControl.mjs +357 -0
- package/esm2020/src/gui/MgForm.mjs +1195 -0
- package/esm2020/src/http/HttpManager.mjs +97 -0
- package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
- package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
- package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
- package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
- package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
- package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
- package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
- package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
- package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/esm2020/src/remote/ServerError.mjs +44 -0
- package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
- package/esm2020/src/rt/Argument.mjs +274 -0
- package/esm2020/src/rt/ArgumentsList.mjs +103 -0
- package/esm2020/src/rt/Boundary.mjs +158 -0
- package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
- package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
- package/esm2020/src/rt/DataviewHeaderFactory.mjs +7 -0
- package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +39 -0
- package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
- package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
- package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
- package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
- package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
- package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
- package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
- package/esm2020/src/rt/Operation.mjs +745 -0
- package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
- package/esm2020/src/rt/Recompute.mjs +355 -0
- package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
- package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
- package/esm2020/src/rt/TableCache.mjs +177 -0
- package/esm2020/src/rt/TableCacheManager.mjs +67 -0
- package/esm2020/src/rt/Transaction.mjs +54 -0
- package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
- package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
- package/esm2020/src/tasks/MGData.mjs +552 -0
- package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
- package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
- package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
- package/esm2020/src/tasks/RemoteTaskService.mjs +45 -0
- package/esm2020/src/tasks/Task.mjs +2501 -0
- package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
- package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2020/src/tasks/TasksTable.mjs +80 -0
- package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
- package/esm2020/src/tasks/sort/SortCollection.mjs +72 -0
- package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
- package/{esm2015/src/util/FlowMonitorQueue.js → esm2020/src/util/FlowMonitorQueue.mjs} +15 -18
- package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
- package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +2 -1
- package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
- package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
- package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
- package/esm2020/src/util/ParamParseResult.mjs +8 -0
- package/esm2020/src/util/PrmMap.mjs +151 -0
- package/esm2020/src/util/Process.mjs +7 -0
- package/esm2020/src/util/ReturnResult.mjs +46 -0
- package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
- package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
- package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
- package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
- package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +267 -254
- package/fesm2015/magic-xpa-engine.mjs.map +1 -0
- package/fesm2020/magic-xpa-engine.mjs +30705 -0
- package/fesm2020/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/package.json +27 -13
- package/src/AccessHelper.d.ts +1 -1
- package/src/CommandsProcessorBase.d.ts +3 -3
- package/src/GuiEventsProcessor.d.ts +1 -1
- package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ComputeEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +1 -2
- package/src/commands/ClientToServer/DataviewCommand.d.ts +1 -2
- package/src/commands/ClientToServer/EvaluateCommand.d.ts +1 -2
- package/src/commands/ClientToServer/EventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +1 -2
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +1 -2
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/QueryCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/TransactionCommand.d.ts +1 -2
- package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +1 -2
- package/src/commands/DataViewCommandBase.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +1 -1
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
- package/src/data/FieldBase.d.ts +3 -3
- package/src/data/Record.d.ts +2 -9
- package/src/data/RecordsTable.d.ts +1 -2
- package/src/data/XMLBasedDcValuesBuilder.d.ts +1 -1
- package/src/env/EnvVariablesTable.d.ts +2 -15
- package/src/env/Environment.d.ts +0 -3
- package/src/env/MirrorString.d.ts +15 -0
- package/src/event/Event.d.ts +0 -3
- package/src/event/EventsManager.d.ts +7 -8
- package/src/event/IEventsManager.d.ts +5 -6
- package/src/exp/ExpressionEvaluator.d.ts +2 -2
- package/src/exp/ExpressionLocalJpn.d.ts +2 -2
- package/src/exp/GlobalParamsTable.d.ts +2 -1
- package/src/gui/MgControl.d.ts +0 -2
- package/src/gui/MgForm.d.ts +4 -4
- package/src/http/client/HttpClientAsync.d.ts +2 -2
- package/src/http/client/HttpClientBase.d.ts +3 -3
- package/src/http/client/HttpClientSync.d.ts +2 -2
- package/src/remote/RemoteCommandsProcessor.d.ts +1 -1
- package/src/rt/DataviewHeaderBase.d.ts +2 -2
- package/src/rt/DataviewHeaderFactory.d.ts +1 -1
- package/src/rt/Operation.d.ts +3 -1
- package/src/rt/RemoteDataviewHeader.d.ts +1 -2
- package/src/rt/Transaction.d.ts +1 -1
- package/src/tasks/RemoteTaskService.d.ts +2 -3
- package/src/tasks/Task.d.ts +1 -1
- package/src/tasks/TaskBase.d.ts +7 -7
- package/src/tasks/TaskServiceBase.d.ts +2 -4
- package/src/tasks/sort/SortCollection.d.ts +2 -3
- package/src/util/FlowMonitorQueue.d.ts +1 -1
- package/src/util/IMirrorXML.d.ts +1 -1
- package/src/util/ParamParseResult.d.ts +6 -0
- package/src/util/PrmMap.d.ts +0 -6
- package/src/util/Process.d.ts +1 -1
- package/bundles/magic-xpa-engine.umd.js +0 -38066
- package/bundles/magic-xpa-engine.umd.js.map +0 -1
- package/bundles/magic-xpa-engine.umd.min.js +0 -16
- package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
- package/esm2015/index.js +0 -188
- package/esm2015/src/AccessHelper.js +0 -3
- package/esm2015/src/ClientManager.js +0 -412
- package/esm2015/src/CommandsProcessorBase.js +0 -54
- package/esm2015/src/CommandsProcessorManager.js +0 -31
- package/esm2015/src/CommandsTable.js +0 -166
- package/esm2015/src/GUIManager.js +0 -72
- package/esm2015/src/GuiEventsProcessor.js +0 -171
- package/esm2015/src/bridge/MagicBridge.js +0 -44
- package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +0 -24
- package/esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js +0 -15
- package/esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js +0 -60
- package/esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js +0 -26
- package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
- package/esm2015/src/commands/ClientToServer/ComputeEventCommand.js +0 -23
- package/esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js +0 -20
- package/esm2015/src/commands/ClientToServer/EvaluateCommand.js +0 -36
- package/esm2015/src/commands/ClientToServer/EventCommand.js +0 -40
- package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +0 -67
- package/esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js +0 -22
- package/esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js +0 -23
- package/esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js +0 -23
- package/esm2015/src/commands/ClientToServer/QueryCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/RecomputeCommand.js +0 -27
- package/esm2015/src/commands/ClientToServer/RefreshEventCommand.js +0 -27
- package/esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js +0 -24
- package/esm2015/src/commands/ClientToServer/RollbackEventCommand.js +0 -39
- package/esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js +0 -24
- package/esm2015/src/commands/ClientToServer/TransactionCommand.js +0 -28
- package/esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js +0 -18
- package/esm2015/src/commands/DataViewCommandBase.js +0 -6
- package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
- package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
- package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
- package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
- package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
- package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
- package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
- package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
- package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
- package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
- package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
- package/esm2015/src/data/DataView.js +0 -1693
- package/esm2015/src/data/DataviewManager.js +0 -31
- package/esm2015/src/data/DataviewManagerBase.js +0 -18
- package/esm2015/src/data/Field.js +0 -672
- package/esm2015/src/data/FieldBase.js +0 -9
- package/esm2015/src/data/Record.js +0 -914
- package/esm2015/src/data/RecordsTable.js +0 -267
- package/esm2015/src/data/TaskTransactionManager.js +0 -110
- package/esm2015/src/data/XMLBasedDcValuesBuilder.js +0 -74
- package/esm2015/src/env/EnvVariablesTable.js +0 -408
- package/esm2015/src/env/Environment.js +0 -563
- package/esm2015/src/env/LanguageData.js +0 -230
- package/esm2015/src/event/Event.js +0 -1449
- package/esm2015/src/event/EventHandler.js +0 -787
- package/esm2015/src/event/EventHandlerPosition.js +0 -201
- package/esm2015/src/event/EventsManager.js +0 -3107
- package/esm2015/src/event/IEventsManager.js +0 -7
- package/esm2015/src/event/RunTimeEvent.js +0 -406
- package/esm2015/src/exp/Expression.js +0 -209
- package/esm2015/src/exp/ExpressionEvaluator.js +0 -4441
- package/esm2015/src/exp/ExpressionLocalJpn.js +0 -314
- package/esm2015/src/exp/GlobalParamsTable.js +0 -84
- package/esm2015/src/exp/YesNoExp.js +0 -44
- package/esm2015/src/gui/FormsTable.js +0 -73
- package/esm2015/src/gui/MgControl.js +0 -438
- package/esm2015/src/gui/MgForm.js +0 -1292
- package/esm2015/src/http/HttpManager.js +0 -100
- package/esm2015/src/http/client/HttpClientAsync.js +0 -72
- package/esm2015/src/http/client/HttpClientBase.js +0 -148
- package/esm2015/src/http/client/HttpClientSync.js +0 -47
- package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -903
- package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
- package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
- package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
- package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
- package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
- package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
- package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
- package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
- package/esm2015/src/remote/ServerError.js +0 -45
- package/esm2015/src/rt/Argument.js +0 -281
- package/esm2015/src/rt/ArgumentsList.js +0 -108
- package/esm2015/src/rt/Boundary.js +0 -161
- package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
- package/esm2015/src/rt/DataviewHeaderFactory.js +0 -7
- package/esm2015/src/rt/DataviewHeadersSaxHandler.js +0 -40
- package/esm2015/src/rt/Operation.js +0 -769
- package/esm2015/src/rt/Recompute.js +0 -372
- package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
- package/esm2015/src/rt/TableCache.js +0 -182
- package/esm2015/src/rt/TableCacheManager.js +0 -70
- package/esm2015/src/rt/Transaction.js +0 -54
- package/esm2015/src/tasks/MGData.js +0 -561
- package/esm2015/src/tasks/MGDataCollection.js +0 -270
- package/esm2015/src/tasks/RemoteTaskService.js +0 -45
- package/esm2015/src/tasks/Task.js +0 -2593
- package/esm2015/src/tasks/TaskServiceBase.js +0 -30
- package/esm2015/src/tasks/TasksTable.js +0 -87
- package/esm2015/src/tasks/sort/SortCollection.js +0 -72
- package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
- package/esm2015/src/util/PrmMap.js +0 -157
- package/esm2015/src/util/Process.js +0 -7
- package/esm2015/src/util/ReturnResult.js +0 -46
- package/fesm2015/magic-xpa-engine.js.map +0 -1
|
@@ -1,914 +0,0 @@
|
|
|
1
|
-
import { DataModificationTypes, EMPTY_DCREF, ExpVal, ObjectReferenceBase, ObjectReferencesCollection, RecordUtils } from '@magic-xpa/gui';
|
|
2
|
-
import { ApplicationException, Int32, ISO_8859_1_Encoding, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
|
3
|
-
import { Base64, Constants, Logger, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
4
|
-
import { ExpressionEvaluator, NullValueException } from '../exp/ExpressionEvaluator';
|
|
5
|
-
import { ConstInterface } from '../ConstInterface';
|
|
6
|
-
import { Environment } from '../env/Environment';
|
|
7
|
-
import { DataViewBase } from './DataViewBase';
|
|
8
|
-
import { isNullOrUndefined } from 'util';
|
|
9
|
-
import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
|
|
10
|
-
export class Record {
|
|
11
|
-
constructor(dvOrTableCacheOrCIdOrRecord, dataview) {
|
|
12
|
-
this._id = Int32.MinValue;
|
|
13
|
-
this.dbViewRowIdx = 0;
|
|
14
|
-
this._mode = DataModificationTypes.None;
|
|
15
|
-
this._dcRefs = null;
|
|
16
|
-
this._inCompute = false;
|
|
17
|
-
this._inRecompute = false;
|
|
18
|
-
this._newRec = false;
|
|
19
|
-
this._dataview = null;
|
|
20
|
-
this._sendToServer = true;
|
|
21
|
-
if (dvOrTableCacheOrCIdOrRecord instanceof Record)
|
|
22
|
-
Object.assign(this, dvOrTableCacheOrCIdOrRecord);
|
|
23
|
-
else if (arguments.length === 1)
|
|
24
|
-
this.constructor_0(dvOrTableCacheOrCIdOrRecord);
|
|
25
|
-
else
|
|
26
|
-
this.constructor_1(dvOrTableCacheOrCIdOrRecord, dataview);
|
|
27
|
-
}
|
|
28
|
-
get InCompute() {
|
|
29
|
-
return this._inCompute;
|
|
30
|
-
}
|
|
31
|
-
get InRecompute() {
|
|
32
|
-
return this._inRecompute;
|
|
33
|
-
}
|
|
34
|
-
constructor_0(dvOrTableCache) {
|
|
35
|
-
if (dvOrTableCache instanceof DataViewBase)
|
|
36
|
-
this._dataview = dvOrTableCache;
|
|
37
|
-
else
|
|
38
|
-
this._tableCache = dvOrTableCache;
|
|
39
|
-
this._fieldsData = new Array(this.getFieldsTab().getSize());
|
|
40
|
-
this._flags = new Uint8Array(this.getFieldsTab().getSize());
|
|
41
|
-
this._flagsHistory = new Uint8Array(this.getFieldsTab().getSize());
|
|
42
|
-
this._dcRefs = new ObjectReferencesCollection();
|
|
43
|
-
}
|
|
44
|
-
Initialize() {
|
|
45
|
-
for (let i = 0; i < this._flags.length; i = i + 1) {
|
|
46
|
-
let field = this.getFieldsTab().getField(i);
|
|
47
|
-
this._flags[i] = ((field.isNullDefault() || field.getType() === StorageAttribute.BLOB_VECTOR) ? Record.FLAG_NULL : 0);
|
|
48
|
-
if (this._dataview !== null && field.IsVirtual) {
|
|
49
|
-
let record = this._dataview.getCurrRec();
|
|
50
|
-
if (record != null && record.IsFldModifiedAtLeastOnce(i)) {
|
|
51
|
-
this.setFlag(i, Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
this._flagsHistory[i] = this._flags[i];
|
|
55
|
-
}
|
|
56
|
-
this.setNewRec();
|
|
57
|
-
}
|
|
58
|
-
constructor_1(cId, dataview) {
|
|
59
|
-
this.constructor_0(dataview);
|
|
60
|
-
this.setId(cId);
|
|
61
|
-
}
|
|
62
|
-
get Modified() {
|
|
63
|
-
return this._modified;
|
|
64
|
-
}
|
|
65
|
-
get Updated() {
|
|
66
|
-
return this._updated;
|
|
67
|
-
}
|
|
68
|
-
get SendToServer() {
|
|
69
|
-
return this._sendToServer;
|
|
70
|
-
}
|
|
71
|
-
CompareTo(obj) {
|
|
72
|
-
let res = 0;
|
|
73
|
-
let compTo = obj;
|
|
74
|
-
let key = this._tableCache.GetKeyById(this._tableCache.GetCurrSortKey());
|
|
75
|
-
if (key != null) {
|
|
76
|
-
for (let i = 0; i < key.Columns.length; i++) {
|
|
77
|
-
let currFld = key.Columns.get_Item(i);
|
|
78
|
-
let currFldId = currFld.getId();
|
|
79
|
-
if (this.IsNull(currFldId) && compTo.IsNull(currFldId))
|
|
80
|
-
continue;
|
|
81
|
-
else if (this.IsNull(currFldId) && !compTo.IsNull(currFldId)) {
|
|
82
|
-
res = 1;
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
else if (!this.IsNull(currFldId) && compTo.IsNull(currFldId)) {
|
|
86
|
-
res = -1;
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
try {
|
|
91
|
-
let first = new ExpVal(currFld.getType(), false, this.GetFieldValue(currFldId));
|
|
92
|
-
let second = new ExpVal(currFld.getType(), false, compTo.GetFieldValue(currFldId));
|
|
93
|
-
res = ExpressionEvaluator.val_cmp_any(first, second, false);
|
|
94
|
-
if (res !== 0)
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
if (err instanceof NullValueException)
|
|
99
|
-
Logger.Instance.WriteExceptionToLogWithMsg(" in Record.CompareTo null value was reached");
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return res;
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
res = -1;
|
|
107
|
-
return res;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
getMode() {
|
|
111
|
-
return this._mode;
|
|
112
|
-
}
|
|
113
|
-
getId() {
|
|
114
|
-
return this._id;
|
|
115
|
-
}
|
|
116
|
-
isNewRec() {
|
|
117
|
-
return this._newRec;
|
|
118
|
-
}
|
|
119
|
-
getFieldDataXML(fldIdx, getOldVal) {
|
|
120
|
-
if (arguments.length === 2)
|
|
121
|
-
return this.getFieldDataXML_0(fldIdx, getOldVal);
|
|
122
|
-
else
|
|
123
|
-
return this.getFieldDataXML_1(fldIdx);
|
|
124
|
-
}
|
|
125
|
-
getFieldDataXML_0(fldIdx, getOldVal) {
|
|
126
|
-
let fldVal;
|
|
127
|
-
if (!getOldVal)
|
|
128
|
-
fldVal = this.GetFieldValue(fldIdx);
|
|
129
|
-
else
|
|
130
|
-
fldVal = (this.getFieldsTab().getField(fldIdx)).getOriginalValue();
|
|
131
|
-
if (fldVal == null)
|
|
132
|
-
throw new ApplicationException("in Record.buildFieldsData() null field value!\nField id: " + fldIdx);
|
|
133
|
-
let tmpBuf = this.getXMLForValue(fldIdx, fldVal);
|
|
134
|
-
return XmlParser.escape(tmpBuf.toString()).toString();
|
|
135
|
-
}
|
|
136
|
-
getFieldDataXML_1(fldIdx) {
|
|
137
|
-
let fieldValue = this.GetFieldValue(fldIdx);
|
|
138
|
-
if (fieldValue === null) {
|
|
139
|
-
throw new ApplicationException("in Record.buildFieldsData() null field value!\nField id: " + fldIdx);
|
|
140
|
-
}
|
|
141
|
-
let type = this.getFieldsTab().getType(fldIdx);
|
|
142
|
-
return RecordUtils.serializeItemVal(fieldValue, type);
|
|
143
|
-
}
|
|
144
|
-
getFieldsTab() {
|
|
145
|
-
if (this._dataview !== null)
|
|
146
|
-
return this._dataview.GetFieldsTab();
|
|
147
|
-
else
|
|
148
|
-
return this._tableCache.FldsTab;
|
|
149
|
-
}
|
|
150
|
-
setInitialFldVals(clobberedOnly, isNewRec) {
|
|
151
|
-
let i, size;
|
|
152
|
-
let fld = null;
|
|
153
|
-
size = this.getSizeFld(true);
|
|
154
|
-
for (i = 0; i < size; i++) {
|
|
155
|
-
if (this._fieldsData[i] === null || typeof this._fieldsData[i] === "undefined") {
|
|
156
|
-
fld = this.getFieldsTab().getField(i);
|
|
157
|
-
this._fieldsData[i] = fld.getNewRecValue(clobberedOnly);
|
|
158
|
-
if (isNewRec && fld.IsVirtual && !fld.isNull())
|
|
159
|
-
this.clearFlag(fld.getId(), Record.FLAG_NULL);
|
|
160
|
-
if (fld.IsVirtual && fld.getModifiedAtLeastOnce())
|
|
161
|
-
this.setFlag(fld.getId(), Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
|
162
|
-
if (this._fieldsData[i] === null || typeof this._fieldsData[i] === "undefined")
|
|
163
|
-
this._fieldsData[i] = fld.getDefaultValue();
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
setId(cId) {
|
|
168
|
-
this._id = cId;
|
|
169
|
-
this._hashKey = this._id;
|
|
170
|
-
}
|
|
171
|
-
setDBViewRowIdx(rowId) {
|
|
172
|
-
this.dbViewRowIdx = rowId;
|
|
173
|
-
}
|
|
174
|
-
getDBViewRowIdx() {
|
|
175
|
-
return this.dbViewRowIdx;
|
|
176
|
-
}
|
|
177
|
-
fillData(parser) {
|
|
178
|
-
let isCurrRec = false;
|
|
179
|
-
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
|
180
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
181
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
182
|
-
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_REC) + ConstInterface.MG_TAG_REC.length);
|
|
183
|
-
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
184
|
-
isCurrRec = this.initElements(tokensVector);
|
|
185
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
|
186
|
-
}
|
|
187
|
-
else
|
|
188
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in Record.FillInnerData() out of bounds");
|
|
189
|
-
return isCurrRec;
|
|
190
|
-
}
|
|
191
|
-
initElements(tokensVector) {
|
|
192
|
-
let attribute, valueStr;
|
|
193
|
-
let recFieldsData = null;
|
|
194
|
-
let recFlags = null;
|
|
195
|
-
let j = 0;
|
|
196
|
-
let isCurrRec;
|
|
197
|
-
isCurrRec = this.peekIsCurrRec(tokensVector);
|
|
198
|
-
for (; j < tokensVector.length; j += 2) {
|
|
199
|
-
attribute = (tokensVector.get_Item(j));
|
|
200
|
-
valueStr = (tokensVector.get_Item(j + 1));
|
|
201
|
-
switch (attribute) {
|
|
202
|
-
case ConstInterface.MG_ATTR_MODE:
|
|
203
|
-
this._mode = valueStr[0];
|
|
204
|
-
break;
|
|
205
|
-
case XMLConstants.MG_ATTR_ID:
|
|
206
|
-
this.setId(XmlParser.getInt(valueStr));
|
|
207
|
-
break;
|
|
208
|
-
case XMLConstants.MG_ATTR_VB_VIEW_ROWIDX:
|
|
209
|
-
this.setDBViewRowIdx(XmlParser.getInt(valueStr));
|
|
210
|
-
break;
|
|
211
|
-
case XMLConstants.MG_ATTR_VALUE:
|
|
212
|
-
if (this.ValueInBase64) {
|
|
213
|
-
recFieldsData = Base64.decode(valueStr);
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
recFieldsData = XmlParser.unescape(valueStr);
|
|
217
|
-
}
|
|
218
|
-
break;
|
|
219
|
-
case ConstInterface.MG_ATTR_CURR_REC:
|
|
220
|
-
{
|
|
221
|
-
}
|
|
222
|
-
break;
|
|
223
|
-
case ConstInterface.MG_ATTR_ADD_AFTER:
|
|
224
|
-
this._addAfter = XmlParser.getInt(valueStr);
|
|
225
|
-
break;
|
|
226
|
-
case ConstInterface.MG_ATTR_FLAGS:
|
|
227
|
-
recFlags = valueStr;
|
|
228
|
-
break;
|
|
229
|
-
case ConstInterface.MG_ATTR_MODIFIED:
|
|
230
|
-
this._modified = true;
|
|
231
|
-
break;
|
|
232
|
-
case ConstInterface.MG_ATTR_DC_REFS:
|
|
233
|
-
this.fillDCRef(valueStr);
|
|
234
|
-
break;
|
|
235
|
-
case ConstInterface.MG_ATTR_DBPOS:
|
|
236
|
-
this._dbPosBase64Val = valueStr;
|
|
237
|
-
break;
|
|
238
|
-
default:
|
|
239
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in Record.initElements() unknown attribute: " + attribute);
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
if (this.ValueInBase64) {
|
|
244
|
-
let fldValInBytes = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(recFieldsData);
|
|
245
|
-
this.fillFieldsData(fldValInBytes, recFlags);
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
this.fillFieldsData(recFieldsData, recFlags, isCurrRec);
|
|
249
|
-
}
|
|
250
|
-
return isCurrRec;
|
|
251
|
-
}
|
|
252
|
-
peekIsCurrRec(tokensVector) {
|
|
253
|
-
let attribute;
|
|
254
|
-
let valueStr;
|
|
255
|
-
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
256
|
-
attribute = (tokensVector.get_Item(j));
|
|
257
|
-
if (attribute === ConstInterface.MG_ATTR_CURR_REC) {
|
|
258
|
-
valueStr = (tokensVector.get_Item(j + 1));
|
|
259
|
-
return XmlParser.getBoolean(valueStr);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
fillFieldsData(fldValInBytesOrFldsVal, recFlags, isCurrRec) {
|
|
265
|
-
if (isNullOrUndefined(isCurrRec))
|
|
266
|
-
this.fillFieldsData_0(fldValInBytesOrFldsVal, recFlags);
|
|
267
|
-
else
|
|
268
|
-
this.fillFieldsData_1(fldValInBytesOrFldsVal, recFlags, isCurrRec);
|
|
269
|
-
}
|
|
270
|
-
fillFieldsData_0(fldValInBytes, recFlags) {
|
|
271
|
-
}
|
|
272
|
-
fillFieldsData_1(fldsVal, recFlags, isCurrRec) {
|
|
273
|
-
let val = null;
|
|
274
|
-
let tmp = null;
|
|
275
|
-
let parsedLen = new RefParam(0);
|
|
276
|
-
let i, j = 0, from, size;
|
|
277
|
-
let currType;
|
|
278
|
-
let useHex;
|
|
279
|
-
let fld = null;
|
|
280
|
-
let valueNotPassed;
|
|
281
|
-
from = this.getFromFldIdx(isCurrRec);
|
|
282
|
-
size = this.getSizeFld(isCurrRec);
|
|
283
|
-
for (i = from; j < size; i++, j++) {
|
|
284
|
-
fld = this.getFieldsTab().getField(i);
|
|
285
|
-
currType = fld.getType();
|
|
286
|
-
useHex = (Environment.Instance.GetDebugLevel() > 1 ||
|
|
287
|
-
currType === StorageAttribute.ALPHA ||
|
|
288
|
-
currType === StorageAttribute.UNICODE ||
|
|
289
|
-
StorageAttributeCheck.isTypeLogical(currType));
|
|
290
|
-
if (recFlags[j] === '.')
|
|
291
|
-
this._flags[i] = 0;
|
|
292
|
-
else if (recFlags[j] === '/')
|
|
293
|
-
this._flags[i] = 1;
|
|
294
|
-
else {
|
|
295
|
-
tmp = recFlags.substr(j * 2, 2);
|
|
296
|
-
this._flags[i] = parseInt(tmp, 16);
|
|
297
|
-
}
|
|
298
|
-
valueNotPassed = Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED);
|
|
299
|
-
this._flags[i] = this._flags[i] & ~Record.FLAG_VALUE_NOT_PASSED;
|
|
300
|
-
this._flagsHistory[i] = this._flags[i];
|
|
301
|
-
if (Record.FLAG_UPDATED === (this._flags[i] & Record.FLAG_UPDATED))
|
|
302
|
-
this._updated = true;
|
|
303
|
-
if (valueNotPassed) {
|
|
304
|
-
if (Record.FLAG_NULL === (this._flags[i] & Record.FLAG_NULL)) {
|
|
305
|
-
val = fld.getDefaultValue();
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
val = this._dataview.getCurrRec().GetFieldValue(i);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
val = RecordUtils.deSerializeItemVal(fldsVal, currType, fld.getSize(), useHex, fld.getCellsType(), parsedLen);
|
|
313
|
-
fldsVal = fldsVal.substr(parsedLen.value);
|
|
314
|
-
}
|
|
315
|
-
this._fieldsData[i] = val;
|
|
316
|
-
}
|
|
317
|
-
this.setInitialFldVals(false, false);
|
|
318
|
-
}
|
|
319
|
-
fillDCRef(valueStr) {
|
|
320
|
-
if (!NString.IsNullOrEmpty(valueStr)) {
|
|
321
|
-
let couples = StrUtil.tokenize(valueStr, "$");
|
|
322
|
-
let size = couples.length;
|
|
323
|
-
for (let i = 0; i < size; i = i + 1) {
|
|
324
|
-
this._dcRefs.Add(DcValuesReference.Parse(couples[i], this._dataview));
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
buildFieldsData(message, isCurrRec, getOldVal) {
|
|
329
|
-
if (arguments.length === 3)
|
|
330
|
-
this.buildFieldsData_0(message, isCurrRec, getOldVal);
|
|
331
|
-
else
|
|
332
|
-
this.buildFieldsData_1(message);
|
|
333
|
-
}
|
|
334
|
-
buildFieldsData_0(message, isCurrRec, getOldVal) {
|
|
335
|
-
let tmpStr = new StringBuilder();
|
|
336
|
-
let from = this.getFromFldIdx(isCurrRec);
|
|
337
|
-
let size = this.getSizeFld(isCurrRec);
|
|
338
|
-
for (let i = from; i < from + size; i = i + 1) {
|
|
339
|
-
let fld = this.getFieldsTab().getField(i);
|
|
340
|
-
if (fld.IsExposedToClient === false)
|
|
341
|
-
this.setShrinkFlag(i);
|
|
342
|
-
if (Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED))
|
|
343
|
-
continue;
|
|
344
|
-
tmpStr.Append(this.getFieldDataXML(i, getOldVal).toString());
|
|
345
|
-
}
|
|
346
|
-
if (tmpStr.Length === 0) {
|
|
347
|
-
tmpStr.Append(" ");
|
|
348
|
-
}
|
|
349
|
-
message.Append(tmpStr.ToString());
|
|
350
|
-
}
|
|
351
|
-
buildFieldsData_1(message) {
|
|
352
|
-
let i, from, size;
|
|
353
|
-
let fieldValue = new List();
|
|
354
|
-
from = this.getFromFldIdx(false);
|
|
355
|
-
size = this.getSizeFld(false);
|
|
356
|
-
for (i = 0; i < from + size; i++) {
|
|
357
|
-
if (Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED))
|
|
358
|
-
continue;
|
|
359
|
-
let tmp = this.getFieldDataXML(i);
|
|
360
|
-
tmp.forEach(x => fieldValue.push(x));
|
|
361
|
-
}
|
|
362
|
-
let fieldValuesInBytes = new Uint8Array(fieldValue.length);
|
|
363
|
-
for (i = 0; i < fieldValue.length; i++)
|
|
364
|
-
fieldValuesInBytes[i] = fieldValue.get_Item(i);
|
|
365
|
-
let encodedfieldValuesInBytes = Base64.encode(fieldValuesInBytes);
|
|
366
|
-
let tmpStr = Environment.Instance.GetEncoding().GetString(encodedfieldValuesInBytes, 0, encodedfieldValuesInBytes.length);
|
|
367
|
-
message.Append(tmpStr);
|
|
368
|
-
}
|
|
369
|
-
getXMLForValue(fldIdx, fldVal) {
|
|
370
|
-
let cellAttr = StorageAttribute.SKIP;
|
|
371
|
-
let fldAttr = this.getFieldsTab().getType(fldIdx);
|
|
372
|
-
if (fldAttr === StorageAttribute.BLOB_VECTOR)
|
|
373
|
-
cellAttr = this.getFieldsTab().getField(fldIdx).getCellsType();
|
|
374
|
-
let toBase64 = Environment.Instance.GetDebugLevel() <= 1;
|
|
375
|
-
return Record.serializeItemVal(fldVal, fldAttr, cellAttr, toBase64);
|
|
376
|
-
}
|
|
377
|
-
getFromFldIdx(isCurrRec) {
|
|
378
|
-
if (isCurrRec)
|
|
379
|
-
return 0;
|
|
380
|
-
else
|
|
381
|
-
return this.getFieldsTab().getRMIdx();
|
|
382
|
-
}
|
|
383
|
-
getSizeFld(isCurrRec) {
|
|
384
|
-
if (isCurrRec)
|
|
385
|
-
return this.getFieldsTab().getSize();
|
|
386
|
-
else
|
|
387
|
-
return this.getFieldsTab().getRMSize();
|
|
388
|
-
}
|
|
389
|
-
buildXML(message, isCurrRec, forceBuild) {
|
|
390
|
-
if (isNullOrUndefined(forceBuild))
|
|
391
|
-
this.buildXML_0(message, isCurrRec);
|
|
392
|
-
else
|
|
393
|
-
this.buildXML_1(message, isCurrRec, forceBuild);
|
|
394
|
-
}
|
|
395
|
-
buildXML_0(message, isCurrRec) {
|
|
396
|
-
this.buildXML_1(message, isCurrRec, false);
|
|
397
|
-
}
|
|
398
|
-
buildXML_1(message, isCurrRec, forceBuild) {
|
|
399
|
-
let recFlags;
|
|
400
|
-
let from, size, i;
|
|
401
|
-
let aFlag;
|
|
402
|
-
let hexFlag;
|
|
403
|
-
if (!forceBuild)
|
|
404
|
-
if (this._mode !== DataModificationTypes.Insert && this._mode !== DataModificationTypes.Update &&
|
|
405
|
-
this._mode !== DataModificationTypes.Delete && !isCurrRec)
|
|
406
|
-
return;
|
|
407
|
-
message.Append("\n <" + ConstInterface.MG_TAG_REC);
|
|
408
|
-
if (this._id > Int32.MinValue)
|
|
409
|
-
message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._id + "\"");
|
|
410
|
-
message.Append(" " + ConstInterface.MG_ATTR_MODE + "=\"" + this._mode + "\"");
|
|
411
|
-
if (this._mode === DataModificationTypes.Insert && this._prev != null)
|
|
412
|
-
message.Append(" " + ConstInterface.MG_ATTR_ADD_AFTER + "=\"" + this._prev.getId() + "\"");
|
|
413
|
-
if (!forceBuild && !isCurrRec)
|
|
414
|
-
this.clearMode();
|
|
415
|
-
message.Append(" " + XMLConstants.MG_ATTR_VALUE + "=\"");
|
|
416
|
-
if (!forceBuild && isCurrRec)
|
|
417
|
-
this.setShrinkFlags();
|
|
418
|
-
let getOldVal;
|
|
419
|
-
if (this.Synced)
|
|
420
|
-
getOldVal = false;
|
|
421
|
-
else {
|
|
422
|
-
let task = this._dataview.getTask();
|
|
423
|
-
getOldVal = (!isCurrRec && (task.getLevel() === Constants.TASK_LEVEL_RECORD ||
|
|
424
|
-
task.getLevel() === Constants.TASK_LEVEL_CONTROL) &&
|
|
425
|
-
this._dataview.getCurrRec() != null && this._dataview.getCurrRec().getId() === this._id);
|
|
426
|
-
}
|
|
427
|
-
this.buildFieldsData(message, isCurrRec, getOldVal);
|
|
428
|
-
message.Append("\"");
|
|
429
|
-
recFlags = new StringBuilder();
|
|
430
|
-
from = this.getFromFldIdx(isCurrRec);
|
|
431
|
-
size = this.getSizeFld(isCurrRec);
|
|
432
|
-
for (i = from; i < from + size; i++) {
|
|
433
|
-
aFlag = this._flagsHistory[i];
|
|
434
|
-
aFlag = aFlag & Record.FLAG_CRSR_MODIFIED;
|
|
435
|
-
aFlag = aFlag | this._flags[i];
|
|
436
|
-
hexFlag = NNumber.ToString(aFlag, "X2");
|
|
437
|
-
recFlags.Append(hexFlag);
|
|
438
|
-
if (isCurrRec)
|
|
439
|
-
this._flags[i] = (this._flags[i] & ~Record.FLAG_VALUE_NOT_PASSED);
|
|
440
|
-
}
|
|
441
|
-
message.Append(" " + ConstInterface.MG_ATTR_FLAGS + "=\"" + recFlags.ToString() + "\"");
|
|
442
|
-
if (isCurrRec) {
|
|
443
|
-
message.Append(" " + ConstInterface.MG_ATTR_CURR_REC + "=\"1\"");
|
|
444
|
-
if (this.Modified)
|
|
445
|
-
message.Append(" " + ConstInterface.MG_ATTR_MODIFIED + "=\"1\"");
|
|
446
|
-
}
|
|
447
|
-
if (this._linksFldsPos != null)
|
|
448
|
-
message.Append(" " + ConstInterface.MG_ATTR_DBPOS + "=\"" + XmlParser.escape(this._linksFldsPos) + "\" ");
|
|
449
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
450
|
-
}
|
|
451
|
-
buildXMLForDataViewToDataSource(message) {
|
|
452
|
-
let recFlags;
|
|
453
|
-
let from, size, i;
|
|
454
|
-
let aFlag;
|
|
455
|
-
let hexFlag;
|
|
456
|
-
message.Append("\n <" + ConstInterface.MG_TAG_REC);
|
|
457
|
-
if (this._id > Int32.MinValue)
|
|
458
|
-
message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._id + "\"");
|
|
459
|
-
message.Append(" " + ConstInterface.MG_ATTR_MODE + "=\"" + this._mode + "\"");
|
|
460
|
-
if (this._mode === DataModificationTypes.Insert && this._prev != null)
|
|
461
|
-
message.Append(" " + ConstInterface.MG_ATTR_ADD_AFTER + "=\"" + this._prev.getId() + "\"");
|
|
462
|
-
message.Append(" " + XMLConstants.MG_ATTR_VALUE + "=\"");
|
|
463
|
-
this.buildFieldsData(message);
|
|
464
|
-
message.Append("\"");
|
|
465
|
-
recFlags = new StringBuilder();
|
|
466
|
-
from = this.getFromFldIdx(false);
|
|
467
|
-
size = this.getSizeFld(false);
|
|
468
|
-
for (i = from; i < from + size; i++) {
|
|
469
|
-
aFlag = this._flagsHistory[i];
|
|
470
|
-
aFlag = aFlag & Record.FLAG_CRSR_MODIFIED;
|
|
471
|
-
aFlag = aFlag | this._flags[i];
|
|
472
|
-
hexFlag = NNumber.ToString(aFlag, 'X2');
|
|
473
|
-
recFlags.Append(hexFlag);
|
|
474
|
-
}
|
|
475
|
-
message.Append(" " + ConstInterface.MG_ATTR_FLAGS + "=\"" + recFlags + "\"");
|
|
476
|
-
if (this._linksFldsPos != null)
|
|
477
|
-
message.Append(" " + ConstInterface.MG_ATTR_DBPOS + "=\"" + XmlParser.escape(this._linksFldsPos) + "\" ");
|
|
478
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
479
|
-
}
|
|
480
|
-
setShrinkFlags() {
|
|
481
|
-
let i;
|
|
482
|
-
let size = this.getSizeFld(true);
|
|
483
|
-
let serverCurrRec = this._dataview.getServerCurrRec();
|
|
484
|
-
if (serverCurrRec == null)
|
|
485
|
-
return;
|
|
486
|
-
for (i = 0; i < size; i++) {
|
|
487
|
-
if (this.fldValsEqual(serverCurrRec, i) || (Record.FLAG_NULL === (this._flags[i] & Record.FLAG_NULL))) {
|
|
488
|
-
this._flags[i] = this._flags[i] | Record.FLAG_VALUE_NOT_PASSED;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
setShrinkFlag(fldIdx) {
|
|
493
|
-
this._flags[fldIdx] |= Record.FLAG_VALUE_NOT_PASSED;
|
|
494
|
-
}
|
|
495
|
-
SetFieldValue(idx, isNull, value) {
|
|
496
|
-
let field = this.getFieldsTab().getField(idx);
|
|
497
|
-
field.UpdateNull(isNull, this);
|
|
498
|
-
value = this.CheckMgValue(value, isNull, field);
|
|
499
|
-
this._fieldsData[idx] = value;
|
|
500
|
-
field.takeValFromRec();
|
|
501
|
-
this.clearFlag(field.getId(), Record.FLAG_INVALID);
|
|
502
|
-
field.invalidate(true, false);
|
|
503
|
-
}
|
|
504
|
-
setFieldValue(fldIdx, mgVal, setRecordUpdated) {
|
|
505
|
-
let fld = this.getFieldsTab().getField(fldIdx);
|
|
506
|
-
if (fld.PrevIsNull() === fld.isNull() && mgVal === this.GetFieldValue(fldIdx))
|
|
507
|
-
return;
|
|
508
|
-
mgVal = this.CheckMgValue(mgVal, fld.isNull(), fld);
|
|
509
|
-
if (fldIdx >= 0 && fldIdx < this.getFieldsTab().getSize()) {
|
|
510
|
-
this._fieldsData[fldIdx] = mgVal;
|
|
511
|
-
if (setRecordUpdated) {
|
|
512
|
-
if (fld.PartOfDataview)
|
|
513
|
-
this._modified = true;
|
|
514
|
-
if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
|
|
515
|
-
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
|
|
516
|
-
this._dataview.getTask().DelayCommandExecution = true;
|
|
517
|
-
}
|
|
518
|
-
this._dataview.setChanged(true);
|
|
519
|
-
this.setMode(DataModificationTypes.Update);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
else
|
|
523
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in Record.setFieldValue() illegal field index: " + fldIdx);
|
|
524
|
-
}
|
|
525
|
-
CheckMgValue(mgVal, isNull, fld) {
|
|
526
|
-
if (mgVal === null || isNull) {
|
|
527
|
-
mgVal = fld.getNullValue();
|
|
528
|
-
if (mgVal === null)
|
|
529
|
-
mgVal = fld.getMagicDefaultValue();
|
|
530
|
-
}
|
|
531
|
-
let size = fld.getSize();
|
|
532
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS() && fld.getType() !== StorageAttribute.UNICODE) {
|
|
533
|
-
if (mgVal !== null && UtilStrByteMode.lenB(mgVal) > size)
|
|
534
|
-
mgVal = UtilStrByteMode.leftB(mgVal, size);
|
|
535
|
-
}
|
|
536
|
-
else {
|
|
537
|
-
if (mgVal !== null && mgVal.length > size)
|
|
538
|
-
mgVal = mgVal.substr(0, size);
|
|
539
|
-
}
|
|
540
|
-
return mgVal;
|
|
541
|
-
}
|
|
542
|
-
setModified() {
|
|
543
|
-
this._modified = true;
|
|
544
|
-
}
|
|
545
|
-
resetModified() {
|
|
546
|
-
this._modified = false;
|
|
547
|
-
}
|
|
548
|
-
setUpdated() {
|
|
549
|
-
this._updated = true;
|
|
550
|
-
}
|
|
551
|
-
resetUpdated() {
|
|
552
|
-
this._updated = false;
|
|
553
|
-
}
|
|
554
|
-
GetFieldValue(fldIdx) {
|
|
555
|
-
let val = null;
|
|
556
|
-
if (fldIdx >= 0 && fldIdx < this._fieldsData.length)
|
|
557
|
-
val = this._fieldsData[fldIdx];
|
|
558
|
-
return val.toString();
|
|
559
|
-
}
|
|
560
|
-
replicate() {
|
|
561
|
-
let record = new Record(this);
|
|
562
|
-
record._fieldsData = this._fieldsData.slice();
|
|
563
|
-
record._flags = this._flags.subarray(0);
|
|
564
|
-
record._flagsHistory = this._flagsHistory.subarray(0);
|
|
565
|
-
record._dcRefs = this._dcRefs.Clone();
|
|
566
|
-
return record;
|
|
567
|
-
}
|
|
568
|
-
setSameAs(rec, realOnly, rId) {
|
|
569
|
-
if (arguments.length === 3)
|
|
570
|
-
this.setSameAs_0(rec, realOnly, rId);
|
|
571
|
-
else
|
|
572
|
-
this.setSameAs_1(rec, realOnly);
|
|
573
|
-
}
|
|
574
|
-
setSameAs_0(rec, realOnly, rId) {
|
|
575
|
-
this.setSameAs(rec, realOnly);
|
|
576
|
-
this.setId(rId);
|
|
577
|
-
}
|
|
578
|
-
setSameAs_1(rec, realOnly) {
|
|
579
|
-
this._id = rec._id;
|
|
580
|
-
this._hashKey = rec._hashKey;
|
|
581
|
-
if (!this._dataview.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX))
|
|
582
|
-
this.setMode(rec._mode);
|
|
583
|
-
this._addAfter = rec._addAfter;
|
|
584
|
-
if (realOnly) {
|
|
585
|
-
for (let i = 0; i < this.getFieldsTab().getSize(); i = i + 1) {
|
|
586
|
-
let afield = rec.getFieldsTab().getField(i);
|
|
587
|
-
if (!afield.IsVirtual) {
|
|
588
|
-
this._fieldsData[i] = rec._fieldsData[i];
|
|
589
|
-
this._flags[i] = rec._flags[i];
|
|
590
|
-
this._flagsHistory[i] = rec._flagsHistory[i];
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
else {
|
|
595
|
-
this._fieldsData = rec._fieldsData;
|
|
596
|
-
this._flags = rec._flags;
|
|
597
|
-
this._flagsHistory = rec._flagsHistory;
|
|
598
|
-
}
|
|
599
|
-
this._modified = rec._modified;
|
|
600
|
-
this._dataview = rec._dataview;
|
|
601
|
-
this._computed = rec._computed;
|
|
602
|
-
this._updated = rec._updated;
|
|
603
|
-
this.setDcRefs(rec._dcRefs);
|
|
604
|
-
if (rec._next !== this) {
|
|
605
|
-
this._next = rec._next;
|
|
606
|
-
}
|
|
607
|
-
if (rec._prev !== this) {
|
|
608
|
-
this._prev = rec._prev;
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
IsNull(fldIdx) {
|
|
612
|
-
this.checkFlags(fldIdx);
|
|
613
|
-
return ((this._flags[fldIdx] & Record.FLAG_NULL) === Record.FLAG_NULL);
|
|
614
|
-
}
|
|
615
|
-
isLinkInvalid(fldIdx) {
|
|
616
|
-
this.checkFlags(fldIdx);
|
|
617
|
-
return ((this._flags[fldIdx] & Record.FLAG_INVALID) === Record.FLAG_INVALID);
|
|
618
|
-
}
|
|
619
|
-
isFldModified(fldIdx) {
|
|
620
|
-
this.checkFlags(fldIdx);
|
|
621
|
-
return ((this._flags[fldIdx] & Record.FLAG_MODIFIED) === Record.FLAG_MODIFIED);
|
|
622
|
-
}
|
|
623
|
-
IsFldModifiedAtLeastOnce(fldIdx) {
|
|
624
|
-
this.checkFlags(fldIdx);
|
|
625
|
-
return ((this._flags[fldIdx] & Record.FLAG_MODIFIED_ATLEAST_ONCE) === Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
|
626
|
-
}
|
|
627
|
-
isFldUpdated(fldIdx) {
|
|
628
|
-
this.checkFlags(fldIdx);
|
|
629
|
-
return ((this._flags[fldIdx] & Record.FLAG_UPDATED) === Record.FLAG_UPDATED);
|
|
630
|
-
}
|
|
631
|
-
setFlag(fldIdx, aFlag) {
|
|
632
|
-
this.checkFlags(fldIdx);
|
|
633
|
-
this._flags[fldIdx] = this._flags[fldIdx] | aFlag;
|
|
634
|
-
if (aFlag === Record.FLAG_CRSR_MODIFIED)
|
|
635
|
-
this._flagsHistory[fldIdx] = this._flagsHistory[fldIdx] | aFlag;
|
|
636
|
-
}
|
|
637
|
-
clearFlag(fldIdx, aFlags) {
|
|
638
|
-
this.checkFlags(fldIdx);
|
|
639
|
-
this._flags[fldIdx] = this._flags[fldIdx] & ~aFlags;
|
|
640
|
-
}
|
|
641
|
-
clearFlagsHistory() {
|
|
642
|
-
for (let i = 0; i < this._flags.length; i = i + 1)
|
|
643
|
-
this._flagsHistory[i] = 0;
|
|
644
|
-
}
|
|
645
|
-
clearFlags(aFlags) {
|
|
646
|
-
for (let i = 0; i < this._flags.length; i = i + 1)
|
|
647
|
-
this.clearFlag(i, aFlags);
|
|
648
|
-
}
|
|
649
|
-
clearFlagsForRealOnly(aFlags) {
|
|
650
|
-
for (let i = 0; i < this._flags.length; i = i + 1) {
|
|
651
|
-
let field = this.getFieldsTab().getField(i);
|
|
652
|
-
if (!field.IsVirtual) {
|
|
653
|
-
this.clearFlag(i, aFlags);
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
clearHistoryFlag(fldIdx) {
|
|
658
|
-
if (this._flagsHistory !== null && fldIdx < this.getFieldsTab().getSize() && fldIdx >= 0) {
|
|
659
|
-
this._flagsHistory[fldIdx] = 0;
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
checkFlags(fldIdx) {
|
|
663
|
-
if (this._flags === null || fldIdx >= this.getFieldsTab().getSize() || fldIdx < 0) {
|
|
664
|
-
throw new ApplicationException("Cannot find flags");
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
restart(oldMode) {
|
|
668
|
-
let task = this._dataview.getTask();
|
|
669
|
-
if (oldMode === DataModificationTypes.None) {
|
|
670
|
-
let rec = this._dataview.getCurrRec();
|
|
671
|
-
let isCurrRec = (rec != null && rec.getId() === this._id);
|
|
672
|
-
if ((this._dataview.getTask()).getMode() === Constants.TASK_MODE_CREATE)
|
|
673
|
-
if (isCurrRec && !task.getAfterRetry() && task.TryingToCommit && !this._dataview.inRollback())
|
|
674
|
-
oldMode = DataModificationTypes.Update;
|
|
675
|
-
else
|
|
676
|
-
oldMode = DataModificationTypes.Insert;
|
|
677
|
-
else
|
|
678
|
-
oldMode = DataModificationTypes.Update;
|
|
679
|
-
}
|
|
680
|
-
this.setMode(oldMode);
|
|
681
|
-
if (oldMode === DataModificationTypes.Insert)
|
|
682
|
-
this.setNewRec();
|
|
683
|
-
}
|
|
684
|
-
setLateCompute(val) {
|
|
685
|
-
this._lateCompute = val;
|
|
686
|
-
}
|
|
687
|
-
lateCompute() {
|
|
688
|
-
return this._lateCompute;
|
|
689
|
-
}
|
|
690
|
-
setInDeleteProcess(val) {
|
|
691
|
-
this._inDeleteProcess = val;
|
|
692
|
-
}
|
|
693
|
-
inDeleteProcess() {
|
|
694
|
-
return this._inDeleteProcess;
|
|
695
|
-
}
|
|
696
|
-
removeRecFromDc() {
|
|
697
|
-
if (this._dcRefs !== null) {
|
|
698
|
-
this._dcRefs.Dispose();
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
isSameRecData(rec, currRec, checkOnlyParetOfDataview) {
|
|
702
|
-
let size = this.getSizeFld(currRec);
|
|
703
|
-
let start = this.getFromFldIdx(currRec);
|
|
704
|
-
let i;
|
|
705
|
-
let field;
|
|
706
|
-
if (this === rec)
|
|
707
|
-
return true;
|
|
708
|
-
try {
|
|
709
|
-
if (rec.getSizeFld(currRec) !== size)
|
|
710
|
-
return false;
|
|
711
|
-
if (rec.getFromFldIdx(currRec) !== start)
|
|
712
|
-
return false;
|
|
713
|
-
for (i = 0; i < start + size; i++) {
|
|
714
|
-
field = this.getFieldsTab().getField(i);
|
|
715
|
-
if (checkOnlyParetOfDataview && !field.PartOfDataview)
|
|
716
|
-
continue;
|
|
717
|
-
if (!this.fldValsEqual(rec, i))
|
|
718
|
-
return false;
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
catch (err) {
|
|
722
|
-
if (err instanceof ApplicationException)
|
|
723
|
-
return false;
|
|
724
|
-
throw err;
|
|
725
|
-
}
|
|
726
|
-
return true;
|
|
727
|
-
}
|
|
728
|
-
fldValsEqual(rec, fldIdx) {
|
|
729
|
-
let type = this.getFieldsTab().getField(fldIdx).getType();
|
|
730
|
-
return ExpressionEvaluator.mgValsEqual(this.GetFieldValue(fldIdx), this.IsNull(fldIdx), type, rec.GetFieldValue(fldIdx), rec.IsNull(fldIdx), type);
|
|
731
|
-
}
|
|
732
|
-
getHashKey() {
|
|
733
|
-
return this._hashKey;
|
|
734
|
-
}
|
|
735
|
-
setNextRec(nextRec) {
|
|
736
|
-
this._next = nextRec;
|
|
737
|
-
}
|
|
738
|
-
setPrevRec(prevRec) {
|
|
739
|
-
this._prev = prevRec;
|
|
740
|
-
}
|
|
741
|
-
getPrevRec() {
|
|
742
|
-
return this._prev;
|
|
743
|
-
}
|
|
744
|
-
getNextRec() {
|
|
745
|
-
return this._next;
|
|
746
|
-
}
|
|
747
|
-
getDcRefs() {
|
|
748
|
-
return this._dcRefs.Clone();
|
|
749
|
-
}
|
|
750
|
-
setDcRefs(newDcRefs) {
|
|
751
|
-
this.removeRecFromDc();
|
|
752
|
-
this._dcRefs = newDcRefs.Clone();
|
|
753
|
-
this.SetDcValueId();
|
|
754
|
-
}
|
|
755
|
-
realModified() {
|
|
756
|
-
let bRc = false;
|
|
757
|
-
let tabSize = this.getFieldsTab().getSize();
|
|
758
|
-
let j;
|
|
759
|
-
for (j = 0; j < tabSize; j++) {
|
|
760
|
-
if ((this._flags[j] & Record.FLAG_MODIFIED) === Record.FLAG_MODIFIED) {
|
|
761
|
-
if (!(this.getFieldsTab().getField(j).IsVirtual)) {
|
|
762
|
-
bRc = true;
|
|
763
|
-
break;
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
return bRc;
|
|
768
|
-
}
|
|
769
|
-
ToString() {
|
|
770
|
-
let str = new StringBuilder();
|
|
771
|
-
this.buildXML(str, (this._dataview.getCurrRec()).getId() === this._id, true);
|
|
772
|
-
return str.ToString();
|
|
773
|
-
}
|
|
774
|
-
setSendToServer(val) {
|
|
775
|
-
this._sendToServer = val;
|
|
776
|
-
}
|
|
777
|
-
getRecSize() {
|
|
778
|
-
let sum = 0;
|
|
779
|
-
for (let i = 0; i < this.getFieldsTab().getSize(); i = i + 1) {
|
|
780
|
-
let field = this.getFieldsTab().getField(i);
|
|
781
|
-
sum = sum + field.getSize();
|
|
782
|
-
}
|
|
783
|
-
return sum;
|
|
784
|
-
}
|
|
785
|
-
copyCrsrModifiedFlags(rec) {
|
|
786
|
-
let tabSize = this.getFieldsTab().getSize();
|
|
787
|
-
let j;
|
|
788
|
-
for (j = 0; j < tabSize; j++) {
|
|
789
|
-
this._flags[j] = rec._flags[j];
|
|
790
|
-
this._flags[j] = this._flags[j] & Record.FLAG_CRSR_MODIFIED;
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
getDbPosVal() {
|
|
794
|
-
return this._dbPosBase64Val;
|
|
795
|
-
}
|
|
796
|
-
buildLinksPosStr() {
|
|
797
|
-
let tbl = this._dataview.getTask().getDataviewHeaders();
|
|
798
|
-
if (tbl !== null) {
|
|
799
|
-
this._linksFldsPos = tbl.buildDbPosString();
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
setForceSaveOrg(val) {
|
|
803
|
-
this._forceSaveOrg = val;
|
|
804
|
-
}
|
|
805
|
-
getForceSaveOrg() {
|
|
806
|
-
return this._forceSaveOrg;
|
|
807
|
-
}
|
|
808
|
-
isCauseInvalidation() {
|
|
809
|
-
return this._causeInvalidation;
|
|
810
|
-
}
|
|
811
|
-
setCauseInvalidation(causeInvalidation) {
|
|
812
|
-
this._causeInvalidation = causeInvalidation;
|
|
813
|
-
}
|
|
814
|
-
isComputed() {
|
|
815
|
-
return this._computed;
|
|
816
|
-
}
|
|
817
|
-
setComputed(val) {
|
|
818
|
-
this._computed = val;
|
|
819
|
-
}
|
|
820
|
-
setInCompute(val) {
|
|
821
|
-
if (!val)
|
|
822
|
-
this.setComputed(true);
|
|
823
|
-
this._inCompute = val;
|
|
824
|
-
}
|
|
825
|
-
setInRecompute(val) {
|
|
826
|
-
this._inRecompute = val;
|
|
827
|
-
}
|
|
828
|
-
setMode(newMode) {
|
|
829
|
-
switch (newMode) {
|
|
830
|
-
case DataModificationTypes.None:
|
|
831
|
-
case DataModificationTypes.Insert:
|
|
832
|
-
case DataModificationTypes.Update:
|
|
833
|
-
case DataModificationTypes.Delete:
|
|
834
|
-
if (this._mode === DataModificationTypes.None ||
|
|
835
|
-
this._mode === DataModificationTypes.Update && newMode === DataModificationTypes.Delete)
|
|
836
|
-
this._mode = newMode;
|
|
837
|
-
break;
|
|
838
|
-
default:
|
|
839
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in Record.setMode(): illegal mode: " + newMode);
|
|
840
|
-
break;
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
clearMode() {
|
|
844
|
-
this._mode = DataModificationTypes.None;
|
|
845
|
-
}
|
|
846
|
-
setOldRec() {
|
|
847
|
-
this._newRec = false;
|
|
848
|
-
}
|
|
849
|
-
setNewRec() {
|
|
850
|
-
this._newRec = true;
|
|
851
|
-
}
|
|
852
|
-
static serializeItemVal(itemVal, itemAttr, cellAttr, ToBase64) {
|
|
853
|
-
return RecordUtils.serializeItemVal(itemVal, itemAttr, cellAttr, ToBase64);
|
|
854
|
-
}
|
|
855
|
-
SetDcValueId() {
|
|
856
|
-
let form = this._dataview.getTask().getForm();
|
|
857
|
-
let mgControl = null;
|
|
858
|
-
if (form != null && this._dcRefs != null) {
|
|
859
|
-
this._dcRefs.Refs.forEach((dcRef) => {
|
|
860
|
-
mgControl = form.getCtrl(dcRef.ditIdx);
|
|
861
|
-
if (mgControl != null)
|
|
862
|
-
mgControl.setDcValId(dcRef.DcValues.getId());
|
|
863
|
-
});
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
resetDcValueId() {
|
|
867
|
-
let form = this._dataview.getTask().getForm();
|
|
868
|
-
let mgControl = null;
|
|
869
|
-
if (form != null && this._dcRefs != null) {
|
|
870
|
-
this._dcRefs.Refs.forEach(function (dcRef) {
|
|
871
|
-
mgControl = form.getCtrl(dcRef.ditIdx);
|
|
872
|
-
if (mgControl != null)
|
|
873
|
-
mgControl.setDcValId(EMPTY_DCREF);
|
|
874
|
-
});
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
AddDcValuesReference(controlId, dcValuesId) {
|
|
878
|
-
let dcValues = this._dataview.getDcValues(dcValuesId);
|
|
879
|
-
let dcRef = new DcValuesReference(controlId, dcValues);
|
|
880
|
-
if (this._dcRefs === null) {
|
|
881
|
-
this._dcRefs = new ObjectReferencesCollection();
|
|
882
|
-
}
|
|
883
|
-
this._dcRefs.Add(dcRef);
|
|
884
|
-
}
|
|
885
|
-
}
|
|
886
|
-
Record.FLAG_NULL = (0x01);
|
|
887
|
-
Record.FLAG_INVALID = (0x02);
|
|
888
|
-
Record.FLAG_MODIFIED = (0x04);
|
|
889
|
-
Record.FLAG_UPDATED = (0x08);
|
|
890
|
-
Record.FLAG_CRSR_MODIFIED = (0x10);
|
|
891
|
-
Record.FLAG_VALUE_NOT_PASSED = (0x20);
|
|
892
|
-
Record.FLAG_MODIFIED_ATLEAST_ONCE = (0x40);
|
|
893
|
-
Record.INCREASE = true;
|
|
894
|
-
Record.DECREASE = false;
|
|
895
|
-
export class DcValuesReference extends ObjectReferenceBase {
|
|
896
|
-
constructor(controlId, referencedDcValues) {
|
|
897
|
-
super(referencedDcValues);
|
|
898
|
-
this.ditIdx = 0;
|
|
899
|
-
this.ditIdx = controlId;
|
|
900
|
-
}
|
|
901
|
-
get DcValues() {
|
|
902
|
-
return this.Referent;
|
|
903
|
-
}
|
|
904
|
-
Clone() {
|
|
905
|
-
return new DcValuesReference(this.ditIdx, this.Referent);
|
|
906
|
-
}
|
|
907
|
-
static Parse(couple, dcValuesOwner) {
|
|
908
|
-
let commaPos = couple.indexOf(",");
|
|
909
|
-
let controlId = NNumber.Parse(couple.substr(0, commaPos));
|
|
910
|
-
let dcId = NNumber.Parse(couple.substr(commaPos + 1));
|
|
911
|
-
return new DcValuesReference(controlId, dcValuesOwner.getDcValues(dcId));
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9kYXRhL1JlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLFdBQVcsRUFDWCxNQUFNLEVBR04sbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixXQUFXLEVBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTXJGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQU8xRSxNQUFNLE9BQU8sTUFBTTtJQXNFakIsWUFBWSwyQkFBZ0MsRUFBRSxRQUF1QjtRQXJEM0QsUUFBRyxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDN0IsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFDekIsVUFBSyxHQUEwQixxQkFBcUIs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QUFNLE9BQU8saUJBQWtCLFNBQVEsbUJBQW1CO0lBZXhELFlBQVksU0FBaUIsRUFBRSxrQkFBNEI7UUFDekQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFmNUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQWdCakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQVhELElBQUksUUFBUTtRQUNWLE9BQWlCLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDakMsQ0FBQztJQVdELEtBQUs7UUFDSCxPQUFPLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQVVELE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBYyxFQUFFLGFBQTJCO1FBQ3RELElBQUksUUFBUSxHQUFXLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0MsSUFBSSxTQUFTLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksSUFBSSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RCxPQUFPLElBQUksaUJBQWlCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBEY1ZhbHVlcyxcclxuICBFTVBUWV9EQ1JFRixcclxuICBFeHBWYWwsXHJcbiAgRmllbGREZWYsXHJcbiAgSVJlY29yZCxcclxuICBPYmplY3RSZWZlcmVuY2VCYXNlLFxyXG4gIE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uLFxyXG4gIFJlY29yZFV0aWxzXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIElDb21wYXJhYmxlLFxyXG4gIEludDMyLFxyXG4gIElTT184ODU5XzFfRW5jb2RpbmcsXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBCYXNlNjQsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIExvZ2dlcixcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjayxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxTdHJCeXRlTW9kZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xyXG5pbXBvcnQgeyBUYWJsZUNhY2hlIH0gZnJvbSAnLi4vcnQvVGFibGVDYWNoZSc7XHJcbmltcG9ydCB7IEV4cHJlc3Npb25FdmFsdWF0b3IsIE51bGxWYWx1ZUV4Y2VwdGlvbiB9IGZyb20gJy4uL2V4cC9FeHByZXNzaW9uRXZhbHVhdG9yJztcclxuaW1wb3J0IHsgS2V5IH0gZnJvbSAnLi9LZXknO1xyXG5pbXBvcnQgeyBGaWVsZHNUYWJsZUV4dCBhcyBGaWVsZHNUYWJsZSB9IGZyb20gJy4vRmllbGRzVGFibGUnO1xyXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBNZ0Zvcm0gfSBmcm9tICcuLi9ndWkvTWdGb3JtJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IERhdGF2aWV3SGVhZGVycyB9IGZyb20gJy4uL3J0L0RhdGF2aWV3SGVhZGVycyc7XHJcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHsgRGF0YVZpZXdCYXNlIH0gZnJvbSAnLi9EYXRhVmlld0Jhc2UnO1xyXG5pbXBvcnQgeyBpc051bGxPclVuZGVmaW5lZCB9IGZyb20gJ3V0aWwnO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYSByZWNvcmQgb2JqZWN0XHJcbi8vLyAgIGl0IHBhcnNlcyB0aGUgPHJlYy4uLj4gdGFnXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBSZWNvcmQgaW1wbGVtZW50cyBJQ29tcGFyYWJsZSwgSVJlY29yZCB7XHJcbiAgLy8gQVRURU5USU9OICEhISB3aGVuIHlvdSBhZGQvbW9kaWZ5L2RlbGV0ZSBhIG1lbWJlciB2YXJpYWJsZSBkb24ndCBmb3JnZXQgdG8gdGFrZSBjYXJlXHJcbiAgLy8gYWJvdXQgdGhlIFwic2V0U2FtZUFzKClcIiBmdW5jdGlvblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ09OU1RBTlRTXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX05VTEw6IG51bWJlciA9ICgweDAxKTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX0lOVkFMSUQ6IG51bWJlciA9ICgweDAyKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTU9ESUZJRUQ6IG51bWJlciA9ICgweDA0KTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfVVBEQVRFRDogbnVtYmVyID0gKDB4MDgpO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19DUlNSX01PRElGSUVEOiBudW1iZXIgPSAoMHgxMCk7XHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX1ZBTFVFX05PVF9QQVNTRUQ6IG51bWJlciA9ICgweDIwKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFOiBudW1iZXIgPSAoMHg0MCk7XHJcblxyXG4gIHByb3RlY3RlZCBfaWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByb3RlY3RlZCBkYlZpZXdSb3dJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJvdGVjdGVkIF9tb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGNSZWZzOiBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbiA9IG51bGw7XHJcbiAgX2luQ29tcHV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9pblJlY29tcHV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9uZXdSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGdldCBJbkNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5Db21wdXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBJblJlY29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlY29tcHV0ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdGF0aWMgSU5DUkVBU0U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgREVDUkVBU0U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJvdGVjdGVkIF90YWJsZUNhY2hlOiBUYWJsZUNhY2hlOyAvLyB9XHJcbiAgLy8gfSBmb3IgdXNlIGlmIHRoZSByZWNvcmQgaXMgcGFydCBvZiB0YWJsZSBjYWNoZSAodGhlcmUgaXMgbm8gd2F5IGJvdGggZHYgYW5kIHRhYmxlY2FjaGUgYXJlIG5vdCBudWxsIGF0IHRoZSBzYW1lIHRpbWUgLVxyXG5cclxuICBwcm90ZWN0ZWQgX2luRGVsZXRlUHJvY2VzczogYm9vbGVhbjsgLy8gd2lsbCBiZSBzZXQgdG8gdHJ1ZSBiZWZvcmUgcmVjIHN1ZmZpeCBmcm9tIGRlbGxpbmUuXHJcbiAgcHJvdGVjdGVkIF9hZGRBZnRlcjogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBfY2F1c2VJbnZhbGlkYXRpb246IGJvb2xlYW47IC8vIEV4aXQgZnJvbSB0aGlzIHJlY29yZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiBhbGwgcm93cyBpbiB0YWJsZVxyXG4gIHByb3RlY3RlZCBfZGJQb3NCYXNlNjRWYWw6IHN0cmluZzsgLy8gdXNlZCBvbmx5IGluIHRhYmxlIGNhY2hlIHJlY29yZHMgaG9sZHMgdGhlIHRhYmxlcyBkYl9wb3MgdmFsdWUgaW4gdGhlIGN1cnNvclxyXG4gIC8vIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkgYXJlIE11dHVhbGx5IGV4Y2x1c2l2ZSkuXHJcbiAgcHJvdGVjdGVkIF9kYXRhdmlldzogRGF0YVZpZXdCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9maWVsZHNEYXRhOiBTdHJpbmdbXTtcclxuICBwcm90ZWN0ZWQgX2ZsYWdzOiBVaW50OEFycmF5O1xyXG4gIHByb3RlY3RlZCBfZmxhZ3NIaXN0b3J5OiBVaW50OEFycmF5OyAvLyBIaXN0b3J5IG9mIGZsYWdzLCB1c2VkIHdoZW4gY29udGFjdGluZyB0aGUgc2VydmVyXHJcbiAgcHJvdGVjdGVkIF9mb3JjZVNhdmVPcmc6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9oYXNoS2V5OiBudW1iZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfY29tcHV0ZWQ6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9sYXRlQ29tcHV0ZTogYm9vbGVhbjsgLy8gdGhpcyByZWNvcmQgbXVzdCBiZSBjb21wdXRlZCBuZXh0IHRpbWUgd2UgZW50ZXIgdGhlIHJlY29yZCwgYnV0IG5vdCBiZWZvcmVcclxuXHJcbiAgcHJvdGVjdGVkIF9saW5rc0ZsZHNQb3M6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgX21vZGlmaWVkOiBib29sZWFuO1xyXG5cclxuICBwcm90ZWN0ZWQgX25leHQ6IFJlY29yZDsgIC8vIFBvaW50cyB0byB0aGUgbmV4dCByZWNvcmQsIHdoZW4gaXRzIHBhcnQgb2YgYSBsaXN0XHJcbiAgcHJvdGVjdGVkIF9wcmV2OiBSZWNvcmQ7ICAvLyBQb2ludHMgdG8gdGhlIHByZXYgcmVjb3JkLCB3aGVuIGl0cyBwYXJ0IG9mIGEgbGlzdFxyXG4gIHByb3RlY3RlZCBfc2VuZFRvU2VydmVyOiBib29sZWFuID0gdHJ1ZTsgLy8gSWYgZmFsc2UsIGRvbid0IHNlbmQgdGhpcyByZWNvcmQgdG8gdGhlIHNlcnZlciwgYXMgcGFydCBvZiB0aGUgbW9kaWZpZWQgbGlzdFxyXG4gIHByb3RlY3RlZCBfdXBkYXRlZDogYm9vbGVhbjtcclxuXHJcbiAgcHVibGljIEluRm9yY2VVcGRhdGU6IGJvb2xlYW47XHJcbiAgcHVibGljIFN5bmNlZDogYm9vbGVhbjtcclxuICBwdWJsaWMgVmFsdWVJbkJhc2U2NDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZHZPclRhYmxlQ2FjaGU6IERhdGFWaWV3QmFzZSB8IFRhYmxlQ2FjaGUpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBkYXRhdmlldzogRGF0YVZpZXdCYXNlKTtcclxuICBjb25zdHJ1Y3RvcihSZWNvcmQ6IFJlY29yZCk7XHJcbiAgY29uc3RydWN0b3IoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkOiBhbnksIGRhdGF2aWV3PzogRGF0YVZpZXdCYXNlKVxyXG4gIHtcclxuICAgIGlmKGR2T3JUYWJsZUNhY2hlT3JDSWRPclJlY29yZCBpbnN0YW5jZW9mICBSZWNvcmQpXHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkKTtcclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkLCBkYXRhdmlldyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29uc3RydWN0cyBhIG5ldyByZWNvcmQgdG8gYmUgdXNlZCBieSB0aGUgdGFibGUgY2FjaGUgb25seSEhIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKGR2T3JUYWJsZUNhY2hlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChkdk9yVGFibGVDYWNoZSBpbnN0YW5jZW9mIERhdGFWaWV3QmFzZSlcclxuICAgICAgdGhpcy5fZGF0YXZpZXcgPSA8RGF0YVZpZXdCYXNlPmR2T3JUYWJsZUNhY2hlO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl90YWJsZUNhY2hlID0gPFRhYmxlQ2FjaGU+ZHZPclRhYmxlQ2FjaGU7XHJcblxyXG4gICAgdGhpcy5fZmllbGRzRGF0YSA9IG5ldyBBcnJheTxzdHJpbmc+KHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpKTtcclxuICAgIHRoaXMuX2ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZmxhZ3NIaXN0b3J5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZGNSZWZzID0gbmV3IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9mbGFncy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkRGVmID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgdGhpcy5fZmxhZ3NbaV0gPSAoKGZpZWxkLmlzTnVsbERlZmF1bHQoKSB8fCBmaWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gUmVjb3JkLkZMQUdfTlVMTCA6IDApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2RhdGF2aWV3ICE9PSBudWxsICYmICg8RmllbGQ+ZmllbGQpLklzVmlydHVhbCkge1xyXG4gICAgICAgIGxldCByZWNvcmQ6IFJlY29yZCA9IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKTtcclxuICAgICAgICBpZiAocmVjb3JkICE9IG51bGwgJiYgcmVjb3JkLklzRmxkTW9kaWZpZWRBdExlYXN0T25jZShpKSkge1xyXG4gICAgICAgICAgdGhpcy5zZXRGbGFnKGksIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHRoaXMuX2ZsYWdzW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0TmV3UmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmdFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZHMgdGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0+ICBjbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBpbml0IG9ubHkgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoY0lkOiBudW1iZXIsIGRhdGF2aWV3OiBEYXRhVmlld0Jhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMChkYXRhdmlldyk7XHJcbiAgICB0aGlzLnNldElkKGNJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGlmaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBVcGRhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IFNlbmRUb1NlcnZlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZW5kVG9TZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29tcGFyZVRvKG9iajogT2JqZWN0KTogbnVtYmVyIHtcclxuICAgIGxldCByZXM6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY29tcFRvID0gPFJlY29yZD5vYmo7XHJcblxyXG4gICAgLy8gZ2V0IHRoZSBrZXkgYnkgd2hpY2ggd2UgYXJlIGRvaW5nIHRoZSBDb21wYXJpc29uXHJcbiAgICBsZXQga2V5OiBLZXkgPSB0aGlzLl90YWJsZUNhY2hlLkdldEtleUJ5SWQodGhpcy5fdGFibGVDYWNoZS5HZXRDdXJyU29ydEtleSgpKTtcclxuXHJcbiAgICAvLyBpZiB0aGVyZSBpcyBubyBrZXkgdG8gY29tcGFyZSBieSB0aGVuIHRoZSByZWNvcmRzIGFyZSB1bmNvbXBhcmFibGVcclxuICAgIGlmIChrZXkgIT0gbnVsbCkge1xyXG4gICAgICAvLyBhbGwgd2UgbmVlZCBmcm9tIHRoZSBrZXkgaW4gdGhlIG9yZGVyIG9mIGNvbXBhcmluZyB0aGUgdGhlIHJlY29yZCBmaWVsZHNcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGtleS5Db2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGN1cnJGbGQgPSBrZXkuQ29sdW1ucy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgY3VyckZsZElkOiBudW1iZXIgPSBjdXJyRmxkLmdldElkKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLklzTnVsbChjdXJyRmxkSWQpICYmIGNvbXBUby5Jc051bGwoY3VyckZsZElkKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuSXNOdWxsKGN1cnJGbGRJZCkgJiYgIWNvbXBUby5Jc051bGwoY3VyckZsZElkKSkge1xyXG4gICAgICAgICAgLy8gbnVsbCBpcyB0aGUgZ3JlYXRlc3QgdmFsdWUgdGhlcmVmb3JlIHdlIGFyZSB0aGUgZ3JlYXRlclxyXG4gICAgICAgICAgcmVzID0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghdGhpcy5Jc051bGwoY3VyckZsZElkKSAmJiBjb21wVG8uSXNOdWxsKGN1cnJGbGRJZCkpIHtcclxuICAgICAgICAgIHJlcyA9IC0xO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGJvdGggYXJlIG5vdCBudWxsXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBuZXcgRXhwVmFsKGN1cnJGbGQuZ2V0VHlwZSgpLCBmYWxzZSxcclxuICAgICAgICAgICAgICB0aGlzLkdldEZpZWxkVmFsdWUoY3VyckZsZElkKSk7XHJcbiAgICAgICAgICAgIGxldCBzZWNvbmQgPSBuZXcgRXhwVmFsKGN1cnJGbGQuZ2V0VHlwZSgpLCBmYWxzZSxcclxuICAgICAgICAgICAgICBjb21wVG8uR2V0RmllbGRWYWx1ZShjdXJyRmxkSWQpKTtcclxuXHJcbiAgICAgICAgICAgIHJlcyA9IEV4cHJlc3Npb25FdmFsdWF0b3IudmFsX2NtcF9hbnkoZmlyc3QsIHNlY29uZCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlcyAhPT0gMClcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChlcnIpXHJcbiAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgdmFsdWVzIHdlIGFyZSBjb21wYXJpbmcgdXNpbmcgdmxfY21wX2FueSAgaXMgbnVsbCB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmVcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE51bGxWYWx1ZUV4Y2VwdGlvbilcclxuICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCIgaW4gUmVjb3JkLkNvbXBhcmVUbyBudWxsIHZhbHVlIHdhcyByZWFjaGVkXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXMgPSAtMTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1vZGUoKTogRGF0YU1vZGlmaWNhdGlvblR5cGVzIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJlY29yZCBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIG5ldyByZWNvcmQganVzdCBjcmVhdGVkIGFuZCBubyByZWNvcmQgc3VmZml4IHdhcyB5ZXRcclxuICAvLy8gICBwcm9jZXNzZWQgb24gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTmV3UmVjKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25ld1JlYztcclxuICB9XHJcblxyXG4gIGdldEZpZWxkRGF0YVhNTChmbGRJZHg6IG51bWJlciwgZ2V0T2xkVmFsOiBib29sZWFuKTogc3RyaW5nO1xyXG4gIGdldEZpZWxkRGF0YVhNTChmbGRJZHg6IG51bWJlcik6IFVpbnQ4QXJyYXk7XHJcbiAgZ2V0RmllbGREYXRhWE1MKGZsZElkeDogbnVtYmVyLCBnZXRPbGRWYWw/OiBib29sZWFuKTogc3RyaW5nIHwgVWludDhBcnJheSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGREYXRhWE1MXzAoZmxkSWR4LCBnZXRPbGRWYWwpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZERhdGFYTUxfMShmbGRJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBmaWVsZCB2YWx1ZSBmb3IgdGhlIFhNTCBzdHJpbmcgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+aW5kZXggb2YgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZERhdGFYTUxfMChmbGRJZHg6IG51bWJlciwgZ2V0T2xkVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGRWYWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWdldE9sZFZhbClcclxuICAgICAgZmxkVmFsID0gdGhpcy5HZXRGaWVsZFZhbHVlKGZsZElkeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGZsZFZhbCA9ICg8RmllbGQ+KHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoZmxkSWR4KSkpLmdldE9yaWdpbmFsVmFsdWUoKTtcclxuICAgIGlmIChmbGRWYWwgPT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUmVjb3JkLmJ1aWxkRmllbGRzRGF0YSgpIG51bGwgZmllbGQgdmFsdWUhXFxuRmllbGQgaWQ6IFwiICsgZmxkSWR4KTtcclxuXHJcbiAgICBsZXQgdG1wQnVmOiBzdHJpbmcgPSB0aGlzLmdldFhNTEZvclZhbHVlKGZsZElkeCwgZmxkVmFsKTtcclxuICAgIHJldHVybiBYbWxQYXJzZXIuZXNjYXBlKHRtcEJ1Zi50b1N0cmluZygpKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBmaWVsZCB2YWx1ZSBmb3IgdGhlIFhNTCBzdHJpbmcgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+aW5kZXggb2YgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZERhdGFYTUxfMShmbGRJZHg6IG51bWJlcik6IFVpbnQ4QXJyYXkge1xyXG4gICAgbGV0IGZpZWxkVmFsdWU6IHN0cmluZyA9IHRoaXMuR2V0RmllbGRWYWx1ZShmbGRJZHgpO1xyXG5cclxuICAgIGlmIChmaWVsZFZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5idWlsZEZpZWxkc0RhdGEoKSBudWxsIGZpZWxkIHZhbHVlIVxcbkZpZWxkIGlkOiBcIiArIGZsZElkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFR5cGUoZmxkSWR4KTtcclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5zZXJpYWxpemVJdGVtVmFsKGZpZWxkVmFsdWUsIHR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgZmllbGQgdGFibGUgZWl0aGVyIG9mIERhdGFWaWV3Um9vdCAoJ2R2SGVhZGVyJykgb3Igb2YgVGFibGVDYWNoZVxyXG4gIC8vLyBkdiBhbmQgdGFibGVDYWNoZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGZpZWxkVGFibGUgPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkc1RhYigpOiBGaWVsZHNUYWJsZSB7XHJcbiAgICBpZiAodGhpcy5fZGF0YXZpZXcgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiA8RmllbGRzVGFibGU+dGhpcy5fZGF0YXZpZXcuR2V0RmllbGRzVGFiKCk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5fdGFibGVDYWNoZS5GbGRzVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyA6IGNoZWNrIGhvdyB0byBpbXBsZW1lbnQgZGVzdHJ1Y3RvcnNcclxuICAvLyB+UmVjb3JkKClcclxuICAvLyB7XHJcbiAgLy8gXHR0aGlzLnJlbW92ZVJlY0Zyb21EYygpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgaW5pdGlhbCBmaWVsZCB2YWx1ZXMgZm9yIGZpZWxkcyB0aGF0IGhhcyBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0+ICBjbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBpbml0IG9ubHkgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gPC9wYXJhbT5cclxuICBwdWJsaWMgc2V0SW5pdGlhbEZsZFZhbHMoY2xvYmJlcmVkT25seTogYm9vbGVhbiwgaXNOZXdSZWM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXIsIHNpemU7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IG51bGw7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKHRydWUpO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgLy8gcHV0IGluaXRpYWwgdmFsdWVzIHRvIHRoZSBmaWVsZHMgdXNpbmcgdGhlIE1hZ2ljIGRlZmF1bHQgdmFsdWVcclxuICAgICAgaWYgKHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICBmbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gZmxkLmdldE5ld1JlY1ZhbHVlKGNsb2JiZXJlZE9ubHkpO1xyXG5cclxuICAgICAgICBpZiAoaXNOZXdSZWMgJiYgZmxkLklzVmlydHVhbCAmJiAhZmxkLmlzTnVsbCgpKVxyXG4gICAgICAgICAgdGhpcy5jbGVhckZsYWcoZmxkLmdldElkKCksIFJlY29yZC5GTEFHX05VTEwpO1xyXG5cclxuICAgICAgICBpZiAoZmxkLklzVmlydHVhbCAmJiBmbGQuZ2V0TW9kaWZpZWRBdExlYXN0T25jZSgpKVxyXG4gICAgICAgICAgdGhpcy5zZXRGbGFnKGZsZC5nZXRJZCgpLCBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSBmbGQuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgaWQgb2YgdGhlIHJlY29yZCBhbmQgYW4gYXBwcm9wcmlhdGUgaGFzaCBrZXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY0lkXCI+dGhlIGlkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHNldElkKGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IGNJZDtcclxuICAgIHRoaXMuX2hhc2hLZXkgPSB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyB0aGUgZGJWaWV3Um93SWQgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgc2V0REJWaWV3Um93SWR4KHJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZGJWaWV3Um93SWR4ID0gcm93SWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiBkYlZpZXdSb3dJZCBvZiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNJZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICBnZXREQlZpZXdSb3dJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRiVmlld1Jvd0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YSAtIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZWNvcmQgaXMgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzQ3VyclJlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogU3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlzQ3VyclJlYyA9IHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3Rvcik7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuRmlsbElubmVyRGF0YSgpIG91dCBvZiBib3VuZHNcIik7XHJcbiAgICByZXR1cm4gaXNDdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSByZWNvcmQgLSByZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVjb3JkIGlzIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj50aGUgYXR0cmlidXRlcyBhbmQgdGhlaXIgdmFsdWVzPC9wYXJhbT5cclxuICBwcm90ZWN0ZWQgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBTdHJpbmcsIHZhbHVlU3RyO1xyXG4gICAgbGV0IHJlY0ZpZWxkc0RhdGE6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgcmVjRmxhZ3M6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgIGxldCBpc0N1cnJSZWM6IGJvb2xlYW47XHJcblxyXG4gICAgaXNDdXJyUmVjID0gdGhpcy5wZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3Rvcik7XHJcblxyXG4gICAgZm9yICg7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIHZhbHVlU3RyID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERTpcclxuICAgICAgICAgIHRoaXMuX21vZGUgPSA8RGF0YU1vZGlmaWNhdGlvblR5cGVzPnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuc2V0SWQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9WQl9WSUVXX1JPV0lEWDpcclxuICAgICAgICAgIHRoaXMuc2V0REJWaWV3Um93SWR4KFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUU6XHJcbiAgICAgICAgICBpZiAodGhpcy5WYWx1ZUluQmFzZTY0KSB7XHJcbiAgICAgICAgICAgIHJlY0ZpZWxkc0RhdGEgPSBCYXNlNjQuZGVjb2RlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZWNGaWVsZHNEYXRhID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQzoge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSOlxyXG4gICAgICAgICAgdGhpcy5fYWRkQWZ0ZXIgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUzpcclxuICAgICAgICAgIHJlY0ZsYWdzID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ESUZJRUQ6XHJcbiAgICAgICAgICB0aGlzLl9tb2RpZmllZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRENfUkVGUzpcclxuICAgICAgICAgIHRoaXMuZmlsbERDUmVmKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlBPUzpcclxuICAgICAgICAgIHRoaXMuX2RiUG9zQmFzZTY0VmFsID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLmluaXRFbGVtZW50cygpIHVua25vd24gYXR0cmlidXRlOiBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuVmFsdWVJbkJhc2U2NCkge1xyXG4gICAgICBsZXQgZmxkVmFsSW5CeXRlczogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyhyZWNGaWVsZHNEYXRhKTtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShmbGRWYWxJbkJ5dGVzLCByZWNGbGFncyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShyZWNGaWVsZHNEYXRhLCByZWNGbGFncywgaXNDdXJyUmVjKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc0N1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGVlayB0aGUgY3Vycl9yZWMgdmFsdWUgZnJvbSB0aGUgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRoZVwiPnRva2VucyBvZiB0aGUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRoZSB0YWc8L3BhcmFtPlxyXG4gIHByb3RlY3RlZCBwZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmc7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBpZiAoYXR0cmlidXRlID09PSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDKSB7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcbiAgICAgICAgcmV0dXJuIFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkVmFsSW5CeXRlczogVWludDhBcnJheSwgcmVjRmxhZ3M6IHN0cmluZyk6IHZvaWQ7XHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkc1ZhbDogc3RyaW5nLCByZWNGbGFnczogc3RyaW5nLCBpc0N1cnJSZWM6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIGZpbGxGaWVsZHNEYXRhKGZsZFZhbEluQnl0ZXNPckZsZHNWYWw6IGFueSwgcmVjRmxhZ3M6IHN0cmluZywgaXNDdXJyUmVjPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGlzQ3VyclJlYykpXHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGFfMChmbGRWYWxJbkJ5dGVzT3JGbGRzVmFsLCByZWNGbGFncyk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGFfMShmbGRWYWxJbkJ5dGVzT3JGbGRzVmFsLCByZWNGbGFncywgaXNDdXJyUmVjKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsbEZpZWxkc0RhdGFfMChmbGRWYWxJbkJ5dGVzOiBudW1iZXJbXSwgcmVjRmxhZ3M6IHN0cmluZyk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZpbGwgRmllbGRzRGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRzVmFsXCI+LSBzdHJpbmcgZm9yIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNDdXJyUmVjXCI+dHJ1ZSBpZiB0aGlzIHJlY29yZCBpcyB0aGUgY3VycmVudCByZWNvcmQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgZmlsbEZpZWxkc0RhdGFfMShmbGRzVmFsOiBzdHJpbmcsIHJlY0ZsYWdzOiBTdHJpbmcsIGlzQ3VyclJlYzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHZhbDogU3RyaW5nID0gbnVsbDtcclxuICAgIGxldCB0bXA6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgcGFyc2VkTGVuOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oMCk7XHJcbiAgICBsZXQgaTogbnVtYmVyLCBqID0gMCwgZnJvbSwgc2l6ZTtcclxuICAgIGxldCBjdXJyVHlwZTogU3RvcmFnZUF0dHJpYnV0ZTtcclxuICAgIGxldCB1c2VIZXg6IGJvb2xlYW47XHJcbiAgICBsZXQgZmxkOiBGaWVsZERlZiA9IG51bGw7XHJcbiAgICBsZXQgdmFsdWVOb3RQYXNzZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgZnJvbSA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIGZvciAoaSA9IGZyb207IGogPCBzaXplOyBpKyssIGorKykge1xyXG4gICAgICBmbGQgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICBjdXJyVHlwZSA9IGZsZC5nZXRUeXBlKCk7XHJcblxyXG4gICAgICB1c2VIZXggPSAoRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpID4gMSB8fFxyXG4gICAgICAgIGN1cnJUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8XHJcbiAgICAgICAgY3VyclR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSB8fFxyXG4gICAgICAgIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVMb2dpY2FsKGN1cnJUeXBlKSk7XHJcblxyXG4gICAgICAvLyBRY3IgIzk0MDQ0MyA6IE9sZCBmYXNoaW9uIGZsYWdzIGFyZSBzdGlsbCBiZWluZyB1c2VkIGJ5IHJlc2lkZW50IHRhYmxlLiBTbyBjaGVjayB0aGVtIDFzdCBjb3ogd2UgIG1pZ2h0IGdldCBleGNlcHRpb24gb3RoZXJ3aXNlLlxyXG4gICAgICAvLyBUaGUgZmxhZ3MgZm9yIHJlc2lkZW50IGFyZSB2ZXJ5IHNpbXBsZSwgb25seSAyIG9wdGlvbnMuICcuJyA9IGZhbHNlLCAnLycgPSB0cnVlLlxyXG4gICAgICAvLyBXZSBrZWVwIHVzaW5nIGl0IGZvciByZXNpZGVudCwgc2luY2UgaW4gdGhlIHNlcnZlciBzaWRlIHdlIGRvIG5vdCBrbm93IGlmIHdlIGFyZSBjcmVhdGluZyB0aGUgeG1sIGZvciByaWNoY2xpZW50IG9yIGZvciBCQyBhdCB0aGUgY3JlYXRpb24gc3RhZ2UuXHJcbiAgICAgIC8vIFNpbmNlIHdlIGNvdWxkbid0IGNyZWF0ZSBkaWZmZXJlbnQgZmxhZ3MgZm9yIHJpY2gsIHdlIHdpbGwgdXNlIHRoZSBvbGQgZmxhZ3MgaGVyZS5cclxuXHJcbiAgICAgIGlmIChyZWNGbGFnc1tqXSA9PT0gJy4nKVxyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gMDtcclxuICAgICAgZWxzZSBpZiAocmVjRmxhZ3Nbal0gPT09ICcvJylcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IDE7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEVhY2ggZmxhZyB3aWxsIGFwcGVhciBpbiB0aGUgeG1sIGluIDIgY2hhcnMgcmVwcmVzZW50aW5nIGhleCB2YWx1ZSAoXCI0MlwiIGZvciAweDQyKS5cclxuICAgICAgICB0bXAgPSByZWNGbGFncy5zdWJzdHIoaiAqIDIsIDIpO1xyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gcGFyc2VJbnQodG1wLCAxNik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNhdmUgdGhlIGluZCB0aGF0IHRoZSB2YWx1ZSB3YXMgbm90IHBhc3NlZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgIHZhbHVlTm90UGFzc2VkID0gUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCk7XHJcbiAgICAgIHRoaXMuX2ZsYWdzW2ldID0gdGhpcy5fZmxhZ3NbaV0gJiB+UmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRDtcclxuXHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHRoaXMuX2ZsYWdzW2ldO1xyXG5cclxuICAgICAgaWYgKFJlY29yZC5GTEFHX1VQREFURUQgPT09ICh0aGlzLl9mbGFnc1tpXSAmIFJlY29yZC5GTEFHX1VQREFURUQpKVxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodmFsdWVOb3RQYXNzZWQpIHtcclxuICAgICAgICBpZiAoUmVjb3JkLkZMQUdfTlVMTCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfTlVMTCkpIHtcclxuICAgICAgICAgIC8vIG51bGwgaW5kIGlzIG9uLCBqdXN0IHB1dCBhbnkgdmFsdWUgaW4gdGhlIGZpZWxkLlxyXG4gICAgICAgICAgdmFsID0gZmxkLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGNvcHkgdGhlIGV4aXN0aW5nIHZhbHVlIGZyb20gdGhlIGV4aXN0aW5nIGN1cnIgcmVjLlxyXG4gICAgICAgICAgdmFsID0gKDxSZWNvcmQ+IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkuR2V0RmllbGRWYWx1ZShpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsID0gUmVjb3JkVXRpbHMuZGVTZXJpYWxpemVJdGVtVmFsKGZsZHNWYWwsIGN1cnJUeXBlLCBmbGQuZ2V0U2l6ZSgpLCB1c2VIZXgsIGZsZC5nZXRDZWxsc1R5cGUoKSwgcGFyc2VkTGVuKTtcclxuICAgICAgICBmbGRzVmFsID0gZmxkc1ZhbC5zdWJzdHIocGFyc2VkTGVuLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0SW5pdGlhbEZsZFZhbHMoZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdCBkY1JlZnMgdmVjdG9yIGFuZCBpbmNyZWFzZSByZWZlcmVuY2UgY291bnRlciB0byBEYXRhVmlld1Jvb3QuY291bnRlckFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+aW4gZm9ybSBcImRpdF9pZHgsZGNfaWQkZGl0X2lkeCxkY19pZCQuLi5cIjwvcGFyYW0+XHJcbiAgZmlsbERDUmVmKHZhbHVlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlU3RyKSkge1xyXG4gICAgICBsZXQgY291cGxlczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhbHVlU3RyLCBcIiRcIik7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSBjb3VwbGVzLmxlbmd0aDtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzaXplOyBpID0gaSArIDEpIHtcclxuICAgICAgICB0aGlzLl9kY1JlZnMuQWRkKERjVmFsdWVzUmVmZXJlbmNlLlBhcnNlKGNvdXBsZXNbaV0sIHRoaXMuX2RhdGF2aWV3KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1aWxkRmllbGRzRGF0YShtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGdldE9sZFZhbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgYnVpbGRGaWVsZHNEYXRhKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkO1xyXG4gIGJ1aWxkRmllbGRzRGF0YShtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM/OiBib29sZWFuLCBnZXRPbGRWYWw/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMylcclxuICAgICAgdGhpcy5idWlsZEZpZWxkc0RhdGFfMChtZXNzYWdlLCBpc0N1cnJSZWMsIGdldE9sZFZhbCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuYnVpbGRGaWVsZHNEYXRhXzEobWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIGZpZWxkcyB2YWx1ZSBmb3IgdGhlIFhNTCBzdHJpbmcgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYnVpbGRGaWVsZHNEYXRhXzAobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBnZXRPbGRWYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCB0bXBTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIGxldCBmcm9tOiBudW1iZXIgPSB0aGlzLmdldEZyb21GbGRJZHgoaXNDdXJyUmVjKTtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLmdldFNpemVGbGQoaXNDdXJyUmVjKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgLy8gRG8gbm90IHNlcmlhbGl6ZSB0aGUgZmllbGQgdmFsdWUgd2hpY2ggaXMgbm90IGV4cG9zZWQgdG8gY2xpZW50LlxyXG4gICAgICBsZXQgZmxkOiBGaWVsZCA9ICA8RmllbGQ+IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGlmIChmbGQuSXNFeHBvc2VkVG9DbGllbnQgPT09IGZhbHNlKVxyXG4gICAgICAgIHRoaXMuc2V0U2hyaW5rRmxhZyhpKTtcclxuXHJcbiAgICAgIC8vIGRvIG5vdCB3cml0ZSB0aGUgdmFsdWUgaWYgdGhlIHNocmluayBmbGFnIGlzIG9uLlxyXG4gICAgICBpZiAoUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCkpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICB0bXBTdHIuQXBwZW5kKHRoaXMuZ2V0RmllbGREYXRhWE1MKGksIGdldE9sZFZhbCkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIGlmIG5vbmUgb2YgdGhlIHZhbHVlcyBoYWQgY2hhbmdlZC4gcGFzcyBcIiBcIiBpbnN0ZWFkIG9mIFwiXCIuXHJcbiAgICBpZiAodG1wU3RyLkxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0bXBTdHIuQXBwZW5kKFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZCh0bXBTdHIuVG9TdHJpbmcoKSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWVzc2FnZVwiPjwvcGFyYW0+XHJcbiAgcHJvdGVjdGVkIGJ1aWxkRmllbGRzRGF0YV8xKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXIsIGZyb20sIHNpemU7XHJcblxyXG4gICAgbGV0IGZpZWxkVmFsdWU6IExpc3Q8bnVtYmVyPiA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgIGZyb20gPSB0aGlzLmdldEZyb21GbGRJZHgoZmFsc2UpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChmYWxzZSk7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IGZyb20gKyBzaXplOyBpKyspIHtcclxuICAgICAgLy8gZG8gbm90IHdyaXRlIHRoZSB2YWx1ZSBpZiB0aGUgc2hyaW5rIGZsYWcgaXMgb24uXHJcbiAgICAgIGlmIChSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEKSlcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGxldCB0bXA6IFVpbnQ4QXJyYXkgPSB0aGlzLmdldEZpZWxkRGF0YVhNTChpKTtcclxuICAgICAgdG1wLmZvckVhY2goeCA9PiBmaWVsZFZhbHVlLnB1c2goeCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmaWVsZFZhbHVlc0luQnl0ZXM6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShmaWVsZFZhbHVlLmxlbmd0aCk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGRWYWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgZmllbGRWYWx1ZXNJbkJ5dGVzW2ldID0gZmllbGRWYWx1ZS5nZXRfSXRlbShpKTtcclxuXHJcblxyXG4gICAgbGV0IGVuY29kZWRmaWVsZFZhbHVlc0luQnl0ZXM6IFVpbnQ4QXJyYXkgPSBCYXNlNjQuZW5jb2RlKGZpZWxkVmFsdWVzSW5CeXRlcyk7XHJcbiAgICBsZXQgdG1wU3RyOiBzdHJpbmcgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5HZXRFbmNvZGluZygpLkdldFN0cmluZyhlbmNvZGVkZmllbGRWYWx1ZXNJbkJ5dGVzLCAwLCBlbmNvZGVkZmllbGRWYWx1ZXNJbkJ5dGVzLmxlbmd0aCk7XHJcbiAgICBtZXNzYWdlLkFwcGVuZCh0bXBTdHIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmxkSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0WE1MRm9yVmFsdWUoZmxkSWR4OiBudW1iZXIsIGZsZFZhbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUDsgLy8gY2VsbCdzIGF0dHJpYnV0ZSwgaWYgdGhlIGZpZWxkJ3MgYXR0cmlidXRlIGlzIGEgdmVjdG9yXHJcbiAgICBsZXQgZmxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0VHlwZShmbGRJZHgpOyAvLyBmaWVsZCdzIGF0dHJpYnV0ZVxyXG4gICAgaWYgKGZsZEF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgIGNlbGxBdHRyID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChmbGRJZHgpLmdldENlbGxzVHlwZSgpO1xyXG5cclxuICAgIGxldCB0b0Jhc2U2NDogYm9vbGVhbiA9IEVudmlyb25tZW50Lkluc3RhbmNlLkdldERlYnVnTGV2ZWwoKSA8PSAxO1xyXG4gICAgcmV0dXJuIFJlY29yZC5zZXJpYWxpemVJdGVtVmFsKGZsZFZhbCwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc3RhcnRpbmcgZmllbGQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5zaG91bGQgYmUgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgcmVjPC9wYXJhbT5cclxuICBnZXRGcm9tRmxkSWR4KGlzQ3VyclJlYzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoaXNDdXJyUmVjKVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0Uk1JZHgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNDdXJyUmVjXCI+c2hvdWxkIGJlIHRydWUgZm9yIHRoZSBjdXJyZW50IHJlYzwvcGFyYW0+XHJcbiAgZ2V0U2l6ZUZsZChpc0N1cnJSZWM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGlzQ3VyclJlYylcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRSTVNpemUoKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbik6IHZvaWQ7XHJcbiAgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBmb3JjZUJ1aWxkOiBib29sZWFuKTogdm9pZDtcclxuICBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGZvcmNlQnVpbGQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZm9yY2VCdWlsZCkpXHJcbiAgICAgIHRoaXMuYnVpbGRYTUxfMChtZXNzYWdlLCBpc0N1cnJSZWMpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmJ1aWxkWE1MXzEobWVzc2FnZSwgaXNDdXJyUmVjLCBmb3JjZUJ1aWxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRYTUxfMChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4pOiAgdm9pZCB7XHJcbiAgICB0aGlzLmJ1aWxkWE1MXzEobWVzc2FnZSwgaXNDdXJyUmVjLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZXNzYWdlXCI+dGhlIHhtbCBtZXNzYWdlIHRvIGFwcGVuZCB0bzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5pbmRpY2F0ZSB0aGlzIHJlY29yZCBhcyB0aGUgY3VycmVudCByZWNvcmQ8L3BhcmFtPlxyXG4gIHByb3RlY3RlZCBidWlsZFhNTF8xKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbiwgZm9yY2VCdWlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJlY0ZsYWdzOiBTdHJpbmdCdWlsZGVyO1xyXG4gICAgbGV0IGZyb206IG51bWJlciwgc2l6ZSwgaTtcclxuICAgIGxldCBhRmxhZzogbnVtYmVyO1xyXG4gICAgbGV0IGhleEZsYWc6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWZvcmNlQnVpbGQpXHJcbiAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIHRoaXMuX21vZGUgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUgJiZcclxuICAgICAgICB0aGlzLl9tb2RlICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpc0N1cnJSZWMpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxuICAgICAgICAgICAgPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQyk7XHJcbiAgICBpZiAodGhpcy5faWQgPiBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArIFwiPVxcXCJcIiArIHRoaXMuX2lkICsgXCJcXFwiXCIpO1xyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX01PREUgKyBcIj1cXFwiXCIgKyA8c3RyaW5nPnRoaXMuX21vZGUgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5fcHJldiAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSICsgXCI9XFxcIlwiICsgdGhpcy5fcHJldi5nZXRJZCgpICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIC8vIGN1cnJlbnQgcmVjb3JkJ3MgbW9kZSBpcyBuZXZlciBjbGVhcmVkLCB0aGUgd2hvbGUgcmVjb3JkIGlzIGNsZWFyZWQgd2hlbiB3ZSBtb3ZlIG9uLlxyXG4gICAgaWYgKCFmb3JjZUJ1aWxkICYmICFpc0N1cnJSZWMpXHJcbiAgICAgIHRoaXMuY2xlYXJNb2RlKCk7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9WQUxVRSArIFwiPVxcXCJcIik7XHJcblxyXG4gICAgaWYgKCFmb3JjZUJ1aWxkICYmIGlzQ3VyclJlYylcclxuICAgICAgdGhpcy5zZXRTaHJpbmtGbGFncygpO1xyXG5cclxuICAgIGxldCBnZXRPbGRWYWw6IGJvb2xlYW47XHJcbiAgICBpZiAodGhpcy5TeW5jZWQpXHJcbiAgICAgIGdldE9sZFZhbCA9IGZhbHNlO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpO1xyXG4gICAgICBnZXRPbGRWYWwgPSAoIWlzQ3VyclJlYyAmJiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQgfHxcclxuICAgICAgICB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpICYmXHJcbiAgICAgICB0aGlzLl9kYXRhdmlldy5nZXRDdXJyUmVjKCkgIT0gbnVsbCAmJiAoKDxSZWNvcmQ+IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkpLmdldElkKCkgPT09IHRoaXMuX2lkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1aWxkRmllbGRzRGF0YShtZXNzYWdlLCBpc0N1cnJSZWMsIGdldE9sZFZhbCk7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIlxcXCJcIik7XHJcbiAgICByZWNGbGFncyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgZnJvbSA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIC8vIFFDUiA0Nzk2ODY6IHNlbmQgRkxBR19DUlNSX01PRCBmcm9tIHRoZSBoaXN0b3J5LCB0aHVzIGxldCB0aGUgc2VydmVyIGtub3cgaWYgYSBmaWVsZFxyXG4gICAgLy8gd2FzIHVwZGF0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzZW50IGl0IHRvIElUIChoZW5jZSwgYSBEQk1TIGFjdGlvbiBpcyBuZWVkZWQpLlxyXG4gICAgZm9yIChpID0gZnJvbTsgaSA8IGZyb20gKyBzaXplOyBpKyspIHtcclxuICAgICAgYUZsYWcgPSB0aGlzLl9mbGFnc0hpc3RvcnlbaV07XHJcbiAgICAgIGFGbGFnID0gYUZsYWcgJiBSZWNvcmQuRkxBR19DUlNSX01PRElGSUVEO1xyXG4gICAgICBhRmxhZyA9IGFGbGFnIHwgdGhpcy5fZmxhZ3NbaV07XHJcblxyXG4gICAgICAvLyBFYWNoIGZsYWcgd2lsbCBhcHBlYXIgaW4gdGhlIHhtbCBpbiAyIGNoYXJzIHJlcHJlc2VudGluZyBoZXggdmFsdWUgKFwiNDJcIiBmb3IgMHg0MikuXHJcbiAgICAgIGhleEZsYWcgPSBOTnVtYmVyLlRvU3RyaW5nKGFGbGFnLCBcIlgyXCIpO1xyXG4gICAgICByZWNGbGFncy5BcHBlbmQoaGV4RmxhZyk7XHJcblxyXG4gICAgICAvLyBjbGVhciB0aGUgc2hyaW5rIGZsYWdcclxuICAgICAgaWYgKGlzQ3VyclJlYylcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IDxudW1iZXI+KHRoaXMuX2ZsYWdzW2ldICYgflJlY29yZC5GTEFHX1ZBTFVFX05PVF9QQVNTRUQpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUyArIFwiPVxcXCJcIiArIHJlY0ZsYWdzLlRvU3RyaW5nKCkgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKGlzQ3VyclJlYykge1xyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuTW9kaWZpZWQpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX01PRElGSUVEICsgXCI9XFxcIjFcXFwiXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2xpbmtzRmxkc1BvcyAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfREJQT1MgKyBcIj1cXFwiXCIgKyBYbWxQYXJzZXIuZXNjYXBlKHRoaXMuX2xpbmtzRmxkc1BvcykgKyBcIlxcXCIgXCIpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIG9mIHRoZSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWVzc2FnZVwiPnRoZSB4bWwgbWVzc2FnZSB0byBhcHBlbmQgdG88L3BhcmFtPlxyXG4gIHB1YmxpYyBidWlsZFhNTEZvckRhdGFWaWV3VG9EYXRhU291cmNlKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIGxldCByZWNGbGFnczogU3RyaW5nQnVpbGRlcjtcclxuICAgIGxldCBmcm9tOiBudW1iZXIsIHNpemUsIGk7XHJcbiAgICBsZXQgYUZsYWc6IG51bWJlcjtcclxuICAgIGxldCBoZXhGbGFnOiBzdHJpbmc7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICAgICAgICAgICA8XCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDKTtcclxuICAgIGlmICh0aGlzLl9pZCA+IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgXCI9XFxcIlwiICsgdGhpcy5faWQgKyBcIlxcXCJcIik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERSArIFwiPVxcXCJcIiArIHRoaXMuX21vZGUgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5fcHJldiAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSICsgXCI9XFxcIlwiICsgdGhpcy5fcHJldi5nZXRJZCgpICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUUgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgIHRoaXMuYnVpbGRGaWVsZHNEYXRhKG1lc3NhZ2UpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxcIlwiKTtcclxuICAgIHJlY0ZsYWdzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBmcm9tID0gdGhpcy5nZXRGcm9tRmxkSWR4KGZhbHNlKTtcclxuICAgIHNpemUgPSB0aGlzLmdldFNpemVGbGQoZmFsc2UpO1xyXG5cclxuICAgIGZvciAoaSA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSsrKSB7XHJcbiAgICAgIGFGbGFnID0gdGhpcy5fZmxhZ3NIaXN0b3J5W2ldO1xyXG4gICAgICBhRmxhZyA9IGFGbGFnICYgUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRDtcclxuICAgICAgYUZsYWcgPSBhRmxhZyB8IHRoaXMuX2ZsYWdzW2ldO1xyXG4gICAgICBoZXhGbGFnID0gTk51bWJlci5Ub1N0cmluZyhhRmxhZywgJ1gyJyk7XHJcbiAgICAgIHJlY0ZsYWdzLkFwcGVuZChoZXhGbGFnKTtcclxuICAgIH1cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUyArIFwiPVxcXCJcIiArIHJlY0ZsYWdzICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIGlmICh0aGlzLl9saW5rc0ZsZHNQb3MgIT0gbnVsbClcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0RCUE9TICsgXCI9XFxcIlwiICsgWG1sUGFyc2VyLmVzY2FwZSh0aGlzLl9saW5rc0ZsZHNQb3MpICsgXCJcXFwiIFwiKTtcclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzY2FuIHRoZSByZWNvcmQgYW5kIGNvbXBhcmUgZmllbGRzIHdpdGggcGFyYWxsZWwgc2VydmVyIGN1cnIgcmVjLFxyXG4gIC8vLyAgIHNldCBzaHJpbmsgZmxhZyBvbiBpZiBmaWVsZHMgYXJlIGVxdWFsLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIHByb3RlY3RlZCBzZXRTaHJpbmtGbGFncygpOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gdGhpcy5nZXRTaXplRmxkKHRydWUpO1xyXG5cclxuICAgIGxldCBzZXJ2ZXJDdXJyUmVjOiBSZWNvcmQgPSB0aGlzLl9kYXRhdmlldy5nZXRTZXJ2ZXJDdXJyUmVjKCk7XHJcbiAgICAvLyBjYW5ub3Qgc2hyaW5rIGlmIHdlIGRvIG5vdCBrbm93IHdoYXQgY3VyciByZWMgdGhlIHNlcnZlciBob2xkcy5cclxuICAgIGlmIChzZXJ2ZXJDdXJyUmVjID09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuZmxkVmFsc0VxdWFsKHNlcnZlckN1cnJSZWMsIGkpIHx8IChSZWNvcmQuRkxBR19OVUxMID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19OVUxMKSkpIHtcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IHRoaXMuX2ZsYWdzW2ldIHwgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHNocmluayBmbGFnIGZvciBzcGVjaWZpYyBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmxkSWR4XCI+PC9wYXJhbT5cclxuICBzZXRTaHJpbmtGbGFnKGZsZElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbGFnc1tmbGRJZHhdIHw9IFJlY29yZC5GTEFHX1ZBTFVFX05PVF9QQVNTRUQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldHMgZmllbGQgdmFsdWUgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIGZyb20gcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICBTZXRGaWVsZFZhbHVlKGlkeDogbnVtYmVyLCBpc051bGw6IGJvb2xlYW4sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpZHgpO1xyXG4gICAgZmllbGQuVXBkYXRlTnVsbChpc051bGwsIHRoaXMpO1xyXG5cclxuICAgIHZhbHVlID0gdGhpcy5DaGVja01nVmFsdWUodmFsdWUsIGlzTnVsbCwgZmllbGQpO1xyXG4gICAgdGhpcy5fZmllbGRzRGF0YVtpZHhdID0gdmFsdWU7XHJcbiAgICBmaWVsZC50YWtlVmFsRnJvbVJlYygpO1xyXG4gICAgdGhpcy5jbGVhckZsYWcoZmllbGQuZ2V0SWQoKSwgUmVjb3JkLkZMQUdfSU5WQUxJRCk7XHJcbiAgICBmaWVsZC5pbnZhbGlkYXRlKHRydWUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZmllbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGZpZWxkIGluZGV4PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmllbGQuIG11c3QgYmUgaW4gdGhlIGludGVybmFsIHN0b3JhZ2UgZm9ybWF0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNldFJlY29yZFVwZGF0ZWRcIj50ZWxscyB3aGV0aGVyIHRvIGRlZmluZSB0aGlzIHJlY29yZCBhcyB1cGRhdGVkPC9wYXJhbT5cclxuICBzZXRGaWVsZFZhbHVlKGZsZElkeDogbnVtYmVyLCBtZ1ZhbDogc3RyaW5nLCBzZXRSZWNvcmRVcGRhdGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGZsZElkeCk7XHJcblxyXG4gICAgLy8gZG9uJ3QgY2hhbmdlIHZhbHVlIHdoZW4gcmVmZXJlbmNlcyBhcmUgZXF1YWwgb3IgaWYgdGhlIHRhc2sgbW9kZSBpcyBRdWVyeVxyXG4gICAgaWYgKGZsZC5QcmV2SXNOdWxsKCkgPT09IGZsZC5pc051bGwoKSAmJiBtZ1ZhbCA9PT0gdGhpcy5HZXRGaWVsZFZhbHVlKGZsZElkeCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcblxyXG4gICAgbWdWYWwgPSB0aGlzLkNoZWNrTWdWYWx1ZShtZ1ZhbCwgZmxkLmlzTnVsbCgpLCBmbGQpO1xyXG5cclxuICAgIGlmIChmbGRJZHggPj0gMCAmJiBmbGRJZHggPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSkge1xyXG4gICAgICB0aGlzLl9maWVsZHNEYXRhW2ZsZElkeF0gPSBtZ1ZhbDtcclxuXHJcbiAgICAgIC8vIFFDUiAjOTg2NzE1OiBUaGUgZm9sbG93aW5nIHNldEZsYWcoKSBjYWxsIHdhcyByZW1vdmVkIHRvIHNvbHZlIHRoZSBidWcuXHJcbiAgICAgIC8vIGl0IGNhdXNlZCBtYXJraW5nIGEgdmFyaWFibGUgYXMgbW9kaWZpZWQgZXZlbiBpZiB0aGUgY2hhbmdlIGlzIGR1ZSB0byB0aGVcclxuICAgICAgLy8gY29tcHV0ZSBvZiB0aGUgcmVjb3JkLiBUaGUgRkxBR19NT0RJRklFRCBmbGFnIGlzIHNldCBjb3JyZWN0bHkgaW4gdGhlXHJcbiAgICAgIC8vIEZpZWxkLnNldFZhbHVlKCkgbWV0aG9kLlxyXG4gICAgICAvLyBzZXRGbGFnKGZsZElkeCwgRkxBR19NT0RJRklFRCk7XHJcbiAgICAgIGlmIChzZXRSZWNvcmRVcGRhdGVkKSB7XHJcbiAgICAgICAgLy8gc2V0IG1vZGlmeSBvbmx5IGlmIHRoZSBmaWVsZCBpcyBwYXJ0IG9mIHRoZSBkYXRhdmlldy5cclxuICAgICAgICBpZiAoZmxkLlBhcnRPZkRhdGF2aWV3KVxyXG4gICAgICAgICAgdGhpcy5fbW9kaWZpZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSBkdWUgdG8gdGFzayBjbG9zaW5nICwgYW5kIGZvdW5kIHRoYXQgdGhlIGN1cnJlbnQgcmVjJ3MgZmxkIGlzIHVwZGF0ZWRcclxuICAgICAgICAvLyB0aGVuIHNldCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlXHJcblx0XHQvLyBTbyB0aGF0IGNvbW1pdCB0cmFuc2FjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgc2VwYXJhdGVseSBhdCBzZXJ2ZXIgc2lkZS5cclxuICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAoPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kYXRhdmlldy5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuc2V0RmllbGRWYWx1ZSgpIGlsbGVnYWwgZmllbGQgaW5kZXg6IFwiICsgZmxkSWR4KTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIG1ndmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBDaGVja01nVmFsdWUobWdWYWw6IHN0cmluZywgaXNOdWxsOiBib29sZWFuLCBmbGQ6IEZpZWxkKTogc3RyaW5nIHtcclxuICAgIGlmIChtZ1ZhbCA9PT0gbnVsbCB8fCBpc051bGwpIHtcclxuICAgICAgbWdWYWwgPSBmbGQuZ2V0TnVsbFZhbHVlKCk7XHJcbiAgICAgIGlmIChtZ1ZhbCA9PT0gbnVsbClcclxuICAgICAgICBtZ1ZhbCA9IGZsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG5cclxuICAgIH1cclxuICAgIGxldCBzaXplOiBudW1iZXIgPSBmbGQuZ2V0U2l6ZSgpO1xyXG5cclxuICAgIC8vIHRydW5jYXRlIHZhbHVlcyB0aGF0IGFyZSBsb25nZXIgdGhhbiB0aGUgc3RvcmFnZSBzaXplXHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBmbGQuZ2V0VHlwZSgpICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBieXRlcywgbm90IGNoYXJhY3RlcnMgKEpQTjogREJDUyBzdXBwb3J0KVxyXG4gICAgICBpZiAobWdWYWwgIT09IG51bGwgJiYgVXRpbFN0ckJ5dGVNb2RlLmxlbkIobWdWYWwpID4gc2l6ZSlcclxuICAgICAgICBtZ1ZhbCA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihtZ1ZhbCwgc2l6ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG1nVmFsICE9PSBudWxsICYmIG1nVmFsLmxlbmd0aCA+IHNpemUpXHJcbiAgICAgICAgbWdWYWwgPSBtZ1ZhbC5zdWJzdHIoMCwgc2l6ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcIm1vZGlmaWVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0TW9kaWZpZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RpZmllZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwibW9kaWZpZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldE1vZGlmaWVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kaWZpZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwidXBkYXRlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFVwZGF0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl91cGRhdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJtb2RpZmllZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0VXBkYXRlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0ZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgZmllbGQgaW5kZXg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gU3RyaW5nIHRoZSBmaWVsZCB2YWx1ZTwvcmV0dXJucz5cclxuICBHZXRGaWVsZFZhbHVlKGZsZElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCB2YWw6IFN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgaWYgKGZsZElkeCA+PSAwICYmIGZsZElkeCA8IHRoaXMuX2ZpZWxkc0RhdGEubGVuZ3RoKVxyXG4gICAgICB2YWwgPSB0aGlzLl9maWVsZHNEYXRhW2ZsZElkeF07XHJcbiAgICByZXR1cm4gdmFsLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIGNvcHkgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlcGxpY2F0ZSgpOiBSZWNvcmQge1xyXG4gICAgbGV0IHJlY29yZDogUmVjb3JkID0gbmV3IFJlY29yZCh0aGlzKTtcclxuICAgIHJlY29yZC5fZmllbGRzRGF0YSA9IHRoaXMuX2ZpZWxkc0RhdGEuc2xpY2UoKTtcclxuICAgIHJlY29yZC5fZmxhZ3MgPSB0aGlzLl9mbGFncy5zdWJhcnJheSgwKTtcclxuICAgIHJlY29yZC5fZmxhZ3NIaXN0b3J5ID0gdGhpcy5fZmxhZ3NIaXN0b3J5LnN1YmFycmF5KDApO1xyXG4gICAgcmVjb3JkLl9kY1JlZnMgPSB0aGlzLl9kY1JlZnMuQ2xvbmUoKTtcclxuICAgIHJldHVybiByZWNvcmQ7XHJcbiAgfVxyXG5cclxuICBzZXRTYW1lQXMocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuLCBySWQ6IG51bWJlcik6IHZvaWQ7XHJcbiAgc2V0U2FtZUFzKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc2V0U2FtZUFzKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbiwgcklkPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMylcclxuICAgICAgdGhpcy5zZXRTYW1lQXNfMChyZWMsIHJlYWxPbmx5LCBySWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnNldFNhbWVBc18xKHJlYywgcmVhbE9ubHkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIG1lbWJlciB2YXJpYWJsZXMgb2YgdGhpcyByZWNvcmQgdG8gYmUgdGhlIHNhbWUgYXMgdGhvc2VcclxuICAvLy8gICBvZiB0aGUgZ2l2ZW4gcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSBzb3VyY2UgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJJZFwiPnRoZSBuZXcgSWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRTYW1lQXNfMChyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4sIHJJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFNhbWVBcyhyZWMsIHJlYWxPbmx5KTtcclxuICAgIHRoaXMuc2V0SWQocklkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBtZW1iZXIgdmFyaWFibGVzIG9mIHRoaXMgcmVjb3JkIHRvIGJlIHRoZSBzYW1lIGFzIHRob3NlXHJcbiAgLy8vICAgb2YgdGhlIGdpdmVuIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgc291cmNlIHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRTYW1lQXNfMShyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lkID0gcmVjLl9pZDtcclxuICAgIHRoaXMuX2hhc2hLZXkgPSByZWMuX2hhc2hLZXk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkvKidQJyovKVxyXG4gICAgICB0aGlzLnNldE1vZGUocmVjLl9tb2RlKTtcclxuXHJcbiAgICB0aGlzLl9hZGRBZnRlciA9IHJlYy5fYWRkQWZ0ZXI7XHJcblxyXG4gICAgaWYgKHJlYWxPbmx5KSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGFmaWVsZDogRmllbGQgPSA8RmllbGQ+cmVjLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICAgIGlmICghYWZpZWxkLklzVmlydHVhbCkge1xyXG4gICAgICAgICAgdGhpcy5fZmllbGRzRGF0YVtpXSA9IHJlYy5fZmllbGRzRGF0YVtpXTtcclxuICAgICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gcmVjLl9mbGFnc1tpXTtcclxuICAgICAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHJlYy5fZmxhZ3NIaXN0b3J5W2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc0RhdGEgPSByZWMuX2ZpZWxkc0RhdGE7XHJcbiAgICAgIHRoaXMuX2ZsYWdzID0gcmVjLl9mbGFncztcclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5ID0gcmVjLl9mbGFnc0hpc3Rvcnk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tb2RpZmllZCA9IHJlYy5fbW9kaWZpZWQ7XHJcbiAgICB0aGlzLl9kYXRhdmlldyA9IHJlYy5fZGF0YXZpZXc7XHJcbiAgICB0aGlzLl9jb21wdXRlZCA9IHJlYy5fY29tcHV0ZWQ7XHJcbiAgICB0aGlzLl91cGRhdGVkID0gcmVjLl91cGRhdGVkO1xyXG4gICAgdGhpcy5zZXREY1JlZnMocmVjLl9kY1JlZnMpO1xyXG5cclxuICAgIC8vIFFDUiAjNDIzNTUyOiBwYXJ0aWFsIGZpeCAtIHdlIG5lZWQgdG8gZ28gb3ZlciBhbGwgdGhlIHJlYy5uZXh0L3ByZXYgYW5kIG1ha2Ugc3VyZSB0aGlzIHJlY29yZCBkb2VzIG5vdCBhcHBlYXJcclxuICAgIGlmIChyZWMuX25leHQgIT09IHRoaXMpIHtcclxuICAgICAgdGhpcy5fbmV4dCA9IHJlYy5fbmV4dDtcclxuICAgIH1cclxuICAgIGlmIChyZWMuX3ByZXYgIT09IHRoaXMpIHtcclxuICAgICAgdGhpcy5fcHJldiA9IHJlYy5fcHJldjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgYSBudWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIElzTnVsbChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfTlVMTCkgPT09IFJlY29yZC5GTEFHX05VTEwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNMaW5rSW52YWxpZChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfSU5WQUxJRCkgPT09IFJlY29yZC5GTEFHX0lOVkFMSUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBtb2RpZmllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBpc0ZsZE1vZGlmaWVkKGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHJldHVybiAoKHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiBSZWNvcmQuRkxBR19NT0RJRklFRCkgPT09IFJlY29yZC5GTEFHX01PRElGSUVEKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgbW9kaWZpZWQgYXQgbGVhc3Qgb25jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBJc0ZsZE1vZGlmaWVkQXRMZWFzdE9uY2UoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSkgPT09IFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIGlzRmxkVXBkYXRlZChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfVVBEQVRFRCkgPT09IFJlY29yZC5GTEFHX1VQREFURUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIGZpZWxkIHRvIGhhdmUgYSBudWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIHB1YmxpYyBzZXRGbGFnKGZsZElkeDogbnVtYmVyLCBhRmxhZzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHRoaXMuX2ZsYWdzW2ZsZElkeF0gPSB0aGlzLl9mbGFnc1tmbGRJZHhdIHwgYUZsYWc7XHJcbiAgICAvLyBOb3RlOiB3ZSBvbmx5IHNldCB0aGUgaGlzdG9yeSBmbGFncy4gV2UgZG9udCBjbGVhciB0aGVtIGhlcmUuIFdlIG9ubHkgY2xlYXIgdGhlbSBhZnRlciBYTUwgd2FzIGR1bXBlZC5cclxuICAgIGlmIChhRmxhZyA9PT0gUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRClcclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ZsZElkeF0gPSB0aGlzLl9mbGFnc0hpc3RvcnlbZmxkSWR4XSB8IGFGbGFnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIGZpZWxkIHRvIGhhdmUgYSBub24tbnVsbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICBjbGVhckZsYWcoZmxkSWR4OiBudW1iZXIsIGFGbGFnczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHRoaXMuX2ZsYWdzW2ZsZElkeF0gPSB0aGlzLl9mbGFnc1tmbGRJZHhdICYgfmFGbGFncztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciB0aGUgZmxhZ3MgaGlzdG9yeS4gVGhpcyBzaG91bGQgb25seSBiZSBkb25lIGFmdGVyIGEgY29tbWl0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJGbGFnc0hpc3RvcnkoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fZmxhZ3MubGVuZ3RoOyBpID0gaSArIDEpXHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgZmxhZyBmb3IgYWxsIGZpZWxkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJGbGFncyhhRmxhZ3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKVxyXG4gICAgICB0aGlzLmNsZWFyRmxhZyhpLCBhRmxhZ3MpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIGZsYWcgZm9yIGFsbCByZWFsIGZpZWxkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJGbGFnc0ZvclJlYWxPbmx5KGFGbGFnczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fZmxhZ3MubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICBpZiAoIWZpZWxkLklzVmlydHVhbCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJGbGFnKGksIGFGbGFncyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciBhIHNwZWNpZmljIGZpZWxkIGZsYWcgZnJvbSB0aGUgaGlzdG9yeVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJIaXN0b3J5RmxhZyhmbGRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZsYWdzSGlzdG9yeSAhPT0gbnVsbCAmJiBmbGRJZHggPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSAmJiBmbGRJZHggPj0gMCkge1xyXG4gICAgICB0aGlzLl9mbGFnc0hpc3RvcnlbZmxkSWR4XSA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgZmxhZ3MgYW5kIHRoZSB2YWxpZGl0eSBvZiB0aGUgZmllbGQgaW5kZXhcclxuICAvLy8gICB0aHJvd3MgYW4gZXJyb3IgaW4gY2FzZSBvZiBhIGZhaWx1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgY2hlY2tGbGFncyhmbGRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZsYWdzID09PSBudWxsIHx8IGZsZElkeCA+PSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSB8fCBmbGRJZHggPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIkNhbm5vdCBmaW5kIGZsYWdzXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RhcnQgdGhlIHJlY29yZCdzIHNldHRpbmdzLiBUaGlzIG1pZ2h0IGJlIG5lZWRlZCBhZnRlciBhIHNlcnZlcidzIHJvbGxiYWNrXHJcbiAgLy8vICAgb3IgcmVzdGFydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbGRNb2RlXCI+dGhlIG9sZCByZWNvcmQgbW9kZTwvcGFyYW0+XHJcbiAgcmVzdGFydChvbGRNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpO1xyXG5cclxuICAgIGlmIChvbGRNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZSkge1xyXG4gICAgICBsZXQgcmVjOiBSZWNvcmQgPSB0aGlzLl9kYXRhdmlldy5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIGxldCBpc0N1cnJSZWM6IGJvb2xlYW4gPSAocmVjICE9IG51bGwgJiYgcmVjLmdldElkKCkgPT09IHRoaXMuX2lkKTtcclxuXHJcbiAgICAgIGlmICgodGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpKS5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgIGlmIChpc0N1cnJSZWMgJiYgIXRhc2suZ2V0QWZ0ZXJSZXRyeSgpICYmIHRhc2suVHJ5aW5nVG9Db21taXQgJiYgIXRoaXMuX2RhdGF2aWV3LmluUm9sbGJhY2soKSlcclxuICAgICAgICAgIG9sZE1vZGUgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlO1xyXG4gICAgICAgIGVsc2Ugb2xkTW9kZSA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQ7XHJcblxyXG4gICAgICBlbHNlIG9sZE1vZGUgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRNb2RlKG9sZE1vZGUpO1xyXG4gICAgaWYgKG9sZE1vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgIHRoaXMuc2V0TmV3UmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgdmFsdWUgb2YgbGF0ZUNvbXB1dGUgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRMYXRlQ29tcHV0ZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2xhdGVDb21wdXRlID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFwibGF0ZUNvbXB1dGVcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBsYXRlQ29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9sYXRlQ29tcHV0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gXCJpbiBkZWxldGUgcHJvY2Vzc1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPjwvcGFyYW0+XHJcbiAgc2V0SW5EZWxldGVQcm9jZXNzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faW5EZWxldGVQcm9jZXNzID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgaW5EZWxldGVQcm9jZXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luRGVsZXRlUHJvY2VzcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZW1vdmluZyB0aGUgcmVjb3JkLCBpdCB3aWxsIGRlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRcclxuICAvLy8gICBvZiBpdHMgZGF0YSBjb250cm9scyB0byB0aGVpciBkY1ZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVjRnJvbURjKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RjUmVmcyAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9kY1JlZnMuRGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXBhcmUgdGhlIGRhdGEgb2YgdGhpcyByZWNvcmQgd2l0aCB0aGUgZGF0YSBvZiBhIGRpZmZlcmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIG90aGVyIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyUmVjXCI+VFJVRSBpZiB3ZSBhcmUgY29tcGFyaW5nIHR3byAnY3VycmVudCByZWNvcmRzJyBvdGhlcndpc2Ugc2hvdWxkIGJlIGZhbHNlLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja09ubHlQYXJldE9mRGF0YXZpZXdcIj5GQUxTRSBpZiB3ZSB3YW50IHRvIGNoZWNrIGFsbCB0aGUgZmllbGRzICwgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGRhdGEgdmlldy48L3BhcmFtPlxyXG4gIGlzU2FtZVJlY0RhdGEocmVjOiBSZWNvcmQsIGN1cnJSZWM6IGJvb2xlYW4sIGNoZWNrT25seVBhcmV0T2ZEYXRhdmlldzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuZ2V0U2l6ZUZsZChjdXJyUmVjKTtcclxuICAgIGxldCBzdGFydDogbnVtYmVyID0gdGhpcy5nZXRGcm9tRmxkSWR4KGN1cnJSZWMpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmaWVsZDogRmllbGQ7XHJcblxyXG4gICAgLy8gY29tcGFyZSByZWZlcmVuY2VzXHJcbiAgICBpZiAodGhpcyA9PT0gcmVjKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAocmVjLmdldFNpemVGbGQoY3VyclJlYykgIT09IHNpemUpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHJlYy5nZXRGcm9tRmxkSWR4KGN1cnJSZWMpICE9PSBzdGFydClcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhcnQgKyBzaXplOyBpKyspIHtcclxuICAgICAgICBmaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tPbmx5UGFyZXRPZkRhdGF2aWV3ICYmICFmaWVsZC5QYXJ0T2ZEYXRhdmlldylcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZmxkVmFsc0VxdWFsKHJlYywgaSkpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgdGhyb3cgIGVycjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wYXJlIHR3byBmaWVsZCB2YWx1ZXMgYmV0d2VlbiB0aGlzIHJlY29yZCBhbmQgdGhlIGdpdmVuIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgcmVjb3JkIHRvIGNvbXBhcmUgd2l0aDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNvbXBhcmU8L3BhcmFtPlxyXG4gIGZsZFZhbHNFcXVhbChyZWM6IFJlY29yZCwgZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChmbGRJZHgpLmdldFR5cGUoKTtcclxuICAgIHJldHVybiBFeHByZXNzaW9uRXZhbHVhdG9yLm1nVmFsc0VxdWFsKHRoaXMuR2V0RmllbGRWYWx1ZShmbGRJZHgpLCB0aGlzLklzTnVsbChmbGRJZHgpLCB0eXBlLCByZWMuR2V0RmllbGRWYWx1ZShmbGRJZHgpLCByZWMuSXNOdWxsKGZsZElkeCksIHR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgaGFzaCBrZXkgb2JqZWN0IG9mIHRoaXMgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRIYXNoS2V5KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzaEtleTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJlY29yZHMgYWZ0ZXIgdGhpcyBvbmUsIGluIGEgbGlzdCBvZiByZWNzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXh0UmVjXCI+aXMgdGhlIG5leHQgcmVjb3JkIChvciBudWxsIGZvciB0aGUgbGFzdCByZWNvcmQpPC9wYXJhbT5cclxuICBzZXROZXh0UmVjKG5leHRSZWM6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbmV4dCA9IG5leHRSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSByZWNvcmRzIGJlZm9yZSB0aGlzIG9uZSwgaW4gYSBsaXN0IG9mIHJlY3MuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByZXZSZWNcIj5pcyB0aGUgcHJldmlvdXMgcmVjb3JkIChvciBudWxsIGZvciB0aGUgZmlyc3QgcmVjb3JkKTwvcGFyYW0+XHJcbiAgc2V0UHJldlJlYyhwcmV2UmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXYgPSBwcmV2UmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcmVjb3JkIHdob3NlIGxvY2F0aW9uIGlzIGJlZm9yZSB0aGlzIG9uZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UHJldlJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXY7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSByZWNvcmQgd2hpY2ggZm9sbG93cyB0aGlzIG9uZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TmV4dFJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX25leHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIERjUmVmc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGNSZWZzKCk6IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9kY1JlZnMuQ2xvbmUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgRGNSZWZzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREY1JlZnMobmV3RGNSZWZzOiBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1vdmVSZWNGcm9tRGMoKTtcclxuICAgIHRoaXMuX2RjUmVmcyA9IG5ld0RjUmVmcy5DbG9uZSgpO1xyXG4gICAgdGhpcy5TZXREY1ZhbHVlSWQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSByZWFsIHZhcmlhYmxlcyB3YXMgbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlYWxNb2RpZmllZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBiUmM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB0YWJTaXplOiBudW1iZXIgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChqID0gMDsgaiA8IHRhYlNpemU7IGorKykge1xyXG4gICAgICAvLyBmb3IgZXZlcnkgbW9kaWZpZWQgZmllbGQgY2hlY2sgaWYgaXQgaXMgYSByZWFsIGZpZWxkXHJcbiAgICAgIGlmICgodGhpcy5fZmxhZ3Nbal0gJiBSZWNvcmQuRkxBR19NT0RJRklFRCkgPT09IFJlY29yZC5GTEFHX01PRElGSUVEKSB7XHJcbiAgICAgICAgaWYgKCEoKDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGopKS5Jc1ZpcnR1YWwpKSB7XHJcbiAgICAgICAgICBiUmMgPSB0cnVlOyAvLyBpZiBhIHJlYWwgbW9kaWZpZWQgZmllbGQgd2FzIGZvdW5kLCByZXR1cm4gd2l0aCB0cnVlXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiUmM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgeG1sIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNvcmQgLSB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIHNvIHdlXHJcbiAgLy8vICAgY2FuIHVzZSB0aGUgcmVjb3JkIHJlZmVyZW5jZSBpbiBhIHN0cmluZyBjb25jYXRlbmF0aW9uIG9wZXJhdGlvbnMgYW5kIHByaW50IGNhbGxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBUb1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICB0aGlzLmJ1aWxkWE1MKHN0ciwgKHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkuZ2V0SWQoKSA9PT0gdGhpcy5faWQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHN0ci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIHNlbmRUb1NlcnZlciBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRTZW5kVG9TZXJ2ZXIodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZW5kVG9TZXJ2ZXIgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBzaXplIGluIGtiIG9mIHRoZSByZWNvcmRzIGUuaS4gdGhlIHN1bSBvZiBhbGwgZmllbGRzIGluIHRoZSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJlY1NpemUoKTogbnVtYmVyIHtcclxuICAgIGxldCBzdW06IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICBzdW0gPSBzdW0gKyBmaWVsZC5nZXRTaXplKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvcHkgdGhlIG1vZGlmaWVkIGNyc3IgZmxhZ3MgZnJvbSBhIGdpdmVuIHJlYy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHNvdXJjZSByZWNvcmQ8L3BhcmFtPlxyXG4gIGNvcHlDcnNyTW9kaWZpZWRGbGFncyhyZWM6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgbGV0IHRhYlNpemU6IG51bWJlciA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGFiU2l6ZTsgaisrKSB7XHJcbiAgICAgIHRoaXMuX2ZsYWdzW2pdID0gcmVjLl9mbGFnc1tqXTtcclxuICAgICAgdGhpcy5fZmxhZ3Nbal0gPSB0aGlzLl9mbGFnc1tqXSAmIFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZm9yIGEgdGFibGUgY2FjaGUgcmVjb3JkIHJldHVybnMgdGhlIHJlY29yZCdzIGRiX3BvcyB2YWx1ZSBhcyBhIGJhc2U2NCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERiUG9zVmFsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGJQb3NCYXNlNjRWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIHN0cmluZyB0aGF0IHJlcHJlc2VudCB0aGUgY3VycmVudCBsaW5rcyBmaWVsZHMgZGJfcG9zIHZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRMaW5rc1Bvc1N0cigpOiB2b2lkIHtcclxuICAgIGxldCB0Ymw6IERhdGF2aWV3SGVhZGVycyA9ICg8VGFzaz50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkpLmdldERhdGF2aWV3SGVhZGVycygpO1xyXG4gICAgaWYgKHRibCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9saW5rc0ZsZHNQb3MgPSB0YmwuYnVpbGREYlBvc1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Rm9yY2VTYXZlT3JnKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZm9yY2VTYXZlT3JnID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHJlbGlua2VkIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEZvcmNlU2F2ZU9yZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZVNhdmVPcmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJ1ZSwgaWYgZXhpdCBmcm9tIHRoaXMgcmVjb3JkIHdpbGwgY2F1c2UgaW52YWxpZGF0aW9uIG9mIHRoZSB0YWJsZSBkdWUgdG8gdml0cnVhbCByZWNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDYXVzZUludmFsaWRhdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYXVzZUludmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpZiBjYXVzZUludmFsaWRhdGlvbiBpcyB0cnVlLCAgZXhpdCBmcm9tIHRoaXMgcmVjb3JkIHdpbGwgY2F1c2UgaW52YWxpZGF0aW9uIG9mIHRoZSB0YWJsZSBkdWUgdG8gdml0cnVhbCByZWNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2F1c2VJbnZhbGlkYXRpb25cIj48L3BhcmFtPlxyXG4gIHNldENhdXNlSW52YWxpZGF0aW9uKGNhdXNlSW52YWxpZGF0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXVzZUludmFsaWRhdGlvbiA9IGNhdXNlSW52YWxpZGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFwiY29tcHV0ZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0NvbXB1dGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXB1dGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwiY29tcHV0ZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldENvbXB1dGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcHV0ZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJpbiBjb21wdXRlXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRJbkNvbXB1dGUodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoIXZhbClcclxuICAgICAgdGhpcy5zZXRDb21wdXRlZCh0cnVlKTtcclxuICAgIHRoaXMuX2luQ29tcHV0ZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBcImluIHJlY29tcHV0ZVwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0SW5SZWNvbXB1dGUodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pblJlY29tcHV0ZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3TW9kZVwiPnRoZSBuZXcgbW9kZTogQ3JlYXRlZCwgTW9kaWZpZWQsIERlbGV0ZWQ8L3BhcmFtPlxyXG4gIHNldE1vZGUobmV3TW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKG5ld01vZGUpIHtcclxuICAgICAgY2FzZSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZTpcclxuICAgICAgY2FzZSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0OlxyXG4gICAgICBjYXNlIERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGU6XHJcbiAgICAgIGNhc2UgRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZTpcclxuICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmUgfHxcclxuICAgICAgICAgIHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUgJiYgbmV3TW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgIHRoaXMuX21vZGUgPSBuZXdNb2RlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFJlY29yZC5zZXRNb2RlKCk6IGlsbGVnYWwgbW9kZTogXCIgKyBuZXdNb2RlKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHJlY29yZCBtb2RlIHRvIFwibm9uZVwiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhck1vZGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RlID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3dpdGNoIG9mZiB0aGUgbmV3UmVjIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE9sZFJlYygpOiB2b2lkIHtcclxuICAgIHRoaXMuX25ld1JlYyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN3aXRjaCBvbiB0aGUgbmV3UmVjIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE5ld1JlYygpOiB2b2lkIHtcclxuICAgIHRoaXMuX25ld1JlYyA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXJpYWxpemUgYW4gaXRlbSAoZmllbGQvZ2xvYmFsIHBhcmFtLy4uLikuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPml0ZW0ncyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGVtQXR0clwiPml0ZW0ncyBhdHRyaWJ1dGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2VsbEF0dHJcIj5jZWxsJ3MgYXR0cmlidXRlIC0gcmVsZXZhbnQgb25seSBpZiAnaXRlbUF0dHInIGlzIHZlY3RvcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJUb0Jhc2U2NFwiPj5kZWNpZGUgQmFzZTY0IGVuY29kaW5nIGlzIHRvIGJlIGRvbmU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5zZXJpYWxpemVkIGl0ZW1WYWwgPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBzZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBUb0Jhc2U2NDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gUmVjb3JkVXRpbHMuc2VyaWFsaXplSXRlbVZhbChpdGVtVmFsLCBpdGVtQXR0ciwgY2VsbEF0dHIsIFRvQmFzZTY0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyBEQ1ZhbCBJZCBpbnRvIE1nQ29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldERjVmFsdWVJZCgpOiB2b2lkIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKS5nZXRGb3JtKCk7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmb3JtIGRvZXNuJ3QgaGF2ZSBhbnkgc2VsZWN0aW9uIGNvbnRyb2wsIGRjUmVmcyB3b3VsZCBiZSBudWxsXHJcbiAgICBpZiAoZm9ybSAhPSBudWxsICYmIHRoaXMuX2RjUmVmcyAhPSBudWxsKSB7XHJcblxyXG4gICAgICB0aGlzLl9kY1JlZnMuUmVmcy5mb3JFYWNoKChkY1JlZjogRGNWYWx1ZXNSZWZlcmVuY2UpID0+IHtcclxuICAgICAgICBtZ0NvbnRyb2wgPSA8TWdDb250cm9sPmZvcm0uZ2V0Q3RybChkY1JlZi5kaXRJZHgpO1xyXG4gICAgICAgIGlmIChtZ0NvbnRyb2wgIT0gbnVsbClcclxuICAgICAgICAgIG1nQ29udHJvbC5zZXREY1ZhbElkKGRjUmVmLkRjVmFsdWVzLmdldElkKCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVzZXQgdGhlIERDVmFsIElkIGluIE1nQ29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0RGNWYWx1ZUlkKCk6IHZvaWQge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpLmdldEZvcm0oKTtcclxuICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgLy8gaWYgdGhlIGZvcm0gZG9lc24ndCBoYXZlIGFueSBzZWxlY3Rpb24gY29udHJvbCwgZGNSZWZzIHdvdWxkIGJlIG51bGxcclxuICAgIGlmIChmb3JtICE9IG51bGwgJiYgdGhpcy5fZGNSZWZzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGNSZWZzLlJlZnMuZm9yRWFjaChmdW5jdGlvbiAoZGNSZWY6IERjVmFsdWVzUmVmZXJlbmNlKSB7XHJcbiAgICAgICAgbWdDb250cm9sID0gPE1nQ29udHJvbD5mb3JtLmdldEN0cmwoZGNSZWYuZGl0SWR4KTtcclxuICAgICAgICBpZiAobWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgICAgICBtZ0NvbnRyb2wuc2V0RGNWYWxJZChFTVBUWV9EQ1JFRik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQWRkRGNWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkOiBudW1iZXIsIGRjVmFsdWVzSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGRjVmFsdWVzOiBEY1ZhbHVlcyA9IHRoaXMuX2RhdGF2aWV3LmdldERjVmFsdWVzKGRjVmFsdWVzSWQpO1xyXG4gICAgbGV0IGRjUmVmOiBEY1ZhbHVlc1JlZmVyZW5jZSA9IG5ldyBEY1ZhbHVlc1JlZmVyZW5jZShjb250cm9sSWQsIGRjVmFsdWVzKTtcclxuICAgIGlmICh0aGlzLl9kY1JlZnMgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGNSZWZzID0gbmV3IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kY1JlZnMuQWRkKGRjUmVmKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGxpbmsgYmV0d2VlbiBhIGRhdGEgY29udHJvbCBhbmQgaXRzIERjVmFsdWVzIG9iamVjdC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIERjVmFsdWVzUmVmZXJlbmNlIGV4dGVuZHMgT2JqZWN0UmVmZXJlbmNlQmFzZSB7XHJcbiAgZGl0SWR4OiBudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSByZWZlcmVuY2VkIERjVmFsdWVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IERjVmFsdWVzKCk6IERjVmFsdWVzIHtcclxuICAgIHJldHVybiA8RGNWYWx1ZXM+dGhpcy5SZWZlcmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvdXBsZVwiPmEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgZGl0SWR4ICYgZGNJZCBzZXBhcmF0ZWQgYnkgYSBjb21tYTwvcGFyYW0+XHJcbiAgY29uc3RydWN0b3IoY29udHJvbElkOiBudW1iZXIsIHJlZmVyZW5jZWREY1ZhbHVlczogRGNWYWx1ZXMpIHtcclxuICAgIHN1cGVyKHJlZmVyZW5jZWREY1ZhbHVlcyk7XHJcbiAgICB0aGlzLmRpdElkeCA9IGNvbnRyb2xJZDtcclxuICB9XHJcblxyXG4gIENsb25lKCk6IE9iamVjdFJlZmVyZW5jZUJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBEY1ZhbHVlc1JlZmVyZW5jZSh0aGlzLmRpdElkeCwgPERjVmFsdWVzPnRoaXMuUmVmZXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGEgbmV3IERjVmFsdWVzUmVmZXJlbmNlIGZyb20gYSBzdHJpbmcgY29udGFpbmluZyB0d28gaW50ZWdlcnMsIHdoZXJlIHRoZVxyXG4gIC8vLyBmaXJzdCBpcyB0aGUgaW5kZXggb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGZvcm0gKGRpdCBpbmRleCkgYW5kIHRoZSBzZWNvbmQgaXMgdGhlXHJcbiAgLy8vIERjVmFsdWVzIG9iamVjdCBpZGVudGlmaWVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY291cGxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkY1ZhbHVlc093bmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBQYXJzZShjb3VwbGU6IHN0cmluZywgZGNWYWx1ZXNPd25lcjogRGF0YVZpZXdCYXNlKTogRGNWYWx1ZXNSZWZlcmVuY2Uge1xyXG4gICAgbGV0IGNvbW1hUG9zOiBudW1iZXIgPSBjb3VwbGUuaW5kZXhPZihcIixcIik7XHJcblxyXG4gICAgbGV0IGNvbnRyb2xJZDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjb3VwbGUuc3Vic3RyKDAsIGNvbW1hUG9zKSk7XHJcbiAgICBsZXQgZGNJZDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjb3VwbGUuc3Vic3RyKGNvbW1hUG9zICsgMSkpO1xyXG5cclxuICAgIHJldHVybiBuZXcgRGNWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkLCBkY1ZhbHVlc093bmVyLmdldERjVmFsdWVzKGRjSWQpKTtcclxuICB9XHJcbn1cclxuIl19
|