diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..46a71479 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ + +# excel add-in, binary +*.xlam binary diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..24528067 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,95 @@ +name: CI + +# What is built here, and what is not +# +# The console and the R-side checks run on every push. Neither native binary +# is built, for different reasons. +# +# The add-in cannot be built at all: XLCALL.H and XLCALL.CPP come from +# Microsoft's Excel XLL SDK and BERT/.gitignore deliberately keeps them out of +# the repository, so BERT64.xll is not buildable from a clean checkout by +# anyone, CI included. +# +# The controller can be built, but not yet here. It was tried, and the attempt +# is worth recording because it found two real faults before it ran out of +# road -- the vcpkg baseline was pinned for the add-in only, so a standalone +# controller build resolved a protobuf incompatible with the checked-in +# generated code; and R_ReadConsole carried R 3.5's signature and compiled +# locally only because a header in the local R tree had been edited by hand. +# Both are fixed. +# +# What the attempt needed, if anyone picks it up again: +# +# r-lib/actions/setup-r@v2 with r-version 4.5.2 (not 'release': R 4.6 +# removed Rf_isFrame and changed the ReadConsole callback signature) +# BertRHome pointed at that R, for its headers; the import libraries are +# checked in, so no .lib generation is needed +# vcpkg integrate install, because hosted runners ship vcpkg unintegrated +# and manifest mode otherwise restores nothing +# /p:PlatformToolset=v143, because the tree targets v145 (VS 2026) and +# hosted runners carry VS 2022 +# +# Where it stops: the link fails with an unresolved __std_rotate out of +# libprotobuf and abseil, which is a C runtime mismatch -- vcpkg resolves +# protobuf:x64-windows (dynamic CRT) on the runner while the project links +# the static CRT. Forcing /p:VcpkgTriplet=x64-windows-static is the obvious +# next thing to try. It was not pursued: with the add-in unbuildable anyway, +# a controller-only build earns less than the time it costs, and the native +# build is exercised locally by Install/build-release.ps1 on every release. + +on: + push: + branches: [master, console-upgrade] + pull_request: + workflow_dispatch: + +jobs: + + console: + name: console (typescript + styles) + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: Console/package-lock.json + + - name: install + working-directory: Console + run: npm ci + + - name: build + working-directory: Console + run: npm run build + + - name: the build produced something + working-directory: Console + shell: pwsh + run: | + $js = Get-ChildItem build -Recurse -Filter *.js -ErrorAction SilentlyContinue + if (-not $js) { throw "no javascript in Console/build" } + if (-not (Test-Path build/style.css)) { throw "no build/style.css" } + "compiled $($js.Count) files, $([math]::Round((Get-Item build/style.css).Length / 1kb)) kB of css" + + r-checks: + name: startup.R on R ${{ matrix.r }} + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + # the oldest R the controller will start against, the version that + # began warning about length-2 conditions, the one that made it an + # error, and current + r: ['3.6.3', '4.2.3', '4.3.3', 'release'] + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.r }} + + - name: startup.R checks + run: Rscript tests/startup-guard.R diff --git a/.github/workflows/modules.yml b/.github/workflows/modules.yml new file mode 100644 index 00000000..82b0a7f4 --- /dev/null +++ b/.github/workflows/modules.yml @@ -0,0 +1,84 @@ +name: graphics modules + +# BERTModule is compiled against R's graphics engine, and R checks that +# version whenever a graphics device is created -- so a module built for one R +# series cannot draw on another, and the install ships one per series. +# +# Building them locally means an R installation and its matching Rtools for +# every series, which is well over a gigabyte of downloads. Runners can do it +# instead: setup-r installs the right Rtools for each version. Each job +# uploads its module as an artifact, and Install/build-release.ps1 -FetchModules +# collects them into Build/module for packaging. + +on: + workflow_dispatch: + push: + paths: + - 'Module/**' + - '.github/workflows/modules.yml' + +jobs: + + module: + name: BERTModule for R ${{ matrix.r }} + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + # one per series BERT supports. old versions are allowed to fail + # without failing the run: the toolchains for them are ancient and + # may not be installable for ever. + r: ['4.6.1', '4.5.2', '4.4.3', '4.3.3', '4.2.3'] + include: + - r: '3.5.3' + optional: true + continue-on-error: ${{ matrix.optional == true }} + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.r }} + # the matching toolchain; setup-r picks rtools by R version + update-rtools: true + + - name: build the module + shell: pwsh + run: | + # the series comes from the matrix, not from asking R: one less + # thing to go wrong before anything has been built + $series = ("${{ matrix.r }}" -split '\.')[0..1] -join '.' + Write-Host "building BERTModule for R $series" + "SERIES=$series" | Out-File -FilePath $env:GITHUB_ENV -Append + + Write-Host "R on this runner:" + & Rscript --vanilla -e "cat(R.version.string)" + + # a module must never be relinked from objects compiled against + # another R. github runs pwsh with ErrorActionPreference=Stop, so + # guard the case where there is nothing to clean. + if (Test-Path Module/src) { + $stale = Get-ChildItem -Path Module/src/* -Include *.o, *.dll -File -ErrorAction Ignore + if ($stale) { $stale | Remove-Item -Force } + } + + New-Item -ItemType Directory -Force "out/$series" | Out-Null + # R.exe, not R: powershell aliases R to Invoke-History, so "& R CMD" + # silently runs the wrong thing + & R.exe CMD INSTALL --library="out/$series" --no-multiarch Module + if ($LASTEXITCODE) { throw "R CMD INSTALL failed for R $series" } + + - name: check what it was built against + shell: pwsh + run: | + $desc = (Get-Content "out/$env:SERIES/BERTModule/DESCRIPTION" | Select-String "^Built:").ToString() + Write-Host $desc + if ($desc -notmatch "R $([regex]::Escape($env:SERIES))") { + throw "module reports '$desc' but should be built for R $env:SERIES" + } + + - uses: actions/upload-artifact@v4 + with: + name: BERTModule-${{ env.SERIES }} + path: out/${{ env.SERIES }} + if-no-files-found: error diff --git a/.gitignore b/.gitignore index 542d4c51..b024a26c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,47 @@ BERTModule_*.gz notes.md yarn-error.log + +# --------------------------------------------------------------------------- +# added on the r4-support branch +# --------------------------------------------------------------------------- + +# vcpkg manifest-mode install trees. these are regenerated from vcpkg.json +# and vcpkg-configuration.json; they run to hundreds of megabytes each. +vcpkg_installed/ + +# R distributions used as build inputs (headers + import libs). these are +# local installs, not part of the source tree. see docs/BUILDING.md. +/R-3.5.0/ +/R-4.5.2/ + +# visual studio per-user and per-machine state +.vs/ +*.vcxproj.user + +# build output directories, all platforms +[Xx]64/ +Win32/ +ARM64/ +ARM64EC/ + +# editor-local settings and scratch notes +.vscode/ + +# local archives and scratch copies +*.7z +Console/generated/variable_pb_new.js +Console/generated/variable_pb_old.js + +# release outputs (Install/build-release.ps1) +Install/BERT-Installer-*.exe +Install/BERT-*.zip +Install/build-log.txt + +# R CMD INSTALL byproducts in the module source +Module/src/*.dll +Module/src/*.o + +# the third-party add-in the optional help feature ships; build-release.ps1 +# downloads and verifies it +Install/ExcelDna.IntelliSense64.xll diff --git a/BERT/.gitignore b/BERT/.gitignore index 866e24b0..40bb80ea 100644 --- a/BERT/.gitignore +++ b/BERT/.gitignore @@ -19,3 +19,6 @@ enc_temp_folder *.exe *.xll +ARM64 +ARM64EC +vcpkg_installed diff --git a/BERT/BERT.sln b/BERT/BERT.sln index 3d2d3556..17c3f899 100644 --- a/BERT/BERT.sln +++ b/BERT/BERT.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27004.2002 +# Visual Studio Version 18 +VisualStudioVersion = 18.1.11312.151 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BERT", "BERT\BERT.vcxproj", "{0CA760D0-16BE-4A7E-A1BF-7296BF699485}" ProjectSection(ProjectDependencies) = postProject @@ -21,44 +21,58 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ControlJulia07", "..\Contro EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64EC = Debug|ARM64EC Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|ARM64EC = Release|ARM64EC Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|ARM64EC.Build.0 = Debug|ARM64EC {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|x64.ActiveCfg = Debug|x64 {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|x64.Build.0 = Debug|x64 {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|x86.ActiveCfg = Debug|Win32 + {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|ARM64EC.Build.0 = Release|ARM64EC {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x64.ActiveCfg = Release|x64 {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x64.Build.0 = Release|x64 {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x86.ActiveCfg = Release|Win32 {0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x86.Build.0 = Release|Win32 + {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|ARM64EC.Build.0 = Debug|ARM64EC {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|x64.ActiveCfg = Debug|x64 {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|x64.Build.0 = Debug|x64 {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|x86.ActiveCfg = Debug|Win32 + {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|ARM64EC.Build.0 = Release|ARM64EC {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|x64.ActiveCfg = Release|x64 {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|x64.Build.0 = Release|x64 {ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|x86.ActiveCfg = Release|Win32 + {3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|ARM64EC.Build.0 = Debug|ARM64EC {3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|x64.ActiveCfg = Debug|x64 {3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|x64.Build.0 = Debug|x64 {3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|x86.ActiveCfg = Debug|Win32 + {3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|ARM64EC.Build.0 = Release|ARM64EC {3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x64.ActiveCfg = Release|x64 {3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x64.Build.0 = Release|x64 {3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x86.ActiveCfg = Release|Win32 {3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x86.Build.0 = Release|Win32 + {3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|x64.ActiveCfg = Debug|x64 - {3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|x64.Build.0 = Debug|x64 {3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|x86.ActiveCfg = Debug|Win32 + {3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|x64.ActiveCfg = Release|x64 - {3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|x64.Build.0 = Release|x64 {3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|x86.ActiveCfg = Release|Win32 + {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x64.ActiveCfg = Debug|x64 - {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x64.Build.0 = Debug|x64 {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x86.ActiveCfg = Debug|Win32 {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x86.Build.0 = Debug|Win32 + {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|x64.ActiveCfg = Release|x64 - {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|x64.Build.0 = Release|x64 {E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|x86.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution diff --git a/BERT/BERT/BERT.vcxproj b/BERT/BERT/BERT.vcxproj index 74166d83..ed92de53 100644 --- a/BERT/BERT/BERT.vcxproj +++ b/BERT/BERT/BERT.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64EC + Debug Win32 + + Release + ARM64EC + Release Win32 @@ -75,32 +83,45 @@ {0CA760D0-16BE-4A7E-A1BF-7296BF699485} Win32Proj BERT - 10.0.16299.0 + 10.0 DynamicLibrary true - v141 + v145 Unicode DynamicLibrary false - v141 + v145 true Unicode DynamicLibrary true - v141 + v145 + Unicode + + + DynamicLibrary + true + v145 Unicode DynamicLibrary false - v141 + v145 + true + Unicode + + + DynamicLibrary + false + v145 true Unicode @@ -118,9 +139,15 @@ + + + + + + true @@ -133,6 +160,12 @@ $(ProjectName)64D $(Platform)\$(Configuration)\$(ProjectName)\ + + $(ProjectName)64D + $(Platform)\$(Configuration)\$(ProjectName)\ + true + .xll + false .xll @@ -147,6 +180,18 @@ $(SolutionDir)..\Build\ $(Platform)\$(Configuration)\$(ProjectName)\ + + $(Platform)\$(Configuration)\$(ProjectName)\ + false + .xll + $(ProjectName)64 + + + true + + x64-windows-static + NotUsing @@ -174,7 +219,29 @@ _DEBUG;BERT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) ..\..\..\protobuf-3.5.0\src;ExcelLib;..\..\PB;..\..\common;include;PB;%(AdditionalIncludeDirectories) true - 4146 + 4146;4251;4267;4018;4244;4141;4996 + stdcpp17 + + + Windows + true + src/BERT.def + libprotobufd.lib;Ws2_32.lib;psapi.lib;Userenv.lib;Iphlpapi.lib;Kernel32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + ..\..\..\protobuf-3.5.0\cmake\build\solution\DebugDLL;%(AdditionalLibraryDirectories) + + + + + NotUsing + Level3 + Disabled + true + _DEBUG;BERT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + ..\..\..\protobuf-3.5.0\src;ExcelLib;..\..\PB;..\..\common;include;PB;%(AdditionalIncludeDirectories) + true + 4146;4251;4267;4018;4244;4141;4996 + stdcpp17 Windows @@ -218,9 +285,35 @@ true true NDEBUG;BERT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - ..\..\..\protobuf-3.5.0\src;ExcelLib;..\..\PB;..\..\common;include;PB;%(AdditionalIncludeDirectories) - 4146 + ExcelLib;..\..\PB;..\..\common;include;PB;%(AdditionalIncludeDirectories) + 4146;4251;4267;4018;4244;4141;4996 + MultiThreaded + stdcpp17 + + + Windows + true + true + true + src/BERT.def + libprotobuf.lib;Ws2_32.lib;psapi.lib;Userenv.lib;Iphlpapi.lib;Kernel32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + ..\..\..\protobuf-3.5.0\cmake\build\solution\Release\x64 + + + + + NotUsing + Level3 + MaxSpeed + true + true + true + NDEBUG;BERT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + ExcelLib;..\..\PB;..\..\common;include;PB;%(AdditionalIncludeDirectories) + 4146;4251;4267;4018;4244;4141;4996 MultiThreaded + stdcpp17 Windows diff --git a/BERT/BERT/include/basic_functions.h b/BERT/BERT/include/basic_functions.h index b9418b30..3197817a 100644 --- a/BERT/BERT/include/basic_functions.h +++ b/BERT/BERT/include/basic_functions.h @@ -36,6 +36,12 @@ static LPWSTR funcTemplates[][16] = { // these are constructed at runtime + // the seventh field is xlfRegister's shortcut key, and it is deliberately + // empty. a shortcut registered there does fire, but excel then looks the + // command up in workbook scope and cannot find it -- "cannot run the + // macro '!BERT.Console'" -- because an xll command lives in the add-in's + // context. the console shortcut is bound with ON.KEY instead, which + // resolves the same way ExecuteExcel4Macro does. see BERT::BindConsoleKey. { L"BERT_Console", L"J", L"BERT.Console", L"", L"2", L"BERT", L"", L"95", L"", L"", L"", L"", L"", L"", L"", L"" }, { L"BERT_ContextSwitch", L"JQ", L"BERT.ContextSwitch", L"", L"2", L"BERT", L"", L"94", L"", L"", L"", L"", L"", L"", L"", L"" }, { L"BERT_UpdateFunctions", L"J", L"BERT.UpdateFunctions", L"", L"2", L"BERT", L"", L"93", L"", L"", L"", L"", L"", L"", L"", L"" }, @@ -44,8 +50,55 @@ static LPWSTR funcTemplates[][16] = { { 0 } }; +/** + * how many arguments a language function can take from a cell. + * + * excel fixes a function's arity when it is registered, and it calls a + * distinct exported entry point per function, so every dispatcher in the + * pool below is compiled with this many parameters whether the function + * behind it wants them or not. unused ones arrive as xltypeMissing and are + * trimmed. that means the cost of raising this is code size in the xll -- + * a couple of hundred bytes per dispatcher -- and nothing else. + * + * excel's own ceiling is 254: the type string handed to xlfRegister is + * capped at 255 characters, one of which is the return type. registration + * also passes one help string per argument, and xlfRegister takes at most + * 255 arguments in total, which is the same bound. + */ +#define BERT_MAX_ARGUMENTS 64 + +/** + * the argument list after the first, in whichever shape is needed. written + * once so the four places that repeat it cannot drift apart. these carry a + * leading comma, so input_0 is spelled out wherever they are used. + */ +#define BERT_ARGUMENTS_AFTER_FIRST(X) \ + X(1) X(2) X(3) X(4) X(5) X(6) X(7) X(8) X(9) X(10) \ + X(11) X(12) X(13) X(14) X(15) X(16) X(17) X(18) X(19) X(20) \ + X(21) X(22) X(23) X(24) X(25) X(26) X(27) X(28) X(29) X(30) \ + X(31) X(32) X(33) X(34) X(35) X(36) X(37) X(38) X(39) X(40) \ + X(41) X(42) X(43) X(44) X(45) X(46) X(47) X(48) X(49) X(50) \ + X(51) X(52) X(53) X(54) X(55) X(56) X(57) X(58) X(59) X(60) \ + X(61) X(62) X(63) + +#define BERT_ARGUMENT_DECLARE_DEFAULT(n) , LPXLOPER12 input_ ## n = 0 +#define BERT_ARGUMENT_DECLARE(n) , LPXLOPER12 input_ ## n +#define BERT_ARGUMENT_NAME(n) , input_ ## n + +/** + * the type string BERT.Call registers with: "U" for the return, then one + * "Q" per slot. it takes the function name as its first argument, so it has + * one more slot than BERT_MAX_ARGUMENTS. the static_assert below keeps this + * literal honest; per-language functions build theirs at registration. + */ +#define BERT_Q16 L"QQQQQQQQQQQQQQQQ" +#define BERT_CALL_TYPE_TEXT L"UQ" BERT_Q16 BERT_Q16 BERT_Q16 BERT_Q16 + +static_assert(sizeof(BERT_CALL_TYPE_TEXT) / sizeof(wchar_t) - 1 == BERT_MAX_ARGUMENTS + 2, + "BERT_CALL_TYPE_TEXT does not have one Q per argument (plus the function name)"); + static LPWSTR callTemplates[][16] = { - { L"BERT_CallLanguage_", L"UQQQQQQQQQQQQQQQQQ", L"BERT.Call", L"Function, Argument", L"2", L"BERT", L"", L"99", L"", L"", L"", L"", L"", L"", L"", L"" }, + { L"BERT_CallLanguage_", BERT_CALL_TYPE_TEXT, L"BERT.Call", L"Function, Argument", L"2", L"BERT", L"", L"99", L"", L"", L"", L"", L"", L"", L"", L"" }, { L"BERT_ExecLanguage_", L"UQ", L"BERT.Exec", L"Code", L"2", L"BERT", L"", L"97", L"Exec Language Code", L"", L"", L"", L"", L"", L"", L"" } }; @@ -59,31 +112,15 @@ int BERT_Console(); int BERT_ContextSwitch(LPXLOPER12 argument); __inline LPXLOPER12 BERT_Call_Generic(uint32_t language_index, LPXLOPER12 func, - LPXLOPER12 arg0, LPXLOPER12 arg1, LPXLOPER12 arg2, LPXLOPER12 arg3, - LPXLOPER12 arg4, LPXLOPER12 arg5, LPXLOPER12 arg6, LPXLOPER12 arg7, - LPXLOPER12 arg8, LPXLOPER12 arg9, LPXLOPER12 arg10, LPXLOPER12 arg11, - LPXLOPER12 arg12, LPXLOPER12 arg13, LPXLOPER12 arg14, LPXLOPER12 arg15); + LPXLOPER12 input_0 + BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_DECLARE)); #define BCALL(num) \ LPXLOPER12 BERT_CallLanguage_ ## num ( \ LPXLOPER12 func = 0 \ , LPXLOPER12 input_0 = 0 \ - , LPXLOPER12 input_1 = 0 \ - , LPXLOPER12 input_2 = 0 \ - , LPXLOPER12 input_3 = 0 \ - , LPXLOPER12 input_4 = 0 \ - , LPXLOPER12 input_5 = 0 \ - , LPXLOPER12 input_6 = 0 \ - , LPXLOPER12 input_7 = 0 \ - , LPXLOPER12 input_8 = 0 \ - , LPXLOPER12 input_9 = 0 \ - , LPXLOPER12 input_10 = 0 \ - , LPXLOPER12 input_11 = 0 \ - , LPXLOPER12 input_12 = 0 \ - , LPXLOPER12 input_13 = 0 \ - , LPXLOPER12 input_14 = 0 \ - , LPXLOPER12 input_15 = 0 \ -){ return BERT_Call_Generic( num - 1000, func, input_0, input_1, input_2, input_3, input_4, input_5, input_6, input_7, input_8, input_9, input_10, input_11, input_12, input_13, input_14, input_15 ); } + BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_DECLARE_DEFAULT) \ +){ return BERT_Call_Generic( num - 1000, func, input_0 BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_NAME) ); } __inline LPXLOPER12 BERT_Exec_Generic(uint32_t language_index, LPXLOPER12 code); @@ -98,40 +135,12 @@ LPXLOPER12 BERT_ExecLanguage_ ## num ( \ __inline LPXLOPER12 BERTFunctionCall( int findex, LPXLOPER12 input_0 = 0 - , LPXLOPER12 input_1 = 0 - , LPXLOPER12 input_2 = 0 - , LPXLOPER12 input_3 = 0 - , LPXLOPER12 input_4 = 0 - , LPXLOPER12 input_5 = 0 - , LPXLOPER12 input_6 = 0 - , LPXLOPER12 input_7 = 0 - , LPXLOPER12 input_8 = 0 - , LPXLOPER12 input_9 = 0 - , LPXLOPER12 input_10 = 0 - , LPXLOPER12 input_11 = 0 - , LPXLOPER12 input_12 = 0 - , LPXLOPER12 input_13 = 0 - , LPXLOPER12 input_14 = 0 - , LPXLOPER12 input_15 = 0 + BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_DECLARE_DEFAULT) ); #define BFC(num) \ LPXLOPER12 BERTFunctionCall ## num ( \ - LPXLOPER12 input_0 = 0 \ - , LPXLOPER12 input_1 = 0 \ - , LPXLOPER12 input_2 = 0 \ - , LPXLOPER12 input_3 = 0 \ - , LPXLOPER12 input_4 = 0 \ - , LPXLOPER12 input_5 = 0 \ - , LPXLOPER12 input_6 = 0 \ - , LPXLOPER12 input_7 = 0 \ - , LPXLOPER12 input_8 = 0 \ - , LPXLOPER12 input_9 = 0 \ - , LPXLOPER12 input_10 = 0 \ - , LPXLOPER12 input_11 = 0 \ - , LPXLOPER12 input_12 = 0 \ - , LPXLOPER12 input_13 = 0 \ - , LPXLOPER12 input_14 = 0 \ - , LPXLOPER12 input_15 = 0 \ - ){ return BERTFunctionCall( num-1000, input_0, input_1, input_2, input_3, input_4, input_5, input_6, input_7, input_8, input_9, input_10, input_11, input_12, input_13, input_14, input_15 ); } + LPXLOPER12 input_0 = 0 \ + BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_DECLARE_DEFAULT) \ +){ return BERTFunctionCall( num-1000, input_0 BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_NAME) ); } diff --git a/BERT/BERT/include/bert.h b/BERT/BERT/include/bert.h index baa328e2..93f961cf 100644 --- a/BERT/BERT/include/bert.h +++ b/BERT/BERT/include/bert.h @@ -38,6 +38,14 @@ #define CONFIG_FILE_NAME "bert-config.json" #define LANGUAGE_CONFIG_FILE_NAME "bert-languages.json" +/** + * function descriptions, in the format the Excel-DNA IntelliSense add-in + * reads. the name pairs with the carrier add-in BERT-IntelliSense.xlam: + * that add-in does nothing except give the IntelliSense add-in something + * to find this file beside. see docs/FUNCTION-HELP.md. + */ +#define INTELLISENSE_FILE_NAME "BERT-IntelliSense.intellisense.xml" + class BERT { private: @@ -62,8 +70,17 @@ class BERT { /** marshalled excel pointer for calls from separate threads */ IStream *stream_pointer_; - /** excel COM pointer */ - LPDISPATCH application_dispatch_; + /** + * excel COM pointer. initialized here because it is read to decide + * whether we have one yet -- the constructor never set it, and reading + * an uninitialized pointer to test it is undefined even when the ribbon + * fills it in a moment later. + */ + LPDISPATCH application_dispatch_ = 0; + + /** true when we acquired the Application pointer ourselves, so we hold a + * reference on it and have to give it back */ + bool owns_application_dispatch_ = false; /** pointer to ribbon menu */ LPDISPATCH ribbon_menu_dispatch_; @@ -176,6 +193,11 @@ class BERT { /** handles callback functions from R */ void HandleCallback(const std::string &language); +public: + + /** the directory this dll is in, which is also where the config lives */ + const std::string& home_directory() const { return home_directory_; } + public: /** single static instance of this class */ @@ -186,7 +208,31 @@ class BERT { /** sets COM pointers */ void SetPointers(ULONG_PTR excel_pointer, ULONG_PTR ribbon_pointer); - /** + /** + * excel's Application object, which drawing into a sheet and the EXCEL + * object in R both need. + * + * the ribbon add-in hands this over as it loads, and used to be the only + * source of it: with no ribbon there was no pointer, and graphics quietly + * drew nothing. AcquireApplicationDispatch gets one without it. + */ + LPDISPATCH ApplicationDispatch(); + + /** + * asks excel for the Application pointer directly, the way an add-in with + * no COM component of its own has to. does nothing if we already have + * one, and returns whether we have one now. + * + * MUST be called while excel is idle -- from xlAutoOpen, not from a + * callback. asking for the object model while a cell is calculating hangs + * excel. see docs/XLL-ONLY.md. + */ + bool AcquireApplicationDispatch(); + + /** takes an Application pointer, from the ribbon or from excel directly */ + void UseApplicationDispatch(LPDISPATCH application_dispatch); + + /** * tail routine for enum windows proc; hides or shows matching windows */ static BOOL CALLBACK ShowConsoleWindowCallback(HWND hwnd, LPARAM lParam); @@ -196,11 +242,25 @@ class BERT { */ static BOOL CALLBACK FocusExcelWindowCallback(HWND hwnd, LPARAM lParam); - /** - * opens the console, creating the process if necessary + /** + * opens the console, creating the process if necessary */ void ShowConsole(); + /** + * binds CONTROL+SHIFT+R to the console command, with ON.KEY. + * + * not with xlfRegister's shortcut field: a shortcut registered there does + * fire, but excel then resolves the command in workbook scope and reports + * "cannot run the macro '!BERT.Console'". ON.KEY sends the name through + * the same path as ExecuteExcel4Macro, which is what the ribbon button + * uses and which does resolve it. pass false to give the key back. + */ + void BindConsoleKey(bool bind = true); + + /** true if the console process we started is still running */ + bool ConsoleProcessRunning(); + /** * hides the console, without actually closing the process */ diff --git a/BERT/BERT/include/bert_version.h b/BERT/BERT/include/bert_version.h index f3b9e8f1..23e5bed7 100644 --- a/BERT/BERT/include/bert_version.h +++ b/BERT/BERT/include/bert_version.h @@ -16,8 +16,21 @@ * You should have received a copy of the GNU General Public License * along with BERT. If not, see . */ - #pragma once -#define BERT_VERSION L"2.4.3" +// the release number. Install/build-installer.ps1 reads this line to name +// the installer, so keep the define on one line in this form. +#define BERT_VERSION_NUMBER L"2.4.3" + +// a tag for builds from this branch, and the time the add-in was compiled, +// so a locally built add-in can be told from a release in the console's +// Help menu. the stamp is the compile time of bert.cc, the one file that +// includes this header, so it only moves when that file recompiles. +#define BERT_VERSION_TAG L"-r19" + +#define BERT_WIDEN_(s) L ## s +#define BERT_WIDEN(s) BERT_WIDEN_(s) +#define BERT_VERSION \ + BERT_VERSION_NUMBER BERT_VERSION_TAG \ + L" (built " BERT_WIDEN(__DATE__) L" " BERT_WIDEN(__TIME__) L")" diff --git a/BERT/BERT/include/callback_info.h b/BERT/BERT/include/callback_info.h index 47018785..0fe62f8b 100644 --- a/BERT/BERT/include/callback_info.h +++ b/BERT/BERT/include/callback_info.h @@ -29,10 +29,25 @@ class CallbackInfo { BERTBuffers::CallResponse callback_call_; BERTBuffers::CallResponse callback_response_; + /** + * the thread Excel calls spreadsheet functions on, recorded when the add-in + * opens. a call made on this thread has Excel blocked waiting for it, so a + * callback arriving during that call has to be handled here rather than + * through a COM context switch (which Excel will not service while it is + * calculating). + */ + DWORD main_thread_id_; + public: CallbackInfo() { default_signaled_event_ = CreateEvent(0, TRUE, TRUE, 0); default_unsignaled_event_ = CreateEvent(0, TRUE, FALSE, 0); + main_thread_id_ = 0; + } + + /** are we on the thread Excel calls spreadsheet functions on? */ + bool OnMainThread() const { + return main_thread_id_ && (GetCurrentThreadId() == main_thread_id_); } ~CallbackInfo() { diff --git a/BERT/BERT/include/debug_functions.h b/BERT/BERT/include/debug_functions.h index 3f520966..b889424d 100644 --- a/BERT/BERT/include/debug_functions.h +++ b/BERT/BERT/include/debug_functions.h @@ -22,7 +22,11 @@ #include #include -#ifdef _DEBUG +// BERT_TRACE builds the DebugOut calls into a release binary, so a stall in +// the field can be traced with a debug-output viewer. define it in the build +// (or here, temporarily) when you need the trace; it is off by default. + +#if defined(_DEBUG) || defined(BERT_TRACE) int DebugOut(const char *fmt, ...); diff --git a/BERT/BERT/include/type_conversions.h b/BERT/BERT/include/type_conversions.h index 78509645..71642198 100644 --- a/BERT/BERT/include/type_conversions.h +++ b/BERT/BERT/include/type_conversions.h @@ -410,8 +410,16 @@ class Convert { case BERTBuffers::Variable::ValueCase::kCpx: { + // Excel has no complex type, so this crosses as text in the a+bi form + // its own engineering functions use -- IMREAL, IMABS and the rest read + // it directly. Default stream formatting would give six significant + // digits, though, so 314159.2653589793+2.718281828459045i arrived as + // 314159+2.71828i and the rest was gone with no error. 15 digits is + // what Excel itself keeps, and what R prints. + std::stringstream ss; auto complex = var.cpx(); + ss << std::setprecision(15); ss << complex.r(); if (complex.i() >= 0) ss << "+"; ss << complex.i(); diff --git a/BERT/BERT/src/basic_functions.cc b/BERT/BERT/src/basic_functions.cc index bc9143b8..5e2b2b0f 100644 --- a/BERT/BERT/src/basic_functions.cc +++ b/BERT/BERT/src/basic_functions.cc @@ -29,21 +29,7 @@ LPXLOPER12 BERTFunctionCall( int index , LPXLOPER12 input_0 - , LPXLOPER12 input_1 - , LPXLOPER12 input_2 - , LPXLOPER12 input_3 - , LPXLOPER12 input_4 - , LPXLOPER12 input_5 - , LPXLOPER12 input_6 - , LPXLOPER12 input_7 - , LPXLOPER12 input_8 - , LPXLOPER12 input_9 - , LPXLOPER12 input_10 - , LPXLOPER12 input_11 - , LPXLOPER12 input_12 - , LPXLOPER12 input_13 - , LPXLOPER12 input_14 - , LPXLOPER12 input_15 + BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_DECLARE) ) { static XLOPER12 rslt; @@ -54,9 +40,8 @@ LPXLOPER12 BERTFunctionCall( if (index < 0 || index >= bert->function_list_.size()) return &rslt; - LPXLOPER12 arglist[16] = { - input_0, input_1, input_2, input_3, input_4, input_5, input_6, input_7, - input_8, input_9, input_10, input_11, input_12, input_13, input_14, input_15 + LPXLOPER12 arglist[BERT_MAX_ARGUMENTS] = { + input_0 BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_NAME) }; BERTBuffers::CallResponse call, response; @@ -68,10 +53,10 @@ LPXLOPER12 BERTFunctionCall( function_call->set_function(function_descriptor->name_); function_call->set_flags(function_descriptor->flags_); - int argcount = 16; + int argcount = BERT_MAX_ARGUMENTS; for (; argcount && arglist[argcount - 1]->xltype == xltypeMissing; argcount--); - int function_arguments = function_descriptor->language_service_->named_arguments() ? + int function_arguments = function_descriptor->language_service_->named_arguments() ? function_descriptor->arguments_.size() : 0; for (int i = 0; i < argcount; i++) { @@ -129,10 +114,8 @@ LPXLOPER12 BERT_Exec_Generic(uint32_t language_key, LPXLOPER12 code) { } LPXLOPER12 BERT_Call_Generic(uint32_t language_key, LPXLOPER12 func, - LPXLOPER12 arg0, LPXLOPER12 arg1, LPXLOPER12 arg2, LPXLOPER12 arg3, - LPXLOPER12 arg4, LPXLOPER12 arg5, LPXLOPER12 arg6, LPXLOPER12 arg7, - LPXLOPER12 arg8, LPXLOPER12 arg9, LPXLOPER12 arg10, LPXLOPER12 arg11, - LPXLOPER12 arg12, LPXLOPER12 arg13, LPXLOPER12 arg14, LPXLOPER12 arg15) { + LPXLOPER12 input_0 + BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_DECLARE)) { static XLOPER12 rslt; // TLS? @@ -147,12 +130,11 @@ LPXLOPER12 BERT_Call_Generic(uint32_t language_key, LPXLOPER12 func, auto function_call = call.mutable_function_call(); function_call->set_function(Convert::XLOPERToString(func)); - LPXLOPER12 arglist[16] = { - arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, - arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15 + LPXLOPER12 arglist[BERT_MAX_ARGUMENTS] = { + input_0 BERT_ARGUMENTS_AFTER_FIRST(BERT_ARGUMENT_NAME) }; - int argcount = 16; + int argcount = BERT_MAX_ARGUMENTS; for (; argcount && arglist[argcount - 1]->xltype == xltypeMissing; argcount--); for (int i = 0; i < argcount; i++) { diff --git a/BERT/BERT/src/bert.cc b/BERT/BERT/src/bert.cc index 93999ab7..0c9579a5 100644 --- a/BERT/BERT/src/bert.cc +++ b/BERT/BERT/src/bert.cc @@ -36,6 +36,11 @@ #include "bert_version.h" +// for AccessibleObjectFromWindow, which is how an add-in with no COM +// component of its own reaches excel's object model +#include +#pragma comment(lib, "oleacc.lib") + BERT* BERT::instance_ = 0; BERT* BERT::Instance() { @@ -171,36 +176,22 @@ BOOL CALLBACK BERT::ShowConsoleWindowCallback(HWND hwnd, LPARAM lParam) GetWindowTextA(hwnd, buffer, 256); DebugOut("WINDOW %X: %s\n", pid, buffer); - long style = GetWindowLong(hwnd, GWL_STYLE); - long exstyle = GetWindowLong(hwnd, GWL_EXSTYLE); - DebugOut("PRE: 0x%X, 0x%X\n", style, exstyle); + // show or hide the window, and nothing else. this used to rewrite the + // window styles as well, moving the console between an application + // window and a tool window and setting the visible bit by hand. that + // leaves the window out of step with what chromium believes about it, + // and the console came back from a hide with a blank client area that + // took no input. a hidden window has no taskbar button anyway, which + // is what the style changes were for. if (show) { - style |= WS_VISIBLE; - exstyle |= WS_EX_APPWINDOW; - exstyle &= ~(WS_EX_TOOLWINDOW); + ShowWindow(hwnd, IsIconic(hwnd) ? SW_RESTORE : SW_SHOW); + SetForegroundWindow(hwnd); } else { - style &= ~(WS_VISIBLE); - exstyle |= WS_EX_TOOLWINDOW; - exstyle &= ~(WS_EX_APPWINDOW); + ShowWindow(hwnd, SW_HIDE); } - ShowWindow(hwnd, SW_HIDE); - - SetWindowLong(hwnd, GWL_EXSTYLE, exstyle); - SetWindowLong(hwnd, GWL_STYLE, style); - - if (show) { - if (IsIconic(hwnd)) ShowWindow(hwnd, SW_RESTORE); - ShowWindow(hwnd, SW_SHOW); - SetForegroundWindow(hwnd); - } - - style = GetWindowLong(hwnd, GWL_STYLE); - exstyle = GetWindowLong(hwnd, GWL_EXSTYLE); - DebugOut("POST: 0x%X, 0x%X\n", style, exstyle); - } } return TRUE; @@ -242,25 +233,237 @@ void BERT::HideConsole() { EnumWindows(BERT::FocusExcelWindowCallback, (LPARAM)pid); } +/** true if the console we started is still running */ +bool BERT::ConsoleProcessRunning() { + + if (!console_process_id_) return false; + + HANDLE handle = OpenProcess(SYNCHRONIZE, FALSE, console_process_id_); + if (!handle) return false; + + bool running = (WAIT_TIMEOUT == WaitForSingleObject(handle, 0)); + CloseHandle(handle); + + return running; +} + void BERT::ShowConsole() { - if (console_process_id_) { + + // the console hides itself rather than closing, so normally it is still + // there and only needs showing. if it has gone, start it again: the id + // was never cleared, so this used to do nothing at all. + + if (ConsoleProcessRunning()) { EnumWindows(BERT::ShowConsoleWindowCallback, true); } else { + console_process_id_ = 0; StartConsoleProcess(); } } -void BERT::SetPointers(ULONG_PTR excel_pointer, ULONG_PTR ribbon_pointer) { +void BERT::BindConsoleKey(bool bind) { - ribbon_menu_dispatch_ = reinterpret_cast(ribbon_pointer); + // "^+r" is excel's own key syntax, the same one VBA's Application.OnKey + // takes: control, shift, r. - if (pending_user_buttons_.size()) { - for (auto button : pending_user_buttons_) AddUserButtonInternal(button); - pending_user_buttons_.clear(); + XLOPER12 key, macro, result; + Convert::StringToXLOPER(&key, "^+r", false); + + int err = 0; + + if (bind) { + Convert::StringToXLOPER(¯o, "BERT.Console", false); + err = Excel12(xlcOnKey, &result, 2, &key, ¯o); + if (macro.xltype & xltypeStr) delete[] macro.val.str; + } + else { + + // one argument gives the key back to excel + + err = Excel12(xlcOnKey, &result, 1, &key); + } + + if (err) DebugOut("ON.KEY for the console returned %d\n", err); + + if (key.xltype & xltypeStr) delete[] key.val.str; + +} + +namespace { + + /** + * excel's window classes, outside in: the frame, the desktop area, and + * the pane that answers to OBJID_NATIVEOM. only the innermost one has an + * object model attached, so all three have to be walked. + */ + const wchar_t *EXCEL_FRAME_CLASS = L"XLMAIN"; + const wchar_t *EXCEL_DESK_CLASS = L"XLDESK"; + const wchar_t *EXCEL_PANE_CLASS = L"EXCEL7"; + + bool WindowClassIs(HWND window, const wchar_t *name) { + wchar_t buffer[64]; + if (!GetClassNameW(window, buffer, sizeof(buffer) / sizeof(buffer[0]))) return false; + return !wcscmp(buffer, name); + } + + BOOL CALLBACK FindPaneWindow(HWND window, LPARAM parameter) { + if (WindowClassIs(window, EXCEL_PANE_CLASS)) { + *(reinterpret_cast(parameter)) = window; + return FALSE; + } + if (WindowClassIs(window, EXCEL_DESK_CLASS)) { + EnumChildWindows(window, FindPaneWindow, parameter); + return *(reinterpret_cast(parameter)) ? FALSE : TRUE; + } + return TRUE; + } + + struct FrameSearch { + DWORD process_id; + WORD handle_low_word; // what xlGetHwnd gives us, which is not the whole handle + HWND pane; + }; + + BOOL CALLBACK FindFrameWindow(HWND window, LPARAM parameter) { + + auto search = reinterpret_cast(parameter); + + DWORD process_id = 0; + GetWindowThreadProcessId(window, &process_id); + if (process_id != search->process_id) return TRUE; + + if (!WindowClassIs(window, EXCEL_FRAME_CLASS)) return TRUE; + + // excel 2013 and later give each workbook its own frame window, so + // there can be several. any of them leads to the same Application, but + // prefer the one excel named, if we have it. + + if (search->handle_low_word + && LOWORD(reinterpret_cast(window)) != search->handle_low_word + && search->pane) { + return TRUE; + } + + HWND pane = 0; + EnumChildWindows(window, FindPaneWindow, reinterpret_cast(&pane)); + if (!pane) return TRUE; + + search->pane = pane; + + // an exact match is as good as it gets; anything else, keep looking in + // case a better one turns up + return (search->handle_low_word + && LOWORD(reinterpret_cast(window)) == search->handle_low_word) ? FALSE : TRUE; } - application_dispatch_ = reinterpret_cast(excel_pointer); + /** + * asks excel for its Application object without going through COM + * registration: the accessibility interface on the sheet pane hands back + * the window's object model, and Application hangs off that. this is the + * standard route for an add-in that has no COM component of its own. + * + * returns an AddRef'd pointer, or null if excel has no window yet (very + * early in startup) or refuses. + */ + LPDISPATCH AcquireExcelApplication() { + + FrameSearch search = { GetCurrentProcessId(), 0, 0 }; + + // xlGetHwnd returns the low word of the frame handle, which is enough + // to pick the right one out of the windows this process owns + + XLOPER12 handle; + handle.xltype = xltypeNil; + if (!Excel12(xlGetHwnd, &handle, 0)) { + if (handle.xltype == xltypeInt) search.handle_low_word = (WORD)handle.val.w; + else if (handle.xltype == xltypeNum) search.handle_low_word = (WORD)handle.val.num; + } + Excel12(xlFree, 0, 1, &handle); + + EnumWindows(FindFrameWindow, reinterpret_cast(&search)); + if (!search.pane) { + DebugOut("no excel pane window; cannot reach the object model\n"); + return 0; + } + + CComPtr window_object; + HRESULT hresult = AccessibleObjectFromWindow(search.pane, (DWORD)OBJID_NATIVEOM, + IID_IDispatch, reinterpret_cast(&window_object)); + + if (FAILED(hresult) || !window_object) { + DebugOut("AccessibleObjectFromWindow failed: 0x%x\n", hresult); + return 0; + } + + // that is excel's Window object; the Application hangs off it + + DISPID dispid; + CComBSTR name = L"Application"; + hresult = window_object->GetIDsOfNames(IID_NULL, &name.m_str, 1, 1033, &dispid); + if (FAILED(hresult)) { + DebugOut("no Application property on the window object: 0x%x\n", hresult); + return 0; + } + + DISPPARAMS parameters = { 0, 0, 0, 0 }; + CComVariant result; + hresult = window_object->Invoke(dispid, IID_NULL, 1033, DISPATCH_PROPERTYGET, + ¶meters, &result, 0, 0); + + if (FAILED(hresult) || result.vt != VT_DISPATCH || !result.pdispVal) { + DebugOut("could not read Application: 0x%x\n", hresult); + return 0; + } + + result.pdispVal->AddRef(); + return result.pdispVal; + + } + +} + +LPDISPATCH BERT::ApplicationDispatch() { + return application_dispatch_; +} + +bool BERT::AcquireApplicationDispatch() { + + if (application_dispatch_) return true; + + // this has to happen while excel is idle. asking for the object model + // while a cell is calculating -- which is where graphics updates arrive + // from -- hangs excel outright, so this is called at load and never from + // the callback path. see docs/XLL-ONLY.md. + + LPDISPATCH acquired = AcquireExcelApplication(); + if (!acquired) return false; + + DebugOut("took the Application pointer from excel directly\n"); + UseApplicationDispatch(acquired); + + // this one is ours: it came back AddRef'd, and nothing else will release + // it. a pointer from the ribbon belongs to the ribbon. + + owns_application_dispatch_ = (application_dispatch_ == acquired); + if (!owns_application_dispatch_) acquired->Release(); + + return true; + +} + +void BERT::UseApplicationDispatch(LPDISPATCH application_dispatch) { + + if (!application_dispatch) return; + + // first one wins. with the ribbon installed both sources fire -- we take + // one at load, the ribbon offers another as it connects -- and they are + // two pointers to the same Application. taking the second would marshal + // a second stream and drop the first, so ignore it. + + if (application_dispatch_) return; + + application_dispatch_ = application_dispatch; // marshall pointer AtlMarshalPtrInProc(application_dispatch_, IID_IDispatch, &stream_pointer_); @@ -272,6 +475,19 @@ void BERT::SetPointers(ULONG_PTR excel_pointer, ULONG_PTR ribbon_pointer) { } +void BERT::SetPointers(ULONG_PTR excel_pointer, ULONG_PTR ribbon_pointer) { + + ribbon_menu_dispatch_ = reinterpret_cast(ribbon_pointer); + + if (pending_user_buttons_.size()) { + for (auto button : pending_user_buttons_) AddUserButtonInternal(button); + pending_user_buttons_.clear(); + } + + UseApplicationDispatch(reinterpret_cast(excel_pointer)); + +} + void BERT::ShutdownConsole() { if (!console_process_id_) return; if (!console_notification_handle_) return; // can't @@ -560,8 +776,11 @@ void BERT::HandleCallback(const std::string &language) { // function or we're being called from a shell function. the semantics are different // because the main thread may or may not be blocked. + DebugOut("HandleCallback: entry (%s)\n", language.c_str()); + DWORD wait_result = WaitForSingleObject(callback_info_.default_signaled_event_, 0); if (wait_result == WAIT_OBJECT_0) { + DebugOut("HandleCallback: shell function branch (COM context switch)\n"); // DebugOut("event 2 is already signaled; this is a shell function\n"); BERTBuffers::CallResponse &call = callback_info_.callback_call_; @@ -591,13 +810,12 @@ void BERT::HandleCallback(const std::string &language) { } else { - DebugOut("event 2 is not signaled; this is a spreadsheet function\n"); - DebugOut("callback waiting for signal\n"); + DebugOut("HandleCallback: spreadsheet branch; waking the main thread\n"); // let main thread handle SetEvent(callback_info_.default_unsignaled_event_); WaitForSingleObject(callback_info_.default_signaled_event_, INFINITE); - DebugOut("callback signaled\n"); + DebugOut("HandleCallback: main thread finished, returning to R\n"); } } @@ -708,10 +926,10 @@ void BERT::UpdateGraphics(const BERTBuffers::CompositeFunctionCall &call, BERTBu if (argument.value_case() == BERTBuffers::Variable::kGraphics) { const auto &graphics = argument.graphics(); if (graphics.command() == BERTBuffers::GraphicsUpdateCommand::query_size) { - BERTGraphics::QuerySize(graphics.name(), response, application_dispatch_); + BERTGraphics::QuerySize(graphics.name(), response, ApplicationDispatch()); } else { - BERTGraphics::UpdateGraphics(graphics, application_dispatch_); + BERTGraphics::UpdateGraphics(graphics, ApplicationDispatch()); } } } @@ -861,6 +1079,10 @@ int BERT::ExcelCallback(const BERTBuffers::CallResponse &call, BERTBuffers::Call void BERT::Init() { + // Excel calls xlAutoOpen, and spreadsheet functions, on its main thread + + callback_info_.main_thread_id_ = GetCurrentThreadId(); + // ReadConfigFile(); std::string config_file_path; @@ -1087,4 +1309,11 @@ void BERT::Close() { // free marshalled pointer if (stream_pointer_) AtlFreeMarshalStream(stream_pointer_); + // and the Application pointer, if it was ours to hold + if (owns_application_dispatch_ && application_dispatch_) { + application_dispatch_->Release(); + application_dispatch_ = 0; + owns_application_dispatch_ = false; + } + } diff --git a/BERT/BERT/src/debug_functions.cc b/BERT/BERT/src/debug_functions.cc index c57502a7..c435e73b 100644 --- a/BERT/BERT/src/debug_functions.cc +++ b/BERT/BERT/src/debug_functions.cc @@ -19,7 +19,7 @@ #include "stdafx.h" -#ifdef _DEBUG +#if defined(_DEBUG) || defined(BERT_TRACE) int DebugOut(const char *fmt, ...) { diff --git a/BERT/BERT/src/excel_api_functions.cc b/BERT/BERT/src/excel_api_functions.cc index e0df2a42..5fc73e5b 100644 --- a/BERT/BERT/src/excel_api_functions.cc +++ b/BERT/BERT/src/excel_api_functions.cc @@ -28,6 +28,8 @@ #include "excel_api_functions.h" +#include + void resetXlOper(LPXLOPER12 x) { if (x->xltype == (xltypeStr | xlbitDLLFree) && x->val.str) @@ -82,14 +84,107 @@ void UnregisterFunctions(const std::string &language) { } } +/** escapes the five characters xml reserves, for use in an attribute */ +std::string XMLEscape(const std::string &text) { + std::string escaped; + for (auto c : text) { + switch (c) { + case '&': escaped.append("&"); break; + case '<': escaped.append("<"); break; + case '>': escaped.append(">"); break; + case '"': escaped.append("""); break; + case '\'': escaped.append("'"); break; + default: escaped.push_back(c); + } + } + return escaped; +} + +/** + * writes the registered functions, with their descriptions, in the format + * the Excel-DNA IntelliSense add-in reads. that add-in shows the argument + * tooltip Excel itself only provides for its own functions; excel gives an + * add-in no way to do it. this file is what BERT contributes; see + * docs/FUNCTION-HELP.md for how the two are connected. + * + * this costs nothing when the IntelliSense add-in is not installed, so it + * is written whenever functions are registered. + */ +void WriteIntelliSenseFile() { + + BERT *bert = BERT::Instance(); + std::string path = bert->home_directory(); + path.append(INTELLISENSE_FILE_NAME); + + std::ofstream file(path, std::ios::binary | std::ios::trunc); + if (!file.good()) { + DebugOut("could not write %s\n", path.c_str()); + return; + } + + file << "\r\n"; + file << "\r\n"; + file << "\r\n"; + file << " \r\n"; + + for (auto entry : bert->function_list_) { + + auto language_service = bert->GetLanguageService(entry->language_key_); + if (!language_service) continue; + + // the name excel knows the function by, which is what the tooltip has + // to match: the language prefix, then the alias if there is one + + std::string name = language_service->prefix(); + name.append("."); + name.append(entry->alias_.length() ? entry->alias_ : entry->name_); + + file << " description_) << "\">\r\n"; + + for (auto argument : entry->arguments_) { + std::string description = argument->description_; + if (!description.length() && argument->default_value_.length()) { + description = "Default "; + description.append(argument->default_value_); + } + file << " name_) + << "\" Description=\"" << XMLEscape(description) << "\" />\r\n"; + } + + file << " \r\n"; + } + + file << " \r\n"; + file << "\r\n"; + +} + void RegisterFunctions() { - LPXLOPER12 xlParm[32]; + // xlfRegister takes ten fixed parameters -- module, procedure, type text, + // function text, argument text, macro type, category, shortcut, help topic + // and the function description -- and then one help string per argument. + + const int registration_parameters = 10 + BERT_MAX_ARGUMENTS; + + // excel's own limit: xlfRegister takes at most 255 arguments + static_assert(registration_parameters <= 255, + "BERT_MAX_ARGUMENTS leaves no room for xlfRegister's fixed parameters"); + + LPXLOPER12 xlParm[registration_parameters]; XLOPER12 xlRegisterID; int err; + // "U" for the return, then one "Q" per argument slot. every function is + // registered at the full width; excel passes xltypeMissing for the slots + // the caller did not fill, and the dispatcher trims them. + + std::string type_text = "U"; + type_text.append(BERT_MAX_ARGUMENTS, 'Q'); + BERT *bert = BERT::Instance(); - for (int i = 0; i < 32; i++) { + for (int i = 0; i < registration_parameters; i++) { xlParm[i] = new XLOPER12; xlParm[i]->xltype = xltypeMissing; } @@ -115,7 +210,7 @@ void RegisterFunctions() { ss.str(""); ss << "BERTFunctionCall" << index; Convert::StringToXLOPER(xlParm[1], ss.str(), false); - Convert::StringToXLOPER(xlParm[2], "UQQQQQQQQQQQQQQQQ", false); + Convert::StringToXLOPER(xlParm[2], type_text, false); ss.clear(); ss.str(""); @@ -131,7 +226,24 @@ void RegisterFunctions() { ss.clear(); ss.str(""); for (auto arg : entry->arguments_) ss << ", " << arg->name_; - Convert::StringToXLOPER(xlParm[4], ss.str().c_str() + 2, false); + + // (the leading ", " is not part of the list. a function with no + // arguments has nothing here at all -- reading past the end of that + // string is what the old c_str() + 2 did.) + + std::string argument_text = ss.str().length() > 2 ? ss.str().substr(2) : ""; + + // registration strings are capped at 255 characters, and with enough + // arguments this list runs past that. an over-long string makes excel + // refuse the registration, taking the whole function with it, so cut + // the list at the last name that fits. + + if (argument_text.length() > 255) { + size_t cut = argument_text.rfind(", ", 255); + argument_text = argument_text.substr(0, cut == std::string::npos ? 255 : cut); + } + + Convert::StringToXLOPER(xlParm[4], argument_text, false); Convert::StringToXLOPER(xlParm[5], "1", false); @@ -149,7 +261,7 @@ void RegisterFunctions() { if(entry->description_.length()) Convert::StringToXLOPER(xlParm[9], entry->description_, false); else Convert::StringToXLOPER(xlParm[9], "Exported Function", false); - for (int i = 10; i < 32; i++) { + for (int i = 10; i < registration_parameters; i++) { int index = i - 10; xlParm[i]->xltype = xltypeMissing; if (entry->arguments_.size() > index){ @@ -165,14 +277,14 @@ void RegisterFunctions() { } xlRegisterID.xltype = xltypeMissing; - err = Excel12v(xlfRegister, &xlRegisterID, 32, xlParm); + err = Excel12v(xlfRegister, &xlRegisterID, registration_parameters, xlParm); if (!err) { if( xlRegisterID.xltype == xltypeNum ) entry->register_id_ = (int32_t)xlRegisterID.val.num; else if( xlRegisterID.xltype == xltypeInt ) entry->register_id_ = (int32_t)xlRegisterID.val.w; } Excel12(xlFree, 0, 1, &xlRegisterID); - for (int i = 1; i < 32; i++) { + for (int i = 1; i < registration_parameters; i++) { if (xlParm[i]->xltype & xltypeStr) delete[] xlParm[i]->val.str; } @@ -180,7 +292,10 @@ void RegisterFunctions() { } Excel12(xlFree, 0, 1, xlParm[0]); - for (int i = 0; i < 32; i++) delete xlParm[i]; + for (int i = 0; i < registration_parameters; i++) delete xlParm[i]; + + WriteIntelliSenseFile(); + } bool ExcelRegisterLanguageCalls(const char *language_name, uint32_t language_key, bool generic) { @@ -312,6 +427,18 @@ BOOL WINAPI xlAutoOpen(void) bert->RegisterLanguageCalls(); bert->MapFunctions(); RegisterFunctions(); + + // with the ribbon installed it has already handed us excel's Application + // pointer; without it, ask excel now, while it is idle. this is the only + // safe moment -- see docs/XLL-ONLY.md. + + bert->AcquireApplicationDispatch(); + + // CONTROL+SHIFT+R for the console. see BERT::BindConsoleKey for why this + // is not the shortcut field in the registration table. + + bert->BindConsoleKey(); + return true; } @@ -323,6 +450,7 @@ void WINAPI xlAutoFree12(LPXLOPER12 pxFree) BOOL WINAPI xlAutoClose(void) { + BERT::Instance()->BindConsoleKey(false); BERT::Instance()->Close(); return true; } diff --git a/BERT/BERT/src/language_service.cc b/BERT/BERT/src/language_service.cc index 34f2d347..5350155c 100644 --- a/BERT/BERT/src/language_service.cc +++ b/BERT/BERT/src/language_service.cc @@ -265,11 +265,11 @@ void LanguageService::RunCallbackThread() { HANDLE callback_pipe_handle = CreateFileA(ss.str().c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0); if (!callback_pipe_handle || callback_pipe_handle == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); - DebugOut("err opening pipe [1]: %d\n", err); + DebugOut("CB: FAILED to open callback pipe %s: error %d\n", ss.str().c_str(), err); } else { - DebugOut("Connected to callback pipe\n"); + DebugOut("CB: connected to callback pipe %s\n", ss.str().c_str()); DWORD mode = PIPE_READMODE_MESSAGE; BOOL state = SetNamedPipeHandleState(callback_pipe_handle, &mode, 0, 0); @@ -305,14 +305,19 @@ void LanguageService::RunCallbackThread() { MessageUtilities::Unframe(call, buffer, bytes); } + DebugOut("CB: message from R (%d bytes), wait=%d\n", (int)bytes, (int)call.wait()); + bert->HandleCallback(language_descriptor_.name_); //DumpJSON(response); + DebugOut("CB: HandleCallback returned\n"); + if (call.wait()) { std::string str_response = MessageUtilities::Frame(response); WriteFile(callback_pipe_handle, str_response.c_str(), (int32_t)str_response.size(), &bytes, &io); //result = GetOverlappedResultEx(callback_pipe_handle, &io, &bytes, INFINITE, FALSE); result = GetOverlappedResult(callback_pipe_handle, &io, &bytes, TRUE); + DebugOut("CB: response written to R (result %d, %d bytes)\n", (int)result, (int)bytes); } // restart @@ -537,6 +542,20 @@ void LanguageService::Call(BERTBuffers::CallResponse &response, BERTBuffers::Cal std::string framed_message = MessageUtilities::Frame(call); ResetEvent(io_.hEvent); + // the callback thread decides where to handle a callback from the language + // by looking at this event: signaled means "no spreadsheet call in flight, + // switch context through COM", unsignaled means "the main thread is blocked + // in the call below, hand it over". it has to say the right thing before the + // language can possibly call back, which means before the call goes out -- + // it used to be reset a second later (there was a Sleep(1000) further down), + // by which time R had already called back and been sent through COM into an + // Excel that was busy calculating. that deadlocked both processes, taking + // out anything that calls back into Excel: xlfCaller, and so the graphics + // device, which uses it for cell=TRUE and to size its shape. + + bool blocking_call = call.wait() && callback_info_.OnMainThread(); + if (blocking_call) ResetEvent(callback_info_.default_signaled_event_); + bool write_result = WriteFile(pipe_handle_, framed_message.c_str(), (int32_t)framed_message.length(), NULL, &io_); // wait for the write to complete. FIXME: there's no need to wait if we don't need a @@ -555,12 +574,21 @@ void LanguageService::Call(BERTBuffers::CallResponse &response, BERTBuffers::Cal std::string message_buffer; - // ::MessageBoxA(0, "Call wait", "CB", MB_OK); - Sleep(1000); + // (there was a Sleep(1000) here, left over from debugging this by hand) + + DebugOut("CALL: waiting for a reply from %s\n", language_descriptor_.name_.c_str()); while (true) { - ResetEvent(callback_info_.default_signaled_event_); // set unsignaled + + // only a call that is blocking Excel's main thread claims the callback + // for that thread; a call from the console leaves the event signaled so + // its callbacks go through the COM context switch, which is what that + // branch is for. this used to depend on the timing of the Sleep above: + // whichever branch the clock landed on is the one the callback took. + + if (blocking_call) ResetEvent(callback_info_.default_signaled_event_); // set unsignaled DWORD signaled = WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE); + DebugOut("CALL: woken, signaled=%d (0=pipe, 1=callback event)\n", (int)signaled); if (signaled == WAIT_OBJECT_0) { // ::MessageBoxA(0, "Call signaled", "CB", MB_OK); @@ -632,8 +660,9 @@ void LanguageService::Call(BERTBuffers::CallResponse &response, BERTBuffers::Cal } else if( signaled != WAIT_TIMEOUT) { ResetEvent(callback_info_.default_unsignaled_event_); - DebugOut("other handle signaled, do something\n"); + DebugOut("CALL: servicing callback on the main thread\n"); bert->HandleCallbackOnThread(language_descriptor_.name_); + DebugOut("CALL: callback serviced, releasing the callback thread\n"); SetEvent(callback_info_.default_signaled_event_); // signal callback thread } } diff --git a/BERT/vcpkg-configuration.json b/BERT/vcpkg-configuration.json new file mode 100644 index 00000000..abbe5e39 --- /dev/null +++ b/BERT/vcpkg-configuration.json @@ -0,0 +1,14 @@ +{ + "default-registry": { + "kind": "git", + "baseline": "a48bbf436be0867d0eadc42077f280f3123e3698", + "repository": "https://github.com/microsoft/vcpkg" + }, + "registries": [ + { + "kind": "artifact", + "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip", + "name": "microsoft" + } + ] +} diff --git a/BERT/vcpkg.json b/BERT/vcpkg.json new file mode 100644 index 00000000..4b3fb5d3 --- /dev/null +++ b/BERT/vcpkg.json @@ -0,0 +1,5 @@ +{ + "dependencies": [ + "protobuf" + ] +} diff --git a/Build/.gitignore b/Build/.gitignore index e00a4bbe..91bc21b6 100644 --- a/Build/.gitignore +++ b/Build/.gitignore @@ -18,3 +18,6 @@ bert-config.json user-stylesheet.less + +# copied from Install by build-release.ps1 +bert2.ico diff --git a/Build/CHANGELOG.md b/Build/CHANGELOG.md new file mode 100644 index 00000000..7ac60af2 --- /dev/null +++ b/Build/CHANGELOG.md @@ -0,0 +1,543 @@ +# BERT changelog + +Releases of this fork ([SamLovick/Basic-Excel-R-Toolkit](https://github.com/SamLovick/Basic-Excel-R-Toolkit/releases)), +which carries BERT 2.4.3 forward to current R, a current toolchain and a +current console. Upstream (sdllc) has not released since 2018; the whole set +of changes is offered back as pull request +[sdllc#220](https://github.com/sdllc/Basic-Excel-R-Toolkit/pull/220). + +Newest first. The console shows this file under Help ▸ Release Notes, and +opens it by itself the first time you run a new version. + +## Which R versions this works with + +**R 3.5 through 4.6, all of it.** Cell functions, the console, Excel +references, graphics and function help work on every version the controller +runs on. + +| Your R | Functions in cells | Console | Excel references | Graphics | Function help | +| --- | --- | --- | --- | --- | --- | +| 4.6.x | yes | yes | yes | yes | yes | +| 4.5.x | yes | yes | yes | yes | yes | +| 4.4.x | yes | yes | yes | yes* | yes | +| 4.3.x | yes | yes | yes | yes* | yes | +| 4.2.x | yes | yes | yes | yes | yes | +| 3.5.x | yes | yes | yes | yes | yes | + +Tested in Excel on 4.6.1, 4.5.2, 4.2.2 and 3.5.0. \* 4.3 and 4.4 ship modules +built and checked on CI but are not tested in Excel here, for want of those R +versions on the build machine; they work by the same mechanism as the four +that are tested. + +### How it works, and what to watch for + +One `ControlR.exe` hosts every version of R from 3.5 up. The part that does +not travel between versions is `BERTModule`, a compiled R package providing +the graphics devices, the `xlReference` class used for Excel references, and +a few helpers. R checks a module's **graphics engine version** whenever a +graphics device is created, and that version changes between R series -- 4.2 +is `R_GE_group`, 4.5 is `R_GE_glyphs`, 4.6 is `R_GE_fontVar` -- so a module +built for one series cannot draw on another. + +The install therefore ships one module per series in +`module/.`, and `startup.R` loads the one matching the R it is +hosted in. All six are about 3 MB together, so there is nothing to choose at +install time and no reason to ship separate downloads per R version: upgrade +your R and BERT picks up the matching module by itself. + +If you run an R with no module -- a future series, say -- BERT falls back to +another module, which still loads and still provides references and the +helpers; only drawing is lost, and the console says so at startup. + +## 2.4.3-r19 + +Documentation only: nothing about how BERT behaves is different from r18. + +### The README is installed with everything else + +It sits beside `CHANGELOG.md` and `Welcome.md` in the install directory, and +in the zip. Its links were relative -- fine in a checkout, dead everywhere +else -- so they are now full addresses into the repository, the logo +included. + +### The README says what the ribbon component does + +Clearing the **BERT tab on the ribbon** box is a choice the installer has +offered since r17, and the README had never mentioned it. It now covers what +you keep without the tab (functions, console, graphics, Excel references, the +`EXCEL` object in R, function help), what goes with it (the tab, and buttons +added by `BERT$AddUserButton`), and how to open the console when the button +is gone. + +It also claimed **"Modules ship for R 4.5 and 4.6"**, which stopped being +true at r11, when a module for every series went in. Corrected: 3.5, 4.2, +4.3, 4.4, 4.5 and 4.6, which is what the table at the top of this file has +said all along. + +## 2.4.3-r18 + +### The console shortcut works now + +r17 registered CONTROL+SHIFT+R through `xlfRegister`'s shortcut field, +which looks like the obvious way to do it and is the wrong one. The key +fired, but Excel then looked the command up in workbook scope and put an +error dialog on screen -- "cannot run the macro '!BERT.Console'" -- because +an XLL command belongs to the add-in's context, not a workbook's. + +BERT now binds the key itself at load, with ON.KEY, which runs the name +through the same path as `ExecuteExcel4Macro` -- the path the ribbon button +has always used. The binding is released when the add-in unloads, so Excel +gets the key back. + +If you are on r17, this is worth taking: there, the shortcut did nothing +except raise an error. + +Verified on both machines here: the shortcut opens the console on the +development machine, and r18 installs and runs on a second machine with no +development tools on it. A keystroke is the one thing no test harness on +this project can exercise, so that check is by hand, every time. + +## 2.4.3-r17 + +### The ribbon tab is now optional + +BERT ships two things Excel loads: the add-in itself, `BERT64.xll`, and a +COM add-in that draws the BERT tab. The tab is now a component on the +installer's page, selected by default. Clear it -- or pass `/NO-RIBBON` to +a scripted install -- for an add-in that registers nothing with COM, has no +entry in Excel's COM add-ins list for Excel to disable after a crash, and +touches nothing outside its own directory. + +Nothing else is lost. Functions in cells, the console, graphics, Excel +references, the `EXCEL` object in R and function help all work without it. +What goes is the tab, and the buttons R code adds with +`BERT$AddUserButton`, which are ribbon controls and have nowhere to live. + +Two things had to change to make that true, and both are worth knowing +about even if you keep the ribbon: + +**The ribbon was what loaded the add-in.** It calls `RegisterXLL` as it +connects, and nothing else did, so clearing "BERT2 Ribbon Menu" in Excel's +COM add-ins dialog left you with no BERT at all rather than a reduced one -- +no functions, no console, nothing. Every install now registers `BERT64.xll` +in Excel's own add-in list, ribbon or no ribbon, so turning the ribbon off +in Excel leaves everything else working. The ribbon's own `RegisterXLL` is +then never reached: it only runs when the add-in is not already loaded. + +**The ribbon was also the only source of Excel's `Application` pointer**, +which drawing into a sheet and the `EXCEL` object in R both need. Without +it, plotting from a cell quietly drew nothing. The add-in now asks Excel +for that pointer itself when nobody has handed one over. + +### The console has a keyboard shortcut + +**CONTROL+SHIFT+R** opens it, on every install. Without the ribbon there is +no console button, and the console hides rather than closes when you click +its X, so there had to be a way back to it. + +Two other routes do the same job. `openConsole` in `bert-config.json` opens +the console with Excel; it was always there and is now in the config +template with the rest of the settings. And `Application.Run +"BERT.Console"` runs it from VBA or the Immediate window, which is also the +way to hang it off a button or a shortcut of your own. + +Typing the name into the macro dialog (ALT+F8) does not work, whatever the +C API documentation implies: that dialog looks the name up in workbook +scope, and an XLL command is registered in the add-in's context, not a +workbook's. + +`docs/XLL-ONLY.md` has the whole picture. + +## 2.4.3-r16 + +### Functions can take 64 arguments, up from 16 + +A function called from a cell was limited to sixteen arguments, and the +seventeenth was simply not passed. The limit is now 64. + +Excel fixes a function's arity when it is registered and calls a separate +entry point for each function, so BERT keeps a pool of dispatchers, each +compiled with a fixed number of parameters. That number was 16. It is now +64, in one constant -- `BERT_MAX_ARGUMENTS` -- with the type string and the +registration block derived from it. Excel's own ceiling is 254; 64 was +chosen because every dispatcher carries the full width whether it needs it +or not, which costs about 1.4 MB in the add-in. Raising it further is a +one-line change if 64 ever stops being enough. + +`BERT.Call`, the generic form, takes 64 as well. + +An R function may have more formals than that. It still registers and still +works; a formula can fill the first 64. Excel refuses a formula with more +arguments than the function was registered for, so the call never reaches R. + +Verified in Excel with functions of 16, 17, 20, 40, 64 and 70 arguments: +each was passed every argument the formula gave it, up to 64. + +### Registration no longer breaks on long argument lists + +Excel caps every string handed to `xlfRegister` at 255 characters, the list +of argument names included -- and rejects the whole registration if one runs +over, which with 64 arguments is easy. The list is now cut at the last name +that fits. Arguments past the cut still work and are still described; they +just don't appear in the signature line the Insert Function dialog draws. + +Also fixed alongside it: building that list for a function with no arguments +read two bytes past the end of an empty string. + +## 2.4.3-r15 + +### File dialogs start in the functions directory + +Open a file from the console and the dialog started wherever Windows last +left it, which was rarely where your R files are. It now starts in the +functions directory -- the one BERT loads from, `functionsDirectory` in +`bert-config.json`, environment variables and all. Save As does the same for +a document that has never been saved; one that already has a path still +opens where it lives. + +If the setting is missing, or names a directory that isn't there, the +dialogs behave as they did before. + +## 2.4.3-r14 + +### The editor showed you yesterday's file + +The console remembers which files you had open and restores them at +startup, but it restored the *text* it had cached rather than reading the +file again. Edit a file elsewhere between sessions -- or save an entirely +different file over it -- and the tab came back showing the old contents, +with nothing to say so. A file that had been deleted came back too. + +Restored tabs are now read from disk. If the file is gone, the tab is not +restored and the cached copy is dropped. + +Unsaved edits are the exception: a tab that was modified and never saved +keeps what you typed, still marked as modified, because that text exists +nowhere else. Everything else follows the file. + +## 2.4.3-r13 + +### The release notes read better + +Presentation only, in the console's rendered markdown -- these notes and the +welcome page. Subheadings were indented further than the text beneath them, +so they now share the paragraph indent. A table has no left padding of its +own, so its first column started to the left of the surrounding text: it now +lines up, with cell padding and a rule under the header row. List items ran +together, and now sit a paragraph's space apart. + +### The R shell has a left margin + +Text in the shell started hard against the left edge of the pane. It's now +inset by a few pixels. The inset is on the scrolling container rather than +the terminal itself, so the fit logic still sizes columns to the space the +terminal actually has and wide output doesn't pick up a stray horizontal +scrollbar. + +## 2.4.3-r12 + +### Complex numbers lost all but six digits on the way to Excel + +Excel has no complex type, so a complex value crosses as text in the `a+bi` +form Excel's own engineering functions use -- `IMREAL`, `IMABS` and the rest +read it directly, and it is byte-identical to what Excel's `COMPLEX()` +produces. But the conversion used default stream formatting, which is six +significant figures, so + + 314159.2653589793 + 2.718281828459045i + +arrived in the cell as `314159+2.71828i`. Everything past six digits was gone, +silently. Ordinary doubles were never affected: they cross as binary doubles. + +Now formatted with 15 significant digits, which is what Excel itself keeps and +what R prints. `IMREAL` of a value returned from R, minus the same number +computed in the sheet, is now exactly zero. + +## 2.4.3-r11 + +### Graphics and Excel references now work on every supported R + +r10 shipped modules for 4.5 and 4.6 only, so on 4.2 to 4.4 you lost drawing, +and on 3.5 you lost Excel references as well. Modules now ship for **3.5, +4.2, 4.3, 4.4, 4.5 and 4.6** -- the whole range the controller runs on. All +six are 3 MB together. + +The obstacle was never the code: it was that building a module for a series +needs that R and its matching Rtools on the build machine, well over a +gigabyte of downloads per series. A workflow now builds them on runners +instead, one job per series, each checking that the module it produced really +was built for the R it claims. `build-release.ps1 -FetchModules` takes the +modules from the last successful run of that workflow, verifying the same +thing again before packaging. + +Verified in Excel: drawing and Excel references both work on R 3.5.0 and +4.2.2, which is what r10 could not do, and 4.5.2 and 4.6.1 are unchanged. + +## 2.4.3-r10 + +### R 4.6 works + +`Rf_isFrame` was removed in R 4.6; the one place that used it now calls +`Rf_inherits(sexp, "data.frame")`, which does the same job and has been +stable API since long before 3.5. That was the only source change 4.6 needed: +the controller compiles against 4.6's headers, links against the existing +import libraries, and runs. + +### Graphics now works on more than one R series + +`BERTModule` carries the graphics devices, and R checks its graphics engine +version whenever a device is created. That version changes between R series +-- 4.2 is `R_GE_group`, 4.5 is `R_GE_glyphs`, 4.6 is `R_GE_fontVar` -- so a +module built for one series cannot draw on another. It fails with "Graphics +API version mismatch". + +Until now one module was built and shipped, so **graphics only ever worked on +the series it happened to be built against**: r9 shipped a 4.5 module, and +plotting from a cell failed on R 4.2 exactly as it did on 4.6. That was not +noticed because the build machine runs 4.5. + +The install now ships one module per series in `module/.` and +loads the one matching your R, falling back to any other module when there is +no match -- a module from another series still provides the `xlReference` +class and the helpers, so everything except drawing keeps working. Modules +ship for R 4.5 and 4.6. The console says at startup when graphics will not be +available and why. + +### Elsewhere + +- The version gate accepts 4.6 without complaint, and warns above it. +- `build-release.ps1 -ModuleRHomes` takes the R installations to build + modules against. It cleans `Module/src` between them: `R CMD INSTALL` will + otherwise relink from object files compiled against another R, producing a + module that claims to be built for one series and behaves as another. + +## 2.4.3-r9 + +Two build-correctness fixes and a clearer refusal. Nothing in how BERT behaves +day to day changes; if r8 works for you, this is not urgent. + +### The controller only built against a hand-edited R header + +`R_ReadConsole` was declared with R 3.5's signature, `char *buf`. R 4.2 +changed that callback's buffer to `unsigned char *`, so against a stock R 4.2 +or later the assignment to `Rp->ReadConsole` does not compile. It built here +only because the R tree this repository is built against had `RStartup.h` +edited by hand to say `char *` -- which means every binary up to r8 was +compiled against a modified R header, and nobody could build the controller +from a clean checkout with an R from CRAN. + +The callback now follows whichever headers it is compiled against. Verified +against stock R 4.5.2 and stock R 4.2.2. + +### R 4.6 is refused clearly rather than attempted quietly + +The runtime version gate only compared the major version, so R 4.6 passed it +without comment and the first sign of trouble would have come later and less +clearly. It now compares the minor version too and says the version is not +supported yet. **R 4.6 is not supported**: it removed `Rf_isFrame` and changed +the ReadConsole callback signature. + +### The vcpkg baseline is pinned for every project + +`vcpkg-configuration.json`, which pins the registry baseline, sat only beside +the add-in's manifest. Building the controller or the ribbon on its own took +whatever baseline the local vcpkg defaulted to, which could resolve a protobuf +incompatible with the checked-in generated code. All three manifests now pin +the same baseline. + +### Elsewhere + +- `AddUserButton` tested `id == 0` without establishing that `id` is one + value, the same shape that stopped completion working on R 4.3. +- There is a build on GitHub Actions now: the console, and `startup.R` against + four R versions. It is what found the first two items above. + +## 2.4.3-r8 + +Found by measuring the paths that run most often: a cell function being +recalculated, and a keystroke in the console. + +### The console stopped answering when a reply was large + +Node hands the console at most 64k per read, and the reader assumed every read +held whole messages -- there was a `FIXME` saying as much. A larger reply +arrived in pieces, the first piece failed to parse, was dropped, and the rest +was read as garbage; the request it belonged to never completed, so the shell +waited for an answer that was never coming. + +It showed up as completion: a token matching 3,000 symbols answered in 26 ms, +while 4,000 hung indefinitely. The reader now keeps the remainder of a split +frame and waits for the rest. Replies of 340 kB, five reads and more, now +arrive intact in about half a second. + +### Completion offers at most 500 matches + +A list of several thousand is no use to read and made every keystroke carry a +large reply. Long lists are trimmed. + +### Completions are asked for once typing pauses + +The console asked R for completions on every keystroke, and the answer costs R +around 10 ms on an empty workspace and 28 ms on one holding 5,000 objects. A +fast typist queued one request per character. It now waits 90 ms for a pause +and asks once. + +### Release notes showed the previous version's text + +Open tabs are restored from a cache rather than re-read, which is right for a +file you are editing and wrong for the release notes: after an upgrade they +showed the notes you had already read. Rendered documents -- the notes and the +welcome page, neither of them editable here -- are now read from the file when +a tab is restored or reopened. + +### Monaco no longer loads through node's vm module + +The editor's loader took its node path in the renderer, pulling in node's `vm` +module, and Electron warned on every start that vm is unsupported there, that +crashes are likely, and that it may be removed. The loader has a switch for +this case: `preferScriptTags` keeps it on script tags. The warning is gone, +and the editor -- 92 languages, syntax colouring, undo, find -- is unchanged. + +### For the record, what the measurements showed + +A cell function costs **0.3 ms** end to end -- about 3,000 recalculations a +second; 60 cells recalculate in 24 ms. A 1,000-cell range argument costs +0.5 ms, a 20,000-cell range 3.7 ms, a 400-cell array result 0.5 ms. Console +evaluation round trips take 0.2-0.5 ms, and printing costs about 0.25 ms a +line with no slowdown as the scrollback fills. Functions are registered +non-volatile, so Excel recalculates them only when their inputs change. + +Before r7 every cell function took **1,012 ms**, all of it a stray `Sleep`. + +## 2.4.3-r7 + +### Excel froze whenever R called back into it + +Any spreadsheet function that called back into Excel deadlocked: Excel showed +"Calculating" and stopped responding, R sat idle, and neither recovered. That +took out **R graphics entirely**, since the graphics device asks Excel which +cell it was called from and how big its shape is. + +The add-in decides where to handle a callback by testing an event: signaled +means "a console call, switch context through COM", unsignaled means "the main +thread is blocked in a spreadsheet call, hand it over". The event was only +cleared a second after the call was sent (there was a leftover `Sleep(1000)`), +but R answers in about a millisecond, so callbacks were pushed through COM into +an Excel that was mid-calculation and could never service them. + +The add-in now records Excel's main thread when it loads, clears the event +before the call goes out rather than after, and drops the sleep. Which branch a +callback takes is decided by the thread that made the call instead of by +timing. Verified with the worked example from +[bert-toolkit.com/r-graphics-in-excel](https://bert-toolkit.com/r-graphics-in-excel): +cell-linked and named devices, rotated text, transparency, rasters and UTF-8 +labels all draw, and console callbacks still round-trip. + +This is upstream code, untouched by the R 4.x work; it would have affected +anyone using `xlfCaller` or graphics from a cell. + +### Console autocomplete broke on R 4.3 and later + +`startup.R` compared a whole vector in `if (n == "" || ...)`. R has rejected a +length-2 condition since 4.3, so asking for a function's arguments printed +`'length = 2' in coercion to 'logical(1)'` into the shell. Now compares `n[1]`, +which is what the surrounding code already assumes and what R before 4.2 did +implicitly — same results on 3.5.0, 4.2.2 and 4.5.2. + +### Closing a modified file asks first + +Closing an edited file discarded the changes without a word; the source had +carried a `FIXME: warn if dirty` since 2018. It now offers Save, Don't Save or +Cancel, from the File menu and from the tab's close button alike. Saving can +fail (an unnamed file opens Save As, which you can cancel), and the file stays +open when it does. Close All and Close Others ask one file at a time and stop +at the first file you keep. + +### Console completion degrades instead of erroring + +The completion code borrows R's internal machinery — `utils:::.CompletionEnv`, +`.win32consoleCompletion` and a dozen more — which is not public API and +carries no promise between versions. Both entry points now sit behind a single +`tryCatch`, so a future R that renames or reshapes one of those costs you the +argument hints rather than printing an error into the shell on every keystroke. +One wrapper each, not one per candidate: measured at about five microseconds +against the eight milliseconds the completion search itself takes. + +### Other fixes + +- The console came back blank when you opened it a second time from the ribbon + in the same session. It is now shown and restored rather than recreated, and + restarted if the process has gone. +- Install Packages stalled on "loading packages" after you picked a mirror: the + package list URL was built wrongly for repositories given as a list, and the + failure was silent. The list also now reads as two fixed columns, name and + description. +- The package list kept scrolling after the mouse wheel stopped, to the end of + the list, because Chromium's scroll anchoring fought the virtual list. +- An alert that opened while another was fading out was hidden by the fade, + leaving a dialog nobody could answer. Alert buttons are also spaced now, so + three answers no longer read as one run of words. +- Release notes (this file) are shipped and shown in the console, which + previously offered only the generic welcome page. +- `DebugOut` can be compiled into a release build with `BERT_TRACE`, and the + callback handshake has named trace points, so a stall in the field can be + traced with a debug-output viewer instead of guesswork. + +## 2.4.3-r6 + +- **Function help in the formula bar.** Typing `=R.YourFunction(` shows the + function's arguments, a description of the function and of the argument you + are on, taken from `attr(f, "description")` in your R code. Excel gives + add-ins no way to draw that tooltip itself, so the add-in writes an + Excel-DNA IntelliSense file and the installer offers the IntelliSense add-in + as an optional component, off by default. See `docs/FUNCTION-HELP.md`. +- Single-string `description` attributes were dropped when registering + functions; only the vector form was read. Both work now, and feed Excel's + Insert Function and Function Arguments dialogs. +- The installer registers and unregisters the help add-ins itself, filling the + first free slot in Excel's add-in list and closing the gap on removal. +- R detection widened: per-user and per-machine registry entries, per-version + subkeys, then Program Files, keeping the newest. It only warns when it finds + no R, or nothing newer than 4.2. +- Cut, copy and paste work again in the editor, from the keyboard, the context + menu and the Edit menu. Monaco 0.56 registers no clipboard actions of its + own, and Electron 44 has no renderer clipboard module. + +## 2.4.3-r5 + +- Protobuf and its dependencies are linked statically. The r4 binaries needed + the Visual C++ redistributable, so on a machine without it the add-in failed + to load: every function gave `#NAME?` and the console never appeared. The + shipped binaries now import only system DLLs. + +**2.4.3-r4 was withdrawn** for the fault above. + +## 2.4.3-r4 + +First release of this fork. + +- **Works with current R.** One `ControlR.exe` built against R 4.5.2, with a + runtime version gate (floor 3.5) instead of a hard-coded 3.5 test. R is no + longer bundled; the installer finds the R you have. +- **Unicode end to end.** The controller runs with the UTF-8 code page, picks + its console encoding at runtime from the hosted R version (R 4.2 changed + what R hands over), converts strings explicitly rather than assuming the + native code page, and sends console text by length instead of relying on a + terminator. `x <- "café"; nchar(x)` gives 4, and text survives the round trip + between a cell, R and the console. +- **Current toolchain.** v145 toolset, protobuf 5.29 (C++) and 3.21 + (JavaScript), vcpkg manifest mode, ARM64EC configurations that link. +- **Current console.** Electron 44, TypeScript 7, Monaco 0.56, xterm 6, rxjs 7, + chokidar 4, built with npm. +- **64-bit installer** that installs over an existing BERT 2 without touching + `bert-config.json`, `user-stylesheet.less` or `Documents\BERT2`. +- The update check no longer points development builds at upstream's 2.4.4 + download page. +- Package names from CRAN no longer carry markup into the console. +- `docs/BUILDING.md` and `docs/MODERNISATION.md` describe the build, the R + version policy and what is still outstanding. + +## 2.4.4 and earlier + +See the [upstream project](https://github.com/sdllc/Basic-Excel-R-Toolkit) and +[bert-toolkit.com](https://bert-toolkit.com). diff --git a/Build/Welcome.md b/Build/Welcome.md index df0be4a5..edf02fbf 100644 --- a/Build/Welcome.md +++ b/Build/Welcome.md @@ -11,6 +11,11 @@ When it starts, BERT loads functions from the functions directory, Documents\BERT2. You should see some example functions installed in Excel called `R.TestAdd` and `R.EigenValues`. +Functions you export can describe themselves to Excel, so the Insert +Function dialog says what they do and what each argument is for. Add a +`description` attribute in R; there is an example in `functions.R`, in +your functions directory. + You can also use BERT with the statistics language Julia. See [this page][3] for more information. diff --git a/Build/bert-config-template.json b/Build/bert-config-template.json index bbca0023..43101e0b 100644 --- a/Build/bert-config-template.json +++ b/Build/bert-config-template.json @@ -31,7 +31,13 @@ // files in this directory will be loaded at startup and reloaded // when changed. the same directory is used for all languages. - "functionsDirectory": "%userprofile%\\Documents\\BERT2\\functions" + "functionsDirectory": "%userprofile%\\Documents\\BERT2\\functions", + + // open the console when Excel starts. worth turning on if you + // installed without the ribbon tab, since the console button lives + // there; otherwise leave it off and open the console from the tab. + + "openConsole": false }, diff --git a/Build/startup/startup.R b/Build/startup/startup.R index 074011f5..34126724 100644 --- a/Build/startup/startup.R +++ b/Build/startup/startup.R @@ -21,9 +21,68 @@ # # load module. moved from code. # +# BERTModule carries compiled code that registers the graphics devices, and R +# checks its graphics engine version whenever a device is created. That +# version changes between R series -- 4.2 is R_GE_group, 4.5 is R_GE_glyphs, +# 4.6 is R_GE_fontVar -- so a module built against one series cannot draw on +# another: it fails with "Graphics API version mismatch". The install ships +# one module per series in module/.; load the one that matches +# the R we are hosted in. The flat module/ directory is the older layout and +# is kept as a fallback. +# +# If there is no module for this R, say so and carry on: functions and the +# console work without it, only graphics does not. +# #=============================================================================== -library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); +local({ + + home <- Sys.getenv("BERT_HOME"); + series <- paste0(R.version$major, ".", strsplit(R.version$minor, ".", fixed=TRUE)[[1]][1]); + + # the matching module first, then the older flat layout, then any other + # series we happen to ship, newest first. a module built for a different + # series still loads and still provides the xlReference class and the + # helpers -- only drawing fails, and it fails with R's own "Graphics API + # version mismatch" when a device is created. that is worth having. + + others <- character(0); + module.root <- paste0(home, "module"); + if (dir.exists(module.root)) { + dirs <- list.dirs(module.root, full.names=FALSE, recursive=FALSE); + dirs <- dirs[grepl("^[0-9]+[.][0-9]+$", dirs)]; + if (length(dirs)) { + dirs <- dirs[order(numeric_version(dirs), decreasing=TRUE)]; + others <- file.path(module.root, dirs); + } + } + + loaded <- FALSE; + matched <- FALSE; + + for (lib in unique(c(file.path(module.root, series), module.root, others))) { + if (!loaded && dir.exists(file.path(lib, "BERTModule"))) { + loaded <- tryCatch({ + library(BERTModule, lib.loc=lib); + matched <- identical(basename(lib), series); + TRUE; + }, error = function(e) { + cat("BERT: BERTModule in", lib, "would not load:", conditionMessage(e), "\n"); + FALSE; + }); + } + } + + if (!loaded) { + cat("BERT: no BERTModule could be loaded. R functions and the console will", + "work; graphics and Excel references will not.\n"); + } + else if (!matched) { + cat("BERT: no BERTModule built for R ", series, + "; graphics will not work on this version of R, though everything else will.\n", sep=""); + } + +}) #=============================================================================== # @@ -65,7 +124,7 @@ library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); AddUserButton <- function(label, FUN, image.mso = "R", tip=""){ id <- .Call("BERT.Callback", "add-user-button", list(label, image.mso, tip), PACKAGE="(embedding)"); - if(!is.numeric(id) || id == 0){ + if(!is.numeric(id) || length(id) != 1 || id[1] == 0){ stop("add button failed"); } .user.button.env[[toString(id)]] = list(label=label, FUN=FUN, image.mso=image.mso, id=id, tip=tip); @@ -175,7 +234,7 @@ library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); # FIXME: are we using this one or the one in the module? and why are there # two? # - .Autocomplete <- function(...){ + .AutocompleteImpl <- function(...){ ac <- utils:::.win32consoleCompletion(...); if( length( utils:::.CompletionEnv$comps) > 0 ){ @@ -193,6 +252,21 @@ library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); ac; } + # + # the completion code borrows R's internals (utils:::.CompletionEnv, + # .win32consoleCompletion and friends), which are not public API and carry + # no promise between versions. if a future R renames or reshapes one, give + # up the hints rather than printing an error into the shell on every + # keystroke. one wrapper here, not one per candidate: it costs a few + # microseconds against the milliseconds the search itself takes. + # + .Autocomplete <- function(...){ + tryCatch(.AutocompleteImpl(...), error = function(e){ + list( comps="", function.signature="", token="", fguess="", + start=0, end=0, in.quotes=FALSE ); + }); + } + # # lists functions in the global environment (or specified environment) # for loading into Excel. using custom environments is not enabled in @@ -294,7 +368,10 @@ library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); version.string <- Sys.getenv('BERT_VERSION'); version <- list(); version['build.date'] <- Sys.getenv('BERT_BUILD_DATE'); - parts <- as.numeric(unlist(strsplit(version.string, '\\.'))); + # a development build carries a tag after the release number, e.g. + # "2.4.3-r4 (built ...)"; only the leading numeric part is the version + numeric.part <- regmatches(version.string, regexpr('^[0-9]+(\\.[0-9]+)*', version.string)); + parts <- as.numeric(unlist(strsplit(numeric.part, '\\.'))); version['major'] <- parts[1]; version['minor'] <- parts[2]; version['patch'] <- parts[3]; @@ -333,7 +410,10 @@ library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); # # update: now delegating file completion to C (probably more to come). # - .CustomCompleter <- function(.CompletionEnv){ + # the most completions to offer at once; see where this is applied below + .completion.limit <- 500; + + .CustomCompleterImpl <- function(.CompletionEnv){ .fqFunc <- function (line, cursor=-1) { @@ -391,11 +471,11 @@ library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); p <- environment(); n <- unlist( strsplit( name, "[^\\w\\.,]", F, T )); while( length( n ) > 1 ){ - if( n == "" || !exists( n[1], where=p )) return( NULL ); + if( n[1] == "" || !exists( n[1], where=p )) return( NULL ); p <- get( n[1], envir=p ); n <- n[-1]; } - if( n == "" || !exists( n[1], where=p )) return( NULL ); + if( n[1] == "" || !exists( n[1], where=p )) return( NULL ); list( name=n[1], fun=get( n[1], envir=p )); } @@ -479,10 +559,31 @@ library(BERTModule, lib.loc=paste0(Sys.getenv("BERT_HOME"), "module")); comps <- paste0(prefix, comps) } comps <- c(fargComps, comps) + + # a token that matches thousands of symbols is no use as a list, and the + # answer has to cross a pipe: keep it to something a person can read, + # and the shell responsive + + if (length(comps) > .completion.limit) { + comps <- comps[seq_len(.completion.limit)]; + } + .CompletionEnv[["comps"]] <- comps } }; + # + # as above: a completer that breaks on a future R should cost the + # completions, not fill the shell with errors + # + .CustomCompleter <- function(.CompletionEnv){ + tryCatch(.CustomCompleterImpl(.CompletionEnv), error = function(e){ + .CompletionEnv[["comps"]] <- character(); + .CompletionEnv[["function.signature"]] <- ""; + invisible(NULL); + }); + } + rc.options( custom.completer=.CustomCompleter ); # diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..7ac60af2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,543 @@ +# BERT changelog + +Releases of this fork ([SamLovick/Basic-Excel-R-Toolkit](https://github.com/SamLovick/Basic-Excel-R-Toolkit/releases)), +which carries BERT 2.4.3 forward to current R, a current toolchain and a +current console. Upstream (sdllc) has not released since 2018; the whole set +of changes is offered back as pull request +[sdllc#220](https://github.com/sdllc/Basic-Excel-R-Toolkit/pull/220). + +Newest first. The console shows this file under Help ▸ Release Notes, and +opens it by itself the first time you run a new version. + +## Which R versions this works with + +**R 3.5 through 4.6, all of it.** Cell functions, the console, Excel +references, graphics and function help work on every version the controller +runs on. + +| Your R | Functions in cells | Console | Excel references | Graphics | Function help | +| --- | --- | --- | --- | --- | --- | +| 4.6.x | yes | yes | yes | yes | yes | +| 4.5.x | yes | yes | yes | yes | yes | +| 4.4.x | yes | yes | yes | yes* | yes | +| 4.3.x | yes | yes | yes | yes* | yes | +| 4.2.x | yes | yes | yes | yes | yes | +| 3.5.x | yes | yes | yes | yes | yes | + +Tested in Excel on 4.6.1, 4.5.2, 4.2.2 and 3.5.0. \* 4.3 and 4.4 ship modules +built and checked on CI but are not tested in Excel here, for want of those R +versions on the build machine; they work by the same mechanism as the four +that are tested. + +### How it works, and what to watch for + +One `ControlR.exe` hosts every version of R from 3.5 up. The part that does +not travel between versions is `BERTModule`, a compiled R package providing +the graphics devices, the `xlReference` class used for Excel references, and +a few helpers. R checks a module's **graphics engine version** whenever a +graphics device is created, and that version changes between R series -- 4.2 +is `R_GE_group`, 4.5 is `R_GE_glyphs`, 4.6 is `R_GE_fontVar` -- so a module +built for one series cannot draw on another. + +The install therefore ships one module per series in +`module/.`, and `startup.R` loads the one matching the R it is +hosted in. All six are about 3 MB together, so there is nothing to choose at +install time and no reason to ship separate downloads per R version: upgrade +your R and BERT picks up the matching module by itself. + +If you run an R with no module -- a future series, say -- BERT falls back to +another module, which still loads and still provides references and the +helpers; only drawing is lost, and the console says so at startup. + +## 2.4.3-r19 + +Documentation only: nothing about how BERT behaves is different from r18. + +### The README is installed with everything else + +It sits beside `CHANGELOG.md` and `Welcome.md` in the install directory, and +in the zip. Its links were relative -- fine in a checkout, dead everywhere +else -- so they are now full addresses into the repository, the logo +included. + +### The README says what the ribbon component does + +Clearing the **BERT tab on the ribbon** box is a choice the installer has +offered since r17, and the README had never mentioned it. It now covers what +you keep without the tab (functions, console, graphics, Excel references, the +`EXCEL` object in R, function help), what goes with it (the tab, and buttons +added by `BERT$AddUserButton`), and how to open the console when the button +is gone. + +It also claimed **"Modules ship for R 4.5 and 4.6"**, which stopped being +true at r11, when a module for every series went in. Corrected: 3.5, 4.2, +4.3, 4.4, 4.5 and 4.6, which is what the table at the top of this file has +said all along. + +## 2.4.3-r18 + +### The console shortcut works now + +r17 registered CONTROL+SHIFT+R through `xlfRegister`'s shortcut field, +which looks like the obvious way to do it and is the wrong one. The key +fired, but Excel then looked the command up in workbook scope and put an +error dialog on screen -- "cannot run the macro '!BERT.Console'" -- because +an XLL command belongs to the add-in's context, not a workbook's. + +BERT now binds the key itself at load, with ON.KEY, which runs the name +through the same path as `ExecuteExcel4Macro` -- the path the ribbon button +has always used. The binding is released when the add-in unloads, so Excel +gets the key back. + +If you are on r17, this is worth taking: there, the shortcut did nothing +except raise an error. + +Verified on both machines here: the shortcut opens the console on the +development machine, and r18 installs and runs on a second machine with no +development tools on it. A keystroke is the one thing no test harness on +this project can exercise, so that check is by hand, every time. + +## 2.4.3-r17 + +### The ribbon tab is now optional + +BERT ships two things Excel loads: the add-in itself, `BERT64.xll`, and a +COM add-in that draws the BERT tab. The tab is now a component on the +installer's page, selected by default. Clear it -- or pass `/NO-RIBBON` to +a scripted install -- for an add-in that registers nothing with COM, has no +entry in Excel's COM add-ins list for Excel to disable after a crash, and +touches nothing outside its own directory. + +Nothing else is lost. Functions in cells, the console, graphics, Excel +references, the `EXCEL` object in R and function help all work without it. +What goes is the tab, and the buttons R code adds with +`BERT$AddUserButton`, which are ribbon controls and have nowhere to live. + +Two things had to change to make that true, and both are worth knowing +about even if you keep the ribbon: + +**The ribbon was what loaded the add-in.** It calls `RegisterXLL` as it +connects, and nothing else did, so clearing "BERT2 Ribbon Menu" in Excel's +COM add-ins dialog left you with no BERT at all rather than a reduced one -- +no functions, no console, nothing. Every install now registers `BERT64.xll` +in Excel's own add-in list, ribbon or no ribbon, so turning the ribbon off +in Excel leaves everything else working. The ribbon's own `RegisterXLL` is +then never reached: it only runs when the add-in is not already loaded. + +**The ribbon was also the only source of Excel's `Application` pointer**, +which drawing into a sheet and the `EXCEL` object in R both need. Without +it, plotting from a cell quietly drew nothing. The add-in now asks Excel +for that pointer itself when nobody has handed one over. + +### The console has a keyboard shortcut + +**CONTROL+SHIFT+R** opens it, on every install. Without the ribbon there is +no console button, and the console hides rather than closes when you click +its X, so there had to be a way back to it. + +Two other routes do the same job. `openConsole` in `bert-config.json` opens +the console with Excel; it was always there and is now in the config +template with the rest of the settings. And `Application.Run +"BERT.Console"` runs it from VBA or the Immediate window, which is also the +way to hang it off a button or a shortcut of your own. + +Typing the name into the macro dialog (ALT+F8) does not work, whatever the +C API documentation implies: that dialog looks the name up in workbook +scope, and an XLL command is registered in the add-in's context, not a +workbook's. + +`docs/XLL-ONLY.md` has the whole picture. + +## 2.4.3-r16 + +### Functions can take 64 arguments, up from 16 + +A function called from a cell was limited to sixteen arguments, and the +seventeenth was simply not passed. The limit is now 64. + +Excel fixes a function's arity when it is registered and calls a separate +entry point for each function, so BERT keeps a pool of dispatchers, each +compiled with a fixed number of parameters. That number was 16. It is now +64, in one constant -- `BERT_MAX_ARGUMENTS` -- with the type string and the +registration block derived from it. Excel's own ceiling is 254; 64 was +chosen because every dispatcher carries the full width whether it needs it +or not, which costs about 1.4 MB in the add-in. Raising it further is a +one-line change if 64 ever stops being enough. + +`BERT.Call`, the generic form, takes 64 as well. + +An R function may have more formals than that. It still registers and still +works; a formula can fill the first 64. Excel refuses a formula with more +arguments than the function was registered for, so the call never reaches R. + +Verified in Excel with functions of 16, 17, 20, 40, 64 and 70 arguments: +each was passed every argument the formula gave it, up to 64. + +### Registration no longer breaks on long argument lists + +Excel caps every string handed to `xlfRegister` at 255 characters, the list +of argument names included -- and rejects the whole registration if one runs +over, which with 64 arguments is easy. The list is now cut at the last name +that fits. Arguments past the cut still work and are still described; they +just don't appear in the signature line the Insert Function dialog draws. + +Also fixed alongside it: building that list for a function with no arguments +read two bytes past the end of an empty string. + +## 2.4.3-r15 + +### File dialogs start in the functions directory + +Open a file from the console and the dialog started wherever Windows last +left it, which was rarely where your R files are. It now starts in the +functions directory -- the one BERT loads from, `functionsDirectory` in +`bert-config.json`, environment variables and all. Save As does the same for +a document that has never been saved; one that already has a path still +opens where it lives. + +If the setting is missing, or names a directory that isn't there, the +dialogs behave as they did before. + +## 2.4.3-r14 + +### The editor showed you yesterday's file + +The console remembers which files you had open and restores them at +startup, but it restored the *text* it had cached rather than reading the +file again. Edit a file elsewhere between sessions -- or save an entirely +different file over it -- and the tab came back showing the old contents, +with nothing to say so. A file that had been deleted came back too. + +Restored tabs are now read from disk. If the file is gone, the tab is not +restored and the cached copy is dropped. + +Unsaved edits are the exception: a tab that was modified and never saved +keeps what you typed, still marked as modified, because that text exists +nowhere else. Everything else follows the file. + +## 2.4.3-r13 + +### The release notes read better + +Presentation only, in the console's rendered markdown -- these notes and the +welcome page. Subheadings were indented further than the text beneath them, +so they now share the paragraph indent. A table has no left padding of its +own, so its first column started to the left of the surrounding text: it now +lines up, with cell padding and a rule under the header row. List items ran +together, and now sit a paragraph's space apart. + +### The R shell has a left margin + +Text in the shell started hard against the left edge of the pane. It's now +inset by a few pixels. The inset is on the scrolling container rather than +the terminal itself, so the fit logic still sizes columns to the space the +terminal actually has and wide output doesn't pick up a stray horizontal +scrollbar. + +## 2.4.3-r12 + +### Complex numbers lost all but six digits on the way to Excel + +Excel has no complex type, so a complex value crosses as text in the `a+bi` +form Excel's own engineering functions use -- `IMREAL`, `IMABS` and the rest +read it directly, and it is byte-identical to what Excel's `COMPLEX()` +produces. But the conversion used default stream formatting, which is six +significant figures, so + + 314159.2653589793 + 2.718281828459045i + +arrived in the cell as `314159+2.71828i`. Everything past six digits was gone, +silently. Ordinary doubles were never affected: they cross as binary doubles. + +Now formatted with 15 significant digits, which is what Excel itself keeps and +what R prints. `IMREAL` of a value returned from R, minus the same number +computed in the sheet, is now exactly zero. + +## 2.4.3-r11 + +### Graphics and Excel references now work on every supported R + +r10 shipped modules for 4.5 and 4.6 only, so on 4.2 to 4.4 you lost drawing, +and on 3.5 you lost Excel references as well. Modules now ship for **3.5, +4.2, 4.3, 4.4, 4.5 and 4.6** -- the whole range the controller runs on. All +six are 3 MB together. + +The obstacle was never the code: it was that building a module for a series +needs that R and its matching Rtools on the build machine, well over a +gigabyte of downloads per series. A workflow now builds them on runners +instead, one job per series, each checking that the module it produced really +was built for the R it claims. `build-release.ps1 -FetchModules` takes the +modules from the last successful run of that workflow, verifying the same +thing again before packaging. + +Verified in Excel: drawing and Excel references both work on R 3.5.0 and +4.2.2, which is what r10 could not do, and 4.5.2 and 4.6.1 are unchanged. + +## 2.4.3-r10 + +### R 4.6 works + +`Rf_isFrame` was removed in R 4.6; the one place that used it now calls +`Rf_inherits(sexp, "data.frame")`, which does the same job and has been +stable API since long before 3.5. That was the only source change 4.6 needed: +the controller compiles against 4.6's headers, links against the existing +import libraries, and runs. + +### Graphics now works on more than one R series + +`BERTModule` carries the graphics devices, and R checks its graphics engine +version whenever a device is created. That version changes between R series +-- 4.2 is `R_GE_group`, 4.5 is `R_GE_glyphs`, 4.6 is `R_GE_fontVar` -- so a +module built for one series cannot draw on another. It fails with "Graphics +API version mismatch". + +Until now one module was built and shipped, so **graphics only ever worked on +the series it happened to be built against**: r9 shipped a 4.5 module, and +plotting from a cell failed on R 4.2 exactly as it did on 4.6. That was not +noticed because the build machine runs 4.5. + +The install now ships one module per series in `module/.` and +loads the one matching your R, falling back to any other module when there is +no match -- a module from another series still provides the `xlReference` +class and the helpers, so everything except drawing keeps working. Modules +ship for R 4.5 and 4.6. The console says at startup when graphics will not be +available and why. + +### Elsewhere + +- The version gate accepts 4.6 without complaint, and warns above it. +- `build-release.ps1 -ModuleRHomes` takes the R installations to build + modules against. It cleans `Module/src` between them: `R CMD INSTALL` will + otherwise relink from object files compiled against another R, producing a + module that claims to be built for one series and behaves as another. + +## 2.4.3-r9 + +Two build-correctness fixes and a clearer refusal. Nothing in how BERT behaves +day to day changes; if r8 works for you, this is not urgent. + +### The controller only built against a hand-edited R header + +`R_ReadConsole` was declared with R 3.5's signature, `char *buf`. R 4.2 +changed that callback's buffer to `unsigned char *`, so against a stock R 4.2 +or later the assignment to `Rp->ReadConsole` does not compile. It built here +only because the R tree this repository is built against had `RStartup.h` +edited by hand to say `char *` -- which means every binary up to r8 was +compiled against a modified R header, and nobody could build the controller +from a clean checkout with an R from CRAN. + +The callback now follows whichever headers it is compiled against. Verified +against stock R 4.5.2 and stock R 4.2.2. + +### R 4.6 is refused clearly rather than attempted quietly + +The runtime version gate only compared the major version, so R 4.6 passed it +without comment and the first sign of trouble would have come later and less +clearly. It now compares the minor version too and says the version is not +supported yet. **R 4.6 is not supported**: it removed `Rf_isFrame` and changed +the ReadConsole callback signature. + +### The vcpkg baseline is pinned for every project + +`vcpkg-configuration.json`, which pins the registry baseline, sat only beside +the add-in's manifest. Building the controller or the ribbon on its own took +whatever baseline the local vcpkg defaulted to, which could resolve a protobuf +incompatible with the checked-in generated code. All three manifests now pin +the same baseline. + +### Elsewhere + +- `AddUserButton` tested `id == 0` without establishing that `id` is one + value, the same shape that stopped completion working on R 4.3. +- There is a build on GitHub Actions now: the console, and `startup.R` against + four R versions. It is what found the first two items above. + +## 2.4.3-r8 + +Found by measuring the paths that run most often: a cell function being +recalculated, and a keystroke in the console. + +### The console stopped answering when a reply was large + +Node hands the console at most 64k per read, and the reader assumed every read +held whole messages -- there was a `FIXME` saying as much. A larger reply +arrived in pieces, the first piece failed to parse, was dropped, and the rest +was read as garbage; the request it belonged to never completed, so the shell +waited for an answer that was never coming. + +It showed up as completion: a token matching 3,000 symbols answered in 26 ms, +while 4,000 hung indefinitely. The reader now keeps the remainder of a split +frame and waits for the rest. Replies of 340 kB, five reads and more, now +arrive intact in about half a second. + +### Completion offers at most 500 matches + +A list of several thousand is no use to read and made every keystroke carry a +large reply. Long lists are trimmed. + +### Completions are asked for once typing pauses + +The console asked R for completions on every keystroke, and the answer costs R +around 10 ms on an empty workspace and 28 ms on one holding 5,000 objects. A +fast typist queued one request per character. It now waits 90 ms for a pause +and asks once. + +### Release notes showed the previous version's text + +Open tabs are restored from a cache rather than re-read, which is right for a +file you are editing and wrong for the release notes: after an upgrade they +showed the notes you had already read. Rendered documents -- the notes and the +welcome page, neither of them editable here -- are now read from the file when +a tab is restored or reopened. + +### Monaco no longer loads through node's vm module + +The editor's loader took its node path in the renderer, pulling in node's `vm` +module, and Electron warned on every start that vm is unsupported there, that +crashes are likely, and that it may be removed. The loader has a switch for +this case: `preferScriptTags` keeps it on script tags. The warning is gone, +and the editor -- 92 languages, syntax colouring, undo, find -- is unchanged. + +### For the record, what the measurements showed + +A cell function costs **0.3 ms** end to end -- about 3,000 recalculations a +second; 60 cells recalculate in 24 ms. A 1,000-cell range argument costs +0.5 ms, a 20,000-cell range 3.7 ms, a 400-cell array result 0.5 ms. Console +evaluation round trips take 0.2-0.5 ms, and printing costs about 0.25 ms a +line with no slowdown as the scrollback fills. Functions are registered +non-volatile, so Excel recalculates them only when their inputs change. + +Before r7 every cell function took **1,012 ms**, all of it a stray `Sleep`. + +## 2.4.3-r7 + +### Excel froze whenever R called back into it + +Any spreadsheet function that called back into Excel deadlocked: Excel showed +"Calculating" and stopped responding, R sat idle, and neither recovered. That +took out **R graphics entirely**, since the graphics device asks Excel which +cell it was called from and how big its shape is. + +The add-in decides where to handle a callback by testing an event: signaled +means "a console call, switch context through COM", unsignaled means "the main +thread is blocked in a spreadsheet call, hand it over". The event was only +cleared a second after the call was sent (there was a leftover `Sleep(1000)`), +but R answers in about a millisecond, so callbacks were pushed through COM into +an Excel that was mid-calculation and could never service them. + +The add-in now records Excel's main thread when it loads, clears the event +before the call goes out rather than after, and drops the sleep. Which branch a +callback takes is decided by the thread that made the call instead of by +timing. Verified with the worked example from +[bert-toolkit.com/r-graphics-in-excel](https://bert-toolkit.com/r-graphics-in-excel): +cell-linked and named devices, rotated text, transparency, rasters and UTF-8 +labels all draw, and console callbacks still round-trip. + +This is upstream code, untouched by the R 4.x work; it would have affected +anyone using `xlfCaller` or graphics from a cell. + +### Console autocomplete broke on R 4.3 and later + +`startup.R` compared a whole vector in `if (n == "" || ...)`. R has rejected a +length-2 condition since 4.3, so asking for a function's arguments printed +`'length = 2' in coercion to 'logical(1)'` into the shell. Now compares `n[1]`, +which is what the surrounding code already assumes and what R before 4.2 did +implicitly — same results on 3.5.0, 4.2.2 and 4.5.2. + +### Closing a modified file asks first + +Closing an edited file discarded the changes without a word; the source had +carried a `FIXME: warn if dirty` since 2018. It now offers Save, Don't Save or +Cancel, from the File menu and from the tab's close button alike. Saving can +fail (an unnamed file opens Save As, which you can cancel), and the file stays +open when it does. Close All and Close Others ask one file at a time and stop +at the first file you keep. + +### Console completion degrades instead of erroring + +The completion code borrows R's internal machinery — `utils:::.CompletionEnv`, +`.win32consoleCompletion` and a dozen more — which is not public API and +carries no promise between versions. Both entry points now sit behind a single +`tryCatch`, so a future R that renames or reshapes one of those costs you the +argument hints rather than printing an error into the shell on every keystroke. +One wrapper each, not one per candidate: measured at about five microseconds +against the eight milliseconds the completion search itself takes. + +### Other fixes + +- The console came back blank when you opened it a second time from the ribbon + in the same session. It is now shown and restored rather than recreated, and + restarted if the process has gone. +- Install Packages stalled on "loading packages" after you picked a mirror: the + package list URL was built wrongly for repositories given as a list, and the + failure was silent. The list also now reads as two fixed columns, name and + description. +- The package list kept scrolling after the mouse wheel stopped, to the end of + the list, because Chromium's scroll anchoring fought the virtual list. +- An alert that opened while another was fading out was hidden by the fade, + leaving a dialog nobody could answer. Alert buttons are also spaced now, so + three answers no longer read as one run of words. +- Release notes (this file) are shipped and shown in the console, which + previously offered only the generic welcome page. +- `DebugOut` can be compiled into a release build with `BERT_TRACE`, and the + callback handshake has named trace points, so a stall in the field can be + traced with a debug-output viewer instead of guesswork. + +## 2.4.3-r6 + +- **Function help in the formula bar.** Typing `=R.YourFunction(` shows the + function's arguments, a description of the function and of the argument you + are on, taken from `attr(f, "description")` in your R code. Excel gives + add-ins no way to draw that tooltip itself, so the add-in writes an + Excel-DNA IntelliSense file and the installer offers the IntelliSense add-in + as an optional component, off by default. See `docs/FUNCTION-HELP.md`. +- Single-string `description` attributes were dropped when registering + functions; only the vector form was read. Both work now, and feed Excel's + Insert Function and Function Arguments dialogs. +- The installer registers and unregisters the help add-ins itself, filling the + first free slot in Excel's add-in list and closing the gap on removal. +- R detection widened: per-user and per-machine registry entries, per-version + subkeys, then Program Files, keeping the newest. It only warns when it finds + no R, or nothing newer than 4.2. +- Cut, copy and paste work again in the editor, from the keyboard, the context + menu and the Edit menu. Monaco 0.56 registers no clipboard actions of its + own, and Electron 44 has no renderer clipboard module. + +## 2.4.3-r5 + +- Protobuf and its dependencies are linked statically. The r4 binaries needed + the Visual C++ redistributable, so on a machine without it the add-in failed + to load: every function gave `#NAME?` and the console never appeared. The + shipped binaries now import only system DLLs. + +**2.4.3-r4 was withdrawn** for the fault above. + +## 2.4.3-r4 + +First release of this fork. + +- **Works with current R.** One `ControlR.exe` built against R 4.5.2, with a + runtime version gate (floor 3.5) instead of a hard-coded 3.5 test. R is no + longer bundled; the installer finds the R you have. +- **Unicode end to end.** The controller runs with the UTF-8 code page, picks + its console encoding at runtime from the hosted R version (R 4.2 changed + what R hands over), converts strings explicitly rather than assuming the + native code page, and sends console text by length instead of relying on a + terminator. `x <- "café"; nchar(x)` gives 4, and text survives the round trip + between a cell, R and the console. +- **Current toolchain.** v145 toolset, protobuf 5.29 (C++) and 3.21 + (JavaScript), vcpkg manifest mode, ARM64EC configurations that link. +- **Current console.** Electron 44, TypeScript 7, Monaco 0.56, xterm 6, rxjs 7, + chokidar 4, built with npm. +- **64-bit installer** that installs over an existing BERT 2 without touching + `bert-config.json`, `user-stylesheet.less` or `Documents\BERT2`. +- The update check no longer points development builds at upstream's 2.4.4 + download page. +- Package names from CRAN no longer carry markup into the console. +- `docs/BUILDING.md` and `docs/MODERNISATION.md` describe the build, the R + version policy and what is still outstanding. + +## 2.4.4 and earlier + +See the [upstream project](https://github.com/sdllc/Basic-Excel-R-Toolkit) and +[bert-toolkit.com](https://bert-toolkit.com). diff --git a/Console/.gitignore b/Console/.gitignore index 0f3ebe29..61e2c59e 100644 --- a/Console/.gitignore +++ b/Console/.gitignore @@ -2,3 +2,4 @@ node_modules build dist test + diff --git a/Console/data/constants.json b/Console/data/constants.json index dc4a4402..de69864e 100644 --- a/Console/data/constants.json +++ b/Console/data/constants.json @@ -16,12 +16,17 @@ "untitled": "Untitled", "preferences": "Preferences", "userStylesheet": "User Stylesheet", - "welcome": "Welcome" + "welcome": "Welcome", + "releaseNotes": "Release Notes" }, "editorCommands": { "executeBuffer": "Execute Entire Buffer", - "executeSelection": "Execute Selection" + "executeSelection": "Execute Selection", + "cut": "Cut", + "copy": "Copy", + "paste": "Paste", + "selectAll": "Select All" }, "shell": { @@ -39,10 +44,19 @@ "pleaseWait": "Loading mirror list, please wait...", "setRepo": "Set CRAN repo to #" }, + "closeUnsaved": { + "title": "Unsaved changes", + "message": "$FILE has changes you have not saved.", + "save": "Save", + "discard": "Don't Save", + "cancel": "Cancel" + }, + "selectPackages": { "selectPackagesTitle": "Select Packages", "selectPackages": "Select Packages:", - "pleaseWait": "Loading package list, please wait...", + "pleaseWait": "Loading package list, please wait...", + "loadFailed": "Could not load the package list. Check your connection, or choose a different mirror.", "pleaseWaitInstalled": "Checking installed packages, please wait...", "installed": "installed", "filter": "Filter", diff --git a/Console/generated/variable_pb.js b/Console/generated/variable_pb.js index afeefd76..8aa822a0 100644 --- a/Console/generated/variable_pb.js +++ b/Console/generated/variable_pb.js @@ -1,18 +1,29 @@ +// source: variable.proto /** * @fileoverview * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. * @suppress {messageConventions} JS Compiler reports an error if a variable or * field starts with 'MSG_' and isn't a translatable message. * @public */ // GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); +var global = + (typeof globalThis !== 'undefined' && globalThis) || + (typeof window !== 'undefined' && window) || + (typeof global !== 'undefined' && global) || + (typeof self !== 'undefined' && self) || + (function () { return this; }).call(null) || + Function('return this')(); goog.exportSymbol('proto.BERTBuffers.Array', null, global); goog.exportSymbol('proto.BERTBuffers.CallResponse', null, global); +goog.exportSymbol('proto.BERTBuffers.CallResponse.OperationCase', null, global); goog.exportSymbol('proto.BERTBuffers.CallTarget', null, global); goog.exportSymbol('proto.BERTBuffers.CallType', null, global); goog.exportSymbol('proto.BERTBuffers.Code', null, global); @@ -20,6 +31,7 @@ goog.exportSymbol('proto.BERTBuffers.Color', null, global); goog.exportSymbol('proto.BERTBuffers.Complex', null, global); goog.exportSymbol('proto.BERTBuffers.CompositeFunctionCall', null, global); goog.exportSymbol('proto.BERTBuffers.Console', null, global); +goog.exportSymbol('proto.BERTBuffers.Console.MessageCase', null, global); goog.exportSymbol('proto.BERTBuffers.EnumType', null, global); goog.exportSymbol('proto.BERTBuffers.EnumValue', null, global); goog.exportSymbol('proto.BERTBuffers.Error', null, global); @@ -35,7 +47,7 @@ goog.exportSymbol('proto.BERTBuffers.GraphicsUpdateCommand', null, global); goog.exportSymbol('proto.BERTBuffers.MIMEData', null, global); goog.exportSymbol('proto.BERTBuffers.SheetReference', null, global); goog.exportSymbol('proto.BERTBuffers.Variable', null, global); - +goog.exportSymbol('proto.BERTBuffers.Variable.ValueCase', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -51,19 +63,425 @@ proto.BERTBuffers.Complex = function(opt_data) { }; goog.inherits(proto.BERTBuffers.Complex, jspb.Message); if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ proto.BERTBuffers.Complex.displayName = 'proto.BERTBuffers.Complex'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.Array = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.Array.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.Array, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.Array.displayName = 'proto.BERTBuffers.Array'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.Error = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.Error, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.Error.displayName = 'proto.BERTBuffers.Error'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.SheetReference = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.SheetReference, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.SheetReference.displayName = 'proto.BERTBuffers.SheetReference'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.Variable = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.BERTBuffers.Variable.oneofGroups_); +}; +goog.inherits(proto.BERTBuffers.Variable, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.Variable.displayName = 'proto.BERTBuffers.Variable'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.Code = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.Code.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.Code, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.Code.displayName = 'proto.BERTBuffers.Code'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.CompositeFunctionCall = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.CompositeFunctionCall.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.CompositeFunctionCall, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.CompositeFunctionCall.displayName = 'proto.BERTBuffers.CompositeFunctionCall'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.GraphicsUpdate = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.GraphicsUpdate, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.GraphicsUpdate.displayName = 'proto.BERTBuffers.GraphicsUpdate'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.GraphicsCommand = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.GraphicsCommand.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.GraphicsCommand, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.GraphicsCommand.displayName = 'proto.BERTBuffers.GraphicsCommand'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.Color = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.Color, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.Color.displayName = 'proto.BERTBuffers.Color'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.GraphicsContext = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.GraphicsContext, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.GraphicsContext.displayName = 'proto.BERTBuffers.GraphicsContext'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.MIMEData = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.MIMEData, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.MIMEData.displayName = 'proto.BERTBuffers.MIMEData'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.Console = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.BERTBuffers.Console.oneofGroups_); +}; +goog.inherits(proto.BERTBuffers.Console, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.Console.displayName = 'proto.BERTBuffers.Console'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.FunctionElement = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.FunctionElement, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.FunctionElement.displayName = 'proto.BERTBuffers.FunctionElement'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.FunctionDescriptor = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.FunctionDescriptor.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.FunctionDescriptor, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.FunctionDescriptor.displayName = 'proto.BERTBuffers.FunctionDescriptor'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.FunctionList = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.FunctionList.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.FunctionList, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.FunctionList.displayName = 'proto.BERTBuffers.FunctionList'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.EnumValue = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.BERTBuffers.EnumValue, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.EnumValue.displayName = 'proto.BERTBuffers.EnumValue'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.EnumType = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.EnumType.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.EnumType, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.EnumType.displayName = 'proto.BERTBuffers.EnumType'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.ExternalPointer = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.ExternalPointer.repeatedFields_, null); +}; +goog.inherits(proto.BERTBuffers.ExternalPointer, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.ExternalPointer.displayName = 'proto.BERTBuffers.ExternalPointer'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.BERTBuffers.CallResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.BERTBuffers.CallResponse.oneofGroups_); +}; +goog.inherits(proto.BERTBuffers.CallResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.BERTBuffers.CallResponse.displayName = 'proto.BERTBuffers.CallResponse'; +} + if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.Complex.prototype.toObject = function(opt_includeInstance) { @@ -73,8 +491,8 @@ proto.BERTBuffers.Complex.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.Complex} msg The msg instance to transform. * @return {!Object} @@ -82,8 +500,8 @@ proto.BERTBuffers.Complex.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.Complex.toObject = function(includeInstance, msg) { var f, obj = { - r: +jspb.Message.getFieldWithDefault(msg, 1, 0.0), - i: +jspb.Message.getFieldWithDefault(msg, 2, 0.0) +r: jspb.Message.getFloatingPointFieldWithDefault(msg, 1, 0.0), +i: jspb.Message.getFloatingPointFieldWithDefault(msg, 2, 0.0) }; if (includeInstance) { @@ -179,13 +597,16 @@ proto.BERTBuffers.Complex.serializeBinaryToWriter = function(message, writer) { * @return {number} */ proto.BERTBuffers.Complex.prototype.getR = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 1, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 1, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Complex} returns this + */ proto.BERTBuffers.Complex.prototype.setR = function(value) { - jspb.Message.setProto3FloatField(this, 1, value); + return jspb.Message.setProto3FloatField(this, 1, value); }; @@ -194,34 +615,20 @@ proto.BERTBuffers.Complex.prototype.setR = function(value) { * @return {number} */ proto.BERTBuffers.Complex.prototype.getI = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 2, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 2, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Complex} returns this + */ proto.BERTBuffers.Complex.prototype.setI = function(value) { - jspb.Message.setProto3FloatField(this, 2, value); + return jspb.Message.setProto3FloatField(this, 2, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.Array = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.Array.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.Array, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.Array.displayName = 'proto.BERTBuffers.Array'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -233,13 +640,15 @@ proto.BERTBuffers.Array.repeatedFields_ = [3,4,5]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.Array.prototype.toObject = function(opt_includeInstance) { @@ -249,8 +658,8 @@ proto.BERTBuffers.Array.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.Array} msg The msg instance to transform. * @return {!Object} @@ -258,12 +667,12 @@ proto.BERTBuffers.Array.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.Array.toObject = function(includeInstance, msg) { var f, obj = { - rows: jspb.Message.getFieldWithDefault(msg, 1, 0), - cols: jspb.Message.getFieldWithDefault(msg, 2, 0), - dataList: jspb.Message.toObjectList(msg.getDataList(), +rows: jspb.Message.getFieldWithDefault(msg, 1, 0), +cols: jspb.Message.getFieldWithDefault(msg, 2, 0), +dataList: jspb.Message.toObjectList(msg.getDataList(), proto.BERTBuffers.Variable.toObject, includeInstance), - rownamesList: jspb.Message.getRepeatedField(msg, 4), - colnamesList: jspb.Message.getRepeatedField(msg, 5) +rownamesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, +colnamesList: (f = jspb.Message.getRepeatedField(msg, 5)) == null ? undefined : f }; if (includeInstance) { @@ -398,9 +807,12 @@ proto.BERTBuffers.Array.prototype.getRows = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Array} returns this + */ proto.BERTBuffers.Array.prototype.setRows = function(value) { - jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setProto3IntField(this, 1, value); }; @@ -413,25 +825,31 @@ proto.BERTBuffers.Array.prototype.getCols = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Array} returns this + */ proto.BERTBuffers.Array.prototype.setCols = function(value) { - jspb.Message.setProto3IntField(this, 2, value); + return jspb.Message.setProto3IntField(this, 2, value); }; /** * repeated Variable data = 3; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.Array.prototype.getDataList = function() { - return /** @type{!Array.} */ ( + return /** @type{!Array} */ ( jspb.Message.getRepeatedWrapperField(this, proto.BERTBuffers.Variable, 3)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.Array} returns this +*/ proto.BERTBuffers.Array.prototype.setDataList = function(value) { - jspb.Message.setRepeatedWrapperField(this, 3, value); + return jspb.Message.setRepeatedWrapperField(this, 3, value); }; @@ -445,98 +863,103 @@ proto.BERTBuffers.Array.prototype.addData = function(opt_value, opt_index) { }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.Array} returns this + */ proto.BERTBuffers.Array.prototype.clearDataList = function() { - this.setDataList([]); + return this.setDataList([]); }; /** * repeated string rownames = 4; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.Array.prototype.getRownamesList = function() { - return /** @type {!Array.} */ (jspb.Message.getRepeatedField(this, 4)); + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 4)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.Array} returns this + */ proto.BERTBuffers.Array.prototype.setRownamesList = function(value) { - jspb.Message.setField(this, 4, value || []); + return jspb.Message.setField(this, 4, value || []); }; /** - * @param {!string} value + * @param {string} value * @param {number=} opt_index + * @return {!proto.BERTBuffers.Array} returns this */ proto.BERTBuffers.Array.prototype.addRownames = function(value, opt_index) { - jspb.Message.addToRepeatedField(this, 4, value, opt_index); + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.Array} returns this + */ proto.BERTBuffers.Array.prototype.clearRownamesList = function() { - this.setRownamesList([]); + return this.setRownamesList([]); }; /** * repeated string colnames = 5; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.Array.prototype.getColnamesList = function() { - return /** @type {!Array.} */ (jspb.Message.getRepeatedField(this, 5)); + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 5)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.Array} returns this + */ proto.BERTBuffers.Array.prototype.setColnamesList = function(value) { - jspb.Message.setField(this, 5, value || []); + return jspb.Message.setField(this, 5, value || []); }; /** - * @param {!string} value + * @param {string} value * @param {number=} opt_index + * @return {!proto.BERTBuffers.Array} returns this */ proto.BERTBuffers.Array.prototype.addColnames = function(value, opt_index) { - jspb.Message.addToRepeatedField(this, 5, value, opt_index); + return jspb.Message.addToRepeatedField(this, 5, value, opt_index); }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.Array} returns this + */ proto.BERTBuffers.Array.prototype.clearColnamesList = function() { - this.setColnamesList([]); + return this.setColnamesList([]); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.Error = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.Error, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.Error.displayName = 'proto.BERTBuffers.Error'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.Error.prototype.toObject = function(opt_includeInstance) { @@ -546,8 +969,8 @@ proto.BERTBuffers.Error.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.Error} msg The msg instance to transform. * @return {!Object} @@ -555,8 +978,8 @@ proto.BERTBuffers.Error.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.Error.toObject = function(includeInstance, msg) { var f, obj = { - type: jspb.Message.getFieldWithDefault(msg, 1, 0), - message: jspb.Message.getFieldWithDefault(msg, 2, "") +type: jspb.Message.getFieldWithDefault(msg, 1, 0), +message: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -656,9 +1079,12 @@ proto.BERTBuffers.Error.prototype.getType = function() { }; -/** @param {!proto.BERTBuffers.ErrorType} value */ +/** + * @param {!proto.BERTBuffers.ErrorType} value + * @return {!proto.BERTBuffers.Error} returns this + */ proto.BERTBuffers.Error.prototype.setType = function(value) { - jspb.Message.setProto3EnumField(this, 1, value); + return jspb.Message.setProto3EnumField(this, 1, value); }; @@ -671,41 +1097,29 @@ proto.BERTBuffers.Error.prototype.getMessage = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.Error} returns this + */ proto.BERTBuffers.Error.prototype.setMessage = function(value) { - jspb.Message.setProto3StringField(this, 2, value); + return jspb.Message.setProto3StringField(this, 2, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.SheetReference = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.SheetReference, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.SheetReference.displayName = 'proto.BERTBuffers.SheetReference'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.SheetReference.prototype.toObject = function(opt_includeInstance) { @@ -715,8 +1129,8 @@ proto.BERTBuffers.SheetReference.prototype.toObject = function(opt_includeInstan /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.SheetReference} msg The msg instance to transform. * @return {!Object} @@ -724,11 +1138,11 @@ proto.BERTBuffers.SheetReference.prototype.toObject = function(opt_includeInstan */ proto.BERTBuffers.SheetReference.toObject = function(includeInstance, msg) { var f, obj = { - startRow: jspb.Message.getFieldWithDefault(msg, 1, 0), - startColumn: jspb.Message.getFieldWithDefault(msg, 2, 0), - endRow: jspb.Message.getFieldWithDefault(msg, 3, 0), - endColumn: jspb.Message.getFieldWithDefault(msg, 4, 0), - sheetId: jspb.Message.getFieldWithDefault(msg, 5, 0) +startRow: jspb.Message.getFieldWithDefault(msg, 1, 0), +startColumn: jspb.Message.getFieldWithDefault(msg, 2, 0), +endRow: jspb.Message.getFieldWithDefault(msg, 3, 0), +endColumn: jspb.Message.getFieldWithDefault(msg, 4, 0), +sheetId: jspb.Message.getFieldWithDefault(msg, 5, 0) }; if (includeInstance) { @@ -861,9 +1275,12 @@ proto.BERTBuffers.SheetReference.prototype.getStartRow = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.SheetReference} returns this + */ proto.BERTBuffers.SheetReference.prototype.setStartRow = function(value) { - jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setProto3IntField(this, 1, value); }; @@ -876,9 +1293,12 @@ proto.BERTBuffers.SheetReference.prototype.getStartColumn = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.SheetReference} returns this + */ proto.BERTBuffers.SheetReference.prototype.setStartColumn = function(value) { - jspb.Message.setProto3IntField(this, 2, value); + return jspb.Message.setProto3IntField(this, 2, value); }; @@ -891,9 +1311,12 @@ proto.BERTBuffers.SheetReference.prototype.getEndRow = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.SheetReference} returns this + */ proto.BERTBuffers.SheetReference.prototype.setEndRow = function(value) { - jspb.Message.setProto3IntField(this, 3, value); + return jspb.Message.setProto3IntField(this, 3, value); }; @@ -906,9 +1329,12 @@ proto.BERTBuffers.SheetReference.prototype.getEndColumn = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.SheetReference} returns this + */ proto.BERTBuffers.SheetReference.prototype.setEndColumn = function(value) { - jspb.Message.setProto3IntField(this, 4, value); + return jspb.Message.setProto3IntField(this, 4, value); }; @@ -921,30 +1347,16 @@ proto.BERTBuffers.SheetReference.prototype.getSheetId = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.SheetReference} returns this + */ proto.BERTBuffers.SheetReference.prototype.setSheetId = function(value) { - jspb.Message.setProto3IntField(this, 5, value); + return jspb.Message.setProto3IntField(this, 5, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.Variable = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.BERTBuffers.Variable.oneofGroups_); -}; -goog.inherits(proto.BERTBuffers.Variable, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.Variable.displayName = 'proto.BERTBuffers.Variable'; -} /** * Oneof group definitions for this message. Each group defines the field * numbers belonging to that group. When of these fields' value is set, all @@ -986,13 +1398,15 @@ proto.BERTBuffers.Variable.prototype.getValueCase = function() { if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.Variable.prototype.toObject = function(opt_includeInstance) { @@ -1002,8 +1416,8 @@ proto.BERTBuffers.Variable.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.Variable} msg The msg instance to transform. * @return {!Object} @@ -1011,20 +1425,20 @@ proto.BERTBuffers.Variable.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.Variable.toObject = function(includeInstance, msg) { var f, obj = { - nil: jspb.Message.getFieldWithDefault(msg, 1, false), - missing: jspb.Message.getFieldWithDefault(msg, 2, false), - err: (f = msg.getErr()) && proto.BERTBuffers.Error.toObject(includeInstance, f), - integer: jspb.Message.getFieldWithDefault(msg, 5, 0), - real: +jspb.Message.getFieldWithDefault(msg, 6, 0.0), - str: jspb.Message.getFieldWithDefault(msg, 7, ""), - pb_boolean: jspb.Message.getFieldWithDefault(msg, 8, false), - cpx: (f = msg.getCpx()) && proto.BERTBuffers.Complex.toObject(includeInstance, f), - arr: (f = msg.getArr()) && proto.BERTBuffers.Array.toObject(includeInstance, f), - ref: (f = msg.getRef()) && proto.BERTBuffers.SheetReference.toObject(includeInstance, f), - comPointer: (f = msg.getComPointer()) && proto.BERTBuffers.ExternalPointer.toObject(includeInstance, f), - graphics: (f = msg.getGraphics()) && proto.BERTBuffers.GraphicsUpdate.toObject(includeInstance, f), - cacheReference: jspb.Message.getFieldWithDefault(msg, 14, 0), - name: jspb.Message.getFieldWithDefault(msg, 15, "") +nil: (f = jspb.Message.getBooleanField(msg, 1)) == null ? undefined : f, +missing: (f = jspb.Message.getBooleanField(msg, 2)) == null ? undefined : f, +err: (f = msg.getErr()) && proto.BERTBuffers.Error.toObject(includeInstance, f), +integer: (f = jspb.Message.getField(msg, 5)) == null ? undefined : f, +real: (f = jspb.Message.getOptionalFloatingPointField(msg, 6)) == null ? undefined : f, +str: (f = jspb.Message.getField(msg, 7)) == null ? undefined : f, +pb_boolean: (f = jspb.Message.getBooleanField(msg, 8)) == null ? undefined : f, +cpx: (f = msg.getCpx()) && proto.BERTBuffers.Complex.toObject(includeInstance, f), +arr: (f = msg.getArr()) && proto.BERTBuffers.Array.toObject(includeInstance, f), +ref: (f = msg.getRef()) && proto.BERTBuffers.SheetReference.toObject(includeInstance, f), +comPointer: (f = msg.getComPointer()) && proto.BERTBuffers.ExternalPointer.toObject(includeInstance, f), +graphics: (f = msg.getGraphics()) && proto.BERTBuffers.GraphicsUpdate.toObject(includeInstance, f), +cacheReference: (f = jspb.Message.getField(msg, 14)) == null ? undefined : f, +name: jspb.Message.getFieldWithDefault(msg, 15, "") }; if (includeInstance) { @@ -1261,29 +1675,34 @@ proto.BERTBuffers.Variable.serializeBinaryToWriter = function(message, writer) { /** * optional bool nil = 1; - * Note that Boolean fields may be set to 0/1 when serialized from a Java server. - * You should avoid comparisons like {@code val === true/false} in those cases. * @return {boolean} */ proto.BERTBuffers.Variable.prototype.getNil = function() { - return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 1, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; -/** @param {boolean} value */ +/** + * @param {boolean} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setNil = function(value) { - jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearNil = function() { - jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasNil = function() { return jspb.Message.getField(this, 1) != null; @@ -1292,29 +1711,34 @@ proto.BERTBuffers.Variable.prototype.hasNil = function() { /** * optional bool missing = 2; - * Note that Boolean fields may be set to 0/1 when serialized from a Java server. - * You should avoid comparisons like {@code val === true/false} in those cases. * @return {boolean} */ proto.BERTBuffers.Variable.prototype.getMissing = function() { - return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 2, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; -/** @param {boolean} value */ +/** + * @param {boolean} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setMissing = function(value) { - jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearMissing = function() { - jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasMissing = function() { return jspb.Message.getField(this, 2) != null; @@ -1331,20 +1755,27 @@ proto.BERTBuffers.Variable.prototype.getErr = function() { }; -/** @param {?proto.BERTBuffers.Error|undefined} value */ +/** + * @param {?proto.BERTBuffers.Error|undefined} value + * @return {!proto.BERTBuffers.Variable} returns this +*/ proto.BERTBuffers.Variable.prototype.setErr = function(value) { - jspb.Message.setOneofWrapperField(this, 3, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 3, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearErr = function() { - this.setErr(undefined); + return this.setErr(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasErr = function() { return jspb.Message.getField(this, 3) != null; @@ -1360,20 +1791,27 @@ proto.BERTBuffers.Variable.prototype.getInteger = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setInteger = function(value) { - jspb.Message.setOneofField(this, 5, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 5, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearInteger = function() { - jspb.Message.setOneofField(this, 5, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 5, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasInteger = function() { return jspb.Message.getField(this, 5) != null; @@ -1385,24 +1823,31 @@ proto.BERTBuffers.Variable.prototype.hasInteger = function() { * @return {number} */ proto.BERTBuffers.Variable.prototype.getReal = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 6, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 6, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setReal = function(value) { - jspb.Message.setOneofField(this, 6, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 6, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearReal = function() { - jspb.Message.setOneofField(this, 6, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 6, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasReal = function() { return jspb.Message.getField(this, 6) != null; @@ -1418,20 +1863,27 @@ proto.BERTBuffers.Variable.prototype.getStr = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setStr = function(value) { - jspb.Message.setOneofField(this, 7, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 7, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearStr = function() { - jspb.Message.setOneofField(this, 7, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 7, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasStr = function() { return jspb.Message.getField(this, 7) != null; @@ -1440,29 +1892,34 @@ proto.BERTBuffers.Variable.prototype.hasStr = function() { /** * optional bool boolean = 8; - * Note that Boolean fields may be set to 0/1 when serialized from a Java server. - * You should avoid comparisons like {@code val === true/false} in those cases. * @return {boolean} */ proto.BERTBuffers.Variable.prototype.getBoolean = function() { - return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 8, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; -/** @param {boolean} value */ +/** + * @param {boolean} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setBoolean = function(value) { - jspb.Message.setOneofField(this, 8, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 8, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearBoolean = function() { - jspb.Message.setOneofField(this, 8, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 8, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasBoolean = function() { return jspb.Message.getField(this, 8) != null; @@ -1479,20 +1936,27 @@ proto.BERTBuffers.Variable.prototype.getCpx = function() { }; -/** @param {?proto.BERTBuffers.Complex|undefined} value */ +/** + * @param {?proto.BERTBuffers.Complex|undefined} value + * @return {!proto.BERTBuffers.Variable} returns this +*/ proto.BERTBuffers.Variable.prototype.setCpx = function(value) { - jspb.Message.setOneofWrapperField(this, 9, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 9, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearCpx = function() { - this.setCpx(undefined); + return this.setCpx(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasCpx = function() { return jspb.Message.getField(this, 9) != null; @@ -1509,20 +1973,27 @@ proto.BERTBuffers.Variable.prototype.getArr = function() { }; -/** @param {?proto.BERTBuffers.Array|undefined} value */ +/** + * @param {?proto.BERTBuffers.Array|undefined} value + * @return {!proto.BERTBuffers.Variable} returns this +*/ proto.BERTBuffers.Variable.prototype.setArr = function(value) { - jspb.Message.setOneofWrapperField(this, 10, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 10, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearArr = function() { - this.setArr(undefined); + return this.setArr(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasArr = function() { return jspb.Message.getField(this, 10) != null; @@ -1539,20 +2010,27 @@ proto.BERTBuffers.Variable.prototype.getRef = function() { }; -/** @param {?proto.BERTBuffers.SheetReference|undefined} value */ +/** + * @param {?proto.BERTBuffers.SheetReference|undefined} value + * @return {!proto.BERTBuffers.Variable} returns this +*/ proto.BERTBuffers.Variable.prototype.setRef = function(value) { - jspb.Message.setOneofWrapperField(this, 11, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 11, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearRef = function() { - this.setRef(undefined); + return this.setRef(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasRef = function() { return jspb.Message.getField(this, 11) != null; @@ -1569,20 +2047,27 @@ proto.BERTBuffers.Variable.prototype.getComPointer = function() { }; -/** @param {?proto.BERTBuffers.ExternalPointer|undefined} value */ +/** + * @param {?proto.BERTBuffers.ExternalPointer|undefined} value + * @return {!proto.BERTBuffers.Variable} returns this +*/ proto.BERTBuffers.Variable.prototype.setComPointer = function(value) { - jspb.Message.setOneofWrapperField(this, 12, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 12, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearComPointer = function() { - this.setComPointer(undefined); + return this.setComPointer(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasComPointer = function() { return jspb.Message.getField(this, 12) != null; @@ -1599,20 +2084,27 @@ proto.BERTBuffers.Variable.prototype.getGraphics = function() { }; -/** @param {?proto.BERTBuffers.GraphicsUpdate|undefined} value */ +/** + * @param {?proto.BERTBuffers.GraphicsUpdate|undefined} value + * @return {!proto.BERTBuffers.Variable} returns this +*/ proto.BERTBuffers.Variable.prototype.setGraphics = function(value) { - jspb.Message.setOneofWrapperField(this, 13, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 13, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearGraphics = function() { - this.setGraphics(undefined); + return this.setGraphics(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasGraphics = function() { return jspb.Message.getField(this, 13) != null; @@ -1628,20 +2120,27 @@ proto.BERTBuffers.Variable.prototype.getCacheReference = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setCacheReference = function(value) { - jspb.Message.setOneofField(this, 14, proto.BERTBuffers.Variable.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 14, proto.BERTBuffers.Variable.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.clearCacheReference = function() { - jspb.Message.setOneofField(this, 14, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 14, proto.BERTBuffers.Variable.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Variable.prototype.hasCacheReference = function() { return jspb.Message.getField(this, 14) != null; @@ -1657,30 +2156,16 @@ proto.BERTBuffers.Variable.prototype.getName = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.Variable} returns this + */ proto.BERTBuffers.Variable.prototype.setName = function(value) { - jspb.Message.setProto3StringField(this, 15, value); + return jspb.Message.setProto3StringField(this, 15, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.Code = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.Code.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.Code, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.Code.displayName = 'proto.BERTBuffers.Code'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -1692,13 +2177,15 @@ proto.BERTBuffers.Code.repeatedFields_ = [1]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.Code.prototype.toObject = function(opt_includeInstance) { @@ -1708,8 +2195,8 @@ proto.BERTBuffers.Code.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.Code} msg The msg instance to transform. * @return {!Object} @@ -1717,8 +2204,8 @@ proto.BERTBuffers.Code.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.Code.toObject = function(includeInstance, msg) { var f, obj = { - lineList: jspb.Message.getRepeatedField(msg, 1), - startup: jspb.Message.getFieldWithDefault(msg, 2, false) +lineList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f, +startup: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -1811,68 +2298,60 @@ proto.BERTBuffers.Code.serializeBinaryToWriter = function(message, writer) { /** * repeated string line = 1; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.Code.prototype.getLineList = function() { - return /** @type {!Array.} */ (jspb.Message.getRepeatedField(this, 1)); + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.Code} returns this + */ proto.BERTBuffers.Code.prototype.setLineList = function(value) { - jspb.Message.setField(this, 1, value || []); + return jspb.Message.setField(this, 1, value || []); }; /** - * @param {!string} value + * @param {string} value * @param {number=} opt_index + * @return {!proto.BERTBuffers.Code} returns this */ proto.BERTBuffers.Code.prototype.addLine = function(value, opt_index) { - jspb.Message.addToRepeatedField(this, 1, value, opt_index); + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.Code} returns this + */ proto.BERTBuffers.Code.prototype.clearLineList = function() { - this.setLineList([]); + return this.setLineList([]); }; /** * optional bool startup = 2; - * Note that Boolean fields may be set to 0/1 when serialized from a Java server. - * You should avoid comparisons like {@code val === true/false} in those cases. * @return {boolean} */ proto.BERTBuffers.Code.prototype.getStartup = function() { - return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 2, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; -/** @param {boolean} value */ +/** + * @param {boolean} value + * @return {!proto.BERTBuffers.Code} returns this + */ proto.BERTBuffers.Code.prototype.setStartup = function(value) { - jspb.Message.setProto3BooleanField(this, 2, value); + return jspb.Message.setProto3BooleanField(this, 2, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.CompositeFunctionCall = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.CompositeFunctionCall.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.CompositeFunctionCall, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.CompositeFunctionCall.displayName = 'proto.BERTBuffers.CompositeFunctionCall'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -1884,13 +2363,15 @@ proto.BERTBuffers.CompositeFunctionCall.repeatedFields_ = [2]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.CompositeFunctionCall.prototype.toObject = function(opt_includeInstance) { @@ -1900,8 +2381,8 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.toObject = function(opt_includ /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.CompositeFunctionCall} msg The msg instance to transform. * @return {!Object} @@ -1909,14 +2390,14 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.toObject = function(opt_includ */ proto.BERTBuffers.CompositeFunctionCall.toObject = function(includeInstance, msg) { var f, obj = { - pb_function: jspb.Message.getFieldWithDefault(msg, 1, ""), - argumentsList: jspb.Message.toObjectList(msg.getArgumentsList(), +pb_function: jspb.Message.getFieldWithDefault(msg, 1, ""), +argumentsList: jspb.Message.toObjectList(msg.getArgumentsList(), proto.BERTBuffers.Variable.toObject, includeInstance), - pointer: jspb.Message.getFieldWithDefault(msg, 3, 0), - index: jspb.Message.getFieldWithDefault(msg, 4, 0), - type: jspb.Message.getFieldWithDefault(msg, 5, 0), - target: jspb.Message.getFieldWithDefault(msg, 6, 0), - flags: jspb.Message.getFieldWithDefault(msg, 7, 0) +pointer: jspb.Message.getFieldWithDefault(msg, 3, 0), +index: jspb.Message.getFieldWithDefault(msg, 4, 0), +type: jspb.Message.getFieldWithDefault(msg, 5, 0), +target: jspb.Message.getFieldWithDefault(msg, 6, 0), +flags: jspb.Message.getFieldWithDefault(msg, 7, 0) }; if (includeInstance) { @@ -2073,25 +2554,31 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.getFunction = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this + */ proto.BERTBuffers.CompositeFunctionCall.prototype.setFunction = function(value) { - jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setProto3StringField(this, 1, value); }; /** * repeated Variable arguments = 2; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.CompositeFunctionCall.prototype.getArgumentsList = function() { - return /** @type{!Array.} */ ( + return /** @type{!Array} */ ( jspb.Message.getRepeatedWrapperField(this, proto.BERTBuffers.Variable, 2)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this +*/ proto.BERTBuffers.CompositeFunctionCall.prototype.setArgumentsList = function(value) { - jspb.Message.setRepeatedWrapperField(this, 2, value); + return jspb.Message.setRepeatedWrapperField(this, 2, value); }; @@ -2105,8 +2592,12 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.addArguments = function(opt_va }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this + */ proto.BERTBuffers.CompositeFunctionCall.prototype.clearArgumentsList = function() { - this.setArgumentsList([]); + return this.setArgumentsList([]); }; @@ -2119,9 +2610,12 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.getPointer = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this + */ proto.BERTBuffers.CompositeFunctionCall.prototype.setPointer = function(value) { - jspb.Message.setProto3IntField(this, 3, value); + return jspb.Message.setProto3IntField(this, 3, value); }; @@ -2134,9 +2628,12 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.getIndex = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this + */ proto.BERTBuffers.CompositeFunctionCall.prototype.setIndex = function(value) { - jspb.Message.setProto3IntField(this, 4, value); + return jspb.Message.setProto3IntField(this, 4, value); }; @@ -2149,9 +2646,12 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.getType = function() { }; -/** @param {!proto.BERTBuffers.CallType} value */ +/** + * @param {!proto.BERTBuffers.CallType} value + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this + */ proto.BERTBuffers.CompositeFunctionCall.prototype.setType = function(value) { - jspb.Message.setProto3EnumField(this, 5, value); + return jspb.Message.setProto3EnumField(this, 5, value); }; @@ -2164,9 +2664,12 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.getTarget = function() { }; -/** @param {!proto.BERTBuffers.CallTarget} value */ +/** + * @param {!proto.BERTBuffers.CallTarget} value + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this + */ proto.BERTBuffers.CompositeFunctionCall.prototype.setTarget = function(value) { - jspb.Message.setProto3EnumField(this, 6, value); + return jspb.Message.setProto3EnumField(this, 6, value); }; @@ -2179,41 +2682,29 @@ proto.BERTBuffers.CompositeFunctionCall.prototype.getFlags = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.CompositeFunctionCall} returns this + */ proto.BERTBuffers.CompositeFunctionCall.prototype.setFlags = function(value) { - jspb.Message.setProto3IntField(this, 7, value); + return jspb.Message.setProto3IntField(this, 7, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.GraphicsUpdate = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.GraphicsUpdate, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.GraphicsUpdate.displayName = 'proto.BERTBuffers.GraphicsUpdate'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.GraphicsUpdate.prototype.toObject = function(opt_includeInstance) { @@ -2223,8 +2714,8 @@ proto.BERTBuffers.GraphicsUpdate.prototype.toObject = function(opt_includeInstan /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.GraphicsUpdate} msg The msg instance to transform. * @return {!Object} @@ -2232,11 +2723,11 @@ proto.BERTBuffers.GraphicsUpdate.prototype.toObject = function(opt_includeInstan */ proto.BERTBuffers.GraphicsUpdate.toObject = function(includeInstance, msg) { var f, obj = { - command: jspb.Message.getFieldWithDefault(msg, 1, 0), - name: jspb.Message.getFieldWithDefault(msg, 2, ""), - path: jspb.Message.getFieldWithDefault(msg, 3, ""), - width: jspb.Message.getFieldWithDefault(msg, 4, 0), - height: jspb.Message.getFieldWithDefault(msg, 5, 0) +command: jspb.Message.getFieldWithDefault(msg, 1, 0), +name: jspb.Message.getFieldWithDefault(msg, 2, ""), +path: jspb.Message.getFieldWithDefault(msg, 3, ""), +width: jspb.Message.getFieldWithDefault(msg, 4, 0), +height: jspb.Message.getFieldWithDefault(msg, 5, 0) }; if (includeInstance) { @@ -2369,9 +2860,12 @@ proto.BERTBuffers.GraphicsUpdate.prototype.getCommand = function() { }; -/** @param {!proto.BERTBuffers.GraphicsUpdateCommand} value */ +/** + * @param {!proto.BERTBuffers.GraphicsUpdateCommand} value + * @return {!proto.BERTBuffers.GraphicsUpdate} returns this + */ proto.BERTBuffers.GraphicsUpdate.prototype.setCommand = function(value) { - jspb.Message.setProto3EnumField(this, 1, value); + return jspb.Message.setProto3EnumField(this, 1, value); }; @@ -2384,9 +2878,12 @@ proto.BERTBuffers.GraphicsUpdate.prototype.getName = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.GraphicsUpdate} returns this + */ proto.BERTBuffers.GraphicsUpdate.prototype.setName = function(value) { - jspb.Message.setProto3StringField(this, 2, value); + return jspb.Message.setProto3StringField(this, 2, value); }; @@ -2399,9 +2896,12 @@ proto.BERTBuffers.GraphicsUpdate.prototype.getPath = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.GraphicsUpdate} returns this + */ proto.BERTBuffers.GraphicsUpdate.prototype.setPath = function(value) { - jspb.Message.setProto3StringField(this, 3, value); + return jspb.Message.setProto3StringField(this, 3, value); }; @@ -2414,9 +2914,12 @@ proto.BERTBuffers.GraphicsUpdate.prototype.getWidth = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsUpdate} returns this + */ proto.BERTBuffers.GraphicsUpdate.prototype.setWidth = function(value) { - jspb.Message.setProto3IntField(this, 4, value); + return jspb.Message.setProto3IntField(this, 4, value); }; @@ -2429,30 +2932,16 @@ proto.BERTBuffers.GraphicsUpdate.prototype.getHeight = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsUpdate} returns this + */ proto.BERTBuffers.GraphicsUpdate.prototype.setHeight = function(value) { - jspb.Message.setProto3IntField(this, 5, value); + return jspb.Message.setProto3IntField(this, 5, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.GraphicsCommand = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.GraphicsCommand.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.GraphicsCommand, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.GraphicsCommand.displayName = 'proto.BERTBuffers.GraphicsCommand'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -2464,13 +2953,15 @@ proto.BERTBuffers.GraphicsCommand.repeatedFields_ = [2,3]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.GraphicsCommand.prototype.toObject = function(opt_includeInstance) { @@ -2480,8 +2971,8 @@ proto.BERTBuffers.GraphicsCommand.prototype.toObject = function(opt_includeInsta /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.GraphicsCommand} msg The msg instance to transform. * @return {!Object} @@ -2489,18 +2980,18 @@ proto.BERTBuffers.GraphicsCommand.prototype.toObject = function(opt_includeInsta */ proto.BERTBuffers.GraphicsCommand.toObject = function(includeInstance, msg) { var f, obj = { - command: jspb.Message.getFieldWithDefault(msg, 1, ""), - xList: jspb.Message.getRepeatedFloatingPointField(msg, 2), - yList: jspb.Message.getRepeatedFloatingPointField(msg, 3), - r: +jspb.Message.getFieldWithDefault(msg, 4, 0.0), - rot: +jspb.Message.getFieldWithDefault(msg, 5, 0.0), - text: jspb.Message.getFieldWithDefault(msg, 6, ""), - filled: jspb.Message.getFieldWithDefault(msg, 7, false), - hadj: +jspb.Message.getFieldWithDefault(msg, 8, 0.0), - raster: msg.getRaster_asB64(), - interpolate: jspb.Message.getFieldWithDefault(msg, 10, false), - deviceType: jspb.Message.getFieldWithDefault(msg, 14, ""), - context: (f = msg.getContext()) && proto.BERTBuffers.GraphicsContext.toObject(includeInstance, f) +command: jspb.Message.getFieldWithDefault(msg, 1, ""), +xList: (f = jspb.Message.getRepeatedFloatingPointField(msg, 2)) == null ? undefined : f, +yList: (f = jspb.Message.getRepeatedFloatingPointField(msg, 3)) == null ? undefined : f, +r: jspb.Message.getFloatingPointFieldWithDefault(msg, 4, 0.0), +rot: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0), +text: jspb.Message.getFieldWithDefault(msg, 6, ""), +filled: jspb.Message.getBooleanFieldWithDefault(msg, 7, false), +hadj: jspb.Message.getFloatingPointFieldWithDefault(msg, 8, 0.0), +raster: msg.getRaster_asB64(), +interpolate: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), +deviceType: jspb.Message.getFieldWithDefault(msg, 14, ""), +context: (f = msg.getContext()) && proto.BERTBuffers.GraphicsContext.toObject(includeInstance, f) }; if (includeInstance) { @@ -2542,12 +3033,16 @@ proto.BERTBuffers.GraphicsCommand.deserializeBinaryFromReader = function(msg, re msg.setCommand(value); break; case 2: - var value = /** @type {!Array.} */ (reader.readPackedDouble()); - msg.setXList(value); + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedDouble() : [reader.readDouble()]); + for (var i = 0; i < values.length; i++) { + msg.addX(values[i]); + } break; case 3: - var value = /** @type {!Array.} */ (reader.readPackedDouble()); - msg.setYList(value); + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedDouble() : [reader.readDouble()]); + for (var i = 0; i < values.length; i++) { + msg.addY(values[i]); + } break; case 4: var value = /** @type {number} */ (reader.readDouble()); @@ -2712,67 +3207,86 @@ proto.BERTBuffers.GraphicsCommand.prototype.getCommand = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setCommand = function(value) { - jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setProto3StringField(this, 1, value); }; /** * repeated double x = 2; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.GraphicsCommand.prototype.getXList = function() { - return /** @type {!Array.} */ (jspb.Message.getRepeatedFloatingPointField(this, 2)); + return /** @type {!Array} */ (jspb.Message.getRepeatedFloatingPointField(this, 2)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setXList = function(value) { - jspb.Message.setField(this, 2, value || []); + return jspb.Message.setField(this, 2, value || []); }; /** - * @param {!number} value + * @param {number} value * @param {number=} opt_index + * @return {!proto.BERTBuffers.GraphicsCommand} returns this */ proto.BERTBuffers.GraphicsCommand.prototype.addX = function(value, opt_index) { - jspb.Message.addToRepeatedField(this, 2, value, opt_index); + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.clearXList = function() { - this.setXList([]); + return this.setXList([]); }; /** * repeated double y = 3; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.GraphicsCommand.prototype.getYList = function() { - return /** @type {!Array.} */ (jspb.Message.getRepeatedFloatingPointField(this, 3)); + return /** @type {!Array} */ (jspb.Message.getRepeatedFloatingPointField(this, 3)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setYList = function(value) { - jspb.Message.setField(this, 3, value || []); + return jspb.Message.setField(this, 3, value || []); }; /** - * @param {!number} value + * @param {number} value * @param {number=} opt_index + * @return {!proto.BERTBuffers.GraphicsCommand} returns this */ proto.BERTBuffers.GraphicsCommand.prototype.addY = function(value, opt_index) { - jspb.Message.addToRepeatedField(this, 3, value, opt_index); + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.clearYList = function() { - this.setYList([]); + return this.setYList([]); }; @@ -2781,13 +3295,16 @@ proto.BERTBuffers.GraphicsCommand.prototype.clearYList = function() { * @return {number} */ proto.BERTBuffers.GraphicsCommand.prototype.getR = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 4, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setR = function(value) { - jspb.Message.setProto3FloatField(this, 4, value); + return jspb.Message.setProto3FloatField(this, 4, value); }; @@ -2796,13 +3313,16 @@ proto.BERTBuffers.GraphicsCommand.prototype.setR = function(value) { * @return {number} */ proto.BERTBuffers.GraphicsCommand.prototype.getRot = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 5, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setRot = function(value) { - jspb.Message.setProto3FloatField(this, 5, value); + return jspb.Message.setProto3FloatField(this, 5, value); }; @@ -2815,26 +3335,30 @@ proto.BERTBuffers.GraphicsCommand.prototype.getText = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setText = function(value) { - jspb.Message.setProto3StringField(this, 6, value); + return jspb.Message.setProto3StringField(this, 6, value); }; /** * optional bool filled = 7; - * Note that Boolean fields may be set to 0/1 when serialized from a Java server. - * You should avoid comparisons like {@code val === true/false} in those cases. * @return {boolean} */ proto.BERTBuffers.GraphicsCommand.prototype.getFilled = function() { - return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 7, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); }; -/** @param {boolean} value */ +/** + * @param {boolean} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setFilled = function(value) { - jspb.Message.setProto3BooleanField(this, 7, value); + return jspb.Message.setProto3BooleanField(this, 7, value); }; @@ -2843,13 +3367,16 @@ proto.BERTBuffers.GraphicsCommand.prototype.setFilled = function(value) { * @return {number} */ proto.BERTBuffers.GraphicsCommand.prototype.getHadj = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 8, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 8, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setHadj = function(value) { - jspb.Message.setProto3FloatField(this, 8, value); + return jspb.Message.setProto3FloatField(this, 8, value); }; @@ -2886,26 +3413,30 @@ proto.BERTBuffers.GraphicsCommand.prototype.getRaster_asU8 = function() { }; -/** @param {!(string|Uint8Array)} value */ +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setRaster = function(value) { - jspb.Message.setProto3BytesField(this, 9, value); + return jspb.Message.setProto3BytesField(this, 9, value); }; /** * optional bool interpolate = 10; - * Note that Boolean fields may be set to 0/1 when serialized from a Java server. - * You should avoid comparisons like {@code val === true/false} in those cases. * @return {boolean} */ proto.BERTBuffers.GraphicsCommand.prototype.getInterpolate = function() { - return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 10, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 10, false)); }; -/** @param {boolean} value */ +/** + * @param {boolean} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setInterpolate = function(value) { - jspb.Message.setProto3BooleanField(this, 10, value); + return jspb.Message.setProto3BooleanField(this, 10, value); }; @@ -2918,9 +3449,12 @@ proto.BERTBuffers.GraphicsCommand.prototype.getDeviceType = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.setDeviceType = function(value) { - jspb.Message.setProto3StringField(this, 14, value); + return jspb.Message.setProto3StringField(this, 14, value); }; @@ -2934,20 +3468,27 @@ proto.BERTBuffers.GraphicsCommand.prototype.getContext = function() { }; -/** @param {?proto.BERTBuffers.GraphicsContext|undefined} value */ +/** + * @param {?proto.BERTBuffers.GraphicsContext|undefined} value + * @return {!proto.BERTBuffers.GraphicsCommand} returns this +*/ proto.BERTBuffers.GraphicsCommand.prototype.setContext = function(value) { - jspb.Message.setWrapperField(this, 15, value); + return jspb.Message.setWrapperField(this, 15, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.GraphicsCommand} returns this + */ proto.BERTBuffers.GraphicsCommand.prototype.clearContext = function() { - this.setContext(undefined); + return this.setContext(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.GraphicsCommand.prototype.hasContext = function() { return jspb.Message.getField(this, 15) != null; @@ -2955,34 +3496,19 @@ proto.BERTBuffers.GraphicsCommand.prototype.hasContext = function() { -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.Color = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.Color, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.Color.displayName = 'proto.BERTBuffers.Color'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.Color.prototype.toObject = function(opt_includeInstance) { @@ -2992,8 +3518,8 @@ proto.BERTBuffers.Color.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.Color} msg The msg instance to transform. * @return {!Object} @@ -3001,10 +3527,10 @@ proto.BERTBuffers.Color.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.Color.toObject = function(includeInstance, msg) { var f, obj = { - a: jspb.Message.getFieldWithDefault(msg, 1, 0), - r: jspb.Message.getFieldWithDefault(msg, 2, 0), - g: jspb.Message.getFieldWithDefault(msg, 3, 0), - b: jspb.Message.getFieldWithDefault(msg, 4, 0) +a: jspb.Message.getFieldWithDefault(msg, 1, 0), +r: jspb.Message.getFieldWithDefault(msg, 2, 0), +g: jspb.Message.getFieldWithDefault(msg, 3, 0), +b: jspb.Message.getFieldWithDefault(msg, 4, 0) }; if (includeInstance) { @@ -3126,9 +3652,12 @@ proto.BERTBuffers.Color.prototype.getA = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Color} returns this + */ proto.BERTBuffers.Color.prototype.setA = function(value) { - jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setProto3IntField(this, 1, value); }; @@ -3141,9 +3670,12 @@ proto.BERTBuffers.Color.prototype.getR = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Color} returns this + */ proto.BERTBuffers.Color.prototype.setR = function(value) { - jspb.Message.setProto3IntField(this, 2, value); + return jspb.Message.setProto3IntField(this, 2, value); }; @@ -3156,9 +3688,12 @@ proto.BERTBuffers.Color.prototype.getG = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Color} returns this + */ proto.BERTBuffers.Color.prototype.setG = function(value) { - jspb.Message.setProto3IntField(this, 3, value); + return jspb.Message.setProto3IntField(this, 3, value); }; @@ -3171,41 +3706,29 @@ proto.BERTBuffers.Color.prototype.getB = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.Color} returns this + */ proto.BERTBuffers.Color.prototype.setB = function(value) { - jspb.Message.setProto3IntField(this, 4, value); + return jspb.Message.setProto3IntField(this, 4, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.GraphicsContext = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.GraphicsContext, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.GraphicsContext.displayName = 'proto.BERTBuffers.GraphicsContext'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.GraphicsContext.prototype.toObject = function(opt_includeInstance) { @@ -3215,8 +3738,8 @@ proto.BERTBuffers.GraphicsContext.prototype.toObject = function(opt_includeInsta /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.GraphicsContext} msg The msg instance to transform. * @return {!Object} @@ -3224,19 +3747,19 @@ proto.BERTBuffers.GraphicsContext.prototype.toObject = function(opt_includeInsta */ proto.BERTBuffers.GraphicsContext.toObject = function(includeInstance, msg) { var f, obj = { - col: (f = msg.getCol()) && proto.BERTBuffers.Color.toObject(includeInstance, f), - fill: (f = msg.getFill()) && proto.BERTBuffers.Color.toObject(includeInstance, f), - gamma: +jspb.Message.getFieldWithDefault(msg, 3, 0.0), - lwd: +jspb.Message.getFieldWithDefault(msg, 4, 0.0), - lty: jspb.Message.getFieldWithDefault(msg, 5, 0), - lend: jspb.Message.getFieldWithDefault(msg, 6, 0), - ljoin: jspb.Message.getFieldWithDefault(msg, 7, 0), - lmitre: +jspb.Message.getFieldWithDefault(msg, 8, 0.0), - cex: +jspb.Message.getFieldWithDefault(msg, 9, 0.0), - ps: +jspb.Message.getFieldWithDefault(msg, 10, 0.0), - lineheight: +jspb.Message.getFieldWithDefault(msg, 11, 0.0), - fontface: jspb.Message.getFieldWithDefault(msg, 12, 0), - fontfamily: jspb.Message.getFieldWithDefault(msg, 13, "") +col: (f = msg.getCol()) && proto.BERTBuffers.Color.toObject(includeInstance, f), +fill: (f = msg.getFill()) && proto.BERTBuffers.Color.toObject(includeInstance, f), +gamma: jspb.Message.getFloatingPointFieldWithDefault(msg, 3, 0.0), +lwd: jspb.Message.getFloatingPointFieldWithDefault(msg, 4, 0.0), +lty: jspb.Message.getFieldWithDefault(msg, 5, 0), +lend: jspb.Message.getFieldWithDefault(msg, 6, 0), +ljoin: jspb.Message.getFieldWithDefault(msg, 7, 0), +lmitre: jspb.Message.getFloatingPointFieldWithDefault(msg, 8, 0.0), +cex: jspb.Message.getFloatingPointFieldWithDefault(msg, 9, 0.0), +ps: jspb.Message.getFloatingPointFieldWithDefault(msg, 10, 0.0), +lineheight: jspb.Message.getFloatingPointFieldWithDefault(msg, 11, 0.0), +fontface: jspb.Message.getFieldWithDefault(msg, 12, 0), +fontfamily: jspb.Message.getFieldWithDefault(msg, 13, "") }; if (includeInstance) { @@ -3462,20 +3985,27 @@ proto.BERTBuffers.GraphicsContext.prototype.getCol = function() { }; -/** @param {?proto.BERTBuffers.Color|undefined} value */ +/** + * @param {?proto.BERTBuffers.Color|undefined} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this +*/ proto.BERTBuffers.GraphicsContext.prototype.setCol = function(value) { - jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setWrapperField(this, 1, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.clearCol = function() { - this.setCol(undefined); + return this.setCol(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.GraphicsContext.prototype.hasCol = function() { return jspb.Message.getField(this, 1) != null; @@ -3492,20 +4022,27 @@ proto.BERTBuffers.GraphicsContext.prototype.getFill = function() { }; -/** @param {?proto.BERTBuffers.Color|undefined} value */ +/** + * @param {?proto.BERTBuffers.Color|undefined} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this +*/ proto.BERTBuffers.GraphicsContext.prototype.setFill = function(value) { - jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setWrapperField(this, 2, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.clearFill = function() { - this.setFill(undefined); + return this.setFill(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.GraphicsContext.prototype.hasFill = function() { return jspb.Message.getField(this, 2) != null; @@ -3517,13 +4054,16 @@ proto.BERTBuffers.GraphicsContext.prototype.hasFill = function() { * @return {number} */ proto.BERTBuffers.GraphicsContext.prototype.getGamma = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 3, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 3, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setGamma = function(value) { - jspb.Message.setProto3FloatField(this, 3, value); + return jspb.Message.setProto3FloatField(this, 3, value); }; @@ -3532,13 +4072,16 @@ proto.BERTBuffers.GraphicsContext.prototype.setGamma = function(value) { * @return {number} */ proto.BERTBuffers.GraphicsContext.prototype.getLwd = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 4, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setLwd = function(value) { - jspb.Message.setProto3FloatField(this, 4, value); + return jspb.Message.setProto3FloatField(this, 4, value); }; @@ -3551,9 +4094,12 @@ proto.BERTBuffers.GraphicsContext.prototype.getLty = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setLty = function(value) { - jspb.Message.setProto3IntField(this, 5, value); + return jspb.Message.setProto3IntField(this, 5, value); }; @@ -3566,9 +4112,12 @@ proto.BERTBuffers.GraphicsContext.prototype.getLend = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setLend = function(value) { - jspb.Message.setProto3IntField(this, 6, value); + return jspb.Message.setProto3IntField(this, 6, value); }; @@ -3581,9 +4130,12 @@ proto.BERTBuffers.GraphicsContext.prototype.getLjoin = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setLjoin = function(value) { - jspb.Message.setProto3IntField(this, 7, value); + return jspb.Message.setProto3IntField(this, 7, value); }; @@ -3592,13 +4144,16 @@ proto.BERTBuffers.GraphicsContext.prototype.setLjoin = function(value) { * @return {number} */ proto.BERTBuffers.GraphicsContext.prototype.getLmitre = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 8, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 8, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setLmitre = function(value) { - jspb.Message.setProto3FloatField(this, 8, value); + return jspb.Message.setProto3FloatField(this, 8, value); }; @@ -3607,13 +4162,16 @@ proto.BERTBuffers.GraphicsContext.prototype.setLmitre = function(value) { * @return {number} */ proto.BERTBuffers.GraphicsContext.prototype.getCex = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 9, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 9, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setCex = function(value) { - jspb.Message.setProto3FloatField(this, 9, value); + return jspb.Message.setProto3FloatField(this, 9, value); }; @@ -3622,13 +4180,16 @@ proto.BERTBuffers.GraphicsContext.prototype.setCex = function(value) { * @return {number} */ proto.BERTBuffers.GraphicsContext.prototype.getPs = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 10, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 10, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setPs = function(value) { - jspb.Message.setProto3FloatField(this, 10, value); + return jspb.Message.setProto3FloatField(this, 10, value); }; @@ -3637,13 +4198,16 @@ proto.BERTBuffers.GraphicsContext.prototype.setPs = function(value) { * @return {number} */ proto.BERTBuffers.GraphicsContext.prototype.getLineheight = function() { - return /** @type {number} */ (+jspb.Message.getFieldWithDefault(this, 11, 0.0)); + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 11, 0.0)); }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setLineheight = function(value) { - jspb.Message.setProto3FloatField(this, 11, value); + return jspb.Message.setProto3FloatField(this, 11, value); }; @@ -3656,9 +4220,12 @@ proto.BERTBuffers.GraphicsContext.prototype.getFontface = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setFontface = function(value) { - jspb.Message.setProto3IntField(this, 12, value); + return jspb.Message.setProto3IntField(this, 12, value); }; @@ -3671,41 +4238,29 @@ proto.BERTBuffers.GraphicsContext.prototype.getFontfamily = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.GraphicsContext} returns this + */ proto.BERTBuffers.GraphicsContext.prototype.setFontfamily = function(value) { - jspb.Message.setProto3StringField(this, 13, value); + return jspb.Message.setProto3StringField(this, 13, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.MIMEData = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.MIMEData, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.MIMEData.displayName = 'proto.BERTBuffers.MIMEData'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.MIMEData.prototype.toObject = function(opt_includeInstance) { @@ -3715,8 +4270,8 @@ proto.BERTBuffers.MIMEData.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.MIMEData} msg The msg instance to transform. * @return {!Object} @@ -3724,8 +4279,8 @@ proto.BERTBuffers.MIMEData.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.MIMEData.toObject = function(includeInstance, msg) { var f, obj = { - mimeType: jspb.Message.getFieldWithDefault(msg, 1, ""), - data: msg.getData_asB64() +mimeType: jspb.Message.getFieldWithDefault(msg, 1, ""), +data: msg.getData_asB64() }; if (includeInstance) { @@ -3825,9 +4380,12 @@ proto.BERTBuffers.MIMEData.prototype.getMimeType = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.MIMEData} returns this + */ proto.BERTBuffers.MIMEData.prototype.setMimeType = function(value) { - jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setProto3StringField(this, 1, value); }; @@ -3859,35 +4417,21 @@ proto.BERTBuffers.MIMEData.prototype.getData_asB64 = function() { * @return {!Uint8Array} */ proto.BERTBuffers.MIMEData.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** @param {!(string|Uint8Array)} value */ -proto.BERTBuffers.MIMEData.prototype.setData = function(value) { - jspb.Message.setProto3BytesField(this, 2, value); -}; - - - -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.BERTBuffers.MIMEData} returns this */ -proto.BERTBuffers.Console = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.BERTBuffers.Console.oneofGroups_); +proto.BERTBuffers.MIMEData.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; -goog.inherits(proto.BERTBuffers.Console, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.Console.displayName = 'proto.BERTBuffers.Console'; -} + + + /** * Oneof group definitions for this message. Each group defines the field * numbers belonging to that group. When of these fields' value is set, all @@ -3922,13 +4466,15 @@ proto.BERTBuffers.Console.prototype.getMessageCase = function() { if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.Console.prototype.toObject = function(opt_includeInstance) { @@ -3938,8 +4484,8 @@ proto.BERTBuffers.Console.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.Console} msg The msg instance to transform. * @return {!Object} @@ -3947,12 +4493,12 @@ proto.BERTBuffers.Console.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.Console.toObject = function(includeInstance, msg) { var f, obj = { - text: jspb.Message.getFieldWithDefault(msg, 1, ""), - err: jspb.Message.getFieldWithDefault(msg, 2, ""), - prompt: jspb.Message.getFieldWithDefault(msg, 3, ""), - graphics: (f = msg.getGraphics()) && proto.BERTBuffers.GraphicsCommand.toObject(includeInstance, f), - mimeData: (f = msg.getMimeData()) && proto.BERTBuffers.MIMEData.toObject(includeInstance, f), - history: (f = msg.getHistory()) && proto.BERTBuffers.Variable.toObject(includeInstance, f) +text: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f, +err: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f, +prompt: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f, +graphics: (f = msg.getGraphics()) && proto.BERTBuffers.GraphicsCommand.toObject(includeInstance, f), +mimeData: (f = msg.getMimeData()) && proto.BERTBuffers.MIMEData.toObject(includeInstance, f), +history: (f = msg.getHistory()) && proto.BERTBuffers.Variable.toObject(includeInstance, f) }; if (includeInstance) { @@ -4102,20 +4648,27 @@ proto.BERTBuffers.Console.prototype.getText = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.setText = function(value) { - jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Console.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Console.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.clearText = function() { - jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Console.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 1, proto.BERTBuffers.Console.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Console.prototype.hasText = function() { return jspb.Message.getField(this, 1) != null; @@ -4131,20 +4684,27 @@ proto.BERTBuffers.Console.prototype.getErr = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.setErr = function(value) { - jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Console.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Console.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.clearErr = function() { - jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Console.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 2, proto.BERTBuffers.Console.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Console.prototype.hasErr = function() { return jspb.Message.getField(this, 2) != null; @@ -4160,20 +4720,27 @@ proto.BERTBuffers.Console.prototype.getPrompt = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.setPrompt = function(value) { - jspb.Message.setOneofField(this, 3, proto.BERTBuffers.Console.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 3, proto.BERTBuffers.Console.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.clearPrompt = function() { - jspb.Message.setOneofField(this, 3, proto.BERTBuffers.Console.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 3, proto.BERTBuffers.Console.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Console.prototype.hasPrompt = function() { return jspb.Message.getField(this, 3) != null; @@ -4190,20 +4757,27 @@ proto.BERTBuffers.Console.prototype.getGraphics = function() { }; -/** @param {?proto.BERTBuffers.GraphicsCommand|undefined} value */ +/** + * @param {?proto.BERTBuffers.GraphicsCommand|undefined} value + * @return {!proto.BERTBuffers.Console} returns this +*/ proto.BERTBuffers.Console.prototype.setGraphics = function(value) { - jspb.Message.setOneofWrapperField(this, 4, proto.BERTBuffers.Console.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 4, proto.BERTBuffers.Console.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.clearGraphics = function() { - this.setGraphics(undefined); + return this.setGraphics(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Console.prototype.hasGraphics = function() { return jspb.Message.getField(this, 4) != null; @@ -4220,20 +4794,27 @@ proto.BERTBuffers.Console.prototype.getMimeData = function() { }; -/** @param {?proto.BERTBuffers.MIMEData|undefined} value */ +/** + * @param {?proto.BERTBuffers.MIMEData|undefined} value + * @return {!proto.BERTBuffers.Console} returns this +*/ proto.BERTBuffers.Console.prototype.setMimeData = function(value) { - jspb.Message.setOneofWrapperField(this, 5, proto.BERTBuffers.Console.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 5, proto.BERTBuffers.Console.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.clearMimeData = function() { - this.setMimeData(undefined); + return this.setMimeData(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Console.prototype.hasMimeData = function() { return jspb.Message.getField(this, 5) != null; @@ -4250,20 +4831,27 @@ proto.BERTBuffers.Console.prototype.getHistory = function() { }; -/** @param {?proto.BERTBuffers.Variable|undefined} value */ +/** + * @param {?proto.BERTBuffers.Variable|undefined} value + * @return {!proto.BERTBuffers.Console} returns this +*/ proto.BERTBuffers.Console.prototype.setHistory = function(value) { - jspb.Message.setOneofWrapperField(this, 6, proto.BERTBuffers.Console.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 6, proto.BERTBuffers.Console.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.Console} returns this + */ proto.BERTBuffers.Console.prototype.clearHistory = function() { - this.setHistory(undefined); + return this.setHistory(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.Console.prototype.hasHistory = function() { return jspb.Message.getField(this, 6) != null; @@ -4271,34 +4859,19 @@ proto.BERTBuffers.Console.prototype.hasHistory = function() { -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.FunctionElement = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.FunctionElement, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.FunctionElement.displayName = 'proto.BERTBuffers.FunctionElement'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.FunctionElement.prototype.toObject = function(opt_includeInstance) { @@ -4308,8 +4881,8 @@ proto.BERTBuffers.FunctionElement.prototype.toObject = function(opt_includeInsta /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.FunctionElement} msg The msg instance to transform. * @return {!Object} @@ -4317,11 +4890,11 @@ proto.BERTBuffers.FunctionElement.prototype.toObject = function(opt_includeInsta */ proto.BERTBuffers.FunctionElement.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - typeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - defaultValue: (f = msg.getDefaultValue()) && proto.BERTBuffers.Variable.toObject(includeInstance, f), - description: jspb.Message.getFieldWithDefault(msg, 4, ""), - index: jspb.Message.getFieldWithDefault(msg, 5, 0) +name: jspb.Message.getFieldWithDefault(msg, 1, ""), +typeName: jspb.Message.getFieldWithDefault(msg, 2, ""), +defaultValue: (f = msg.getDefaultValue()) && proto.BERTBuffers.Variable.toObject(includeInstance, f), +description: jspb.Message.getFieldWithDefault(msg, 4, ""), +index: jspb.Message.getFieldWithDefault(msg, 5, 0) }; if (includeInstance) { @@ -4456,9 +5029,12 @@ proto.BERTBuffers.FunctionElement.prototype.getName = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.FunctionElement} returns this + */ proto.BERTBuffers.FunctionElement.prototype.setName = function(value) { - jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setProto3StringField(this, 1, value); }; @@ -4471,9 +5047,12 @@ proto.BERTBuffers.FunctionElement.prototype.getTypeName = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.FunctionElement} returns this + */ proto.BERTBuffers.FunctionElement.prototype.setTypeName = function(value) { - jspb.Message.setProto3StringField(this, 2, value); + return jspb.Message.setProto3StringField(this, 2, value); }; @@ -4487,20 +5066,27 @@ proto.BERTBuffers.FunctionElement.prototype.getDefaultValue = function() { }; -/** @param {?proto.BERTBuffers.Variable|undefined} value */ +/** + * @param {?proto.BERTBuffers.Variable|undefined} value + * @return {!proto.BERTBuffers.FunctionElement} returns this +*/ proto.BERTBuffers.FunctionElement.prototype.setDefaultValue = function(value) { - jspb.Message.setWrapperField(this, 3, value); + return jspb.Message.setWrapperField(this, 3, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.FunctionElement} returns this + */ proto.BERTBuffers.FunctionElement.prototype.clearDefaultValue = function() { - this.setDefaultValue(undefined); + return this.setDefaultValue(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.FunctionElement.prototype.hasDefaultValue = function() { return jspb.Message.getField(this, 3) != null; @@ -4516,9 +5102,12 @@ proto.BERTBuffers.FunctionElement.prototype.getDescription = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.FunctionElement} returns this + */ proto.BERTBuffers.FunctionElement.prototype.setDescription = function(value) { - jspb.Message.setProto3StringField(this, 4, value); + return jspb.Message.setProto3StringField(this, 4, value); }; @@ -4531,30 +5120,16 @@ proto.BERTBuffers.FunctionElement.prototype.getIndex = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.FunctionElement} returns this + */ proto.BERTBuffers.FunctionElement.prototype.setIndex = function(value) { - jspb.Message.setProto3IntField(this, 5, value); + return jspb.Message.setProto3IntField(this, 5, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.FunctionDescriptor = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.FunctionDescriptor.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.FunctionDescriptor, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.FunctionDescriptor.displayName = 'proto.BERTBuffers.FunctionDescriptor'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -4566,13 +5141,15 @@ proto.BERTBuffers.FunctionDescriptor.repeatedFields_ = [5]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.FunctionDescriptor.prototype.toObject = function(opt_includeInstance) { @@ -4582,8 +5159,8 @@ proto.BERTBuffers.FunctionDescriptor.prototype.toObject = function(opt_includeIn /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.FunctionDescriptor} msg The msg instance to transform. * @return {!Object} @@ -4591,11 +5168,11 @@ proto.BERTBuffers.FunctionDescriptor.prototype.toObject = function(opt_includeIn */ proto.BERTBuffers.FunctionDescriptor.toObject = function(includeInstance, msg) { var f, obj = { - pb_function: (f = msg.getFunction()) && proto.BERTBuffers.FunctionElement.toObject(includeInstance, f), - callType: jspb.Message.getFieldWithDefault(msg, 2, 0), - flags: jspb.Message.getFieldWithDefault(msg, 3, 0), - category: jspb.Message.getFieldWithDefault(msg, 4, ""), - argumentsList: jspb.Message.toObjectList(msg.getArgumentsList(), +pb_function: (f = msg.getFunction()) && proto.BERTBuffers.FunctionElement.toObject(includeInstance, f), +callType: jspb.Message.getFieldWithDefault(msg, 2, 0), +flags: jspb.Message.getFieldWithDefault(msg, 3, 0), +category: jspb.Message.getFieldWithDefault(msg, 4, ""), +argumentsList: jspb.Message.toObjectList(msg.getArgumentsList(), proto.BERTBuffers.FunctionElement.toObject, includeInstance) }; @@ -4734,20 +5311,27 @@ proto.BERTBuffers.FunctionDescriptor.prototype.getFunction = function() { }; -/** @param {?proto.BERTBuffers.FunctionElement|undefined} value */ +/** + * @param {?proto.BERTBuffers.FunctionElement|undefined} value + * @return {!proto.BERTBuffers.FunctionDescriptor} returns this +*/ proto.BERTBuffers.FunctionDescriptor.prototype.setFunction = function(value) { - jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setWrapperField(this, 1, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.FunctionDescriptor} returns this + */ proto.BERTBuffers.FunctionDescriptor.prototype.clearFunction = function() { - this.setFunction(undefined); + return this.setFunction(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.FunctionDescriptor.prototype.hasFunction = function() { return jspb.Message.getField(this, 1) != null; @@ -4763,9 +5347,12 @@ proto.BERTBuffers.FunctionDescriptor.prototype.getCallType = function() { }; -/** @param {!proto.BERTBuffers.CallType} value */ +/** + * @param {!proto.BERTBuffers.CallType} value + * @return {!proto.BERTBuffers.FunctionDescriptor} returns this + */ proto.BERTBuffers.FunctionDescriptor.prototype.setCallType = function(value) { - jspb.Message.setProto3EnumField(this, 2, value); + return jspb.Message.setProto3EnumField(this, 2, value); }; @@ -4778,9 +5365,12 @@ proto.BERTBuffers.FunctionDescriptor.prototype.getFlags = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.FunctionDescriptor} returns this + */ proto.BERTBuffers.FunctionDescriptor.prototype.setFlags = function(value) { - jspb.Message.setProto3IntField(this, 3, value); + return jspb.Message.setProto3IntField(this, 3, value); }; @@ -4793,25 +5383,31 @@ proto.BERTBuffers.FunctionDescriptor.prototype.getCategory = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.FunctionDescriptor} returns this + */ proto.BERTBuffers.FunctionDescriptor.prototype.setCategory = function(value) { - jspb.Message.setProto3StringField(this, 4, value); + return jspb.Message.setProto3StringField(this, 4, value); }; /** * repeated FunctionElement arguments = 5; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.FunctionDescriptor.prototype.getArgumentsList = function() { - return /** @type{!Array.} */ ( + return /** @type{!Array} */ ( jspb.Message.getRepeatedWrapperField(this, proto.BERTBuffers.FunctionElement, 5)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.FunctionDescriptor} returns this +*/ proto.BERTBuffers.FunctionDescriptor.prototype.setArgumentsList = function(value) { - jspb.Message.setRepeatedWrapperField(this, 5, value); + return jspb.Message.setRepeatedWrapperField(this, 5, value); }; @@ -4825,29 +5421,16 @@ proto.BERTBuffers.FunctionDescriptor.prototype.addArguments = function(opt_value }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.FunctionDescriptor} returns this + */ proto.BERTBuffers.FunctionDescriptor.prototype.clearArgumentsList = function() { - this.setArgumentsList([]); + return this.setArgumentsList([]); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.FunctionList = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.FunctionList.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.FunctionList, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.FunctionList.displayName = 'proto.BERTBuffers.FunctionList'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -4859,13 +5442,15 @@ proto.BERTBuffers.FunctionList.repeatedFields_ = [1]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.FunctionList.prototype.toObject = function(opt_includeInstance) { @@ -4875,8 +5460,8 @@ proto.BERTBuffers.FunctionList.prototype.toObject = function(opt_includeInstance /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.FunctionList} msg The msg instance to transform. * @return {!Object} @@ -4884,7 +5469,7 @@ proto.BERTBuffers.FunctionList.prototype.toObject = function(opt_includeInstance */ proto.BERTBuffers.FunctionList.toObject = function(includeInstance, msg) { var f, obj = { - functionsList: jspb.Message.toObjectList(msg.getFunctionsList(), +functionsList: jspb.Message.toObjectList(msg.getFunctionsList(), proto.BERTBuffers.FunctionDescriptor.toObject, includeInstance) }; @@ -4969,17 +5554,20 @@ proto.BERTBuffers.FunctionList.serializeBinaryToWriter = function(message, write /** * repeated FunctionDescriptor functions = 1; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.FunctionList.prototype.getFunctionsList = function() { - return /** @type{!Array.} */ ( + return /** @type{!Array} */ ( jspb.Message.getRepeatedWrapperField(this, proto.BERTBuffers.FunctionDescriptor, 1)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.FunctionList} returns this +*/ proto.BERTBuffers.FunctionList.prototype.setFunctionsList = function(value) { - jspb.Message.setRepeatedWrapperField(this, 1, value); + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; @@ -4993,40 +5581,29 @@ proto.BERTBuffers.FunctionList.prototype.addFunctions = function(opt_value, opt_ }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.FunctionList} returns this + */ proto.BERTBuffers.FunctionList.prototype.clearFunctionsList = function() { - this.setFunctionsList([]); + return this.setFunctionsList([]); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.EnumValue = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.BERTBuffers.EnumValue, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.EnumValue.displayName = 'proto.BERTBuffers.EnumValue'; -} if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.EnumValue.prototype.toObject = function(opt_includeInstance) { @@ -5036,8 +5613,8 @@ proto.BERTBuffers.EnumValue.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.EnumValue} msg The msg instance to transform. * @return {!Object} @@ -5045,8 +5622,8 @@ proto.BERTBuffers.EnumValue.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.EnumValue.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - value: jspb.Message.getFieldWithDefault(msg, 2, 0) +name: jspb.Message.getFieldWithDefault(msg, 1, ""), +value: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -5146,9 +5723,12 @@ proto.BERTBuffers.EnumValue.prototype.getName = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.EnumValue} returns this + */ proto.BERTBuffers.EnumValue.prototype.setName = function(value) { - jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setProto3StringField(this, 1, value); }; @@ -5161,30 +5741,16 @@ proto.BERTBuffers.EnumValue.prototype.getValue = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.EnumValue} returns this + */ proto.BERTBuffers.EnumValue.prototype.setValue = function(value) { - jspb.Message.setProto3IntField(this, 2, value); + return jspb.Message.setProto3IntField(this, 2, value); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.EnumType = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.EnumType.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.EnumType, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.EnumType.displayName = 'proto.BERTBuffers.EnumType'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -5196,13 +5762,15 @@ proto.BERTBuffers.EnumType.repeatedFields_ = [2]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.EnumType.prototype.toObject = function(opt_includeInstance) { @@ -5212,8 +5780,8 @@ proto.BERTBuffers.EnumType.prototype.toObject = function(opt_includeInstance) { /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.EnumType} msg The msg instance to transform. * @return {!Object} @@ -5221,8 +5789,8 @@ proto.BERTBuffers.EnumType.prototype.toObject = function(opt_includeInstance) { */ proto.BERTBuffers.EnumType.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - valuesList: jspb.Message.toObjectList(msg.getValuesList(), +name: jspb.Message.getFieldWithDefault(msg, 1, ""), +valuesList: jspb.Message.toObjectList(msg.getValuesList(), proto.BERTBuffers.EnumValue.toObject, includeInstance) }; @@ -5325,25 +5893,31 @@ proto.BERTBuffers.EnumType.prototype.getName = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.EnumType} returns this + */ proto.BERTBuffers.EnumType.prototype.setName = function(value) { - jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setProto3StringField(this, 1, value); }; /** * repeated EnumValue values = 2; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.EnumType.prototype.getValuesList = function() { - return /** @type{!Array.} */ ( + return /** @type{!Array} */ ( jspb.Message.getRepeatedWrapperField(this, proto.BERTBuffers.EnumValue, 2)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.EnumType} returns this +*/ proto.BERTBuffers.EnumType.prototype.setValuesList = function(value) { - jspb.Message.setRepeatedWrapperField(this, 2, value); + return jspb.Message.setRepeatedWrapperField(this, 2, value); }; @@ -5357,29 +5931,16 @@ proto.BERTBuffers.EnumType.prototype.addValues = function(opt_value, opt_index) }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.EnumType} returns this + */ proto.BERTBuffers.EnumType.prototype.clearValuesList = function() { - this.setValuesList([]); + return this.setValuesList([]); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.ExternalPointer = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.BERTBuffers.ExternalPointer.repeatedFields_, null); -}; -goog.inherits(proto.BERTBuffers.ExternalPointer, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.ExternalPointer.displayName = 'proto.BERTBuffers.ExternalPointer'; -} /** * List of repeated fields within this message type. * @private {!Array} @@ -5391,13 +5952,15 @@ proto.BERTBuffers.ExternalPointer.repeatedFields_ = [3,4]; if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.ExternalPointer.prototype.toObject = function(opt_includeInstance) { @@ -5407,8 +5970,8 @@ proto.BERTBuffers.ExternalPointer.prototype.toObject = function(opt_includeInsta /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.ExternalPointer} msg The msg instance to transform. * @return {!Object} @@ -5416,11 +5979,11 @@ proto.BERTBuffers.ExternalPointer.prototype.toObject = function(opt_includeInsta */ proto.BERTBuffers.ExternalPointer.toObject = function(includeInstance, msg) { var f, obj = { - interfaceName: jspb.Message.getFieldWithDefault(msg, 1, ""), - pointer: jspb.Message.getFieldWithDefault(msg, 2, 0), - functionsList: jspb.Message.toObjectList(msg.getFunctionsList(), +interfaceName: jspb.Message.getFieldWithDefault(msg, 1, ""), +pointer: jspb.Message.getFieldWithDefault(msg, 2, 0), +functionsList: jspb.Message.toObjectList(msg.getFunctionsList(), proto.BERTBuffers.FunctionDescriptor.toObject, includeInstance), - enumsList: jspb.Message.toObjectList(msg.getEnumsList(), +enumsList: jspb.Message.toObjectList(msg.getEnumsList(), proto.BERTBuffers.EnumType.toObject, includeInstance) }; @@ -5547,9 +6110,12 @@ proto.BERTBuffers.ExternalPointer.prototype.getInterfaceName = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.ExternalPointer} returns this + */ proto.BERTBuffers.ExternalPointer.prototype.setInterfaceName = function(value) { - jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setProto3StringField(this, 1, value); }; @@ -5562,25 +6128,31 @@ proto.BERTBuffers.ExternalPointer.prototype.getPointer = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.ExternalPointer} returns this + */ proto.BERTBuffers.ExternalPointer.prototype.setPointer = function(value) { - jspb.Message.setProto3IntField(this, 2, value); + return jspb.Message.setProto3IntField(this, 2, value); }; /** * repeated FunctionDescriptor functions = 3; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.ExternalPointer.prototype.getFunctionsList = function() { - return /** @type{!Array.} */ ( + return /** @type{!Array} */ ( jspb.Message.getRepeatedWrapperField(this, proto.BERTBuffers.FunctionDescriptor, 3)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.ExternalPointer} returns this +*/ proto.BERTBuffers.ExternalPointer.prototype.setFunctionsList = function(value) { - jspb.Message.setRepeatedWrapperField(this, 3, value); + return jspb.Message.setRepeatedWrapperField(this, 3, value); }; @@ -5594,24 +6166,31 @@ proto.BERTBuffers.ExternalPointer.prototype.addFunctions = function(opt_value, o }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.ExternalPointer} returns this + */ proto.BERTBuffers.ExternalPointer.prototype.clearFunctionsList = function() { - this.setFunctionsList([]); + return this.setFunctionsList([]); }; /** * repeated EnumType enums = 4; - * @return {!Array.} + * @return {!Array} */ proto.BERTBuffers.ExternalPointer.prototype.getEnumsList = function() { - return /** @type{!Array.} */ ( + return /** @type{!Array} */ ( jspb.Message.getRepeatedWrapperField(this, proto.BERTBuffers.EnumType, 4)); }; -/** @param {!Array.} value */ +/** + * @param {!Array} value + * @return {!proto.BERTBuffers.ExternalPointer} returns this +*/ proto.BERTBuffers.ExternalPointer.prototype.setEnumsList = function(value) { - jspb.Message.setRepeatedWrapperField(this, 4, value); + return jspb.Message.setRepeatedWrapperField(this, 4, value); }; @@ -5625,29 +6204,16 @@ proto.BERTBuffers.ExternalPointer.prototype.addEnums = function(opt_value, opt_i }; +/** + * Clears the list making it empty but non-null. + * @return {!proto.BERTBuffers.ExternalPointer} returns this + */ proto.BERTBuffers.ExternalPointer.prototype.clearEnumsList = function() { - this.setEnumsList([]); + return this.setEnumsList([]); }; -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.BERTBuffers.CallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.BERTBuffers.CallResponse.oneofGroups_); -}; -goog.inherits(proto.BERTBuffers.CallResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - proto.BERTBuffers.CallResponse.displayName = 'proto.BERTBuffers.CallResponse'; -} /** * Oneof group definitions for this message. Each group defines the field * numbers belonging to that group. When of these fields' value is set, all @@ -5684,13 +6250,15 @@ proto.BERTBuffers.CallResponse.prototype.getOperationCase = function() { if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto suitable for use in Soy templates. + * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. * To access a reserved field use, foo.pb_, eg, foo.pb_default. * For the list of reserved names please see: - * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. - * @param {boolean=} opt_includeInstance Whether to include the JSPB instance - * for transitional soy proto support: http://goto/soy-param-migration + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration * @return {!Object} */ proto.BERTBuffers.CallResponse.prototype.toObject = function(opt_includeInstance) { @@ -5700,8 +6268,8 @@ proto.BERTBuffers.CallResponse.prototype.toObject = function(opt_includeInstance /** * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Whether to include the JSPB - * instance for transitional soy proto support: + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration * @param {!proto.BERTBuffers.CallResponse} msg The msg instance to transform. * @return {!Object} @@ -5709,16 +6277,16 @@ proto.BERTBuffers.CallResponse.prototype.toObject = function(opt_includeInstance */ proto.BERTBuffers.CallResponse.toObject = function(includeInstance, msg) { var f, obj = { - id: jspb.Message.getFieldWithDefault(msg, 1, 0), - wait: jspb.Message.getFieldWithDefault(msg, 2, false), - err: jspb.Message.getFieldWithDefault(msg, 3, ""), - result: (f = msg.getResult()) && proto.BERTBuffers.Variable.toObject(includeInstance, f), - console: (f = msg.getConsole()) && proto.BERTBuffers.Console.toObject(includeInstance, f), - code: (f = msg.getCode()) && proto.BERTBuffers.Code.toObject(includeInstance, f), - shellCommand: jspb.Message.getFieldWithDefault(msg, 7, ""), - functionCall: (f = msg.getFunctionCall()) && proto.BERTBuffers.CompositeFunctionCall.toObject(includeInstance, f), - functionList: (f = msg.getFunctionList()) && proto.BERTBuffers.FunctionList.toObject(includeInstance, f), - userCommand: jspb.Message.getFieldWithDefault(msg, 10, 0) +id: jspb.Message.getFieldWithDefault(msg, 1, 0), +wait: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), +err: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f, +result: (f = msg.getResult()) && proto.BERTBuffers.Variable.toObject(includeInstance, f), +console: (f = msg.getConsole()) && proto.BERTBuffers.Console.toObject(includeInstance, f), +code: (f = msg.getCode()) && proto.BERTBuffers.Code.toObject(includeInstance, f), +shellCommand: (f = jspb.Message.getField(msg, 7)) == null ? undefined : f, +functionCall: (f = msg.getFunctionCall()) && proto.BERTBuffers.CompositeFunctionCall.toObject(includeInstance, f), +functionList: (f = msg.getFunctionList()) && proto.BERTBuffers.FunctionList.toObject(includeInstance, f), +userCommand: (f = jspb.Message.getField(msg, 10)) == null ? undefined : f }; if (includeInstance) { @@ -5916,26 +6484,30 @@ proto.BERTBuffers.CallResponse.prototype.getId = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.setId = function(value) { - jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setProto3IntField(this, 1, value); }; /** * optional bool wait = 2; - * Note that Boolean fields may be set to 0/1 when serialized from a Java server. - * You should avoid comparisons like {@code val === true/false} in those cases. * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.getWait = function() { - return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 2, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; -/** @param {boolean} value */ +/** + * @param {boolean} value + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.setWait = function(value) { - jspb.Message.setProto3BooleanField(this, 2, value); + return jspb.Message.setProto3BooleanField(this, 2, value); }; @@ -5948,20 +6520,27 @@ proto.BERTBuffers.CallResponse.prototype.getErr = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.setErr = function(value) { - jspb.Message.setOneofField(this, 3, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 3, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearErr = function() { - jspb.Message.setOneofField(this, 3, proto.BERTBuffers.CallResponse.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 3, proto.BERTBuffers.CallResponse.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasErr = function() { return jspb.Message.getField(this, 3) != null; @@ -5978,20 +6557,27 @@ proto.BERTBuffers.CallResponse.prototype.getResult = function() { }; -/** @param {?proto.BERTBuffers.Variable|undefined} value */ +/** + * @param {?proto.BERTBuffers.Variable|undefined} value + * @return {!proto.BERTBuffers.CallResponse} returns this +*/ proto.BERTBuffers.CallResponse.prototype.setResult = function(value) { - jspb.Message.setOneofWrapperField(this, 4, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 4, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearResult = function() { - this.setResult(undefined); + return this.setResult(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasResult = function() { return jspb.Message.getField(this, 4) != null; @@ -6008,20 +6594,27 @@ proto.BERTBuffers.CallResponse.prototype.getConsole = function() { }; -/** @param {?proto.BERTBuffers.Console|undefined} value */ +/** + * @param {?proto.BERTBuffers.Console|undefined} value + * @return {!proto.BERTBuffers.CallResponse} returns this +*/ proto.BERTBuffers.CallResponse.prototype.setConsole = function(value) { - jspb.Message.setOneofWrapperField(this, 5, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 5, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearConsole = function() { - this.setConsole(undefined); + return this.setConsole(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasConsole = function() { return jspb.Message.getField(this, 5) != null; @@ -6038,20 +6631,27 @@ proto.BERTBuffers.CallResponse.prototype.getCode = function() { }; -/** @param {?proto.BERTBuffers.Code|undefined} value */ +/** + * @param {?proto.BERTBuffers.Code|undefined} value + * @return {!proto.BERTBuffers.CallResponse} returns this +*/ proto.BERTBuffers.CallResponse.prototype.setCode = function(value) { - jspb.Message.setOneofWrapperField(this, 6, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 6, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearCode = function() { - this.setCode(undefined); + return this.setCode(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasCode = function() { return jspb.Message.getField(this, 6) != null; @@ -6067,20 +6667,27 @@ proto.BERTBuffers.CallResponse.prototype.getShellCommand = function() { }; -/** @param {string} value */ +/** + * @param {string} value + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.setShellCommand = function(value) { - jspb.Message.setOneofField(this, 7, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 7, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearShellCommand = function() { - jspb.Message.setOneofField(this, 7, proto.BERTBuffers.CallResponse.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 7, proto.BERTBuffers.CallResponse.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasShellCommand = function() { return jspb.Message.getField(this, 7) != null; @@ -6097,20 +6704,27 @@ proto.BERTBuffers.CallResponse.prototype.getFunctionCall = function() { }; -/** @param {?proto.BERTBuffers.CompositeFunctionCall|undefined} value */ +/** + * @param {?proto.BERTBuffers.CompositeFunctionCall|undefined} value + * @return {!proto.BERTBuffers.CallResponse} returns this +*/ proto.BERTBuffers.CallResponse.prototype.setFunctionCall = function(value) { - jspb.Message.setOneofWrapperField(this, 8, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 8, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearFunctionCall = function() { - this.setFunctionCall(undefined); + return this.setFunctionCall(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasFunctionCall = function() { return jspb.Message.getField(this, 8) != null; @@ -6127,20 +6741,27 @@ proto.BERTBuffers.CallResponse.prototype.getFunctionList = function() { }; -/** @param {?proto.BERTBuffers.FunctionList|undefined} value */ +/** + * @param {?proto.BERTBuffers.FunctionList|undefined} value + * @return {!proto.BERTBuffers.CallResponse} returns this +*/ proto.BERTBuffers.CallResponse.prototype.setFunctionList = function(value) { - jspb.Message.setOneofWrapperField(this, 9, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofWrapperField(this, 9, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearFunctionList = function() { - this.setFunctionList(undefined); + return this.setFunctionList(undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasFunctionList = function() { return jspb.Message.getField(this, 9) != null; @@ -6156,20 +6777,27 @@ proto.BERTBuffers.CallResponse.prototype.getUserCommand = function() { }; -/** @param {number} value */ +/** + * @param {number} value + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.setUserCommand = function(value) { - jspb.Message.setOneofField(this, 10, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); + return jspb.Message.setOneofField(this, 10, proto.BERTBuffers.CallResponse.oneofGroups_[0], value); }; +/** + * Clears the field making it undefined. + * @return {!proto.BERTBuffers.CallResponse} returns this + */ proto.BERTBuffers.CallResponse.prototype.clearUserCommand = function() { - jspb.Message.setOneofField(this, 10, proto.BERTBuffers.CallResponse.oneofGroups_[0], undefined); + return jspb.Message.setOneofField(this, 10, proto.BERTBuffers.CallResponse.oneofGroups_[0], undefined); }; /** * Returns whether this field is set. - * @return {!boolean} + * @return {boolean} */ proto.BERTBuffers.CallResponse.prototype.hasUserCommand = function() { return jspb.Message.getField(this, 10) != null; diff --git a/Console/index.html b/Console/index.html index 7c54c35d..3b773f76 100644 --- a/Console/index.html +++ b/Console/index.html @@ -24,7 +24,7 @@ BERT Console - + @@ -45,7 +45,16 @@ @@ -53,7 +62,6 @@ diff --git a/Console/main.js b/Console/main.js index f894e844..62be527a 100644 --- a/Console/main.js +++ b/Console/main.js @@ -16,18 +16,18 @@ * You should have received a copy of the GNU General Public License * along with BERT. If not, see . */ - -const url = require('url') const path = require('path'); -const electron = require('electron') -// Module to control application life. -const app = electron.app -// Module to create native browser window. -const BrowserWindow = electron.BrowserWindow - +const { app, BrowserWindow } = require('electron'); +const remote = require('@electron/remote/main'); const WindowState = require('electron-window-state'); -require('electron-reload')(path.join(__dirname,"build")); +remote.initialize(); + +// for automated testing: expose the devtools protocol on this port, so a +// test can drive the console and read its state without touching the UI +if (process.env.BERT_CONSOLE_DEBUG_PORT) { + app.commandLine.appendSwitch('remote-debugging-port', process.env.BERT_CONSOLE_DEBUG_PORT); +} let dev_flags = 0; let pipe_list = []; @@ -35,16 +35,11 @@ let management_pipe = ""; process.env['BERT_CONSOLE_ROOT'] = __dirname; -// we might have (in fact we expect to have) multiple pipes, -// and we need to keep track of all of them. they're not -// specifically identified, we ask the pipe what language -// it uses. +// command line: -m , -p (repeated), -d for( let i = 0; i< process.argv.length; i++ ){ - let arg = process.argv[i]; let more = (i < (process.argv.length - 1)); - if( arg === "-p" && more ){ pipe_list.push(process.argv[++i]); } @@ -65,9 +60,7 @@ if(pipe_list.length){ process.env['BERT_PIPE_NAME'] = pipe_list.join(";"); } -// Keep a global reference of the window object, if you don't, the window will -// be closed automatically when the JavaScript object is garbage collected. -let mainWindow +let mainWindow; function createWindow () { @@ -75,50 +68,45 @@ function createWindow () { defaultWidth: 1200, defaultHeight: 800 }); - // Create the browser window. - mainWindow = new BrowserWindow(window_state); + // the renderer talks to the add-in over named pipes and reads and watches + // files itself, so it runs with node available. that is the architecture + // the console has always had; current electron just makes it an explicit + // choice instead of the default. + + mainWindow = new BrowserWindow({ + x: window_state.x, + y: window_state.y, + width: window_state.width, + height: window_state.height, + webPreferences: { + nodeIntegration: true, + contextIsolation: false + } + }); + remote.enable(mainWindow.webContents); window_state.manage(mainWindow); - // and load the index.html of the app. - mainWindow.loadURL(url.format({ - pathname: path.join(__dirname, 'index.html'), - protocol: 'file:', - slashes: true - })) + mainWindow.loadFile(path.join(__dirname, 'index.html')); - if(dev_flags) mainWindow.webContents.openDevTools() + if(dev_flags) mainWindow.webContents.openDevTools(); - // Emitted when the window is closed. mainWindow.on('closed', function () { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - mainWindow = null - }) + mainWindow = null; + }); + } -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.on('ready', createWindow) +app.whenReady().then(createWindow); -// Quit when all windows are closed. app.on('window-all-closed', function () { - // On OS X it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q if (process.platform !== 'darwin') { - app.quit() + app.quit(); } -}) +}); app.on('activate', function () { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. if (mainWindow === null) { - createWindow() + createWindow(); } -}) - -// In this file you can include the rest of your app's specific main process -// code. You can also put them in separate files and require them here. +}); diff --git a/Console/package-lock.json b/Console/package-lock.json new file mode 100644 index 00000000..a0a5dadd --- /dev/null +++ b/Console/package-lock.json @@ -0,0 +1,4542 @@ +{ + "name": "bert2-console", + "version": "2.4.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bert2-console", + "version": "2.4.3", + "license": "GPL-3.0", + "dependencies": { + "@electron/remote": "^2.1.3", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-web-links": "^0.12.0", + "@xterm/xterm": "^6.0.0", + "chokidar": "^4.0.3", + "electron-window-state": "^5.0.3", + "google-protobuf": "^4.0.2", + "js-base64": "^3.9.3", + "less": "^4.9.1", + "markdown-it": "^15.0.1", + "markdown-it-task-lists": "^2.1.1", + "monaco-editor": "^0.56.0", + "rxjs": "^7.8.2", + "wcwidth": "^1.0.1" + }, + "devDependencies": { + "@types/node": "^22.0.0", + "electron": "^44.1.1", + "electron-builder": "^26.15.3", + "typescript": "^7.0.2" + } + }, + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz", + "integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/asar/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/fuses/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz", + "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz", + "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/remote": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.3.tgz", + "integrity": "sha512-XlpxC8S4ttj/v2d+PKp9na/3Ev8bV7YWNL7Cw5b9MAWgTphEml7iYgbc7V0r9D6yDOfOkj06bchZgOZdlWJGNA==", + "license": "MIT", + "peerDependencies": { + "electron": ">= 13.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@noble/hashes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz", + "integrity": "sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz", + "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xterm/addon-fit": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", + "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", + "license": "MIT" + }, + "node_modules/@xterm/addon-web-links": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-web-links/-/addon-web-links-0.12.0.tgz", + "integrity": "sha512-4Smom3RPyVp7ZMYOYDoC/9eGJJJqYhnPLGGqJ6wOBfB8VxPViJNSKdgRYb8NpaM6YSelEKbA2SStD7lGyqaobw==", + "license": "MIT" + }, + "node_modules/@xterm/xterm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz", + "integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==", + "license": "MIT", + "workspaces": [ + "addons/*" + ] + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-lib": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz", + "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", + "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", + "async-exit-hook": "^2.0.1", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.15.3", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.15.3", + "electron-builder-squirrel-windows": "26.15.3" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/app-builder-lib/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/argparse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.1.tgz", + "integrity": "sha512-nM4mHF/KM1v59ZNKX7zfusQz5wUAxR511YG8Vo6TyiV4aqhu++rbJW4v04xsWhpSsHFj66flT8P7znVpyO20xQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "PSF-2.0" + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha512-Dnfc9ROAPrkkeLIUweEbh7LFT9Mc53tO/bbM044rKjhgAEyIGKvKXg97PM/kRizZIfUHaROZIoeEaWao+Unzfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dmg-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz", + "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/dompurify": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz", + "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "44.1.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-44.1.1.tgz", + "integrity": "sha512-N2WCq2sbOkqQgvXJYx2lS6UiO8bF+Yr67trDnS6JKa2WxTCRQsAjGl57SUtdW9h6r5PlduBFjIhxhgd3dzv1hg==", + "license": "MIT", + "dependencies": { + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz", + "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.15.3", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz", + "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-publish": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/electron-window-state": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz", + "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==", + "license": "MIT", + "dependencies": { + "jsonfile": "^4.0.0", + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/electron-window-state/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-protobuf": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-4.0.2.tgz", + "integrity": "sha512-yD2fqbNgvJPuQwdKJiPdbUcXveNRxgqy070gzsBsCyFJA8Qdj9oxa9xtkddb/JEhcDk0RD5SfGUWg+nhINfMxA==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-base64": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.3.tgz", + "integrity": "sha512-uwYQp+VJ38FVvtim6qNbit6e9uT6dwWQ4Y1+H9TxhW5hcHjpHwoxlR0nMpqUmIFOmu4VqMxwdJA88gIVuZJQ/g==", + "license": "BSD-3-Clause" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/less": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.9.1.tgz", + "integrity": "sha512-orp15PfJvvNDIqJdVWzMI9Sjpjp3VTiw3sfvbB+67LlISTEn8uVT2EdYSuyl02BLvaftv6sdk9Umnxmm5rckmg==", + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^3.0.5", + "parse-node-version": "^1.0.1" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "make-dir": "^5.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "probe-image-size": "^7.2.3", + "source-map": "~0.6.0" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/linkify-it": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-6.1.0.tgz", + "integrity": "sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^3.0.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT", + "optional": true + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-5.1.0.tgz", + "integrity": "sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-15.0.1.tgz", + "integrity": "sha512-9/7gE95FNPkfUWrjJIoHZza2iLmuJlPD0UNMxPi7bxUrbCR525YZY0r+zyfes0dZI5ZZ/uNIXUJca0pJvtw41g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^3.0.0", + "entities": "^8.0.0", + "linkify-it": "^6.0.0", + "mdurl": "^2.1.0", + "punycode.js": "^2.3.1", + "uc.micro": "^3.0.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==", + "license": "ISC" + }, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdurl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", + "license": "MIT" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "license": "MIT" + }, + "node_modules/monaco-editor": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.56.0.tgz", + "integrity": "sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg==", + "license": "MIT", + "dependencies": { + "dompurify": "3.4.8", + "marked": "14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz", + "integrity": "sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-abi": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.35.0.tgz", + "integrity": "sha512-ymk4aIzxdPopw2giv8Fs1Ec6vybGkjmyxUwVqhkI4MCy2tVfXdkOGGWieWVjL0THgH+7a8lRdevyupoYj3Js/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/probe-image-size": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.4.0.tgz", + "integrity": "sha512-cdEprVtZxV+awMde9X+4jILBFYh4CARxVrQaMl4wY4YcPWbul9jntXrIW95NInBDyJwcVUP3U0T6yukN8rMBaQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "node_modules/probe-image-size/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/probe-image-size/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/probe-image-size/node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "license": "MIT", + "optional": true + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/roarr/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "optional": true + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "2" + } + }, + "node_modules/stream-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stream-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", + "optional": true + }, + "node_modules/string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmp-promise/node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/uc.micro": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-3.0.0.tgz", + "integrity": "sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/unzipper/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/Console/package.json b/Console/package.json index f43735ba..517c0fd1 100644 --- a/Console/package.json +++ b/Console/package.json @@ -1,7 +1,10 @@ { + "name": "bert2-console", "version": "2.4.3", + "description": "BERT console: an editor and shell for R in Excel", + "author": "Structured Data, LLC", + "license": "GPL-3.0", "main": "main.js", - "name": "bert2-console", "build": { "directories": { "output": "../Build/Console" @@ -21,32 +24,32 @@ }, "scripts": { "start": "electron .", - "clean": "rm -fr build/*", - "build": "./node_modules/.bin/less-watch-compiler --run-once && ./node_modules/.bin/tsc", - "watch": "./node_modules/.bin/less-watch-compiler & ./node_modules/.bin/tsc --watch &", - "package": "./node_modules/.bin/electron-builder", - "repackage": "./node_modules/.bin/less-watch-compiler --run-once && ./node_modules/.bin/tsc && ./node_modules/.bin/electron-builder" + "clean": "node -e \"require('fs').rmSync('build', {recursive: true, force: true})\"", + "build": "lessc style/style.less build/style.css && tsc", + "watch": "tsc --watch", + "package": "electron-builder", + "repackage": "npm run build && electron-builder" }, "devDependencies": { - "@types/node": "^8.9.1", - "asar": "^0.14.1", - "electron": "^1.8.2", - "electron-builder": "^19.56.0", - "less-watch-compiler": "^1.11.0", - "typescript": "^2.7.2" + "@types/node": "^22.0.0", + "electron": "^44.1.1", + "electron-builder": "^26.15.3", + "typescript": "^7.0.2" }, "dependencies": { - "@types/text-encoding": "^0.0.32", - "chokidar": "^2.0.1", - "electron-reload": "^1.2.2", - "electron-window-state": "^4.1.1", - "google-protobuf": "^3.5.0", - "js-base64": "^2.4.3", - "less": "^3.0.1", - "markdown-it": "^8.4.0", - "markdown-it-task-lists": "^2.1.0", - "monaco-editor": "^0.10.1", - "rxjs": "^5.5.6", - "xterm": "^3.2.0" + "@electron/remote": "^2.1.3", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-web-links": "^0.12.0", + "@xterm/xterm": "^6.0.0", + "chokidar": "^4.0.3", + "electron-window-state": "^5.0.3", + "google-protobuf": "^4.0.2", + "js-base64": "^3.9.3", + "less": "^4.9.1", + "markdown-it": "^15.0.1", + "markdown-it-task-lists": "^2.1.1", + "monaco-editor": "^0.56.0", + "rxjs": "^7.8.2", + "wcwidth": "^1.0.1" } } diff --git a/Console/src/common/clipboard.ts b/Console/src/common/clipboard.ts new file mode 100644 index 00000000..c011c111 --- /dev/null +++ b/Console/src/common/clipboard.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2017-2018 Structured Data, LLC + * + * This file is part of BERT. + * + * BERT is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BERT is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with BERT. If not, see . + */ + +import * as remote from '@electron/remote'; + +/** + * text clipboard for the renderer. + * + * electron no longer offers its clipboard module to renderer processes and + * points at the standard web API instead, which is what this uses. that API + * refuses to work while the document does not have the focus, which can + * happen around native menus, so the main process clipboard (reached + * through @electron/remote) is the fallback: it is the same clipboard, and + * it does not care about focus. + */ +export const clipboard = { + + async writeText(text: string): Promise { + try { + await navigator.clipboard.writeText(text); + } + catch (e) { + console.info("clipboard write via the main process:", e.message || e); + remote.clipboard.writeText(text); + } + }, + + async readText(): Promise { + try { + return await navigator.clipboard.readText(); + } + catch (e) { + console.info("clipboard read via the main process:", e.message || e); + return remote.clipboard.readText(); + } + } + +}; diff --git a/Console/src/common/config_manager.ts b/Console/src/common/config_manager.ts index 855f4b73..66ccc2ce 100644 --- a/Console/src/common/config_manager.ts +++ b/Console/src/common/config_manager.ts @@ -72,7 +72,7 @@ class ConfigManager extends Rx.BehaviorSubject { this.ReadConfig().then(() => { FileWatcher.Watch(this.config_path); - FileWatcher.events.filter( x => (x === this.config_path)).subscribe(x => { + FileWatcher.events.pipe(Rx.filter(x => (x === this.config_path))).subscribe(x => { this.ReadConfig(); }); }); @@ -104,7 +104,7 @@ class ConfigManager extends Rx.BehaviorSubject { * */ private ReadConfig() : Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { fs.readFile(this.config_path, "utf8", (err, json) => { if(!err){ this.raw_config_file_ = json; diff --git a/Console/src/common/message_utilities.ts b/Console/src/common/message_utilities.ts index 0a6f9b9d..aa801f35 100644 --- a/Console/src/common/message_utilities.ts +++ b/Console/src/common/message_utilities.ts @@ -81,7 +81,12 @@ export class MessageUtilities { return object; default: - console.info(`UNTRANSLATED (${x.getValueCase()})\n`, x.toObject()); + // R 4.x sends value types this console does not render, and logging + // every one of them floods the devtools console. keep the diagnostic, + // but behind an opt-in environment variable. + if(process.env.BERT_DEBUG){ + console.info(`UNTRANSLATED (${x.getValueCase()})\n`, x.toObject()); + } return null; } } diff --git a/Console/src/common/update_check.ts b/Console/src/common/update_check.ts index f25069b1..d66bbd8e 100644 --- a/Console/src/common/update_check.ts +++ b/Console/src/common/update_check.ts @@ -27,6 +27,12 @@ export namespace UpdateCheck { }); */ + // a development build carries a tag after the release number (see + // BERT/BERT/include/bert_version.h). it is not a release, so there is + // nothing to compare it against; skip the check rather than offer an + // older release as an upgrade. + if(!/^\d+(\.\d+)*$/.test(process.env.BERT_VERSION || "")) return; + let response = await fetch("https://bert-toolkit.com/version.json", {cache: "no-cache"}); let version_object = await response.json(); diff --git a/Console/src/common/utilities.ts b/Console/src/common/utilities.ts index 5e817c42..f7d966fa 100644 --- a/Console/src/common/utilities.ts +++ b/Console/src/common/utilities.ts @@ -36,8 +36,13 @@ export class Utilities { } + /** + * "2.4.3" -> 2004003. anything after the numeric part, such as the tag a + * development build carries ("2.4.3-r4 (built ...)"), is ignored. + */ static VersionToNumber(version_string){ - return version_string.split(".").reduce((a,x) => a * 1000 + (Number(x)||0)); + let numeric = ((version_string || "").match(/^\d+(\.\d+)*/) || [""])[0]; + return numeric.split(".").reduce((a,x) => a * 1000 + (Number(x)||0), 0); } } diff --git a/Console/src/editor/editor.ts b/Console/src/editor/editor.ts index 78ce7b1d..ed3f3409 100644 --- a/Console/src/editor/editor.ts +++ b/Console/src/editor/editor.ts @@ -24,11 +24,13 @@ import * as fs from 'fs'; import * as Rx from 'rxjs'; import { EEXIST } from 'constants'; -import * as MarkdownIt from 'markdown-it'; -import * as MarkdownItTasks from 'markdown-it-task-lists'; +import MarkdownIt from 'markdown-it'; +import MarkdownItTasks from 'markdown-it-task-lists'; const MD = new MarkdownIt().use(MarkdownItTasks); -import { remote, clipboard, shell as electron_shell } from 'electron'; +import { shell as electron_shell } from 'electron'; +import { clipboard } from '../common/clipboard'; +import * as remote from '@electron/remote'; const { Menu, MenuItem, dialog } = remote; const Constants = require("../../data/constants.json"); @@ -36,6 +38,7 @@ const TabContextMenuData = require("../../data/menus/editor_tab_context_menu.jso const SchemaSchema = require("../../data/schemas/schema.schema.json"); import { MenuUtilities } from '../ui/menu_utilities'; +import { AlertManager } from '../ui/alert'; import { Utilities } from '../common/utilities'; import { UserStylesheet } from '../ui/user_stylesheet'; import { TabPanel, TabJustify, TabEventType, TabSpec } from '../ui/tab_panel'; @@ -110,6 +113,9 @@ interface OpenFileOptions { */ export class Editor { + /** asks about unsaved changes when a file is closing */ + private alerts_ = new AlertManager(); + /** flag for loading, in case we have multiple instances */ static loaded_ = false; @@ -129,17 +135,37 @@ export class Editor { if (this.loaded_) return Promise.resolve(); - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { this.loaded_ = true; - // see monaco electron sample for this + // index.html loads the AMD loader in a script tag after the console's + // own code, so it is not there yet if we got here from a promise that + // resolved during startup. wait for the page to finish parsing. + + if (typeof amd_require === "undefined") { + if (document.readyState !== "loading") { + return reject(new Error("monaco loader not found")); + } + await new Promise(r => document.addEventListener("DOMContentLoaded", () => r(), { once: true })); + } + + // see the monaco electron-amd sample for this. hiding node's module + // global is the sample's workaround for language contributions that + // otherwise mistake the environment. + + // preferScriptTags keeps the loader on