@kontur.candy/tools 2.154.0 → 2.156.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/CHANGELOG.md +11 -0
- package/distr/Common/AsyncUtils.js +1 -3
- package/distr/Common/CandyApiClient/CandyApiClient.js +25 -138
- package/distr/Common/CandyApiClient/CandyApiClientContext.js +1 -8
- package/distr/Common/CandyApiClient/ClientDraftInfo/ClientDraftInfoResponse.js +1 -1
- package/distr/Common/CandyApiClient/ClientDraftInfo/FnsFormInfo.js +1 -1
- package/distr/Common/CandyApiClient/ClientDraftInfo/GetClientDraftInfoUrl.js +1 -2
- package/distr/Common/CandyApiClient/ClientDraftInfo/PrintInfo.js +1 -1
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js +1 -16
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js +1 -12
- package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js +1 -12
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js +1 -1
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js +1 -13
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js +1 -3
- package/distr/Common/CandyApiClient/DigestApiClient/IDigestApiClient.js +1 -1
- package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js +1 -8
- package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js +1 -7
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js +9 -12
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestRequest.js +1 -1
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestResponse.js +1 -1
- package/distr/Common/CandyApiClient/FakeCandyApiClient.js +4 -72
- package/distr/Common/CandyApiClient/ICandyApiClient.js +1 -1
- package/distr/Common/CandyApiClient/IsBuffer.js +1 -2
- package/distr/Common/CandyApiClient/Types/Attachments/Attacments.js +1 -1
- package/distr/Common/CandyApiClient/Types/Attachments/GetAttachmentsResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/ChangeSet/ServerChangeSet.js +1 -1
- package/distr/Common/CandyApiClient/Types/CreateDraft/CreateDraftResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/DiagResourcesResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/DraftActions/CombineFufResult.js +12 -7
- package/distr/Common/CandyApiClient/Types/DraftActions/ConvertDraftRequest.js +1 -1
- package/distr/Common/CandyApiClient/Types/DraftActions/FileProperties.js +1 -1
- package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js +1 -3
- package/distr/Common/CandyApiClient/Types/DraftFullId.js +1 -1
- package/distr/Common/CandyApiClient/Types/ErrorLog/CandyPopdProtocol.js +5 -6
- package/distr/Common/CandyApiClient/Types/ErrorLog/ServerErrorLog.js +9 -12
- package/distr/Common/CandyApiClient/Types/ExplanatoryNote/CreateExplanatoryNoteResponse.js +5 -6
- package/distr/Common/CandyApiClient/Types/FeatureFlags/FeatureFlagsResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/Focus/FocusServerResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/Focus/FocusTypes.js +5 -6
- package/distr/Common/CandyApiClient/Types/GetInner/ServerInnerResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/GetInner/ServerRawResponse.js +1 -3
- package/distr/Common/CandyApiClient/Types/GetInner/ServerRequisitesResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/Guid.js +1 -1
- package/distr/Common/CandyApiClient/Types/InstancesDeleting/InstancesDeletingRule.js +1 -1
- package/distr/Common/CandyApiClient/Types/MassActions/MassActionParameters.js +1 -1
- package/distr/Common/CandyApiClient/Types/MassActions/ValueForInstancesSettingRule.js +6 -0
- package/distr/Common/CandyApiClient/Types/Presentations/DraftPresentationType.js +5 -6
- package/distr/Common/CandyApiClient/Types/Presentations/PresentationContent.js +1 -1
- package/distr/Common/CandyApiClient/Types/Print/PrintResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/Print/PrintType.js +5 -6
- package/distr/Common/CandyApiClient/Types/Staff/EmployeeInfo.js +1 -1
- package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesOptions.js +1 -1
- package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesRequest.js +1 -1
- package/distr/Common/CandyApiClient/Types/Staff/StaffInfo.js +1 -1
- package/distr/Common/CandyApiClient/Types/Tasks/GetTasksServerResponse.js +1 -1
- package/distr/Common/CandyApiClient/Types/Tasks/Tasks.js +5 -6
- package/distr/Common/CandyApiClient/Types/TestClassification.js +1 -1
- package/distr/Common/CollectionUtils.js +1 -3
- package/distr/Common/CommonConstants/SectionNames.js +1 -3
- package/distr/Common/Comparers.js +2 -16
- package/distr/Common/EmotionStorybookWorkaroundViaAliases.js +1 -5
- package/distr/Common/EndPoints.js +1 -2
- package/distr/Common/Enums/ButtonSettingsTypeEnum.js +5 -6
- package/distr/Common/Errors.js +1 -19
- package/distr/Common/FormActionHandlers/ContextualActionNames.js +1 -3
- package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js +1 -1
- package/distr/Common/Funcs.js +1 -5
- package/distr/Common/GFV.js +1 -1
- package/distr/Common/Hooks/UseLocalStorage.js +3 -10
- package/distr/Common/HttpClient/AuthenticationMode.js +3 -7
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js +1 -3
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js +1 -3
- package/distr/Common/HttpClient/FetchImplementation/Fetch.js +1 -1
- package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js +1 -1
- package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js +6 -11
- package/distr/Common/HttpClient/HttpClient.js +9 -80
- package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js +1 -1
- package/distr/Common/HttpClient/IHttpClient.js +1 -1
- package/distr/Common/IndentString.js +1 -3
- package/distr/Common/IntRangeUtils.js +3 -10
- package/distr/Common/IterableUtils.js +3 -76
- package/distr/Common/KCLangRuntimeUtils.js +1 -87
- package/distr/Common/ModelPath/BuildIterationSequence.js +1 -5
- package/distr/Common/ModelPath/EachCurrentCollision.js +5 -6
- package/distr/Common/ModelPath/IEquatable.js +1 -1
- package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js +1 -8
- package/distr/Common/ModelPath/Map/Map2.js +2 -24
- package/distr/Common/ModelPath/Map/ModelPathMap.js +1 -8
- package/distr/Common/ModelPath/ModelPath.js +16 -140
- package/distr/Common/ModelPath/ModelPathBuilder.js +1 -14
- package/distr/Common/ModelPath/ModelPathHelper.js +1 -2
- package/distr/Common/ModelPath/PathMatcher.js +5 -24
- package/distr/Common/ModelPath/PathSplitHelper.js +1 -6
- package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js +1 -10
- package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js +1 -10
- package/distr/Common/ModelPath/Set/ModelPathSet.js +1 -10
- package/distr/Common/ModelPath/Set/Set2.js +1 -16
- package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js +1 -9
- package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js +1 -1
- package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js +1 -3
- package/distr/Common/NidusClient/Fakes/FakeNidusClient.js +1 -17
- package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js +1 -30
- package/distr/Common/NidusClient/INidusClient.js +1 -3
- package/distr/Common/NidusClient/NidusClientContext.js +1 -14
- package/distr/Common/NidusClient/NidusClientImpl.js +1 -18
- package/distr/Common/PathConstants.js +1 -3
- package/distr/Common/StringArrayKey.js +1 -8
- package/distr/Common/TypingUtils.js +7 -26
- package/distr/Common/UUID.js +1 -4
- package/distr/Common/UseAsyncEffect.js +3 -7
- package/distr/Common/UseShowOnce.js +1 -17
- package/distr/Common/UseTypedSelector.js +1 -3
- package/distr/Common/getRngSchemaFilename.js +21 -0
- package/distr/Common/hashUtils.js +1 -4
- package/distr/Tools/src/BuildTasks/ClientJS/BuildClientJsTask.js +1 -23
- package/distr/Tools/src/BuildTasks/ClientJS/IsWebpack5.js +3 -10
- package/distr/Tools/src/BuildTasks/Engine/AcquireFormEngine.js +1 -10
- package/distr/Tools/src/BuildTasks/Engine/AcquirePublishedEngineTask.js +5 -23
- package/distr/Tools/src/BuildTasks/Engine/BuildLocalEngineTask.js +1 -27
- package/distr/Tools/src/BuildTasks/Engine/EngineSource.js +1 -2
- package/distr/Tools/src/BuildTasks/EngineStructureUtils.js +3 -10
- package/distr/Tools/src/BuildTasks/EngineVersionUtils.js +1 -9
- package/distr/Tools/src/BuildTasks/FSTask.js +1 -19
- package/distr/Tools/src/BuildTasks/Form/CompileForm.js +1 -19
- package/distr/Tools/src/BuildTasks/Form/GenerateForm.js +1 -16
- package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js +1 -11
- package/distr/Tools/src/BuildTasks/Form/WriteAttachmentPathFiles.js +1 -10
- package/distr/Tools/src/BuildTasks/Form/WriteFLangNormalizationFiles.js +1 -10
- package/distr/Tools/src/BuildTasks/Generator/AcquireFormGenerator.js +1 -10
- package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js +5 -26
- package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js +1 -38
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js +2 -42
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js +4 -39
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ProcessSugarWorker.js +4 -7
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js +4 -10
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js +9 -17
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js +3 -5
- package/distr/Tools/src/BuildTasks/ProcessUtils/ProcessUtils.js +1 -13
- package/distr/Tools/src/BuildTasks/ProcessUtils/ShellProcessHandle.js +1 -20
- package/distr/Tools/src/BuildTasks/PublishedVersionUtils.js +3 -48
- package/distr/Tools/src/BuildTasks/ReadFormSource.js +7 -32
- package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +5 -32
- package/distr/Tools/src/BuildTasks/Version.js +1 -10
- package/distr/Tools/src/BuildTasks/WriteFormMeta.js +1 -10
- package/distr/Tools/src/CLICommands/BuildForms/BuildCacheMode.js +5 -9
- package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +1 -5
- package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js +34 -70
- package/distr/Tools/src/CLICommands/BuildServer/BuildLogsWebsocketController.js +1 -12
- package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +1 -5
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesController.js +1 -67
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js +3 -28
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +3 -41
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsController.js +3 -23
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsFromResourcesController.js +3 -20
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +1 -23
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerLocalSourcesEngineController.js +1 -37
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPrebuiltResourcesController.js +1 -13
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPublishedEngineController.js +1 -40
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +8 -49
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ClientJsDevServer.js +1 -13
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/EngineDevServer.js +1 -17
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ReportGeneratorErrorToPageBody.js +1 -4
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js +10 -19
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorker.js +12 -26
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorkerFactory.js +1 -5
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IInputFileSystem.js +1 -1
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IWatchFileSystem.js +1 -1
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/WebpackHybridFileSystem.js +10 -44
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/FarmDirectory.js +1 -17
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/GlobToRegexp.js +1 -5
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/IGeneratedServerSideSourcesProvider.js +1 -1
- package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js +1 -27
- package/distr/Tools/src/CLICommands/BuildServer/StdStreamsIntercepter.js +11 -16
- package/distr/Tools/src/CLICommands/CommonOptions/BuildDebugOnlyOption.js +1 -1
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptionDefintions.js +1 -1
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptions.js +1 -1
- package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js +1 -4
- package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js +23 -34
- package/distr/Tools/src/CLICommands/FormStats/FormStatsOptions.js +1 -4
- package/distr/Tools/src/CLICommands/FormStats/RunFormStats.js +1 -15
- package/distr/Tools/src/CLICommands/FormsHelper/FormsHelperController.js +3 -19
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/autocalc/{gfv}.calc.js +1 -2
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/helpers/setKppValue.js +1 -2
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/browser/Smoke.test.js +1 -6
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/ui/DemoTest.test.js +1 -11
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/validations/kppValue.js +3 -4
- package/distr/Tools/src/CLICommands/InitForm/InitFormOptions.js +1 -4
- package/distr/Tools/src/CLICommands/InitForm/RunInitForm.js +1 -23
- package/distr/Tools/src/CLICommands/Localization/LocalizationOptions.js +1 -4
- package/distr/Tools/src/CLICommands/Localization/RunLocalization.js +7 -23
- package/distr/Tools/src/CLICommands/RenameFiles/RenameFilesOptions.js +26 -0
- package/distr/Tools/src/CLICommands/RenameFiles/RunRenameFiles.js +48 -0
- package/distr/Tools/src/CLICommands/UpgradeForm/RunUpgradeForm.js +1 -37
- package/distr/Tools/src/CLICommands/UpgradeForm/UpgradeFormOptions.js +1 -4
- package/distr/Tools/src/CandyCLI.js +7 -56
- package/distr/Tools/src/CheckNodeJsVersion.js +3 -10
- package/distr/Tools/src/Commons/ApiClient/ToolsApiClient.js +1 -10
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplication.js +4 -29
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplicationContext.js +1 -6
- package/distr/Tools/src/Commons/ErrorUntyped.js +1 -1
- package/distr/Tools/src/Commons/EventObject.js +10 -20
- package/distr/Tools/src/Commons/ExecUtils.js +3 -9
- package/distr/Tools/src/Commons/ExtractGfvsFromFileName.js +1 -7
- package/distr/Tools/src/Commons/FormGlobsUtils.js +1 -33
- package/distr/Tools/src/Commons/FsUtils.js +1 -12
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Actions.js +1 -8
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Methods.js +4 -15
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/NotFoundWebError.js +1 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/CookieParamParamBinder.js +1 -5
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/IParamBinder.js +1 -1
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/JsonBodyParamBinder.js +1 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/StringBodyParamBinder.js +1 -5
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlParamBinder.js +2 -5
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlQueryParamBinder.js +1 -5
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Params.js +1 -14
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomActionResultHandler.js +1 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomContentResultHandler.js +1 -5
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/EmptyResultHandler.js +1 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/HtmlResultHandler.js +1 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/IResultHandler.js +1 -1
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/JsonResultHandler.js +1 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/PlainTextResultHandler.js +1 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/StreamResultHandler.js +1 -36
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results.js +1 -9
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/ExpressServerWrapper.js +5 -35
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/SingletonController.js +9 -11
- package/distr/Tools/src/Commons/Locks/Lock.js +1 -8
- package/distr/Tools/src/Commons/Locks/LockHandle.js +1 -5
- package/distr/Tools/src/Commons/Locks/ReadWriteLockCollection.js +1 -9
- package/distr/Tools/src/Commons/Logging/ELKLogger.js +17 -22
- package/distr/Tools/src/Commons/Logging/ILogger.js +1 -5
- package/distr/Tools/src/Commons/Logging/InMemoryLogger.js +3 -21
- package/distr/Tools/src/Commons/Logging/Logger.js +9 -29
- package/distr/Tools/src/Commons/Logging/StaticLogger.js +11 -15
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.d.js +1 -1
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js +3 -37
- package/distr/Tools/src/Commons/PathPattern.js +1 -13
- package/distr/Tools/src/Commons/TasksCore/AggregatedError.js +1 -4
- package/distr/Tools/src/Commons/TasksCore/BuildTask.js +1 -1
- package/distr/Tools/src/Commons/TasksCore/ChainableValueProducer.js +13 -200
- package/distr/Tools/src/Commons/TasksCore/DirectoryEntriesProducer.js +1 -20
- package/distr/Tools/src/Commons/TasksCore/EmptyProducer.js +7 -10
- package/distr/Tools/src/Commons/TasksCore/FileSystemEntriesProducer.js +1 -15
- package/distr/Tools/src/Commons/TasksCore/FileValueProducer.js +1 -15
- package/distr/Tools/src/Commons/TasksCore/Observe.js +1 -13
- package/distr/Tools/src/Commons/TasksCore/SingleValueProducer.js +5 -11
- package/distr/Tools/src/Commons/TimingUtils.js +1 -2
- package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js +13 -51
- package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js +4 -14
- package/distr/Tools/src/GenerateReadMe.js +1 -13
- package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +1 -1
- package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js.LICENSE.txt +10 -1
- package/distr/Tools/src/LocalServerFrontEndDist/index.js +1 -1
- package/distr/Tools/src/LocalServerFrontEndDist/index.js.LICENSE.txt +10 -1
- package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
- package/distr/Tools/src/Options/CandyToolOptions.js +3 -11
- package/distr/Tools/src/ReadFarmConfig.js +1 -5
- package/distr/Tools/src/SelfUpdate.js +4 -28
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +1506 -1257
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.LICENSE.txt +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -1
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +843 -623
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.LICENSE.txt +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -1
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/jquery-1.11.3.min.js +777 -1117
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/polyfill.min.js +1665 -2015
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/testing.min.js +9 -55
- package/distr/Tools/src/StaticFilesForResourcesDir/jquery-1.11.3.min.js +777 -1117
- package/distr/Tools/src/StaticFilesForResourcesDir/polyfill.min.js +1665 -2015
- package/distr/Tools/src/StaticFilesForResourcesDir/testing.min.js +9 -55
- package/package.json +10 -10
- /package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/schemas/{{gfv}.rng.xml → {gfv}.0.rng.xml} +0 -0
|
@@ -12,40 +12,31 @@ exports.iterateKeys = iterateKeys;
|
|
|
12
12
|
exports.iterateValues = iterateValues;
|
|
13
13
|
exports.reverseArray = reverseArray;
|
|
14
14
|
exports.toAsyncIterator = toAsyncIterator;
|
|
15
|
-
|
|
16
15
|
var _TypingUtils = require("./TypingUtils");
|
|
17
|
-
|
|
18
16
|
var _Errors = require("./Errors");
|
|
19
|
-
|
|
20
17
|
function* reverseArray(array) {
|
|
21
18
|
for (let i = array.length - 1; i >= 0; i--) {
|
|
22
19
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
23
20
|
yield array[i];
|
|
24
21
|
}
|
|
25
22
|
}
|
|
26
|
-
|
|
27
23
|
function toAsyncIterator(generator) {
|
|
28
24
|
return AsyncIterator.from(generator());
|
|
29
25
|
}
|
|
30
|
-
|
|
31
26
|
function findLast(items, condition) {
|
|
32
27
|
let result;
|
|
33
|
-
|
|
34
28
|
for (const item of items) {
|
|
35
29
|
if (condition(item)) {
|
|
36
30
|
result = item;
|
|
37
31
|
}
|
|
38
32
|
}
|
|
39
|
-
|
|
40
33
|
return result;
|
|
41
34
|
}
|
|
42
|
-
|
|
43
35
|
function* concat(...iterables) {
|
|
44
36
|
for (const iterableItem of iterables) {
|
|
45
37
|
yield* iterableItem;
|
|
46
38
|
}
|
|
47
39
|
}
|
|
48
|
-
|
|
49
40
|
function* iterateValues(obj) {
|
|
50
41
|
for (const key in obj) {
|
|
51
42
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
@@ -53,7 +44,6 @@ function* iterateValues(obj) {
|
|
|
53
44
|
}
|
|
54
45
|
}
|
|
55
46
|
}
|
|
56
|
-
|
|
57
47
|
function* iterateKeys(obj) {
|
|
58
48
|
for (const key in obj) {
|
|
59
49
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
@@ -61,7 +51,6 @@ function* iterateKeys(obj) {
|
|
|
61
51
|
}
|
|
62
52
|
}
|
|
63
53
|
}
|
|
64
|
-
|
|
65
54
|
function* iterateEntries(obj) {
|
|
66
55
|
for (const key in obj) {
|
|
67
56
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
@@ -70,52 +59,40 @@ function* iterateEntries(obj) {
|
|
|
70
59
|
}
|
|
71
60
|
}
|
|
72
61
|
}
|
|
73
|
-
|
|
74
62
|
function count(items) {
|
|
75
63
|
let result = 0;
|
|
76
|
-
|
|
77
64
|
for (const _item of items) {
|
|
78
65
|
result++;
|
|
79
66
|
}
|
|
80
|
-
|
|
81
67
|
return result;
|
|
82
68
|
}
|
|
83
|
-
|
|
84
69
|
const EmptySingleElement = Symbol.for("EmptySingleElement");
|
|
85
70
|
const NoValueMarker = Symbol.for("NoValueMarker");
|
|
86
|
-
|
|
87
71
|
class IterUtils {
|
|
88
72
|
static isEmpty(iterable) {
|
|
89
73
|
for (const _item of iterable) {
|
|
90
74
|
return false;
|
|
91
75
|
}
|
|
92
|
-
|
|
93
76
|
return true;
|
|
94
77
|
}
|
|
95
|
-
|
|
96
78
|
static groupBy(iterable, selectKey) {
|
|
97
79
|
const result = new Map();
|
|
98
|
-
|
|
99
80
|
for (const item of iterable) {
|
|
100
81
|
const key = selectKey(item);
|
|
101
82
|
const keyList = result.get(key);
|
|
102
|
-
|
|
103
83
|
if (keyList == undefined) {
|
|
104
84
|
result.set(key, [item]);
|
|
105
85
|
} else {
|
|
106
86
|
keyList.push(item);
|
|
107
87
|
}
|
|
108
88
|
}
|
|
109
|
-
|
|
110
89
|
return result;
|
|
111
90
|
}
|
|
112
|
-
|
|
113
91
|
static sortBy(items, selector) {
|
|
114
92
|
const result = [...items];
|
|
115
93
|
result.sort((aItem, bItem) => {
|
|
116
94
|
const leftValue = selector(aItem);
|
|
117
95
|
const rightValue = selector(bItem);
|
|
118
|
-
|
|
119
96
|
if (leftValue === rightValue) {
|
|
120
97
|
return 0;
|
|
121
98
|
} else if (leftValue < rightValue) {
|
|
@@ -126,98 +103,75 @@ class IterUtils {
|
|
|
126
103
|
});
|
|
127
104
|
return result;
|
|
128
105
|
}
|
|
129
|
-
|
|
130
106
|
static last(items) {
|
|
131
107
|
if (Array.isArray(items)) {
|
|
132
108
|
return items[items.length - 1];
|
|
133
109
|
}
|
|
134
|
-
|
|
135
110
|
let lastItem;
|
|
136
|
-
|
|
137
111
|
for (const item of items) {
|
|
138
112
|
lastItem = item;
|
|
139
113
|
}
|
|
140
|
-
|
|
141
114
|
return lastItem;
|
|
142
115
|
}
|
|
143
|
-
|
|
144
116
|
static first(items) {
|
|
145
117
|
if (Array.isArray(items)) {
|
|
146
118
|
return items[0];
|
|
147
119
|
}
|
|
148
|
-
|
|
149
120
|
let firstItem;
|
|
150
|
-
|
|
151
121
|
for (const item of items) {
|
|
152
122
|
firstItem = item;
|
|
153
123
|
break;
|
|
154
124
|
}
|
|
155
|
-
|
|
156
125
|
return firstItem;
|
|
157
126
|
}
|
|
158
|
-
|
|
159
127
|
static single(items, singleAssertMessage) {
|
|
160
128
|
if (Array.isArray(items)) {
|
|
161
129
|
var _items$;
|
|
162
|
-
|
|
163
130
|
if (items.length !== 1) {
|
|
164
131
|
throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : `Sequence must contain exactly single element, but got ${items.length}`);
|
|
165
132
|
}
|
|
166
|
-
|
|
167
133
|
return (_items$ = items[0]) !== null && _items$ !== void 0 ? _items$ : (0, _TypingUtils.reject)();
|
|
168
134
|
} else {
|
|
169
135
|
let singleElement = EmptySingleElement;
|
|
170
|
-
|
|
171
136
|
for (const item of items) {
|
|
172
137
|
if (singleElement !== EmptySingleElement) {
|
|
173
138
|
throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : `Sequence must contain exactly single element, but got at least 2`);
|
|
174
139
|
}
|
|
175
|
-
|
|
176
140
|
singleElement = item;
|
|
177
141
|
}
|
|
178
|
-
|
|
179
142
|
if (singleElement === EmptySingleElement) {
|
|
180
143
|
throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : "Sequence must contain exactly single element, but got 0");
|
|
181
144
|
}
|
|
182
|
-
|
|
183
145
|
return singleElement;
|
|
184
146
|
}
|
|
185
147
|
}
|
|
186
|
-
|
|
187
148
|
static *iterateEntries(items) {
|
|
188
149
|
let index = 0;
|
|
189
|
-
|
|
190
150
|
for (const item of items) {
|
|
191
151
|
yield [index, item];
|
|
192
152
|
index++;
|
|
193
153
|
}
|
|
194
154
|
}
|
|
195
|
-
|
|
196
155
|
static *skipLast(items, skipCount) {
|
|
197
156
|
if (skipCount === 0) {
|
|
198
157
|
yield* items;
|
|
199
158
|
return;
|
|
200
159
|
}
|
|
201
|
-
|
|
202
160
|
const prevItems = new Array(skipCount).fill(EmptySingleElement);
|
|
203
161
|
let resultItem = EmptySingleElement;
|
|
204
162
|
let currentIndex = 0;
|
|
205
|
-
|
|
206
163
|
for (const item of items) {
|
|
207
164
|
// @ts-expect-error В общем, строка выше гарантирует длину массива
|
|
208
165
|
resultItem = prevItems[currentIndex];
|
|
209
166
|
prevItems[currentIndex] = item;
|
|
210
167
|
currentIndex = (currentIndex + 1) % skipCount;
|
|
211
|
-
|
|
212
168
|
if (resultItem != EmptySingleElement) {
|
|
213
169
|
yield resultItem;
|
|
214
170
|
}
|
|
215
171
|
}
|
|
216
172
|
}
|
|
217
|
-
|
|
218
173
|
static minBy(items, compareFunc) {
|
|
219
174
|
let minValue = NoValueMarker;
|
|
220
|
-
|
|
221
175
|
for (const item of items) {
|
|
222
176
|
if (minValue === NoValueMarker) {
|
|
223
177
|
minValue = item;
|
|
@@ -225,17 +179,13 @@ class IterUtils {
|
|
|
225
179
|
minValue = item;
|
|
226
180
|
}
|
|
227
181
|
}
|
|
228
|
-
|
|
229
182
|
if (minValue === NoValueMarker) {
|
|
230
183
|
throw new _Errors.InvalidArgumentError("items", "Items should be not empty list");
|
|
231
184
|
}
|
|
232
|
-
|
|
233
185
|
return minValue;
|
|
234
186
|
}
|
|
235
|
-
|
|
236
187
|
static minByOrUndefined(items, compareFunc) {
|
|
237
188
|
let minValue = NoValueMarker;
|
|
238
|
-
|
|
239
189
|
for (const item of items) {
|
|
240
190
|
if (minValue === NoValueMarker) {
|
|
241
191
|
minValue = item;
|
|
@@ -243,57 +193,46 @@ class IterUtils {
|
|
|
243
193
|
minValue = item;
|
|
244
194
|
}
|
|
245
195
|
}
|
|
246
|
-
|
|
247
196
|
if (minValue === NoValueMarker) {
|
|
248
197
|
return undefined;
|
|
249
198
|
}
|
|
250
|
-
|
|
251
199
|
return minValue;
|
|
252
200
|
}
|
|
253
|
-
|
|
254
201
|
static *range(inStartOrCount, inItemCount) {
|
|
255
202
|
const start = inItemCount === undefined ? 0 : inStartOrCount;
|
|
256
203
|
const itemCount = inItemCount === undefined ? inStartOrCount : inItemCount;
|
|
257
|
-
|
|
258
204
|
if (itemCount < 0) {
|
|
259
205
|
throw new _Errors.InvalidArgumentError("itemCount", "itemCount must be a non negative number");
|
|
260
206
|
}
|
|
261
|
-
|
|
262
207
|
for (let i = start; i < start + itemCount; i++) {
|
|
263
208
|
yield i;
|
|
264
209
|
}
|
|
265
210
|
}
|
|
211
|
+
|
|
266
212
|
/**
|
|
267
213
|
* @summary Вставляет между элементами массива заданный элемент и возвращает новый массив
|
|
268
214
|
*/
|
|
269
|
-
|
|
270
|
-
|
|
271
215
|
static intersperse(items, item) {
|
|
272
216
|
return this.intersperseFn(items, () => item);
|
|
273
217
|
}
|
|
218
|
+
|
|
274
219
|
/**
|
|
275
220
|
* @summary Вставляет между элементами массива элемент, создаваемый функцией, и возвращает новый массив
|
|
276
221
|
*/
|
|
277
|
-
|
|
278
|
-
|
|
279
222
|
static intersperseFn(items, item) {
|
|
280
223
|
return items.flatMap((x, index) => index === 0 ? [x] : [item(x, index), x]);
|
|
281
224
|
}
|
|
282
|
-
|
|
283
225
|
static *zip(...iterables) {
|
|
284
226
|
const iterators = iterables.map(it => Iterator.from(it));
|
|
285
227
|
let hasUndoneIterators = true;
|
|
286
|
-
|
|
287
228
|
while (hasUndoneIterators) {
|
|
288
229
|
const resultEntry = [];
|
|
289
230
|
hasUndoneIterators = false;
|
|
290
|
-
|
|
291
231
|
for (const [i, iterator] of this.iterateEntries(iterators)) {
|
|
292
232
|
if (iterator === NoValueMarker) {
|
|
293
233
|
resultEntry.push(undefined);
|
|
294
234
|
} else {
|
|
295
235
|
const resultValue = iterator.next();
|
|
296
|
-
|
|
297
236
|
if (resultValue.done) {
|
|
298
237
|
resultEntry.push(undefined);
|
|
299
238
|
iterators[i] = NoValueMarker;
|
|
@@ -303,42 +242,33 @@ class IterUtils {
|
|
|
303
242
|
}
|
|
304
243
|
}
|
|
305
244
|
}
|
|
306
|
-
|
|
307
245
|
if (hasUndoneIterators) {
|
|
308
246
|
yield resultEntry;
|
|
309
247
|
}
|
|
310
248
|
}
|
|
311
249
|
}
|
|
312
|
-
|
|
313
250
|
static *distinctBy(items, idSelector) {
|
|
314
251
|
const set = new Set();
|
|
315
|
-
|
|
316
252
|
for (const item of items) {
|
|
317
253
|
const id = idSelector(item);
|
|
318
|
-
|
|
319
254
|
if (!set.has(id)) {
|
|
320
255
|
set.add(id);
|
|
321
256
|
yield item;
|
|
322
257
|
}
|
|
323
258
|
}
|
|
324
259
|
}
|
|
325
|
-
|
|
326
260
|
static reduce(items, reducer, initialValue) {
|
|
327
261
|
let index = 0;
|
|
328
262
|
return Iterator.from(items).reduce((acc, item) => reducer(acc, item, index++), initialValue);
|
|
329
263
|
}
|
|
330
|
-
|
|
331
264
|
static *batch(items, batchSize) {
|
|
332
265
|
const iterator = Iterator.from(items);
|
|
333
266
|
const safeBatchSize = batchSize > 0 ? batchSize : 1;
|
|
334
267
|
let done = false;
|
|
335
|
-
|
|
336
268
|
while (!done) {
|
|
337
269
|
const batch = [];
|
|
338
|
-
|
|
339
270
|
while (batch.length < safeBatchSize) {
|
|
340
271
|
const current = iterator.next();
|
|
341
|
-
|
|
342
272
|
if (current.done) {
|
|
343
273
|
done = true;
|
|
344
274
|
break;
|
|
@@ -346,16 +276,13 @@ class IterUtils {
|
|
|
346
276
|
batch.push(current.value);
|
|
347
277
|
}
|
|
348
278
|
}
|
|
349
|
-
|
|
350
279
|
if (batch.length > 0) {
|
|
351
280
|
yield batch;
|
|
352
281
|
}
|
|
353
282
|
}
|
|
354
283
|
}
|
|
355
|
-
|
|
356
284
|
}
|
|
357
|
-
|
|
358
285
|
exports.IterUtils = IterUtils;
|
|
359
286
|
IterUtils.count = count;
|
|
360
287
|
IterUtils.concat = concat;
|
|
361
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JdGVyYWJsZVV0aWxzLnRzIl0sIm5hbWVzIjpbInJldmVyc2VBcnJheSIsImFycmF5IiwiaSIsImxlbmd0aCIsInRvQXN5bmNJdGVyYXRvciIsImdlbmVyYXRvciIsIkFzeW5jSXRlcmF0b3IiLCJmcm9tIiwiZmluZExhc3QiLCJpdGVtcyIsImNvbmRpdGlvbiIsInJlc3VsdCIsIml0ZW0iLCJjb25jYXQiLCJpdGVyYWJsZXMiLCJpdGVyYWJsZUl0ZW0iLCJpdGVyYXRlVmFsdWVzIiwib2JqIiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXRlcmF0ZUtleXMiLCJpdGVyYXRlRW50cmllcyIsImNvdW50IiwiX2l0ZW0iLCJFbXB0eVNpbmdsZUVsZW1lbnQiLCJTeW1ib2wiLCJmb3IiLCJOb1ZhbHVlTWFya2VyIiwiSXRlclV0aWxzIiwiaXNFbXB0eSIsIml0ZXJhYmxlIiwiZ3JvdXBCeSIsInNlbGVjdEtleSIsIk1hcCIsImtleUxpc3QiLCJnZXQiLCJ1bmRlZmluZWQiLCJzZXQiLCJwdXNoIiwic29ydEJ5Iiwic2VsZWN0b3IiLCJzb3J0IiwiYUl0ZW0iLCJiSXRlbSIsImxlZnRWYWx1ZSIsInJpZ2h0VmFsdWUiLCJsYXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibGFzdEl0ZW0iLCJmaXJzdCIsImZpcnN0SXRlbSIsInNpbmdsZSIsInNpbmdsZUFzc2VydE1lc3NhZ2UiLCJFcnJvciIsInNpbmdsZUVsZW1lbnQiLCJpbmRleCIsInNraXBMYXN0Iiwic2tpcENvdW50IiwicHJldkl0ZW1zIiwiZmlsbCIsInJlc3VsdEl0ZW0iLCJjdXJyZW50SW5kZXgiLCJtaW5CeSIsImNvbXBhcmVGdW5jIiwibWluVmFsdWUiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1pbkJ5T3JVbmRlZmluZWQiLCJyYW5nZSIsImluU3RhcnRPckNvdW50IiwiaW5JdGVtQ291bnQiLCJzdGFydCIsIml0ZW1Db3VudCIsImludGVyc3BlcnNlIiwiaW50ZXJzcGVyc2VGbiIsImZsYXRNYXAiLCJ4IiwiemlwIiwiaXRlcmF0b3JzIiwibWFwIiwiaXQiLCJJdGVyYXRvciIsImhhc1VuZG9uZUl0ZXJhdG9ycyIsInJlc3VsdEVudHJ5IiwiaXRlcmF0b3IiLCJyZXN1bHRWYWx1ZSIsIm5leHQiLCJkb25lIiwidmFsdWUiLCJkaXN0aW5jdEJ5IiwiaWRTZWxlY3RvciIsIlNldCIsImlkIiwiaGFzIiwiYWRkIiwicmVkdWNlIiwicmVkdWNlciIsImluaXRpYWxWYWx1ZSIsImFjYyIsImJhdGNoIiwiYmF0Y2hTaXplIiwic2FmZUJhdGNoU2l6ZSIsImN1cnJlbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQUVPLFVBQVVBLFlBQVYsQ0FBMEJDLEtBQTFCLEVBQW9FO0FBQ3ZFLE9BQUssSUFBSUMsQ0FBQyxHQUFHRCxLQUFLLENBQUNFLE1BQU4sR0FBZSxDQUE1QixFQUErQkQsQ0FBQyxJQUFJLENBQXBDLEVBQXVDQSxDQUFDLEVBQXhDLEVBQTRDO0FBQ3hDO0FBQ0EsVUFBTUQsS0FBSyxDQUFDQyxDQUFELENBQVg7QUFDSDtBQUNKOztBQUVNLFNBQVNFLGVBQVQsQ0FBNEJDLFNBQTVCLEVBQTBGO0FBQzdGLFNBQU9DLGFBQWEsQ0FBQ0MsSUFBZCxDQUFtQkYsU0FBUyxFQUE1QixDQUFQO0FBQ0g7O0FBRU0sU0FBU0csUUFBVCxDQUFxQkMsS0FBckIsRUFBeUNDLFNBQXpDLEVBQXlGO0FBQzVGLE1BQUlDLE1BQUo7O0FBQ0EsT0FBSyxNQUFNQyxJQUFYLElBQW1CSCxLQUFuQixFQUEwQjtBQUN0QixRQUFJQyxTQUFTLENBQUNFLElBQUQsQ0FBYixFQUFxQjtBQUNqQkQsTUFBQUEsTUFBTSxHQUFHQyxJQUFUO0FBQ0g7QUFDSjs7QUFDRCxTQUFPRCxNQUFQO0FBQ0g7O0FBRU0sVUFBVUUsTUFBVixDQUFvQixHQUFHQyxTQUF2QixFQUEyRTtBQUM5RSxPQUFLLE1BQU1DLFlBQVgsSUFBMkJE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QUFJLEdBQUcsSUFBUDtBQUNBO0FBQ0gsU0FIRCxNQUdPO0FBQ0hZLFVBQUFBLEtBQUssQ0FBQzdELElBQU4sQ0FBV2dFLE9BQU8sQ0FBQ2QsS0FBbkI7QUFDSDtBQUNKOztBQUNELFVBQUlXLEtBQUssQ0FBQ25HLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNsQixjQUFNbUcsS0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUF2UGtCOzs7QUFBVnZFLFMsQ0FDS04sSyxHQUFRQSxLO0FBRGJNLFMsQ0FFS2xCLE0sR0FBU0EsTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbkxlbmd0aEFycmF5LCByZWplY3QgfSBmcm9tIFwiLi9UeXBpbmdVdGlsc1wiO1xuaW1wb3J0IHsgQ29tcGFyZUZ1bmMgfSBmcm9tIFwiLi9Db21wYXJlcnNcIjtcbmltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gZnJvbSBcIi4vRXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiogcmV2ZXJzZUFycmF5PFQ+KGFycmF5OiByZWFkb25seSBUW10pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgeWllbGQgYXJyYXlbaV0hO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXN5bmNJdGVyYXRvcjxUPihnZW5lcmF0b3I6ICgpID0+IEFzeW5jR2VuZXJhdG9yPFQ+KTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gQXN5bmNJdGVyYXRvci5mcm9tKGdlbmVyYXRvcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgY29uZGl0aW9uOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IFQgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24oaXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBjb25jYXQ8VD4oLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTxUPj4pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhYmxlSXRlbSBvZiBpdGVyYWJsZXMpIHtcbiAgICAgICAgeWllbGQqIGl0ZXJhYmxlSXRlbTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZVZhbHVlczxUSyBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlciwgVFY+KG9iajogeyBba2V5IGluIFRLXTogVFYgfSk6IEl0ZXJhYmxlPFRWPiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICB5aWVsZCBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPEV4dHJhY3Q8a2V5b2YgVE8sIHN0cmluZz4+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRWPihvYmo6IFJlYWRvbmx5PHsgW2tleTogc3RyaW5nXTogVFYgfT4pOiBJdGVyYWJsZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzKG9iajogUmVhZG9ubHk8e30+KTogSXRlcmFibGU8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUtleXM8VEsgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgfCBudW1iZXI+KG9iajogeyBba2V5IGluIFRLXTogdW5rbm93biB9KTogSXRlcmFibGU8VEs+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIHlpZWxkIGtleTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPFtFeHRyYWN0PGtleW9mIFRPLCBzdHJpbmc+LCBUT1trZXlvZiBUT11dPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllczxUVj4ob2JqOiBSZWFkb25seTx7IFtrZXk6IHN0cmluZ106IFRWIH0+KTogSXRlcmFibGU8W3N0cmluZywgVFZdPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllcyhvYmo6IFJlYWRvbmx5PHt9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIHVua25vd25dPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUVudHJpZXM8VFY+KG9iajogUmVhZG9ubHk8eyBba2V5OiBzdHJpbmddOiBUViB9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIFRWXT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgIHlpZWxkIFtrZXksIG9ialtrZXldIV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudDxUPihpdGVtczogSXRlcmFibGU8VD4pOiBudW1iZXIge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgX2l0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgcmVzdWx0Kys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IEVtcHR5U2luZ2xlRWxlbWVudCA9IFN5bWJvbC5mb3IoXCJFbXB0eVNpbmdsZUVsZW1lbnRcIik7XG5jb25zdCBOb1ZhbHVlTWFya2VyID0gU3ltYm9sLmZvcihcIk5vVmFsdWVNYXJrZXJcIik7XG5cbmV4cG9ydCBjbGFzcyBJdGVyVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgY291bnQgPSBjb3VudDtcbiAgICBwdWJsaWMgc3RhdGljIGNvbmNhdCA9IGNvbmNhdDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFbXB0eTxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBfaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXBCeTxULCBUS2V5PihpdGVyYWJsZTogSXRlcmFibGU8VD4sIHNlbGVjdEtleTogKGl0ZW06IFQpID0+IFRLZXkpOiBNYXA8VEtleSwgVFtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8VEtleSwgVFtdPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHNlbGVjdEtleShpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IGtleUxpc3QgPSByZXN1bHQuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoa2V5TGlzdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgW2l0ZW1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5TGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzb3J0Qnk8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBzZWxlY3RvcjogKGl0ZW06IFQpID0+IHN0cmluZyB8IG51bWJlcik6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5pdGVtc107XG4gICAgICAgIHJlc3VsdC5zb3J0KChhSXRlbSwgYkl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IHNlbGVjdG9yKGFJdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPSBzZWxlY3RvcihiSXRlbSk7XG4gICAgICAgICAgICBpZiAobGVmdFZhbHVlID09PSByaWdodFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRWYWx1ZSA8IHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IE1pbkxlbmd0aEFycmF5PFQsIDE+KTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXN0SXRlbTogVCB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBsYXN0SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IFtULCAuLi51bmtub3duW11dKTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGZpcnN0PFQ+KGl0ZW1zOiBNaW5MZW5ndGhBcnJheTxULCAxPik6IFQ7XG4gICAgcHVibGljIHN0YXRpYyBmaXJzdDxUPihpdGVtczogSXRlcmFibGU8VD4gfCByZWFkb25seSBUW10pOiB1bmRlZmluZWQgfCBUO1xuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zWzBdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaXJzdEl0ZW06IFQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZmlyc3RJdGVtID0gaXRlbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdEl0ZW07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGU8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IEl0ZXJhYmxlPFQ+LCBzaW5nbGVBc3NlcnRNZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBgU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgJHtpdGVtcy5sZW5ndGh9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbXNbMF0gPz8gcmVqZWN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2luZ2xlRWxlbWVudDogVCB8IHR5cGVvZiBFbXB0eVNpbmdsZUVsZW1lbnQgPSBFbXB0eVNpbmdsZUVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlRWxlbWVudCAhPT0gRW1wdHlTaW5nbGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUFzc2VydE1lc3NhZ2UgPz8gYFNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50LCBidXQgZ290IGF0IGxlYXN0IDJgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT09IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzaW5nbGVBc3NlcnRNZXNzYWdlID8/IFwiU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaW5nbGVFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqaXRlcmF0ZUVudHJpZXM8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IFRbXSB8IEl0ZXJhYmxlPFQ+KTogSXRlcmFibGU8W251bWJlciwgVF0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICB5aWVsZCBbaW5kZXgsIGl0ZW1dO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKnNraXBMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgc2tpcENvdW50OiBudW1iZXIpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGlmIChza2lwQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2SXRlbXM6IEFycmF5PFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50PiA9IG5ldyBBcnJheShza2lwQ291bnQpLmZpbGwoRW1wdHlTaW5nbGVFbGVtZW50KTtcbiAgICAgICAgbGV0IHJlc3VsdEl0ZW06IFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50ID0gRW1wdHlTaW5nbGVFbGVtZW50O1xuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yINCSINC+0LHRidC10LwsINGB0YLRgNC+0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCINC00LvQuNC90YMg0LzQsNGB0YHQuNCy0LBcbiAgICAgICAgICAgIHJlc3VsdEl0ZW0gPSBwcmV2SXRlbXNbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHByZXZJdGVtc1tjdXJyZW50SW5kZXhdID0gaXRlbTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHNraXBDb3VudDtcbiAgICAgICAgICAgIGlmIChyZXN1bHRJdGVtICE9IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1pbkJ5PFQ+KGl0ZW1zOiByZWFkb25seSBUW10gfCBUW10gfCBJdGVyYWJsZTxUPiwgY29tcGFyZUZ1bmM6IENvbXBhcmVGdW5jPFQ+KTogVCB7XG4gICAgICAgIGxldCBtaW5WYWx1ZTogdHlwZW9mIE5vVmFsdWVNYXJrZXIgfCBUID0gTm9WYWx1ZU1hcmtlcjtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWluVmFsdWUgPT09IE5vVmFsdWVNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVGdW5jKGl0ZW0sIG1pblZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJpdGVtc1wiLCBcIkl0ZW1zIHNob3VsZCBiZSBub3QgZW1wdHkgbGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtaW5CeU9yVW5kZWZpbmVkPFQ+KFxuICAgICAgICBpdGVtczogcmVhZG9ubHkgVFtdIHwgVFtdIHwgSXRlcmFibGU8VD4sXG4gICAgICAgIGNvbXBhcmVGdW5jOiBDb21wYXJlRnVuYzxUPlxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgbWluVmFsdWU6IHR5cGVvZiBOb1ZhbHVlTWFya2VyIHwgVCA9IE5vVmFsdWVNYXJrZXI7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlRnVuYyhpdGVtLCBtaW5WYWx1ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5WYWx1ZSA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByYW5nZShpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogbnVtYmVyLCBpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyAqcmFuZ2UoaW5TdGFydE9yQ291bnQ6IG51bWJlciwgaW5JdGVtQ291bnQ/OiBudW1iZXIpOiBJdGVyYWJsZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gMCA6IGluU3RhcnRPckNvdW50O1xuICAgICAgICBjb25zdCBpdGVtQ291bnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gaW5TdGFydE9yQ291bnQgOiBpbkl0ZW1Db3VudDtcbiAgICAgICAgaWYgKGl0ZW1Db3VudCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIml0ZW1Db3VudFwiLCBcIml0ZW1Db3VudCBtdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIG51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGl0ZW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkg0JLRgdGC0LDQstC70Y/QtdGCINC80LXQttC00YMg0Y3Qu9C10LzQtdC90YLQsNC80Lgg0LzQsNGB0YHQuNCy0LAg0LfQsNC00LDQvdC90YvQuSDRjdC70LXQvNC10L3RgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LLRi9C5INC80LDRgdGB0LjQslxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJzcGVyc2U8VEksIFRTPihpdGVtczogVElbXSwgaXRlbTogVFMpOiBBcnJheTxUSSB8IFRTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyc3BlcnNlRm4oaXRlbXMsICgpID0+IGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCS0YHRgtCw0LLQu9GP0LXRgiDQvNC10LbQtNGDINGN0LvQtdC80LXQvdGC0LDQvNC4INC80LDRgdGB0LjQstCwINGN0LvQtdC80LXQvdGCLCDRgdC+0LfQtNCw0LLQsNC10LzRi9C5INGE0YPQvdC60YbQuNC10LksINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7QstGL0Lkg0LzQsNGB0YHQuNCyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnRlcnNwZXJzZUZuPFRJLCBUUz4oaXRlbXM6IFRJW10sIGl0ZW06IChuZXh0SXRlbTogVEksIGluZGV4OiBudW1iZXIpID0+IFRTKTogQXJyYXk8VEkgfCBUUz4ge1xuICAgICAgICByZXR1cm4gaXRlbXMuZmxhdE1hcCgoeCwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IFt4XSA6IFtpdGVtKHgsIGluZGV4KSwgeF0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHppcDxUMSwgVDI+KGl0ZW1zMTogSXRlcmFibGU8VDE+LCBpdGVtczI6IEl0ZXJhYmxlPFQyPik6IEl0ZXJhYmxlPFtUMSB8IHVuZGVmaW5lZCwgVDIgfCB1bmRlZmluZWRdPjtcbiAgICBwdWJsaWMgc3RhdGljICp6aXAoLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTx1bmtub3duPj4pOiBJdGVyYWJsZTx1bmtub3duW10+IHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3JzOiBBcnJheTxJdGVyYXRvcjx1bmtub3duPiB8IHR5cGVvZiBOb1ZhbHVlTWFya2VyPiA9IGl0ZXJhYmxlcy5tYXAoaXQgPT4gSXRlcmF0b3IuZnJvbShpdCkpO1xuICAgICAgICBsZXQgaGFzVW5kb25lSXRlcmF0b3JzID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RW50cnkgPSBbXTtcbiAgICAgICAgICAgIGhhc1VuZG9uZUl0ZXJhdG9ycyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgaXRlcmF0b3JdIG9mIHRoaXMuaXRlcmF0ZUVudHJpZXMoaXRlcmF0b3JzKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRWYWx1ZS5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcnNbaV0gPSBOb1ZhbHVlTWFya2VyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RW50cnkucHVzaChyZXN1bHRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmRvbmVJdGVyYXRvcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqZGlzdGluY3RCeTxUPihpdGVtczogSXRlcmFibGU8VD4sIGlkU2VsZWN0b3I6IChpdGVtOiBUKSA9PiBzdHJpbmcpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaWRTZWxlY3RvcihpdGVtKTtcbiAgICAgICAgICAgIGlmICghc2V0LmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBzZXQuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2U8VCwgVT4oXG4gICAgICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICAgICAgcmVkdWNlcjogKGFjY3VtdWxhdG9yOiBVLCBpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFVcbiAgICApOiBVIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIEl0ZXJhdG9yLmZyb20oaXRlbXMpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiByZWR1Y2VyKGFjYywgaXRlbSwgaW5kZXgrKyksIGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqYmF0Y2g8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBiYXRjaFNpemU6IG51bWJlcik6IEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZnJvbShpdGVtcyk7XG4gICAgICAgIGNvbnN0IHNhZmVCYXRjaFNpemUgPSBiYXRjaFNpemUgPiAwID8gYmF0Y2hTaXplIDogMTtcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaDogVFtdID0gW107XG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgc2FmZUJhdGNoU2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGJhdGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
288
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfVHlwaW5nVXRpbHMiLCJyZXF1aXJlIiwiX0Vycm9ycyIsInJldmVyc2VBcnJheSIsImFycmF5IiwiaSIsImxlbmd0aCIsInRvQXN5bmNJdGVyYXRvciIsImdlbmVyYXRvciIsIkFzeW5jSXRlcmF0b3IiLCJmcm9tIiwiZmluZExhc3QiLCJpdGVtcyIsImNvbmRpdGlvbiIsInJlc3VsdCIsIml0ZW0iLCJjb25jYXQiLCJpdGVyYWJsZXMiLCJpdGVyYWJsZUl0ZW0iLCJpdGVyYXRlVmFsdWVzIiwib2JqIiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXRlcmF0ZUtleXMiLCJpdGVyYXRlRW50cmllcyIsImNvdW50IiwiX2l0ZW0iLCJFbXB0eVNpbmdsZUVsZW1lbnQiLCJTeW1ib2wiLCJmb3IiLCJOb1ZhbHVlTWFya2VyIiwiSXRlclV0aWxzIiwiaXNFbXB0eSIsIml0ZXJhYmxlIiwiZ3JvdXBCeSIsInNlbGVjdEtleSIsIk1hcCIsImtleUxpc3QiLCJnZXQiLCJ1bmRlZmluZWQiLCJzZXQiLCJwdXNoIiwic29ydEJ5Iiwic2VsZWN0b3IiLCJzb3J0IiwiYUl0ZW0iLCJiSXRlbSIsImxlZnRWYWx1ZSIsInJpZ2h0VmFsdWUiLCJsYXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibGFzdEl0ZW0iLCJmaXJzdCIsImZpcnN0SXRlbSIsInNpbmdsZSIsInNpbmdsZUFzc2VydE1lc3NhZ2UiLCJfaXRlbXMkIiwiRXJyb3IiLCJyZWplY3QiLCJzaW5nbGVFbGVtZW50IiwiaW5kZXgiLCJza2lwTGFzdCIsInNraXBDb3VudCIsInByZXZJdGVtcyIsImZpbGwiLCJyZXN1bHRJdGVtIiwiY3VycmVudEluZGV4IiwibWluQnkiLCJjb21wYXJlRnVuYyIsIm1pblZhbHVlIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJtaW5CeU9yVW5kZWZpbmVkIiwicmFuZ2UiLCJpblN0YXJ0T3JDb3VudCIsImluSXRlbUNvdW50Iiwic3RhcnQiLCJpdGVtQ291bnQiLCJpbnRlcnNwZXJzZSIsImludGVyc3BlcnNlRm4iLCJmbGF0TWFwIiwieCIsInppcCIsIml0ZXJhdG9ycyIsIm1hcCIsIml0IiwiSXRlcmF0b3IiLCJoYXNVbmRvbmVJdGVyYXRvcnMiLCJyZXN1bHRFbnRyeSIsIml0ZXJhdG9yIiwicmVzdWx0VmFsdWUiLCJuZXh0IiwiZG9uZSIsInZhbHVlIiwiZGlzdGluY3RCeSIsImlkU2VsZWN0b3IiLCJTZXQiLCJpZCIsImhhcyIsImFkZCIsInJlZHVjZSIsInJlZHVjZXIiLCJpbml0aWFsVmFsdWUiLCJhY2MiLCJiYXRjaCIsImJhdGNoU2l6ZSIsInNhZmVCYXRjaFNpemUiLCJjdXJyZW50IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JdGVyYWJsZVV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbkxlbmd0aEFycmF5LCByZWplY3QgfSBmcm9tIFwiLi9UeXBpbmdVdGlsc1wiO1xuaW1wb3J0IHsgQ29tcGFyZUZ1bmMgfSBmcm9tIFwiLi9Db21wYXJlcnNcIjtcbmltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gZnJvbSBcIi4vRXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiogcmV2ZXJzZUFycmF5PFQ+KGFycmF5OiByZWFkb25seSBUW10pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgeWllbGQgYXJyYXlbaV0hO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXN5bmNJdGVyYXRvcjxUPihnZW5lcmF0b3I6ICgpID0+IEFzeW5jR2VuZXJhdG9yPFQ+KTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gQXN5bmNJdGVyYXRvci5mcm9tKGdlbmVyYXRvcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgY29uZGl0aW9uOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IFQgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24oaXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBjb25jYXQ8VD4oLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTxUPj4pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhYmxlSXRlbSBvZiBpdGVyYWJsZXMpIHtcbiAgICAgICAgeWllbGQqIGl0ZXJhYmxlSXRlbTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZVZhbHVlczxUSyBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlciwgVFY+KG9iajogeyBba2V5IGluIFRLXTogVFYgfSk6IEl0ZXJhYmxlPFRWPiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICB5aWVsZCBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPEV4dHJhY3Q8a2V5b2YgVE8sIHN0cmluZz4+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRWPihvYmo6IFJlYWRvbmx5PHsgW2tleTogc3RyaW5nXTogVFYgfT4pOiBJdGVyYWJsZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzKG9iajogUmVhZG9ubHk8e30+KTogSXRlcmFibGU8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUtleXM8VEsgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgfCBudW1iZXI+KG9iajogeyBba2V5IGluIFRLXTogdW5rbm93biB9KTogSXRlcmFibGU8VEs+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIHlpZWxkIGtleTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPFtFeHRyYWN0PGtleW9mIFRPLCBzdHJpbmc+LCBUT1trZXlvZiBUT11dPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllczxUVj4ob2JqOiBSZWFkb25seTx7IFtrZXk6IHN0cmluZ106IFRWIH0+KTogSXRlcmFibGU8W3N0cmluZywgVFZdPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllcyhvYmo6IFJlYWRvbmx5PHt9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIHVua25vd25dPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUVudHJpZXM8VFY+KG9iajogUmVhZG9ubHk8eyBba2V5OiBzdHJpbmddOiBUViB9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIFRWXT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgIHlpZWxkIFtrZXksIG9ialtrZXldIV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudDxUPihpdGVtczogSXRlcmFibGU8VD4pOiBudW1iZXIge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgX2l0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgcmVzdWx0Kys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IEVtcHR5U2luZ2xlRWxlbWVudCA9IFN5bWJvbC5mb3IoXCJFbXB0eVNpbmdsZUVsZW1lbnRcIik7XG5jb25zdCBOb1ZhbHVlTWFya2VyID0gU3ltYm9sLmZvcihcIk5vVmFsdWVNYXJrZXJcIik7XG5cbmV4cG9ydCBjbGFzcyBJdGVyVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgY291bnQgPSBjb3VudDtcbiAgICBwdWJsaWMgc3RhdGljIGNvbmNhdCA9IGNvbmNhdDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFbXB0eTxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBfaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXBCeTxULCBUS2V5PihpdGVyYWJsZTogSXRlcmFibGU8VD4sIHNlbGVjdEtleTogKGl0ZW06IFQpID0+IFRLZXkpOiBNYXA8VEtleSwgVFtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8VEtleSwgVFtdPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHNlbGVjdEtleShpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IGtleUxpc3QgPSByZXN1bHQuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoa2V5TGlzdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgW2l0ZW1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5TGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzb3J0Qnk8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBzZWxlY3RvcjogKGl0ZW06IFQpID0+IHN0cmluZyB8IG51bWJlcik6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5pdGVtc107XG4gICAgICAgIHJlc3VsdC5zb3J0KChhSXRlbSwgYkl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IHNlbGVjdG9yKGFJdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPSBzZWxlY3RvcihiSXRlbSk7XG4gICAgICAgICAgICBpZiAobGVmdFZhbHVlID09PSByaWdodFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRWYWx1ZSA8IHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IE1pbkxlbmd0aEFycmF5PFQsIDE+KTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXN0SXRlbTogVCB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBsYXN0SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IFtULCAuLi51bmtub3duW11dKTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGZpcnN0PFQ+KGl0ZW1zOiBNaW5MZW5ndGhBcnJheTxULCAxPik6IFQ7XG4gICAgcHVibGljIHN0YXRpYyBmaXJzdDxUPihpdGVtczogSXRlcmFibGU8VD4gfCByZWFkb25seSBUW10pOiB1bmRlZmluZWQgfCBUO1xuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zWzBdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaXJzdEl0ZW06IFQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZmlyc3RJdGVtID0gaXRlbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdEl0ZW07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGU8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IEl0ZXJhYmxlPFQ+LCBzaW5nbGVBc3NlcnRNZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBgU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgJHtpdGVtcy5sZW5ndGh9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbXNbMF0gPz8gcmVqZWN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2luZ2xlRWxlbWVudDogVCB8IHR5cGVvZiBFbXB0eVNpbmdsZUVsZW1lbnQgPSBFbXB0eVNpbmdsZUVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlRWxlbWVudCAhPT0gRW1wdHlTaW5nbGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUFzc2VydE1lc3NhZ2UgPz8gYFNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50LCBidXQgZ290IGF0IGxlYXN0IDJgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT09IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzaW5nbGVBc3NlcnRNZXNzYWdlID8/IFwiU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaW5nbGVFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqaXRlcmF0ZUVudHJpZXM8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IFRbXSB8IEl0ZXJhYmxlPFQ+KTogSXRlcmFibGU8W251bWJlciwgVF0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICB5aWVsZCBbaW5kZXgsIGl0ZW1dO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKnNraXBMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgc2tpcENvdW50OiBudW1iZXIpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGlmIChza2lwQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2SXRlbXM6IEFycmF5PFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50PiA9IG5ldyBBcnJheShza2lwQ291bnQpLmZpbGwoRW1wdHlTaW5nbGVFbGVtZW50KTtcbiAgICAgICAgbGV0IHJlc3VsdEl0ZW06IFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50ID0gRW1wdHlTaW5nbGVFbGVtZW50O1xuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yINCSINC+0LHRidC10LwsINGB0YLRgNC+0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCINC00LvQuNC90YMg0LzQsNGB0YHQuNCy0LBcbiAgICAgICAgICAgIHJlc3VsdEl0ZW0gPSBwcmV2SXRlbXNbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHByZXZJdGVtc1tjdXJyZW50SW5kZXhdID0gaXRlbTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHNraXBDb3VudDtcbiAgICAgICAgICAgIGlmIChyZXN1bHRJdGVtICE9IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1pbkJ5PFQ+KGl0ZW1zOiByZWFkb25seSBUW10gfCBUW10gfCBJdGVyYWJsZTxUPiwgY29tcGFyZUZ1bmM6IENvbXBhcmVGdW5jPFQ+KTogVCB7XG4gICAgICAgIGxldCBtaW5WYWx1ZTogdHlwZW9mIE5vVmFsdWVNYXJrZXIgfCBUID0gTm9WYWx1ZU1hcmtlcjtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWluVmFsdWUgPT09IE5vVmFsdWVNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVGdW5jKGl0ZW0sIG1pblZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJpdGVtc1wiLCBcIkl0ZW1zIHNob3VsZCBiZSBub3QgZW1wdHkgbGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtaW5CeU9yVW5kZWZpbmVkPFQ+KFxuICAgICAgICBpdGVtczogcmVhZG9ubHkgVFtdIHwgVFtdIHwgSXRlcmFibGU8VD4sXG4gICAgICAgIGNvbXBhcmVGdW5jOiBDb21wYXJlRnVuYzxUPlxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgbWluVmFsdWU6IHR5cGVvZiBOb1ZhbHVlTWFya2VyIHwgVCA9IE5vVmFsdWVNYXJrZXI7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlRnVuYyhpdGVtLCBtaW5WYWx1ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5WYWx1ZSA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByYW5nZShpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogbnVtYmVyLCBpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyAqcmFuZ2UoaW5TdGFydE9yQ291bnQ6IG51bWJlciwgaW5JdGVtQ291bnQ/OiBudW1iZXIpOiBJdGVyYWJsZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gMCA6IGluU3RhcnRPckNvdW50O1xuICAgICAgICBjb25zdCBpdGVtQ291bnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gaW5TdGFydE9yQ291bnQgOiBpbkl0ZW1Db3VudDtcbiAgICAgICAgaWYgKGl0ZW1Db3VudCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIml0ZW1Db3VudFwiLCBcIml0ZW1Db3VudCBtdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIG51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGl0ZW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkg0JLRgdGC0LDQstC70Y/QtdGCINC80LXQttC00YMg0Y3Qu9C10LzQtdC90YLQsNC80Lgg0LzQsNGB0YHQuNCy0LAg0LfQsNC00LDQvdC90YvQuSDRjdC70LXQvNC10L3RgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LLRi9C5INC80LDRgdGB0LjQslxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJzcGVyc2U8VEksIFRTPihpdGVtczogVElbXSwgaXRlbTogVFMpOiBBcnJheTxUSSB8IFRTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyc3BlcnNlRm4oaXRlbXMsICgpID0+IGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCS0YHRgtCw0LLQu9GP0LXRgiDQvNC10LbQtNGDINGN0LvQtdC80LXQvdGC0LDQvNC4INC80LDRgdGB0LjQstCwINGN0LvQtdC80LXQvdGCLCDRgdC+0LfQtNCw0LLQsNC10LzRi9C5INGE0YPQvdC60YbQuNC10LksINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7QstGL0Lkg0LzQsNGB0YHQuNCyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnRlcnNwZXJzZUZuPFRJLCBUUz4oaXRlbXM6IFRJW10sIGl0ZW06IChuZXh0SXRlbTogVEksIGluZGV4OiBudW1iZXIpID0+IFRTKTogQXJyYXk8VEkgfCBUUz4ge1xuICAgICAgICByZXR1cm4gaXRlbXMuZmxhdE1hcCgoeCwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IFt4XSA6IFtpdGVtKHgsIGluZGV4KSwgeF0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHppcDxUMSwgVDI+KGl0ZW1zMTogSXRlcmFibGU8VDE+LCBpdGVtczI6IEl0ZXJhYmxlPFQyPik6IEl0ZXJhYmxlPFtUMSB8IHVuZGVmaW5lZCwgVDIgfCB1bmRlZmluZWRdPjtcbiAgICBwdWJsaWMgc3RhdGljICp6aXAoLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTx1bmtub3duPj4pOiBJdGVyYWJsZTx1bmtub3duW10+IHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3JzOiBBcnJheTxJdGVyYXRvcjx1bmtub3duPiB8IHR5cGVvZiBOb1ZhbHVlTWFya2VyPiA9IGl0ZXJhYmxlcy5tYXAoaXQgPT4gSXRlcmF0b3IuZnJvbShpdCkpO1xuICAgICAgICBsZXQgaGFzVW5kb25lSXRlcmF0b3JzID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RW50cnkgPSBbXTtcbiAgICAgICAgICAgIGhhc1VuZG9uZUl0ZXJhdG9ycyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgaXRlcmF0b3JdIG9mIHRoaXMuaXRlcmF0ZUVudHJpZXMoaXRlcmF0b3JzKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRWYWx1ZS5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcnNbaV0gPSBOb1ZhbHVlTWFya2VyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RW50cnkucHVzaChyZXN1bHRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmRvbmVJdGVyYXRvcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqZGlzdGluY3RCeTxUPihpdGVtczogSXRlcmFibGU8VD4sIGlkU2VsZWN0b3I6IChpdGVtOiBUKSA9PiBzdHJpbmcpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaWRTZWxlY3RvcihpdGVtKTtcbiAgICAgICAgICAgIGlmICghc2V0LmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBzZXQuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2U8VCwgVT4oXG4gICAgICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICAgICAgcmVkdWNlcjogKGFjY3VtdWxhdG9yOiBVLCBpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFVcbiAgICApOiBVIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIEl0ZXJhdG9yLmZyb20oaXRlbXMpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiByZWR1Y2VyKGFjYywgaXRlbSwgaW5kZXgrKyksIGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqYmF0Y2g8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBiYXRjaFNpemU6IG51bWJlcik6IEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZnJvbShpdGVtcyk7XG4gICAgICAgIGNvbnN0IHNhZmVCYXRjaFNpemUgPSBiYXRjaFNpemUgPiAwID8gYmF0Y2hTaXplIDogMTtcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaDogVFtdID0gW107XG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgc2FmZUJhdGNoU2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGJhdGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxu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
|